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.
Files changed (82) hide show
  1. package/AGENTS.md +4 -3
  2. package/CLAUDE.md +8 -8
  3. package/README.md +1 -1
  4. package/dist/advanced.js +95 -90
  5. package/dist/esm/advanced.d.ts +16 -10
  6. package/dist/esm/advanced.js +14 -9
  7. package/dist/esm/index.d.ts +4 -2
  8. package/dist/esm/index.js +5 -3
  9. package/dist/esm/lib/decide/evaluator.js +2 -2
  10. package/dist/esm/lib/decide/evidence.js +2 -2
  11. package/dist/esm/lib/engine/handlers/servedPause.js +2 -2
  12. package/dist/esm/lib/memory/EventLog.d.ts +1 -1
  13. package/dist/esm/lib/memory/EventLog.js +2 -2
  14. package/dist/esm/lib/memory/RecordFrame.d.ts +41 -6
  15. package/dist/esm/lib/memory/RecordFrame.js +36 -5
  16. package/dist/esm/lib/memory/SharedMemory.d.ts +1 -1
  17. package/dist/esm/lib/memory/SharedMemory.js +2 -2
  18. package/dist/esm/lib/memory/StageContext.d.ts +21 -14
  19. package/dist/esm/lib/memory/StageContext.js +36 -74
  20. package/dist/esm/lib/memory/borrowedMutation.d.ts +1 -1
  21. package/dist/esm/lib/memory/borrowedMutation.js +2 -2
  22. package/dist/esm/lib/memory/honesty.d.ts +4 -3
  23. package/dist/esm/lib/memory/honesty.js +5 -4
  24. package/dist/esm/lib/memory/index.d.ts +4 -2
  25. package/dist/esm/lib/memory/index.js +6 -4
  26. package/dist/esm/lib/memory/placeholders.d.ts +23 -28
  27. package/dist/esm/lib/memory/placeholders.js +24 -29
  28. package/dist/esm/lib/memory/recordCommit.d.ts +5 -3
  29. package/dist/esm/lib/memory/recordCommit.js +7 -5
  30. package/dist/esm/lib/memory/redaction.d.ts +78 -40
  31. package/dist/esm/lib/memory/redaction.js +130 -64
  32. package/dist/esm/lib/memory/runAddress.d.ts +20 -0
  33. package/dist/esm/lib/memory/runAddress.js +25 -0
  34. package/dist/esm/lib/memory/scrub.d.ts +53 -0
  35. package/dist/esm/lib/memory/scrub.js +74 -0
  36. package/dist/esm/lib/memory/utils.d.ts +3 -3
  37. package/dist/esm/lib/memory/utils.js +4 -4
  38. package/dist/esm/lib/memory/verbs.d.ts +1 -1
  39. package/dist/esm/lib/memory/verbs.js +2 -2
  40. package/dist/esm/trace.d.ts +2 -0
  41. package/dist/esm/trace.js +3 -2
  42. package/dist/esm/write.d.ts +47 -0
  43. package/dist/esm/write.js +46 -0
  44. package/dist/index.js +5 -3
  45. package/dist/lib/decide/evaluator.js +3 -3
  46. package/dist/lib/decide/evidence.js +3 -3
  47. package/dist/lib/engine/handlers/servedPause.js +3 -3
  48. package/dist/lib/memory/EventLog.js +2 -2
  49. package/dist/lib/memory/RecordFrame.js +36 -5
  50. package/dist/lib/memory/SharedMemory.js +2 -2
  51. package/dist/lib/memory/StageContext.js +42 -80
  52. package/dist/lib/memory/borrowedMutation.js +2 -2
  53. package/dist/lib/memory/honesty.js +5 -4
  54. package/dist/lib/memory/index.js +6 -4
  55. package/dist/lib/memory/placeholders.js +25 -30
  56. package/dist/lib/memory/recordCommit.js +9 -7
  57. package/dist/lib/memory/redaction.js +144 -75
  58. package/dist/lib/memory/runAddress.js +29 -0
  59. package/dist/lib/memory/scrub.js +79 -0
  60. package/dist/lib/memory/utils.js +4 -4
  61. package/dist/lib/memory/verbs.js +2 -2
  62. package/dist/trace.js +6 -4
  63. package/dist/types/advanced.d.ts +16 -10
  64. package/dist/types/index.d.ts +4 -2
  65. package/dist/types/lib/memory/EventLog.d.ts +1 -1
  66. package/dist/types/lib/memory/RecordFrame.d.ts +41 -6
  67. package/dist/types/lib/memory/SharedMemory.d.ts +1 -1
  68. package/dist/types/lib/memory/StageContext.d.ts +21 -14
  69. package/dist/types/lib/memory/borrowedMutation.d.ts +1 -1
  70. package/dist/types/lib/memory/honesty.d.ts +4 -3
  71. package/dist/types/lib/memory/index.d.ts +4 -2
  72. package/dist/types/lib/memory/placeholders.d.ts +23 -28
  73. package/dist/types/lib/memory/recordCommit.d.ts +5 -3
  74. package/dist/types/lib/memory/redaction.d.ts +78 -40
  75. package/dist/types/lib/memory/runAddress.d.ts +20 -0
  76. package/dist/types/lib/memory/scrub.d.ts +53 -0
  77. package/dist/types/lib/memory/utils.d.ts +3 -3
  78. package/dist/types/lib/memory/verbs.d.ts +1 -1
  79. package/dist/types/trace.d.ts +2 -0
  80. package/dist/types/write.d.ts +47 -0
  81. package/dist/write.js +52 -0
  82. package/package.json +15 -1
@@ -0,0 +1,20 @@
1
+ /**
2
+ * runAddress.ts — where a frame with a run id writes: the engine's run namespace (C2, a leaf of its own since C4, L4).
3
+ *
4
+ * The record layer never names a namespace: it takes the write ADDRESS as data, a path prefix
5
+ * (`RecordFrame · address`, `SharedMemory · getValue` / `setValue` / `updateValue`, the transaction
6
+ * buffer's `address`). The ENGINE decides it, from the one constant here: a frame with run id `c0`
7
+ * (a fork or selector child takes its own id at the top level) reads and writes at `runs/c0/…`, a
8
+ * frame without one at the root.
9
+ *
10
+ * WHY A LEAF. Two L4 files read the namespace and one imports the other: the frame
11
+ * (`StageContext`, which builds every address) and the redaction verdict (`redaction.ts` — a
12
+ * subflow mapper reading the namespace root reads every namespaced key; the mirror's seed scrubs
13
+ * every namespace). Until C4 the constant sat in `StageContext.ts` and the verdict, then an L2 file,
14
+ * spelled the namespace itself. This file imports nothing; `test/architecture/write-address.test.ts`
15
+ * pins it as the one spelling in the record's reach.
16
+ */
17
+ /** The key run namespaces sit under — the engine's one spelling of it. */
18
+ export declare const RUN_NAMESPACE = "runs";
19
+ /** Where a frame with run id `runId` reads and writes: `['runs', <id>]`, or `[]` (the root) with none. */
20
+ export declare function runAddress(runId: string): readonly string[];
@@ -0,0 +1,25 @@
1
+ /**
2
+ * runAddress.ts — where a frame with a run id writes: the engine's run namespace (C2, a leaf of its own since C4, L4).
3
+ *
4
+ * The record layer never names a namespace: it takes the write ADDRESS as data, a path prefix
5
+ * (`RecordFrame · address`, `SharedMemory · getValue` / `setValue` / `updateValue`, the transaction
6
+ * buffer's `address`). The ENGINE decides it, from the one constant here: a frame with run id `c0`
7
+ * (a fork or selector child takes its own id at the top level) reads and writes at `runs/c0/…`, a
8
+ * frame without one at the root.
9
+ *
10
+ * WHY A LEAF. Two L4 files read the namespace and one imports the other: the frame
11
+ * (`StageContext`, which builds every address) and the redaction verdict (`redaction.ts` — a
12
+ * subflow mapper reading the namespace root reads every namespaced key; the mirror's seed scrubs
13
+ * every namespace). Until C4 the constant sat in `StageContext.ts` and the verdict, then an L2 file,
14
+ * spelled the namespace itself. This file imports nothing; `test/architecture/write-address.test.ts`
15
+ * pins it as the one spelling in the record's reach.
16
+ */
17
+ /** The key run namespaces sit under — the engine's one spelling of it. */
18
+ export const RUN_NAMESPACE = 'runs';
19
+ /** The root's address, shared by every frame without a run id (most of them). Never edited. */
20
+ const ROOT_ADDRESS = Object.freeze([]);
21
+ /** Where a frame with run id `runId` reads and writes: `['runs', <id>]`, or `[]` (the root) with none. */
22
+ export function runAddress(runId) {
23
+ return runId ? [RUN_NAMESPACE, runId] : ROOT_ADDRESS;
24
+ }
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuQWRkcmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbWVtb3J5L3J1bkFkZHJlc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsMEVBQTBFO0FBQzFFLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUM7QUFFcEMsK0ZBQStGO0FBQy9GLE1BQU0sWUFBWSxHQUFzQixNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBRTFELDBHQUEwRztBQUMxRyxNQUFNLFVBQVUsVUFBVSxDQUFDLEtBQWE7SUFDdEMsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7QUFDdkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcnVuQWRkcmVzcy50cyDigJQgd2hlcmUgYSBmcmFtZSB3aXRoIGEgcnVuIGlkIHdyaXRlczogdGhlIGVuZ2luZSdzIHJ1biBuYW1lc3BhY2UgKEMyLCBhIGxlYWYgb2YgaXRzIG93biBzaW5jZSBDNCwgTDQpLlxuICpcbiAqIFRoZSByZWNvcmQgbGF5ZXIgbmV2ZXIgbmFtZXMgYSBuYW1lc3BhY2U6IGl0IHRha2VzIHRoZSB3cml0ZSBBRERSRVNTIGFzIGRhdGEsIGEgcGF0aCBwcmVmaXhcbiAqIChgUmVjb3JkRnJhbWUgwrcgYWRkcmVzc2AsIGBTaGFyZWRNZW1vcnkgwrcgZ2V0VmFsdWVgIC8gYHNldFZhbHVlYCAvIGB1cGRhdGVWYWx1ZWAsIHRoZSB0cmFuc2FjdGlvblxuICogYnVmZmVyJ3MgYGFkZHJlc3NgKS4gVGhlIEVOR0lORSBkZWNpZGVzIGl0LCBmcm9tIHRoZSBvbmUgY29uc3RhbnQgaGVyZTogYSBmcmFtZSB3aXRoIHJ1biBpZCBgYzBgXG4gKiAoYSBmb3JrIG9yIHNlbGVjdG9yIGNoaWxkIHRha2VzIGl0cyBvd24gaWQgYXQgdGhlIHRvcCBsZXZlbCkgcmVhZHMgYW5kIHdyaXRlcyBhdCBgcnVucy9jMC/igKZgLCBhXG4gKiBmcmFtZSB3aXRob3V0IG9uZSBhdCB0aGUgcm9vdC5cbiAqXG4gKiBXSFkgQSBMRUFGLiBUd28gTDQgZmlsZXMgcmVhZCB0aGUgbmFtZXNwYWNlIGFuZCBvbmUgaW1wb3J0cyB0aGUgb3RoZXI6IHRoZSBmcmFtZVxuICogKGBTdGFnZUNvbnRleHRgLCB3aGljaCBidWlsZHMgZXZlcnkgYWRkcmVzcykgYW5kIHRoZSByZWRhY3Rpb24gdmVyZGljdCAoYHJlZGFjdGlvbi50c2Ag4oCUIGFcbiAqIHN1YmZsb3cgbWFwcGVyIHJlYWRpbmcgdGhlIG5hbWVzcGFjZSByb290IHJlYWRzIGV2ZXJ5IG5hbWVzcGFjZWQga2V5OyB0aGUgbWlycm9yJ3Mgc2VlZCBzY3J1YnNcbiAqIGV2ZXJ5IG5hbWVzcGFjZSkuIFVudGlsIEM0IHRoZSBjb25zdGFudCBzYXQgaW4gYFN0YWdlQ29udGV4dC50c2AgYW5kIHRoZSB2ZXJkaWN0LCB0aGVuIGFuIEwyIGZpbGUsXG4gKiBzcGVsbGVkIHRoZSBuYW1lc3BhY2UgaXRzZWxmLiBUaGlzIGZpbGUgaW1wb3J0cyBub3RoaW5nOyBgdGVzdC9hcmNoaXRlY3R1cmUvd3JpdGUtYWRkcmVzcy50ZXN0LnRzYFxuICogcGlucyBpdCBhcyB0aGUgb25lIHNwZWxsaW5nIGluIHRoZSByZWNvcmQncyByZWFjaC5cbiAqL1xuXG4vKiogVGhlIGtleSBydW4gbmFtZXNwYWNlcyBzaXQgdW5kZXIg4oCUIHRoZSBlbmdpbmUncyBvbmUgc3BlbGxpbmcgb2YgaXQuICovXG5leHBvcnQgY29uc3QgUlVOX05BTUVTUEFDRSA9ICdydW5zJztcblxuLyoqIFRoZSByb290J3MgYWRkcmVzcywgc2hhcmVkIGJ5IGV2ZXJ5IGZyYW1lIHdpdGhvdXQgYSBydW4gaWQgKG1vc3Qgb2YgdGhlbSkuIE5ldmVyIGVkaXRlZC4gKi9cbmNvbnN0IFJPT1RfQUREUkVTUzogcmVhZG9ubHkgc3RyaW5nW10gPSBPYmplY3QuZnJlZXplKFtdKTtcblxuLyoqIFdoZXJlIGEgZnJhbWUgd2l0aCBydW4gaWQgYHJ1bklkYCByZWFkcyBhbmQgd3JpdGVzOiBgWydydW5zJywgPGlkPl1gLCBvciBgW11gICh0aGUgcm9vdCkgd2l0aCBub25lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bkFkZHJlc3MocnVuSWQ6IHN0cmluZyk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHJ1bklkID8gW1JVTl9OQU1FU1BBQ0UsIHJ1bklkXSA6IFJPT1RfQUREUkVTUztcbn1cbiJdfQ==
@@ -0,0 +1,53 @@
1
+ /**
2
+ * scrub.ts — the commit log's scrub: the placeholder at every redacted path of a patch (C4, L2).
3
+ *
4
+ * The RECORD's half of a redaction. A redacted path is DATA by the time it reaches here — the
5
+ * transaction buffer's `redactedPaths`, registered by `RecordFrame · write` from the scrub it was
6
+ * handed — and this file only writes `LOG_PLACEHOLDER` (`placeholders.ts`) where such a path holds
7
+ * a value. It never decides WHAT is secret: that is the engine's verdict (`redaction.ts`, L4 —
8
+ * `RedactionRule` and the write decision), which also owns the OTHER placeholder, the scope channel's
9
+ * `SCOPE_PLACEHOLDER`. Before C4 both halves lived in `redaction.ts`, so the record imported the
10
+ * engine's policy module to write a string.
11
+ *
12
+ * THE LAW:
13
+ * 1. A path is scrubbed only where it holds a DEFINED value — scrubbing never invents a field.
14
+ * 2. Paths are scrubbed in the set's order, against the tree as scrubbed so far: a path under one
15
+ * already scrubbed finds a string, not a container, and is left alone.
16
+ * 3. The input patch is never edited. `scrubPatch` copies only the spine of each scrubbed path
17
+ * (and nothing at all when nothing is scrubbed); `redactPatch` hands back a fresh deep copy.
18
+ */
19
+ import type { MemoryPatch } from './types.js';
20
+ /**
21
+ * The commit log's scrub: `patch` with {@link LOG_PLACEHOLDER} at every path in `redactedPaths` that
22
+ * holds a defined value — the copy `recordCommit` records and feeds the redacted mirror.
23
+ *
24
+ * CLONE-FREE (9.33.0). The patch is the transaction buffer's commit-time payload, already the record's
25
+ * own copy (`TransactionBuffer · commit` clones each surviving path once; the buffer is dropped at
26
+ * commit), so the scrub copies only what it must not edit in place:
27
+ * - no path to scrub (no policy, no per-call mark — the common case) → `patch` ITSELF, no copy at all;
28
+ * - otherwise → a new root and a shallow copy of each container on a scrubbed path (`pathOps ·
29
+ * ownSpine`), every other subtree shared with `patch`. `patch` is never edited.
30
+ * The engine called the public {@link redactPatch} (a whole `structuredClone`) twice per commit before
31
+ * 9.33.0. The bytes are the same: a scrubbed path holds the placeholder, every other path the value the
32
+ * buffer cloned (pinned by the 9.18.1 / 9.19.1 redaction byte tests).
33
+ *
34
+ * Paths are scrubbed in the set's order, against the tree as scrubbed so far: a path under one already
35
+ * scrubbed finds a string, not a container, and is left alone (as before).
36
+ *
37
+ * INTERNAL — the result shares structure with `patch`. A caller outside the commit path wants
38
+ * {@link redactPatch}.
39
+ *
40
+ * @param redactedPaths DELIM-joined paths (`TransactionBuffer`'s `redactedPaths`; a bundle's
41
+ * `redactedPaths` array works too).
42
+ */
43
+ export declare function scrubPatch(patch: MemoryPatch, redactedPaths: Iterable<string>): MemoryPatch;
44
+ /**
45
+ * Redacts sensitive values in a patch for logging/debugging — the PUBLIC scrub (`footprintjs/advanced`),
46
+ * its contract unchanged since 4.x: a fresh deep copy of `patch` (`structuredClone`) with
47
+ * {@link LOG_PLACEHOLDER} at every listed path that holds a defined value. Shares nothing with `patch`
48
+ * and never edits it. (It lived in `memory/utils.ts` until 9.33.0 and in `memory/redaction.ts` until
49
+ * C4; the engine's own commit path uses the clone-free {@link scrubPatch}.) No caller inside the
50
+ * library: it stays on `footprintjs/advanced` for the consumers that import it until 10.0.0 (the trace
51
+ * extraction, E6), which takes it off every door.
52
+ */
53
+ export declare function redactPatch(patch: MemoryPatch, redactedSet: Set<string>): MemoryPatch;
@@ -0,0 +1,74 @@
1
+ /**
2
+ * scrub.ts — the commit log's scrub: the placeholder at every redacted path of a patch (C4, L2).
3
+ *
4
+ * The RECORD's half of a redaction. A redacted path is DATA by the time it reaches here — the
5
+ * transaction buffer's `redactedPaths`, registered by `RecordFrame · write` from the scrub it was
6
+ * handed — and this file only writes `LOG_PLACEHOLDER` (`placeholders.ts`) where such a path holds
7
+ * a value. It never decides WHAT is secret: that is the engine's verdict (`redaction.ts`, L4 —
8
+ * `RedactionRule` and the write decision), which also owns the OTHER placeholder, the scope channel's
9
+ * `SCOPE_PLACEHOLDER`. Before C4 both halves lived in `redaction.ts`, so the record imported the
10
+ * engine's policy module to write a string.
11
+ *
12
+ * THE LAW:
13
+ * 1. A path is scrubbed only where it holds a DEFINED value — scrubbing never invents a field.
14
+ * 2. Paths are scrubbed in the set's order, against the tree as scrubbed so far: a path under one
15
+ * already scrubbed finds a string, not a container, and is left alone.
16
+ * 3. The input patch is never edited. `scrubPatch` copies only the spine of each scrubbed path
17
+ * (and nothing at all when nothing is scrubbed); `redactPatch` hands back a fresh deep copy.
18
+ */
19
+ import { nativeGet, nativeHas, nativeSet, ownedRootOf, ownSpine } from './pathOps.js';
20
+ import { DELIM } from './paths.js';
21
+ import { LOG_PLACEHOLDER } from './placeholders.js';
22
+ /**
23
+ * The commit log's scrub: `patch` with {@link LOG_PLACEHOLDER} at every path in `redactedPaths` that
24
+ * holds a defined value — the copy `recordCommit` records and feeds the redacted mirror.
25
+ *
26
+ * CLONE-FREE (9.33.0). The patch is the transaction buffer's commit-time payload, already the record's
27
+ * own copy (`TransactionBuffer · commit` clones each surviving path once; the buffer is dropped at
28
+ * commit), so the scrub copies only what it must not edit in place:
29
+ * - no path to scrub (no policy, no per-call mark — the common case) → `patch` ITSELF, no copy at all;
30
+ * - otherwise → a new root and a shallow copy of each container on a scrubbed path (`pathOps ·
31
+ * ownSpine`), every other subtree shared with `patch`. `patch` is never edited.
32
+ * The engine called the public {@link redactPatch} (a whole `structuredClone`) twice per commit before
33
+ * 9.33.0. The bytes are the same: a scrubbed path holds the placeholder, every other path the value the
34
+ * buffer cloned (pinned by the 9.18.1 / 9.19.1 redaction byte tests).
35
+ *
36
+ * Paths are scrubbed in the set's order, against the tree as scrubbed so far: a path under one already
37
+ * scrubbed finds a string, not a container, and is left alone (as before).
38
+ *
39
+ * INTERNAL — the result shares structure with `patch`. A caller outside the commit path wants
40
+ * {@link redactPatch}.
41
+ *
42
+ * @param redactedPaths DELIM-joined paths (`TransactionBuffer`'s `redactedPaths`; a bundle's
43
+ * `redactedPaths` array works too).
44
+ */
45
+ export function scrubPatch(patch, redactedPaths) {
46
+ let out;
47
+ let owned;
48
+ for (const flat of redactedPaths) {
49
+ const segs = flat.split(DELIM);
50
+ const current = out ?? patch;
51
+ if (!nativeHas(current, segs) || nativeGet(current, segs) === undefined)
52
+ continue;
53
+ if (out === undefined) {
54
+ owned = new WeakSet();
55
+ out = ownedRootOf(patch, owned);
56
+ }
57
+ ownSpine(out, segs, owned);
58
+ nativeSet(out, segs, LOG_PLACEHOLDER);
59
+ }
60
+ return out ?? patch;
61
+ }
62
+ /**
63
+ * Redacts sensitive values in a patch for logging/debugging — the PUBLIC scrub (`footprintjs/advanced`),
64
+ * its contract unchanged since 4.x: a fresh deep copy of `patch` (`structuredClone`) with
65
+ * {@link LOG_PLACEHOLDER} at every listed path that holds a defined value. Shares nothing with `patch`
66
+ * and never edits it. (It lived in `memory/utils.ts` until 9.33.0 and in `memory/redaction.ts` until
67
+ * C4; the engine's own commit path uses the clone-free {@link scrubPatch}.) No caller inside the
68
+ * library: it stays on `footprintjs/advanced` for the consumers that import it until 10.0.0 (the trace
69
+ * extraction, E6), which takes it off every door.
70
+ */
71
+ export function redactPatch(patch, redactedSet) {
72
+ return scrubPatch(structuredClone(patch), redactedSet);
73
+ }
74
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NydWIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9zY3J1Yi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN0RixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUdwRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQUMsS0FBa0IsRUFBRSxhQUErQjtJQUM1RSxJQUFJLEdBQTRCLENBQUM7SUFDakMsSUFBSSxLQUFrQyxDQUFDO0lBQ3ZDLEtBQUssTUFBTSxJQUFJLElBQUksYUFBYSxFQUFFLENBQUM7UUFDakMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixNQUFNLE9BQU8sR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDO1FBQzdCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUssU0FBUztZQUFFLFNBQVM7UUFDbEYsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdEIsS0FBSyxHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7WUFDOUIsR0FBRyxHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFnQixDQUFDO1FBQ2pELENBQUM7UUFDRCxRQUFRLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFNLENBQUMsQ0FBQztRQUM1QixTQUFTLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxlQUFlLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsT0FBTyxHQUFHLElBQUksS0FBSyxDQUFDO0FBQ3RCLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBa0IsRUFBRSxXQUF3QjtJQUN0RSxPQUFPLFVBQVUsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDekQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogc2NydWIudHMg4oCUIHRoZSBjb21taXQgbG9nJ3Mgc2NydWI6IHRoZSBwbGFjZWhvbGRlciBhdCBldmVyeSByZWRhY3RlZCBwYXRoIG9mIGEgcGF0Y2ggKEM0LCBMMikuXG4gKlxuICogVGhlIFJFQ09SRCdzIGhhbGYgb2YgYSByZWRhY3Rpb24uIEEgcmVkYWN0ZWQgcGF0aCBpcyBEQVRBIGJ5IHRoZSB0aW1lIGl0IHJlYWNoZXMgaGVyZSDigJQgdGhlXG4gKiB0cmFuc2FjdGlvbiBidWZmZXIncyBgcmVkYWN0ZWRQYXRoc2AsIHJlZ2lzdGVyZWQgYnkgYFJlY29yZEZyYW1lIMK3IHdyaXRlYCBmcm9tIHRoZSBzY3J1YiBpdCB3YXNcbiAqIGhhbmRlZCDigJQgYW5kIHRoaXMgZmlsZSBvbmx5IHdyaXRlcyBgTE9HX1BMQUNFSE9MREVSYCAoYHBsYWNlaG9sZGVycy50c2ApIHdoZXJlIHN1Y2ggYSBwYXRoIGhvbGRzXG4gKiBhIHZhbHVlLiBJdCBuZXZlciBkZWNpZGVzIFdIQVQgaXMgc2VjcmV0OiB0aGF0IGlzIHRoZSBlbmdpbmUncyB2ZXJkaWN0IChgcmVkYWN0aW9uLnRzYCwgTDQg4oCUXG4gKiBgUmVkYWN0aW9uUnVsZWAgYW5kIHRoZSB3cml0ZSBkZWNpc2lvbiksIHdoaWNoIGFsc28gb3ducyB0aGUgT1RIRVIgcGxhY2Vob2xkZXIsIHRoZSBzY29wZSBjaGFubmVsJ3NcbiAqIGBTQ09QRV9QTEFDRUhPTERFUmAuIEJlZm9yZSBDNCBib3RoIGhhbHZlcyBsaXZlZCBpbiBgcmVkYWN0aW9uLnRzYCwgc28gdGhlIHJlY29yZCBpbXBvcnRlZCB0aGVcbiAqIGVuZ2luZSdzIHBvbGljeSBtb2R1bGUgdG8gd3JpdGUgYSBzdHJpbmcuXG4gKlxuICogVEhFIExBVzpcbiAqICAgMS4gQSBwYXRoIGlzIHNjcnViYmVkIG9ubHkgd2hlcmUgaXQgaG9sZHMgYSBERUZJTkVEIHZhbHVlIOKAlCBzY3J1YmJpbmcgbmV2ZXIgaW52ZW50cyBhIGZpZWxkLlxuICogICAyLiBQYXRocyBhcmUgc2NydWJiZWQgaW4gdGhlIHNldCdzIG9yZGVyLCBhZ2FpbnN0IHRoZSB0cmVlIGFzIHNjcnViYmVkIHNvIGZhcjogYSBwYXRoIHVuZGVyIG9uZVxuICogICAgICBhbHJlYWR5IHNjcnViYmVkIGZpbmRzIGEgc3RyaW5nLCBub3QgYSBjb250YWluZXIsIGFuZCBpcyBsZWZ0IGFsb25lLlxuICogICAzLiBUaGUgaW5wdXQgcGF0Y2ggaXMgbmV2ZXIgZWRpdGVkLiBgc2NydWJQYXRjaGAgY29waWVzIG9ubHkgdGhlIHNwaW5lIG9mIGVhY2ggc2NydWJiZWQgcGF0aFxuICogICAgICAoYW5kIG5vdGhpbmcgYXQgYWxsIHdoZW4gbm90aGluZyBpcyBzY3J1YmJlZCk7IGByZWRhY3RQYXRjaGAgaGFuZHMgYmFjayBhIGZyZXNoIGRlZXAgY29weS5cbiAqL1xuXG5pbXBvcnQgeyBuYXRpdmVHZXQsIG5hdGl2ZUhhcywgbmF0aXZlU2V0LCBvd25lZFJvb3RPZiwgb3duU3BpbmUgfSBmcm9tICcuL3BhdGhPcHMuanMnO1xuaW1wb3J0IHsgREVMSU0gfSBmcm9tICcuL3BhdGhzLmpzJztcbmltcG9ydCB7IExPR19QTEFDRUhPTERFUiB9IGZyb20gJy4vcGxhY2Vob2xkZXJzLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5UGF0Y2ggfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqXG4gKiBUaGUgY29tbWl0IGxvZydzIHNjcnViOiBgcGF0Y2hgIHdpdGgge0BsaW5rIExPR19QTEFDRUhPTERFUn0gYXQgZXZlcnkgcGF0aCBpbiBgcmVkYWN0ZWRQYXRoc2AgdGhhdFxuICogaG9sZHMgYSBkZWZpbmVkIHZhbHVlIOKAlCB0aGUgY29weSBgcmVjb3JkQ29tbWl0YCByZWNvcmRzIGFuZCBmZWVkcyB0aGUgcmVkYWN0ZWQgbWlycm9yLlxuICpcbiAqIENMT05FLUZSRUUgKDkuMzMuMCkuIFRoZSBwYXRjaCBpcyB0aGUgdHJhbnNhY3Rpb24gYnVmZmVyJ3MgY29tbWl0LXRpbWUgcGF5bG9hZCwgYWxyZWFkeSB0aGUgcmVjb3JkJ3NcbiAqIG93biBjb3B5IChgVHJhbnNhY3Rpb25CdWZmZXIgwrcgY29tbWl0YCBjbG9uZXMgZWFjaCBzdXJ2aXZpbmcgcGF0aCBvbmNlOyB0aGUgYnVmZmVyIGlzIGRyb3BwZWQgYXRcbiAqIGNvbW1pdCksIHNvIHRoZSBzY3J1YiBjb3BpZXMgb25seSB3aGF0IGl0IG11c3Qgbm90IGVkaXQgaW4gcGxhY2U6XG4gKiAgIC0gbm8gcGF0aCB0byBzY3J1YiAobm8gcG9saWN5LCBubyBwZXItY2FsbCBtYXJrIOKAlCB0aGUgY29tbW9uIGNhc2UpIOKGkiBgcGF0Y2hgIElUU0VMRiwgbm8gY29weSBhdCBhbGw7XG4gKiAgIC0gb3RoZXJ3aXNlIOKGkiBhIG5ldyByb290IGFuZCBhIHNoYWxsb3cgY29weSBvZiBlYWNoIGNvbnRhaW5lciBvbiBhIHNjcnViYmVkIHBhdGggKGBwYXRoT3BzIMK3XG4gKiAgICAgb3duU3BpbmVgKSwgZXZlcnkgb3RoZXIgc3VidHJlZSBzaGFyZWQgd2l0aCBgcGF0Y2hgLiBgcGF0Y2hgIGlzIG5ldmVyIGVkaXRlZC5cbiAqIFRoZSBlbmdpbmUgY2FsbGVkIHRoZSBwdWJsaWMge0BsaW5rIHJlZGFjdFBhdGNofSAoYSB3aG9sZSBgc3RydWN0dXJlZENsb25lYCkgdHdpY2UgcGVyIGNvbW1pdCBiZWZvcmVcbiAqIDkuMzMuMC4gVGhlIGJ5dGVzIGFyZSB0aGUgc2FtZTogYSBzY3J1YmJlZCBwYXRoIGhvbGRzIHRoZSBwbGFjZWhvbGRlciwgZXZlcnkgb3RoZXIgcGF0aCB0aGUgdmFsdWUgdGhlXG4gKiBidWZmZXIgY2xvbmVkIChwaW5uZWQgYnkgdGhlIDkuMTguMSAvIDkuMTkuMSByZWRhY3Rpb24gYnl0ZSB0ZXN0cykuXG4gKlxuICogUGF0aHMgYXJlIHNjcnViYmVkIGluIHRoZSBzZXQncyBvcmRlciwgYWdhaW5zdCB0aGUgdHJlZSBhcyBzY3J1YmJlZCBzbyBmYXI6IGEgcGF0aCB1bmRlciBvbmUgYWxyZWFkeVxuICogc2NydWJiZWQgZmluZHMgYSBzdHJpbmcsIG5vdCBhIGNvbnRhaW5lciwgYW5kIGlzIGxlZnQgYWxvbmUgKGFzIGJlZm9yZSkuXG4gKlxuICogSU5URVJOQUwg4oCUIHRoZSByZXN1bHQgc2hhcmVzIHN0cnVjdHVyZSB3aXRoIGBwYXRjaGAuIEEgY2FsbGVyIG91dHNpZGUgdGhlIGNvbW1pdCBwYXRoIHdhbnRzXG4gKiB7QGxpbmsgcmVkYWN0UGF0Y2h9LlxuICpcbiAqIEBwYXJhbSByZWRhY3RlZFBhdGhzIERFTElNLWpvaW5lZCBwYXRocyAoYFRyYW5zYWN0aW9uQnVmZmVyYCdzIGByZWRhY3RlZFBhdGhzYDsgYSBidW5kbGUnc1xuICogICBgcmVkYWN0ZWRQYXRoc2AgYXJyYXkgd29ya3MgdG9vKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjcnViUGF0Y2gocGF0Y2g6IE1lbW9yeVBhdGNoLCByZWRhY3RlZFBhdGhzOiBJdGVyYWJsZTxzdHJpbmc+KTogTWVtb3J5UGF0Y2gge1xuICBsZXQgb3V0OiBNZW1vcnlQYXRjaCB8IHVuZGVmaW5lZDtcbiAgbGV0IG93bmVkOiBXZWFrU2V0PG9iamVjdD4gfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgZmxhdCBvZiByZWRhY3RlZFBhdGhzKSB7XG4gICAgY29uc3Qgc2VncyA9IGZsYXQuc3BsaXQoREVMSU0pO1xuICAgIGNvbnN0IGN1cnJlbnQgPSBvdXQgPz8gcGF0Y2g7XG4gICAgaWYgKCFuYXRpdmVIYXMoY3VycmVudCwgc2VncykgfHwgbmF0aXZlR2V0KGN1cnJlbnQsIHNlZ3MpID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGlmIChvdXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgb3duZWQgPSBuZXcgV2Vha1NldDxvYmplY3Q+KCk7XG4gICAgICBvdXQgPSBvd25lZFJvb3RPZihwYXRjaCwgb3duZWQpIGFzIE1lbW9yeVBhdGNoO1xuICAgIH1cbiAgICBvd25TcGluZShvdXQsIHNlZ3MsIG93bmVkISk7XG4gICAgbmF0aXZlU2V0KG91dCwgc2VncywgTE9HX1BMQUNFSE9MREVSKTtcbiAgfVxuICByZXR1cm4gb3V0ID8/IHBhdGNoO1xufVxuXG4vKipcbiAqIFJlZGFjdHMgc2Vuc2l0aXZlIHZhbHVlcyBpbiBhIHBhdGNoIGZvciBsb2dnaW5nL2RlYnVnZ2luZyDigJQgdGhlIFBVQkxJQyBzY3J1YiAoYGZvb3RwcmludGpzL2FkdmFuY2VkYCksXG4gKiBpdHMgY29udHJhY3QgdW5jaGFuZ2VkIHNpbmNlIDQueDogYSBmcmVzaCBkZWVwIGNvcHkgb2YgYHBhdGNoYCAoYHN0cnVjdHVyZWRDbG9uZWApIHdpdGhcbiAqIHtAbGluayBMT0dfUExBQ0VIT0xERVJ9IGF0IGV2ZXJ5IGxpc3RlZCBwYXRoIHRoYXQgaG9sZHMgYSBkZWZpbmVkIHZhbHVlLiBTaGFyZXMgbm90aGluZyB3aXRoIGBwYXRjaGBcbiAqIGFuZCBuZXZlciBlZGl0cyBpdC4gKEl0IGxpdmVkIGluIGBtZW1vcnkvdXRpbHMudHNgIHVudGlsIDkuMzMuMCBhbmQgaW4gYG1lbW9yeS9yZWRhY3Rpb24udHNgIHVudGlsXG4gKiBDNDsgdGhlIGVuZ2luZSdzIG93biBjb21taXQgcGF0aCB1c2VzIHRoZSBjbG9uZS1mcmVlIHtAbGluayBzY3J1YlBhdGNofS4pIE5vIGNhbGxlciBpbnNpZGUgdGhlXG4gKiBsaWJyYXJ5OiBpdCBzdGF5cyBvbiBgZm9vdHByaW50anMvYWR2YW5jZWRgIGZvciB0aGUgY29uc3VtZXJzIHRoYXQgaW1wb3J0IGl0IHVudGlsIDEwLjAuMCAodGhlIHRyYWNlXG4gKiBleHRyYWN0aW9uLCBFNiksIHdoaWNoIHRha2VzIGl0IG9mZiBldmVyeSBkb29yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVkYWN0UGF0Y2gocGF0Y2g6IE1lbW9yeVBhdGNoLCByZWRhY3RlZFNldDogU2V0PHN0cmluZz4pOiBNZW1vcnlQYXRjaCB7XG4gIHJldHVybiBzY3J1YlBhdGNoKHN0cnVjdHVyZWRDbG9uZShwYXRjaCksIHJlZGFjdGVkU2V0KTtcbn1cbiJdfQ==
@@ -9,9 +9,9 @@
9
9
  * (`paths.ts`), structural equality (`equality.ts`) and the union merge
10
10
  * (`merge.ts`) at L0, and the verb law (`verbs.ts`) at L1 — `applySmartMerge`,
11
11
  * `nextGeneration`, `applySmartMergeInto`, `dryFold`, `supersededByNextSet`.
12
- * The log's scrub, `redactPatch`, moved to its owner `redaction.ts` in 9.33.0.
12
+ * The log's scrub, `redactPatch`, moved out in 9.33.0; it is the record's own, `scrub.ts` (C4).
13
13
  * The writers take an ADDRESS, a path prefix their caller computed, and never
14
- * name one (C2: the engine decides where a stage writes, `StageContext.ts · runAddress`).
14
+ * name one (C2: the engine decides where a stage writes, `runAddress.ts · runAddress`).
15
15
  * Zero external dependencies.
16
16
  */
17
17
  export { deepEqual } from './equality.js';
@@ -25,7 +25,7 @@ type NestedObject = {
25
25
  * The two places a value at `path` can sit: under `address` (`runPath`, absent
26
26
  * for the root address `[]`) and at the root (`globalPath`). `address` is a
27
27
  * path prefix the caller computed — for the engine, a frame's run namespace
28
- * (`StageContext.ts · runAddress`, C2), held by its record frame (`RecordFrame · address`, C3).
28
+ * (`runAddress.ts · runAddress`, C2), held by its record frame (`RecordFrame · address`, C3).
29
29
  */
30
30
  export declare function getRunAndGlobalPaths(address?: readonly string[], path?: (string | number)[]): {
31
31
  runPath: (string | number)[] | undefined;
@@ -9,9 +9,9 @@
9
9
  * (`paths.ts`), structural equality (`equality.ts`) and the union merge
10
10
  * (`merge.ts`) at L0, and the verb law (`verbs.ts`) at L1 — `applySmartMerge`,
11
11
  * `nextGeneration`, `applySmartMergeInto`, `dryFold`, `supersededByNextSet`.
12
- * The log's scrub, `redactPatch`, moved to its owner `redaction.ts` in 9.33.0.
12
+ * The log's scrub, `redactPatch`, moved out in 9.33.0; it is the record's own, `scrub.ts` (C4).
13
13
  * The writers take an ADDRESS, a path prefix their caller computed, and never
14
- * name one (C2: the engine decides where a stage writes, `StageContext.ts · runAddress`).
14
+ * name one (C2: the engine decides where a stage writes, `runAddress.ts · runAddress`).
15
15
  * Zero external dependencies.
16
16
  */
17
17
  import { nativeGet as _get } from './pathOps.js';
@@ -23,7 +23,7 @@ export { applySmartMerge, applySmartMergeInto, dryFold, nextGeneration, supersed
23
23
  * The two places a value at `path` can sit: under `address` (`runPath`, absent
24
24
  * for the root address `[]`) and at the root (`globalPath`). `address` is a
25
25
  * path prefix the caller computed — for the engine, a frame's run namespace
26
- * (`StageContext.ts · runAddress`, C2), held by its record frame (`RecordFrame · address`, C3).
26
+ * (`runAddress.ts · runAddress`, C2), held by its record frame (`RecordFrame · address`, C3).
27
27
  */
28
28
  export function getRunAndGlobalPaths(address = [], path = []) {
29
29
  return {
@@ -129,4 +129,4 @@ export function getNestedValue(root, path, field) {
129
129
  }
130
130
  return undefined;
131
131
  }
132
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUUsU0FBUyxJQUFJLElBQUksRUFBd0MsTUFBTSxjQUFjLENBQUM7QUFJdkYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFJaEg7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsVUFBNkIsRUFBRSxFQUFFLE9BQTRCLEVBQUU7SUFDbEcsT0FBTztRQUNMLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUM3RSxVQUFVLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztLQUN0QixDQUFDO0FBQ0osQ0FBQztBQUVELG9IQUFvSDtBQUNwSCxTQUFTLFNBQVMsQ0FBQyxPQUEwQjtJQUMzQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDM0MsTUFBTSxJQUFJLFNBQVMsQ0FDakIsd0RBQXdELE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLEVBQUUsQ0FDckcsQ0FBQztBQUNKLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxTQUFTLENBQUMsT0FBMEIsRUFBRSxJQUFrQztJQUMvRSxNQUFNLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBa0IsT0FBTyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFO1FBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7UUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsV0FBVyxDQUNsQixHQUFpQixFQUNqQixVQUE2QixFQUFFLEVBQy9CLE9BQXFDLEVBQUUsRUFDdkMsYUFBdUI7SUFFdkIsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNyRCxJQUFJLE9BQU8sR0FBRyxHQUFHLENBQUM7SUFDbEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN6QyxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN4RCxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDaEYsQ0FBQztRQUNELE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQzVCLEdBQWlCLEVBQ2pCLE9BQTBCLEVBQzFCLElBQWMsRUFDZCxLQUFhLEVBQ2IsS0FBUSxFQUNSLGFBQXVCO0lBRXZCLFdBQVcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDOUQsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQy9CLEdBQVEsRUFDUixPQUEwQixFQUMxQixJQUF5QixFQUN6QixLQUFzQixFQUN0QixLQUFRLEVBQ1IsYUFBdUI7SUFFdkIsV0FBVyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxhQUFhLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDMUUsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFDLE1BQVcsRUFBRSxHQUFvQixFQUFFLEtBQVU7SUFDdkUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekIsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyx3Q0FBd0M7UUFDL0QsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFRLENBQUM7WUFDL0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBQy9ELENBQUM7SUFDSCxDQUFDO1NBQU0sSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDM0UsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBUSxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQztJQUNqRSxDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDdEIsQ0FBQztBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsSUFBUyxFQUFFLElBQXlCLEVBQUUsS0FBdUI7SUFDMUYsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDL0QsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxTQUFTO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDM0QsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbkcsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHV0aWxzLnRzIOKAlCBuZXN0ZWQtb2JqZWN0IGhlbHBlcnMgZm9yIHRoZSBoZWFwLCBhbmQgdGhlIG1lbW9yeSBsZWF2ZXMnIG9uZVxuICogcmUtZXhwb3J0IHN1cmZhY2UuXG4gKlxuICogVGhlIGhlbHBlcnMgaGVyZSAoYHNldE5lc3RlZFZhbHVlYCwgYHVwZGF0ZU5lc3RlZFZhbHVlYCwgYHVwZGF0ZVZhbHVlYCxcbiAqIGBnZXROZXN0ZWRWYWx1ZWApIHdhbGsgYSBuZXN0ZWQgb2JqZWN0IGJ5IHBhdGggd2l0aFxuICogcHJvdG90eXBlLXBvbGx1dGlvbiBwcm90ZWN0aW9uLiBFdmVyeXRoaW5nIGVsc2UgdGhpcyBmaWxlIHVzZWQgdG8gaG9sZCBoYXMgYW5cbiAqIG93bmVyIG9mIGl0cyBvd24gYW5kIGlzIHJlLWV4cG9ydGVkLCBzbyBubyBpbXBvcnRlciBtb3ZlZDogdGhlIHBhdGggY29kZWNcbiAqIChgcGF0aHMudHNgKSwgc3RydWN0dXJhbCBlcXVhbGl0eSAoYGVxdWFsaXR5LnRzYCkgYW5kIHRoZSB1bmlvbiBtZXJnZVxuICogKGBtZXJnZS50c2ApIGF0IEwwLCBhbmQgdGhlIHZlcmIgbGF3IChgdmVyYnMudHNgKSBhdCBMMSDigJQgYGFwcGx5U21hcnRNZXJnZWAsXG4gKiBgbmV4dEdlbmVyYXRpb25gLCBgYXBwbHlTbWFydE1lcmdlSW50b2AsIGBkcnlGb2xkYCwgYHN1cGVyc2VkZWRCeU5leHRTZXRgLlxuICogVGhlIGxvZydzIHNjcnViLCBgcmVkYWN0UGF0Y2hgLCBtb3ZlZCB0byBpdHMgb3duZXIgYHJlZGFjdGlvbi50c2AgaW4gOS4zMy4wLlxuICogVGhlIHdyaXRlcnMgdGFrZSBhbiBBRERSRVNTLCBhIHBhdGggcHJlZml4IHRoZWlyIGNhbGxlciBjb21wdXRlZCwgYW5kIG5ldmVyXG4gKiBuYW1lIG9uZSAoQzI6IHRoZSBlbmdpbmUgZGVjaWRlcyB3aGVyZSBhIHN0YWdlIHdyaXRlcywgYFN0YWdlQ29udGV4dC50cyDCtyBydW5BZGRyZXNzYCkuXG4gKiBaZXJvIGV4dGVybmFsIGRlcGVuZGVuY2llcy5cbiAqL1xuXG5pbXBvcnQgeyBuYXRpdmVHZXQgYXMgX2dldCwgbmF0aXZlSGFzIGFzIF9oYXMsIG5hdGl2ZVNldCBhcyBfc2V0IH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IERFTElNIH0gZnJvbSAnLi9wYXRocy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeVBhdGNoIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmV4cG9ydCB7IGRlZXBFcXVhbCB9IGZyb20gJy4vZXF1YWxpdHkuanMnO1xuZXhwb3J0IHsgZGVlcFNtYXJ0TWVyZ2UgfSBmcm9tICcuL21lcmdlLmpzJztcbmV4cG9ydCB7IERFTElNLCBub3JtYWxpc2VQYXRoLCBwYXRoU2VnbWVudHMgfSBmcm9tICcuL3BhdGhzLmpzJztcbmV4cG9ydCB7IGFwcGx5U21hcnRNZXJnZSwgYXBwbHlTbWFydE1lcmdlSW50bywgZHJ5Rm9sZCwgbmV4dEdlbmVyYXRpb24sIHN1cGVyc2VkZWRCeU5leHRTZXQgfSBmcm9tICcuL3ZlcmJzLmpzJztcblxudHlwZSBOZXN0ZWRPYmplY3QgPSB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuXG4vKipcbiAqIFRoZSB0d28gcGxhY2VzIGEgdmFsdWUgYXQgYHBhdGhgIGNhbiBzaXQ6IHVuZGVyIGBhZGRyZXNzYCAoYHJ1blBhdGhgLCBhYnNlbnRcbiAqIGZvciB0aGUgcm9vdCBhZGRyZXNzIGBbXWApIGFuZCBhdCB0aGUgcm9vdCAoYGdsb2JhbFBhdGhgKS4gYGFkZHJlc3NgIGlzIGFcbiAqIHBhdGggcHJlZml4IHRoZSBjYWxsZXIgY29tcHV0ZWQg4oCUIGZvciB0aGUgZW5naW5lLCBhIGZyYW1lJ3MgcnVuIG5hbWVzcGFjZVxuICogKGBTdGFnZUNvbnRleHQudHMgwrcgcnVuQWRkcmVzc2AsIEMyKSwgaGVsZCBieSBpdHMgcmVjb3JkIGZyYW1lIChgUmVjb3JkRnJhbWUgwrcgYWRkcmVzc2AsIEMzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJ1bkFuZEdsb2JhbFBhdGhzKGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdID0gW10sIHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10gPSBbXSkge1xuICByZXR1cm4ge1xuICAgIHJ1blBhdGg6IGFkZHJlc3NPZihhZGRyZXNzKS5sZW5ndGggPiAwID8gcGF0aFVuZGVyKGFkZHJlc3MsIHBhdGgpIDogdW5kZWZpbmVkLFxuICAgIGdsb2JhbFBhdGg6IFsuLi5wYXRoXSxcbiAgfTtcbn1cblxuLyoqIEFuIGFkZHJlc3MgaXMgYW4gYXJyYXkuIEEgcnVuIGlkIHN0aWxsIHBhc3NlZCBpbiBpdHMgcGxhY2UgKEMyKSBpcyByZWZ1c2VkLCBuZXZlciBzcHJlYWQgaW50byBpdHMgY2hhcmFjdGVycy4gKi9cbmZ1bmN0aW9uIGFkZHJlc3NPZihhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYWRkcmVzcykpIHJldHVybiBhZGRyZXNzO1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgIGBmb290cHJpbnRqczogYW4gYWRkcmVzcyBpcyBhbiBhcnJheSBwYXRoIHByZWZpeCwgZ290ICR7YWRkcmVzcyA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiBhZGRyZXNzfWAsXG4gICk7XG59XG5cbi8qKlxuICogYGFkZHJlc3NgIHRoZW4gYHBhdGhgLCBhcyBvbmUgbmV3IGFycmF5LiBBbiBpbmRleCBsb29wLCBiZWNhdXNlIHRoZSBkb3VibGVcbiAqIHNwcmVhZCBgWy4uLmFkZHJlc3MsIC4uLnBhdGhdYCBjb3N0cyB0d2ljZSBhcyBtdWNoIGFuZCBhIGZyYW1lIGJ1aWxkcyBvbmUgb25cbiAqIGV2ZXJ5IHJlYWQgaXQgc2VydmVzIGZyb20gbGl2ZSBzdGF0ZSAoYSBmb3JrIGNoaWxkIHJlYWRpbmcgYSByb290IGtleSkuXG4gKi9cbmZ1bmN0aW9uIHBhdGhVbmRlcihhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSwgcGF0aDogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXSk6IChzdHJpbmcgfCBudW1iZXIpW10ge1xuICBjb25zdCBvdXQgPSBuZXcgQXJyYXk8c3RyaW5nIHwgbnVtYmVyPihhZGRyZXNzLmxlbmd0aCArIHBhdGgubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZGRyZXNzLmxlbmd0aDsgaSsrKSBvdXRbaV0gPSBhZGRyZXNzW2ldO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIG91dFthZGRyZXNzLmxlbmd0aCArIGldID0gcGF0aFtpXTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBUaGUgY29udGFpbmVyIGF0IGBhZGRyZXNzYCArIGBwYXRoYCBpbnNpZGUgYG9iamAsIGVhY2ggbWlzc2luZyBvbmUgY3JlYXRlZFxuICogb24gdGhlIHdheTogdGhlIG9uZSBBVCB0aGUgYWRkcmVzcyBmcm9tIGBkZWZhdWx0VmFsdWVzYCB3aGVuIGdpdmVuLCBldmVyeVxuICogb3RoZXIgb25lIGVtcHR5LiBUaGUgb25lIHdhbGsgYm90aCBuZXN0ZWQgd3JpdGVycyBzaGFyZS5cbiAqL1xuZnVuY3Rpb24gY29udGFpbmVyQXQoXG4gIG9iajogTmVzdGVkT2JqZWN0LFxuICBhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSA9IFtdLFxuICBwYXRoOiByZWFkb25seSAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW10sXG4gIGRlZmF1bHRWYWx1ZXM/OiB1bmtub3duLFxuKTogTmVzdGVkT2JqZWN0IHtcbiAgY29uc3Qgc2VnbWVudHMgPSBwYXRoVW5kZXIoYWRkcmVzc09mKGFkZHJlc3MpLCBwYXRoKTtcbiAgbGV0IGN1cnJlbnQgPSBvYmo7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBrZXkgPSBzZWdtZW50c1tpXTtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjdXJyZW50LCBrZXkpKSB7XG4gICAgICBjdXJyZW50W2tleV0gPSBpID09PSBhZGRyZXNzLmxlbmd0aCAtIDEgJiYgZGVmYXVsdFZhbHVlcyA/IGRlZmF1bHRWYWx1ZXMgOiB7fTtcbiAgICB9XG4gICAgY3VycmVudCA9IGN1cnJlbnRba2V5XTtcbiAgfVxuICByZXR1cm4gY3VycmVudDtcbn1cblxuLyoqXG4gKiBTZXRzIGEgdmFsdWUgYXQgYSBuZXN0ZWQgcGF0aCB1bmRlciBgYWRkcmVzc2AsIGNyZWF0aW5nIGludGVybWVkaWF0ZSBvYmplY3RzIGFzIG5lZWRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldE5lc3RlZFZhbHVlPFQ+KFxuICBvYmo6IE5lc3RlZE9iamVjdCxcbiAgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sXG4gIHBhdGg6IHN0cmluZ1tdLFxuICBmaWVsZDogc3RyaW5nLFxuICB2YWx1ZTogVCxcbiAgZGVmYXVsdFZhbHVlcz86IHVua25vd24sXG4pOiBOZXN0ZWRPYmplY3Qge1xuICBjb250YWluZXJBdChvYmosIGFkZHJlc3MsIHBhdGgsIGRlZmF1bHRWYWx1ZXMpW2ZpZWxkXSA9IHZhbHVlO1xuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIERlZXAtbWVyZ2VzIGEgdmFsdWUgaW50byB0aGUgb2JqZWN0IGF0IGEgbmVzdGVkIHBhdGggdW5kZXIgYGFkZHJlc3NgLlxuICogLSBBcnJheXM6IGNvbmNhdGVuYXRlXG4gKiAtIE9iamVjdHM6IHNoYWxsb3cgbWVyZ2UgYXQgZWFjaCBsZXZlbFxuICogLSBQcmltaXRpdmVzOiByZXBsYWNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVOZXN0ZWRWYWx1ZTxUPihcbiAgb2JqOiBhbnksXG4gIGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdLFxuICBmaWVsZDogc3RyaW5nIHwgbnVtYmVyLFxuICB2YWx1ZTogVCxcbiAgZGVmYXVsdFZhbHVlcz86IHVua25vd24sXG4pOiBhbnkge1xuICB1cGRhdGVWYWx1ZShjb250YWluZXJBdChvYmosIGFkZHJlc3MsIHBhdGgsIGRlZmF1bHRWYWx1ZXMpLCBmaWVsZCwgdmFsdWUpO1xuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIEluLXBsYWNlIHZhbHVlIHVwZGF0ZSB3aXRoIG1lcmdlIHNlbWFudGljcy5cbiAqIC0gQXJyYXlzIChub24tZW1wdHkpOiBjb25jYXRlbmF0ZSBvbnRvIGV4aXN0aW5nXG4gKiAtIEFycmF5cyAoZW1wdHkpOiAgICAgZGlyZWN0IHJlcGxhY2Ug4oCUIHdyaXRpbmcgYFtdYCBjbGVhcnMgdGhlIGZpZWxkXG4gKiAtIE9iamVjdHMgKG5vbi1lbXB0eSk6IHNoYWxsb3cgbWVyZ2UgKHNwcmVhZClcbiAqIC0gT2JqZWN0cyAoZW1wdHkpOiAgICBkaXJlY3QgcmVwbGFjZSDigJQgd3JpdGluZyBge31gIGNsZWFycyB0aGUgZmllbGRcbiAqIC0gUHJpbWl0aXZlczogZGlyZWN0IGFzc2lnbm1lbnRcbiAqXG4gKiBOb3RlIG9uIGVtcHR5IGFycmF5czogYm90aCBgdmFsdWUgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSlgIGFuZFxuICogYEFycmF5LmlzQXJyYXkodmFsdWUpYCBldmFsdWF0ZSB0aGUgc2FtZSBmb3IgYXJyYXlzIOKAlCBgW11gIGlzIHRydXRoeSBpblxuICogSmF2YVNjcmlwdCwgc28gdGhlIGAmJmAgZ3VhcmQgd2FzIG5ldmVyIHRoZSBpc3N1ZS4gVGhlIGFjdHVhbCBidWcgd2FzIHRoZVxuICogY29uY2F0IHBhdGg6IGBbLi4uY3VyLCAuLi5bXV1gIHNpbGVudGx5IHJldHVybmVkIGBjdXJgIHVuY2hhbmdlZCB3aGVuIGB2YWx1ZWBcbiAqIHdhcyBgW11gLCBtYWtpbmcgYHVwZGF0ZVZhbHVlKG9iaiwgJ3RhZ3MnLCBbXSlgIGEgbm8tb3AgaW5zdGVhZCBvZiBhIGNsZWFyLlxuICogVGhlIGZpeCBpcyB0aGUgZXhwbGljaXQgYHZhbHVlLmxlbmd0aCA9PT0gMGAgZWFybHktcmV0dXJuIGJyYW5jaC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVZhbHVlKG9iamVjdDogYW55LCBrZXk6IHN0cmluZyB8IG51bWJlciwgdmFsdWU6IGFueSk6IHZvaWQge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBpZiAodmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICBvYmplY3Rba2V5XSA9IHZhbHVlOyAvLyBjbGVhcjogW10gcmVwbGFjZXMgd2hhdGV2ZXIgd2FzIHRoZXJlXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGN1ciA9IG9iamVjdFtrZXldIGFzIGFueTtcbiAgICAgIG9iamVjdFtrZXldID0gY3VyID09PSB1bmRlZmluZWQgPyB2YWx1ZSA6IFsuLi5jdXIsIC4uLnZhbHVlXTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoKSB7XG4gICAgY29uc3QgY3VyID0gb2JqZWN0W2tleV0gYXMgYW55O1xuICAgIG9iamVjdFtrZXldID0gY3VyID09PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHsgLi4uY3VyLCAuLi52YWx1ZSB9O1xuICB9IGVsc2Uge1xuICAgIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXRzIGEgdmFsdWUgYXQgYSBuZXN0ZWQgcGF0aCB3aXRoIHByb3RvdHlwZS1wb2xsdXRpb24gcHJvdGVjdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5lc3RlZFZhbHVlKHJvb3Q6IGFueSwgcGF0aDogKHN0cmluZyB8IG51bWJlcilbXSwgZmllbGQ/OiBzdHJpbmcgfCBudW1iZXIpOiBhbnkge1xuICBjb25zdCBub2RlID0gcGF0aCAmJiBwYXRoLmxlbmd0aCA+IDAgPyBfZ2V0KHJvb3QsIHBhdGgpIDogcm9vdDtcbiAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQgfHwgbm9kZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbm9kZTtcbiAgaWYgKG5vZGUgIT09IG51bGwgJiYgdHlwZW9mIG5vZGUgPT09ICdvYmplY3QnICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChub2RlLCBmaWVsZCkpIHtcbiAgICByZXR1cm4gbm9kZVtmaWVsZF07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiJdfQ==
132
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUUsU0FBUyxJQUFJLElBQUksRUFBd0MsTUFBTSxjQUFjLENBQUM7QUFJdkYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFJaEg7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsVUFBNkIsRUFBRSxFQUFFLE9BQTRCLEVBQUU7SUFDbEcsT0FBTztRQUNMLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUM3RSxVQUFVLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztLQUN0QixDQUFDO0FBQ0osQ0FBQztBQUVELG9IQUFvSDtBQUNwSCxTQUFTLFNBQVMsQ0FBQyxPQUEwQjtJQUMzQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDM0MsTUFBTSxJQUFJLFNBQVMsQ0FDakIsd0RBQXdELE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLEVBQUUsQ0FDckcsQ0FBQztBQUNKLENBQUM7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WUFDL0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBQy9ELENBQUM7SUFDSCxDQUFDO1NBQU0sSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDM0UsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBUSxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQztJQUNqRSxDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDdEIsQ0FBQztBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsSUFBUyxFQUFFLElBQXlCLEVBQUUsS0FBdUI7SUFDMUYsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDL0QsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxTQUFTO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDM0QsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbkcsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHV0aWxzLnRzIOKAlCBuZXN0ZWQtb2JqZWN0IGhlbHBlcnMgZm9yIHRoZSBoZWFwLCBhbmQgdGhlIG1lbW9yeSBsZWF2ZXMnIG9uZVxuICogcmUtZXhwb3J0IHN1cmZhY2UuXG4gKlxuICogVGhlIGhlbHBlcnMgaGVyZSAoYHNldE5lc3RlZFZhbHVlYCwgYHVwZGF0ZU5lc3RlZFZhbHVlYCwgYHVwZGF0ZVZhbHVlYCxcbiAqIGBnZXROZXN0ZWRWYWx1ZWApIHdhbGsgYSBuZXN0ZWQgb2JqZWN0IGJ5IHBhdGggd2l0aFxuICogcHJvdG90eXBlLXBvbGx1dGlvbiBwcm90ZWN0aW9uLiBFdmVyeXRoaW5nIGVsc2UgdGhpcyBmaWxlIHVzZWQgdG8gaG9sZCBoYXMgYW5cbiAqIG93bmVyIG9mIGl0cyBvd24gYW5kIGlzIHJlLWV4cG9ydGVkLCBzbyBubyBpbXBvcnRlciBtb3ZlZDogdGhlIHBhdGggY29kZWNcbiAqIChgcGF0aHMudHNgKSwgc3RydWN0dXJhbCBlcXVhbGl0eSAoYGVxdWFsaXR5LnRzYCkgYW5kIHRoZSB1bmlvbiBtZXJnZVxuICogKGBtZXJnZS50c2ApIGF0IEwwLCBhbmQgdGhlIHZlcmIgbGF3IChgdmVyYnMudHNgKSBhdCBMMSDigJQgYGFwcGx5U21hcnRNZXJnZWAsXG4gKiBgbmV4dEdlbmVyYXRpb25gLCBgYXBwbHlTbWFydE1lcmdlSW50b2AsIGBkcnlGb2xkYCwgYHN1cGVyc2VkZWRCeU5leHRTZXRgLlxuICogVGhlIGxvZydzIHNjcnViLCBgcmVkYWN0UGF0Y2hgLCBtb3ZlZCBvdXQgaW4gOS4zMy4wOyBpdCBpcyB0aGUgcmVjb3JkJ3Mgb3duLCBgc2NydWIudHNgIChDNCkuXG4gKiBUaGUgd3JpdGVycyB0YWtlIGFuIEFERFJFU1MsIGEgcGF0aCBwcmVmaXggdGhlaXIgY2FsbGVyIGNvbXB1dGVkLCBhbmQgbmV2ZXJcbiAqIG5hbWUgb25lIChDMjogdGhlIGVuZ2luZSBkZWNpZGVzIHdoZXJlIGEgc3RhZ2Ugd3JpdGVzLCBgcnVuQWRkcmVzcy50cyDCtyBydW5BZGRyZXNzYCkuXG4gKiBaZXJvIGV4dGVybmFsIGRlcGVuZGVuY2llcy5cbiAqL1xuXG5pbXBvcnQgeyBuYXRpdmVHZXQgYXMgX2dldCwgbmF0aXZlSGFzIGFzIF9oYXMsIG5hdGl2ZVNldCBhcyBfc2V0IH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IERFTElNIH0gZnJvbSAnLi9wYXRocy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeVBhdGNoIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmV4cG9ydCB7IGRlZXBFcXVhbCB9IGZyb20gJy4vZXF1YWxpdHkuanMnO1xuZXhwb3J0IHsgZGVlcFNtYXJ0TWVyZ2UgfSBmcm9tICcuL21lcmdlLmpzJztcbmV4cG9ydCB7IERFTElNLCBub3JtYWxpc2VQYXRoLCBwYXRoU2VnbWVudHMgfSBmcm9tICcuL3BhdGhzLmpzJztcbmV4cG9ydCB7IGFwcGx5U21hcnRNZXJnZSwgYXBwbHlTbWFydE1lcmdlSW50bywgZHJ5Rm9sZCwgbmV4dEdlbmVyYXRpb24sIHN1cGVyc2VkZWRCeU5leHRTZXQgfSBmcm9tICcuL3ZlcmJzLmpzJztcblxudHlwZSBOZXN0ZWRPYmplY3QgPSB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuXG4vKipcbiAqIFRoZSB0d28gcGxhY2VzIGEgdmFsdWUgYXQgYHBhdGhgIGNhbiBzaXQ6IHVuZGVyIGBhZGRyZXNzYCAoYHJ1blBhdGhgLCBhYnNlbnRcbiAqIGZvciB0aGUgcm9vdCBhZGRyZXNzIGBbXWApIGFuZCBhdCB0aGUgcm9vdCAoYGdsb2JhbFBhdGhgKS4gYGFkZHJlc3NgIGlzIGFcbiAqIHBhdGggcHJlZml4IHRoZSBjYWxsZXIgY29tcHV0ZWQg4oCUIGZvciB0aGUgZW5naW5lLCBhIGZyYW1lJ3MgcnVuIG5hbWVzcGFjZVxuICogKGBydW5BZGRyZXNzLnRzIMK3IHJ1bkFkZHJlc3NgLCBDMiksIGhlbGQgYnkgaXRzIHJlY29yZCBmcmFtZSAoYFJlY29yZEZyYW1lIMK3IGFkZHJlc3NgLCBDMykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSdW5BbmRHbG9iYWxQYXRocyhhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSA9IFtdLCBwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW10pIHtcbiAgcmV0dXJuIHtcbiAgICBydW5QYXRoOiBhZGRyZXNzT2YoYWRkcmVzcykubGVuZ3RoID4gMCA/IHBhdGhVbmRlcihhZGRyZXNzLCBwYXRoKSA6IHVuZGVmaW5lZCxcbiAgICBnbG9iYWxQYXRoOiBbLi4ucGF0aF0sXG4gIH07XG59XG5cbi8qKiBBbiBhZGRyZXNzIGlzIGFuIGFycmF5LiBBIHJ1biBpZCBzdGlsbCBwYXNzZWQgaW4gaXRzIHBsYWNlIChDMikgaXMgcmVmdXNlZCwgbmV2ZXIgc3ByZWFkIGludG8gaXRzIGNoYXJhY3RlcnMuICovXG5mdW5jdGlvbiBhZGRyZXNzT2YoYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10pOiByZWFkb25seSBzdHJpbmdbXSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFkZHJlc3MpKSByZXR1cm4gYWRkcmVzcztcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICBgZm9vdHByaW50anM6IGFuIGFkZHJlc3MgaXMgYW4gYXJyYXkgcGF0aCBwcmVmaXgsIGdvdCAke2FkZHJlc3MgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgYWRkcmVzc31gLFxuICApO1xufVxuXG4vKipcbiAqIGBhZGRyZXNzYCB0aGVuIGBwYXRoYCwgYXMgb25lIG5ldyBhcnJheS4gQW4gaW5kZXggbG9vcCwgYmVjYXVzZSB0aGUgZG91YmxlXG4gKiBzcHJlYWQgYFsuLi5hZGRyZXNzLCAuLi5wYXRoXWAgY29zdHMgdHdpY2UgYXMgbXVjaCBhbmQgYSBmcmFtZSBidWlsZHMgb25lIG9uXG4gKiBldmVyeSByZWFkIGl0IHNlcnZlcyBmcm9tIGxpdmUgc3RhdGUgKGEgZm9yayBjaGlsZCByZWFkaW5nIGEgcm9vdCBrZXkpLlxuICovXG5mdW5jdGlvbiBwYXRoVW5kZXIoYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sIHBhdGg6IHJlYWRvbmx5IChzdHJpbmcgfCBudW1iZXIpW10pOiAoc3RyaW5nIHwgbnVtYmVyKVtdIHtcbiAgY29uc3Qgb3V0ID0gbmV3IEFycmF5PHN0cmluZyB8IG51bWJlcj4oYWRkcmVzcy5sZW5ndGggKyBwYXRoLmxlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYWRkcmVzcy5sZW5ndGg7IGkrKykgb3V0W2ldID0gYWRkcmVzc1tpXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSBvdXRbYWRkcmVzcy5sZW5ndGggKyBpXSA9IHBhdGhbaV07XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogVGhlIGNvbnRhaW5lciBhdCBgYWRkcmVzc2AgKyBgcGF0aGAgaW5zaWRlIGBvYmpgLCBlYWNoIG1pc3Npbmcgb25lIGNyZWF0ZWRcbiAqIG9uIHRoZSB3YXk6IHRoZSBvbmUgQVQgdGhlIGFkZHJlc3MgZnJvbSBgZGVmYXVsdFZhbHVlc2Agd2hlbiBnaXZlbiwgZXZlcnlcbiAqIG90aGVyIG9uZSBlbXB0eS4gVGhlIG9uZSB3YWxrIGJvdGggbmVzdGVkIHdyaXRlcnMgc2hhcmUuXG4gKi9cbmZ1bmN0aW9uIGNvbnRhaW5lckF0KFxuICBvYmo6IE5lc3RlZE9iamVjdCxcbiAgYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSxcbiAgcGF0aDogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXSA9IFtdLFxuICBkZWZhdWx0VmFsdWVzPzogdW5rbm93bixcbik6IE5lc3RlZE9iamVjdCB7XG4gIGNvbnN0IHNlZ21lbnRzID0gcGF0aFVuZGVyKGFkZHJlc3NPZihhZGRyZXNzKSwgcGF0aCk7XG4gIGxldCBjdXJyZW50ID0gb2JqO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZ21lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qga2V5ID0gc2VnbWVudHNbaV07XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY3VycmVudCwga2V5KSkge1xuICAgICAgY3VycmVudFtrZXldID0gaSA9PT0gYWRkcmVzcy5sZW5ndGggLSAxICYmIGRlZmF1bHRWYWx1ZXMgPyBkZWZhdWx0VmFsdWVzIDoge307XG4gICAgfVxuICAgIGN1cnJlbnQgPSBjdXJyZW50W2tleV07XG4gIH1cbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG5cbi8qKlxuICogU2V0cyBhIHZhbHVlIGF0IGEgbmVzdGVkIHBhdGggdW5kZXIgYGFkZHJlc3NgLCBjcmVhdGluZyBpbnRlcm1lZGlhdGUgb2JqZWN0cyBhcyBuZWVkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXROZXN0ZWRWYWx1ZTxUPihcbiAgb2JqOiBOZXN0ZWRPYmplY3QsXG4gIGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBwYXRoOiBzdHJpbmdbXSxcbiAgZmllbGQ6IHN0cmluZyxcbiAgdmFsdWU6IFQsXG4gIGRlZmF1bHRWYWx1ZXM/OiB1bmtub3duLFxuKTogTmVzdGVkT2JqZWN0IHtcbiAgY29udGFpbmVyQXQob2JqLCBhZGRyZXNzLCBwYXRoLCBkZWZhdWx0VmFsdWVzKVtmaWVsZF0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBEZWVwLW1lcmdlcyBhIHZhbHVlIGludG8gdGhlIG9iamVjdCBhdCBhIG5lc3RlZCBwYXRoIHVuZGVyIGBhZGRyZXNzYC5cbiAqIC0gQXJyYXlzOiBjb25jYXRlbmF0ZVxuICogLSBPYmplY3RzOiBzaGFsbG93IG1lcmdlIGF0IGVhY2ggbGV2ZWxcbiAqIC0gUHJpbWl0aXZlczogcmVwbGFjZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlTmVzdGVkVmFsdWU8VD4oXG4gIG9iajogYW55LFxuICBhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgcGF0aDogKHN0cmluZyB8IG51bWJlcilbXSxcbiAgZmllbGQ6IHN0cmluZyB8IG51bWJlcixcbiAgdmFsdWU6IFQsXG4gIGRlZmF1bHRWYWx1ZXM/OiB1bmtub3duLFxuKTogYW55IHtcbiAgdXBkYXRlVmFsdWUoY29udGFpbmVyQXQob2JqLCBhZGRyZXNzLCBwYXRoLCBkZWZhdWx0VmFsdWVzKSwgZmllbGQsIHZhbHVlKTtcbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqXG4gKiBJbi1wbGFjZSB2YWx1ZSB1cGRhdGUgd2l0aCBtZXJnZSBzZW1hbnRpY3MuXG4gKiAtIEFycmF5cyAobm9uLWVtcHR5KTogY29uY2F0ZW5hdGUgb250byBleGlzdGluZ1xuICogLSBBcnJheXMgKGVtcHR5KTogICAgIGRpcmVjdCByZXBsYWNlIOKAlCB3cml0aW5nIGBbXWAgY2xlYXJzIHRoZSBmaWVsZFxuICogLSBPYmplY3RzIChub24tZW1wdHkpOiBzaGFsbG93IG1lcmdlIChzcHJlYWQpXG4gKiAtIE9iamVjdHMgKGVtcHR5KTogICAgZGlyZWN0IHJlcGxhY2Ug4oCUIHdyaXRpbmcgYHt9YCBjbGVhcnMgdGhlIGZpZWxkXG4gKiAtIFByaW1pdGl2ZXM6IGRpcmVjdCBhc3NpZ25tZW50XG4gKlxuICogTm90ZSBvbiBlbXB0eSBhcnJheXM6IGJvdGggYHZhbHVlICYmIEFycmF5LmlzQXJyYXkodmFsdWUpYCBhbmRcbiAqIGBBcnJheS5pc0FycmF5KHZhbHVlKWAgZXZhbHVhdGUgdGhlIHNhbWUgZm9yIGFycmF5cyDigJQgYFtdYCBpcyB0cnV0aHkgaW5cbiAqIEphdmFTY3JpcHQsIHNvIHRoZSBgJiZgIGd1YXJkIHdhcyBuZXZlciB0aGUgaXNzdWUuIFRoZSBhY3R1YWwgYnVnIHdhcyB0aGVcbiAqIGNvbmNhdCBwYXRoOiBgWy4uLmN1ciwgLi4uW11dYCBzaWxlbnRseSByZXR1cm5lZCBgY3VyYCB1bmNoYW5nZWQgd2hlbiBgdmFsdWVgXG4gKiB3YXMgYFtdYCwgbWFraW5nIGB1cGRhdGVWYWx1ZShvYmosICd0YWdzJywgW10pYCBhIG5vLW9wIGluc3RlYWQgb2YgYSBjbGVhci5cbiAqIFRoZSBmaXggaXMgdGhlIGV4cGxpY2l0IGB2YWx1ZS5sZW5ndGggPT09IDBgIGVhcmx5LXJldHVybiBicmFuY2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVWYWx1ZShvYmplY3Q6IGFueSwga2V5OiBzdHJpbmcgfCBudW1iZXIsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgb2JqZWN0W2tleV0gPSB2YWx1ZTsgLy8gY2xlYXI6IFtdIHJlcGxhY2VzIHdoYXRldmVyIHdhcyB0aGVyZVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjdXIgPSBvYmplY3Rba2V5XSBhcyBhbnk7XG4gICAgICBvYmplY3Rba2V5XSA9IGN1ciA9PT0gdW5kZWZpbmVkID8gdmFsdWUgOiBbLi4uY3VyLCAuLi52YWx1ZV07XG4gICAgfVxuICB9IGVsc2UgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCkge1xuICAgIGNvbnN0IGN1ciA9IG9iamVjdFtrZXldIGFzIGFueTtcbiAgICBvYmplY3Rba2V5XSA9IGN1ciA9PT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7IC4uLmN1ciwgLi4udmFsdWUgfTtcbiAgfSBlbHNlIHtcbiAgICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICB9XG59XG5cbi8qKlxuICogR2V0cyBhIHZhbHVlIGF0IGEgbmVzdGVkIHBhdGggd2l0aCBwcm90b3R5cGUtcG9sbHV0aW9uIHByb3RlY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXN0ZWRWYWx1ZShyb290OiBhbnksIHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIGZpZWxkPzogc3RyaW5nIHwgbnVtYmVyKTogYW55IHtcbiAgY29uc3Qgbm9kZSA9IHBhdGggJiYgcGF0aC5sZW5ndGggPiAwID8gX2dldChyb290LCBwYXRoKSA6IHJvb3Q7XG4gIGlmIChmaWVsZCA9PT0gdW5kZWZpbmVkIHx8IG5vZGUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG5vZGU7XG4gIGlmIChub2RlICE9PSBudWxsICYmIHR5cGVvZiBub2RlID09PSAnb2JqZWN0JyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobm9kZSwgZmllbGQpKSB7XG4gICAgcmV0dXJuIG5vZGVbZmllbGRdO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iXX0=
@@ -204,7 +204,7 @@ export declare function foldRows(out: any, updates: MemoryPatch, overwrite: Memo
204
204
  * value the replay writes is its own (`set` / `append` clone the recorded
205
205
  * value; the `merge` arm reads a detached copy of `updates`), so the result
206
206
  * shares no container with `base`, `updates` or `overwrite`. This is the
207
- * public (`footprintjs/advanced`) contract, unchanged by copy-on-write
207
+ * public (`footprintjs/trace`; also `/advanced` until 10.0.0) contract, unchanged by copy-on-write
208
208
  * (9.29.0) — byte-identical to 9.28.0 for every caller. The engine's own
209
209
  * commit does NOT come here: `SharedMemory.applyPatch` builds the next
210
210
  * generation with `nextGeneration`, which copies only the written
@@ -288,7 +288,7 @@ export function foldRows(out, updates, overwrite, rows, discipline) {
288
288
  * value the replay writes is its own (`set` / `append` clone the recorded
289
289
  * value; the `merge` arm reads a detached copy of `updates`), so the result
290
290
  * shares no container with `base`, `updates` or `overwrite`. This is the
291
- * public (`footprintjs/advanced`) contract, unchanged by copy-on-write
291
+ * public (`footprintjs/trace`; also `/advanced` until 10.0.0) contract, unchanged by copy-on-write
292
292
  * (9.29.0) — byte-identical to 9.28.0 for every caller. The engine's own
293
293
  * commit does NOT come here: `SharedMemory.applyPatch` builds the next
294
294
  * generation with `nextGeneration`, which copies only the written
@@ -424,4 +424,4 @@ export function foldKey(touches, segs, options = {}) {
424
424
  generations.keep(kept, keptBefore, nativeGet(state, segs));
425
425
  return nativeGet(state, segs);
426
426
  }
427
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyYnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS92ZXJicy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFJSCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM5RixPQUFPLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLFlBQVksQ0FBQztBQVFqRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxNQUFNLEdBQXNFO0lBQ2hGLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtJQUNqQyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7SUFDcEMsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO0lBQ3BDLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtDQUNyQyxDQUFDO0FBRUYsNERBQTREO0FBQzVELE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBb0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBVyxDQUFDLENBQUM7QUFFbkYseUZBQXlGO0FBQ3pGLE1BQU0sVUFBVSxNQUFNLENBQUMsS0FBYztJQUNuQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzFGLENBQUM7QUFF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UUFDRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hELGlFQUFpRTtRQUNqRSxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzdHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDakIsU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDaEMsSUFBSSxPQUFPO1lBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFDRCxJQUFJLElBQUksS0FBSyxDQUFDLENBQUM7UUFBRSxXQUFZLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzdFLE9BQU8sU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNoQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiB2ZXJicy50cyDigJQgVEhFIFZFUkIgTEFXIChMMSk6IHRoZSBvbmUgcGxhY2UgYSBjb21taXQgcm93IGJlY29tZXMgYSB2YWx1ZS5cbiAqXG4gKiBBIHJvdyBvZiBhIGNvbW1pdCBidW5kbGUncyBgdHJhY2VgIGNhcnJpZXMgb25lIG9mIGZvdXIgdmVyYnMg4oCUXG4gKiBgc2V0IHwgbWVyZ2UgfCBhcHBlbmQgfCBkZWxldGVgIOKAlCBhbmQgT05FIHN0ZXAgdHVybnMgaXQgaW50byBhIHZhbHVlOlxuICoge0BsaW5rIGFwcGx5VmVyYn0uIFN0YXRlIGlzIGEgbGVmdCBmb2xkIG9mIHRoYXQgc3RlcCAodGhlIGV2ZW50LXNvdXJjaW5nXG4gKiByZWR1Y2VyKToge0BsaW5rIGZvbGRSb3dzfSBmb2xkcyBvbmUgYnVuZGxlJ3Mgcm93cyBpbnRvIGEgc3RhdGUsIGFuZFxuICoge0BsaW5rIGZvbGRLZXl9IGZvbGRzIE9ORSBLRVkgYWNyb3NzIGEgbG9nIOKAlCBldmVyeSByb3cgdW5kZXIgdGhlIGtleSdzXG4gKiB0b3AtbGV2ZWwga2V5LCByZWFkIGF0IHRoZSBrZXkgKHRoZSB2YWx1ZSBydWxlLCBga2V5UGF0aHMudHNgKS4gRXZlcnkgcmVhZGVyXG4gKiBvZiB0aGUgbG9nIHJ1bnMgb25lIG9mIHRoZSB0d28g4oCUXG4gKlxuICogICAtIHRoZSBsaXZlIGNvbW1pdCBhbmQgdGhlIHJlZGFjdGVkIG1pcnJvciAoYG5leHRHZW5lcmF0aW9uYCksXG4gKiAgIC0gdGhlIHB1YmxpYyByZXBsYXkgKGBhcHBseVNtYXJ0TWVyZ2VgKSwgdGhlIHJlYWQtc2lkZSBmb2xkc1xuICogICAgIChgYXBwbHlTbWFydE1lcmdlSW50b2Ag4oCUIGBFdmVudExvZy5tYXRlcmlhbGlzZWAsIGBzdGF0ZUF0YCkgYW5kIHRoZVxuICogICAgIGFkbWl0dGVkIHJlY29yZCdzIGNvbXBhcmlzb24gKGBkcnlGb2xkYCk6IGFsbCB7QGxpbmsgZm9sZFJvd3N9LFxuICogICAtIGBjb21taXRWYWx1ZUF0YCwgYW5kIGBhcnJheVByb3ZlbmFuY2VgIGFzIGFuIE9CU0VSVkVSIG9mIHRoZSBzYW1lIGZvbGQ6XG4gKiAgICAge0BsaW5rIGZvbGRLZXl9LlxuICpcbiAqIFRocmVlIHF1ZXN0aW9ucyB0aGF0IHVzZWQgdG8gYmUgYW5zd2VyZWQgb25jZSBwZXIgcmVhZGVyIGFyZSBhbnN3ZXJlZCBoZXJlXG4gKiBvbmNlOiB3aGF0IGEgdmVyYiBkb2VzIHRvIHRoZSB2YWx1ZSBiZWZvcmUgaXQgKHtAbGluayBhcHBseVZlcmJ9KSwgaG93IHRoZVxuICogcmVzdWx0IGlzIHBsYWNlZCAoe0BsaW5rIHBsYWNlVmVyYn0pLCBhbmQgaG93IHRoZSBsb2cncyBvd24gdmFsdWVzIGFyZVxuICogdHJlYXRlZCBvbiB0aGUgd2F5IGluICh0aGUgY2xvbmUgZGlzY2lwbGluZSDigJQgYSBQQVJBTUVURVIgb2YgdGhlIGZvbGQsIHNlZVxuICoge0BsaW5rIERpc2NpcGxpbmV9IGFuZCB7QGxpbmsgUmVjb3JkZWRQYXlsb2FkfSkuIEEgbmV3IHZlcmIgaXMgb25lIG5ldyBhcm0gb2ZcbiAqIGBhcHBseVZlcmJgIGFuZCBvbmUgcm93IG9mIHRoZSB0cmFpdHMgdGFibGU7IHRoZSBjb21waWxlciByZWZ1c2VzIGVpdGhlclxuICogbWlzc2luZyAoe0BsaW5rIGlzVG90YWx9LCB7QGxpbmsgcmVjb3Jkc1RhaWx9LCB7QGxpbmsgVkVSQlN9KS5cbiAqXG4gKiBBbiBVTktOT1dOIHZlcmIgaXMgcmVmdXNlZCB3aXRoIHtAbGluayBVbmtub3duVmVyYkVycm9yfSwgbmV2ZXIgZm9sZGVkIGFzIGFcbiAqIGBtZXJnZWAgKHRoZSBvbGQgc2lsZW50IGRlZmF1bHQpLiBFbmdpbmUtd3JpdHRlbiBsb2dzIGNhcnJ5IHRoZSBmb3VyLCBzb1xuICogZXZlcnkgZW5naW5lIHJ1biBmb2xkcyBieXRlLWZvci1ieXRlIGFzIGJlZm9yZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvbW1pdElkeCB9IGZyb20gJy4uL2lkcy9ydW50aW1lU3RhZ2VJZC5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhdGhSZWxhdGlvbiB9IGZyb20gJy4va2V5UGF0aHMuanMnO1xuaW1wb3J0IHsgZGVlcFNtYXJ0TWVyZ2UgfSBmcm9tICcuL21lcmdlLmpzJztcbmltcG9ydCB7IG5hdGl2ZURlbGV0ZSwgbmF0aXZlR2V0LCBuYXRpdmVTZXQsIG93biwgb3duZWRSb290T2YsIG93blNwaW5lIH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IERFTElNLCBwYXRoU2VnbWVudHMgfSBmcm9tICcuL3BhdGhzLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0QnVuZGxlLCBNZW1vcnlQYXRjaCwgVHJhY2VFbnRyeSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vLyDilIDilIDilIAgVGhlIHZvY2FidWxhcnkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBBIGNvbW1pdCByb3cncyB2ZXJiIOKAlCBgVHJhY2VFbnRyeVsndmVyYiddYCwgdGhlIHVuaW9uIHRoZSB0eXBlcyBmaWxlIGRlY2xhcmVzLiAqL1xuZXhwb3J0IHR5cGUgVmVyYiA9IFRyYWNlRW50cnlbJ3ZlcmInXTtcblxuLyoqXG4gKiBUaGUgdm9jYWJ1bGFyeTogZWFjaCB2ZXJiIHdpdGggdGhlIHR3byB0cmFpdHMgcmVhZGVycyBicmFuY2ggb24sIGluIHRoZVxuICogb3JkZXIgdGhlIGNvbnRyYWN0IG5hbWVzIHRoZW0uIEEgYFJlY29yZGAgb3ZlciB0aGUgdW5pb24g4oCUIHRoZSBjb21waWxlclxuICogcmVmdXNlcyBhIHRhYmxlIHRoYXQgbWlzc2VzIChvciBpbnZlbnRzKSBhIHZlcmIsIHNvIGEgdmVyYiBjYW5ub3QgYmUgYWRkZWRcbiAqIHdpdGhvdXQgc2F5aW5nIHdoYXQgaXQgaXMuXG4gKlxuICogICBgdG90YWxgIOKAlCB0aGUgcm93IGRlY2lkZXMgdGhlIHZhbHVlIEFMT05FOyBpdCByZWFkcyBub3RoaW5nIGZyb20gd2hhdCBjYW1lXG4gKiAgICAgYmVmb3JlIGl0ICh7QGxpbmsgaXNUb3RhbH0pLlxuICogICBgdGFpbGAgIOKAlCB0aGUgcm93IHJlY29yZHMgT05MWSB3aGF0IGl0IGFkZHMsIG5vdCB0aGUgd2hvbGUgdmFsdWVcbiAqICAgICAoe0BsaW5rIHJlY29yZHNUYWlsfSkuXG4gKi9cbmNvbnN0IFRSQUlUUzogUmVjb3JkPFZlcmIsIHsgcmVhZG9ubHkgdG90YWw6IGJvb2xlYW47IHJlYWRvbmx5IHRhaWw6IGJvb2xlYW4gfT4gPSB7XG4gIHNldDogeyB0b3RhbDogdHJ1ZSwgdGFpbDogZmFsc2UgfSxcbiAgbWVyZ2U6IHsgdG90YWw6IGZhbHNlLCB0YWlsOiBmYWxzZSB9LFxuICBhcHBlbmQ6IHsgdG90YWw6IGZhbHNlLCB0YWlsOiB0cnVlIH0sXG4gIGRlbGV0ZTogeyB0b3RhbDogdHJ1ZSwgdGFpbDogZmFsc2UgfSxcbn07XG5cbi8qKiBUaGUgZm91ciB2ZXJicywgaW4gdGhlIG9yZGVyIHRoZSBjb250cmFjdCBuYW1lcyB0aGVtLiAqL1xuZXhwb3J0IGNvbnN0IFZFUkJTOiByZWFkb25seSBWZXJiW10gPSBPYmplY3QuZnJlZXplKE9iamVjdC5rZXlzKFRSQUlUUykgYXMgVmVyYltdKTtcblxuLyoqIElzIGB2YWx1ZWAgb25lIG9mIHRoZSBmb3VyPyBUaGUgcXVlc3Rpb24gZXZlcnkgcmVhZGVyIG9mIGEgZm9yZWlnbiBsb2cgYXNrcyBmaXJzdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZlcmIodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBWZXJiIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFRSQUlUUywgdmFsdWUpO1xufVxuXG4vKipcbiAqIERvZXMgdGhlIHZlcmIgZGVjaWRlIHRoZSB2YWx1ZSBBTE9ORSDigJQgcmVhZCBub3RoaW5nIGZyb20gd2hhdCBjYW1lIGJlZm9yZVxuICogaXQ/IGBzZXRgIGFuZCBgZGVsZXRlYC4gQSByZWFkZXIgdGhhdCBvbmx5IG5lZWRzIHRoZSBmaW5hbCB2YWx1ZSBtYXkgc3RhcnRcbiAqIGF0IHRoZSBsYXN0IHN1Y2ggcm93ICh7QGxpbmsgZm9sZEtleX0gYGFuY2hvcmVkYCk7IG9uZSB0aGF0IHRyYWNrcyBob3cgdGhlXG4gKiB2YWx1ZSBncmV3IChwcm92ZW5hbmNlKSBzdGFydHMgYXQgdGhlIGZpcnN0LiBQaW5uZWQgYWdhaW5zdFxuICoge0BsaW5rIGFwcGx5VmVyYn0gaXRzZWxmLCBzbyBhIG5ldyB2ZXJiIGNhbm5vdCBtaXNyZXBvcnQgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1RvdGFsKHZlcmI6IFZlcmIpOiBib29sZWFuIHtcbiAgcmV0dXJuIFRSQUlUU1t2ZXJiXS50b3RhbDtcbn1cblxuLyoqXG4gKiBEb2VzIHRoZSByb3cgcmVjb3JkIE9OTFkgd2hhdCBpdCBhZGRzIOKAlCBhIHRhaWwg4oCUIHJhdGhlciB0aGFuIHRoZSB3aG9sZVxuICogdmFsdWU/IGBhcHBlbmRgLiBXaGF0IHRoZSByb3cgYWRkZWQgaXMgdGhlbiBrbm93biBleGFjdGx5OiBhIHJlYWRlciB0aGF0XG4gKiB0cmFja3Mgd2hlcmUgYXJyYXkgZWxlbWVudHMgY2FtZSBmcm9tIGF0dHJpYnV0ZXMgdGhlbSB0byB0aGlzIHJvdyB3aXRob3V0XG4gKiBjb21wYXJpbmcgYXJyYXlzLCB3aGVyZSBldmVyeSBvdGhlciB2ZXJiIGhhcyB0byBiZSBpbmZlcnJlZCBmcm9tLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3Jkc1RhaWwodmVyYjogVmVyYik6IGJvb2xlYW4ge1xuICByZXR1cm4gVFJBSVRTW3ZlcmJdLnRhaWw7XG59XG5cbi8qKiBXaGVyZSBpbiBhIGxvZyBhIHJlZnVzZWQgcm93IHNpdHMuICovXG5leHBvcnQgaW50ZXJmYWNlIFJvd1NpdGUge1xuICAvKiogVGhlIHJvdydzIGBwYXRoYCwgREVMSU0tam9pbmVkIGFzIHRoZSB0cmFjZSByZWNvcmRzIGl0LiAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG4gIC8qKiBUaGUgcm93J3MgcG9zaXRpb24gaW4gaXRzIGJ1bmRsZSdzIGB0cmFjZWAuICovXG4gIHJlYWRvbmx5IHJvdzogbnVtYmVyO1xuICAvKiogVGhlIGJ1bmRsZSdzIHBvc2l0aW9uIGluIHRoZSBjb21taXQgbG9nLCB3aGVuIHRoZSByZWFkZXIga25vd3MgaXQuICovXG4gIHJlYWRvbmx5IGNvbW1pdD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaHJvd24gYnkgdGhlIHJlYWRlcnMgb2YgYSBjb21taXQgbG9nIOKAlCB7QGxpbmsgZm9sZFJvd3N9IChiZWhpbmRcbiAqIGBhcHBseVNtYXJ0TWVyZ2VgKSwgYGNvbW1pdFZhbHVlQXRgLCBgYXJyYXlQcm92ZW5hbmNlYCDigJQgd2hlbiBhIHJvdyBjYXJyaWVzIGFcbiAqIHZlcmIgb3V0c2lkZSB7QGxpbmsgVkVSQlN9OiBhIGZvcmVpZ24gb3IgY29ycnVwdGVkIGxvZyBmYWlscyBsb3VkbHkgaW5zdGVhZFxuICogb2YgYmVpbmcgcmVwbGF5ZWQgYXMgYSBgbWVyZ2VgLiBgdmVyYmAsIGBwYXRoYCwgYHJvd2AgYW5kIGBjb21taXRgIG5hbWUgdGhlXG4gKiByb3cgKGBwYXRoYCAvIGByb3dgIC8gYGNvbW1pdGAgYXJlIGFic2VudCB3aGVuIHRoZSBjYWxsZXIgaGFuZGVkIG92ZXIgYVxuICogYmFyZSB2ZXJiKTsgYHBhdGhgIGlzIHRoZSB0cmFjZSdzIG93biBERUxJTS1qb2luZWQgZm9ybSDigJQgdGFrZSBpdCBhcGFydCB3aXRoXG4gKiBgcGF0aFNlZ21lbnRzYC4gVGhlIG1lc3NhZ2UgcXVvdGVzIGB2ZXJiYCBhbmQgYHBhdGhgLCBzbyBhIGhvc3RpbGUgbG9nIGNhbm5vdFxuICogcmVzaGFwZSBpdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFVua25vd25WZXJiRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IHZlcmI6IHVua25vd247XG4gIHJlYWRvbmx5IHBhdGg/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJvdz86IG51bWJlcjtcbiAgcmVhZG9ubHkgY29tbWl0PzogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHZlcmI6IHVua25vd24sIHNpdGU/OiBSb3dTaXRlKSB7XG4gICAgY29uc3QgbmFtZWQgPVxuICAgICAgdHlwZW9mIHZlcmIgPT09ICdzdHJpbmcnID8gSlNPTi5zdHJpbmdpZnkodmVyYikgOiB2ZXJiID09PSB1bmRlZmluZWQgPyAndW5kZWZpbmVkJyA6IGBvZiB0eXBlICR7dHlwZW9mIHZlcmJ9YDtcbiAgICAvLyBUaGUgdmVyYiBhbmQgdGhlIHBhdGggY29tZSBmcm9tIGEgbG9nIG5vYm9keSB2ZXR0ZWQ6IHF1b3RlZCAoSlNPTiksIHNvIGFcbiAgICAvLyBjb250cm9sIGNoYXJhY3RlciBpbiBlaXRoZXIgY2Fubm90IHJlc2hhcGUgdGhlIG1lc3NhZ2UuXG4gICAgY29uc3Qgd2hlcmUgPVxuICAgICAgc2l0ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gJydcbiAgICAgICAgOiBgIG9uIHRyYWNlIHJvdyAke3NpdGUucm93fSAocGF0aCAke0pTT04uc3RyaW5naWZ5KHBhdGhTZWdtZW50cyhzaXRlLnBhdGgpLmpvaW4oJyDigLogJykpfSR7XG4gICAgICAgICAgICBzaXRlLmNvbW1pdCA9PT0gdW5kZWZpbmVkID8gJycgOiBgLCBjb21taXQgJHtzaXRlLmNvbW1pdH1gXG4gICAgICAgICAgfSlgO1xuICAgIGNvbnN0IG9uZSA9IFZFUkJTLmpvaW4oJyB8ICcpO1xuICAgIHN1cGVyKGB1bmtub3duIHZlcmIgJHtuYW1lZH0ke3doZXJlfTogYSBjb21taXQgcm93IGlzIG9uZSBvZiAke29uZX0g4oCUIHRoZSBsb2cgaXMgcmVmdXNlZCwgbm90IHJlcGxheWVkIGFzIGEgbWVyZ2VgKTtcbiAgICB0aGlzLm5hbWUgPSAnVW5rbm93blZlcmJFcnJvcic7XG4gICAgdGhpcy52ZXJiID0gdmVyYjtcbiAgICBpZiAoc2l0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnBhdGggPSBzaXRlLnBhdGg7XG4gICAgICB0aGlzLnJvdyA9IHNpdGUucm93O1xuICAgICAgaWYgKHNpdGUuY29tbWl0ICE9PSB1bmRlZmluZWQpIHRoaXMuY29tbWl0ID0gc2l0ZS5jb21taXQ7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlZnVzZVZlcmIodmVyYjogbmV2ZXIpOiBuZXZlciB7XG4gIHRocm93IG5ldyBVbmtub3duVmVyYkVycm9yKHZlcmIpO1xufVxuXG4vLyDilIDilIDilIAgVGhlIHN0ZXAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogV2hhdCBhIGBkZWxldGVgIHJvdyBsZWF2ZXMgYmVoaW5kOiB0aGUgS0VZIElTIEdPTkUg4oCUIHdoaWNoIGlzIG5vdCB0aGUgdmFsdWVcbiAqIGB1bmRlZmluZWRgIChhIHJvb3QgcmVwbGF5IHJlbW92ZXMgdGhlIGtleTsgYSBwZXItcGF0aCBmb2xkIHJlYWRzIGl0IGFzXG4gKiBgdW5kZWZpbmVkYCkuIHtAbGluayBhcHBseVZlcmJ9IHJldHVybnMgaXQsIHtAbGluayBwbGFjZVZlcmJ9IGFjdHMgb24gaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBBQlNFTlQ6IHVuaXF1ZSBzeW1ib2wgPSBTeW1ib2woJ2Zvb3RwcmludGpzLnZlcmJzLmFic2VudCcpO1xuXG4vKipcbiAqIE9uZSBidW5kbGUncyByZWNvcmRlZCBwYXlsb2FkLCByZWFkIGJ5IHBhdGggdW5kZXIgYSBjbG9uZSBkaXNjaXBsaW5lIOKAlCB0aGVcbiAqIHZhbHVlcyB7QGxpbmsgYXBwbHlWZXJifSByZWFkcyBvdXQgb2YgdGhlIGxvZy5cbiAqXG4gKiBgZGV0YWNoYCDigJQgYHRydWVgIGZvciBldmVyeSBmb2xkIHRoYXQga2VlcHMgaXRzIHJlc3VsdDogYSBgc2V0YCB2YWx1ZSBvciBhblxuICogYGFwcGVuZGAgdGFpbCBpcyBhIGNsb25lIG9mIHdoYXQgdGhlIGxvZyBob2xkcyBhbmQgdGhlIG1lcmdlIGRlbHRhIGNvbWVzIGZyb21cbiAqIE9ORSBkZXRhY2hlZCBjb3B5IG9mIGB1cGRhdGVzYCwgc28gdGhlIHJlc3VsdCBuZXZlciBhbGlhc2VzIHRoZSBsb2cuIGBmYWxzZWBcbiAqIG9ubHkgZm9yIHRoZSBjb21wYXJpc29uIGZvbGQgKHtAbGluayBkcnlGb2xkfSksIHdoaWNoIHBsYWNlcyByZWNvcmRlZCB2YWx1ZXNcbiAqIGFzIHJlY29yZGVkIGFuZCBkcm9wcyBpdHMgcmVzdWx0LlxuICpcbiAqIFRoZSBkZWx0YSBpcyBkZXRhY2hlZCBPTkNFIHBlciBidW5kbGUsIGxhemlseSDigJQgYSBidW5kbGUgd2l0aCBubyBgbWVyZ2VgIHJvd1xuICogcGF5cyBub3RoaW5nLiBgZGVlcFNtYXJ0TWVyZ2VgIGRlZHVwcyBhbiBhcnJheSB1bmlvbiBCWSBSRUZFUkVOQ0UgYW5kIHR3b1xuICogYG1lcmdlYCByb3dzIG9mIG9uZSBidW5kbGUgcmVwbGF5IHRoZSBzYW1lIGFjY3VtdWxhdGVkIGRlbHRhLCBzbyB0aGUgcm93c1xuICogbXVzdCBrZWVwIHNlZWluZyB0aGUgc2FtZSBvYmplY3RzOyBhIGNsb25lIHBlciByb3cgZHVwbGljYXRlZCB0aGVpciBlbGVtZW50c1xuICogKHRoZSBkaWZmZXJlbnRpYWwgY2F1Z2h0IGl0IGluIHRoZSByZXBsYXk7IGBjb21taXRWYWx1ZUF0YCBjYXJyaWVkIHRoZSBidWdcbiAqIHVudGlsIGl0IGZvbGRlZCB0aHJvdWdoIGhlcmUpLiBgb25seWAgbmFycm93cyB0aGUgY29weSB0byBPTkUgcGF0aCDigJQgYVxuICogcGVyLXBhdGggZm9sZCByZWFkcyBub3RoaW5nIGVsc2UsIGFuZCBtdXN0IG5vdCBwYXkgZm9yIHRoZSByZXN0IG9mIHRoZVxuICogYnVuZGxlLlxuICovXG5leHBvcnQgY2xhc3MgUmVjb3JkZWRQYXlsb2FkIHtcbiAgcHJpdmF0ZSBkZWx0YXM6IE1lbW9yeVBhdGNoIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlczogTWVtb3J5UGF0Y2gsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGV0YWNoOiBib29sZWFuLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb25seT86IHN0cmluZ1tdLFxuICApIHt9XG5cbiAgLyoqIFdoYXQgYSBgc2V0YCBwbGFjZXMgYW5kIGFuIGBhcHBlbmRgIGFkZHM6IGBvdmVyd3JpdGVbcGF0aF1gLCBjbG9uZWQgd2hlbiBkZXRhY2hpbmcuICovXG4gIHZhbHVlKHNlZ3M6IHN0cmluZ1tdKTogdW5rbm93biB7XG4gICAgY29uc3QgcmVjb3JkZWQgPSBuYXRpdmVHZXQodGhpcy5vdmVyd3JpdGUsIHNlZ3MpO1xuICAgIHJldHVybiB0aGlzLmRldGFjaCA/IHN0cnVjdHVyZWRDbG9uZShyZWNvcmRlZCkgOiByZWNvcmRlZDtcbiAgfVxuXG4gIC8qKiBUaGUgYWNjdW11bGF0ZWQgbWVyZ2UgZGVsdGEgYXQgYHBhdGhgOiBgdXBkYXRlc1twYXRoXWAsIGZyb20gdGhlIGJ1bmRsZSdzIG9uZSBjb3B5LiAqL1xuICBkZWx0YShzZWdzOiBzdHJpbmdbXSk6IHVua25vd24ge1xuICAgIGlmICh0aGlzLmRlbHRhcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLm9ubHkgPT09IHVuZGVmaW5lZCA/IHRoaXMudXBkYXRlcyA6IGF0UGF0aCh0aGlzLnVwZGF0ZXMsIHRoaXMub25seSk7XG4gICAgICB0aGlzLmRlbHRhcyA9IHRoaXMuZGV0YWNoID8gc3RydWN0dXJlZENsb25lKHNvdXJjZSkgOiBzb3VyY2U7XG4gICAgfVxuICAgIHJldHVybiBuYXRpdmVHZXQodGhpcy5kZWx0YXMsIHNlZ3MpO1xuICB9XG59XG5cbi8qKiBgdHJlZWAgcmVkdWNlZCB0byBPTkUgcGF0aDogdGhhdCBzdWItdHJlZSwgYnkgcmVmZXJlbmNlLCB1bmRlciBmcmVzaCBjb250YWluZXJzLiAqL1xuZnVuY3Rpb24gYXRQYXRoKHRyZWU6IE1lbW9yeVBhdGNoLCBzZWdzOiBzdHJpbmdbXSk6IE1lbW9yeVBhdGNoIHtcbiAgY29uc3QgbGVhZiA9IG5hdGl2ZUdldCh0cmVlLCBzZWdzKTtcbiAgcmV0dXJuIGxlYWYgPT09IHVuZGVmaW5lZCA/IHt9IDogbmF0aXZlU2V0KHt9LCBzZWdzLCBsZWFmKTtcbn1cblxuLyoqXG4gKiBPTkUgcm93LCBPTkUgc3RlcDogdGhlIHZhbHVlIGF0IHRoZSByb3cncyBwYXRoIEFGVEVSIHRoZSByb3csIGdpdmVuIHRoZVxuICogdmFsdWUgQkVGT1JFIGl0IGFuZCB0aGUgYnVuZGxlJ3MgcmVjb3JkZWQgcGF5bG9hZC4gVEhFIHZlcmIgbGF3IOKAlCBubyBvdGhlclxuICogZnVuY3Rpb24gaW4gdGhlIGxpYnJhcnkgaGFzIGFuIGFybSBwZXIgdmVyYi5cbiAqXG4gKiAgIC0gYCdzZXQnYCAgICDigJQgdGhlIHJlY29yZGVkIHZhbHVlIChgb3ZlcndyaXRlW3BhdGhdYCwgdGhlIGZ1bGwgZmluYWwgdmFsdWUpLlxuICogICAtIGAnbWVyZ2UnYCAg4oCUIGBkZWVwU21hcnRNZXJnZWAgb2YgdGhlIGFjY3VtdWxhdGVkIGB1cGRhdGVzW3BhdGhdYCBkZWx0YSBvbnRvXG4gKiAgICAgdGhlIHZhbHVlIGJlZm9yZS5cbiAqICAgLSBgJ2FwcGVuZCdgIOKAlCAoZGVsdGEgbW9kZSkgYG92ZXJ3cml0ZVtwYXRoXWAgaG9sZHMgT05MWSB0aGUgdGFpbDogY29uY2F0ZW5hdGVcbiAqICAgICBpdCBvbnRvIHRoZSB2YWx1ZSBiZWZvcmUuIFdoZW4gZWl0aGVyIGlzIG5vdCBhbiBhcnJheSAoYW4gb3V0LW9mLW9yZGVyXG4gKiAgICAgcmVwbGF5IGJhc2UsIG9yIGEgUkVEQUNURUQgdGFpbCDigJQgYHNjcnViUGF0Y2hgIHJlcGxhY2VzIG1hdGNoZWQgcGF5bG9hZHNcbiAqICAgICB3aXRoIHRoZSBgJ1JFREFDVEVEJ2Agc3RyaW5nKSB0aGUgdGFpbCBCRUNPTUVTIHRoZSB2YWx1ZSDigJQgdGhlIHNhbWVcbiAqICAgICB0ZXJtaW5hbCB2YWx1ZSBhIHJlZGFjdGVkIG9yIGNvcnJ1cHQgYHNldGAgcHJvZHVjZXMuXG4gKiAgIC0gYCdkZWxldGUnYCDigJQge0BsaW5rIEFCU0VOVH06IHRoZSBrZXkgaXMgcmVtb3ZlZC4gVGhlIHBhdGggc3RheXMgZW51bWVyYXRlZFxuICogICAgIGluIGBvdmVyd3JpdGVgICh2YWx1ZSBgdW5kZWZpbmVkYCkgZm9yIGtleS1zZXQgY29uc3VtZXJzOyB0aGUgc3RlcCBpZ25vcmVzXG4gKiAgICAgdGhhdCB2YWx1ZS5cbiAqXG4gKiBQdXJlOiBpdCByZWFkcyB0aGUgcGF5bG9hZCBhbmQgbmV2ZXIgd3JpdGVzLiBgdmVyYmAgbXVzdCBiZSBhIHtAbGluayBWZXJifVxuICogKHRoZSBmb2xkcyBjaGVjayB3aXRoIHtAbGluayBpc1ZlcmJ9IGZpcnN0IGFuZCBuYW1lIHRoZSByb3cpOyBhbnl0aGluZyBlbHNlXG4gKiB0aGF0IHJlYWNoZXMgaXQgaXMgcmVmdXNlZCB3aXRoIHtAbGluayBVbmtub3duVmVyYkVycm9yfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5VmVyYih2ZXJiOiBWZXJiLCBiZWZvcmU6IHVua25vd24sIGF0OiBSZWNvcmRlZFBheWxvYWQsIHNlZ3M6IHN0cmluZ1tdKTogdW5rbm93biB7XG4gIGlmICh2ZXJiID09PSAnc2V0JykgcmV0dXJuIGF0LnZhbHVlKHNlZ3MpO1xuICBpZiAodmVyYiA9PT0gJ2FwcGVuZCcpIHtcbiAgICBjb25zdCB0YWlsID0gYXQudmFsdWUoc2Vncyk7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYmVmb3JlKSAmJiBBcnJheS5pc0FycmF5KHRhaWwpID8gWy4uLmJlZm9yZSwgLi4udGFpbF0gOiB0YWlsO1xuICB9XG4gIGlmICh2ZXJiID09PSAnZGVsZXRlJykgcmV0dXJuIEFCU0VOVDtcbiAgaWYgKHZlcmIgPT09ICdtZXJnZScpIHJldHVybiBkZWVwU21hcnRNZXJnZShiZWZvcmUsIGF0LmRlbHRhKHNlZ3MpKTtcbiAgcmV0dXJuIHJlZnVzZVZlcmIodmVyYik7IC8vIGB2ZXJiYCBpcyBgbmV2ZXJgIGhlcmUg4oCUIGEgZmlmdGggdmVyYiBpbiB0aGUgdW5pb24gc3RvcHMgY29tcGlsaW5nXG59XG5cbi8qKiBQdXQgYSBzdGVwJ3MgdmFsdWUgYXQgaXRzIHBhdGggaW4gYG91dGAg4oCUIG9yIHJlbW92ZSB0aGUga2V5LCBmb3Ige0BsaW5rIEFCU0VOVH0uICovXG5leHBvcnQgZnVuY3Rpb24gcGxhY2VWZXJiKG91dDogYW55LCBzZWdzOiBzdHJpbmdbXSwgbmV4dDogdW5rbm93bik6IHZvaWQge1xuICBpZiAobmV4dCA9PT0gQUJTRU5UKSBuYXRpdmVEZWxldGUob3V0LCBzZWdzKTtcbiAgZWxzZSBuYXRpdmVTZXQob3V0LCBzZWdzLCBuZXh0KTtcbn1cblxuLyoqXG4gKiBJcyByb3cgYGlgIGEgYHNldGAgdGhhdCB0aGUgTkVYVCByb3cgc2V0cyBhZ2FpbiDigJQgc2FtZSBwYXRoLCBzYW1lIHZlcmIg4oCUIHNvXG4gKiB0aGF0IGFwcGx5aW5nIGl0IGlzIHdvcmsgdGhlIG5leHQgcm93IHJlZG9lcz9cbiAqXG4gKiBUaGUgb25lIHNraXAgZXZlcnkgcmVwbGF5IGl0ZXJhdG9yIHNoYXJlcyAoOS4yMi4xKS4gQSBgc2V0YCByb3cgd3JpdGVzIGFcbiAqIGNsb25lIG9mIHRoZSByZWNvcmRlZCB2YWx1ZSBhdCBpdHMgcGF0aDsgdGhlIG5leHQgcm93LCBhIGBzZXRgIG9mIHRoZSBzYW1lXG4gKiBwYXRoLCB3cml0ZXMgYSBjbG9uZSBvZiB0aGUgU0FNRSByZWNvcmRlZCB2YWx1ZSBvdmVyIGl0ICh0aGUgYnVuZGxlJ3MgcGF0Y2hcbiAqIHRyZWUgaXMgZml4ZWQpLCBhbmQgbm90aGluZyBydW5zIGluIGJldHdlZW4g4oCUIHNvIHRoZSBmaXJzdCB3cml0ZSBpc1xuICogdW5vYnNlcnZhYmxlLCBjb250YWluZXIgY3JlYXRpb24gYW5kIGtleSBvcmRlciBpbmNsdWRlZC4gT25seSBDT05TRUNVVElWRVxuICogcm93cyBxdWFsaWZ5OiBhIHJvdyBpbiBiZXR3ZWVuIChhbiBhbmNlc3RvciBgbWVyZ2VgLCBhIHNpYmxpbmcgYHNldGAgdGhhdFxuICogY3JlYXRlcyBhIGNvbnRhaW5lcikgY2FuIHNlZSB0aGUgaW50ZXJtZWRpYXRlIHZhbHVlLCBhbmQgYSBgbWVyZ2VgLFxuICogYGFwcGVuZGAgb3IgYGRlbGV0ZWAgbmV4dCByb3cgZGVwZW5kcyBvbiB3aGF0IGlzIHRoZXJlLiBSb3dzIGFyZSBuZXZlclxuICogZHJvcHBlZCBmcm9tIHRoZSBsb2cg4oCUIHRoZSA5LjIyLjAgZWxlbWVudC13cml0ZSBmdW5uZWwgcmVjb3JkcyBOXG4gKiB3aG9sZS1hcnJheSBgc2V0YCByb3dzIG9uIG9uZSBwYXRoLCBhbmQgdGhpcyBpcyB3aGF0IG1ha2VzIHJlcGxheWluZyB0aGVtXG4gKiBPKE4pIGluc3RlYWQgb2YgTyhOIMOXIHJvd3MpLlxuICpcbiAqIEFza2VkIGJ5IHtAbGluayBmb2xkUm93c30g4oCUIGxpdmUgc3RhdGUgYW5kIHRoZSByZWRhY3RlZCBtaXJyb3IgdGhyb3VnaFxuICoge0BsaW5rIG5leHRHZW5lcmF0aW9ufSwgYEV2ZW50TG9nLm1hdGVyaWFsaXNlYCBhbmQgYHN0YXRlQXRgIHRocm91Z2hcbiAqIHtAbGluayBhcHBseVNtYXJ0TWVyZ2VJbnRvfSwgdGhlIHB1YmxpYyB7QGxpbmsgYXBwbHlTbWFydE1lcmdlfSwgYW5kIHRoZVxuICogYWRtaXR0ZWQgcmVjb3JkJ3Mge0BsaW5rIGRyeUZvbGR9LiB7QGxpbmsgZm9sZEtleX0gbmVlZHMgbm8gc2tpcDogaXRcbiAqIGFuY2hvcnMgYXQgdGhlIHRvcC1sZXZlbCBrZXkncyBMQVNUIGBzZXRgL2BkZWxldGVgLCBvciAocHJvdmVuYW5jZSkgYVxuICogcmVwZWF0ZWQgYHNldGAgb2YgdGhlIG9uZSByZWNvcmRlZCB2YWx1ZSBjaGFuZ2VzIG5vIGJpcnRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VwZXJzZWRlZEJ5TmV4dFNldChyb3dzOiByZWFkb25seSB7IHBhdGg6IHN0cmluZzsgdmVyYjogc3RyaW5nIH1bXSwgaTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJvdyA9IHJvd3NbaV07XG4gIGlmIChyb3cudmVyYiAhPT0gJ3NldCcpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgbmV4dCA9IHJvd3NbaSArIDFdO1xuICByZXR1cm4gbmV4dCAhPT0gdW5kZWZpbmVkICYmIG5leHQudmVyYiA9PT0gJ3NldCcgJiYgbmV4dC5wYXRoID09PSByb3cucGF0aDtcbn1cblxuLy8g4pSA4pSA4pSAIFRoZSBmb2xkIG92ZXIgb25lIGJ1bmRsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBIb3cge0BsaW5rIGZvbGRSb3dzfSB0cmVhdHMgdGhlIHN0YXRlIGl0IGVkaXRzIGFuZCB0aGUgdmFsdWVzIGl0IHJlYWRzIG91dCBvZlxuICogdGhlIGxvZyDigJQgdGhlIGNsb25lIGRpc2NpcGxpbmUsIGEgcGFyYW1ldGVyIG9mIHRoZSBPTkUgbG9vcDpcbiAqXG4gKiAgIC0gYCdwcml2YXRlJ2Ag4oCUIGBvdXRgIGlzIGEgcHJpdmF0ZSBkZWVwIGNsb25lLCBlZGl0ZWQgaW4gcGxhY2U7IGV2ZXJ5XG4gKiAgICAgcmVjb3JkZWQgdmFsdWUgaXMgY2xvbmVkIGluLiBUaGUgcHVibGljIHtAbGluayBhcHBseVNtYXJ0TWVyZ2V9LlxuICogICAtIGAncGF0aENvcHknYCDigJQgY29weS1vbi13cml0ZSAoOS4yOS4wKTogYmVmb3JlIGEgcm93IHRoYXQgd3JpdGVzIFRIUk9VR0ggYVxuICogICAgIGNvbnRhaW5lciAoYSBuZXN0ZWQgcGF0aCksIHRoZSBjb250YWluZXJzIG9uIGl0cyBwYXRoIHRoYXQgdGhpcyBmb2xkIGRpZFxuICogICAgIG5vdCBjcmVhdGUgYXJlIGNvcGllZCwgc28gbm8gcm93IGVkaXRzIGEgY29udGFpbmVyIGFub3RoZXIgZ2VuZXJhdGlvblxuICogICAgIChvciB0aGUgbG9nKSBob2xkczsgZWFjaCB2YWx1ZSBhIHJvdyBjcmVhdGVzIGlzIG1hcmtlZCBvd25lZCwgc28gbGF0ZXJcbiAqICAgICByb3dzIG9mIHRoZSBidW5kbGUgd3JpdGUgaW50byBpdCBpbiBwbGFjZS4gRXZlcnkgcmVjb3JkZWQgdmFsdWUgaXMgY2xvbmVkXG4gKiAgICAgaW4uIFRoZSBsaXZlIGNvbW1pdCAoe0BsaW5rIG5leHRHZW5lcmF0aW9ufSkgYW5kIHRoZSByZWFkLXNpZGUgZm9sZHNcbiAqICAgICAoe0BsaW5rIGFwcGx5U21hcnRNZXJnZUludG99KS5cbiAqICAgLSBgJ2J5UmVmZXJlbmNlJ2Ag4oCUIGAncGF0aENvcHknYCwgYnV0IHJlY29yZGVkIHZhbHVlcyBhcmUgcGxhY2VkIEFTXG4gKiAgICAgUkVDT1JERUQgKG5vIGNsb25lKSBhbmQgbmV2ZXIgbWFya2VkIG93bmVkIOKAlCBhIGxhdGVyIHJvdyB0aGF0IHdyaXRlc1xuICogICAgIHRocm91Z2ggb25lIGNvcGllcyBpdCBmaXJzdCwgc28gdGhlIHBheWxvYWQgaXMgbmV2ZXIgZWRpdGVkLiBGb3JcbiAqICAgICBDT01QQVJJU09OIG9ubHkgKHtAbGluayBkcnlGb2xkfSk6IHRoZSByZXN1bHQgYWxpYXNlcyB0aGUgbG9nLlxuICovXG5leHBvcnQgdHlwZSBEaXNjaXBsaW5lID0gJ3ByaXZhdGUnIHwgJ3BhdGhDb3B5JyB8ICdieVJlZmVyZW5jZSc7XG5cbi8qKiBEb2VzIGFueSByb3cgd3JpdGUgVEhST1VHSCBhIGNvbnRhaW5lciAoYSBkZWxpbWl0ZWQsIG5lc3RlZCBwYXRoKT8gKi9cbmZ1bmN0aW9uIGhhc05lc3RlZFJvdyhyb3dzOiByZWFkb25seSBUcmFjZUVudHJ5W10pOiBib29sZWFuIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSBpZiAocm93c1tpXS5wYXRoLmluZGV4T2YoREVMSU0pICE9PSAtMSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBGb2xkIG9uZSBidW5kbGUncyByb3dzIGludG8gYG91dGAsIGluIHBsYWNlOiBmb3IgZWFjaCByb3cgKGEgYHNldGAgdGhlIG5leHRcbiAqIHJvdyBzZXRzIGFnYWluIGlzIHNraXBwZWQg4oCUIHtAbGluayBzdXBlcnNlZGVkQnlOZXh0U2V0fSkgdGFrZSB0aGUgc3RlcFxuICogKHtAbGluayBhcHBseVZlcmJ9KSBhbmQgcHV0IGl0cyB2YWx1ZSB3aGVyZSBpdCBiZWxvbmdzICh7QGxpbmsgcGxhY2VWZXJifSkuXG4gKiBgb3V0YCBpcyB0aGUgY2FsbGVyJ3Mg4oCUIHNlZSB7QGxpbmsgRGlzY2lwbGluZX0gZm9yIHdoYXQgaXQgbXVzdCBiZS5cbiAqXG4gKiBBIHJvdyB3aG9zZSB2ZXJiIGlzIG5vdCBvbmUgb2Yge0BsaW5rIFZFUkJTfSBzdG9wcyB0aGUgZm9sZCB3aXRoXG4gKiB7QGxpbmsgVW5rbm93blZlcmJFcnJvcn0gbmFtaW5nIHRoZSByb3c7IHRoZSByb3dzIGJlZm9yZSBpdCBoYXZlIGJlZW5cbiAqIGFwcGxpZWQsIHRvIGEgc3RhdGUgdGhlIGNhbGxlciBkaXNjYXJkcyAoZXZlcnkgaW4tdHJlZSBjYWxsZXIgZG9lcykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb2xkUm93cyhcbiAgb3V0OiBhbnksXG4gIHVwZGF0ZXM6IE1lbW9yeVBhdGNoLFxuICBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoLFxuICByb3dzOiByZWFkb25seSBUcmFjZUVudHJ5W10sXG4gIGRpc2NpcGxpbmU6IERpc2NpcGxpbmUsXG4pOiBhbnkge1xuICBjb25zdCBkZXRhY2ggPSBkaXNjaXBsaW5lICE9PSAnYnlSZWZlcmVuY2UnO1xuICBjb25zdCBvd25lZCA9IGRpc2NpcGxpbmUgIT09ICdwcml2YXRlJyAmJiBoYXNOZXN0ZWRSb3cocm93cykgPyBuZXcgV2Vha1NldDxvYmplY3Q+KCkgOiB1bmRlZmluZWQ7XG4gIG93bihvdXQsIG93bmVkKTtcbiAgY29uc3QgYXQgPSBuZXcgUmVjb3JkZWRQYXlsb2FkKHVwZGF0ZXMsIG92ZXJ3cml0ZSwgZGV0YWNoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHN1cGVyc2VkZWRCeU5leHRTZXQocm93cywgaSkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHsgcGF0aCwgdmVyYiB9ID0gcm93c1tpXTtcbiAgICBpZiAoIWlzVmVyYih2ZXJiKSkgdGhyb3cgbmV3IFVua25vd25WZXJiRXJyb3IodmVyYiwgeyBwYXRoLCByb3c6IGkgfSk7XG4gICAgY29uc3Qgc2VncyA9IHBhdGguc3BsaXQoREVMSU0pO1xuICAgIGlmIChvd25lZCAhPT0gdW5kZWZpbmVkICYmIHNlZ3MubGVuZ3RoID4gMSkgb3duU3BpbmUob3V0LCBzZWdzLCBvd25lZCk7XG4gICAgLy8gQSB0b3RhbCB2ZXJiIHJlYWRzIG5vdGhpbmcgZnJvbSB3aGF0IGNhbWUgYmVmb3JlIGl0IChpc1RvdGFsKSDigJQgc28gdGhlXG4gICAgLy8gZm9sZCBkb2VzIG5vdCBsb29rLlxuICAgIGNvbnN0IG5leHQgPSBhcHBseVZlcmIodmVyYiwgaXNUb3RhbCh2ZXJiKSA/IHVuZGVmaW5lZCA6IG5hdGl2ZUdldChvdXQsIHNlZ3MpLCBhdCwgc2Vncyk7XG4gICAgLy8gQSB2YWx1ZSB0aGlzIGZvbGQgQ1JFQVRFRCBpcyBpdHMgb3duIHRvIGVkaXQgaW4gcGxhY2U7IGEgcmVjb3JkZWQgdmFsdWVcbiAgICAvLyBwbGFjZWQgYnkgcmVmZXJlbmNlIGlzIHRoZSBsb2cncy5cbiAgICBpZiAoZGV0YWNoIHx8IHZlcmIgPT09ICdtZXJnZScpIG93bihuZXh0LCBvd25lZCk7XG4gICAgcGxhY2VWZXJiKG91dCwgc2VncywgbmV4dCk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBBcHBsaWVzIGEgY29tbWl0IGJ1bmRsZSB0byBhIGJhc2Ugc3RhdGUgYnkgcmVwbGF5aW5nIG9wZXJhdGlvbnMgaW4gb3JkZXIuXG4gKiBHdWFyYW50ZWVzIFwibGFzdCB3cml0ZXIgd2luc1wiIHNlbWFudGljcy5cbiAqXG4gKiBSZXR1cm5zIGEgRlVMTFkgREVUQUNIRUQgcmVzdWx0OiB0aGUgYmFzZSBpcyBkZWVwLWNsb25lZCBmaXJzdCBhbmQgZXZlcnlcbiAqIHZhbHVlIHRoZSByZXBsYXkgd3JpdGVzIGlzIGl0cyBvd24gKGBzZXRgIC8gYGFwcGVuZGAgY2xvbmUgdGhlIHJlY29yZGVkXG4gKiB2YWx1ZTsgdGhlIGBtZXJnZWAgYXJtIHJlYWRzIGEgZGV0YWNoZWQgY29weSBvZiBgdXBkYXRlc2ApLCBzbyB0aGUgcmVzdWx0XG4gKiBzaGFyZXMgbm8gY29udGFpbmVyIHdpdGggYGJhc2VgLCBgdXBkYXRlc2Agb3IgYG92ZXJ3cml0ZWAuIFRoaXMgaXMgdGhlXG4gKiBwdWJsaWMgKGBmb290cHJpbnRqcy9hZHZhbmNlZGApIGNvbnRyYWN0LCB1bmNoYW5nZWQgYnkgY29weS1vbi13cml0ZVxuICogKDkuMjkuMCkg4oCUIGJ5dGUtaWRlbnRpY2FsIHRvIDkuMjguMCBmb3IgZXZlcnkgY2FsbGVyLiBUaGUgZW5naW5lJ3Mgb3duXG4gKiBjb21taXQgZG9lcyBOT1QgY29tZSBoZXJlOiBgU2hhcmVkTWVtb3J5LmFwcGx5UGF0Y2hgIGJ1aWxkcyB0aGUgbmV4dFxuICogZ2VuZXJhdGlvbiB3aXRoIGBuZXh0R2VuZXJhdGlvbmAsIHdoaWNoIGNvcGllcyBvbmx5IHRoZSB3cml0dGVuXG4gKiBwYXRocy4gQm90aCBydW4gdGhlIE9ORSBmb2xkLCB7QGxpbmsgZm9sZFJvd3N9OyB0aGUgdmVyYnMgYXJlXG4gKiB7QGxpbmsgYXBwbHlWZXJifSdzLlxuICpcbiAqIFZlcmIgYXJtcyDigJQgc2VlIHtAbGluayBhcHBseVZlcmJ9LiBBIHJvdyB3aXRoIGFueSBvdGhlciB2ZXJiIHRocm93c1xuICoge0BsaW5rIFVua25vd25WZXJiRXJyb3J9LlxuICpcbiAqIFdvcmssIG5vdCBieXRlcyAoOS4yMi4xKTogYSBgc2V0YCByb3cgdGhlIE5FWFQgcm93IHJlLXNldHMgaXMgc2tpcHBlZFxuICogKHtAbGluayBzdXBlcnNlZGVkQnlOZXh0U2V0fSkg4oCUIHRoZSByb3dzIHN0YXkgaW4gdGhlIGxvZywgb25seSB0aGUgY2xvbmVcbiAqIGVhY2ggd291bGQgaGF2ZSBwYWlkIGlzIG5vdC4gRXZlcnkgY29uc3VtZXIgaW5oZXJpdHMgdGhlIHNraXAgZnJvbVxuICogYGZvbGRSb3dzYDsgdGhlcmUgaXMgbm8gc2Vjb25kIHJlcGxheSBsb29wIHRvIGtlZXAgaW4gc3RlcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5U21hcnRNZXJnZShiYXNlOiBhbnksIHVwZGF0ZXM6IE1lbW9yeVBhdGNoLCBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoLCB0cmFjZTogVHJhY2VFbnRyeVtdKTogYW55IHtcbiAgcmV0dXJuIGZvbGRSb3dzKHN0cnVjdHVyZWRDbG9uZShiYXNlKSwgdXBkYXRlcywgb3ZlcndyaXRlLCB0cmFjZSwgJ3ByaXZhdGUnKTtcbn1cblxuLyoqXG4gKiBUaGUgZW5naW5lJ3MgY29tbWl0IChjb3B5LW9uLXdyaXRlLCA5LjI5LjAg4oCUIGRvY3MvZGVzaWduLzIwMjYtMTAtY29weS1vbi1cbiAqIHdyaXRlLWNvbW1pdC5tZCk6IHRoZSBORVhUIGNvbW1pdHRlZCBnZW5lcmF0aW9uLiBBIGNvcHkgb2YgYGJhc2VgJ3MgUk9PVFxuICogcGx1cyBhIGNvcHkgb2YgZXZlcnkgY29udGFpbmVyIG9uIGVhY2ggd3JpdHRlbiBwYXRoOyBldmVyeSBvdGhlciBzdWJ0cmVlXG4gKiBpcyBTSEFSRUQgd2l0aCBgYmFzZWAsIHdoaWNoIGlzIG5ldmVyIGVkaXRlZCDigJQgY29tbWl0dGVkIHN0YXRlIGlzXG4gKiBpbW11dGFibGUtYWZ0ZXItc3dhcCwgc28gc2hhcmluZyBpcyBzYWZlLCBhbmQgYSBjb21taXQgY29zdHMgTyh3aGF0IGl0XG4gKiB3cm90ZSksIG5vdCBPKHN0YXRlKS4gYFNoYXJlZE1lbW9yeS5hcHBseVBhdGNoYCAobGl2ZSBzdGF0ZSBhbmQgdGhlXG4gKiByZWRhY3RlZCBtaXJyb3IpIGlzIGl0cyBjYWxsZXIuIEludGVybmFsOiB0aGUgcHVibGljIHJlcGxheSBpc1xuICoge0BsaW5rIGFwcGx5U21hcnRNZXJnZX0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuZXh0R2VuZXJhdGlvbihiYXNlOiBhbnksIHVwZGF0ZXM6IE1lbW9yeVBhdGNoLCBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoLCB0cmFjZTogVHJhY2VFbnRyeVtdKTogYW55IHtcbiAgcmV0dXJuIGZvbGRSb3dzKG93bmVkUm9vdE9mKGJhc2UpLCB1cGRhdGVzLCBvdmVyd3JpdGUsIHRyYWNlLCAncGF0aENvcHknKTtcbn1cblxuLyoqXG4gKiBUaGUgc2FtZSByZXBsYXksIElOVE8gYHRhcmdldGAg4oCUIG5vIGNsb25lIG9mIGl0cyBvd24uIEZvciBhIGNhbGxlciB0aGF0XG4gKiBhbHJlYWR5IGhvbGRzIGEgcHJpdmF0ZSB3b3JraW5nIGNvcHkgKHRoZSByZWFkLXNpZGUgZm9sZHM6IGBzdGF0ZUF0YCBpblxuICogYHRpbWUtdHJhdmVsL3N0YXRlQXQudHNgIGFuZCBgRXZlbnRMb2cubWF0ZXJpYWxpc2VgIGNsb25lIHRoZWlyIGJhc2UgT05DRVxuICogYW5kIHRoZW4gYXBwbHkgZXZlcnkgYnVuZGxlIGhlcmUpLCBzbyBhIGZvbGQgb3ZlciBOIGJ1bmRsZXMgY29zdHMgTiByb3dcbiAqIGFwcGxpY2F0aW9ucywgbm90IE4gY2xvbmVzIG9mIHRoZSB3aG9sZSBzdGF0ZS4gTmV2ZXIgaGFuZCBpdCBjb21taXR0ZWRcbiAqIHN0YXRlOiBpdCBtdXRhdGVzIHRoZSBST09UIGluIHBsYWNlLiBCZWxvdyB0aGUgcm9vdCBpdCBmb2xsb3dzIHRoZSBsaXZlXG4gKiBjb21taXQncyBsYXcgKHtAbGluayBuZXh0R2VuZXJhdGlvbn0pIOKAlCBhIGNvbnRhaW5lciB0aGlzIGNhbGwgZGlkIG5vdFxuICogY3JlYXRlIGlzIGNvcGllZCBiZWZvcmUgYSB3cml0ZSBwYXNzZXMgdGhyb3VnaCBpdCDigJQgc28gYSBmb2xkIGFuZCB0aGUgbGl2ZVxuICogc3RhdGUgZ2l2ZSB0aGUgc2FtZSB2YWx1ZSBhdCBldmVyeSBwYXRoLCBhbGlhc2VkIHN1YnRyZWVzIGluY2x1ZGVkLlxuICogVGhlIHZhbHVlcyBpdCB3cml0ZXMgYXJlIGl0cyBvd24sIHNvIGB0YXJnZXRgIG5ldmVyIGFsaWFzZXMgdGhlIGxvZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5U21hcnRNZXJnZUludG8oXG4gIHRhcmdldDogYW55LFxuICB1cGRhdGVzOiBNZW1vcnlQYXRjaCxcbiAgb3ZlcndyaXRlOiBNZW1vcnlQYXRjaCxcbiAgdHJhY2U6IFRyYWNlRW50cnlbXSxcbik6IGFueSB7XG4gIHJldHVybiBmb2xkUm93cyh0YXJnZXQsIHVwZGF0ZXMsIG92ZXJ3cml0ZSwgdHJhY2UsICdwYXRoQ29weScpO1xufVxuXG4vKipcbiAqIFRoZSBmb2xkLCBmb3IgQ09NUEFSSVNPTiBvbmx5ICg5LjMwLjAg4oCUIHRoZSBhZG1pdHRlZCByZWNvcmQpOiBgYmFzZWAgd2l0aFxuICogdGhlIGJ1bmRsZSByZXBsYXllZCBieSB0aGUgb25lIHZlcmIgbGF3LCBjb3B5LW9uLXdyaXRlIGJlbG93IHRoZSByb290LFxuICogZXZlcnkgcmVjb3JkZWQgdmFsdWUgcGxhY2VkIEJZIFJFRkVSRU5DRSDigJQgbm8gY2xvbmUsIHNvIGl0IGNvc3RzIHdoYXQgdGhlXG4gKiBidW5kbGUgd3JvdGUgYW5kIG5vdGhpbmcgbW9yZS4gSXQgYWxpYXNlcyB0aGUgcGF5bG9hZCBhbmQgZXZlcnkgc3VidHJlZSBvZlxuICogYGJhc2VgIHRoZSBidW5kbGUgZGlkIG5vdCB3cml0ZSwgYW5kIGVkaXRzIG5laXRoZXIuIE5ldmVyIGhhbmQgaXQgb3V0LFxuICogc3RvcmUgaXQgb3Igd3JpdGUgdGhyb3VnaCBpdDogYFRyYW5zYWN0aW9uQnVmZmVyYCBidWlsZHMgb25lIHRvIGFzayB3aGV0aGVyXG4gKiBhIGJ1bmRsZSBmb2xkcyBiYWNrIHRvIHdoYXQgdGhlIHN0YWdlIHJlYWQsIHRoZW4gZHJvcHMgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkcnlGb2xkKGJhc2U6IGFueSwgdXBkYXRlczogTWVtb3J5UGF0Y2gsIG92ZXJ3cml0ZTogTWVtb3J5UGF0Y2gsIHRyYWNlOiBUcmFjZUVudHJ5W10pOiBhbnkge1xuICByZXR1cm4gZm9sZFJvd3Mob3duZWRSb290T2YoYmFzZSksIHVwZGF0ZXMsIG92ZXJ3cml0ZSwgdHJhY2UsICdieVJlZmVyZW5jZScpO1xufVxuXG4vLyDilIDilIDilIAgVGhlIGZvbGQgb3ZlciBvbmUga2V5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIE9uZSByb3cgb2YgdGhlIGxvZyB1bmRlciB0aGUgZm9sZGVkIGtleSdzIFRPUC1MRVZFTCBrZXkg4oCUIHdoYXQge0BsaW5rIGZvbGRLZXl9XG4gKiBhcHBsaWVzLCBpbiBjb21taXQgb3JkZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG91Y2gge1xuICByZWFkb25seSB2ZXJiOiBWZXJiO1xuICByZWFkb25seSBidW5kbGU6IENvbW1pdEJ1bmRsZTtcbiAgLyoqIFRoZSBidW5kbGUncyBwb3NpdGlvbiBpbiB0aGUgY29tbWl0IGxvZy4gKi9cbiAgcmVhZG9ubHkgY29tbWl0SWR4OiBDb21taXRJZHg7XG4gIC8qKiBUaGUgcm93J3Mgb3duIHBhdGggKERFTElNLWpvaW5lZCBgVHJhY2VFbnRyeS5wYXRoYCkuICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbiAgLyoqXG4gICAqIEhvdyB0aGUgcm93IHNpdHMgYWdhaW5zdCB0aGUgZm9sZGVkIGtleSAoYGtleVBhdGhzIMK3IHJlbGF0aW9uYCkuIEFCU0VOVCBmb3IgYVxuICAgKiByb3cgb24gYW5vdGhlciBwYXRoIHVuZGVyIHRoZSBzYW1lIHRvcC1sZXZlbCBrZXk6IHN1Y2ggYSByb3cgaXMgQVBQTElFRCAoYW5cbiAgICogYXJyYXkgdW5pb24gb24gYSBjb250YWluZXIgYWJvdmUgdGhlIGtleSBkZWR1cHMgdGhlIHdob2xlIGFycmF5LCBzbyBhIHNpYmxpbmdcbiAgICogY2hhbmdlcyB3aGVyZSBpdCBsZWF2ZXMgdGhlIGtleSkgYnV0IG5ldmVyIG9ic2VydmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVsYXRpb24/OiBQYXRoUmVsYXRpb247XG59XG5cbi8qKiBXaGF0IGEgcmVhZGVyIGFza3Mgb2Yge0BsaW5rIGZvbGRLZXl9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBLZXlGb2xkIHtcbiAgLyoqXG4gICAqIFN0YXJ0IGF0IHRoZSBMQVNUIHJvdyB0aGF0IHNldHMgb3IgZGVsZXRlcyB0aGUgd2hvbGUgVE9QLUxFVkVMIGtleSAoe0BsaW5rXG4gICAqIGlzVG90YWx9LCBvbiB0aGUgcm9vdCBwYXRoIGl0c2VsZikg4oCUIHJvd3MgYmVmb3JlIGl0IGNhbm5vdCBjaGFuZ2UgYW55dGhpbmdcbiAgICogdW5kZXIgdGhhdCBrZXksIHNvIGEgcmVhZGVyIHRoYXQgd2FudHMgb25seSB0aGUgdmFsdWUgc2tpcHMgdGhlbS4gQSBgc2V0YCBvZlxuICAgKiBhIHBhdGggYmVsb3cgdGhlIHJvb3QgaXMgTk9UIGFuIGFuY2hvcjogYW4gZWFybGllciBzaWJsaW5nIGNhbiBzdGlsbCBtb3ZlXG4gICAqIHRoZSBrZXkgdGhyb3VnaCBhIGxhdGVyIHVuaW9uLiBPZmYgYnkgZGVmYXVsdDogYSByZWFkZXIgdGhhdCB0cmFja3MgaG93IHRoZVxuICAgKiB2YWx1ZSBHUkVXIG11c3Qgc2VlIGV2ZXJ5IHJvdy5cbiAgICovXG4gIHJlYWRvbmx5IGFuY2hvcmVkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIENhbGxlZCBhZnRlciBlYWNoIGFwcGxpZWQgcm93IHRoYXQgaGFzIGEge0BsaW5rIFRvdWNoLnJlbGF0aW9ufSDigJQgb24sIGluc2lkZVxuICAgKiBvciBhcm91bmQgdGhlIGtleSAoZXZlcnkgcm93LCB3aXRoIGBldmVyeVJvd2ApIOKAlCB3aXRoIHRoZSB2YWx1ZSBBVCBUSEUgS0VZIGJlZm9yZSBpdCBhbmQgYWZ0ZXIgaXRcbiAgICogKGB1bmRlZmluZWRgIGZvciBhbiBhYnNlbnQga2V5KS4gVGhlIHNlYW0gYSBwcm92ZW5hbmNlIHRyYWNrIGFuZCB0aGUgd3JpdGVyXG4gICAqIHJ1bGUgaGFuZyBvbjogdGhleSB3YXRjaCB0aGUgZm9sZCwgdGhleSBuZXZlciBoYXZlIGEgdmVyYiBzd2l0Y2ggb2YgdGhlaXJcbiAgICogb3duLiBGb3IgYSByb3cgSU5TSURFIHRoZSBrZXksIGFuIGFycmF5IGBiZWZvcmVgIGlzIGEgc2hhbGxvdyBzbmFwc2hvdDogdGhhdFxuICAgKiByb3cgZWRpdHMgdGhlIGZvbGQncyBvd24gY29weSBpbiBwbGFjZS5cbiAgICovXG4gIHJlYWRvbmx5IG9ic2VydmU/OiAodG91Y2g6IFRvdWNoLCBiZWZvcmU6IHVua25vd24sIGFmdGVyOiB1bmtub3duKSA9PiB2b2lkO1xuICAvKipcbiAgICogT2JzZXJ2ZSBFVkVSWSBhcHBsaWVkIHJvdywgbm90IG9ubHkgdGhlIGtleSdzIG93bi4gVGhlIHdyaXRlciBydWxlIG5lZWRzIGl0OiBpdCBjb21wYXJlcyB0aGUgdmFsdWUgYXQgdGhlXG4gICAqIGtleSBhY3Jvc3MgYSBXSE9MRSBjb21taXQsIGFuZCBhIHNpYmxpbmcgdW5kZXIgdGhlIHNhbWUgdG9wLWxldmVsIGtleSBjYW4gbW92ZSB0aGF0IHZhbHVlIOKAlCBhIHdyaXRlXG4gICAqIHRocm91Z2ggYSBjb250YWluZXIgdGhhdCBob2xkcyBhIHByaW1pdGl2ZSByZXBsYWNlcyB0aGUgY29udGFpbmVyIChgbmF0aXZlU2V0YCksIGFuZCB3aXRoIGl0IHRoZSBrZXkuXG4gICAqL1xuICByZWFkb25seSBldmVyeVJvdz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBLZWVwIEdFTkVSQVRJT05TIGF0IGNob3NlbiBjb21taXRzOiBgYXRgIGlzIGFza2VkIGJlZm9yZSBhIGNvbW1pdCdzIGZpcnN0IHJvdyAod2l0aCB0aGUgZm9sZCdzIHN0YXRlIGFzXG4gICAqIGl0IHN0YW5kcyk7IGZvciBhIGNvbW1pdCBpdCBhY2NlcHRzLCBga2VlcGAgaXMgaGFuZGVkIHRoZSB2YWx1ZSBhdCB0aGUga2V5IGJlZm9yZSB0aGUgY29tbWl0IGFuZCBhZnRlclxuICAgKiBpdCDigJQgY29weS1vbi13cml0ZSBhcm91bmQgdGhhdCBjb21taXQgKHRoZSBmb2xkIGRyb3BzIG93bmVyc2hpcCBvZiBldmVyeSBjb250YWluZXIgYmVmb3JlIGFuZCBhZnRlciBpdCksXG4gICAqIHNvIG5vIGxhdGVyIHJvdyBlZGl0cyBlaXRoZXIgdmFsdWUuIFRoZSB3cml0ZXIgcnVsZSdzIG1lbW9pc2VkIHJvb3QgZm9sZCAoYGNvbW1pdExvZ1V0aWxzIMK3IExvZ01vZGVsYClcbiAgICoga2VlcHMgdGhlIGNvbW1pdHMgYSBrZXkncyB2ZXJkaWN0IG5lZWRzLCBvbmNlIHBlciB0b3AtbGV2ZWwga2V5LlxuICAgKi9cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSB0aGUgdG9wLWxldmVsIGtleSBob2xkcyBCRUZPUkUgdGhlIGZpcnN0IHJvdyDigJQgZGVmYXVsdDogYWJzZW50LiBOZXZlciBlZGl0ZWQ6IHRoZSBmb2xkIGNvcGllc1xuICAgKiBpdCBiZWZvcmUgd3JpdGluZyB0aHJvdWdoIGl0LiBgY29tbWl0VmFsdWVBdGAgb24gYSBtZW1vaXNlZCBsb2cgc3RhcnRzIGZyb20gYSBrZXB0IGdlbmVyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBzdGFydD86IHVua25vd247XG4gIHJlYWRvbmx5IGdlbmVyYXRpb25zPzoge1xuICAgIGF0KGNvbW1pdElkeDogbnVtYmVyLCBzdGF0ZTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KTogYm9vbGVhbjtcbiAgICBrZWVwKGNvbW1pdElkeDogbnVtYmVyLCBiZWZvcmU6IHVua25vd24sIGFmdGVyOiB1bmtub3duKTogdm9pZDtcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgdmFsdWUgb2YgT05FIGtleSBhZnRlciBgdG91Y2hlc2Ag4oCUIEVWRVJZIHJvdyB1bmRlciBpdHMgdG9wLWxldmVsIGtleSwgaW5cbiAqIGNvbW1pdCBvcmRlciwgZWFjaCBhbHJlYWR5IGNoZWNrZWQgd2l0aCB7QGxpbmsgaXNWZXJifSDigJQgZm9sZGVkIGZyb20gYW4gYWJzZW50XG4gKiBrZXksIHJlYWQgYXQgdGhlIGtleSAoYHNlZ3NgLCBpdHMgREVMSU0gc2VnbWVudHMpOiB0aGUgdmFsdWUgcnVsZSBvZlxuICogYGtleVBhdGhzLnRzYCwgdGhlIGZvbGQgYHN0YXRlQXRgIGRvZXMgcmVzdHJpY3RlZCB0byBvbmUgdG9wLWxldmVsIGtleS4gVG9wLWxldmVsXG4gKiBrZXlzIG5ldmVyIGludGVyYWN0IHVuZGVyIHRoZSBzdGVwLCBzbyB0aGUgcmVzdHJpY3Rpb24gaXMgZXhhY3QuXG4gKlxuICogVGhlIHNhbWUgc3RlcCAoe0BsaW5rIGFwcGx5VmVyYn0pIGFuZCB0aGUgc2FtZSBkaXNjaXBsaW5lIGFzIHtAbGluayBmb2xkUm93c30nc1xuICogYCdwYXRoQ29weSdgOiBgc2V0YCAvIGBhcHBlbmRgIHZhbHVlcyBhcmUgY2xvbmVzLCB0aGUgbWVyZ2UgZGVsdGEgaXMgZGV0YWNoZWRcbiAqIG9uY2UgcGVyIEJVTkRMRSAobmFycm93ZWQgdG8gdGhlIHRvcC1sZXZlbCBrZXkpLCBzbyB0d28gYG1lcmdlYCByb3dzIG9mIG9uZVxuICogYnVuZGxlIHNlZSB0aGUgc2FtZSBvYmplY3RzLCBhbmQgYSByb3cgdGhhdCB3cml0ZXMgdGhyb3VnaCBhIGNvbnRhaW5lciB0aGlzXG4gKiBmb2xkIGRpZCBub3QgY3JlYXRlIGNvcGllcyBpdCBmaXJzdC4gUmV0dXJucyBgdW5kZWZpbmVkYCBmb3IgYW4gYWJzZW50IGtleS5cbiAqIE8odGhlIHJvd3MgdW5kZXIgdGhlIGtleSdzIHRvcC1sZXZlbCBrZXkpLCBub3QgTyh0aGUgbG9nKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvbGRLZXkodG91Y2hlczogcmVhZG9ubHkgVG91Y2hbXSwgc2Vnczogc3RyaW5nW10sIG9wdGlvbnM6IEtleUZvbGQgPSB7fSk6IHVua25vd24ge1xuICBjb25zdCByb290ID0gc2Vnc1swXTtcbiAgbGV0IGZyb20gPSAwO1xuICBpZiAob3B0aW9ucy5hbmNob3JlZCA9PT0gdHJ1ZSkge1xuICAgIGZvciAobGV0IGkgPSB0b3VjaGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBpZiAoaXNUb3RhbCh0b3VjaGVzW2ldLnZlcmIpICYmIHRvdWNoZXNbaV0ucGF0aCA9PT0gcm9vdCkge1xuICAgICAgICBmcm9tID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IHN0YXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICBpZiAob3B0aW9ucy5zdGFydCAhPT0gdW5kZWZpbmVkKSBzdGF0ZVtyb290XSA9IG9wdGlvbnMuc3RhcnQ7XG4gIGxldCBvd25lZCA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKTtcbiAgb3duZWQuYWRkKHN0YXRlKTtcbiAgY29uc3Qgb2JzZXJ2ZSA9IG9wdGlvbnMub2JzZXJ2ZTtcbiAgY29uc3QgZ2VuZXJhdGlvbnMgPSBvcHRpb25zLmdlbmVyYXRpb25zO1xuICBsZXQga2VwdCA9IC0xO1xuICBsZXQga2VwdEJlZm9yZTogdW5rbm93bjtcbiAgLyoqIERyb3Agb3duZXJzaGlwIG9mIGV2ZXJ5IGNvbnRhaW5lcjogdGhlIG5leHQgd3JpdGUgdGhyb3VnaCBvbmUgY29waWVzIGl0LCBzbyBhIGtlcHQgdmFsdWUgc3RheXMgYXMgaXQgaXMuICovXG4gIGNvbnN0IHJlbGVhc2UgPSAoKSA9PiB7XG4gICAgb3duZWQgPSBuZXcgV2Vha1NldDxvYmplY3Q+KCk7XG4gICAgb3duZWQuYWRkKHN0YXRlKTtcbiAgfTtcbiAgbGV0IGF0OiBSZWNvcmRlZFBheWxvYWQgfCB1bmRlZmluZWQ7XG4gIGxldCBhdENvbW1pdCA9IC0xO1xuICBmb3IgKGxldCBpID0gZnJvbTsgaSA8IHRvdWNoZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0b3VjaCA9IHRvdWNoZXNbaV07XG4gICAgaWYgKGF0ID09PSB1bmRlZmluZWQgfHwgdG91Y2guY29tbWl0SWR4ICE9PSBhdENvbW1pdCkge1xuICAgICAgaWYgKGtlcHQgIT09IC0xKSB7XG4gICAgICAgIGdlbmVyYXRpb25zIS5rZWVwKGtlcHQsIGtlcHRCZWZvcmUsIG5hdGl2ZUdldChzdGF0ZSwgc2VncykpO1xuICAgICAgICBrZXB0ID0gLTE7XG4gICAgICAgIHJlbGVhc2UoKTtcbiAgICAgIH1cbiAgICAgIGlmIChnZW5lcmF0aW9ucyAhPT0gdW5kZWZpbmVkICYmIGdlbmVyYXRpb25zLmF0KHRvdWNoLmNvbW1pdElkeCwgc3RhdGUpKSB7XG4gICAgICAgIHJlbGVhc2UoKTtcbiAgICAgICAga2VwdCA9IHRvdWNoLmNvbW1pdElkeDtcbiAgICAgICAga2VwdEJlZm9yZSA9IG5hdGl2ZUdldChzdGF0ZSwgc2Vncyk7XG4gICAgICB9XG4gICAgICBhdCA9IG5ldyBSZWNvcmRlZFBheWxvYWQodG91Y2guYnVuZGxlLnVwZGF0ZXMsIHRvdWNoLmJ1bmRsZS5vdmVyd3JpdGUsIHRydWUsIFtyb290XSk7XG4gICAgICBhdENvbW1pdCA9IHRvdWNoLmNvbW1pdElkeDtcbiAgICB9XG4gICAgY29uc3Qgcm93U2VncyA9IHRvdWNoLnBhdGggPT09IHJvb3QgPyBbcm9vdF0gOiB0b3VjaC5wYXRoLnNwbGl0KERFTElNKTtcbiAgICBjb25zdCB3YXRjaGVkID0gb2JzZXJ2ZSAhPT0gdW5kZWZpbmVkICYmICh0b3VjaC5yZWxhdGlvbiAhPT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMuZXZlcnlSb3cgPT09IHRydWUpO1xuICAgIGxldCBiZWZvcmU6IHVua25vd247XG4gICAgaWYgKHdhdGNoZWQpIHtcbiAgICAgIGJlZm9yZSA9IG5hdGl2ZUdldChzdGF0ZSwgc2Vncyk7XG4gICAgICBpZiAodG91Y2gucmVsYXRpb24gPT09ICdpbnNpZGUnICYmIEFycmF5LmlzQXJyYXkoYmVmb3JlKSkgYmVmb3JlID0gYmVmb3JlLnNsaWNlKCk7XG4gICAgfVxuICAgIGlmIChyb3dTZWdzLmxlbmd0aCA+IDEpIG93blNwaW5lKHN0YXRlLCByb3dTZWdzLCBvd25lZCk7XG4gICAgLy8gQSB0b3RhbCB2ZXJiIHJlYWRzIG5vdGhpbmcgZnJvbSB3aGF0IGNhbWUgYmVmb3JlIGl0IChpc1RvdGFsKS5cbiAgICBjb25zdCBuZXh0ID0gYXBwbHlWZXJiKHRvdWNoLnZlcmIsIGlzVG90YWwodG91Y2gudmVyYikgPyB1bmRlZmluZWQgOiBuYXRpdmVHZXQoc3RhdGUsIHJvd1NlZ3MpLCBhdCwgcm93U2Vncyk7XG4gICAgb3duKG5leHQsIG93bmVkKTtcbiAgICBwbGFjZVZlcmIoc3RhdGUsIHJvd1NlZ3MsIG5leHQpO1xuICAgIGlmICh3YXRjaGVkKSBvYnNlcnZlKHRvdWNoLCBiZWZvcmUsIG5hdGl2ZUdldChzdGF0ZSwgc2VncykpO1xuICB9XG4gIGlmIChrZXB0ICE9PSAtMSkgZ2VuZXJhdGlvbnMhLmtlZXAoa2VwdCwga2VwdEJlZm9yZSwgbmF0aXZlR2V0KHN0YXRlLCBzZWdzKSk7XG4gIHJldHVybiBuYXRpdmVHZXQoc3RhdGUsIHNlZ3MpO1xufVxuIl19
427
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyYnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS92ZXJicy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFJSCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM5RixPQUFPLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLFlBQVksQ0FBQztBQVFqRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxNQUFNLEdBQXNFO0lBQ2hGLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtJQUNqQyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7SUFDcEMsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO0lBQ3BDLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtDQUNyQyxDQUFDO0FBRUYsNERBQTREO0FBQzVELE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBb0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBVyxDQUFDLENBQUM7QUFFbkYseUZBQXlGO0FBQ3pGLE1BQU0sVUFBVSxNQUFNLENBQUMsS0FBYztJQUNuQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzFGLENBQUM7QUFF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UUFDRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hELGlFQUFpRTtRQUNqRSxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzdHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDakIsU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDaEMsSUFBSSxPQUFPO1lBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFDRCxJQUFJLElBQUksS0FBSyxDQUFDLENBQUM7UUFBRSxXQUFZLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzdFLE9BQU8sU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNoQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiB2ZXJicy50cyDigJQgVEhFIFZFUkIgTEFXIChMMSk6IHRoZSBvbmUgcGxhY2UgYSBjb21taXQgcm93IGJlY29tZXMgYSB2YWx1ZS5cbiAqXG4gKiBBIHJvdyBvZiBhIGNvbW1pdCBidW5kbGUncyBgdHJhY2VgIGNhcnJpZXMgb25lIG9mIGZvdXIgdmVyYnMg4oCUXG4gKiBgc2V0IHwgbWVyZ2UgfCBhcHBlbmQgfCBkZWxldGVgIOKAlCBhbmQgT05FIHN0ZXAgdHVybnMgaXQgaW50byBhIHZhbHVlOlxuICoge0BsaW5rIGFwcGx5VmVyYn0uIFN0YXRlIGlzIGEgbGVmdCBmb2xkIG9mIHRoYXQgc3RlcCAodGhlIGV2ZW50LXNvdXJjaW5nXG4gKiByZWR1Y2VyKToge0BsaW5rIGZvbGRSb3dzfSBmb2xkcyBvbmUgYnVuZGxlJ3Mgcm93cyBpbnRvIGEgc3RhdGUsIGFuZFxuICoge0BsaW5rIGZvbGRLZXl9IGZvbGRzIE9ORSBLRVkgYWNyb3NzIGEgbG9nIOKAlCBldmVyeSByb3cgdW5kZXIgdGhlIGtleSdzXG4gKiB0b3AtbGV2ZWwga2V5LCByZWFkIGF0IHRoZSBrZXkgKHRoZSB2YWx1ZSBydWxlLCBga2V5UGF0aHMudHNgKS4gRXZlcnkgcmVhZGVyXG4gKiBvZiB0aGUgbG9nIHJ1bnMgb25lIG9mIHRoZSB0d28g4oCUXG4gKlxuICogICAtIHRoZSBsaXZlIGNvbW1pdCBhbmQgdGhlIHJlZGFjdGVkIG1pcnJvciAoYG5leHRHZW5lcmF0aW9uYCksXG4gKiAgIC0gdGhlIHB1YmxpYyByZXBsYXkgKGBhcHBseVNtYXJ0TWVyZ2VgKSwgdGhlIHJlYWQtc2lkZSBmb2xkc1xuICogICAgIChgYXBwbHlTbWFydE1lcmdlSW50b2Ag4oCUIGBFdmVudExvZy5tYXRlcmlhbGlzZWAsIGBzdGF0ZUF0YCkgYW5kIHRoZVxuICogICAgIGFkbWl0dGVkIHJlY29yZCdzIGNvbXBhcmlzb24gKGBkcnlGb2xkYCk6IGFsbCB7QGxpbmsgZm9sZFJvd3N9LFxuICogICAtIGBjb21taXRWYWx1ZUF0YCwgYW5kIGBhcnJheVByb3ZlbmFuY2VgIGFzIGFuIE9CU0VSVkVSIG9mIHRoZSBzYW1lIGZvbGQ6XG4gKiAgICAge0BsaW5rIGZvbGRLZXl9LlxuICpcbiAqIFRocmVlIHF1ZXN0aW9ucyB0aGF0IHVzZWQgdG8gYmUgYW5zd2VyZWQgb25jZSBwZXIgcmVhZGVyIGFyZSBhbnN3ZXJlZCBoZXJlXG4gKiBvbmNlOiB3aGF0IGEgdmVyYiBkb2VzIHRvIHRoZSB2YWx1ZSBiZWZvcmUgaXQgKHtAbGluayBhcHBseVZlcmJ9KSwgaG93IHRoZVxuICogcmVzdWx0IGlzIHBsYWNlZCAoe0BsaW5rIHBsYWNlVmVyYn0pLCBhbmQgaG93IHRoZSBsb2cncyBvd24gdmFsdWVzIGFyZVxuICogdHJlYXRlZCBvbiB0aGUgd2F5IGluICh0aGUgY2xvbmUgZGlzY2lwbGluZSDigJQgYSBQQVJBTUVURVIgb2YgdGhlIGZvbGQsIHNlZVxuICoge0BsaW5rIERpc2NpcGxpbmV9IGFuZCB7QGxpbmsgUmVjb3JkZWRQYXlsb2FkfSkuIEEgbmV3IHZlcmIgaXMgb25lIG5ldyBhcm0gb2ZcbiAqIGBhcHBseVZlcmJgIGFuZCBvbmUgcm93IG9mIHRoZSB0cmFpdHMgdGFibGU7IHRoZSBjb21waWxlciByZWZ1c2VzIGVpdGhlclxuICogbWlzc2luZyAoe0BsaW5rIGlzVG90YWx9LCB7QGxpbmsgcmVjb3Jkc1RhaWx9LCB7QGxpbmsgVkVSQlN9KS5cbiAqXG4gKiBBbiBVTktOT1dOIHZlcmIgaXMgcmVmdXNlZCB3aXRoIHtAbGluayBVbmtub3duVmVyYkVycm9yfSwgbmV2ZXIgZm9sZGVkIGFzIGFcbiAqIGBtZXJnZWAgKHRoZSBvbGQgc2lsZW50IGRlZmF1bHQpLiBFbmdpbmUtd3JpdHRlbiBsb2dzIGNhcnJ5IHRoZSBmb3VyLCBzb1xuICogZXZlcnkgZW5naW5lIHJ1biBmb2xkcyBieXRlLWZvci1ieXRlIGFzIGJlZm9yZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvbW1pdElkeCB9IGZyb20gJy4uL2lkcy9ydW50aW1lU3RhZ2VJZC5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhdGhSZWxhdGlvbiB9IGZyb20gJy4va2V5UGF0aHMuanMnO1xuaW1wb3J0IHsgZGVlcFNtYXJ0TWVyZ2UgfSBmcm9tICcuL21lcmdlLmpzJztcbmltcG9ydCB7IG5hdGl2ZURlbGV0ZSwgbmF0aXZlR2V0LCBuYXRpdmVTZXQsIG93biwgb3duZWRSb290T2YsIG93blNwaW5lIH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IERFTElNLCBwYXRoU2VnbWVudHMgfSBmcm9tICcuL3BhdGhzLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0QnVuZGxlLCBNZW1vcnlQYXRjaCwgVHJhY2VFbnRyeSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vLyDilIDilIDilIAgVGhlIHZvY2FidWxhcnkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBBIGNvbW1pdCByb3cncyB2ZXJiIOKAlCBgVHJhY2VFbnRyeVsndmVyYiddYCwgdGhlIHVuaW9uIHRoZSB0eXBlcyBmaWxlIGRlY2xhcmVzLiAqL1xuZXhwb3J0IHR5cGUgVmVyYiA9IFRyYWNlRW50cnlbJ3ZlcmInXTtcblxuLyoqXG4gKiBUaGUgdm9jYWJ1bGFyeTogZWFjaCB2ZXJiIHdpdGggdGhlIHR3byB0cmFpdHMgcmVhZGVycyBicmFuY2ggb24sIGluIHRoZVxuICogb3JkZXIgdGhlIGNvbnRyYWN0IG5hbWVzIHRoZW0uIEEgYFJlY29yZGAgb3ZlciB0aGUgdW5pb24g4oCUIHRoZSBjb21waWxlclxuICogcmVmdXNlcyBhIHRhYmxlIHRoYXQgbWlzc2VzIChvciBpbnZlbnRzKSBhIHZlcmIsIHNvIGEgdmVyYiBjYW5ub3QgYmUgYWRkZWRcbiAqIHdpdGhvdXQgc2F5aW5nIHdoYXQgaXQgaXMuXG4gKlxuICogICBgdG90YWxgIOKAlCB0aGUgcm93IGRlY2lkZXMgdGhlIHZhbHVlIEFMT05FOyBpdCByZWFkcyBub3RoaW5nIGZyb20gd2hhdCBjYW1lXG4gKiAgICAgYmVmb3JlIGl0ICh7QGxpbmsgaXNUb3RhbH0pLlxuICogICBgdGFpbGAgIOKAlCB0aGUgcm93IHJlY29yZHMgT05MWSB3aGF0IGl0IGFkZHMsIG5vdCB0aGUgd2hvbGUgdmFsdWVcbiAqICAgICAoe0BsaW5rIHJlY29yZHNUYWlsfSkuXG4gKi9cbmNvbnN0IFRSQUlUUzogUmVjb3JkPFZlcmIsIHsgcmVhZG9ubHkgdG90YWw6IGJvb2xlYW47IHJlYWRvbmx5IHRhaWw6IGJvb2xlYW4gfT4gPSB7XG4gIHNldDogeyB0b3RhbDogdHJ1ZSwgdGFpbDogZmFsc2UgfSxcbiAgbWVyZ2U6IHsgdG90YWw6IGZhbHNlLCB0YWlsOiBmYWxzZSB9LFxuICBhcHBlbmQ6IHsgdG90YWw6IGZhbHNlLCB0YWlsOiB0cnVlIH0sXG4gIGRlbGV0ZTogeyB0b3RhbDogdHJ1ZSwgdGFpbDogZmFsc2UgfSxcbn07XG5cbi8qKiBUaGUgZm91ciB2ZXJicywgaW4gdGhlIG9yZGVyIHRoZSBjb250cmFjdCBuYW1lcyB0aGVtLiAqL1xuZXhwb3J0IGNvbnN0IFZFUkJTOiByZWFkb25seSBWZXJiW10gPSBPYmplY3QuZnJlZXplKE9iamVjdC5rZXlzKFRSQUlUUykgYXMgVmVyYltdKTtcblxuLyoqIElzIGB2YWx1ZWAgb25lIG9mIHRoZSBmb3VyPyBUaGUgcXVlc3Rpb24gZXZlcnkgcmVhZGVyIG9mIGEgZm9yZWlnbiBsb2cgYXNrcyBmaXJzdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZlcmIodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBWZXJiIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFRSQUlUUywgdmFsdWUpO1xufVxuXG4vKipcbiAqIERvZXMgdGhlIHZlcmIgZGVjaWRlIHRoZSB2YWx1ZSBBTE9ORSDigJQgcmVhZCBub3RoaW5nIGZyb20gd2hhdCBjYW1lIGJlZm9yZVxuICogaXQ/IGBzZXRgIGFuZCBgZGVsZXRlYC4gQSByZWFkZXIgdGhhdCBvbmx5IG5lZWRzIHRoZSBmaW5hbCB2YWx1ZSBtYXkgc3RhcnRcbiAqIGF0IHRoZSBsYXN0IHN1Y2ggcm93ICh7QGxpbmsgZm9sZEtleX0gYGFuY2hvcmVkYCk7IG9uZSB0aGF0IHRyYWNrcyBob3cgdGhlXG4gKiB2YWx1ZSBncmV3IChwcm92ZW5hbmNlKSBzdGFydHMgYXQgdGhlIGZpcnN0LiBQaW5uZWQgYWdhaW5zdFxuICoge0BsaW5rIGFwcGx5VmVyYn0gaXRzZWxmLCBzbyBhIG5ldyB2ZXJiIGNhbm5vdCBtaXNyZXBvcnQgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1RvdGFsKHZlcmI6IFZlcmIpOiBib29sZWFuIHtcbiAgcmV0dXJuIFRSQUlUU1t2ZXJiXS50b3RhbDtcbn1cblxuLyoqXG4gKiBEb2VzIHRoZSByb3cgcmVjb3JkIE9OTFkgd2hhdCBpdCBhZGRzIOKAlCBhIHRhaWwg4oCUIHJhdGhlciB0aGFuIHRoZSB3aG9sZVxuICogdmFsdWU/IGBhcHBlbmRgLiBXaGF0IHRoZSByb3cgYWRkZWQgaXMgdGhlbiBrbm93biBleGFjdGx5OiBhIHJlYWRlciB0aGF0XG4gKiB0cmFja3Mgd2hlcmUgYXJyYXkgZWxlbWVudHMgY2FtZSBmcm9tIGF0dHJpYnV0ZXMgdGhlbSB0byB0aGlzIHJvdyB3aXRob3V0XG4gKiBjb21wYXJpbmcgYXJyYXlzLCB3aGVyZSBldmVyeSBvdGhlciB2ZXJiIGhhcyB0byBiZSBpbmZlcnJlZCBmcm9tLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3Jkc1RhaWwodmVyYjogVmVyYik6IGJvb2xlYW4ge1xuICByZXR1cm4gVFJBSVRTW3ZlcmJdLnRhaWw7XG59XG5cbi8qKiBXaGVyZSBpbiBhIGxvZyBhIHJlZnVzZWQgcm93IHNpdHMuICovXG5leHBvcnQgaW50ZXJmYWNlIFJvd1NpdGUge1xuICAvKiogVGhlIHJvdydzIGBwYXRoYCwgREVMSU0tam9pbmVkIGFzIHRoZSB0cmFjZSByZWNvcmRzIGl0LiAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG4gIC8qKiBUaGUgcm93J3MgcG9zaXRpb24gaW4gaXRzIGJ1bmRsZSdzIGB0cmFjZWAuICovXG4gIHJlYWRvbmx5IHJvdzogbnVtYmVyO1xuICAvKiogVGhlIGJ1bmRsZSdzIHBvc2l0aW9uIGluIHRoZSBjb21taXQgbG9nLCB3aGVuIHRoZSByZWFkZXIga25vd3MgaXQuICovXG4gIHJlYWRvbmx5IGNvbW1pdD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaHJvd24gYnkgdGhlIHJlYWRlcnMgb2YgYSBjb21taXQgbG9nIOKAlCB7QGxpbmsgZm9sZFJvd3N9IChiZWhpbmRcbiAqIGBhcHBseVNtYXJ0TWVyZ2VgKSwgYGNvbW1pdFZhbHVlQXRgLCBgYXJyYXlQcm92ZW5hbmNlYCDigJQgd2hlbiBhIHJvdyBjYXJyaWVzIGFcbiAqIHZlcmIgb3V0c2lkZSB7QGxpbmsgVkVSQlN9OiBhIGZvcmVpZ24gb3IgY29ycnVwdGVkIGxvZyBmYWlscyBsb3VkbHkgaW5zdGVhZFxuICogb2YgYmVpbmcgcmVwbGF5ZWQgYXMgYSBgbWVyZ2VgLiBgdmVyYmAsIGBwYXRoYCwgYHJvd2AgYW5kIGBjb21taXRgIG5hbWUgdGhlXG4gKiByb3cgKGBwYXRoYCAvIGByb3dgIC8gYGNvbW1pdGAgYXJlIGFic2VudCB3aGVuIHRoZSBjYWxsZXIgaGFuZGVkIG92ZXIgYVxuICogYmFyZSB2ZXJiKTsgYHBhdGhgIGlzIHRoZSB0cmFjZSdzIG93biBERUxJTS1qb2luZWQgZm9ybSDigJQgdGFrZSBpdCBhcGFydCB3aXRoXG4gKiBgcGF0aFNlZ21lbnRzYC4gVGhlIG1lc3NhZ2UgcXVvdGVzIGB2ZXJiYCBhbmQgYHBhdGhgLCBzbyBhIGhvc3RpbGUgbG9nIGNhbm5vdFxuICogcmVzaGFwZSBpdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFVua25vd25WZXJiRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IHZlcmI6IHVua25vd247XG4gIHJlYWRvbmx5IHBhdGg/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJvdz86IG51bWJlcjtcbiAgcmVhZG9ubHkgY29tbWl0PzogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHZlcmI6IHVua25vd24sIHNpdGU/OiBSb3dTaXRlKSB7XG4gICAgY29uc3QgbmFtZWQgPVxuICAgICAgdHlwZW9mIHZlcmIgPT09ICdzdHJpbmcnID8gSlNPTi5zdHJpbmdpZnkodmVyYikgOiB2ZXJiID09PSB1bmRlZmluZWQgPyAndW5kZWZpbmVkJyA6IGBvZiB0eXBlICR7dHlwZW9mIHZlcmJ9YDtcbiAgICAvLyBUaGUgdmVyYiBhbmQgdGhlIHBhdGggY29tZSBmcm9tIGEgbG9nIG5vYm9keSB2ZXR0ZWQ6IHF1b3RlZCAoSlNPTiksIHNvIGFcbiAgICAvLyBjb250cm9sIGNoYXJhY3RlciBpbiBlaXRoZXIgY2Fubm90IHJlc2hhcGUgdGhlIG1lc3NhZ2UuXG4gICAgY29uc3Qgd2hlcmUgPVxuICAgICAgc2l0ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gJydcbiAgICAgICAgOiBgIG9uIHRyYWNlIHJvdyAke3NpdGUucm93fSAocGF0aCAke0pTT04uc3RyaW5naWZ5KHBhdGhTZWdtZW50cyhzaXRlLnBhdGgpLmpvaW4oJyDigLogJykpfSR7XG4gICAgICAgICAgICBzaXRlLmNvbW1pdCA9PT0gdW5kZWZpbmVkID8gJycgOiBgLCBjb21taXQgJHtzaXRlLmNvbW1pdH1gXG4gICAgICAgICAgfSlgO1xuICAgIGNvbnN0IG9uZSA9IFZFUkJTLmpvaW4oJyB8ICcpO1xuICAgIHN1cGVyKGB1bmtub3duIHZlcmIgJHtuYW1lZH0ke3doZXJlfTogYSBjb21taXQgcm93IGlzIG9uZSBvZiAke29uZX0g4oCUIHRoZSBsb2cgaXMgcmVmdXNlZCwgbm90IHJlcGxheWVkIGFzIGEgbWVyZ2VgKTtcbiAgICB0aGlzLm5hbWUgPSAnVW5rbm93blZlcmJFcnJvcic7XG4gICAgdGhpcy52ZXJiID0gdmVyYjtcbiAgICBpZiAoc2l0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnBhdGggPSBzaXRlLnBhdGg7XG4gICAgICB0aGlzLnJvdyA9IHNpdGUucm93O1xuICAgICAgaWYgKHNpdGUuY29tbWl0ICE9PSB1bmRlZmluZWQpIHRoaXMuY29tbWl0ID0gc2l0ZS5jb21taXQ7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlZnVzZVZlcmIodmVyYjogbmV2ZXIpOiBuZXZlciB7XG4gIHRocm93IG5ldyBVbmtub3duVmVyYkVycm9yKHZlcmIpO1xufVxuXG4vLyDilIDilIDilIAgVGhlIHN0ZXAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogV2hhdCBhIGBkZWxldGVgIHJvdyBsZWF2ZXMgYmVoaW5kOiB0aGUgS0VZIElTIEdPTkUg4oCUIHdoaWNoIGlzIG5vdCB0aGUgdmFsdWVcbiAqIGB1bmRlZmluZWRgIChhIHJvb3QgcmVwbGF5IHJlbW92ZXMgdGhlIGtleTsgYSBwZXItcGF0aCBmb2xkIHJlYWRzIGl0IGFzXG4gKiBgdW5kZWZpbmVkYCkuIHtAbGluayBhcHBseVZlcmJ9IHJldHVybnMgaXQsIHtAbGluayBwbGFjZVZlcmJ9IGFjdHMgb24gaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBBQlNFTlQ6IHVuaXF1ZSBzeW1ib2wgPSBTeW1ib2woJ2Zvb3RwcmludGpzLnZlcmJzLmFic2VudCcpO1xuXG4vKipcbiAqIE9uZSBidW5kbGUncyByZWNvcmRlZCBwYXlsb2FkLCByZWFkIGJ5IHBhdGggdW5kZXIgYSBjbG9uZSBkaXNjaXBsaW5lIOKAlCB0aGVcbiAqIHZhbHVlcyB7QGxpbmsgYXBwbHlWZXJifSByZWFkcyBvdXQgb2YgdGhlIGxvZy5cbiAqXG4gKiBgZGV0YWNoYCDigJQgYHRydWVgIGZvciBldmVyeSBmb2xkIHRoYXQga2VlcHMgaXRzIHJlc3VsdDogYSBgc2V0YCB2YWx1ZSBvciBhblxuICogYGFwcGVuZGAgdGFpbCBpcyBhIGNsb25lIG9mIHdoYXQgdGhlIGxvZyBob2xkcyBhbmQgdGhlIG1lcmdlIGRlbHRhIGNvbWVzIGZyb21cbiAqIE9ORSBkZXRhY2hlZCBjb3B5IG9mIGB1cGRhdGVzYCwgc28gdGhlIHJlc3VsdCBuZXZlciBhbGlhc2VzIHRoZSBsb2cuIGBmYWxzZWBcbiAqIG9ubHkgZm9yIHRoZSBjb21wYXJpc29uIGZvbGQgKHtAbGluayBkcnlGb2xkfSksIHdoaWNoIHBsYWNlcyByZWNvcmRlZCB2YWx1ZXNcbiAqIGFzIHJlY29yZGVkIGFuZCBkcm9wcyBpdHMgcmVzdWx0LlxuICpcbiAqIFRoZSBkZWx0YSBpcyBkZXRhY2hlZCBPTkNFIHBlciBidW5kbGUsIGxhemlseSDigJQgYSBidW5kbGUgd2l0aCBubyBgbWVyZ2VgIHJvd1xuICogcGF5cyBub3RoaW5nLiBgZGVlcFNtYXJ0TWVyZ2VgIGRlZHVwcyBhbiBhcnJheSB1bmlvbiBCWSBSRUZFUkVOQ0UgYW5kIHR3b1xuICogYG1lcmdlYCByb3dzIG9mIG9uZSBidW5kbGUgcmVwbGF5IHRoZSBzYW1lIGFjY3VtdWxhdGVkIGRlbHRhLCBzbyB0aGUgcm93c1xuICogbXVzdCBrZWVwIHNlZWluZyB0aGUgc2FtZSBvYmplY3RzOyBhIGNsb25lIHBlciByb3cgZHVwbGljYXRlZCB0aGVpciBlbGVtZW50c1xuICogKHRoZSBkaWZmZXJlbnRpYWwgY2F1Z2h0IGl0IGluIHRoZSByZXBsYXk7IGBjb21taXRWYWx1ZUF0YCBjYXJyaWVkIHRoZSBidWdcbiAqIHVudGlsIGl0IGZvbGRlZCB0aHJvdWdoIGhlcmUpLiBgb25seWAgbmFycm93cyB0aGUgY29weSB0byBPTkUgcGF0aCDigJQgYVxuICogcGVyLXBhdGggZm9sZCByZWFkcyBub3RoaW5nIGVsc2UsIGFuZCBtdXN0IG5vdCBwYXkgZm9yIHRoZSByZXN0IG9mIHRoZVxuICogYnVuZGxlLlxuICovXG5leHBvcnQgY2xhc3MgUmVjb3JkZWRQYXlsb2FkIHtcbiAgcHJpdmF0ZSBkZWx0YXM6IE1lbW9yeVBhdGNoIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdXBkYXRlczogTWVtb3J5UGF0Y2gsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGV0YWNoOiBib29sZWFuLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb25seT86IHN0cmluZ1tdLFxuICApIHt9XG5cbiAgLyoqIFdoYXQgYSBgc2V0YCBwbGFjZXMgYW5kIGFuIGBhcHBlbmRgIGFkZHM6IGBvdmVyd3JpdGVbcGF0aF1gLCBjbG9uZWQgd2hlbiBkZXRhY2hpbmcuICovXG4gIHZhbHVlKHNlZ3M6IHN0cmluZ1tdKTogdW5rbm93biB7XG4gICAgY29uc3QgcmVjb3JkZWQgPSBuYXRpdmVHZXQodGhpcy5vdmVyd3JpdGUsIHNlZ3MpO1xuICAgIHJldHVybiB0aGlzLmRldGFjaCA/IHN0cnVjdHVyZWRDbG9uZShyZWNvcmRlZCkgOiByZWNvcmRlZDtcbiAgfVxuXG4gIC8qKiBUaGUgYWNjdW11bGF0ZWQgbWVyZ2UgZGVsdGEgYXQgYHBhdGhgOiBgdXBkYXRlc1twYXRoXWAsIGZyb20gdGhlIGJ1bmRsZSdzIG9uZSBjb3B5LiAqL1xuICBkZWx0YShzZWdzOiBzdHJpbmdbXSk6IHVua25vd24ge1xuICAgIGlmICh0aGlzLmRlbHRhcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLm9ubHkgPT09IHVuZGVmaW5lZCA/IHRoaXMudXBkYXRlcyA6IGF0UGF0aCh0aGlzLnVwZGF0ZXMsIHRoaXMub25seSk7XG4gICAgICB0aGlzLmRlbHRhcyA9IHRoaXMuZGV0YWNoID8gc3RydWN0dXJlZENsb25lKHNvdXJjZSkgOiBzb3VyY2U7XG4gICAgfVxuICAgIHJldHVybiBuYXRpdmVHZXQodGhpcy5kZWx0YXMsIHNlZ3MpO1xuICB9XG59XG5cbi8qKiBgdHJlZWAgcmVkdWNlZCB0byBPTkUgcGF0aDogdGhhdCBzdWItdHJlZSwgYnkgcmVmZXJlbmNlLCB1bmRlciBmcmVzaCBjb250YWluZXJzLiAqL1xuZnVuY3Rpb24gYXRQYXRoKHRyZWU6IE1lbW9yeVBhdGNoLCBzZWdzOiBzdHJpbmdbXSk6IE1lbW9yeVBhdGNoIHtcbiAgY29uc3QgbGVhZiA9IG5hdGl2ZUdldCh0cmVlLCBzZWdzKTtcbiAgcmV0dXJuIGxlYWYgPT09IHVuZGVmaW5lZCA/IHt9IDogbmF0aXZlU2V0KHt9LCBzZWdzLCBsZWFmKTtcbn1cblxuLyoqXG4gKiBPTkUgcm93LCBPTkUgc3RlcDogdGhlIHZhbHVlIGF0IHRoZSByb3cncyBwYXRoIEFGVEVSIHRoZSByb3csIGdpdmVuIHRoZVxuICogdmFsdWUgQkVGT1JFIGl0IGFuZCB0aGUgYnVuZGxlJ3MgcmVjb3JkZWQgcGF5bG9hZC4gVEhFIHZlcmIgbGF3IOKAlCBubyBvdGhlclxuICogZnVuY3Rpb24gaW4gdGhlIGxpYnJhcnkgaGFzIGFuIGFybSBwZXIgdmVyYi5cbiAqXG4gKiAgIC0gYCdzZXQnYCAgICDigJQgdGhlIHJlY29yZGVkIHZhbHVlIChgb3ZlcndyaXRlW3BhdGhdYCwgdGhlIGZ1bGwgZmluYWwgdmFsdWUpLlxuICogICAtIGAnbWVyZ2UnYCAg4oCUIGBkZWVwU21hcnRNZXJnZWAgb2YgdGhlIGFjY3VtdWxhdGVkIGB1cGRhdGVzW3BhdGhdYCBkZWx0YSBvbnRvXG4gKiAgICAgdGhlIHZhbHVlIGJlZm9yZS5cbiAqICAgLSBgJ2FwcGVuZCdgIOKAlCAoZGVsdGEgbW9kZSkgYG92ZXJ3cml0ZVtwYXRoXWAgaG9sZHMgT05MWSB0aGUgdGFpbDogY29uY2F0ZW5hdGVcbiAqICAgICBpdCBvbnRvIHRoZSB2YWx1ZSBiZWZvcmUuIFdoZW4gZWl0aGVyIGlzIG5vdCBhbiBhcnJheSAoYW4gb3V0LW9mLW9yZGVyXG4gKiAgICAgcmVwbGF5IGJhc2UsIG9yIGEgUkVEQUNURUQgdGFpbCDigJQgYHNjcnViUGF0Y2hgIHJlcGxhY2VzIG1hdGNoZWQgcGF5bG9hZHNcbiAqICAgICB3aXRoIHRoZSBgJ1JFREFDVEVEJ2Agc3RyaW5nKSB0aGUgdGFpbCBCRUNPTUVTIHRoZSB2YWx1ZSDigJQgdGhlIHNhbWVcbiAqICAgICB0ZXJtaW5hbCB2YWx1ZSBhIHJlZGFjdGVkIG9yIGNvcnJ1cHQgYHNldGAgcHJvZHVjZXMuXG4gKiAgIC0gYCdkZWxldGUnYCDigJQge0BsaW5rIEFCU0VOVH06IHRoZSBrZXkgaXMgcmVtb3ZlZC4gVGhlIHBhdGggc3RheXMgZW51bWVyYXRlZFxuICogICAgIGluIGBvdmVyd3JpdGVgICh2YWx1ZSBgdW5kZWZpbmVkYCkgZm9yIGtleS1zZXQgY29uc3VtZXJzOyB0aGUgc3RlcCBpZ25vcmVzXG4gKiAgICAgdGhhdCB2YWx1ZS5cbiAqXG4gKiBQdXJlOiBpdCByZWFkcyB0aGUgcGF5bG9hZCBhbmQgbmV2ZXIgd3JpdGVzLiBgdmVyYmAgbXVzdCBiZSBhIHtAbGluayBWZXJifVxuICogKHRoZSBmb2xkcyBjaGVjayB3aXRoIHtAbGluayBpc1ZlcmJ9IGZpcnN0IGFuZCBuYW1lIHRoZSByb3cpOyBhbnl0aGluZyBlbHNlXG4gKiB0aGF0IHJlYWNoZXMgaXQgaXMgcmVmdXNlZCB3aXRoIHtAbGluayBVbmtub3duVmVyYkVycm9yfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5VmVyYih2ZXJiOiBWZXJiLCBiZWZvcmU6IHVua25vd24sIGF0OiBSZWNvcmRlZFBheWxvYWQsIHNlZ3M6IHN0cmluZ1tdKTogdW5rbm93biB7XG4gIGlmICh2ZXJiID09PSAnc2V0JykgcmV0dXJuIGF0LnZhbHVlKHNlZ3MpO1xuICBpZiAodmVyYiA9PT0gJ2FwcGVuZCcpIHtcbiAgICBjb25zdCB0YWlsID0gYXQudmFsdWUoc2Vncyk7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYmVmb3JlKSAmJiBBcnJheS5pc0FycmF5KHRhaWwpID8gWy4uLmJlZm9yZSwgLi4udGFpbF0gOiB0YWlsO1xuICB9XG4gIGlmICh2ZXJiID09PSAnZGVsZXRlJykgcmV0dXJuIEFCU0VOVDtcbiAgaWYgKHZlcmIgPT09ICdtZXJnZScpIHJldHVybiBkZWVwU21hcnRNZXJnZShiZWZvcmUsIGF0LmRlbHRhKHNlZ3MpKTtcbiAgcmV0dXJuIHJlZnVzZVZlcmIodmVyYik7IC8vIGB2ZXJiYCBpcyBgbmV2ZXJgIGhlcmUg4oCUIGEgZmlmdGggdmVyYiBpbiB0aGUgdW5pb24gc3RvcHMgY29tcGlsaW5nXG59XG5cbi8qKiBQdXQgYSBzdGVwJ3MgdmFsdWUgYXQgaXRzIHBhdGggaW4gYG91dGAg4oCUIG9yIHJlbW92ZSB0aGUga2V5LCBmb3Ige0BsaW5rIEFCU0VOVH0uICovXG5leHBvcnQgZnVuY3Rpb24gcGxhY2VWZXJiKG91dDogYW55LCBzZWdzOiBzdHJpbmdbXSwgbmV4dDogdW5rbm93bik6IHZvaWQge1xuICBpZiAobmV4dCA9PT0gQUJTRU5UKSBuYXRpdmVEZWxldGUob3V0LCBzZWdzKTtcbiAgZWxzZSBuYXRpdmVTZXQob3V0LCBzZWdzLCBuZXh0KTtcbn1cblxuLyoqXG4gKiBJcyByb3cgYGlgIGEgYHNldGAgdGhhdCB0aGUgTkVYVCByb3cgc2V0cyBhZ2FpbiDigJQgc2FtZSBwYXRoLCBzYW1lIHZlcmIg4oCUIHNvXG4gKiB0aGF0IGFwcGx5aW5nIGl0IGlzIHdvcmsgdGhlIG5leHQgcm93IHJlZG9lcz9cbiAqXG4gKiBUaGUgb25lIHNraXAgZXZlcnkgcmVwbGF5IGl0ZXJhdG9yIHNoYXJlcyAoOS4yMi4xKS4gQSBgc2V0YCByb3cgd3JpdGVzIGFcbiAqIGNsb25lIG9mIHRoZSByZWNvcmRlZCB2YWx1ZSBhdCBpdHMgcGF0aDsgdGhlIG5leHQgcm93LCBhIGBzZXRgIG9mIHRoZSBzYW1lXG4gKiBwYXRoLCB3cml0ZXMgYSBjbG9uZSBvZiB0aGUgU0FNRSByZWNvcmRlZCB2YWx1ZSBvdmVyIGl0ICh0aGUgYnVuZGxlJ3MgcGF0Y2hcbiAqIHRyZWUgaXMgZml4ZWQpLCBhbmQgbm90aGluZyBydW5zIGluIGJldHdlZW4g4oCUIHNvIHRoZSBmaXJzdCB3cml0ZSBpc1xuICogdW5vYnNlcnZhYmxlLCBjb250YWluZXIgY3JlYXRpb24gYW5kIGtleSBvcmRlciBpbmNsdWRlZC4gT25seSBDT05TRUNVVElWRVxuICogcm93cyBxdWFsaWZ5OiBhIHJvdyBpbiBiZXR3ZWVuIChhbiBhbmNlc3RvciBgbWVyZ2VgLCBhIHNpYmxpbmcgYHNldGAgdGhhdFxuICogY3JlYXRlcyBhIGNvbnRhaW5lcikgY2FuIHNlZSB0aGUgaW50ZXJtZWRpYXRlIHZhbHVlLCBhbmQgYSBgbWVyZ2VgLFxuICogYGFwcGVuZGAgb3IgYGRlbGV0ZWAgbmV4dCByb3cgZGVwZW5kcyBvbiB3aGF0IGlzIHRoZXJlLiBSb3dzIGFyZSBuZXZlclxuICogZHJvcHBlZCBmcm9tIHRoZSBsb2cg4oCUIHRoZSA5LjIyLjAgZWxlbWVudC13cml0ZSBmdW5uZWwgcmVjb3JkcyBOXG4gKiB3aG9sZS1hcnJheSBgc2V0YCByb3dzIG9uIG9uZSBwYXRoLCBhbmQgdGhpcyBpcyB3aGF0IG1ha2VzIHJlcGxheWluZyB0aGVtXG4gKiBPKE4pIGluc3RlYWQgb2YgTyhOIMOXIHJvd3MpLlxuICpcbiAqIEFza2VkIGJ5IHtAbGluayBmb2xkUm93c30g4oCUIGxpdmUgc3RhdGUgYW5kIHRoZSByZWRhY3RlZCBtaXJyb3IgdGhyb3VnaFxuICoge0BsaW5rIG5leHRHZW5lcmF0aW9ufSwgYEV2ZW50TG9nLm1hdGVyaWFsaXNlYCBhbmQgYHN0YXRlQXRgIHRocm91Z2hcbiAqIHtAbGluayBhcHBseVNtYXJ0TWVyZ2VJbnRvfSwgdGhlIHB1YmxpYyB7QGxpbmsgYXBwbHlTbWFydE1lcmdlfSwgYW5kIHRoZVxuICogYWRtaXR0ZWQgcmVjb3JkJ3Mge0BsaW5rIGRyeUZvbGR9LiB7QGxpbmsgZm9sZEtleX0gbmVlZHMgbm8gc2tpcDogaXRcbiAqIGFuY2hvcnMgYXQgdGhlIHRvcC1sZXZlbCBrZXkncyBMQVNUIGBzZXRgL2BkZWxldGVgLCBvciAocHJvdmVuYW5jZSkgYVxuICogcmVwZWF0ZWQgYHNldGAgb2YgdGhlIG9uZSByZWNvcmRlZCB2YWx1ZSBjaGFuZ2VzIG5vIGJpcnRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VwZXJzZWRlZEJ5TmV4dFNldChyb3dzOiByZWFkb25seSB7IHBhdGg6IHN0cmluZzsgdmVyYjogc3RyaW5nIH1bXSwgaTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJvdyA9IHJvd3NbaV07XG4gIGlmIChyb3cudmVyYiAhPT0gJ3NldCcpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgbmV4dCA9IHJvd3NbaSArIDFdO1xuICByZXR1cm4gbmV4dCAhPT0gdW5kZWZpbmVkICYmIG5leHQudmVyYiA9PT0gJ3NldCcgJiYgbmV4dC5wYXRoID09PSByb3cucGF0aDtcbn1cblxuLy8g4pSA4pSA4pSAIFRoZSBmb2xkIG92ZXIgb25lIGJ1bmRsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBIb3cge0BsaW5rIGZvbGRSb3dzfSB0cmVhdHMgdGhlIHN0YXRlIGl0IGVkaXRzIGFuZCB0aGUgdmFsdWVzIGl0IHJlYWRzIG91dCBvZlxuICogdGhlIGxvZyDigJQgdGhlIGNsb25lIGRpc2NpcGxpbmUsIGEgcGFyYW1ldGVyIG9mIHRoZSBPTkUgbG9vcDpcbiAqXG4gKiAgIC0gYCdwcml2YXRlJ2Ag4oCUIGBvdXRgIGlzIGEgcHJpdmF0ZSBkZWVwIGNsb25lLCBlZGl0ZWQgaW4gcGxhY2U7IGV2ZXJ5XG4gKiAgICAgcmVjb3JkZWQgdmFsdWUgaXMgY2xvbmVkIGluLiBUaGUgcHVibGljIHtAbGluayBhcHBseVNtYXJ0TWVyZ2V9LlxuICogICAtIGAncGF0aENvcHknYCDigJQgY29weS1vbi13cml0ZSAoOS4yOS4wKTogYmVmb3JlIGEgcm93IHRoYXQgd3JpdGVzIFRIUk9VR0ggYVxuICogICAgIGNvbnRhaW5lciAoYSBuZXN0ZWQgcGF0aCksIHRoZSBjb250YWluZXJzIG9uIGl0cyBwYXRoIHRoYXQgdGhpcyBmb2xkIGRpZFxuICogICAgIG5vdCBjcmVhdGUgYXJlIGNvcGllZCwgc28gbm8gcm93IGVkaXRzIGEgY29udGFpbmVyIGFub3RoZXIgZ2VuZXJhdGlvblxuICogICAgIChvciB0aGUgbG9nKSBob2xkczsgZWFjaCB2YWx1ZSBhIHJvdyBjcmVhdGVzIGlzIG1hcmtlZCBvd25lZCwgc28gbGF0ZXJcbiAqICAgICByb3dzIG9mIHRoZSBidW5kbGUgd3JpdGUgaW50byBpdCBpbiBwbGFjZS4gRXZlcnkgcmVjb3JkZWQgdmFsdWUgaXMgY2xvbmVkXG4gKiAgICAgaW4uIFRoZSBsaXZlIGNvbW1pdCAoe0BsaW5rIG5leHRHZW5lcmF0aW9ufSkgYW5kIHRoZSByZWFkLXNpZGUgZm9sZHNcbiAqICAgICAoe0BsaW5rIGFwcGx5U21hcnRNZXJnZUludG99KS5cbiAqICAgLSBgJ2J5UmVmZXJlbmNlJ2Ag4oCUIGAncGF0aENvcHknYCwgYnV0IHJlY29yZGVkIHZhbHVlcyBhcmUgcGxhY2VkIEFTXG4gKiAgICAgUkVDT1JERUQgKG5vIGNsb25lKSBhbmQgbmV2ZXIgbWFya2VkIG93bmVkIOKAlCBhIGxhdGVyIHJvdyB0aGF0IHdyaXRlc1xuICogICAgIHRocm91Z2ggb25lIGNvcGllcyBpdCBmaXJzdCwgc28gdGhlIHBheWxvYWQgaXMgbmV2ZXIgZWRpdGVkLiBGb3JcbiAqICAgICBDT01QQVJJU09OIG9ubHkgKHtAbGluayBkcnlGb2xkfSk6IHRoZSByZXN1bHQgYWxpYXNlcyB0aGUgbG9nLlxuICovXG5leHBvcnQgdHlwZSBEaXNjaXBsaW5lID0gJ3ByaXZhdGUnIHwgJ3BhdGhDb3B5JyB8ICdieVJlZmVyZW5jZSc7XG5cbi8qKiBEb2VzIGFueSByb3cgd3JpdGUgVEhST1VHSCBhIGNvbnRhaW5lciAoYSBkZWxpbWl0ZWQsIG5lc3RlZCBwYXRoKT8gKi9cbmZ1bmN0aW9uIGhhc05lc3RlZFJvdyhyb3dzOiByZWFkb25seSBUcmFjZUVudHJ5W10pOiBib29sZWFuIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSBpZiAocm93c1tpXS5wYXRoLmluZGV4T2YoREVMSU0pICE9PSAtMSkgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBGb2xkIG9uZSBidW5kbGUncyByb3dzIGludG8gYG91dGAsIGluIHBsYWNlOiBmb3IgZWFjaCByb3cgKGEgYHNldGAgdGhlIG5leHRcbiAqIHJvdyBzZXRzIGFnYWluIGlzIHNraXBwZWQg4oCUIHtAbGluayBzdXBlcnNlZGVkQnlOZXh0U2V0fSkgdGFrZSB0aGUgc3RlcFxuICogKHtAbGluayBhcHBseVZlcmJ9KSBhbmQgcHV0IGl0cyB2YWx1ZSB3aGVyZSBpdCBiZWxvbmdzICh7QGxpbmsgcGxhY2VWZXJifSkuXG4gKiBgb3V0YCBpcyB0aGUgY2FsbGVyJ3Mg4oCUIHNlZSB7QGxpbmsgRGlzY2lwbGluZX0gZm9yIHdoYXQgaXQgbXVzdCBiZS5cbiAqXG4gKiBBIHJvdyB3aG9zZSB2ZXJiIGlzIG5vdCBvbmUgb2Yge0BsaW5rIFZFUkJTfSBzdG9wcyB0aGUgZm9sZCB3aXRoXG4gKiB7QGxpbmsgVW5rbm93blZlcmJFcnJvcn0gbmFtaW5nIHRoZSByb3c7IHRoZSByb3dzIGJlZm9yZSBpdCBoYXZlIGJlZW5cbiAqIGFwcGxpZWQsIHRvIGEgc3RhdGUgdGhlIGNhbGxlciBkaXNjYXJkcyAoZXZlcnkgaW4tdHJlZSBjYWxsZXIgZG9lcykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb2xkUm93cyhcbiAgb3V0OiBhbnksXG4gIHVwZGF0ZXM6IE1lbW9yeVBhdGNoLFxuICBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoLFxuICByb3dzOiByZWFkb25seSBUcmFjZUVudHJ5W10sXG4gIGRpc2NpcGxpbmU6IERpc2NpcGxpbmUsXG4pOiBhbnkge1xuICBjb25zdCBkZXRhY2ggPSBkaXNjaXBsaW5lICE9PSAnYnlSZWZlcmVuY2UnO1xuICBjb25zdCBvd25lZCA9IGRpc2NpcGxpbmUgIT09ICdwcml2YXRlJyAmJiBoYXNOZXN0ZWRSb3cocm93cykgPyBuZXcgV2Vha1NldDxvYmplY3Q+KCkgOiB1bmRlZmluZWQ7XG4gIG93bihvdXQsIG93bmVkKTtcbiAgY29uc3QgYXQgPSBuZXcgUmVjb3JkZWRQYXlsb2FkKHVwZGF0ZXMsIG92ZXJ3cml0ZSwgZGV0YWNoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHN1cGVyc2VkZWRCeU5leHRTZXQocm93cywgaSkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IHsgcGF0aCwgdmVyYiB9ID0gcm93c1tpXTtcbiAgICBpZiAoIWlzVmVyYih2ZXJiKSkgdGhyb3cgbmV3IFVua25vd25WZXJiRXJyb3IodmVyYiwgeyBwYXRoLCByb3c6IGkgfSk7XG4gICAgY29uc3Qgc2VncyA9IHBhdGguc3BsaXQoREVMSU0pO1xuICAgIGlmIChvd25lZCAhPT0gdW5kZWZpbmVkICYmIHNlZ3MubGVuZ3RoID4gMSkgb3duU3BpbmUob3V0LCBzZWdzLCBvd25lZCk7XG4gICAgLy8gQSB0b3RhbCB2ZXJiIHJlYWRzIG5vdGhpbmcgZnJvbSB3aGF0IGNhbWUgYmVmb3JlIGl0IChpc1RvdGFsKSDigJQgc28gdGhlXG4gICAgLy8gZm9sZCBkb2VzIG5vdCBsb29rLlxuICAgIGNvbnN0IG5leHQgPSBhcHBseVZlcmIodmVyYiwgaXNUb3RhbCh2ZXJiKSA/IHVuZGVmaW5lZCA6IG5hdGl2ZUdldChvdXQsIHNlZ3MpLCBhdCwgc2Vncyk7XG4gICAgLy8gQSB2YWx1ZSB0aGlzIGZvbGQgQ1JFQVRFRCBpcyBpdHMgb3duIHRvIGVkaXQgaW4gcGxhY2U7IGEgcmVjb3JkZWQgdmFsdWVcbiAgICAvLyBwbGFjZWQgYnkgcmVmZXJlbmNlIGlzIHRoZSBsb2cncy5cbiAgICBpZiAoZGV0YWNoIHx8IHZlcmIgPT09ICdtZXJnZScpIG93bihuZXh0LCBvd25lZCk7XG4gICAgcGxhY2VWZXJiKG91dCwgc2VncywgbmV4dCk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBBcHBsaWVzIGEgY29tbWl0IGJ1bmRsZSB0byBhIGJhc2Ugc3RhdGUgYnkgcmVwbGF5aW5nIG9wZXJhdGlvbnMgaW4gb3JkZXIuXG4gKiBHdWFyYW50ZWVzIFwibGFzdCB3cml0ZXIgd2luc1wiIHNlbWFudGljcy5cbiAqXG4gKiBSZXR1cm5zIGEgRlVMTFkgREVUQUNIRUQgcmVzdWx0OiB0aGUgYmFzZSBpcyBkZWVwLWNsb25lZCBmaXJzdCBhbmQgZXZlcnlcbiAqIHZhbHVlIHRoZSByZXBsYXkgd3JpdGVzIGlzIGl0cyBvd24gKGBzZXRgIC8gYGFwcGVuZGAgY2xvbmUgdGhlIHJlY29yZGVkXG4gKiB2YWx1ZTsgdGhlIGBtZXJnZWAgYXJtIHJlYWRzIGEgZGV0YWNoZWQgY29weSBvZiBgdXBkYXRlc2ApLCBzbyB0aGUgcmVzdWx0XG4gKiBzaGFyZXMgbm8gY29udGFpbmVyIHdpdGggYGJhc2VgLCBgdXBkYXRlc2Agb3IgYG92ZXJ3cml0ZWAuIFRoaXMgaXMgdGhlXG4gKiBwdWJsaWMgKGBmb290cHJpbnRqcy90cmFjZWA7IGFsc28gYC9hZHZhbmNlZGAgdW50aWwgMTAuMC4wKSBjb250cmFjdCwgdW5jaGFuZ2VkIGJ5IGNvcHktb24td3JpdGVcbiAqICg5LjI5LjApIOKAlCBieXRlLWlkZW50aWNhbCB0byA5LjI4LjAgZm9yIGV2ZXJ5IGNhbGxlci4gVGhlIGVuZ2luZSdzIG93blxuICogY29tbWl0IGRvZXMgTk9UIGNvbWUgaGVyZTogYFNoYXJlZE1lbW9yeS5hcHBseVBhdGNoYCBidWlsZHMgdGhlIG5leHRcbiAqIGdlbmVyYXRpb24gd2l0aCBgbmV4dEdlbmVyYXRpb25gLCB3aGljaCBjb3BpZXMgb25seSB0aGUgd3JpdHRlblxuICogcGF0aHMuIEJvdGggcnVuIHRoZSBPTkUgZm9sZCwge0BsaW5rIGZvbGRSb3dzfTsgdGhlIHZlcmJzIGFyZVxuICoge0BsaW5rIGFwcGx5VmVyYn0ncy5cbiAqXG4gKiBWZXJiIGFybXMg4oCUIHNlZSB7QGxpbmsgYXBwbHlWZXJifS4gQSByb3cgd2l0aCBhbnkgb3RoZXIgdmVyYiB0aHJvd3NcbiAqIHtAbGluayBVbmtub3duVmVyYkVycm9yfS5cbiAqXG4gKiBXb3JrLCBub3QgYnl0ZXMgKDkuMjIuMSk6IGEgYHNldGAgcm93IHRoZSBORVhUIHJvdyByZS1zZXRzIGlzIHNraXBwZWRcbiAqICh7QGxpbmsgc3VwZXJzZWRlZEJ5TmV4dFNldH0pIOKAlCB0aGUgcm93cyBzdGF5IGluIHRoZSBsb2csIG9ubHkgdGhlIGNsb25lXG4gKiBlYWNoIHdvdWxkIGhhdmUgcGFpZCBpcyBub3QuIEV2ZXJ5IGNvbnN1bWVyIGluaGVyaXRzIHRoZSBza2lwIGZyb21cbiAqIGBmb2xkUm93c2A7IHRoZXJlIGlzIG5vIHNlY29uZCByZXBsYXkgbG9vcCB0byBrZWVwIGluIHN0ZXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVNtYXJ0TWVyZ2UoYmFzZTogYW55LCB1cGRhdGVzOiBNZW1vcnlQYXRjaCwgb3ZlcndyaXRlOiBNZW1vcnlQYXRjaCwgdHJhY2U6IFRyYWNlRW50cnlbXSk6IGFueSB7XG4gIHJldHVybiBmb2xkUm93cyhzdHJ1Y3R1cmVkQ2xvbmUoYmFzZSksIHVwZGF0ZXMsIG92ZXJ3cml0ZSwgdHJhY2UsICdwcml2YXRlJyk7XG59XG5cbi8qKlxuICogVGhlIGVuZ2luZSdzIGNvbW1pdCAoY29weS1vbi13cml0ZSwgOS4yOS4wIOKAlCBkb2NzL2Rlc2lnbi8yMDI2LTEwLWNvcHktb24tXG4gKiB3cml0ZS1jb21taXQubWQpOiB0aGUgTkVYVCBjb21taXR0ZWQgZ2VuZXJhdGlvbi4gQSBjb3B5IG9mIGBiYXNlYCdzIFJPT1RcbiAqIHBsdXMgYSBjb3B5IG9mIGV2ZXJ5IGNvbnRhaW5lciBvbiBlYWNoIHdyaXR0ZW4gcGF0aDsgZXZlcnkgb3RoZXIgc3VidHJlZVxuICogaXMgU0hBUkVEIHdpdGggYGJhc2VgLCB3aGljaCBpcyBuZXZlciBlZGl0ZWQg4oCUIGNvbW1pdHRlZCBzdGF0ZSBpc1xuICogaW1tdXRhYmxlLWFmdGVyLXN3YXAsIHNvIHNoYXJpbmcgaXMgc2FmZSwgYW5kIGEgY29tbWl0IGNvc3RzIE8od2hhdCBpdFxuICogd3JvdGUpLCBub3QgTyhzdGF0ZSkuIGBTaGFyZWRNZW1vcnkuYXBwbHlQYXRjaGAgKGxpdmUgc3RhdGUgYW5kIHRoZVxuICogcmVkYWN0ZWQgbWlycm9yKSBpcyBpdHMgY2FsbGVyLiBJbnRlcm5hbDogdGhlIHB1YmxpYyByZXBsYXkgaXNcbiAqIHtAbGluayBhcHBseVNtYXJ0TWVyZ2V9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmV4dEdlbmVyYXRpb24oYmFzZTogYW55LCB1cGRhdGVzOiBNZW1vcnlQYXRjaCwgb3ZlcndyaXRlOiBNZW1vcnlQYXRjaCwgdHJhY2U6IFRyYWNlRW50cnlbXSk6IGFueSB7XG4gIHJldHVybiBmb2xkUm93cyhvd25lZFJvb3RPZihiYXNlKSwgdXBkYXRlcywgb3ZlcndyaXRlLCB0cmFjZSwgJ3BhdGhDb3B5Jyk7XG59XG5cbi8qKlxuICogVGhlIHNhbWUgcmVwbGF5LCBJTlRPIGB0YXJnZXRgIOKAlCBubyBjbG9uZSBvZiBpdHMgb3duLiBGb3IgYSBjYWxsZXIgdGhhdFxuICogYWxyZWFkeSBob2xkcyBhIHByaXZhdGUgd29ya2luZyBjb3B5ICh0aGUgcmVhZC1zaWRlIGZvbGRzOiBgc3RhdGVBdGAgaW5cbiAqIGB0aW1lLXRyYXZlbC9zdGF0ZUF0LnRzYCBhbmQgYEV2ZW50TG9nLm1hdGVyaWFsaXNlYCBjbG9uZSB0aGVpciBiYXNlIE9OQ0VcbiAqIGFuZCB0aGVuIGFwcGx5IGV2ZXJ5IGJ1bmRsZSBoZXJlKSwgc28gYSBmb2xkIG92ZXIgTiBidW5kbGVzIGNvc3RzIE4gcm93XG4gKiBhcHBsaWNhdGlvbnMsIG5vdCBOIGNsb25lcyBvZiB0aGUgd2hvbGUgc3RhdGUuIE5ldmVyIGhhbmQgaXQgY29tbWl0dGVkXG4gKiBzdGF0ZTogaXQgbXV0YXRlcyB0aGUgUk9PVCBpbiBwbGFjZS4gQmVsb3cgdGhlIHJvb3QgaXQgZm9sbG93cyB0aGUgbGl2ZVxuICogY29tbWl0J3MgbGF3ICh7QGxpbmsgbmV4dEdlbmVyYXRpb259KSDigJQgYSBjb250YWluZXIgdGhpcyBjYWxsIGRpZCBub3RcbiAqIGNyZWF0ZSBpcyBjb3BpZWQgYmVmb3JlIGEgd3JpdGUgcGFzc2VzIHRocm91Z2ggaXQg4oCUIHNvIGEgZm9sZCBhbmQgdGhlIGxpdmVcbiAqIHN0YXRlIGdpdmUgdGhlIHNhbWUgdmFsdWUgYXQgZXZlcnkgcGF0aCwgYWxpYXNlZCBzdWJ0cmVlcyBpbmNsdWRlZC5cbiAqIFRoZSB2YWx1ZXMgaXQgd3JpdGVzIGFyZSBpdHMgb3duLCBzbyBgdGFyZ2V0YCBuZXZlciBhbGlhc2VzIHRoZSBsb2cuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVNtYXJ0TWVyZ2VJbnRvKFxuICB0YXJnZXQ6IGFueSxcbiAgdXBkYXRlczogTWVtb3J5UGF0Y2gsXG4gIG92ZXJ3cml0ZTogTWVtb3J5UGF0Y2gsXG4gIHRyYWNlOiBUcmFjZUVudHJ5W10sXG4pOiBhbnkge1xuICByZXR1cm4gZm9sZFJvd3ModGFyZ2V0LCB1cGRhdGVzLCBvdmVyd3JpdGUsIHRyYWNlLCAncGF0aENvcHknKTtcbn1cblxuLyoqXG4gKiBUaGUgZm9sZCwgZm9yIENPTVBBUklTT04gb25seSAoOS4zMC4wIOKAlCB0aGUgYWRtaXR0ZWQgcmVjb3JkKTogYGJhc2VgIHdpdGhcbiAqIHRoZSBidW5kbGUgcmVwbGF5ZWQgYnkgdGhlIG9uZSB2ZXJiIGxhdywgY29weS1vbi13cml0ZSBiZWxvdyB0aGUgcm9vdCxcbiAqIGV2ZXJ5IHJlY29yZGVkIHZhbHVlIHBsYWNlZCBCWSBSRUZFUkVOQ0Ug4oCUIG5vIGNsb25lLCBzbyBpdCBjb3N0cyB3aGF0IHRoZVxuICogYnVuZGxlIHdyb3RlIGFuZCBub3RoaW5nIG1vcmUuIEl0IGFsaWFzZXMgdGhlIHBheWxvYWQgYW5kIGV2ZXJ5IHN1YnRyZWUgb2ZcbiAqIGBiYXNlYCB0aGUgYnVuZGxlIGRpZCBub3Qgd3JpdGUsIGFuZCBlZGl0cyBuZWl0aGVyLiBOZXZlciBoYW5kIGl0IG91dCxcbiAqIHN0b3JlIGl0IG9yIHdyaXRlIHRocm91Z2ggaXQ6IGBUcmFuc2FjdGlvbkJ1ZmZlcmAgYnVpbGRzIG9uZSB0byBhc2sgd2hldGhlclxuICogYSBidW5kbGUgZm9sZHMgYmFjayB0byB3aGF0IHRoZSBzdGFnZSByZWFkLCB0aGVuIGRyb3BzIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZHJ5Rm9sZChiYXNlOiBhbnksIHVwZGF0ZXM6IE1lbW9yeVBhdGNoLCBvdmVyd3JpdGU6IE1lbW9yeVBhdGNoLCB0cmFjZTogVHJhY2VFbnRyeVtdKTogYW55IHtcbiAgcmV0dXJuIGZvbGRSb3dzKG93bmVkUm9vdE9mKGJhc2UpLCB1cGRhdGVzLCBvdmVyd3JpdGUsIHRyYWNlLCAnYnlSZWZlcmVuY2UnKTtcbn1cblxuLy8g4pSA4pSA4pSAIFRoZSBmb2xkIG92ZXIgb25lIGtleSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBPbmUgcm93IG9mIHRoZSBsb2cgdW5kZXIgdGhlIGZvbGRlZCBrZXkncyBUT1AtTEVWRUwga2V5IOKAlCB3aGF0IHtAbGluayBmb2xkS2V5fVxuICogYXBwbGllcywgaW4gY29tbWl0IG9yZGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvdWNoIHtcbiAgcmVhZG9ubHkgdmVyYjogVmVyYjtcbiAgcmVhZG9ubHkgYnVuZGxlOiBDb21taXRCdW5kbGU7XG4gIC8qKiBUaGUgYnVuZGxlJ3MgcG9zaXRpb24gaW4gdGhlIGNvbW1pdCBsb2cuICovXG4gIHJlYWRvbmx5IGNvbW1pdElkeDogQ29tbWl0SWR4O1xuICAvKiogVGhlIHJvdydzIG93biBwYXRoIChERUxJTS1qb2luZWQgYFRyYWNlRW50cnkucGF0aGApLiAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBIb3cgdGhlIHJvdyBzaXRzIGFnYWluc3QgdGhlIGZvbGRlZCBrZXkgKGBrZXlQYXRocyDCtyByZWxhdGlvbmApLiBBQlNFTlQgZm9yIGFcbiAgICogcm93IG9uIGFub3RoZXIgcGF0aCB1bmRlciB0aGUgc2FtZSB0b3AtbGV2ZWwga2V5OiBzdWNoIGEgcm93IGlzIEFQUExJRUQgKGFuXG4gICAqIGFycmF5IHVuaW9uIG9uIGEgY29udGFpbmVyIGFib3ZlIHRoZSBrZXkgZGVkdXBzIHRoZSB3aG9sZSBhcnJheSwgc28gYSBzaWJsaW5nXG4gICAqIGNoYW5nZXMgd2hlcmUgaXQgbGVhdmVzIHRoZSBrZXkpIGJ1dCBuZXZlciBvYnNlcnZlZC5cbiAgICovXG4gIHJlYWRvbmx5IHJlbGF0aW9uPzogUGF0aFJlbGF0aW9uO1xufVxuXG4vKiogV2hhdCBhIHJlYWRlciBhc2tzIG9mIHtAbGluayBmb2xkS2V5fS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS2V5Rm9sZCB7XG4gIC8qKlxuICAgKiBTdGFydCBhdCB0aGUgTEFTVCByb3cgdGhhdCBzZXRzIG9yIGRlbGV0ZXMgdGhlIHdob2xlIFRPUC1MRVZFTCBrZXkgKHtAbGlua1xuICAgKiBpc1RvdGFsfSwgb24gdGhlIHJvb3QgcGF0aCBpdHNlbGYpIOKAlCByb3dzIGJlZm9yZSBpdCBjYW5ub3QgY2hhbmdlIGFueXRoaW5nXG4gICAqIHVuZGVyIHRoYXQga2V5LCBzbyBhIHJlYWRlciB0aGF0IHdhbnRzIG9ubHkgdGhlIHZhbHVlIHNraXBzIHRoZW0uIEEgYHNldGAgb2ZcbiAgICogYSBwYXRoIGJlbG93IHRoZSByb290IGlzIE5PVCBhbiBhbmNob3I6IGFuIGVhcmxpZXIgc2libGluZyBjYW4gc3RpbGwgbW92ZVxuICAgKiB0aGUga2V5IHRocm91Z2ggYSBsYXRlciB1bmlvbi4gT2ZmIGJ5IGRlZmF1bHQ6IGEgcmVhZGVyIHRoYXQgdHJhY2tzIGhvdyB0aGVcbiAgICogdmFsdWUgR1JFVyBtdXN0IHNlZSBldmVyeSByb3cuXG4gICAqL1xuICByZWFkb25seSBhbmNob3JlZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDYWxsZWQgYWZ0ZXIgZWFjaCBhcHBsaWVkIHJvdyB0aGF0IGhhcyBhIHtAbGluayBUb3VjaC5yZWxhdGlvbn0g4oCUIG9uLCBpbnNpZGVcbiAgICogb3IgYXJvdW5kIHRoZSBrZXkgKGV2ZXJ5IHJvdywgd2l0aCBgZXZlcnlSb3dgKSDigJQgd2l0aCB0aGUgdmFsdWUgQVQgVEhFIEtFWSBiZWZvcmUgaXQgYW5kIGFmdGVyIGl0XG4gICAqIChgdW5kZWZpbmVkYCBmb3IgYW4gYWJzZW50IGtleSkuIFRoZSBzZWFtIGEgcHJvdmVuYW5jZSB0cmFjayBhbmQgdGhlIHdyaXRlclxuICAgKiBydWxlIGhhbmcgb246IHRoZXkgd2F0Y2ggdGhlIGZvbGQsIHRoZXkgbmV2ZXIgaGF2ZSBhIHZlcmIgc3dpdGNoIG9mIHRoZWlyXG4gICAqIG93bi4gRm9yIGEgcm93IElOU0lERSB0aGUga2V5LCBhbiBhcnJheSBgYmVmb3JlYCBpcyBhIHNoYWxsb3cgc25hcHNob3Q6IHRoYXRcbiAgICogcm93IGVkaXRzIHRoZSBmb2xkJ3Mgb3duIGNvcHkgaW4gcGxhY2UuXG4gICAqL1xuICByZWFkb25seSBvYnNlcnZlPzogKHRvdWNoOiBUb3VjaCwgYmVmb3JlOiB1bmtub3duLCBhZnRlcjogdW5rbm93bikgPT4gdm9pZDtcbiAgLyoqXG4gICAqIE9ic2VydmUgRVZFUlkgYXBwbGllZCByb3csIG5vdCBvbmx5IHRoZSBrZXkncyBvd24uIFRoZSB3cml0ZXIgcnVsZSBuZWVkcyBpdDogaXQgY29tcGFyZXMgdGhlIHZhbHVlIGF0IHRoZVxuICAgKiBrZXkgYWNyb3NzIGEgV0hPTEUgY29tbWl0LCBhbmQgYSBzaWJsaW5nIHVuZGVyIHRoZSBzYW1lIHRvcC1sZXZlbCBrZXkgY2FuIG1vdmUgdGhhdCB2YWx1ZSDigJQgYSB3cml0ZVxuICAgKiB0aHJvdWdoIGEgY29udGFpbmVyIHRoYXQgaG9sZHMgYSBwcmltaXRpdmUgcmVwbGFjZXMgdGhlIGNvbnRhaW5lciAoYG5hdGl2ZVNldGApLCBhbmQgd2l0aCBpdCB0aGUga2V5LlxuICAgKi9cbiAgcmVhZG9ubHkgZXZlcnlSb3c/OiBib29sZWFuO1xuICAvKipcbiAgICogS2VlcCBHRU5FUkFUSU9OUyBhdCBjaG9zZW4gY29tbWl0czogYGF0YCBpcyBhc2tlZCBiZWZvcmUgYSBjb21taXQncyBmaXJzdCByb3cgKHdpdGggdGhlIGZvbGQncyBzdGF0ZSBhc1xuICAgKiBpdCBzdGFuZHMpOyBmb3IgYSBjb21taXQgaXQgYWNjZXB0cywgYGtlZXBgIGlzIGhhbmRlZCB0aGUgdmFsdWUgYXQgdGhlIGtleSBiZWZvcmUgdGhlIGNvbW1pdCBhbmQgYWZ0ZXJcbiAgICogaXQg4oCUIGNvcHktb24td3JpdGUgYXJvdW5kIHRoYXQgY29tbWl0ICh0aGUgZm9sZCBkcm9wcyBvd25lcnNoaXAgb2YgZXZlcnkgY29udGFpbmVyIGJlZm9yZSBhbmQgYWZ0ZXIgaXQpLFxuICAgKiBzbyBubyBsYXRlciByb3cgZWRpdHMgZWl0aGVyIHZhbHVlLiBUaGUgd3JpdGVyIHJ1bGUncyBtZW1vaXNlZCByb290IGZvbGQgKGBjb21taXRMb2dVdGlscyDCtyBMb2dNb2RlbGApXG4gICAqIGtlZXBzIHRoZSBjb21taXRzIGEga2V5J3MgdmVyZGljdCBuZWVkcywgb25jZSBwZXIgdG9wLWxldmVsIGtleS5cbiAgICovXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgdGhlIHRvcC1sZXZlbCBrZXkgaG9sZHMgQkVGT1JFIHRoZSBmaXJzdCByb3cg4oCUIGRlZmF1bHQ6IGFic2VudC4gTmV2ZXIgZWRpdGVkOiB0aGUgZm9sZCBjb3BpZXNcbiAgICogaXQgYmVmb3JlIHdyaXRpbmcgdGhyb3VnaCBpdC4gYGNvbW1pdFZhbHVlQXRgIG9uIGEgbWVtb2lzZWQgbG9nIHN0YXJ0cyBmcm9tIGEga2VwdCBnZW5lcmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnQ/OiB1bmtub3duO1xuICByZWFkb25seSBnZW5lcmF0aW9ucz86IHtcbiAgICBhdChjb21taXRJZHg6IG51bWJlciwgc3RhdGU6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pik6IGJvb2xlYW47XG4gICAga2VlcChjb21taXRJZHg6IG51bWJlciwgYmVmb3JlOiB1bmtub3duLCBhZnRlcjogdW5rbm93bik6IHZvaWQ7XG4gIH07XG59XG5cbi8qKlxuICogVGhlIHZhbHVlIG9mIE9ORSBrZXkgYWZ0ZXIgYHRvdWNoZXNgIOKAlCBFVkVSWSByb3cgdW5kZXIgaXRzIHRvcC1sZXZlbCBrZXksIGluXG4gKiBjb21taXQgb3JkZXIsIGVhY2ggYWxyZWFkeSBjaGVja2VkIHdpdGgge0BsaW5rIGlzVmVyYn0g4oCUIGZvbGRlZCBmcm9tIGFuIGFic2VudFxuICoga2V5LCByZWFkIGF0IHRoZSBrZXkgKGBzZWdzYCwgaXRzIERFTElNIHNlZ21lbnRzKTogdGhlIHZhbHVlIHJ1bGUgb2ZcbiAqIGBrZXlQYXRocy50c2AsIHRoZSBmb2xkIGBzdGF0ZUF0YCBkb2VzIHJlc3RyaWN0ZWQgdG8gb25lIHRvcC1sZXZlbCBrZXkuIFRvcC1sZXZlbFxuICoga2V5cyBuZXZlciBpbnRlcmFjdCB1bmRlciB0aGUgc3RlcCwgc28gdGhlIHJlc3RyaWN0aW9uIGlzIGV4YWN0LlxuICpcbiAqIFRoZSBzYW1lIHN0ZXAgKHtAbGluayBhcHBseVZlcmJ9KSBhbmQgdGhlIHNhbWUgZGlzY2lwbGluZSBhcyB7QGxpbmsgZm9sZFJvd3N9J3NcbiAqIGAncGF0aENvcHknYDogYHNldGAgLyBgYXBwZW5kYCB2YWx1ZXMgYXJlIGNsb25lcywgdGhlIG1lcmdlIGRlbHRhIGlzIGRldGFjaGVkXG4gKiBvbmNlIHBlciBCVU5ETEUgKG5hcnJvd2VkIHRvIHRoZSB0b3AtbGV2ZWwga2V5KSwgc28gdHdvIGBtZXJnZWAgcm93cyBvZiBvbmVcbiAqIGJ1bmRsZSBzZWUgdGhlIHNhbWUgb2JqZWN0cywgYW5kIGEgcm93IHRoYXQgd3JpdGVzIHRocm91Z2ggYSBjb250YWluZXIgdGhpc1xuICogZm9sZCBkaWQgbm90IGNyZWF0ZSBjb3BpZXMgaXQgZmlyc3QuIFJldHVybnMgYHVuZGVmaW5lZGAgZm9yIGFuIGFic2VudCBrZXkuXG4gKiBPKHRoZSByb3dzIHVuZGVyIHRoZSBrZXkncyB0b3AtbGV2ZWwga2V5KSwgbm90IE8odGhlIGxvZykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb2xkS2V5KHRvdWNoZXM6IHJlYWRvbmx5IFRvdWNoW10sIHNlZ3M6IHN0cmluZ1tdLCBvcHRpb25zOiBLZXlGb2xkID0ge30pOiB1bmtub3duIHtcbiAgY29uc3Qgcm9vdCA9IHNlZ3NbMF07XG4gIGxldCBmcm9tID0gMDtcbiAgaWYgKG9wdGlvbnMuYW5jaG9yZWQgPT09IHRydWUpIHtcbiAgICBmb3IgKGxldCBpID0gdG91Y2hlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgaWYgKGlzVG90YWwodG91Y2hlc1tpXS52ZXJiKSAmJiB0b3VjaGVzW2ldLnBhdGggPT09IHJvb3QpIHtcbiAgICAgICAgZnJvbSA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCBzdGF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgaWYgKG9wdGlvbnMuc3RhcnQgIT09IHVuZGVmaW5lZCkgc3RhdGVbcm9vdF0gPSBvcHRpb25zLnN0YXJ0O1xuICBsZXQgb3duZWQgPSBuZXcgV2Vha1NldDxvYmplY3Q+KCk7XG4gIG93bmVkLmFkZChzdGF0ZSk7XG4gIGNvbnN0IG9ic2VydmUgPSBvcHRpb25zLm9ic2VydmU7XG4gIGNvbnN0IGdlbmVyYXRpb25zID0gb3B0aW9ucy5nZW5lcmF0aW9ucztcbiAgbGV0IGtlcHQgPSAtMTtcbiAgbGV0IGtlcHRCZWZvcmU6IHVua25vd247XG4gIC8qKiBEcm9wIG93bmVyc2hpcCBvZiBldmVyeSBjb250YWluZXI6IHRoZSBuZXh0IHdyaXRlIHRocm91Z2ggb25lIGNvcGllcyBpdCwgc28gYSBrZXB0IHZhbHVlIHN0YXlzIGFzIGl0IGlzLiAqL1xuICBjb25zdCByZWxlYXNlID0gKCkgPT4ge1xuICAgIG93bmVkID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuICAgIG93bmVkLmFkZChzdGF0ZSk7XG4gIH07XG4gIGxldCBhdDogUmVjb3JkZWRQYXlsb2FkIHwgdW5kZWZpbmVkO1xuICBsZXQgYXRDb21taXQgPSAtMTtcbiAgZm9yIChsZXQgaSA9IGZyb207IGkgPCB0b3VjaGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgdG91Y2ggPSB0b3VjaGVzW2ldO1xuICAgIGlmIChhdCA9PT0gdW5kZWZpbmVkIHx8IHRvdWNoLmNvbW1pdElkeCAhPT0gYXRDb21taXQpIHtcbiAgICAgIGlmIChrZXB0ICE9PSAtMSkge1xuICAgICAgICBnZW5lcmF0aW9ucyEua2VlcChrZXB0LCBrZXB0QmVmb3JlLCBuYXRpdmVHZXQoc3RhdGUsIHNlZ3MpKTtcbiAgICAgICAga2VwdCA9IC0xO1xuICAgICAgICByZWxlYXNlKCk7XG4gICAgICB9XG4gICAgICBpZiAoZ2VuZXJhdGlvbnMgIT09IHVuZGVmaW5lZCAmJiBnZW5lcmF0aW9ucy5hdCh0b3VjaC5jb21taXRJZHgsIHN0YXRlKSkge1xuICAgICAgICByZWxlYXNlKCk7XG4gICAgICAgIGtlcHQgPSB0b3VjaC5jb21taXRJZHg7XG4gICAgICAgIGtlcHRCZWZvcmUgPSBuYXRpdmVHZXQoc3RhdGUsIHNlZ3MpO1xuICAgICAgfVxuICAgICAgYXQgPSBuZXcgUmVjb3JkZWRQYXlsb2FkKHRvdWNoLmJ1bmRsZS51cGRhdGVzLCB0b3VjaC5idW5kbGUub3ZlcndyaXRlLCB0cnVlLCBbcm9vdF0pO1xuICAgICAgYXRDb21taXQgPSB0b3VjaC5jb21taXRJZHg7XG4gICAgfVxuICAgIGNvbnN0IHJvd1NlZ3MgPSB0b3VjaC5wYXRoID09PSByb290ID8gW3Jvb3RdIDogdG91Y2gucGF0aC5zcGxpdChERUxJTSk7XG4gICAgY29uc3Qgd2F0Y2hlZCA9IG9ic2VydmUgIT09IHVuZGVmaW5lZCAmJiAodG91Y2gucmVsYXRpb24gIT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLmV2ZXJ5Um93ID09PSB0cnVlKTtcbiAgICBsZXQgYmVmb3JlOiB1bmtub3duO1xuICAgIGlmICh3YXRjaGVkKSB7XG4gICAgICBiZWZvcmUgPSBuYXRpdmVHZXQoc3RhdGUsIHNlZ3MpO1xuICAgICAgaWYgKHRvdWNoLnJlbGF0aW9uID09PSAnaW5zaWRlJyAmJiBBcnJheS5pc0FycmF5KGJlZm9yZSkpIGJlZm9yZSA9IGJlZm9yZS5zbGljZSgpO1xuICAgIH1cbiAgICBpZiAocm93U2Vncy5sZW5ndGggPiAxKSBvd25TcGluZShzdGF0ZSwgcm93U2Vncywgb3duZWQpO1xuICAgIC8vIEEgdG90YWwgdmVyYiByZWFkcyBub3RoaW5nIGZyb20gd2hhdCBjYW1lIGJlZm9yZSBpdCAoaXNUb3RhbCkuXG4gICAgY29uc3QgbmV4dCA9IGFwcGx5VmVyYih0b3VjaC52ZXJiLCBpc1RvdGFsKHRvdWNoLnZlcmIpID8gdW5kZWZpbmVkIDogbmF0aXZlR2V0KHN0YXRlLCByb3dTZWdzKSwgYXQsIHJvd1NlZ3MpO1xuICAgIG93bihuZXh0LCBvd25lZCk7XG4gICAgcGxhY2VWZXJiKHN0YXRlLCByb3dTZWdzLCBuZXh0KTtcbiAgICBpZiAod2F0Y2hlZCkgb2JzZXJ2ZSh0b3VjaCwgYmVmb3JlLCBuYXRpdmVHZXQoc3RhdGUsIHNlZ3MpKTtcbiAgfVxuICBpZiAoa2VwdCAhPT0gLTEpIGdlbmVyYXRpb25zIS5rZWVwKGtlcHQsIGtlcHRCZWZvcmUsIG5hdGl2ZUdldChzdGF0ZSwgc2VncykpO1xuICByZXR1cm4gbmF0aXZlR2V0KHN0YXRlLCBzZWdzKTtcbn1cbiJdfQ==
@@ -36,6 +36,8 @@ export type { WalkerItem, WalkerOptions } from './lib/engine/walkSubflowSpec.js'
36
36
  export { walkSubflowSpec } from './lib/engine/walkSubflowSpec.js';
37
37
  export { pathSegments } from './lib/memory/utils.js';
38
38
  export { UnknownVerbError } from './lib/memory/index.js';
39
+ export type { CommitBundle, MemoryPatch, TraceEntry } from './lib/memory/types.js';
40
+ export { applySmartMerge } from './lib/memory/verbs.js';
39
41
  export type { ValueBasis, ValueBasisOptions, ValueWithBasis, WriterBasis, WriterWithBasis, } from './lib/memory/commitLogUtils.js';
40
42
  export { buildCommitIndex, commitIndexOf, commitValueAt, commitValueAtWithBasis, findCommit, findCommits, findLastWriter, findLastWriterWithBasis, inferLegacyPhases, recordsPhases, } from './lib/memory/commitLogUtils.js';
41
43
  export type { CommitPhase } from './lib/memory/types.js';