footprintjs 9.46.0 → 9.46.1

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 (56) hide show
  1. package/CLAUDE.md +6 -6
  2. package/dist/esm/lib/decide/evaluator.js +2 -2
  3. package/dist/esm/lib/decide/evidence.js +2 -2
  4. package/dist/esm/lib/engine/handlers/servedPause.js +2 -2
  5. package/dist/esm/lib/memory/RecordFrame.d.ts +41 -6
  6. package/dist/esm/lib/memory/RecordFrame.js +36 -5
  7. package/dist/esm/lib/memory/SharedMemory.d.ts +1 -1
  8. package/dist/esm/lib/memory/SharedMemory.js +2 -2
  9. package/dist/esm/lib/memory/StageContext.d.ts +21 -14
  10. package/dist/esm/lib/memory/StageContext.js +36 -74
  11. package/dist/esm/lib/memory/borrowedMutation.d.ts +1 -1
  12. package/dist/esm/lib/memory/borrowedMutation.js +2 -2
  13. package/dist/esm/lib/memory/honesty.d.ts +4 -3
  14. package/dist/esm/lib/memory/honesty.js +5 -4
  15. package/dist/esm/lib/memory/index.d.ts +4 -2
  16. package/dist/esm/lib/memory/index.js +6 -4
  17. package/dist/esm/lib/memory/placeholders.d.ts +23 -28
  18. package/dist/esm/lib/memory/placeholders.js +24 -29
  19. package/dist/esm/lib/memory/recordCommit.d.ts +5 -3
  20. package/dist/esm/lib/memory/recordCommit.js +7 -5
  21. package/dist/esm/lib/memory/redaction.d.ts +78 -40
  22. package/dist/esm/lib/memory/redaction.js +130 -64
  23. package/dist/esm/lib/memory/runAddress.d.ts +20 -0
  24. package/dist/esm/lib/memory/runAddress.js +25 -0
  25. package/dist/esm/lib/memory/scrub.d.ts +51 -0
  26. package/dist/esm/lib/memory/scrub.js +72 -0
  27. package/dist/esm/lib/memory/utils.d.ts +3 -3
  28. package/dist/esm/lib/memory/utils.js +4 -4
  29. package/dist/lib/decide/evaluator.js +3 -3
  30. package/dist/lib/decide/evidence.js +3 -3
  31. package/dist/lib/engine/handlers/servedPause.js +3 -3
  32. package/dist/lib/memory/RecordFrame.js +36 -5
  33. package/dist/lib/memory/SharedMemory.js +2 -2
  34. package/dist/lib/memory/StageContext.js +42 -80
  35. package/dist/lib/memory/borrowedMutation.js +2 -2
  36. package/dist/lib/memory/honesty.js +5 -4
  37. package/dist/lib/memory/index.js +6 -4
  38. package/dist/lib/memory/placeholders.js +25 -30
  39. package/dist/lib/memory/recordCommit.js +9 -7
  40. package/dist/lib/memory/redaction.js +144 -75
  41. package/dist/lib/memory/runAddress.js +29 -0
  42. package/dist/lib/memory/scrub.js +77 -0
  43. package/dist/lib/memory/utils.js +4 -4
  44. package/dist/types/lib/memory/RecordFrame.d.ts +41 -6
  45. package/dist/types/lib/memory/SharedMemory.d.ts +1 -1
  46. package/dist/types/lib/memory/StageContext.d.ts +21 -14
  47. package/dist/types/lib/memory/borrowedMutation.d.ts +1 -1
  48. package/dist/types/lib/memory/honesty.d.ts +4 -3
  49. package/dist/types/lib/memory/index.d.ts +4 -2
  50. package/dist/types/lib/memory/placeholders.d.ts +23 -28
  51. package/dist/types/lib/memory/recordCommit.d.ts +5 -3
  52. package/dist/types/lib/memory/redaction.d.ts +78 -40
  53. package/dist/types/lib/memory/runAddress.d.ts +20 -0
  54. package/dist/types/lib/memory/scrub.d.ts +51 -0
  55. package/dist/types/lib/memory/utils.d.ts +3 -3
  56. package/package.json +1 -1
package/CLAUDE.md CHANGED
@@ -9,7 +9,7 @@ Entry points: `footprintjs` (public API) · `/recorders` (factories) · `/trace`
9
9
  | src/lib/ | one job |
10
10
  |---|---|
11
11
  | capture/ | retention policies + bounded payload summarization (leaf; shared by tracking dials AND deferred-observer capture) + `valueKinds` (the ONE classifier of value kinds: `deepEqual`'s arms and what freezing seals, 9.44.2) + the shared leaves `invokeHook` (the one recorder-hook invoker both delivery tiers use), `circular` (dev-mode cycle probe), `summarizeValue` (the narrative one-liner); `lib/devMode.ts` — the dev-mode flag — is its sibling leaf (all four moved out of scope/ and recorder/ in F0: they closed the one memory ⇄ scope ⇄ recorder module cycle) |
12
- | memory/ | transactional state: SharedMemory heap, StageContext frames, `RecordFrame` (the record half of a frame, L3, C3: the address, the first-touch base, the two-tier read, the lazy buffer, the readKeys list, and the commit through `recordCommit`; StageContext composes it), TransactionBuffer staging (+ admission.ts, the admitted record's check; deltaEncoding.ts, the delta encoder's helpers), EventLog commit log — PLUS the ONE verb law (`verbs.ts`, L1: `applyVerb`, `foldRows`, `foldKey`; leaves `paths.ts` / `equality.ts` / `merge.ts`; `utils.ts` re-exports them) and trace analysis (backtrack.ts causalChain, commitLogUtils.ts) |
12
+ | memory/ | transactional state: SharedMemory heap, StageContext frames, `RecordFrame` (the record half of a frame, L3, C3: the address, the first-touch base, the two-tier read, the lazy buffer (private since C4: staged only through `write(path, value, verb, scrub?)`, which carries a redaction verdict's bytes), the readKeys list, and the commit through `recordCommit`; StageContext composes it), the log's scrub (`scrub.ts`, L2: `scrubPatch` / `redactPatch`, C4), TransactionBuffer staging (+ admission.ts, the admitted record's check; deltaEncoding.ts, the delta encoder's helpers), EventLog commit log — PLUS the ONE verb law (`verbs.ts`, L1: `applyVerb`, `foldRows`, `foldKey`; leaves `paths.ts` / `equality.ts` / `merge.ts`; `utils.ts` re-exports them) and trace analysis (backtrack.ts causalChain, commitLogUtils.ts) |
13
13
  | schema/ | duck-typed validation (`.safeParse/.parse` ⇒ 'parseable') |
14
14
  | builder/ | fluent DSL → FlowChartSpec → StageNode graph; build-time StructureRecorder channel. NOT standalone: imports runner's makeRunnable (FlowChartBuilder.ts:18) |
15
15
  | scope/ | ScopeFacade per stage (tracked get/set, $emit, frozen args/env); built-in ScopeRecorders in scope/recorders/ |
@@ -24,11 +24,11 @@ Entry points: `footprintjs` (public API) · `/recorders` (factories) · `/trace`
24
24
  | observer-queue/ | pure deferred-delivery pipeline (engine imports IT, never reverse) |
25
25
  | contract/, detach/ | I/O schema normalization (OpenAPI generation belongs to runner/RunnableChart); fire-and-forget child charts (drivers passed explicitly) |
26
26
 
27
- **The fence (F0):** a file imports only its own layer or BELOW — L0 values/leaves · L1 verbs · L2 staging+commit · L3 the log as a read model + the record half of a frame (`RecordFrame`) · L4 frame+run policy · L5 scope/recorders/hooks · L6 engine · L7 builder+executor · L8 the `src/*.ts` entry barrels. The table is DATA in `scripts/layering.config.cjs` (most specific pattern wins; an unplaced file is an error, and `memory/` has no directory default because it spans L0–L4) and has three readers, none with a copy: `.eslintrc.js` (generated `import/no-restricted-paths` zones + `import/no-cycle`, src only), `npm run check:layering` (value-level cycles at module AND file level + upward RUNTIME edges; type-only imports excluded — the set equals the compiled CJS `require` graph), `test/architecture/layering.test.ts`. Three edges are named on purpose — builder → `runner/RunnableChart.ts` (`makeRunnable`), engine → `reactive/handles.ts`, scope → `detach/spawn.ts` — plus a short `TYPE_ONLY_ALLOWANCES` list (upward imports tsc erases, which the lint rule cannot tell apart); both lists are live-checked and only shrink. A new src file under an unsplit directory inherits its layer; one under `memory/` (or an exact-path entry) must be added to LAYERS — an unplaced file fails lint and the script. Public symbols have ONE canonical door each — `test/architecture/exports.test.ts` fails on any symbol two of the six `package.json` doors both hand out unless it is in `SECOND_DOORS` (28 today, in four reasoned groups; an alias counts as a door).
27
+ **The fence (F0):** a file imports only its own layer or BELOW — L0 values/leaves · L1 verbs · L2 staging+commit · L3 the log as a read model + the record half of a frame (`RecordFrame`) · L4 frame+run policy+the redaction verdict (`redaction.ts`, C4) · L5 scope/recorders/hooks · L6 engine · L7 builder+executor · L8 the `src/*.ts` entry barrels. The table is DATA in `scripts/layering.config.cjs` (most specific pattern wins; an unplaced file is an error, and `memory/` has no directory default because it spans L0–L4) and has three readers, none with a copy: `.eslintrc.js` (generated `import/no-restricted-paths` zones + `import/no-cycle`, src only), `npm run check:layering` (value-level cycles at module AND file level + upward RUNTIME edges; type-only imports excluded — the set equals the compiled CJS `require` graph), `test/architecture/layering.test.ts`. Three edges are named on purpose — builder → `runner/RunnableChart.ts` (`makeRunnable`), engine → `reactive/handles.ts`, scope → `detach/spawn.ts` — plus a short `TYPE_ONLY_ALLOWANCES` list (upward imports tsc erases, which the lint rule cannot tell apart); both lists are live-checked and only shrink. A new src file under an unsplit directory inherits its layer; one under `memory/` (or an exact-path entry) must be added to LAYERS — an unplaced file fails lint and the script. Public symbols have ONE canonical door each — `test/architecture/exports.test.ts` fails on any symbol two of the six `package.json` doors both hand out unless it is in `SECOND_DOORS` (28 today, in four reasoned groups; an alias counts as a door).
28
28
 
29
29
  ## Core state & flow
30
- - `SharedMemory` (memory/SharedMemory.ts) — address-scoped heap: the frame's record frame hands it the address (`RecordFrame · address`; the engine decides it in `StageContext.ts · runAddress` / `useAddressOf` from the ONE L4 constant `RUN_NAMESPACE`, C2/C3); committed state is **immutable-after-swap**, COPY-ON-WRITE since 9.29.0: every write (`applyPatch` → `verbs · nextGeneration`, `setValue`/`updateValue`) copies the root + the containers on each written path and SHARES every other subtree with the previous generation, then swaps. A generation is never edited; the seed is detached once at construction. Design: docs/design/2026-10-copy-on-write-commit.md.
31
- - `StageContext` (memory/StageContext.ts:29) — per-stage frame inside a run; composes `RecordFrame` (memory/RecordFrame.ts, L3, C3: the lazy TransactionBuffer, the first-touch base, the two-tier read, readKeys, the address); `commit()` → `RecordFrame · commit` (payload, then the names) → `memory/recordCommit.ts · recordCommit` (live apply → scrub → mirror → `EventLog.record`) → onCommit → `RecordFrame · release`. `runId` is readonly (the address is decided once, 9.46.0).
30
+ - `SharedMemory` (memory/SharedMemory.ts) — address-scoped heap: the frame's record frame hands it the address (`RecordFrame · address`; the engine decides it in `runAddress.ts · runAddress` / `StageContext · useAddressOf` from the ONE L4 constant `runAddress.ts · RUN_NAMESPACE`, C2–C4); committed state is **immutable-after-swap**, COPY-ON-WRITE since 9.29.0: every write (`applyPatch` → `verbs · nextGeneration`, `setValue`/`updateValue`) copies the root + the containers on each written path and SHARES every other subtree with the previous generation, then swaps. A generation is never edited; the seed is detached once at construction. Design: docs/design/2026-10-copy-on-write-commit.md.
31
+ - `StageContext` (memory/StageContext.ts:29) — per-stage frame inside a run; composes `RecordFrame` (memory/RecordFrame.ts, L3, C3: the lazy TransactionBuffer, the first-touch base, the two-tier read, readKeys, the address); `commit()` → `RecordFrame · commit` (payload, then the names) → `memory/recordCommit.ts · recordCommit` (live apply → scrub → mirror → `EventLog.record`) → onCommit → `RecordFrame · release`. `runId` is readonly (the address is decided once, 9.46.0). A staged write is `StageContext · stageWrite`: `redaction.ts · decideWrite` (the verdict) → `inheritByIdentity` (an object read under a selected name keeps its rule) → `RecordFrame · write(…, scrubOf(verdict))` (its bytes) → `markStagedWrite` (the run's marks, only once the write staged; C4, 9.46.1). Each step reads the rule when it acts.
32
32
  - `CommitBundle`/`EventLog` — one bundle per executed stage, `bundle.idx` == array position; encoding governed by `commitValues: 'full'|'delta'`.
33
33
  - `TraversalContext` (engine/narrative/types.ts:172) — THE per-event context (runId, runtimeStageId, parentRuntimeStageId, subflowPath, loopIteration); stamped on every FlowRecorder event.
34
34
  - `runtimeStageId` = `[subflowPath/]stageId#executionIndex`; counter shared by reference into subflow traversers → globally unique; NOT reset on resume.
@@ -54,13 +54,13 @@ Entry points: `footprintjs` (public API) · `/recorders` (factories) · `/trace`
54
54
 
55
55
  ## Change-impact map
56
56
  - **Trace verbs** (`set|merge|append|delete`, memory/types.ts:42) → ONE law, `memory/verbs.ts` (L1) — F2 deleted the three replicas. `applyVerb` is the ONLY function with an arm per verb (a fifth verb in the union stops compiling there; `TRAITS` — `isTotal` / `recordsTail` — says what a verb IS, pinned against the step), `placeVerb` puts its value or removes the key (`ABSENT`), and two loops fold it: `foldRows` folds ONE bundle's rows into a state with the clone DISCIPLINE as a parameter (`'private'` = the PUBLIC `applySmartMerge`, which keeps its 9.28.0 contract: base deep-cloned, fully detached result — 9.29.0; `'pathCopy'` = the engine's `nextGeneration` — live commit + redacted mirror — and the folds' `applySmartMergeInto` — `stateAt`, `EventLog.materialise`; `'byReference'` = `dryFold`, the admitted record's comparison fold — 9.30.0), and `foldKey` folds ONE path's rows across a log — `commitLogUtils · commitValueAt` (anchored at the last total row) and `slice/elementProvenance · arrayProvenance` (an OBSERVER of that fold: it keeps the births and has no verb switch); causalChain/findLastWriter only match paths. A bundle's merge delta is detached ONCE per bundle (`RecordedPayload`): `deepSmartMerge` dedups an array union BY REFERENCE, so the merge rows of one bundle must see the same objects (a per-row clone made `commitValueAt` double the elements — the 9.29.0 reader bug, fixed here); `foldKey` narrows that copy to its one path. **An unknown verb is REFUSED** (`UnknownVerbError`, public on `/trace`; R2) by `foldRows` (so `applySmartMerge`), `commitValueAt`, `arrayProvenance` — they used to fold it as a `merge`; `time-travel/bundles · bundleRefusal` asks the same `isVerb` and makes it a GAP instead. Pinned: the three old replicas live on as the CONTROL in test/lib/memory/property/verb-law-differential.property.test.ts (kept for the packet's lifetime). The delta encoder keeps VOCABULARY only since 9.30.0 (it picks a verb; its values come from `dryFold` of the stage's 'full' rows — `TransactionBuffer · fullRowsValue`; `replayPathVerbs`/`replayFamilyVerbs` deleted). NOT a second loop (9.22.1): `verbs.ts · supersededByNextSet` — the ONE repeated-path skip (CONSECUTIVE same-path `set` rows: only the last is applied), asked by `foldRows` before its step; its commit-side twin is the last-materialised-path memo in `toChangeOnlyPayload`. Rows are never dropped from the log; a non-consecutive skip is WRONG (a descendant op in between coerces/shells the container) — pinned by test/lib/memory/scenario/repeated-path-byte-identity.test.ts. Since 9.23.0 the clone in that memo loop (and every `structuredClone` in `toDeltaPayload`) is THE clone — the patch trees hold references until commit; no verb switch was touched.
57
- - **Write address** → ONE constant, `StageContext.ts · RUN_NAMESPACE` (L4), read by `runAddress` and `useAddressOf`; the frame's `RecordFrame` holds the address (C3). `SharedMemory` and the nested writers take the address as data and refuse a non-array; `TransactionBuffer` takes it too (C2, 9.45.0). `test/architecture/write-address.test.ts` refuses the namespace below L4, as a literal or a property (exceptions `RedactionRule · verdictOfRead` / `retainState` until C4).
57
+ - **Write address** → ONE constant, `runAddress.ts · RUN_NAMESPACE` (an L4 leaf, C4), read by `runAddress` / `useAddressOf` and by `RedactionRule · verdictOfRead` / `retainState`; the frame's `RecordFrame` holds the address (C3). `SharedMemory` and the nested writers take the address as data and refuse a non-array; `TransactionBuffer` takes it too (C2, 9.45.0). `test/architecture/write-address.test.ts` refuses the namespace below L4, as a literal or a property — no exceptions since C4.
58
58
  - **StageContext.commit / dials** → ONE owner since 9.35.0 (F5): `memory/runPolicy.ts` — a frozen `RunPolicy` (the four dials + the `RedactionRule` + the mirror flag) built ONCE by `FlowChartExecutor · createTraverser` (run AND resume), handed to `ExecutionRuntime`, held BY REFERENCE by every `StageContext` (`inheritRun` in createNext/createChild) and by its `RecordFrame` as its encoding (`useEncoding`, through `StageContext · adoptPolicy`, the one place a frame's policy changes) and passed by `SubflowExecutor · executeSubflow` to the nested runtime BEFORE the seed. A fifth dial = the policy type + its consumer. The old per-dial `use*`/`get*` and `enableRedactedMirror` were removed in 9.36.0 (no compat shims — owner ruling). `commit()`'s FIRST act (9.23.0) is `materialiseWrites` — the `writeTracking` retained form is taken there, once per key, from `_pendingWrites` (bare references + the write-time verdict); anything that reads `_stageWrites` goes through `retainedWrites()` (a non-consuming fold, so a mid-run snapshot is honest), and `discardStaged` drops the pending map with the rest.
59
59
  - **runtimeStageId format** (`#`/`/` delimiters) → ONE grammar owner since 9.37.0 (F7): `src/lib/ids/` (L0 leaf: `runtimeStageId.ts` — `parseRuntimeStageId`, `isExecutionKey`, `stageIdOf`, `subflowPathOf`, `refuseReservedId`; `branchSegment.ts` — the `~` grammar). Every parser (ScopeFacade subflow path, subflowResults dual-keying, narrative buffering, store keys) calls it; none re-derives the grammar. R5: every id door (22 at build, plus the run-time dynamic-StageNode door) refuses `#` and `/`; stage ids may contain `~`. `TraversalContext` has ONE constructor (`engine/traversalContext.ts`); `depth` = subflow nesting read off the runtimeStageId on every stamp. Brands `RuntimeStageId`/`ExecutionIndex`/`CommitIdx` on `/trace` (types only).
60
60
  - **Subflow id prefixing** → ONE prefixer since 9.37.0: `engine/graph/prefixNodeTree.ts`, used by the builder AND the traverser (eager, lazy and `parallelForEach` mounts — lazy/branch roots were unprefixed before 9.37.0, so branch ids collided); change it + stageMap key composition + resume drilling; the builder's eager mounts all go through `FlowChartBuilder · _mountSubflow` (F10). test/lib/engine/branch-segment-prefixer-equivalence.test.ts stays as a guard.
61
61
  - **Checkpoint shape** (format 2 since 9.44.0, LEAN: only what resume reads + the pause's record — no `executionTree`/`subflowResults`; size independent of run length, pinned by test/lib/pause/checkpoint-size.test.ts; 9.39–9.43 refuse format 2, so upgrade readers before writers) → `runner/checkpoint.ts · buildPauseCheckpoint` ↔ `pause/record.ts · decodeCheckpoint` (one upcaster drops v0/v1 fields) ↔ `runner/resume.ts · planResume` (validation via `pause/record.ts · decodeCheckpoint`) ↔ `ResumeEntry.plan` (the path's mounts + captures + dispatcher continuations, the `pendingPauses` queue; refused up front when unwalkable, ambiguous, or a pending record is not a sibling) ↔ `SubflowExecutor · executeSubflow` resume hop (seed from the capture in place of the mapper's values — the mapper still runs, for the args — FIRST entry only) ↔ `ChildrenExecutor · raisePauses` (fills `pendingPauses`). 9.28.0 adds ONE optional field, `pendingPauses` (present only when parallel siblings wait); the redaction law adds `redactionMarks` (names only, present only when the run marked something); every stored checkpoint enters through `pause/record.ts · decodeCheckpoint` (`checkpointVersion: 1`, one upcaster from unversioned v0 which drops the legacy `continuationStageId`, one validator, one message set; 9.39.0). Pinned: a 9.27.0 checkpoint resumes, test/lib/pause/resume-real-chart-9.27.0-checkpoints.test.ts.
62
62
  - **Committed-state writers** (copy-on-write, 9.29.0) → anything that writes into `SharedMemory`'s state, a fold's working copy or the buffer's working copy must copy before it writes: `pathOps · ownSpine` for the containers on the path, `ownedRootOf` for the root, `own`/`adopt` for what it created. An in-place edit of a container it did not create edits every generation sharing it — the counted guard stays green while the generations property fails. A new READ path through `TransactionBuffer` goes through `get` (private after the first write) unless it only compares (`peek`); a read the working copy cannot answer is served from LIVE state (`RecordFrame · read`, as on 9.28.0) after `TransactionBuffer · detachBase` gives the diff base a private copy at that path — a private copy of the value handed out instead would change live state wherever 9.28.0 let an in-place edit in (a fork child's read of a parent key). `TransactionBuffer · merge` privatises its base first: `deepSmartMerge` dedups arrays BY REFERENCE, so the identity of the base is part of the bytes.
63
- - **Redaction** (9.19.0; the law restored to owner ruling (a)) has ONE owner: `memory/redaction.ts` `RedactionRule` (verdict per user-level path: `clear | whole | fields`), carried on the run's `RunPolicy` with the four dials (F5). THE LAW: a policy covers EVERYTHING the library retains or serves — log (both encodings), mirror, stageReads/stageWrites, every recorder event inline and deferred (and the rows built from them), narrative, snapshots, diagnostics, pause payloads, boundary records, logger lines — and NEVER the live heap or the resume checkpoint. The two true exceptions are the caller's own values: the `run()` rejection and the live fork result. It selects by NAME, never by content: state by path (`verdict`); a record handed out whole (root input/output — `FlowchartTraverser.execute`; subflow seed/exit — `SubflowExecutor`; pause payload — `engine/handlers/servedPause.ts`; thrown value — `retainStageError`) by its keys at every depth plus declared `fields` under a key of that name (`retainBoundary` — one decision per PATH via `servedByPath`: copy-on-write per path, the visited set only the current path's ancestor stack, a cycle edge landing on the served copy; a path rule is exact under shared references, a key-NAME rule masks a shared node everywhere); a diagnostic entry as the record `{ [name]: value }` (`retainDiagnostic`; `policy.diagnostics` ADDS diagnostic-only selectors, the only ones that reach flow-message text); a subflow mapper's copy by TAINT (`MapperTaint`, asked by `SubflowInputMapper` for both mappers; the `parallelForEach` items selector counts selected reads via `StageContext · selectedReads` and marks `item`/`into`): a value passed under its own name keeps that name's verdict, an object by reference (or the whole handed record, as fields) keeps its source's, anything computed after a selected read is marked whole (conservative); never value equality across names. A mark is a NAME, run-wide, until the key is deleted — and a pause carries the marks (names only) to the resumed run (`FlowchartCheckpoint.redactionMarks`, checked by `pause/record.ts`). A thrown value is walked with its `cause`/`errors`; an object a mapper passes on by reference is scanned for the selected values it read (planted → fields). Name-only patterns (`needsPath` false — no `.`, lookaround, or escape/class that can match `.`) are decided per object, so the walk shares decisions per (object, targets) — linear on a DAG or a linked history; only a path-dependent pattern walks paths, and past 1,000,000 visits it serves the unvisited remainder as the placeholder (one dev-mode warning), never fails the run. Inside a stage, an OBJECT read under a selected name and written under another keeps its rule (`StageContext · stageWrite`, by identity); a primitive or a new object copied across names is selected by its own name only. `StageContext.stageWrite` is the ONE write funnel (facade writes, subflow seed, outputMapper merge-back, resume re-seed) and `getValue` retention asks the same rule; the facade asks it for read/write recorder payloads. An inert rule never enumerates a payload. `emitPatterns` is the one separate scrub (`$emit` payloads, by event name). Two placeholders, historical: log/mirror `'REDACTED'`, scope-tier `'[REDACTED]'`. See `docs/guides/scope.md` → "The one law". Capture the retained form at runtime; no second tree walk or recorder-local policy.
63
+ - **Redaction** (9.19.0; the law restored to owner ruling (a)) has ONE owner of the DECISION, `memory/redaction.ts` (L4 since C4): `RedactionRule` (verdict per user-level path: `clear | whole | fields`) and, per staged write, `decideWrite` → `inheritByIdentity` → (the record writes) → `markStagedWrite` (the marks, only once the write staged — a failed `$update` leaves no mark in `redactionMarks` or the report); the BYTES are the record's (`RecordFrame · write` registers `scrubOf(verdict)`, `memory/scrub.ts · scrubPatch` (L2) writes the log's placeholder at commit; no record file imports `redaction.ts`), carried on the run's `RunPolicy` with the four dials (F5). THE LAW: a policy covers EVERYTHING the library retains or serves — log (both encodings), mirror, stageReads/stageWrites, every recorder event inline and deferred (and the rows built from them), narrative, snapshots, diagnostics, pause payloads, boundary records, logger lines — and NEVER the live heap or the resume checkpoint. The two true exceptions are the caller's own values: the `run()` rejection and the live fork result. It selects by NAME, never by content: state by path (`verdict`); a record handed out whole (root input/output — `FlowchartTraverser.execute`; subflow seed/exit — `SubflowExecutor`; pause payload — `engine/handlers/servedPause.ts`; thrown value — `retainStageError`) by its keys at every depth plus declared `fields` under a key of that name (`retainBoundary` — one decision per PATH via `servedByPath`: copy-on-write per path, the visited set only the current path's ancestor stack, a cycle edge landing on the served copy; a path rule is exact under shared references, a key-NAME rule masks a shared node everywhere); a diagnostic entry as the record `{ [name]: value }` (`retainDiagnostic`; `policy.diagnostics` ADDS diagnostic-only selectors, the only ones that reach flow-message text); a subflow mapper's copy by TAINT (`MapperTaint`, asked by `SubflowInputMapper` for both mappers; the `parallelForEach` items selector counts selected reads via `StageContext · selectedReads` and marks `item`/`into`): a value passed under its own name keeps that name's verdict, an object by reference (or the whole handed record, as fields) keeps its source's, anything computed after a selected read is marked whole (conservative); never value equality across names. A mark is a NAME, run-wide, until the key is deleted — and a pause carries the marks (names only) to the resumed run (`FlowchartCheckpoint.redactionMarks`, checked by `pause/record.ts`). A thrown value is walked with its `cause`/`errors`; an object a mapper passes on by reference is scanned for the selected values it read (planted → fields). Name-only patterns (`needsPath` false — no `.`, lookaround, or escape/class that can match `.`) are decided per object, so the walk shares decisions per (object, targets) — linear on a DAG or a linked history; only a path-dependent pattern walks paths, and past 1,000,000 visits it serves the unvisited remainder as the placeholder (one dev-mode warning), never fails the run. Inside a stage, an OBJECT read under a selected name and written under another keeps its rule (`redaction.ts · inheritByIdentity`, by identity — decided before the write); a primitive or a new object copied across names is selected by its own name only. `StageContext.stageWrite` is the ONE write funnel (facade writes, subflow seed, outputMapper merge-back, resume re-seed) and `getValue` retention asks the same rule; the facade asks it for read/write recorder payloads. An inert rule never enumerates a payload. `emitPatterns` is the one separate scrub (`$emit` payloads, by event name). Two placeholders, historical, one per owner: log/mirror `'REDACTED'` (`placeholders.ts · LOG_PLACEHOLDER`, a record byte), scope-tier `'[REDACTED]'` (`redaction.ts · SCOPE_PLACEHOLDER`). See `docs/guides/scope.md` → "The one law". Capture the retained form at runtime; no second tree walk or recorder-local policy.
64
64
  - **Diagnostic retention** → `DiagnosticCollector` asks the current run rule before merging/storing: a named entry maps to the state key of its name (the run's keys/patterns/marks/fields, at every depth of the value), then the opt-in `RedactionPolicy.diagnostics` selectors (same path algorithm, rooted at the channel). Its internal retained-write bridge supplies legacy facade emits. Existing writers stay void. Only flow-message description/rationale are payloads (no name — diagnostic selectors only); keys/topology/timing stay present. Dynamic capture uses a per-visit engine flag, not a diagnostic bag. A redacted `logs.deciderRationale` also reaches decision explanations. Checkpoints keep retained diagnostic bags but preserve operational state; no retroactive scrub. See the scope guide's diagnostic contract.
65
65
  - **Traverser phases** → node-shape reads must use eff* overlay accessors (:646-703) or dynamic StageNode returns break; tail continuations must return ContinuationHops or stacks regrow; decider flat-dispatch must keep InvokerStamp or pause loses its invoker.
66
66
 
@@ -9,7 +9,7 @@
9
9
  */
10
10
  import { summarizeValue } from '../capture/summarize.js';
11
11
  import { isDevMode } from '../devMode.js';
12
- import { SCOPE_PLACEHOLDER } from '../memory/placeholders.js';
12
+ import { SCOPE_PLACEHOLDER } from '../memory/redaction.js';
13
13
  const OPERATOR_HANDLERS = {
14
14
  eq: (a, t) => a === t,
15
15
  ne: (a, t) => a !== t,
@@ -127,4 +127,4 @@ export function evaluateFilter(getValueFn, isRedactedFn, filter) {
127
127
  return { matched: false, conditions };
128
128
  return { matched: allMatched, conditions };
129
129
  }
130
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZhbHVhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9kZWNpZGUvZXZhbHVhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFPOUQsTUFBTSxpQkFBaUIsR0FBK0I7SUFDcEQsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDckIsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDckIsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUUsQ0FBWSxHQUFJLENBQVk7SUFDM0MsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUUsQ0FBWSxJQUFLLENBQVk7SUFDN0MsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUUsQ0FBWSxHQUFJLENBQVk7SUFDM0MsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUUsQ0FBWSxJQUFLLENBQVk7SUFDN0MsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ1gsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDcEMsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLGlCQUFpQixFQUFFLENBQUM7WUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsaUJBQWlCLEVBQUUsQ0FB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LENBQUM7Z0JBQ25CLFNBQVM7WUFDWCxDQUFDO1lBRUQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMxQyxVQUFVLENBQUMsSUFBSSxDQUFDO2dCQUNkLEdBQUc7Z0JBQ0gsRUFBRTtnQkFDRixTQUFTO2dCQUNULGFBQWEsRUFBRSxZQUFZO2dCQUMzQixNQUFNO2dCQUNOLFFBQVE7YUFDVCxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsTUFBTTtnQkFBRSxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ2xDLENBQUM7SUFDSCxDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLHdFQUF3RTtJQUN4RSx5RUFBeUU7SUFDekUsZ0RBQWdEO0lBQ2hELElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLENBQUM7SUFFbkUsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLENBQUM7QUFDN0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogZGVjaWRlL2V2YWx1YXRvciAtLSBQcmlzbWEtc3R5bGUgZmlsdGVyIGV2YWx1YXRvciBmb3IgZGVjaXNpb24gcnVsZXMuXG4gKlxuICogUHVyZSBmdW5jdGlvbi4gVGFrZXMgYSBXaGVyZUZpbHRlciwgYSB2YWx1ZSBnZXR0ZXIsIGFuZCBhIHJlZGFjdGlvbiBjaGVja2VyLlxuICogRXZhbHVhdGVzIGVhY2ggY29uZGl0aW9uLCByZWNvcmRzIHRoZSByZXN1bHQsIHJldHVybnMgbWF0Y2hlZC9jb25kaXRpb25zLlxuICpcbiAqIEFsbCBrZXlzIGluIHRoZSBmaWx0ZXIgYXJlIEFORGVkIChhbGwgbXVzdCBtYXRjaCBmb3IgdGhlIHJ1bGUgdG8gbWF0Y2gpLlxuICogRGVjb3VwbGVkIGZyb20gU2NvcGVGYWNhZGUg4oCUIHJlY2VpdmVzIGNhbGxiYWNrcywgbm90IHNjb3BlLlxuICovXG5cbmltcG9ydCB7IHN1bW1hcml6ZVZhbHVlIH0gZnJvbSAnLi4vY2FwdHVyZS9zdW1tYXJpemUuanMnO1xuaW1wb3J0IHsgaXNEZXZNb2RlIH0gZnJvbSAnLi4vZGV2TW9kZS5qcyc7XG5pbXBvcnQgeyBTQ09QRV9QTEFDRUhPTERFUiB9IGZyb20gJy4uL21lbW9yeS9wbGFjZWhvbGRlcnMuanMnO1xuaW1wb3J0IHR5cGUgeyBGaWx0ZXJDb25kaXRpb24sIFdoZXJlRmlsdGVyIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8vIC0tIE9wZXJhdG9yIGRpc3BhdGNoIHRhYmxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudHlwZSBPcGVyYXRvckZuID0gKGFjdHVhbDogdW5rbm93biwgdGhyZXNob2xkOiB1bmtub3duKSA9PiBib29sZWFuO1xuXG5jb25zdCBPUEVSQVRPUl9IQU5ETEVSUzogUmVjb3JkPHN0cmluZywgT3BlcmF0b3JGbj4gPSB7XG4gIGVxOiAoYSwgdCkgPT4gYSA9PT0gdCxcbiAgbmU6IChhLCB0KSA9PiBhICE9PSB0LFxuICBndDogKGEsIHQpID0+IChhIGFzIG51bWJlcikgPiAodCBhcyBudW1iZXIpLFxuICBndGU6IChhLCB0KSA9PiAoYSBhcyBudW1iZXIpID49ICh0IGFzIG51bWJlciksXG4gIGx0OiAoYSwgdCkgPT4gKGEgYXMgbnVtYmVyKSA8ICh0IGFzIG51bWJlciksXG4gIGx0ZTogKGEsIHQpID0+IChhIGFzIG51bWJlcikgPD0gKHQgYXMgbnVtYmVyKSxcbiAgaW46IChhLCB0KSA9PiB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHQpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHQubGVuZ3RoID4gTUFYX0lOX0FSUkFZX1NJWkUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgaW4vbm90SW4gYXJyYXkgZXhjZWVkcyBtYXhpbXVtIHNpemUgb2YgJHtNQVhfSU5fQVJSQVlfU0laRX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHQuaW5jbHVkZXMoYSk7XG4gIH0sXG4gIG5vdEluOiAoYSwgdCkgPT4ge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh0KSkgcmV0dXJuIHRydWU7IC8vIG5vdCBpbiBhIG5vbi1hcnJheSA9IHZhY3VvdXNseSB0cnVlXG4gICAgaWYgKHQubGVuZ3RoID4gTUFYX0lOX0FSUkFZX1NJWkUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgaW4vbm90SW4gYXJyYXkgZXhjZWVkcyBtYXhpbXVtIHNpemUgb2YgJHtNQVhfSU5fQVJSQVlfU0laRX1gKTtcbiAgICB9XG4gICAgcmV0dXJuICF0LmluY2x1ZGVzKGEpO1xuICB9LFxufTtcblxuLy8gLS0gU2VjdXJpdHk6IHByb3RvdHlwZSBwb2xsdXRpb24gZGVueWxpc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBERU5JRURfS0VZUyA9IG5ldyBTZXQoW1xuICAnX19wcm90b19fJyxcbiAgJ2NvbnN0cnVjdG9yJyxcbiAgJ3Byb3RvdHlwZScsXG4gICd0b1N0cmluZycsXG4gICd2YWx1ZU9mJyxcbiAgJ2hhc093blByb3BlcnR5JyxcbiAgJ2lzUHJvdG90eXBlT2YnLFxuICAncHJvcGVydHlJc0VudW1lcmFibGUnLFxuICAnX19kZWZpbmVHZXR0ZXJfXycsXG4gICdfX2RlZmluZVNldHRlcl9fJyxcbiAgJ19fbG9va3VwR2V0dGVyX18nLFxuICAnX19sb29rdXBTZXR0ZXJfXycsXG5dKTtcblxuLy8gLS0gQ29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBNQVhfSU5fQVJSQVlfU0laRSA9IDEwMDA7XG5jb25zdCBNQVhfVkFMVUVfTEVOID0gODA7XG5cbi8vIC0tIEV2YWx1YXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBFdmFsdWF0ZXMgYSBQcmlzbWEtc3R5bGUgZmlsdGVyIGFnYWluc3Qgc2NvcGUgdmFsdWVzLlxuICpcbiAqICMjIEVtcHR5IGZpbHRlciDihpIgTk8gbWF0Y2ggKGFudGktdmFjdW91cy10cnV0aCDigJQgaW52ZXJ0cyBQcmlzbWEvU1FMKVxuICpcbiAqIEEgZmlsdGVyIHdpdGggbm8gZXZhbHVhYmxlIGNvbmRpdGlvbnMgKGB7fWAsIG9yIG9ubHkgZGVuaWVkL25vbi1vYmplY3RcbiAqIGtleXMpIHJldHVybnMgYG1hdGNoZWQ6IGZhbHNlYC4gVGhpcyBkZWxpYmVyYXRlbHkgSU5WRVJUUyB0aGUgUHJpc21hL1NRTFxuICogaW50dWl0aW9uIHdoZXJlIGB3aGVyZToge31gIG1hdGNoZXMgZXZlcnl0aGluZzogaW4gYSBkZWNpc2lvbiBydWxlLCBhIHJ1bGVcbiAqIHRoYXQgYXNzZXJ0cyBub3RoaW5nIHNob3VsZCBuZXZlciB3aW4gYSBicmFuY2gg4oCUIFwiYWxsIHplcm8gY29uZGl0aW9uc1xuICogcGFzc2VkXCIgaXMgdmFjdW91cyB0cnV0aCwgYW5kIHNpbGVudGx5IHJvdXRpbmcgb24gaXQgd291bGQgZmFicmljYXRlXG4gKiBkZWNpc2lvbiBldmlkZW5jZS4gV2FudCBhIGNhdGNoLWFsbD8gVXNlIHRoZSBleHBsaWNpdCBgZGVmYXVsdEJyYW5jaGBcbiAqIGFyZ3VtZW50IG9mIGBkZWNpZGUoKWAgaW5zdGVhZCBvZiBhbiBlbXB0eSBgd2hlbmAuXG4gKlxuICogIyMgVW5rbm93biBvcGVyYXRvcnMg4oaSIGNvbmRpdGlvbiBmYWlscyAoKyBkZXYtbW9kZSB3YXJuaW5nKVxuICpcbiAqIEFuIG9wZXJhdG9yIG91dHNpZGUgdGhlIHN1cHBvcnRlZCBzZXQgKGBlcSwgbmUsIGd0LCBndGUsIGx0LCBsdGUsIGluLFxuICogbm90SW5gKSByZWNvcmRzIGEgZmFpbGVkIGNvbmRpdGlvbiDigJQgdGhlIHJ1bGUgY2FuIG5ldmVyIHNwdXJpb3VzbHkgbWF0Y2hcbiAqIHRocm91Z2ggYSB0eXBvIChgZ3RlYCBtaXNzcGVsbGVkIGBnbGVgKS4gV2l0aCBkZXYgbW9kZSBlbmFibGVkXG4gKiAoYGVuYWJsZURldk1vZGUoKWApLCBhIGNvbnNvbGUgd2FybmluZyBuYW1lcyB0aGUgdW5rbm93biBvcGVyYXRvciBhbmQga2V5LlxuICpcbiAqIEBwYXJhbSBnZXRWYWx1ZUZuIC0gUmVhZHMgYSB2YWx1ZSBmcm9tIHNjb3BlIGJ5IGtleSAocmF3LCBmb3IgY29tcGFyaXNvbilcbiAqIEBwYXJhbSBpc1JlZGFjdGVkRm4gLSBDaGVja3MgaWYgYSBrZXkgaXMgcmVkYWN0ZWQgKGZvciBldmlkZW5jZSBkaXNwbGF5KVxuICogQHBhcmFtIGZpbHRlciAtIFRoZSBXaGVyZUZpbHRlciB0byBldmFsdWF0ZVxuICogQHJldHVybnMgeyBtYXRjaGVkLCBjb25kaXRpb25zIH0g4oCUIG1hdGNoZWQgPSBhbGwgY29uZGl0aW9ucyBwYXNzZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2YWx1YXRlRmlsdGVyPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICBnZXRWYWx1ZUZuOiAoa2V5OiBzdHJpbmcpID0+IHVua25vd24sXG4gIGlzUmVkYWN0ZWRGbjogKGtleTogc3RyaW5nKSA9PiBib29sZWFuLFxuICBmaWx0ZXI6IFdoZXJlRmlsdGVyPFQ+LFxuKTogeyBtYXRjaGVkOiBib29sZWFuOyBjb25kaXRpb25zOiBGaWx0ZXJDb25kaXRpb25bXSB9IHtcbiAgY29uc3QgY29uZGl0aW9uczogRmlsdGVyQ29uZGl0aW9uW10gPSBbXTtcbiAgbGV0IGFsbE1hdGNoZWQgPSB0cnVlO1xuXG4gIGZvciAoY29uc3QgW2tleSwgb3BzXSBvZiBPYmplY3QuZW50cmllcyhmaWx0ZXIpKSB7XG4gICAgLy8gU2VjdXJpdHk6IGRlbmllZCBrZXlzIGNhdXNlIHJ1bGUgdG8gZmFpbCAoY29uc2lzdGVudCB3aXRoIHVua25vd24gb3BlcmF0b3IgYmVoYXZpb3IpXG4gICAgaWYgKERFTklFRF9LRVlTLmhhcyhrZXkpKSB7XG4gICAgICBhbGxNYXRjaGVkID0gZmFsc2U7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKCFvcHMgfHwgdHlwZW9mIG9wcyAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgYWN0dWFsID0gZ2V0VmFsdWVGbihrZXkpO1xuICAgIGNvbnN0IHJlZGFjdGVkID0gaXNSZWRhY3RlZEZuKGtleSk7XG4gICAgY29uc3QgZGlzcGxheVZhbHVlID0gcmVkYWN0ZWQgPyBTQ09QRV9QTEFDRUhPTERFUiA6IHN1bW1hcml6ZVZhbHVlKGFjdHVhbCwgTUFYX1ZBTFVFX0xFTik7XG5cbiAgICAvLyBFdmFsdWF0ZSBlYWNoIG9wZXJhdG9yIGluIHRoZSBGaWx0ZXJPcHMgZm9yIHRoaXMga2V5XG4gICAgZm9yIChjb25zdCBbb3AsIHRocmVzaG9sZF0gb2YgT2JqZWN0LmVudHJpZXMob3BzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSkge1xuICAgICAgY29uc3QgaGFuZGxlciA9IE9QRVJBVE9SX0hBTkRMRVJTW29wXTtcbiAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAvLyBVbmtub3duIG9wZXJhdG9yOiB0cmVhdCBhcyBmYWlsZWQgY29uZGl0aW9uIHNvIHJ1bGUgZG9lc24ndCBzcHVyaW91c2x5IG1hdGNoXG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFtmb290cHJpbnRdIGRlY2lkZSgpL3NlbGVjdCgpIGZpbHRlcjogdW5rbm93biBvcGVyYXRvciBcIiR7b3B9XCIgb24ga2V5IFwiJHtrZXl9XCIg4oCUIGAgK1xuICAgICAgICAgICAgICBgY29uZGl0aW9uIG5ldmVyIG1hdGNoZXMgKHZhbGlkIG9wZXJhdG9yczogJHtPYmplY3Qua2V5cyhPUEVSQVRPUl9IQU5ETEVSUykuam9pbignLCAnKX0pYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbmRpdGlvbnMucHVzaCh7IGtleSwgb3AsIHRocmVzaG9sZCwgYWN0dWFsU3VtbWFyeTogZGlzcGxheVZhbHVlLCByZXN1bHQ6IGZhbHNlLCByZWRhY3RlZCB9KTtcbiAgICAgICAgYWxsTWF0Y2hlZCA9IGZhbHNlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gaGFuZGxlcihhY3R1YWwsIHRocmVzaG9sZCk7XG4gICAgICBjb25kaXRpb25zLnB1c2goe1xuICAgICAgICBrZXksXG4gICAgICAgIG9wLFxuICAgICAgICB0aHJlc2hvbGQsXG4gICAgICAgIGFjdHVhbFN1bW1hcnk6IGRpc3BsYXlWYWx1ZSxcbiAgICAgICAgcmVzdWx0LFxuICAgICAgICByZWRhY3RlZCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXJlc3VsdCkgYWxsTWF0Y2hlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIEVtcHR5IGZpbHRlciAobm8gZXZhbHVhYmxlIGNvbmRpdGlvbnMpIHNob3VsZCBOT1QgbWF0Y2gg4oCUIHByZXZlbnRzIHZhY3VvdXNcbiAgLy8gdHJ1dGguIE5PVEU6IHRoaXMgZGVsaWJlcmF0ZWx5IGludmVydHMgUHJpc21hL1NRTCBgd2hlcmU6IHt9YCAoXCJtYXRjaFxuICAvLyBldmVyeXRoaW5nXCIpIOKAlCBzZWUgdGhlIGZ1bmN0aW9uIEpTRG9jLiBDYXRjaC1hbGxzIGJlbG9uZyBpbiBkZWNpZGUoKSdzXG4gIC8vIGV4cGxpY2l0IGRlZmF1bHRCcmFuY2gsIG5vdCBpbiBhbiBlbXB0eSBydWxlLlxuICBpZiAoY29uZGl0aW9ucy5sZW5ndGggPT09IDApIHJldHVybiB7IG1hdGNoZWQ6IGZhbHNlLCBjb25kaXRpb25zIH07XG5cbiAgcmV0dXJuIHsgbWF0Y2hlZDogYWxsTWF0Y2hlZCwgY29uZGl0aW9ucyB9O1xufVxuIl19
130
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZhbHVhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9kZWNpZGUvZXZhbHVhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFPM0QsTUFBTSxpQkFBaUIsR0FBK0I7SUFDcEQsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDckIsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDckIsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUUsQ0FBWSxHQUFJLENBQVk7SUFDM0MsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUUsQ0FBWSxJQUFLLENBQVk7SUFDN0MsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUUsQ0FBWSxHQUFJLENBQVk7SUFDM0MsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUUsQ0FBWSxJQUFLLENBQVk7SUFDN0MsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ1gsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDcEMsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLGlCQUFpQixFQUFFLENBQUM7WUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsaUJBQWlCLEVBQUUsQ0FB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LENBQUM7Z0JBQ25CLFNBQVM7WUFDWCxDQUFDO1lBRUQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMxQyxVQUFVLENBQUMsSUFBSSxDQUFDO2dCQUNkLEdBQUc7Z0JBQ0gsRUFBRTtnQkFDRixTQUFTO2dCQUNULGFBQWEsRUFBRSxZQUFZO2dCQUMzQixNQUFNO2dCQUNOLFFBQVE7YUFDVCxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsTUFBTTtnQkFBRSxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ2xDLENBQUM7SUFDSCxDQUFDO0lBRUQsNkVBQTZFO0lBQzdFLHdFQUF3RTtJQUN4RSx5RUFBeUU7SUFDekUsZ0RBQWdEO0lBQ2hELElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLENBQUM7SUFFbkUsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLENBQUM7QUFDN0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogZGVjaWRlL2V2YWx1YXRvciAtLSBQcmlzbWEtc3R5bGUgZmlsdGVyIGV2YWx1YXRvciBmb3IgZGVjaXNpb24gcnVsZXMuXG4gKlxuICogUHVyZSBmdW5jdGlvbi4gVGFrZXMgYSBXaGVyZUZpbHRlciwgYSB2YWx1ZSBnZXR0ZXIsIGFuZCBhIHJlZGFjdGlvbiBjaGVja2VyLlxuICogRXZhbHVhdGVzIGVhY2ggY29uZGl0aW9uLCByZWNvcmRzIHRoZSByZXN1bHQsIHJldHVybnMgbWF0Y2hlZC9jb25kaXRpb25zLlxuICpcbiAqIEFsbCBrZXlzIGluIHRoZSBmaWx0ZXIgYXJlIEFORGVkIChhbGwgbXVzdCBtYXRjaCBmb3IgdGhlIHJ1bGUgdG8gbWF0Y2gpLlxuICogRGVjb3VwbGVkIGZyb20gU2NvcGVGYWNhZGUg4oCUIHJlY2VpdmVzIGNhbGxiYWNrcywgbm90IHNjb3BlLlxuICovXG5cbmltcG9ydCB7IHN1bW1hcml6ZVZhbHVlIH0gZnJvbSAnLi4vY2FwdHVyZS9zdW1tYXJpemUuanMnO1xuaW1wb3J0IHsgaXNEZXZNb2RlIH0gZnJvbSAnLi4vZGV2TW9kZS5qcyc7XG5pbXBvcnQgeyBTQ09QRV9QTEFDRUhPTERFUiB9IGZyb20gJy4uL21lbW9yeS9yZWRhY3Rpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBGaWx0ZXJDb25kaXRpb24sIFdoZXJlRmlsdGVyIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8vIC0tIE9wZXJhdG9yIGRpc3BhdGNoIHRhYmxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudHlwZSBPcGVyYXRvckZuID0gKGFjdHVhbDogdW5rbm93biwgdGhyZXNob2xkOiB1bmtub3duKSA9PiBib29sZWFuO1xuXG5jb25zdCBPUEVSQVRPUl9IQU5ETEVSUzogUmVjb3JkPHN0cmluZywgT3BlcmF0b3JGbj4gPSB7XG4gIGVxOiAoYSwgdCkgPT4gYSA9PT0gdCxcbiAgbmU6IChhLCB0KSA9PiBhICE9PSB0LFxuICBndDogKGEsIHQpID0+IChhIGFzIG51bWJlcikgPiAodCBhcyBudW1iZXIpLFxuICBndGU6IChhLCB0KSA9PiAoYSBhcyBudW1iZXIpID49ICh0IGFzIG51bWJlciksXG4gIGx0OiAoYSwgdCkgPT4gKGEgYXMgbnVtYmVyKSA8ICh0IGFzIG51bWJlciksXG4gIGx0ZTogKGEsIHQpID0+IChhIGFzIG51bWJlcikgPD0gKHQgYXMgbnVtYmVyKSxcbiAgaW46IChhLCB0KSA9PiB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHQpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHQubGVuZ3RoID4gTUFYX0lOX0FSUkFZX1NJWkUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgaW4vbm90SW4gYXJyYXkgZXhjZWVkcyBtYXhpbXVtIHNpemUgb2YgJHtNQVhfSU5fQVJSQVlfU0laRX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHQuaW5jbHVkZXMoYSk7XG4gIH0sXG4gIG5vdEluOiAoYSwgdCkgPT4ge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh0KSkgcmV0dXJuIHRydWU7IC8vIG5vdCBpbiBhIG5vbi1hcnJheSA9IHZhY3VvdXNseSB0cnVlXG4gICAgaWYgKHQubGVuZ3RoID4gTUFYX0lOX0FSUkFZX1NJWkUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgaW4vbm90SW4gYXJyYXkgZXhjZWVkcyBtYXhpbXVtIHNpemUgb2YgJHtNQVhfSU5fQVJSQVlfU0laRX1gKTtcbiAgICB9XG4gICAgcmV0dXJuICF0LmluY2x1ZGVzKGEpO1xuICB9LFxufTtcblxuLy8gLS0gU2VjdXJpdHk6IHByb3RvdHlwZSBwb2xsdXRpb24gZGVueWxpc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBERU5JRURfS0VZUyA9IG5ldyBTZXQoW1xuICAnX19wcm90b19fJyxcbiAgJ2NvbnN0cnVjdG9yJyxcbiAgJ3Byb3RvdHlwZScsXG4gICd0b1N0cmluZycsXG4gICd2YWx1ZU9mJyxcbiAgJ2hhc093blByb3BlcnR5JyxcbiAgJ2lzUHJvdG90eXBlT2YnLFxuICAncHJvcGVydHlJc0VudW1lcmFibGUnLFxuICAnX19kZWZpbmVHZXR0ZXJfXycsXG4gICdfX2RlZmluZVNldHRlcl9fJyxcbiAgJ19fbG9va3VwR2V0dGVyX18nLFxuICAnX19sb29rdXBTZXR0ZXJfXycsXG5dKTtcblxuLy8gLS0gQ29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBNQVhfSU5fQVJSQVlfU0laRSA9IDEwMDA7XG5jb25zdCBNQVhfVkFMVUVfTEVOID0gODA7XG5cbi8vIC0tIEV2YWx1YXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBFdmFsdWF0ZXMgYSBQcmlzbWEtc3R5bGUgZmlsdGVyIGFnYWluc3Qgc2NvcGUgdmFsdWVzLlxuICpcbiAqICMjIEVtcHR5IGZpbHRlciDihpIgTk8gbWF0Y2ggKGFudGktdmFjdW91cy10cnV0aCDigJQgaW52ZXJ0cyBQcmlzbWEvU1FMKVxuICpcbiAqIEEgZmlsdGVyIHdpdGggbm8gZXZhbHVhYmxlIGNvbmRpdGlvbnMgKGB7fWAsIG9yIG9ubHkgZGVuaWVkL25vbi1vYmplY3RcbiAqIGtleXMpIHJldHVybnMgYG1hdGNoZWQ6IGZhbHNlYC4gVGhpcyBkZWxpYmVyYXRlbHkgSU5WRVJUUyB0aGUgUHJpc21hL1NRTFxuICogaW50dWl0aW9uIHdoZXJlIGB3aGVyZToge31gIG1hdGNoZXMgZXZlcnl0aGluZzogaW4gYSBkZWNpc2lvbiBydWxlLCBhIHJ1bGVcbiAqIHRoYXQgYXNzZXJ0cyBub3RoaW5nIHNob3VsZCBuZXZlciB3aW4gYSBicmFuY2gg4oCUIFwiYWxsIHplcm8gY29uZGl0aW9uc1xuICogcGFzc2VkXCIgaXMgdmFjdW91cyB0cnV0aCwgYW5kIHNpbGVudGx5IHJvdXRpbmcgb24gaXQgd291bGQgZmFicmljYXRlXG4gKiBkZWNpc2lvbiBldmlkZW5jZS4gV2FudCBhIGNhdGNoLWFsbD8gVXNlIHRoZSBleHBsaWNpdCBgZGVmYXVsdEJyYW5jaGBcbiAqIGFyZ3VtZW50IG9mIGBkZWNpZGUoKWAgaW5zdGVhZCBvZiBhbiBlbXB0eSBgd2hlbmAuXG4gKlxuICogIyMgVW5rbm93biBvcGVyYXRvcnMg4oaSIGNvbmRpdGlvbiBmYWlscyAoKyBkZXYtbW9kZSB3YXJuaW5nKVxuICpcbiAqIEFuIG9wZXJhdG9yIG91dHNpZGUgdGhlIHN1cHBvcnRlZCBzZXQgKGBlcSwgbmUsIGd0LCBndGUsIGx0LCBsdGUsIGluLFxuICogbm90SW5gKSByZWNvcmRzIGEgZmFpbGVkIGNvbmRpdGlvbiDigJQgdGhlIHJ1bGUgY2FuIG5ldmVyIHNwdXJpb3VzbHkgbWF0Y2hcbiAqIHRocm91Z2ggYSB0eXBvIChgZ3RlYCBtaXNzcGVsbGVkIGBnbGVgKS4gV2l0aCBkZXYgbW9kZSBlbmFibGVkXG4gKiAoYGVuYWJsZURldk1vZGUoKWApLCBhIGNvbnNvbGUgd2FybmluZyBuYW1lcyB0aGUgdW5rbm93biBvcGVyYXRvciBhbmQga2V5LlxuICpcbiAqIEBwYXJhbSBnZXRWYWx1ZUZuIC0gUmVhZHMgYSB2YWx1ZSBmcm9tIHNjb3BlIGJ5IGtleSAocmF3LCBmb3IgY29tcGFyaXNvbilcbiAqIEBwYXJhbSBpc1JlZGFjdGVkRm4gLSBDaGVja3MgaWYgYSBrZXkgaXMgcmVkYWN0ZWQgKGZvciBldmlkZW5jZSBkaXNwbGF5KVxuICogQHBhcmFtIGZpbHRlciAtIFRoZSBXaGVyZUZpbHRlciB0byBldmFsdWF0ZVxuICogQHJldHVybnMgeyBtYXRjaGVkLCBjb25kaXRpb25zIH0g4oCUIG1hdGNoZWQgPSBhbGwgY29uZGl0aW9ucyBwYXNzZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2YWx1YXRlRmlsdGVyPFQgZXh0ZW5kcyBvYmplY3Q+KFxuICBnZXRWYWx1ZUZuOiAoa2V5OiBzdHJpbmcpID0+IHVua25vd24sXG4gIGlzUmVkYWN0ZWRGbjogKGtleTogc3RyaW5nKSA9PiBib29sZWFuLFxuICBmaWx0ZXI6IFdoZXJlRmlsdGVyPFQ+LFxuKTogeyBtYXRjaGVkOiBib29sZWFuOyBjb25kaXRpb25zOiBGaWx0ZXJDb25kaXRpb25bXSB9IHtcbiAgY29uc3QgY29uZGl0aW9uczogRmlsdGVyQ29uZGl0aW9uW10gPSBbXTtcbiAgbGV0IGFsbE1hdGNoZWQgPSB0cnVlO1xuXG4gIGZvciAoY29uc3QgW2tleSwgb3BzXSBvZiBPYmplY3QuZW50cmllcyhmaWx0ZXIpKSB7XG4gICAgLy8gU2VjdXJpdHk6IGRlbmllZCBrZXlzIGNhdXNlIHJ1bGUgdG8gZmFpbCAoY29uc2lzdGVudCB3aXRoIHVua25vd24gb3BlcmF0b3IgYmVoYXZpb3IpXG4gICAgaWYgKERFTklFRF9LRVlTLmhhcyhrZXkpKSB7XG4gICAgICBhbGxNYXRjaGVkID0gZmFsc2U7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKCFvcHMgfHwgdHlwZW9mIG9wcyAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgYWN0dWFsID0gZ2V0VmFsdWVGbihrZXkpO1xuICAgIGNvbnN0IHJlZGFjdGVkID0gaXNSZWRhY3RlZEZuKGtleSk7XG4gICAgY29uc3QgZGlzcGxheVZhbHVlID0gcmVkYWN0ZWQgPyBTQ09QRV9QTEFDRUhPTERFUiA6IHN1bW1hcml6ZVZhbHVlKGFjdHVhbCwgTUFYX1ZBTFVFX0xFTik7XG5cbiAgICAvLyBFdmFsdWF0ZSBlYWNoIG9wZXJhdG9yIGluIHRoZSBGaWx0ZXJPcHMgZm9yIHRoaXMga2V5XG4gICAgZm9yIChjb25zdCBbb3AsIHRocmVzaG9sZF0gb2YgT2JqZWN0LmVudHJpZXMob3BzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSkge1xuICAgICAgY29uc3QgaGFuZGxlciA9IE9QRVJBVE9SX0hBTkRMRVJTW29wXTtcbiAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAvLyBVbmtub3duIG9wZXJhdG9yOiB0cmVhdCBhcyBmYWlsZWQgY29uZGl0aW9uIHNvIHJ1bGUgZG9lc24ndCBzcHVyaW91c2x5IG1hdGNoXG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFtmb290cHJpbnRdIGRlY2lkZSgpL3NlbGVjdCgpIGZpbHRlcjogdW5rbm93biBvcGVyYXRvciBcIiR7b3B9XCIgb24ga2V5IFwiJHtrZXl9XCIg4oCUIGAgK1xuICAgICAgICAgICAgICBgY29uZGl0aW9uIG5ldmVyIG1hdGNoZXMgKHZhbGlkIG9wZXJhdG9yczogJHtPYmplY3Qua2V5cyhPUEVSQVRPUl9IQU5ETEVSUykuam9pbignLCAnKX0pYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbmRpdGlvbnMucHVzaCh7IGtleSwgb3AsIHRocmVzaG9sZCwgYWN0dWFsU3VtbWFyeTogZGlzcGxheVZhbHVlLCByZXN1bHQ6IGZhbHNlLCByZWRhY3RlZCB9KTtcbiAgICAgICAgYWxsTWF0Y2hlZCA9IGZhbHNlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gaGFuZGxlcihhY3R1YWwsIHRocmVzaG9sZCk7XG4gICAgICBjb25kaXRpb25zLnB1c2goe1xuICAgICAgICBrZXksXG4gICAgICAgIG9wLFxuICAgICAgICB0aHJlc2hvbGQsXG4gICAgICAgIGFjdHVhbFN1bW1hcnk6IGRpc3BsYXlWYWx1ZSxcbiAgICAgICAgcmVzdWx0LFxuICAgICAgICByZWRhY3RlZCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXJlc3VsdCkgYWxsTWF0Y2hlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIEVtcHR5IGZpbHRlciAobm8gZXZhbHVhYmxlIGNvbmRpdGlvbnMpIHNob3VsZCBOT1QgbWF0Y2gg4oCUIHByZXZlbnRzIHZhY3VvdXNcbiAgLy8gdHJ1dGguIE5PVEU6IHRoaXMgZGVsaWJlcmF0ZWx5IGludmVydHMgUHJpc21hL1NRTCBgd2hlcmU6IHt9YCAoXCJtYXRjaFxuICAvLyBldmVyeXRoaW5nXCIpIOKAlCBzZWUgdGhlIGZ1bmN0aW9uIEpTRG9jLiBDYXRjaC1hbGxzIGJlbG9uZyBpbiBkZWNpZGUoKSdzXG4gIC8vIGV4cGxpY2l0IGRlZmF1bHRCcmFuY2gsIG5vdCBpbiBhbiBlbXB0eSBydWxlLlxuICBpZiAoY29uZGl0aW9ucy5sZW5ndGggPT09IDApIHJldHVybiB7IG1hdGNoZWQ6IGZhbHNlLCBjb25kaXRpb25zIH07XG5cbiAgcmV0dXJuIHsgbWF0Y2hlZDogYWxsTWF0Y2hlZCwgY29uZGl0aW9ucyB9O1xufVxuIl19
@@ -7,7 +7,7 @@
7
7
  * Uses summarizeValue() at capture time (no raw object references held).
8
8
  */
9
9
  import { summarizeValue } from '../capture/summarize.js';
10
- import { SCOPE_PLACEHOLDER } from '../memory/placeholders.js';
10
+ import { SCOPE_PLACEHOLDER } from '../memory/redaction.js';
11
11
  const MAX_VALUE_LEN = 80;
12
12
  let evidenceCounter = 0;
13
13
  /**
@@ -34,4 +34,4 @@ export class EvidenceCollector {
34
34
  return this.inputs;
35
35
  }
36
36
  }
37
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZpZGVuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2RlY2lkZS9ldmlkZW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBRUgsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBSTlELE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQztBQUV6QixJQUFJLGVBQWUsR0FBRyxDQUFDLENBQUM7QUFFeEI7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGlCQUFpQjtJQUNuQixFQUFFLENBQVM7SUFDWixNQUFNLEdBQWdCLEVBQUUsQ0FBQztJQUVqQztRQUNFLElBQUksQ0FBQyxFQUFFLEdBQUcsWUFBWSxFQUFFLGVBQWUsRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBZ0I7UUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHO1lBQUUsT0FBTztRQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztZQUNmLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRztZQUNkLFlBQVksRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDO1lBQzdGLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUSxLQUFLLElBQUk7U0FDbEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHFDQUFxQztJQUNyQyxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogZGVjaWRlL2V2aWRlbmNlIC0tIExpZ2h0d2VpZ2h0IHRlbXAgcmVjb3JkZXIgZm9yIGF1dG8tY2FwdHVyaW5nIHJlYWRzXG4gKiBkdXJpbmcgYSB3aGVuKCkgZnVuY3Rpb24gY2FsbC5cbiAqXG4gKiBBdHRhY2hlZCB0byBzY29wZSBiZWZvcmUgY2FsbGluZyB3aGVuKHNjb3BlKSwgZGV0YWNoZWQgYWZ0ZXIuXG4gKiBDYXB0dXJlcyBSZWFkRXZlbnQga2V5ICsgc3VtbWFyaXplZCB2YWx1ZSArIHJlZGFjdGlvbiBmbGFnLlxuICogVXNlcyBzdW1tYXJpemVWYWx1ZSgpIGF0IGNhcHR1cmUgdGltZSAobm8gcmF3IG9iamVjdCByZWZlcmVuY2VzIGhlbGQpLlxuICovXG5cbmltcG9ydCB7IHN1bW1hcml6ZVZhbHVlIH0gZnJvbSAnLi4vY2FwdHVyZS9zdW1tYXJpemUuanMnO1xuaW1wb3J0IHsgU0NPUEVfUExBQ0VIT0xERVIgfSBmcm9tICcuLi9tZW1vcnkvcGxhY2Vob2xkZXJzLmpzJztcbmltcG9ydCB0eXBlIHsgUmVhZEV2ZW50LCBTY29wZVJlY29yZGVyIH0gZnJvbSAnLi4vc2NvcGUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWFkSW5wdXQgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuY29uc3QgTUFYX1ZBTFVFX0xFTiA9IDgwO1xuXG5sZXQgZXZpZGVuY2VDb3VudGVyID0gMDtcblxuLyoqXG4gKiBNaW5pbWFsIFNjb3BlUmVjb3JkZXIgdGhhdCBjYXB0dXJlcyByZWFkcyBmb3IgZGVjaXNpb24gZXZpZGVuY2UuXG4gKiBBdHRhY2ggYmVmb3JlIHdoZW4oKSwgZGV0YWNoIGFmdGVyLiBDb2xsZWN0IHZpYSBnZXRJbnB1dHMoKS5cbiAqL1xuZXhwb3J0IGNsYXNzIEV2aWRlbmNlQ29sbGVjdG9yIGltcGxlbWVudHMgU2NvcGVSZWNvcmRlciB7XG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gIHByaXZhdGUgaW5wdXRzOiBSZWFkSW5wdXRbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaWQgPSBgZXZpZGVuY2UtJHsrK2V2aWRlbmNlQ291bnRlcn1gO1xuICB9XG5cbiAgb25SZWFkKGV2ZW50OiBSZWFkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIWV2ZW50LmtleSkgcmV0dXJuO1xuICAgIHRoaXMuaW5wdXRzLnB1c2goe1xuICAgICAga2V5OiBldmVudC5rZXksXG4gICAgICB2YWx1ZVN1bW1hcnk6IGV2ZW50LnJlZGFjdGVkID8gU0NPUEVfUExBQ0VIT0xERVIgOiBzdW1tYXJpemVWYWx1ZShldmVudC52YWx1ZSwgTUFYX1ZBTFVFX0xFTiksXG4gICAgICByZWRhY3RlZDogZXZlbnQucmVkYWN0ZWQgPT09IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICAvKiogUmV0dXJucyBjb2xsZWN0ZWQgcmVhZCBpbnB1dHMuICovXG4gIGdldElucHV0cygpOiBSZWFkSW5wdXRbXSB7XG4gICAgcmV0dXJuIHRoaXMuaW5wdXRzO1xuICB9XG59XG4iXX0=
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZpZGVuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2RlY2lkZS9ldmlkZW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBRUgsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBSTNELE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQztBQUV6QixJQUFJLGVBQWUsR0FBRyxDQUFDLENBQUM7QUFFeEI7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGlCQUFpQjtJQUNuQixFQUFFLENBQVM7SUFDWixNQUFNLEdBQWdCLEVBQUUsQ0FBQztJQUVqQztRQUNFLElBQUksQ0FBQyxFQUFFLEdBQUcsWUFBWSxFQUFFLGVBQWUsRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBZ0I7UUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHO1lBQUUsT0FBTztRQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztZQUNmLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRztZQUNkLFlBQVksRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDO1lBQzdGLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUSxLQUFLLElBQUk7U0FDbEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHFDQUFxQztJQUNyQyxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogZGVjaWRlL2V2aWRlbmNlIC0tIExpZ2h0d2VpZ2h0IHRlbXAgcmVjb3JkZXIgZm9yIGF1dG8tY2FwdHVyaW5nIHJlYWRzXG4gKiBkdXJpbmcgYSB3aGVuKCkgZnVuY3Rpb24gY2FsbC5cbiAqXG4gKiBBdHRhY2hlZCB0byBzY29wZSBiZWZvcmUgY2FsbGluZyB3aGVuKHNjb3BlKSwgZGV0YWNoZWQgYWZ0ZXIuXG4gKiBDYXB0dXJlcyBSZWFkRXZlbnQga2V5ICsgc3VtbWFyaXplZCB2YWx1ZSArIHJlZGFjdGlvbiBmbGFnLlxuICogVXNlcyBzdW1tYXJpemVWYWx1ZSgpIGF0IGNhcHR1cmUgdGltZSAobm8gcmF3IG9iamVjdCByZWZlcmVuY2VzIGhlbGQpLlxuICovXG5cbmltcG9ydCB7IHN1bW1hcml6ZVZhbHVlIH0gZnJvbSAnLi4vY2FwdHVyZS9zdW1tYXJpemUuanMnO1xuaW1wb3J0IHsgU0NPUEVfUExBQ0VIT0xERVIgfSBmcm9tICcuLi9tZW1vcnkvcmVkYWN0aW9uLmpzJztcbmltcG9ydCB0eXBlIHsgUmVhZEV2ZW50LCBTY29wZVJlY29yZGVyIH0gZnJvbSAnLi4vc2NvcGUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWFkSW5wdXQgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuY29uc3QgTUFYX1ZBTFVFX0xFTiA9IDgwO1xuXG5sZXQgZXZpZGVuY2VDb3VudGVyID0gMDtcblxuLyoqXG4gKiBNaW5pbWFsIFNjb3BlUmVjb3JkZXIgdGhhdCBjYXB0dXJlcyByZWFkcyBmb3IgZGVjaXNpb24gZXZpZGVuY2UuXG4gKiBBdHRhY2ggYmVmb3JlIHdoZW4oKSwgZGV0YWNoIGFmdGVyLiBDb2xsZWN0IHZpYSBnZXRJbnB1dHMoKS5cbiAqL1xuZXhwb3J0IGNsYXNzIEV2aWRlbmNlQ29sbGVjdG9yIGltcGxlbWVudHMgU2NvcGVSZWNvcmRlciB7XG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gIHByaXZhdGUgaW5wdXRzOiBSZWFkSW5wdXRbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaWQgPSBgZXZpZGVuY2UtJHsrK2V2aWRlbmNlQ291bnRlcn1gO1xuICB9XG5cbiAgb25SZWFkKGV2ZW50OiBSZWFkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIWV2ZW50LmtleSkgcmV0dXJuO1xuICAgIHRoaXMuaW5wdXRzLnB1c2goe1xuICAgICAga2V5OiBldmVudC5rZXksXG4gICAgICB2YWx1ZVN1bW1hcnk6IGV2ZW50LnJlZGFjdGVkID8gU0NPUEVfUExBQ0VIT0xERVIgOiBzdW1tYXJpemVWYWx1ZShldmVudC52YWx1ZSwgTUFYX1ZBTFVFX0xFTiksXG4gICAgICByZWRhY3RlZDogZXZlbnQucmVkYWN0ZWQgPT09IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICAvKiogUmV0dXJucyBjb2xsZWN0ZWQgcmVhZCBpbnB1dHMuICovXG4gIGdldElucHV0cygpOiBSZWFkSW5wdXRbXSB7XG4gICAgcmV0dXJuIHRoaXMuaW5wdXRzO1xuICB9XG59XG4iXX0=
@@ -11,7 +11,7 @@
11
11
  * Total: a payload whose scrub fails (an uncloneable value under a selected
12
12
  * field) is served as the placeholder — never raw, and never a failed pause.
13
13
  */
14
- import { SCOPE_PLACEHOLDER } from '../../memory/placeholders.js';
14
+ import { SCOPE_PLACEHOLDER } from '../../memory/redaction.js';
15
15
  export function servedPause(context, pauseData) {
16
16
  const rule = context.getRedactionRule();
17
17
  if (!rule)
@@ -23,4 +23,4 @@ export function servedPause(context, pauseData) {
23
23
  return SCOPE_PLACEHOLDER;
24
24
  }
25
25
  }
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVkUGF1c2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9zZXJ2ZWRQYXVzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7O0dBWUc7QUFFSCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUdqRSxNQUFNLFVBQVUsV0FBVyxDQUFDLE9BQXFCLEVBQUUsU0FBa0I7SUFDbkUsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDeEMsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM1QixJQUFJLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8saUJBQWlCLENBQUM7SUFDM0IsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHNlcnZlZFBhdXNlIOKAlCB0aGUgT05FIHBsYWNlIGEgcGF1c2UgcGF5bG9hZCdzIFNFUlZFRCBmb3JtIGlzIGRlY2lkZWQuXG4gKlxuICogQSBwYXVzZSBwYXlsb2FkIChhIHBhdXNhYmxlIHN0YWdlJ3MgcmV0dXJuLCBhbiBgaW50ZXJydXB0KClgIHBheWxvYWQpIGlzIGFcbiAqIHJlY29yZCBoYW5kZWQgb3V0IHdob2xlLCBzbyBldmVyeSBvYnNlcnZlciBpcyBzZXJ2ZWQgaXQgdW5kZXIgdGhlIHJ1bidzXG4gKiByZWRhY3Rpb24gcnVsZSAoYFJlZGFjdGlvblJ1bGUucmV0YWluQm91bmRhcnlgOiBpdHMga2V5cyBhdCBldmVyeSBkZXB0aCkg4oCUXG4gKiB0aGUgc2NvcGUgYW5kIGZsb3cgYG9uUGF1c2VgIGV2ZW50cywgaW5saW5lIGFuZCBkZWZlcnJlZCwgYW5kIHdpdGggdGhlbSB0aGVcbiAqIG5hcnJhdGl2ZSBhbmQgZXZlcnkgcmVjb3JkZXIgcm93LiBUaGUgQ0hFQ0tQT0lOVCBrZWVwcyB0aGUgcmVhbCBwYXlsb2FkOlxuICogcmVzdW1lIGhhbmRzIGl0IGJhY2sgdG8gdGhlIGNhbGxlciwgd2hvIGFza2VkIHRoZSBxdWVzdGlvbi5cbiAqXG4gKiBUb3RhbDogYSBwYXlsb2FkIHdob3NlIHNjcnViIGZhaWxzIChhbiB1bmNsb25lYWJsZSB2YWx1ZSB1bmRlciBhIHNlbGVjdGVkXG4gKiBmaWVsZCkgaXMgc2VydmVkIGFzIHRoZSBwbGFjZWhvbGRlciDigJQgbmV2ZXIgcmF3LCBhbmQgbmV2ZXIgYSBmYWlsZWQgcGF1c2UuXG4gKi9cblxuaW1wb3J0IHsgU0NPUEVfUExBQ0VIT0xERVIgfSBmcm9tICcuLi8uLi9tZW1vcnkvcGxhY2Vob2xkZXJzLmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2ZWRQYXVzZShjb250ZXh0OiBTdGFnZUNvbnRleHQsIHBhdXNlRGF0YTogdW5rbm93bik6IHVua25vd24ge1xuICBjb25zdCBydWxlID0gY29udGV4dC5nZXRSZWRhY3Rpb25SdWxlKCk7XG4gIGlmICghcnVsZSkgcmV0dXJuIHBhdXNlRGF0YTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcnVsZS5yZXRhaW5Cb3VuZGFyeShwYXVzZURhdGEpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gU0NPUEVfUExBQ0VIT0xERVI7XG4gIH1cbn1cbiJdfQ==
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVkUGF1c2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2VuZ2luZS9oYW5kbGVycy9zZXJ2ZWRQYXVzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7O0dBWUc7QUFFSCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUc5RCxNQUFNLFVBQVUsV0FBVyxDQUFDLE9BQXFCLEVBQUUsU0FBa0I7SUFDbkUsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDeEMsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM1QixJQUFJLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8saUJBQWlCLENBQUM7SUFDM0IsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHNlcnZlZFBhdXNlIOKAlCB0aGUgT05FIHBsYWNlIGEgcGF1c2UgcGF5bG9hZCdzIFNFUlZFRCBmb3JtIGlzIGRlY2lkZWQuXG4gKlxuICogQSBwYXVzZSBwYXlsb2FkIChhIHBhdXNhYmxlIHN0YWdlJ3MgcmV0dXJuLCBhbiBgaW50ZXJydXB0KClgIHBheWxvYWQpIGlzIGFcbiAqIHJlY29yZCBoYW5kZWQgb3V0IHdob2xlLCBzbyBldmVyeSBvYnNlcnZlciBpcyBzZXJ2ZWQgaXQgdW5kZXIgdGhlIHJ1bidzXG4gKiByZWRhY3Rpb24gcnVsZSAoYFJlZGFjdGlvblJ1bGUucmV0YWluQm91bmRhcnlgOiBpdHMga2V5cyBhdCBldmVyeSBkZXB0aCkg4oCUXG4gKiB0aGUgc2NvcGUgYW5kIGZsb3cgYG9uUGF1c2VgIGV2ZW50cywgaW5saW5lIGFuZCBkZWZlcnJlZCwgYW5kIHdpdGggdGhlbSB0aGVcbiAqIG5hcnJhdGl2ZSBhbmQgZXZlcnkgcmVjb3JkZXIgcm93LiBUaGUgQ0hFQ0tQT0lOVCBrZWVwcyB0aGUgcmVhbCBwYXlsb2FkOlxuICogcmVzdW1lIGhhbmRzIGl0IGJhY2sgdG8gdGhlIGNhbGxlciwgd2hvIGFza2VkIHRoZSBxdWVzdGlvbi5cbiAqXG4gKiBUb3RhbDogYSBwYXlsb2FkIHdob3NlIHNjcnViIGZhaWxzIChhbiB1bmNsb25lYWJsZSB2YWx1ZSB1bmRlciBhIHNlbGVjdGVkXG4gKiBmaWVsZCkgaXMgc2VydmVkIGFzIHRoZSBwbGFjZWhvbGRlciDigJQgbmV2ZXIgcmF3LCBhbmQgbmV2ZXIgYSBmYWlsZWQgcGF1c2UuXG4gKi9cblxuaW1wb3J0IHsgU0NPUEVfUExBQ0VIT0xERVIgfSBmcm9tICcuLi8uLi9tZW1vcnkvcmVkYWN0aW9uLmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VDb250ZXh0IH0gZnJvbSAnLi4vLi4vbWVtb3J5L1N0YWdlQ29udGV4dC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2ZWRQYXVzZShjb250ZXh0OiBTdGFnZUNvbnRleHQsIHBhdXNlRGF0YTogdW5rbm93bik6IHVua25vd24ge1xuICBjb25zdCBydWxlID0gY29udGV4dC5nZXRSZWRhY3Rpb25SdWxlKCk7XG4gIGlmICghcnVsZSkgcmV0dXJuIHBhdXNlRGF0YTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcnVsZS5yZXRhaW5Cb3VuZGFyeShwYXVzZURhdGEpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gU0NPUEVfUExBQ0VIT0xERVI7XG4gIH1cbn1cbiJdfQ==
@@ -3,10 +3,11 @@
3
3
  *
4
4
  * What a stage's frame needs to READ and WRITE the record, and nothing about the stage inside a run:
5
5
  * where it writes (its address), what it read first (the first-touch base), what it staged (the lazy
6
- * transaction buffer), which keys it read (the readKeys list), and where a commit lands (live state,
7
- * the redacted mirror, the log — through `recordCommit`). The engine's frame (`StageContext`, L4)
8
- * composes one and keeps the rest: retention, diagnostics, the dev-mode warnings, the commit observer
9
- * and the redaction verdict.
6
+ * transaction buffer) and which of it the log must not show (the scrub of each write), which keys it
7
+ * read (the readKeys list), and where a commit lands (live state, the redacted mirror, the log —
8
+ * through `recordCommit`). The engine's frame (`StageContext`, L4) composes one and keeps the rest:
9
+ * retention, diagnostics, the dev-mode warnings, the commit observer and the redaction DECISION —
10
+ * which value is secret (`redaction.ts · decideWrite`); the frame writes the bytes it is handed (C4).
10
11
  *
11
12
  * THE LAW:
12
13
  * 1. ADDRESS. The frame reads and writes at its address, a path prefix the engine computed and hands
@@ -28,11 +29,17 @@
28
29
  * the names, and hands both to `recordCommit`. `release` drops the buffer and the base; a frame
29
30
  * touched again re-anchors on the state as it stands then. The readKeys list survives a release,
30
31
  * and goes with `discard` (a failed attempt never happened).
32
+ * 7. WRITE. `write(path, value, verb, scrub?)` is the one way to stage: `set`, `merge` or `delete`
33
+ * at an absolute path (the address already joined — `at`), with the bytes of a redaction
34
+ * verdict. `whole` → the log and the mirror carry `LOG_PLACEHOLDER` at the path; `fields` → at
35
+ * each field inside the value (a literal key and, when dotted, the nested path) — wherever it
36
+ * holds a value at commit (`scrub.ts`). No scrub → the value as it is. The frame never decides
37
+ * a scrub, and nothing outside it reaches its buffer.
31
38
  */
39
+ import type { OpVerb } from './deltaEncoding.js';
32
40
  import type { EventLog } from './EventLog.js';
33
41
  import { type CommitStamp } from './recordCommit.js';
34
42
  import type { SharedMemory } from './SharedMemory.js';
35
- import { TransactionBuffer } from './TransactionBuffer.js';
36
43
  import type { CommitValuesMode, WriteProvenanceMode } from './types.js';
37
44
  /**
38
45
  * The two dials that shape a frame's bytes: the log's value encoding and the per-row read prefix.
@@ -43,6 +50,21 @@ export interface RecordEncoding {
43
50
  readonly commitValues: CommitValuesMode;
44
51
  readonly writeProvenance: WriteProvenanceMode;
45
52
  }
53
+ /**
54
+ * What a stage can stage (law 7) — the transaction buffer's op verbs (`deltaEncoding.ts · OpVerb`), one
55
+ * union. `append` is not one: it is how the log encodes a grown array (`'delta'`).
56
+ */
57
+ export type WriteVerb = OpVerb;
58
+ /**
59
+ * The bytes of a redaction verdict for one write (law 7): which of it the commit log and the redacted
60
+ * mirror must not show. The engine decides it (`redaction.ts · decideWrite`); the frame only writes it.
61
+ */
62
+ export interface WriteScrub {
63
+ /** The whole value: `LOG_PLACEHOLDER` at the write's path. */
64
+ readonly whole?: boolean;
65
+ /** Dot-paths INSIDE the value, relative to it: `LOG_PLACEHOLDER` at each one that holds a value. */
66
+ readonly fields?: readonly string[];
67
+ }
46
68
  export declare class RecordFrame {
47
69
  /** Live committed state — the heap every frame of the run shares. */
48
70
  readonly state: SharedMemory;
@@ -129,8 +151,21 @@ export declare class RecordFrame {
129
151
  * The buffer's base is the FIRST-TOUCH view, NOT the live state at write time: under parallel forks
130
152
  * a sibling may have committed between this frame's first read and this write, and the net-change
131
153
  * diff base must stay anchored at first touch to match the eager engine — see {@link firstTouch}.
154
+ *
155
+ * Private since C4: every write goes through {@link write}, so the scrub travels with the op.
156
+ */
157
+ private getTransactionBuffer;
158
+ /**
159
+ * Stage one write (law 7): `verb` at `path` — an absolute path, the address already joined
160
+ * ({@link at}) — and the bytes of its redaction verdict. The first write builds the buffer (law 4).
161
+ *
162
+ * The scrub registers paths, never values: `whole` marks the op's own path, `fields` each field
163
+ * inside the value (a literal key and, when dotted, the nested path); `recordCommit` puts the
164
+ * log's placeholder wherever one of them holds a value at commit, for the mirror and the log only
165
+ * (`scrub.ts`). Live state takes the value as it is. A path marked by a write that the net-change
166
+ * filter drops goes with it.
132
167
  */
133
- getTransactionBuffer(): TransactionBuffer;
168
+ write(path: (string | number)[], value: unknown, verb: WriteVerb, scrub?: WriteScrub): void;
134
169
  /** Has the frame staged a write since its last release — does its buffer exist? */
135
170
  get hasStaged(): boolean;
136
171
  /**
@@ -3,10 +3,11 @@
3
3
  *
4
4
  * What a stage's frame needs to READ and WRITE the record, and nothing about the stage inside a run:
5
5
  * where it writes (its address), what it read first (the first-touch base), what it staged (the lazy
6
- * transaction buffer), which keys it read (the readKeys list), and where a commit lands (live state,
7
- * the redacted mirror, the log — through `recordCommit`). The engine's frame (`StageContext`, L4)
8
- * composes one and keeps the rest: retention, diagnostics, the dev-mode warnings, the commit observer
9
- * and the redaction verdict.
6
+ * transaction buffer) and which of it the log must not show (the scrub of each write), which keys it
7
+ * read (the readKeys list), and where a commit lands (live state, the redacted mirror, the log —
8
+ * through `recordCommit`). The engine's frame (`StageContext`, L4) composes one and keeps the rest:
9
+ * retention, diagnostics, the dev-mode warnings, the commit observer and the redaction DECISION —
10
+ * which value is secret (`redaction.ts · decideWrite`); the frame writes the bytes it is handed (C4).
10
11
  *
11
12
  * THE LAW:
12
13
  * 1. ADDRESS. The frame reads and writes at its address, a path prefix the engine computed and hands
@@ -28,6 +29,12 @@
28
29
  * the names, and hands both to `recordCommit`. `release` drops the buffer and the base; a frame
29
30
  * touched again re-anchors on the state as it stands then. The readKeys list survives a release,
30
31
  * and goes with `discard` (a failed attempt never happened).
32
+ * 7. WRITE. `write(path, value, verb, scrub?)` is the one way to stage: `set`, `merge` or `delete`
33
+ * at an absolute path (the address already joined — `at`), with the bytes of a redaction
34
+ * verdict. `whole` → the log and the mirror carry `LOG_PLACEHOLDER` at the path; `fields` → at
35
+ * each field inside the value (a literal key and, when dotted, the nested path) — wherever it
36
+ * holds a value at commit (`scrub.ts`). No scrub → the value as it is. The frame never decides
37
+ * a scrub, and nothing outside it reaches its buffer.
31
38
  */
32
39
  import { nativeGet } from './pathOps.js';
33
40
  import { recordCommit } from './recordCommit.js';
@@ -151,6 +158,8 @@ export class RecordFrame {
151
158
  * The buffer's base is the FIRST-TOUCH view, NOT the live state at write time: under parallel forks
152
159
  * a sibling may have committed between this frame's first read and this write, and the net-change
153
160
  * diff base must stay anchored at first touch to match the eager engine — see {@link firstTouch}.
161
+ *
162
+ * Private since C4: every write goes through {@link write}, so the scrub travels with the op.
154
163
  */
155
164
  getTransactionBuffer() {
156
165
  if (!this.buffer) {
@@ -163,6 +172,28 @@ export class RecordFrame {
163
172
  }
164
173
  return this.buffer;
165
174
  }
175
+ /**
176
+ * Stage one write (law 7): `verb` at `path` — an absolute path, the address already joined
177
+ * ({@link at}) — and the bytes of its redaction verdict. The first write builds the buffer (law 4).
178
+ *
179
+ * The scrub registers paths, never values: `whole` marks the op's own path, `fields` each field
180
+ * inside the value (a literal key and, when dotted, the nested path); `recordCommit` puts the
181
+ * log's placeholder wherever one of them holds a value at commit, for the mirror and the log only
182
+ * (`scrub.ts`). Live state takes the value as it is. A path marked by a write that the net-change
183
+ * filter drops goes with it.
184
+ */
185
+ write(path, value, verb, scrub) {
186
+ const buffer = this.getTransactionBuffer();
187
+ const whole = scrub?.whole === true;
188
+ if (verb === 'merge')
189
+ buffer.merge(path, value, whole);
190
+ else if (verb === 'delete')
191
+ buffer.delete(path, whole);
192
+ else
193
+ buffer.set(path, value, whole);
194
+ if (scrub?.fields !== undefined)
195
+ buffer.markRedactedFields(path, scrub.fields);
196
+ }
166
197
  /** Has the frame staged a write since its last release — does its buffer exist? */
167
198
  get hasStaged() {
168
199
  return this.buffer !== undefined;
@@ -262,4 +293,4 @@ export class RecordFrame {
262
293
  this.readKeys = undefined;
263
294
  }
264
295
  }
265
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjb3JkRnJhbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9SZWNvcmRGcmFtZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOEJHO0FBR0gsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6QyxPQUFPLEVBQW9CLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRW5FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBYTNELE1BQU0sT0FBTyxXQUFXO0lBQ3RCLHFFQUFxRTtJQUM1RCxLQUFLLENBQWU7SUFDN0IsbUVBQW1FO0lBQzFELEdBQUcsQ0FBWTtJQUN4QixtR0FBbUc7SUFDM0YsT0FBTyxDQUFnQjtJQUMvQixnREFBZ0Q7SUFDeEMsUUFBUSxDQUFvQjtJQUNwQyxnRUFBZ0U7SUFDeEQsUUFBUSxDQUFrQjtJQUNsQzs7OztPQUlHO0lBQ0ssSUFBSSxDQUEyQjtJQUN2Qyx3RkFBd0Y7SUFDaEYsTUFBTSxDQUFxQjtJQUNuQzs7OztPQUlHO0lBQ0ssUUFBUSxDQUFlO0lBRS9CLFlBQVksS0FBbUIsRUFBRSxHQUFjLEVBQUUsVUFBNkIsRUFBRTtRQUM5RSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO0lBQzFCLENBQUM7SUFFRCxnREFBZ0Q7SUFDaEQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsVUFBVSxDQUFDLE9BQTBCO1FBQ25DLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO0lBQzFCLENBQUM7SUFFRCxrR0FBa0c7SUFDbEcsV0FBVyxDQUFDLFFB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QUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO0lBQzVCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmVjb3JkRnJhbWUg4oCUIHRoZSByZWNvcmQgaGFsZiBvZiBvbmUgc3RhZ2UncyBmcmFtZSAoQzMsIEwzKS5cbiAqXG4gKiBXaGF0IGEgc3RhZ2UncyBmcmFtZSBuZWVkcyB0byBSRUFEIGFuZCBXUklURSB0aGUgcmVjb3JkLCBhbmQgbm90aGluZyBhYm91dCB0aGUgc3RhZ2UgaW5zaWRlIGEgcnVuOlxuICogd2hlcmUgaXQgd3JpdGVzIChpdHMgYWRkcmVzcyksIHdoYXQgaXQgcmVhZCBmaXJzdCAodGhlIGZpcnN0LXRvdWNoIGJhc2UpLCB3aGF0IGl0IHN0YWdlZCAodGhlIGxhenlcbiAqIHRyYW5zYWN0aW9uIGJ1ZmZlciksIHdoaWNoIGtleXMgaXQgcmVhZCAodGhlIHJlYWRLZXlzIGxpc3QpLCBhbmQgd2hlcmUgYSBjb21taXQgbGFuZHMgKGxpdmUgc3RhdGUsXG4gKiB0aGUgcmVkYWN0ZWQgbWlycm9yLCB0aGUgbG9nIOKAlCB0aHJvdWdoIGByZWNvcmRDb21taXRgKS4gVGhlIGVuZ2luZSdzIGZyYW1lIChgU3RhZ2VDb250ZXh0YCwgTDQpXG4gKiBjb21wb3NlcyBvbmUgYW5kIGtlZXBzIHRoZSByZXN0OiByZXRlbnRpb24sIGRpYWdub3N0aWNzLCB0aGUgZGV2LW1vZGUgd2FybmluZ3MsIHRoZSBjb21taXQgb2JzZXJ2ZXJcbiAqIGFuZCB0aGUgcmVkYWN0aW9uIHZlcmRpY3QuXG4gKlxuICogVEhFIExBVzpcbiAqICAgMS4gQUREUkVTUy4gVGhlIGZyYW1lIHJlYWRzIGFuZCB3cml0ZXMgYXQgaXRzIGFkZHJlc3MsIGEgcGF0aCBwcmVmaXggdGhlIGVuZ2luZSBjb21wdXRlZCBhbmQgaGFuZHNcbiAqICAgICAgb3ZlciBhcyBkYXRhIChDMjogYFsncnVucycsIDxpZD5dYCBvciBgW11gLCB0aGUgcm9vdCkuIEl0IG1vdmVzIG9ubHkgYmVmb3JlIHRoZSBmaXJzdCB3cml0ZTpcbiAqICAgICAgdGhlIGJ1ZmZlciBrZWVwcyB0aGUgYWRkcmVzcyBpdCB3YXMgYnVpbHQgYXQgKHRoZSBlbmdpbmUgcmVmdXNlcyBhIGxhdGVyIG1vdmUpLlxuICogICAyLiBGSVJTVCBUT1VDSC4gVGhlIGNvbW1pdHRlZCBnZW5lcmF0aW9uIHRoZSBmcmFtZSBmaXJzdCB0b3VjaGVkIOKAlCBpdHMgZmlyc3QgcmVhZCBPUiBmaXJzdCB3cml0ZSDigJRcbiAqICAgICAgaXMgaGVsZCBieSByZWZlcmVuY2UsIG5ldmVyIGNsb25lZDogdGhlIHJlYWQgdmlldyBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlIGFuZCB0aGUgYnVmZmVyJ3NcbiAqICAgICAgbmV0LWNoYW5nZSBkaWZmIGJhc2UgYWZ0ZXIgaXQuXG4gKiAgIDMuIFRXTyBUSUVSUy4gQSByZWFkIGlzIHNlcnZlZCBmcm9tIHRoZSBzdGFnZSdzIG93biB2aWV3ICh0aGUgYnVmZmVyJ3Mgd29ya2luZyBjb3B5IG9uY2UgdGhlIHN0YWdlXG4gKiAgICAgIHdyb3RlLCBlbHNlIHRoZSBmaXJzdC10b3VjaCBiYXNlKTsgYSBrZXkgYWJzZW50IHRoZXJlIGlzIHNlcnZlZCBmcm9tIExJVkUgc3RhdGUgKGF0IHRoZVxuICogICAgICBhZGRyZXNzLCB0aGVuIHRoZSByb290KS4gQWZ0ZXIgdGhlIGZpcnN0IHdyaXRlIHRoZSBidWZmZXIncyBkaWZmIGJhc2UgaXMgZmlyc3QgZ2l2ZW4gYSBwcml2YXRlXG4gKiAgICAgIGNvcHkgYXQgdGhhdCBwYXRoIChgVHJhbnNhY3Rpb25CdWZmZXIgwrcgZGV0YWNoQmFzZWApLlxuICogICA0LiBMQVpZIEJVRkZFUi4gVGhlIGJ1ZmZlciBpcyBidWlsdCBhdCB0aGUgZmlyc3Qgd3JpdGUg4oCUIG9uIHRoZSBmaXJzdC10b3VjaCBiYXNlLCBhdCB0aGUgYWRkcmVzcyxcbiAqICAgICAgdW5kZXIgdGhlIGVuY29kaW5nLiBBIGZyYW1lIHRoYXQgbmV2ZXIgd3JpdGVzIGJ1aWxkcyBub25lLCBhbmQgaXRzIGNvbW1pdCBpcyB0aGUgZW1wdHkgYnVuZGxlLlxuICogICA1LiBSRUFEIEtFWVMuIFVuZGVyIGB3cml0ZVByb3ZlbmFuY2U6ICdyZWFkcy1wcmVmaXgnYCBldmVyeSBub3RlZCByZWFkIHB1dHMgaXRzIHVzZXItbGV2ZWwga2V5XG4gKiAgICAgIChkb3R0ZWQgZm9yIGEgbmVzdGVkIHBhdGgpIG9uIHRoZSBmcmFtZSdzIGxpc3QsIG9uY2UsIGluIG9yZGVyOyBlYWNoIHN0YWdlZCByb3cgY2FycmllcyBhIGNvcHlcbiAqICAgICAgb2YgdGhlIGxpc3QgYXMgaXQgc3RhbmRzIHdoZW4gdGhlIHJvdyBpcyBzdGFnZWQuXG4gKiAgIDYuIENPTU1JVCwgUkVMRUFTRSwgRElTQ0FSRC4gYGNvbW1pdGAgdGFrZXMgdGhlIGJ1ZmZlcidzIHBheWxvYWQgKG5vbmUgPSB0aGUgZW1wdHkgY29tbWl0KSwgdGhlblxuICogICAgICB0aGUgbmFtZXMsIGFuZCBoYW5kcyBib3RoIHRvIGByZWNvcmRDb21taXRgLiBgcmVsZWFzZWAgZHJvcHMgdGhlIGJ1ZmZlciBhbmQgdGhlIGJhc2U7IGEgZnJhbWVcbiAqICAgICAgdG91Y2hlZCBhZ2FpbiByZS1hbmNob3JzIG9uIHRoZSBzdGF0ZSBhcyBpdCBzdGFuZHMgdGhlbi4gVGhlIHJlYWRLZXlzIGxpc3Qgc3Vydml2ZXMgYSByZWxlYXNlLFxuICogICAgICBhbmQgZ29lcyB3aXRoIGBkaXNjYXJkYCAoYSBmYWlsZWQgYXR0ZW1wdCBuZXZlciBoYXBwZW5lZCkuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBFdmVudExvZyB9IGZyb20gJy4vRXZlbnRMb2cuanMnO1xuaW1wb3J0IHsgbmF0aXZlR2V0IH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IHR5cGUgQ29tbWl0U3RhbXAsIHJlY29yZENvbW1pdCB9IGZyb20gJy4vcmVjb3JkQ29tbWl0LmpzJztcbmltcG9ydCB0eXBlIHsgU2hhcmVkTWVtb3J5IH0gZnJvbSAnLi9TaGFyZWRNZW1vcnkuanMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWZmZXIgfSBmcm9tICcuL1RyYW5zYWN0aW9uQnVmZmVyLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0VmFsdWVzTW9kZSwgV3JpdGVQcm92ZW5hbmNlTW9kZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKipcbiAqIFRoZSB0d28gZGlhbHMgdGhhdCBzaGFwZSBhIGZyYW1lJ3MgYnl0ZXM6IHRoZSBsb2cncyB2YWx1ZSBlbmNvZGluZyBhbmQgdGhlIHBlci1yb3cgcmVhZCBwcmVmaXguXG4gKiBIZWxkIGJ5IHJlZmVyZW5jZSBhbmQgc3dhcHBlZCB3aG9sZSAoYHVzZUVuY29kaW5nYCksIG5ldmVyIGVkaXRlZCDigJQgdGhlIGVuZ2luZSBoYW5kcyB0aGUgcnVuJ3NcbiAqIGZyb3plbiBwb2xpY3kgaXRzZWxmLiBBYnNlbnQ6IGAnZnVsbCdgIHZhbHVlcyBhbmQgbm8gcmVhZCBwcmVmaXguXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3JkRW5jb2Rpbmcge1xuICByZWFkb25seSBjb21taXRWYWx1ZXM6IENvbW1pdFZhbHVlc01vZGU7XG4gIHJlYWRvbmx5IHdyaXRlUHJvdmVuYW5jZTogV3JpdGVQcm92ZW5hbmNlTW9kZTtcbn1cblxuZXhwb3J0IGNsYXNzIFJlY29yZEZyYW1lIHtcbiAgLyoqIExpdmUgY29tbWl0dGVkIHN0YXRlIOKAlCB0aGUgaGVhcCBldmVyeSBmcmFtZSBvZiB0aGUgcnVuIHNoYXJlcy4gKi9cbiAgcmVhZG9ubHkgc3RhdGU6IFNoYXJlZE1lbW9yeTtcbiAgLyoqIFRoZSBsb2cgdGhlIGZyYW1lJ3MgY29tbWl0cyBsYW5kIG9uLCB3aGVuIHRoZSBydW4ga2VlcHMgb25lLiAqL1xuICByZWFkb25seSBsb2c/OiBFdmVudExvZztcbiAgLyoqIFRoZSByZWRhY3RlZCBtaXJyb3IgdGhlIGZyYW1lJ3MgY29tbWl0cyBsYW5kIG9uLCB3aGVuIHRoZSBydW4ga2VlcHMgb25lICh7QGxpbmsgdXNlTWlycm9yfSkuICovXG4gIHByaXZhdGUgX21pcnJvcj86IFNoYXJlZE1lbW9yeTtcbiAgLyoqIFdoZXJlIHRoZSBmcmFtZSByZWFkcyBhbmQgd3JpdGVzIChsYXcgMSkuICovXG4gIHByaXZhdGUgX2FkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogVGhlIHR3byBkaWFscyAobGF3IDQsIDUpOyBhYnNlbnQg4oaSIHRoZSByZWNvcmQncyBkZWZhdWx0cy4gKi9cbiAgcHJpdmF0ZSBlbmNvZGluZz86IFJlY29yZEVuY29kaW5nO1xuICAvKipcbiAgICogVGhlIGNvbW1pdHRlZCBnZW5lcmF0aW9uIGF0IHRoZSBmcmFtZSdzIEZJUlNUIHRvdWNoIChsYXcgMikg4oCUIGhlbGQgYnkgUkVGRVJFTkNFLCBuZXZlciBjbG9uZWQuXG4gICAqIFNlZSB7QGxpbmsgZmlyc3RUb3VjaH0gZm9yIHRoZSBhbGdvcml0aG0gYW5kIHRoZSBpbW11dGFiaWxpdHkgaW52YXJpYW50IHRoYXQgbWFrZXMgYSBiYXJlXG4gICAqIHJlZmVyZW5jZSBzYWZlLlxuICAgKi9cbiAgcHJpdmF0ZSBiYXNlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKiBUaGUgc3RhZ2UncyBzdGFnZWQgd3JpdGVzIOKAlCBidWlsdCBhdCBpdHMgZmlyc3Qgd3JpdGUgKGxhdyA0KSwgcmVsZWFzZWQgYXQgY29tbWl0LiAqL1xuICBwcml2YXRlIGJ1ZmZlcj86IFRyYW5zYWN0aW9uQnVmZmVyO1xuICAvKipcbiAgICogS2V5cyB0cmFja2VkLXJlYWQgc28gZmFyLCBpbiBvcmRlciAobGF3IDUpIOKAlCB0aGUgc291cmNlIG9mIGVhY2ggc3RhZ2VkIHJvdydzIGByZWFkS2V5c2AuIE9ubHlcbiAgICogYWxsb2NhdGVkIHVuZGVyIGAncmVhZHMtcHJlZml4J2A7IGluc2VydGlvbi1vcmRlcmVkIChhIFNldCkgYW5kIG1vbm90b25pYywgd2hpY2ggaXMgd2hhdCBtYWtlc1xuICAgKiBcImxhc3Qgd3JpdGUncyBwcmVmaXggPT0gdW5pb25cIiBob2xkIGluIGRlbHRhIG1vZGUuXG4gICAqL1xuICBwcml2YXRlIHJlYWRLZXlzPzogU2V0PHN0cmluZz47XG5cbiAgY29uc3RydWN0b3Ioc3RhdGU6IFNoYXJlZE1lbW9yeSwgbG9nPzogRXZlbnRMb2csIGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdID0gW10pIHtcbiAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgdGhpcy5sb2cgPSBsb2c7XG4gICAgdGhpcy5fYWRkcmVzcyA9IGFkZHJlc3M7XG4gIH1cblxuICAvKiogV2hlcmUgdGhlIGZyYW1lIHJlYWRzIGFuZCB3cml0ZXMgKGxhdyAxKS4gKi9cbiAgZ2V0IGFkZHJlc3MoKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9hZGRyZXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgYW5kIHdyaXRlIGF0IGBhZGRyZXNzYCBmcm9tIG5vdyBvbiDigJQgYmVmb3JlIHRoZSBmcmFtZSdzIGZpcnN0IHdyaXRlIChsYXcgMSk6IHRoZSBidWZmZXIga2VlcHNcbiAgICogdGhlIGFkZHJlc3MgaXQgd2FzIGJ1aWx0IGF0LiBUaGUgZW5naW5lJ3Mgb25lIGNhbGxlciwgYFN0YWdlQ29udGV4dCDCtyB1c2VBZGRyZXNzT2ZgLCByZWZ1c2VzIGEgbW92ZVxuICAgKiBvbmNlIHRoZSBmcmFtZSBoYXMgc3RhZ2VkLlxuICAgKi9cbiAgdXNlQWRkcmVzcyhhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMuX2FkZHJlc3MgPSBhZGRyZXNzO1xuICB9XG5cbiAgLyoqIFRoZSB0d28gZGlhbHMgdGhlIGZyYW1lIGVuY29kZXMgdW5kZXIgZnJvbSBpdHMgbmV4dCBidWZmZXIgYW5kIGl0cyBuZXh0IHJlYWQgb24gKGxhdyA0LCA1KS4gKi9cbiAgdXNlRW5jb2RpbmcoZW5jb2Rpbmc6IFJlY29yZEVuY29kaW5nKTogdm9pZCB7XG4gICAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nO1xuICB9XG5cbiAgLyoqIFRoZSByZWRhY3RlZCBtaXJyb3IsIGlmIHRoZSBydW4ga2VlcHMgb25lLiAqL1xuICBnZXQgbWlycm9yKCk6IFNoYXJlZE1lbW9yeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX21pcnJvcjtcbiAgfVxuXG4gIC8qKiBMYW5kIGV2ZXJ5IGNvbW1pdCBmcm9tIG5vdyBvbiBvbiBgbWlycm9yYCB0b28sIHdpdGggdGhlIHNjcnViYmVkIHJvd3MgdGhlIGxvZyB0YWtlcyAoYHJlY29yZENvbW1pdGApLiAqL1xuICB1c2VNaXJyb3IobWlycm9yOiBTaGFyZWRNZW1vcnkgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLl9taXJyb3IgPSBtaXJyb3I7XG4gIH1cblxuICAvKiogVGhlIGFic29sdXRlIHBhdGggb2YgYGtleWAgdW5kZXIgYHBhdGhgOiB0aGUgZnJhbWUncyBhZGRyZXNzLCB0aGVuIHRoZSBwYXRoLCB0aGVuIHRoZSBrZXkuICovXG4gIGF0KHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdLCBrZXk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAvLyBFdmVyeSByZWFkIGFuZCB3cml0ZSBidWlsZHMgb25lLiBUaGUgcm9vdCdzIGlzIHRoZSBwYXRoIGFuZCB0aGUga2V5OyB1bmRlciBhbiBhZGRyZXNzLCBhblxuICAgIC8vIGluZGV4IGxvb3Ag4oCUIHRoZSBkb3VibGUgc3ByZWFkIGBbLi4uYWRkcmVzcywgLi4ucGF0aCwga2V5XWAgY29zdHMgYSB0aGlyZCBtb3JlIHBlciBjYWxsXG4gICAgLy8gKGFzIGB1dGlscyDCtyBwYXRoVW5kZXJgIGZvdW5kIGZvciB0aGUgYWRkcmVzcyBhbmQgdGhlIHBhdGgpLlxuICAgIGNvbnN0IGFkZHJlc3MgPSB0aGlzLl9hZGRyZXNzO1xuICAgIGlmIChhZGRyZXNzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFsuLi5wYXRoLCBrZXldO1xuICAgIGNvbnN0IG91dCA9IG5ldyBBcnJheTxzdHJpbmc+KGFkZHJlc3MubGVuZ3RoICsgcGF0aC5sZW5ndGggKyAxKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFkZHJlc3MubGVuZ3RoOyBpKyspIG91dFtpXSA9IGFkZHJlc3NbaV07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSBvdXRbYWRkcmVzcy5sZW5ndGggKyBpXSA9IHBhdGhbaV07XG4gICAgb3V0W291dC5sZW5ndGggLSAxXSA9IGtleTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIOKUgOKUgCBUaGUgZmlyc3QtdG91Y2ggYmFzZSAoIzEzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICpcbiAgICogV0hBVDogcmV0dXJucyB0aGUgY29tbWl0dGVkIHNoYXJlZCBzdGF0ZSBhcyBpdCB3YXMgYXQgdGhpcyBmcmFtZSdzIEZJUlNUIHRvdWNoIChmaXJzdCByZWFkIG9yXG4gICAqIGZpcnN0IHdyaXRlKSwgY2FwdHVyaW5nIHRoZSByZWZlcmVuY2Ugb24gZmlyc3QgY2FsbC4gU2VydmVzIHR3byBjb25zdW1lcnM6IHJlYWRzIGJlZm9yZSB0aGUgZmlyc3RcbiAgICogd3JpdGUgKHtAbGluayByZWFkfSkgYW5kIHRoZSB0cmFuc2FjdGlvbiBidWZmZXIncyBkaWZmIGJhc2UgKHtAbGluayBnZXRUcmFuc2FjdGlvbkJ1ZmZlcn0pLlxuICAgKlxuICAgKiBXSFkgQSBCQVJFIFJFRkVSRU5DRSBJUyBTQUZFIOKAlCB0aGUgaW52YXJpYW50IHRoaXMgcmVzdHMgb246IGNvbW1pdHRlZCBzdGF0ZSBpc1xuICAgKiBpbW11dGFibGUtYWZ0ZXItc3dhcC4gRXZlcnkgd3JpdGUgdG8gYFNoYXJlZE1lbW9yeWAgYnVpbGRzIHRoZSBORVhUIGdlbmVyYXRpb24gYW5kIHN3YXBzIGl0IGluXG4gICAqIChjb3B5LW9uLXdyaXRlLCA5LjI5LjA6IGBhcHBseVBhdGNoYCB2aWEgYG5leHRHZW5lcmF0aW9uYCwgYW5kIGBzZXRWYWx1ZWAvYHVwZGF0ZVZhbHVlYCB0b28pIOKAlCBpdFxuICAgKiBjb3BpZXMgdGhlIHJvb3QgYW5kIHRoZSBjb250YWluZXJzIG9uIGVhY2ggd3JpdHRlbiBwYXRoLCBzaGFyZXMgdGhlIHJlc3QsIGFuZCBuZXZlciBlZGl0cyBhXG4gICAqIGNvbnRhaW5lciBvZiB0aGUgZ2VuZXJhdGlvbiBhIHN0YWdlIGNhcHR1cmVkIGhlcmUuIEhvbGRpbmcgdGhlIHJlZmVyZW5jZSB0aGVyZWZvcmUgZ2l2ZXMgdGhpc1xuICAgKiBzdGFnZSBhIHN0YWJsZSBzbmFwc2hvdCBhdCB6ZXJvIGNvc3Qg4oCUIG5vIGNsb25lLCB3aGljaCBpcyB0aGUgZW50aXJlIHBvaW50IG9mICMxMy4gVGhlIHRyYW5zYWN0aW9uXG4gICAqIGJ1ZmZlcidzIG5ldC1jaGFuZ2UgZGlmZiBiYXNlIHJlc3RzIG9uIHRoZSBzYW1lIGd1YXJhbnRlZTogaXQgSVMgdGhpcyB2aWV3LlxuICAgKlxuICAgKiBXSFkgRklSU1QgVE9VQ0gsIG5vdCBmaXJzdCB3cml0ZTogdGhlIHByZS0jMTMgZWFnZXIgZW5naW5lIGNsb25lZCB0aGUgc3RhdGUgaW50byB0aGUgYnVmZmVyIGF0XG4gICAqIHRoZSBzdGFnZSdzIGZpcnN0IEFDQ0VTUywgYW5jaG9yaW5nIGJvdGggaXRzIHNuYXBzaG90IHJlYWRzIGFuZCBpdHMgY29tbWl0IGJhc2VsaW5lICh0aGVcbiAgICogbmV0LWNoYW5nZSBkaWZmIGJhc2UpIHRoZXJlLiAjMTMncyBmaXJzdCBjdXQgYW5jaG9yZWQgdGhlIGxhenkgYnVmZmVyIGF0IGZpcnN0IFdSSVRFIOKAlCBvYnNlcnZhYmx5XG4gICAqIGRpZmZlcmVudCB3aGVuIHNvbWV0aGluZyBlbHNlIGNvbW1pdHMgaW4gdGhlIGdhcCBiZXR3ZWVuIHRoaXMgc3RhZ2UncyBmaXJzdCByZWFkIGFuZCBpdHMgZmlyc3RcbiAgICogd3JpdGUuIFRoYXQgZ2FwIGlzIFJFQUNIQUJMRTogZm9yayBzaWJsaW5ncyBhcmUgbmFtZXNwYWNlLWlzb2xhdGVkIGZvciBydW4tc2NvcGVkIGtleXMgKGVhY2ggY2hpbGRcbiAgICogd3JpdGVzIHVuZGVyIGBydW5zLzxjaGlsZElkPi9gKSwgYnV0IFJPT1QtbGV2ZWwga2V5cyBhcmUgc2hhcmVkIOKAlCB3cml0dGVuIHZpYSBgc2V0R2xvYmFsYCBmcm9tXG4gICAqIGNvbnN1bWVyIHNjb3BlIGNvZGUgYW5kLCBjcml0aWNhbGx5LCBieSBgU3ViZmxvd0lucHV0TWFwcGVyYCdzIG91dHB1dCBtYXBwaW5nXG4gICAqIChgcGFyZW50Q29udGV4dC5zZXRHbG9iYWxgKSwgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHJ1bnMgd2hlbiBhIHN1YmZsb3cgaXMgYSBmb3JrIGJyYW5jaC4gQVxuICAgKiBzaWJsaW5nJ3Mgcm9vdC1rZXkgY29tbWl0IGxhbmRpbmcgaW4gdGhlIGdhcCB3b3VsZCBzaGlmdCB0aGlzIHN0YWdlJ3MgZGlmZiBiYXNlLCBtYWtpbmcgaXRzXG4gICAqIENvbW1pdEJ1bmRsZSByZWNvcmQgYSBwaGFudG9tIGNoYW5nZSAob3Igc3dhbGxvdyBhIHJlYWwgb25lKSByZWxhdGl2ZSB0byB0aGUgZWFnZXIgZW5naW5lLlxuICAgKiBBbmNob3JpbmcgdGhlIHZpZXcgYXQgZmlyc3QgdG91Y2ggcmVzdG9yZXMgdGhlIEVYQUNUIGVhZ2VyIHNlbWFudGljcyDigJQgc2VxdWVudGlhbCBBTkQgcGFyYWxsZWwg4oCUXG4gICAqIGF0IHplcm8gY2xvbmUgY29zdC5cbiAgICpcbiAgICogUmVhZCB2aXNpYmlsaXR5IGlzIHR3by10aWVyLCBtYXRjaGluZyBlYWdlciBieXRlLWZvci1ieXRlOiBrZXlzIHByZXNlbnQgaW4gdGhlIHZpZXcgYXQgZmlyc3RcbiAgICogdG91Y2ggcmVhZCByZXBlYXRhYmx5IGZyb20gaXQ7IGtleXMgQUJTRU5UIGZyb20gaXQgZmFsbCBiYWNrIHRvIExJVkUgc3RhdGUgKHRoZSBlYWdlciBlbmdpbmUnc1xuICAgKiBleGFjdCBmYWxsYmFjayDigJQgYSBtaWQtZmxpZ2h0IHNpYmxpbmcgcm9vdC1rZXkgd3JpdGUgd2FzIGFsd2F5cyB2aXNpYmxlIHRvIHJlYWRzLCBhbmQgc3RheXNcbiAgICogdmlzaWJsZTsgb25seSB0aGUgRElGRiBCQVNFIGlzIHBpbm5lZCkuXG4gICAqL1xuICBwcml2YXRlIGZpcnN0VG91Y2goKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGlmICghdGhpcy5iYXNlKSB7XG4gICAgICB0aGlzLmJhc2UgPSB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJhc2U7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRyYW5zYWN0aW9uIGJ1ZmZlciwgY3JlYXRlZCBsYXppbHkgb24gdGhlIGZyYW1lJ3MgRklSU1QgV1JJVEUgKCMxMykuXG4gICAqXG4gICAqIFJlYWRzIE5FVkVSIGNvbnN0cnVjdCBpdDogcmVhZC15b3VyLXdyaXRlcyBvbmx5IG1hdHRlcnMgb25jZSBhIHN0YWdlZCB3cml0ZSBleGlzdHMsIHNvIGJlZm9yZSB0aGF0XG4gICAqIHtAbGluayByZWFkfSBzZXJ2ZXMgZnJvbSB0aGUgZmlyc3QtdG91Y2ggYmFzZSBhbmQge0BsaW5rIGNvbW1pdH0gcmVjb3JkcyBhbiBlbXB0eSBidW5kbGUg4oCUIGFsbCB3aXRoXG4gICAqIFpFUk8gYHN0cnVjdHVyZWRDbG9uZWBzIG9mIHRoZSBzaGFyZWQgc3RhdGUuXG4gICAqXG4gICAqIFRoZSBidWZmZXIncyBiYXNlIGlzIHRoZSBGSVJTVC1UT1VDSCB2aWV3LCBOT1QgdGhlIGxpdmUgc3RhdGUgYXQgd3JpdGUgdGltZTogdW5kZXIgcGFyYWxsZWwgZm9ya3NcbiAgICogYSBzaWJsaW5nIG1heSBoYXZlIGNvbW1pdHRlZCBiZXR3ZWVuIHRoaXMgZnJhbWUncyBmaXJzdCByZWFkIGFuZCB0aGlzIHdyaXRlLCBhbmQgdGhlIG5ldC1jaGFuZ2VcbiAgICogZGlmZiBiYXNlIG11c3Qgc3RheSBhbmNob3JlZCBhdCBmaXJzdCB0b3VjaCB0byBtYXRjaCB0aGUgZWFnZXIgZW5naW5lIOKAlCBzZWUge0BsaW5rIGZpcnN0VG91Y2h9LlxuICAgKi9cbiAgZ2V0VHJhbnNhY3Rpb25CdWZmZXIoKTogVHJhbnNhY3Rpb25CdWZmZXIge1xuICAgIGlmICghdGhpcy5idWZmZXIpIHtcbiAgICAgIC8vIFBlci13cml0ZSBwcm92ZW5hbmNlICgjUDEpOiBoYW5kIHRoZSBidWZmZXIgYSBsaXZlIHZpZXcgb2YgdGhpcyBmcmFtZSdzIHJlYWQgcHJlZml4IOKAlFxuICAgICAgLy8gZXZhbHVhdGVkIEFUIEVBQ0ggV1JJVEUsIHNvIGVhY2ggc3RhZ2VkIG9wIGNhcHR1cmVzIGV4YWN0bHkgdGhlIHJlYWRzIHRoYXQgcHJlY2VkZWQgaXQuXG4gICAgICBjb25zdCByZWFkS2V5c1Byb3ZpZGVyID1cbiAgICAgICAgdGhpcy5lbmNvZGluZz8ud3JpdGVQcm92ZW5hbmNlID09PSAncmVhZHMtcHJlZml4JyA/ICgpID0+IFsuLi4odGhpcy5yZWFkS2V5cyA/PyBbXSldIDogdW5kZWZpbmVkO1xuICAgICAgLy8gVGhlIGZyYW1lJ3MgYWRkcmVzcyAoOS4zMC4wOiB0aGUgYWRtaXR0ZWQgcmVjb3JkIHJlYWRzIHRoZSBjb250YWluZXJzIHRoZXJlIGFzIHdoZXJlIHRoZVxuICAgICAgLy8gc3RhZ2Ugd3JpdGVzLCBuZXZlciBhcyBhIHZhbHVlIGl0IHJlYWQpLlxuICAgICAgdGhpcy5idWZmZXIgPSBuZXcgVHJhbnNhY3Rpb25CdWZmZXIoXG4gICAgICAgIHRoaXMuZmlyc3RUb3VjaCgpLFxuICAgICAgICB0aGlzLmVuY29kaW5nPy5jb21taXRWYWx1ZXMsXG4gICAgICAgIHJlYWRLZXlzUHJvdmlkZXIsXG4gICAgICAgIHRoaXMuX2FkZHJlc3MsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5idWZmZXI7XG4gIH1cblxuICAvKiogSGFzIHRoZSBmcmFtZSBzdGFnZWQgYSB3cml0ZSBzaW5jZSBpdHMgbGFzdCByZWxlYXNlIOKAlCBkb2VzIGl0cyBidWZmZXIgZXhpc3Q/ICovXG4gIGdldCBoYXNTdGFnZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGZyYW1lJ3MgcmVhZCwgbWlycm9yaW5nIHRoZSBlYWdlciBlbmdpbmUncyByZWFkIG9yZGVyIGJ5dGUtZm9yLWJ5dGUgKGxhdyAzKTpcbiAgICpcbiAgICogICAgMS4gc3RhZ2VkIHdyaXRlcyArIGZpcnN0LXRvdWNoIHNuYXBzaG90IOKAlCBgYnVmZmVyLmdldGAgb3ZlciBpdHMgd29ya2luZ0NvcHkgd2hlbiB0aGUgYnVmZmVyXG4gICAqICAgICAgIGV4aXN0cywgZWxzZSBgbmF0aXZlR2V0YCBvdmVyIHRoZSB6ZXJvLWNsb25lIGZpcnN0LXRvdWNoIGJhc2UgKHRoZSBidWZmZXIncyBiYXNlIElTIHRoYXRcbiAgICogICAgICAgdmlldywgc28gdGhlIHR3byB0aWVycyBhZ3JlZSBvbiBjb250ZW50KTtcbiAgICogICAgMi4gTElWRSBzdGF0ZSB2aWEgYFNoYXJlZE1lbW9yeSDCtyBnZXRWYWx1ZWAgZm9yIGtleXMgYWJzZW50IGZyb20gdGhlIHNuYXBzaG90IOKAlCBpbmNsdWRpbmcgaXRzXG4gICAqICAgICAgIGFkZHJlc3PihpJyb290IGZhbGxiYWNrLiBUaGUgZWFnZXIgZW5naW5lIGhhZCB0aGlzIGV4YWN0IGxpdmUgZmFsbGJhY2sgZm9yIHNuYXBzaG90LW1pc3NpbmdcbiAgICogICAgICAga2V5czsgYnl0ZS1pZGVudGl0eSBvdmVyIHB1cml0eS4gQWZ0ZXIgdGhlIGZyYW1lJ3MgZmlyc3Qgd3JpdGUgc3VjaCBhIHZhbHVlIGNhbiBiZSB0aGUgdmVyeVxuICAgKiAgICAgICBjb250YWluZXIgdGhlIGJ1ZmZlcidzIGRpZmYgYmFzZSBob2xkcyBhdCB0aGUgcGF0aCAodGhlIHN0YWdlIGRlbGV0ZWQgb3IgdW5zZXQgaXQsIG9yXG4gICAqICAgICAgIHJlcGxhY2VkIGEgY29udGFpbmVyIGFib3ZlIGl0KSwgc28gdGhlIGJhc2UgaXMgZGV0YWNoZWQgdGhlcmUgZmlyc3RcbiAgICogICAgICAgKGBUcmFuc2FjdGlvbkJ1ZmZlciDCtyBkZXRhY2hCYXNlYCk6IGFuIGluLXBsYWNlIGVkaXQgb2YgdGhlIHZhbHVlIChvdXQgb2YgY29udHJhY3QpIHdyaXR0ZW5cbiAgICogICAgICAgYmFjayBpcyByZWNvcmRlZCwgYXMgb24gOS4yOC4wLCB3aG9zZSBiYXNlIHdhcyBhIGNsb25lIHRha2VuIGF0IHRoZSBmaXJzdCB3cml0ZS5cbiAgICpcbiAgICogUmVhZHMgbmV2ZXIgY29uc3RydWN0IHRoZSBidWZmZXIgKCMxMyk6IGEgZnJhbWUgdGhhdCBuZXZlciB3cml0ZXMgcGVyZm9ybXMgemVybyBjbG9uZXMgb2YgdGhlXG4gICAqIHNoYXJlZCBzdGF0ZS5cbiAgICovXG4gIHJlYWQocGF0aDogc3RyaW5nW10sIGtleT86IHN0cmluZyk6IHVua25vd24ge1xuICAgIGNvbnN0IGF0ID0gdGhpcy5hdChwYXRoLCBrZXkgYXMgc3RyaW5nKTtcbiAgICBjb25zdCBmcm9tU25hcHNob3QgPSB0aGlzLmJ1ZmZlciA/IHRoaXMuYnVmZmVyLmdldChhdCkgOiBuYXRpdmVHZXQodGhpcy5maXJzdFRvdWNoKCksIGF0KTtcbiAgICBpZiAodHlwZW9mIGZyb21TbmFwc2hvdCAhPT0gJ3VuZGVmaW5lZCcpIHJldHVybiBmcm9tU25hcHNob3Q7XG4gICAgY29uc3QgbGl2ZSA9IHRoaXMuc3RhdGUuZ2V0VmFsdWUodGhpcy5fYWRkcmVzcywgcGF0aCwga2V5KTtcbiAgICAvLyBUaWVyIDIgYWZ0ZXIgdGhlIGZpcnN0IHdyaXRlOiBrZWVwIHRoZSBkaWZmIGJhc2UgZXhhY3QgKHNlZSBhYm92ZSkuXG4gICAgaWYgKHRoaXMuYnVmZmVyICYmIGxpdmUgIT09IG51bGwgJiYgdHlwZW9mIGxpdmUgPT09ICdvYmplY3QnKSB0aGlzLmJ1ZmZlci5kZXRhY2hCYXNlKGF0KTtcbiAgICByZXR1cm4gbGl2ZTtcbiAgfVxuXG4gIC8qKiBQdXQgYSB0cmFja2VkIHJlYWQncyB1c2VyLWxldmVsIGtleSBvbiB0aGUgcmVhZEtleXMgbGlzdCAobGF3IDUpIOKAlCBhIG5vLW9wIHVubGVzcyB0aGUgZnJhbWUga2VlcHMgb25lLiAqL1xuICBub3RlUmVhZChwYXRoOiByZWFkb25seSBzdHJpbmdbXSwga2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lbmNvZGluZz8ud3JpdGVQcm92ZW5hbmNlID09PSAncmVhZHMtcHJlZml4Jykge1xuICAgICAgKHRoaXMucmVhZEtleXMgPz89IG5ldyBTZXQoKSkuYWRkKHBhdGgubGVuZ3RoID4gMCA/IFsuLi5wYXRoLCBrZXldLmpvaW4oJy4nKSA6IGtleSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpdmUgY29tbWl0dGVkIHN0YXRlIGF0IGBrZXlgOiBhdCB0aGUgZnJhbWUncyBhZGRyZXNzLCBlbHNlIGF0IHRoZSByb290IOKAlCBuZXZlciB0aGUgc3RhZ2UncyBvd25cbiAgICogdmlldy4gVHlwZWQgYXMgYFNoYXJlZE1lbW9yeSDCtyBnZXRWYWx1ZWAgdHlwZXMgaXQsIHdoaWNoIGBTdGFnZUNvbnRleHQgwrcgZ2V0Um9vdGAgaGFuZHMgb24uXG4gICAqL1xuICByZWFkTGl2ZShrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnN0YXRlLmdldFZhbHVlKHRoaXMuX2FkZHJlc3MsIFtdLCBrZXkpO1xuICB9XG5cbiAgLyoqIExpdmUgY29tbWl0dGVkIHN0YXRlIGF0IGBrZXlgIGF0IHRoZSByb290IOKAlCB0eXBlZCBhcyBgU2hhcmVkTWVtb3J5IMK3IGdldFZhbHVlYCAoYFN0YWdlQ29udGV4dCDCtyBnZXRHbG9iYWxgKS4gKi9cbiAgcmVhZEdsb2JhbChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnN0YXRlLmdldFZhbHVlKFtdLCBbXSwga2V5KTtcbiAgfVxuXG4gIC8qKiBEaWQgYSBzdGFnZWQgb3AgdG91Y2ggYHBhdGhgIOKAlCBvbiBpdCwgYWJvdmUgaXQgb3IgYmVsb3cgaXQ/IChBIHJlcG9ydCdzIHF1ZXN0aW9uOyBuZXZlciB0aGUgaG90IHBhdGguKSAqL1xuICB3YXNTdGFnZWQocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmJ1ZmZlciAhPT0gdW5kZWZpbmVkICYmIHRoaXMuYnVmZmVyLndhc1N0YWdlZChwYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgYXQgYHBhdGhgIGluIHdoYXQgdGhlIHN0YWdlIGhhcyBzZWVuIOKAlCBpdHMgd29ya2luZyBjb3B5IG9uY2UgaXQgd3JvdGUsIGVsc2UgaXRzXG4gICAqIGZpcnN0LXRvdWNoIGJhc2Ug4oCUIFdJVEhPVVQgdGFraW5nIGEgcHJpdmF0ZSBjb3B5OiBmb3IgYSByZXBvcnQgdGhhdCBvbmx5IGNvbXBhcmVzLlxuICAgKi9cbiAgcGVlayhwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdW5rbm93biB7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyID8gdGhpcy5idWZmZXIucGVlayhwYXRoKSA6IG5hdGl2ZUdldCh0aGlzLmZpcnN0VG91Y2goKSwgcGF0aCk7XG4gIH1cblxuICAvKiogVGhlIHZhbHVlIGF0IGBwYXRoYCBpbiB0aGUgZmlyc3QtdG91Y2ggYmFzZSDigJQgY29tbWl0dGVkIHN0YXRlIGFzIHRoZSBmcmFtZSBmaXJzdCB0b3VjaGVkIGl0LiAqL1xuICBiYXNlQXQocGF0aDogKHN0cmluZyB8IG51bWJlcilbXSk6IHVua25vd24ge1xuICAgIHJldHVybiBuYXRpdmVHZXQodGhpcy5maXJzdFRvdWNoKCksIHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZCB3aGF0IHRoZSBmcmFtZSBzdGFnZWQgKGxhdyA2KTogdGhlIGJ1ZmZlcidzIHBheWxvYWQgZmlyc3Qg4oCUIG5vbmUsIHRoZSBlbXB0eSBjb21taXQsIHdoZW5cbiAgICogaXQgc3RhZ2VkIG5vdGhpbmcgKCMxMzogemVybyBjbG9uZXMpIOKAlCB0aGVuIHRoZSBuYW1lcyAoYHN0YW1wT2YoKWApLCByZWFkIG9uY2UgdGhlIHBheWxvYWQgaXNcbiAgICogYnVpbHQsIGFuZCBib3RoIHRvIGByZWNvcmRDb21taXRgLiBVc2VyIGNvZGUgY2FuIHJ1biB3aGlsZSB0aGUgcGF5bG9hZCBpcyBidWlsdCAoYSBnZXR0ZXIgb24gYVxuICAgKiBzdGFnZWQgdmFsdWUsIHdoaWNoIHRoZSBuZXQtY2hhbmdlIGNvbXBhcmUgYW5kIHRoZSBjbG9uZSBpbnZva2UpOyB3aGF0IGl0IGFkZHMgdG8gdGhlIG5hbWVzIOKAlFxuICAgKiBhbiB1bnRyYWNrZWQgcmVhZCwgc2F5IOKAlCBpcyBvbiB0aGUgYnVuZGxlLlxuICAgKi9cbiAgY29tbWl0KHN0YW1wT2Y6ICgpID0+IENvbW1pdFN0YW1wKTogdm9pZCB7XG4gICAgY29uc3QgcGF5bG9hZCA9IHRoaXMuYnVmZmVyPy5jb21taXQoKTtcbiAgICByZWNvcmRDb21taXQocGF5bG9hZCwgc3RhbXBPZigpLCB7IHN0YXRlOiB0aGlzLnN0YXRlLCBtaXJyb3I6IHRoaXMuX21pcnJvciwgbG9nOiB0aGlzLmxvZyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmQgdGhlIGZyYW1lJ3MgaG9sZCBvbiBzdGF0ZSAoIzEzYiwgbGF3IDYpOiBkcm9wIHRoZSBidWZmZXIgKGl0cyB3b3JraW5nIGNvcHkgYW5kIHdoYXRldmVyIHByaXZhdGVcbiAgICogY29waWVzIGl0cyByZWFkcyB0b29rKSBhbmQgdGhlIGZpcnN0LXRvdWNoIGJhc2UgKGEgcmVmZXJlbmNlIHRoYXQgcGlucyBvbmUgY29tbWl0dGVkLXN0YXRlXG4gICAqIEdFTkVSQVRJT04pLiBCb3RoIHJlLWNyZWF0ZSBsYXppbHk6IGEgbGF0ZXIgcmVhZCByZS1hbmNob3JzIG9uIHRoZSBDVVJSRU5UIGNvbW1pdHRlZCBzdGF0ZSwgYW5kIGFcbiAgICogbGF0ZXIgd3JpdGUgYnVpbGRzIGEgZnJlc2ggYnVmZmVyIG9uIGl0IOKAlCBzbyBhIHNlY29uZCBjb21taXQgZGlmZnMgYWdhaW5zdCB0aGUgc3RhdGUgYWZ0ZXIgdGhlXG4gICAqIGZpcnN0LiBXaXRob3V0IHRoZSByZWxlYXNlLCB0aGUgZXhlY3V0aW9uIHRyZWUg4oCUIHdoaWNoIHJldGFpbnMgZXZlcnkgZnJhbWUgZm9yIHRoZSBsaWZldGltZSBvZlxuICAgKiB0aGUgcnVuIOKAlCByZXRhaW5zIG9uZSBzdGF0ZSBnZW5lcmF0aW9uIHBlciBleGVjdXRlZCBzdGFnZSAobWVhc3VyZWQgTyhOwrIpIGJlZm9yZSBjb3B5LW9uLXdyaXRlO1xuICAgKiBhIDUwMC1pdGVyYXRpb24gYWdlbnQgT09NZWQgYSBkZWZhdWx0IE5vZGUgaGVhcCwgYmFja2xvZyAjMTgpLlxuICAgKi9cbiAgcmVsZWFzZSgpOiB2b2lkIHtcbiAgICB0aGlzLmJ1ZmZlciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmJhc2UgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVGhyb3cgYXdheSBldmVyeXRoaW5nIHRoZSBmcmFtZSBzdGFnZWQgYW5kIHJlYWQgKGxhdyA2KTogdGhlIGJ1ZmZlciwgdGhlIGZpcnN0LXRvdWNoIGJhc2UgKHRoZSBuZXh0XG4gICAqIGF0dGVtcHQgcmUtYW5jaG9ycyBvbiBjb21taXR0ZWQgc3RhdGUgYXMgaXQgc3RhbmRzIE5PVykgYW5kIHRoZSByZWFkS2V5cyBsaXN0IOKAlCBhIGRpc2NhcmRlZFxuICAgKiBhdHRlbXB0J3MgcmVhZHMgbXVzdCBuZXZlciByZWFjaCB0aGUgbmV4dCBhdHRlbXB0J3MgYFRyYWNlRW50cnkucmVhZEtleXNgLCBvciBhIGJhY2t3YXJkIHNsaWNlXG4gICAqIHdvdWxkIGZvbGxvdyBhbiBlZGdlIHRoYXQgbm8gY29tbWl0dGVkIHdyaXRlIGV2ZXIgaGFkLiBOb3RoaW5nIGlzIHJlY29yZGVkLlxuICAgKi9cbiAgZGlzY2FyZCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbGVhc2UoKTtcbiAgICB0aGlzLnJlYWRLZXlzID0gdW5kZWZpbmVkO1xuICB9XG59XG4iXX0=
296
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjb3JkRnJhbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9SZWNvcmRGcmFtZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFDRztBQUlILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFvQixZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVuRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQThCM0QsTUFBTSxPQUFPLFdBQVc7SUFDdEIscUVBQXFFO0lBQzVELEtBQUssQ0FBZTtJQUM3QixtRUFBbUU7SUFDMUQsR0FBRyxDQUFZO0lBQ3hCLG1HQUFtRztJQUMzRixPQUFPLENBQWdCO0lBQy9CLGdEQUFnRDtJQUN4QyxRQUFRLENBQW9CO0lBQ3BDLGdFQUFnRTtJQUN4RCxRQUFRLENBQWtCO0lBQ2xDOzs7O09BSUc7SUFDSyxJQUFJLENBQTJCO0lBQ3ZDLHdGQUF3RjtJQUNoRixNQUFNLENBQXFCO0lBQ25DOzs7O09BSUc7SUFDSyxRQUFRLENBQWU7SUFFL0IsWUFBWSxLQUFtQixFQUFFLEdBQWMsRUFBRSxVQUE2QixFQUFFO1FBQzlFLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7SUFDMUIsQ0FBQztJQUVELGdEQUFnRDtJQUNoRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxVQUFVLENBQUMsT0FBMEI7UUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7SUFDMUIsQ0FBQztJQUVELGtHQUFrRztJQUNsRyxXQUFX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LENBQUM7SUFDbkYsQ0FBQztJQUVELG1HQUFtRztJQUNuRyxNQUFNLENBQUMsSUFBeUI7UUFDOUIsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsT0FBMEI7UUFDL0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUN0QyxZQUFZLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQy9GLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILE9BQU87UUFDTCxJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztRQUN4QixJQUFJLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxPQUFPO1FBQ0wsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7SUFDNUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZWNvcmRGcmFtZSDigJQgdGhlIHJlY29yZCBoYWxmIG9mIG9uZSBzdGFnZSdzIGZyYW1lIChDMywgTDMpLlxuICpcbiAqIFdoYXQgYSBzdGFnZSdzIGZyYW1lIG5lZWRzIHRvIFJFQUQgYW5kIFdSSVRFIHRoZSByZWNvcmQsIGFuZCBub3RoaW5nIGFib3V0IHRoZSBzdGFnZSBpbnNpZGUgYSBydW46XG4gKiB3aGVyZSBpdCB3cml0ZXMgKGl0cyBhZGRyZXNzKSwgd2hhdCBpdCByZWFkIGZpcnN0ICh0aGUgZmlyc3QtdG91Y2ggYmFzZSksIHdoYXQgaXQgc3RhZ2VkICh0aGUgbGF6eVxuICogdHJhbnNhY3Rpb24gYnVmZmVyKSBhbmQgd2hpY2ggb2YgaXQgdGhlIGxvZyBtdXN0IG5vdCBzaG93ICh0aGUgc2NydWIgb2YgZWFjaCB3cml0ZSksIHdoaWNoIGtleXMgaXRcbiAqIHJlYWQgKHRoZSByZWFkS2V5cyBsaXN0KSwgYW5kIHdoZXJlIGEgY29tbWl0IGxhbmRzIChsaXZlIHN0YXRlLCB0aGUgcmVkYWN0ZWQgbWlycm9yLCB0aGUgbG9nIOKAlFxuICogdGhyb3VnaCBgcmVjb3JkQ29tbWl0YCkuIFRoZSBlbmdpbmUncyBmcmFtZSAoYFN0YWdlQ29udGV4dGAsIEw0KSBjb21wb3NlcyBvbmUgYW5kIGtlZXBzIHRoZSByZXN0OlxuICogcmV0ZW50aW9uLCBkaWFnbm9zdGljcywgdGhlIGRldi1tb2RlIHdhcm5pbmdzLCB0aGUgY29tbWl0IG9ic2VydmVyIGFuZCB0aGUgcmVkYWN0aW9uIERFQ0lTSU9OIOKAlFxuICogd2hpY2ggdmFsdWUgaXMgc2VjcmV0IChgcmVkYWN0aW9uLnRzIMK3IGRlY2lkZVdyaXRlYCk7IHRoZSBmcmFtZSB3cml0ZXMgdGhlIGJ5dGVzIGl0IGlzIGhhbmRlZCAoQzQpLlxuICpcbiAqIFRIRSBMQVc6XG4gKiAgIDEuIEFERFJFU1MuIFRoZSBmcmFtZSByZWFkcyBhbmQgd3JpdGVzIGF0IGl0cyBhZGRyZXNzLCBhIHBhdGggcHJlZml4IHRoZSBlbmdpbmUgY29tcHV0ZWQgYW5kIGhhbmRzXG4gKiAgICAgIG92ZXIgYXMgZGF0YSAoQzI6IGBbJ3J1bnMnLCA8aWQ+XWAgb3IgYFtdYCwgdGhlIHJvb3QpLiBJdCBtb3ZlcyBvbmx5IGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGU6XG4gKiAgICAgIHRoZSBidWZmZXIga2VlcHMgdGhlIGFkZHJlc3MgaXQgd2FzIGJ1aWx0IGF0ICh0aGUgZW5naW5lIHJlZnVzZXMgYSBsYXRlciBtb3ZlKS5cbiAqICAgMi4gRklSU1QgVE9VQ0guIFRoZSBjb21taXR0ZWQgZ2VuZXJhdGlvbiB0aGUgZnJhbWUgZmlyc3QgdG91Y2hlZCDigJQgaXRzIGZpcnN0IHJlYWQgT1IgZmlyc3Qgd3JpdGUg4oCUXG4gKiAgICAgIGlzIGhlbGQgYnkgcmVmZXJlbmNlLCBuZXZlciBjbG9uZWQ6IHRoZSByZWFkIHZpZXcgYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBhbmQgdGhlIGJ1ZmZlcidzXG4gKiAgICAgIG5ldC1jaGFuZ2UgZGlmZiBiYXNlIGFmdGVyIGl0LlxuICogICAzLiBUV08gVElFUlMuIEEgcmVhZCBpcyBzZXJ2ZWQgZnJvbSB0aGUgc3RhZ2UncyBvd24gdmlldyAodGhlIGJ1ZmZlcidzIHdvcmtpbmcgY29weSBvbmNlIHRoZSBzdGFnZVxuICogICAgICB3cm90ZSwgZWxzZSB0aGUgZmlyc3QtdG91Y2ggYmFzZSk7IGEga2V5IGFic2VudCB0aGVyZSBpcyBzZXJ2ZWQgZnJvbSBMSVZFIHN0YXRlIChhdCB0aGVcbiAqICAgICAgYWRkcmVzcywgdGhlbiB0aGUgcm9vdCkuIEFmdGVyIHRoZSBmaXJzdCB3cml0ZSB0aGUgYnVmZmVyJ3MgZGlmZiBiYXNlIGlzIGZpcnN0IGdpdmVuIGEgcHJpdmF0ZVxuICogICAgICBjb3B5IGF0IHRoYXQgcGF0aCAoYFRyYW5zYWN0aW9uQnVmZmVyIMK3IGRldGFjaEJhc2VgKS5cbiAqICAgNC4gTEFaWSBCVUZGRVIuIFRoZSBidWZmZXIgaXMgYnVpbHQgYXQgdGhlIGZpcnN0IHdyaXRlIOKAlCBvbiB0aGUgZmlyc3QtdG91Y2ggYmFzZSwgYXQgdGhlIGFkZHJlc3MsXG4gKiAgICAgIHVuZGVyIHRoZSBlbmNvZGluZy4gQSBmcmFtZSB0aGF0IG5ldmVyIHdyaXRlcyBidWlsZHMgbm9uZSwgYW5kIGl0cyBjb21taXQgaXMgdGhlIGVtcHR5IGJ1bmRsZS5cbiAqICAgNS4gUkVBRCBLRVlTLiBVbmRlciBgd3JpdGVQcm92ZW5hbmNlOiAncmVhZHMtcHJlZml4J2AgZXZlcnkgbm90ZWQgcmVhZCBwdXRzIGl0cyB1c2VyLWxldmVsIGtleVxuICogICAgICAoZG90dGVkIGZvciBhIG5lc3RlZCBwYXRoKSBvbiB0aGUgZnJhbWUncyBsaXN0LCBvbmNlLCBpbiBvcmRlcjsgZWFjaCBzdGFnZWQgcm93IGNhcnJpZXMgYSBjb3B5XG4gKiAgICAgIG9mIHRoZSBsaXN0IGFzIGl0IHN0YW5kcyB3aGVuIHRoZSByb3cgaXMgc3RhZ2VkLlxuICogICA2LiBDT01NSVQsIFJFTEVBU0UsIERJU0NBUkQuIGBjb21taXRgIHRha2VzIHRoZSBidWZmZXIncyBwYXlsb2FkIChub25lID0gdGhlIGVtcHR5IGNvbW1pdCksIHRoZW5cbiAqICAgICAgdGhlIG5hbWVzLCBhbmQgaGFuZHMgYm90aCB0byBgcmVjb3JkQ29tbWl0YC4gYHJlbGVhc2VgIGRyb3BzIHRoZSBidWZmZXIgYW5kIHRoZSBiYXNlOyBhIGZyYW1lXG4gKiAgICAgIHRvdWNoZWQgYWdhaW4gcmUtYW5jaG9ycyBvbiB0aGUgc3RhdGUgYXMgaXQgc3RhbmRzIHRoZW4uIFRoZSByZWFkS2V5cyBsaXN0IHN1cnZpdmVzIGEgcmVsZWFzZSxcbiAqICAgICAgYW5kIGdvZXMgd2l0aCBgZGlzY2FyZGAgKGEgZmFpbGVkIGF0dGVtcHQgbmV2ZXIgaGFwcGVuZWQpLlxuICogICA3LiBXUklURS4gYHdyaXRlKHBhdGgsIHZhbHVlLCB2ZXJiLCBzY3J1Yj8pYCBpcyB0aGUgb25lIHdheSB0byBzdGFnZTogYHNldGAsIGBtZXJnZWAgb3IgYGRlbGV0ZWBcbiAqICAgICAgYXQgYW4gYWJzb2x1dGUgcGF0aCAodGhlIGFkZHJlc3MgYWxyZWFkeSBqb2luZWQg4oCUIGBhdGApLCB3aXRoIHRoZSBieXRlcyBvZiBhIHJlZGFjdGlvblxuICogICAgICB2ZXJkaWN0LiBgd2hvbGVgIOKGkiB0aGUgbG9nIGFuZCB0aGUgbWlycm9yIGNhcnJ5IGBMT0dfUExBQ0VIT0xERVJgIGF0IHRoZSBwYXRoOyBgZmllbGRzYCDihpIgYXRcbiAqICAgICAgZWFjaCBmaWVsZCBpbnNpZGUgdGhlIHZhbHVlIChhIGxpdGVyYWwga2V5IGFuZCwgd2hlbiBkb3R0ZWQsIHRoZSBuZXN0ZWQgcGF0aCkg4oCUIHdoZXJldmVyIGl0XG4gKiAgICAgIGhvbGRzIGEgdmFsdWUgYXQgY29tbWl0IChgc2NydWIudHNgKS4gTm8gc2NydWIg4oaSIHRoZSB2YWx1ZSBhcyBpdCBpcy4gVGhlIGZyYW1lIG5ldmVyIGRlY2lkZXNcbiAqICAgICAgYSBzY3J1YiwgYW5kIG5vdGhpbmcgb3V0c2lkZSBpdCByZWFjaGVzIGl0cyBidWZmZXIuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBPcFZlcmIgfSBmcm9tICcuL2RlbHRhRW5jb2RpbmcuanMnO1xuaW1wb3J0IHR5cGUgeyBFdmVudExvZyB9IGZyb20gJy4vRXZlbnRMb2cuanMnO1xuaW1wb3J0IHsgbmF0aXZlR2V0IH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IHR5cGUgQ29tbWl0U3RhbXAsIHJlY29yZENvbW1pdCB9IGZyb20gJy4vcmVjb3JkQ29tbWl0LmpzJztcbmltcG9ydCB0eXBlIHsgU2hhcmVkTWVtb3J5IH0gZnJvbSAnLi9TaGFyZWRNZW1vcnkuanMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWZmZXIgfSBmcm9tICcuL1RyYW5zYWN0aW9uQnVmZmVyLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tbWl0VmFsdWVzTW9kZSwgV3JpdGVQcm92ZW5hbmNlTW9kZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKipcbiAqIFRoZSB0d28gZGlhbHMgdGhhdCBzaGFwZSBhIGZyYW1lJ3MgYnl0ZXM6IHRoZSBsb2cncyB2YWx1ZSBlbmNvZGluZyBhbmQgdGhlIHBlci1yb3cgcmVhZCBwcmVmaXguXG4gKiBIZWxkIGJ5IHJlZmVyZW5jZSBhbmQgc3dhcHBlZCB3aG9sZSAoYHVzZUVuY29kaW5nYCksIG5ldmVyIGVkaXRlZCDigJQgdGhlIGVuZ2luZSBoYW5kcyB0aGUgcnVuJ3NcbiAqIGZyb3plbiBwb2xpY3kgaXRzZWxmLiBBYnNlbnQ6IGAnZnVsbCdgIHZhbHVlcyBhbmQgbm8gcmVhZCBwcmVmaXguXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3JkRW5jb2Rpbmcge1xuICByZWFkb25seSBjb21taXRWYWx1ZXM6IENvbW1pdFZhbHVlc01vZGU7XG4gIHJlYWRvbmx5IHdyaXRlUHJvdmVuYW5jZTogV3JpdGVQcm92ZW5hbmNlTW9kZTtcbn1cblxuLyoqXG4gKiBXaGF0IGEgc3RhZ2UgY2FuIHN0YWdlIChsYXcgNykg4oCUIHRoZSB0cmFuc2FjdGlvbiBidWZmZXIncyBvcCB2ZXJicyAoYGRlbHRhRW5jb2RpbmcudHMgwrcgT3BWZXJiYCksIG9uZVxuICogdW5pb24uIGBhcHBlbmRgIGlzIG5vdCBvbmU6IGl0IGlzIGhvdyB0aGUgbG9nIGVuY29kZXMgYSBncm93biBhcnJheSAoYCdkZWx0YSdgKS5cbiAqL1xuZXhwb3J0IHR5cGUgV3JpdGVWZXJiID0gT3BWZXJiO1xuXG4vKipcbiAqIFRoZSBieXRlcyBvZiBhIHJlZGFjdGlvbiB2ZXJkaWN0IGZvciBvbmUgd3JpdGUgKGxhdyA3KTogd2hpY2ggb2YgaXQgdGhlIGNvbW1pdCBsb2cgYW5kIHRoZSByZWRhY3RlZFxuICogbWlycm9yIG11c3Qgbm90IHNob3cuIFRoZSBlbmdpbmUgZGVjaWRlcyBpdCAoYHJlZGFjdGlvbi50cyDCtyBkZWNpZGVXcml0ZWApOyB0aGUgZnJhbWUgb25seSB3cml0ZXMgaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV3JpdGVTY3J1YiB7XG4gIC8qKiBUaGUgd2hvbGUgdmFsdWU6IGBMT0dfUExBQ0VIT0xERVJgIGF0IHRoZSB3cml0ZSdzIHBhdGguICovXG4gIHJlYWRvbmx5IHdob2xlPzogYm9vbGVhbjtcbiAgLyoqIERvdC1wYXRocyBJTlNJREUgdGhlIHZhbHVlLCByZWxhdGl2ZSB0byBpdDogYExPR19QTEFDRUhPTERFUmAgYXQgZWFjaCBvbmUgdGhhdCBob2xkcyBhIHZhbHVlLiAqL1xuICByZWFkb25seSBmaWVsZHM/OiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGNsYXNzIFJlY29yZEZyYW1lIHtcbiAgLyoqIExpdmUgY29tbWl0dGVkIHN0YXRlIOKAlCB0aGUgaGVhcCBldmVyeSBmcmFtZSBvZiB0aGUgcnVuIHNoYXJlcy4gKi9cbiAgcmVhZG9ubHkgc3RhdGU6IFNoYXJlZE1lbW9yeTtcbiAgLyoqIFRoZSBsb2cgdGhlIGZyYW1lJ3MgY29tbWl0cyBsYW5kIG9uLCB3aGVuIHRoZSBydW4ga2VlcHMgb25lLiAqL1xuICByZWFkb25seSBsb2c/OiBFdmVudExvZztcbiAgLyoqIFRoZSByZWRhY3RlZCBtaXJyb3IgdGhlIGZyYW1lJ3MgY29tbWl0cyBsYW5kIG9uLCB3aGVuIHRoZSBydW4ga2VlcHMgb25lICh7QGxpbmsgdXNlTWlycm9yfSkuICovXG4gIHByaXZhdGUgX21pcnJvcj86IFNoYXJlZE1lbW9yeTtcbiAgLyoqIFdoZXJlIHRoZSBmcmFtZSByZWFkcyBhbmQgd3JpdGVzIChsYXcgMSkuICovXG4gIHByaXZhdGUgX2FkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogVGhlIHR3byBkaWFscyAobGF3IDQsIDUpOyBhYnNlbnQg4oaSIHRoZSByZWNvcmQncyBkZWZhdWx0cy4gKi9cbiAgcHJpdmF0ZSBlbmNvZGluZz86IFJlY29yZEVuY29kaW5nO1xuICAvKipcbiAgICogVGhlIGNvbW1pdHRlZCBnZW5lcmF0aW9uIGF0IHRoZSBmcmFtZSdzIEZJUlNUIHRvdWNoIChsYXcgMikg4oCUIGhlbGQgYnkgUkVGRVJFTkNFLCBuZXZlciBjbG9uZWQuXG4gICAqIFNlZSB7QGxpbmsgZmlyc3RUb3VjaH0gZm9yIHRoZSBhbGdvcml0aG0gYW5kIHRoZSBpbW11dGFiaWxpdHkgaW52YXJpYW50IHRoYXQgbWFrZXMgYSBiYXJlXG4gICAqIHJlZmVyZW5jZSBzYWZlLlxuICAgKi9cbiAgcHJpdmF0ZSBiYXNlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKiBUaGUgc3RhZ2UncyBzdGFnZWQgd3JpdGVzIOKAlCBidWlsdCBhdCBpdHMgZmlyc3Qgd3JpdGUgKGxhdyA0KSwgcmVsZWFzZWQgYXQgY29tbWl0LiAqL1xuICBwcml2YXRlIGJ1ZmZlcj86IFRyYW5zYWN0aW9uQnVmZmVyO1xuICAvKipcbiAgICogS2V5cyB0cmFja2VkLXJlYWQgc28gZmFyLCBpbiBvcmRlciAobGF3IDUpIOKAlCB0aGUgc291cmNlIG9mIGVhY2ggc3RhZ2VkIHJvdydzIGByZWFkS2V5c2AuIE9ubHlcbiAgICogYWxsb2NhdGVkIHVuZGVyIGAncmVhZHMtcHJlZml4J2A7IGluc2VydGlvbi1vcmRlcmVkIChhIFNldCkgYW5kIG1vbm90b25pYywgd2hpY2ggaXMgd2hhdCBtYWtlc1xuICAgKiBcImxhc3Qgd3JpdGUncyBwcmVmaXggPT0gdW5pb25cIiBob2xkIGluIGRlbHRhIG1vZGUuXG4gICAqL1xuICBwcml2YXRlIHJlYWRLZXlzPzogU2V0PHN0cmluZz47XG5cbiAgY29uc3RydWN0b3Ioc3RhdGU6IFNoYXJlZE1lbW9yeSwgbG9nPzogRXZlbnRMb2csIGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdID0gW10pIHtcbiAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgdGhpcy5sb2cgPSBsb2c7XG4gICAgdGhpcy5fYWRkcmVzcyA9IGFkZHJlc3M7XG4gIH1cblxuICAvKiogV2hlcmUgdGhlIGZyYW1lIHJlYWRzIGFuZCB3cml0ZXMgKGxhdyAxKS4gKi9cbiAgZ2V0IGFkZHJlc3MoKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9hZGRyZXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgYW5kIHdyaXRlIGF0IGBhZGRyZXNzYCBmcm9tIG5vdyBvbiDigJQgYmVmb3JlIHRoZSBmcmFtZSdzIGZpcnN0IHdyaXRlIChsYXcgMSk6IHRoZSBidWZmZXIga2VlcHNcbiAgICogdGhlIGFkZHJlc3MgaXQgd2FzIGJ1aWx0IGF0LiBUaGUgZW5naW5lJ3Mgb25lIGNhbGxlciwgYFN0YWdlQ29udGV4dCDCtyB1c2VBZGRyZXNzT2ZgLCByZWZ1c2VzIGEgbW92ZVxuICAgKiBvbmNlIHRoZSBmcmFtZSBoYXMgc3RhZ2VkLlxuICAgKi9cbiAgdXNlQWRkcmVzcyhhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMuX2FkZHJlc3MgPSBhZGRyZXNzO1xuICB9XG5cbiAgLyoqIFRoZSB0d28gZGlhbHMgdGhlIGZyYW1lIGVuY29kZXMgdW5kZXIgZnJvbSBpdHMgbmV4dCBidWZmZXIgYW5kIGl0cyBuZXh0IHJlYWQgb24gKGxhdyA0LCA1KS4gKi9cbiAgdXNlRW5jb2RpbmcoZW5jb2Rpbmc6IFJlY29yZEVuY29kaW5nKTogdm9pZCB7XG4gICAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nO1xuICB9XG5cbiAgLyoqIFRoZSByZWRhY3RlZCBtaXJyb3IsIGlmIHRoZSBydW4ga2VlcHMgb25lLiAqL1xuICBnZXQgbWlycm9yKCk6IFNoYXJlZE1lbW9yeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX21pcnJvcjtcbiAgfVxuXG4gIC8qKiBMYW5kIGV2ZXJ5IGNvbW1pdCBmcm9tIG5vdyBvbiBvbiBgbWlycm9yYCB0b28sIHdpdGggdGhlIHNjcnViYmVkIHJvd3MgdGhlIGxvZyB0YWtlcyAoYHJlY29yZENvbW1pdGApLiAqL1xuICB1c2VNaXJyb3IobWlycm9yOiBTaGFyZWRNZW1vcnkgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLl9taXJyb3IgPSBtaXJyb3I7XG4gIH1cblxuICAvKiogVGhlIGFic29sdXRlIHBhdGggb2YgYGtleWAgdW5kZXIgYHBhdGhgOiB0aGUgZnJhbWUncyBhZGRyZXNzLCB0aGVuIHRoZSBwYXRoLCB0aGVuIHRoZSBrZXkuICovXG4gIGF0KHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdLCBrZXk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICAvLyBFdmVyeSByZWFkIGFuZCB3cml0ZSBidWlsZHMgb25lLiBUaGUgcm9vdCdzIGlzIHRoZSBwYXRoIGFuZCB0aGUga2V5OyB1bmRlciBhbiBhZGRyZXNzLCBhblxuICAgIC8vIGluZGV4IGxvb3Ag4oCUIHRoZSBkb3VibGUgc3ByZWFkIGBbLi4uYWRkcmVzcywgLi4ucGF0aCwga2V5XWAgY29zdHMgYSB0aGlyZCBtb3JlIHBlciBjYWxsXG4gICAgLy8gKGFzIGB1dGlscyDCtyBwYXRoVW5kZXJgIGZvdW5kIGZvciB0aGUgYWRkcmVzcyBhbmQgdGhlIHBhdGgpLlxuICAgIGNvbnN0IGFkZHJlc3MgPSB0aGlzLl9hZGRyZXNzO1xuICAgIGlmIChhZGRyZXNzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFsuLi5wYXRoLCBrZXldO1xuICAgIGNvbnN0IG91dCA9IG5ldyBBcnJheTxzdHJpbmc+KGFkZHJlc3MubGVuZ3RoICsgcGF0aC5sZW5ndGggKyAxKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFkZHJlc3MubGVuZ3RoOyBpKyspIG91dFtpXSA9IGFkZHJlc3NbaV07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSBvdXRbYWRkcmVzcy5sZW5ndGggKyBpXSA9IHBhdGhbaV07XG4gICAgb3V0W291dC5sZW5ndGggLSAxXSA9IGtleTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIOKUgOKUgCBUaGUgZmlyc3QtdG91Y2ggYmFzZSAoIzEzKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICpcbiAgICogV0hBVDogcmV0dXJucyB0aGUgY29tbWl0dGVkIHNoYXJlZCBzdGF0ZSBhcyBpdCB3YXMgYXQgdGhpcyBmcmFtZSdzIEZJUlNUIHRvdWNoIChmaXJzdCByZWFkIG9yXG4gICAqIGZpcnN0IHdyaXRlKSwgY2FwdHVyaW5nIHRoZSByZWZlcmVuY2Ugb24gZmlyc3QgY2FsbC4gU2VydmVzIHR3byBjb25zdW1lcnM6IHJlYWRzIGJlZm9yZSB0aGUgZmlyc3RcbiAgICogd3JpdGUgKHtAbGluayByZWFkfSkgYW5kIHRoZSB0cmFuc2FjdGlvbiBidWZmZXIncyBkaWZmIGJhc2UgKHtAbGluayBnZXRUcmFuc2FjdGlvbkJ1ZmZlcn0pLlxuICAgKlxuICAgKiBXSFkgQSBCQVJFIFJFRkVSRU5DRSBJUyBTQUZFIOKAlCB0aGUgaW52YXJpYW50IHRoaXMgcmVzdHMgb246IGNvbW1pdHRlZCBzdGF0ZSBpc1xuICAgKiBpbW11dGFibGUtYWZ0ZXItc3dhcC4gRXZlcnkgd3JpdGUgdG8gYFNoYXJlZE1lbW9yeWAgYnVpbGRzIHRoZSBORVhUIGdlbmVyYXRpb24gYW5kIHN3YXBzIGl0IGluXG4gICAqIChjb3B5LW9uLXdyaXRlLCA5LjI5LjA6IGBhcHBseVBhdGNoYCB2aWEgYG5leHRHZW5lcmF0aW9uYCwgYW5kIGBzZXRWYWx1ZWAvYHVwZGF0ZVZhbHVlYCB0b28pIOKAlCBpdFxuICAgKiBjb3BpZXMgdGhlIHJvb3QgYW5kIHRoZSBjb250YWluZXJzIG9uIGVhY2ggd3JpdHRlbiBwYXRoLCBzaGFyZXMgdGhlIHJlc3QsIGFuZCBuZXZlciBlZGl0cyBhXG4gICAqIGNvbnRhaW5lciBvZiB0aGUgZ2VuZXJhdGlvbiBhIHN0YWdlIGNhcHR1cmVkIGhlcmUuIEhvbGRpbmcgdGhlIHJlZmVyZW5jZSB0aGVyZWZvcmUgZ2l2ZXMgdGhpc1xuICAgKiBzdGFnZSBhIHN0YWJsZSBzbmFwc2hvdCBhdCB6ZXJvIGNvc3Qg4oCUIG5vIGNsb25lLCB3aGljaCBpcyB0aGUgZW50aXJlIHBvaW50IG9mICMxMy4gVGhlIHRyYW5zYWN0aW9uXG4gICAqIGJ1ZmZlcidzIG5ldC1jaGFuZ2UgZGlmZiBiYXNlIHJlc3RzIG9uIHRoZSBzYW1lIGd1YXJhbnRlZTogaXQgSVMgdGhpcyB2aWV3LlxuICAgKlxuICAgKiBXSFkgRklSU1QgVE9VQ0gsIG5vdCBmaXJzdCB3cml0ZTogdGhlIHByZS0jMTMgZWFnZXIgZW5naW5lIGNsb25lZCB0aGUgc3RhdGUgaW50byB0aGUgYnVmZmVyIGF0XG4gICAqIHRoZSBzdGFnZSdzIGZpcnN0IEFDQ0VTUywgYW5jaG9yaW5nIGJvdGggaXRzIHNuYXBzaG90IHJlYWRzIGFuZCBpdHMgY29tbWl0IGJhc2VsaW5lICh0aGVcbiAgICogbmV0LWNoYW5nZSBkaWZmIGJhc2UpIHRoZXJlLiAjMTMncyBmaXJzdCBjdXQgYW5jaG9yZWQgdGhlIGxhenkgYnVmZmVyIGF0IGZpcnN0IFdSSVRFIOKAlCBvYnNlcnZhYmx5XG4gICAqIGRpZmZlcmVudCB3aGVuIHNvbWV0aGluZyBlbHNlIGNvbW1pdHMgaW4gdGhlIGdhcCBiZXR3ZWVuIHRoaXMgc3RhZ2UncyBmaXJzdCByZWFkIGFuZCBpdHMgZmlyc3RcbiAgICogd3JpdGUuIFRoYXQgZ2FwIGlzIFJFQUNIQUJMRTogZm9yayBzaWJsaW5ncyBhcmUgbmFtZXNwYWNlLWlzb2xhdGVkIGZvciBydW4tc2NvcGVkIGtleXMgKGVhY2ggY2hpbGRcbiAgICogd3JpdGVzIHVuZGVyIGBydW5zLzxjaGlsZElkPi9gKSwgYnV0IFJPT1QtbGV2ZWwga2V5cyBhcmUgc2hhcmVkIOKAlCB3cml0dGVuIHZpYSBgc2V0R2xvYmFsYCBmcm9tXG4gICAqIGNvbnN1bWVyIHNjb3BlIGNvZGUgYW5kLCBjcml0aWNhbGx5LCBieSBgU3ViZmxvd0lucHV0TWFwcGVyYCdzIG91dHB1dCBtYXBwaW5nXG4gICAqIChgcGFyZW50Q29udGV4dC5zZXRHbG9iYWxgKSwgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHJ1bnMgd2hlbiBhIHN1YmZsb3cgaXMgYSBmb3JrIGJyYW5jaC4gQVxuICAgKiBzaWJsaW5nJ3Mgcm9vdC1rZXkgY29tbWl0IGxhbmRpbmcgaW4gdGhlIGdhcCB3b3VsZCBzaGlmdCB0aGlzIHN0YWdlJ3MgZGlmZiBiYXNlLCBtYWtpbmcgaXRzXG4gICAqIENvbW1pdEJ1bmRsZSByZWNvcmQgYSBwaGFudG9tIGNoYW5nZSAob3Igc3dhbGxvdyBhIHJlYWwgb25lKSByZWxhdGl2ZSB0byB0aGUgZWFnZXIgZW5naW5lLlxuICAgKiBBbmNob3JpbmcgdGhlIHZpZXcgYXQgZmlyc3QgdG91Y2ggcmVzdG9yZXMgdGhlIEVYQUNUIGVhZ2VyIHNlbWFudGljcyDigJQgc2VxdWVudGlhbCBBTkQgcGFyYWxsZWwg4oCUXG4gICAqIGF0IHplcm8gY2xvbmUgY29zdC5cbiAgICpcbiAgICogUmVhZCB2aXNpYmlsaXR5IGlzIHR3by10aWVyLCBtYXRjaGluZyBlYWdlciBieXRlLWZvci1ieXRlOiBrZXlzIHByZXNlbnQgaW4gdGhlIHZpZXcgYXQgZmlyc3RcbiAgICogdG91Y2ggcmVhZCByZXBlYXRhYmx5IGZyb20gaXQ7IGtleXMgQUJTRU5UIGZyb20gaXQgZmFsbCBiYWNrIHRvIExJVkUgc3RhdGUgKHRoZSBlYWdlciBlbmdpbmUnc1xuICAgKiBleGFjdCBmYWxsYmFjayDigJQgYSBtaWQtZmxpZ2h0IHNpYmxpbmcgcm9vdC1rZXkgd3JpdGUgd2FzIGFsd2F5cyB2aXNpYmxlIHRvIHJlYWRzLCBhbmQgc3RheXNcbiAgICogdmlzaWJsZTsgb25seSB0aGUgRElGRiBCQVNFIGlzIHBpbm5lZCkuXG4gICAqL1xuICBwcml2YXRlIGZpcnN0VG91Y2goKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGlmICghdGhpcy5iYXNlKSB7XG4gICAgICB0aGlzLmJhc2UgPSB0aGlzLnN0YXRlLmdldFN0YXRlKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJhc2U7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRyYW5zYWN0aW9uIGJ1ZmZlciwgY3JlYXRlZCBsYXppbHkgb24gdGhlIGZyYW1lJ3MgRklSU1QgV1JJVEUgKCMxMykuXG4gICAqXG4gICAqIFJlYWRzIE5FVkVSIGNvbnN0cnVjdCBpdDogcmVhZC15b3VyLXdyaXRlcyBvbmx5IG1hdHRlcnMgb25jZSBhIHN0YWdlZCB3cml0ZSBleGlzdHMsIHNvIGJlZm9yZSB0aGF0XG4gICAqIHtAbGluayByZWFkfSBzZXJ2ZXMgZnJvbSB0aGUgZmlyc3QtdG91Y2ggYmFzZSBhbmQge0BsaW5rIGNvbW1pdH0gcmVjb3JkcyBhbiBlbXB0eSBidW5kbGUg4oCUIGFsbCB3aXRoXG4gICAqIFpFUk8gYHN0cnVjdHVyZWRDbG9uZWBzIG9mIHRoZSBzaGFyZWQgc3RhdGUuXG4gICAqXG4gICAqIFRoZSBidWZmZXIncyBiYXNlIGlzIHRoZSBGSVJTVC1UT1VDSCB2aWV3LCBOT1QgdGhlIGxpdmUgc3RhdGUgYXQgd3JpdGUgdGltZTogdW5kZXIgcGFyYWxsZWwgZm9ya3NcbiAgICogYSBzaWJsaW5nIG1heSBoYXZlIGNvbW1pdHRlZCBiZXR3ZWVuIHRoaXMgZnJhbWUncyBmaXJzdCByZWFkIGFuZCB0aGlzIHdyaXRlLCBhbmQgdGhlIG5ldC1jaGFuZ2VcbiAgICogZGlmZiBiYXNlIG11c3Qgc3RheSBhbmNob3JlZCBhdCBmaXJzdCB0b3VjaCB0byBtYXRjaCB0aGUgZWFnZXIgZW5naW5lIOKAlCBzZWUge0BsaW5rIGZpcnN0VG91Y2h9LlxuICAgKlxuICAgKiBQcml2YXRlIHNpbmNlIEM0OiBldmVyeSB3cml0ZSBnb2VzIHRocm91Z2gge0BsaW5rIHdyaXRlfSwgc28gdGhlIHNjcnViIHRyYXZlbHMgd2l0aCB0aGUgb3AuXG4gICAqL1xuICBwcml2YXRlIGdldFRyYW5zYWN0aW9uQnVmZmVyKCk6IFRyYW5zYWN0aW9uQnVmZmVyIHtcbiAgICBpZiAoIXRoaXMuYnVmZmVyKSB7XG4gICAgICAvLyBQZXItd3JpdGUgcHJvdmVuYW5jZSAoI1AxKTogaGFuZCB0aGUgYnVmZmVyIGEgbGl2ZSB2aWV3IG9mIHRoaXMgZnJhbWUncyByZWFkIHByZWZpeCDigJRcbiAgICAgIC8vIGV2YWx1YXRlZCBBVCBFQUNIIFdSSVRFLCBzbyBlYWNoIHN0YWdlZCBvcCBjYXB0dXJlcyBleGFjdGx5IHRoZSByZWFkcyB0aGF0IHByZWNlZGVkIGl0LlxuICAgICAgY29uc3QgcmVhZEtleXNQcm92aWRlciA9XG4gICAgICAgIHRoaXMuZW5jb2Rpbmc/LndyaXRlUHJvdmVuYW5jZSA9PT0gJ3JlYWRzLXByZWZpeCcgPyAoKSA9PiBbLi4uKHRoaXMucmVhZEtleXMgPz8gW10pXSA6IHVuZGVmaW5lZDtcbiAgICAgIC8vIFRoZSBmcmFtZSdzIGFkZHJlc3MgKDkuMzAuMDogdGhlIGFkbWl0dGVkIHJlY29yZCByZWFkcyB0aGUgY29udGFpbmVycyB0aGVyZSBhcyB3aGVyZSB0aGVcbiAgICAgIC8vIHN0YWdlIHdyaXRlcywgbmV2ZXIgYXMgYSB2YWx1ZSBpdCByZWFkKS5cbiAgICAgIHRoaXMuYnVmZmVyID0gbmV3IFRyYW5zYWN0aW9uQnVmZmVyKFxuICAgICAgICB0aGlzLmZpcnN0VG91Y2goKSxcbiAgICAgICAgdGhpcy5lbmNvZGluZz8uY29tbWl0VmFsdWVzLFxuICAgICAgICByZWFkS2V5c1Byb3ZpZGVyLFxuICAgICAgICB0aGlzLl9hZGRyZXNzLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YWdlIG9uZSB3cml0ZSAobGF3IDcpOiBgdmVyYmAgYXQgYHBhdGhgIOKAlCBhbiBhYnNvbHV0ZSBwYXRoLCB0aGUgYWRkcmVzcyBhbHJlYWR5IGpvaW5lZFxuICAgKiAoe0BsaW5rIGF0fSkg4oCUIGFuZCB0aGUgYnl0ZXMgb2YgaXRzIHJlZGFjdGlvbiB2ZXJkaWN0LiBUaGUgZmlyc3Qgd3JpdGUgYnVpbGRzIHRoZSBidWZmZXIgKGxhdyA0KS5cbiAgICpcbiAgICogVGhlIHNjcnViIHJlZ2lzdGVycyBwYXRocywgbmV2ZXIgdmFsdWVzOiBgd2hvbGVgIG1hcmtzIHRoZSBvcCdzIG93biBwYXRoLCBgZmllbGRzYCBlYWNoIGZpZWxkXG4gICAqIGluc2lkZSB0aGUgdmFsdWUgKGEgbGl0ZXJhbCBrZXkgYW5kLCB3aGVuIGRvdHRlZCwgdGhlIG5lc3RlZCBwYXRoKTsgYHJlY29yZENvbW1pdGAgcHV0cyB0aGVcbiAgICogbG9nJ3MgcGxhY2Vob2xkZXIgd2hlcmV2ZXIgb25lIG9mIHRoZW0gaG9sZHMgYSB2YWx1ZSBhdCBjb21taXQsIGZvciB0aGUgbWlycm9yIGFuZCB0aGUgbG9nIG9ubHlcbiAgICogKGBzY3J1Yi50c2ApLiBMaXZlIHN0YXRlIHRha2VzIHRoZSB2YWx1ZSBhcyBpdCBpcy4gQSBwYXRoIG1hcmtlZCBieSBhIHdyaXRlIHRoYXQgdGhlIG5ldC1jaGFuZ2VcbiAgICogZmlsdGVyIGRyb3BzIGdvZXMgd2l0aCBpdC5cbiAgICovXG4gIHdyaXRlKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10sIHZhbHVlOiB1bmtub3duLCB2ZXJiOiBXcml0ZVZlcmIsIHNjcnViPzogV3JpdGVTY3J1Yik6IHZvaWQge1xuICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25CdWZmZXIoKTtcbiAgICBjb25zdCB3aG9sZSA9IHNjcnViPy53aG9sZSA9PT0gdHJ1ZTtcbiAgICBpZiAodmVyYiA9PT0gJ21lcmdlJykgYnVmZmVyLm1lcmdlKHBhdGgsIHZhbHVlLCB3aG9sZSk7XG4gICAgZWxzZSBpZiAodmVyYiA9PT0gJ2RlbGV0ZScpIGJ1ZmZlci5kZWxldGUocGF0aCwgd2hvbGUpO1xuICAgIGVsc2UgYnVmZmVyLnNldChwYXRoLCB2YWx1ZSwgd2hvbGUpO1xuICAgIGlmIChzY3J1Yj8uZmllbGRzICE9PSB1bmRlZmluZWQpIGJ1ZmZlci5tYXJrUmVkYWN0ZWRGaWVsZHMocGF0aCwgc2NydWIuZmllbGRzKTtcbiAgfVxuXG4gIC8qKiBIYXMgdGhlIGZyYW1lIHN0YWdlZCBhIHdyaXRlIHNpbmNlIGl0cyBsYXN0IHJlbGVhc2Ug4oCUIGRvZXMgaXRzIGJ1ZmZlciBleGlzdD8gKi9cbiAgZ2V0IGhhc1N0YWdlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZnJhbWUncyByZWFkLCBtaXJyb3JpbmcgdGhlIGVhZ2VyIGVuZ2luZSdzIHJlYWQgb3JkZXIgYnl0ZS1mb3ItYnl0ZSAobGF3IDMpOlxuICAgKlxuICAgKiAgICAxLiBzdGFnZWQgd3JpdGVzICsgZmlyc3QtdG91Y2ggc25hcHNob3Qg4oCUIGBidWZmZXIuZ2V0YCBvdmVyIGl0cyB3b3JraW5nQ29weSB3aGVuIHRoZSBidWZmZXJcbiAgICogICAgICAgZXhpc3RzLCBlbHNlIGBuYXRpdmVHZXRgIG92ZXIgdGhlIHplcm8tY2xvbmUgZmlyc3QtdG91Y2ggYmFzZSAodGhlIGJ1ZmZlcidzIGJhc2UgSVMgdGhhdFxuICAgKiAgICAgICB2aWV3LCBzbyB0aGUgdHdvIHRpZXJzIGFncmVlIG9uIGNvbnRlbnQpO1xuICAgKiAgICAyLiBMSVZFIHN0YXRlIHZpYSBgU2hhcmVkTWVtb3J5IMK3IGdldFZhbHVlYCBmb3Iga2V5cyBhYnNlbnQgZnJvbSB0aGUgc25hcHNob3Qg4oCUIGluY2x1ZGluZyBpdHNcbiAgICogICAgICAgYWRkcmVzc+KGknJvb3QgZmFsbGJhY2suIFRoZSBlYWdlciBlbmdpbmUgaGFkIHRoaXMgZXhhY3QgbGl2ZSBmYWxsYmFjayBmb3Igc25hcHNob3QtbWlzc2luZ1xuICAgKiAgICAgICBrZXlzOyBieXRlLWlkZW50aXR5IG92ZXIgcHVyaXR5LiBBZnRlciB0aGUgZnJhbWUncyBmaXJzdCB3cml0ZSBzdWNoIGEgdmFsdWUgY2FuIGJlIHRoZSB2ZXJ5XG4gICAqICAgICAgIGNvbnRhaW5lciB0aGUgYnVmZmVyJ3MgZGlmZiBiYXNlIGhvbGRzIGF0IHRoZSBwYXRoICh0aGUgc3RhZ2UgZGVsZXRlZCBvciB1bnNldCBpdCwgb3JcbiAgICogICAgICAgcmVwbGFjZWQgYSBjb250YWluZXIgYWJvdmUgaXQpLCBzbyB0aGUgYmFzZSBpcyBkZXRhY2hlZCB0aGVyZSBmaXJzdFxuICAgKiAgICAgICAoYFRyYW5zYWN0aW9uQnVmZmVyIMK3IGRldGFjaEJhc2VgKTogYW4gaW4tcGxhY2UgZWRpdCBvZiB0aGUgdmFsdWUgKG91dCBvZiBjb250cmFjdCkgd3JpdHRlblxuICAgKiAgICAgICBiYWNrIGlzIHJlY29yZGVkLCBhcyBvbiA5LjI4LjAsIHdob3NlIGJhc2Ugd2FzIGEgY2xvbmUgdGFrZW4gYXQgdGhlIGZpcnN0IHdyaXRlLlxuICAgKlxuICAgKiBSZWFkcyBuZXZlciBjb25zdHJ1Y3QgdGhlIGJ1ZmZlciAoIzEzKTogYSBmcmFtZSB0aGF0IG5ldmVyIHdyaXRlcyBwZXJmb3JtcyB6ZXJvIGNsb25lcyBvZiB0aGVcbiAgICogc2hhcmVkIHN0YXRlLlxuICAgKi9cbiAgcmVhZChwYXRoOiBzdHJpbmdbXSwga2V5Pzogc3RyaW5nKTogdW5rbm93biB7XG4gICAgY29uc3QgYXQgPSB0aGlzLmF0KHBhdGgsIGtleSBhcyBzdHJpbmcpO1xuICAgIGNvbnN0IGZyb21TbmFwc2hvdCA9IHRoaXMuYnVmZmVyID8gdGhpcy5idWZmZXIuZ2V0KGF0KSA6IG5hdGl2ZUdldCh0aGlzLmZpcnN0VG91Y2goKSwgYXQpO1xuICAgIGlmICh0eXBlb2YgZnJvbVNuYXBzaG90ICE9PSAndW5kZWZpbmVkJykgcmV0dXJuIGZyb21TbmFwc2hvdDtcbiAgICBjb25zdCBsaXZlID0gdGhpcy5zdGF0ZS5nZXRWYWx1ZSh0aGlzLl9hZGRyZXNzLCBwYXRoLCBrZXkpO1xuICAgIC8vIFRpZXIgMiBhZnRlciB0aGUgZmlyc3Qgd3JpdGU6IGtlZXAgdGhlIGRpZmYgYmFzZSBleGFjdCAoc2VlIGFib3ZlKS5cbiAgICBpZiAodGhpcy5idWZmZXIgJiYgbGl2ZSAhPT0gbnVsbCAmJiB0eXBlb2YgbGl2ZSA9PT0gJ29iamVjdCcpIHRoaXMuYnVmZmVyLmRldGFjaEJhc2UoYXQpO1xuICAgIHJldHVybiBsaXZlO1xuICB9XG5cbiAgLyoqIFB1dCBhIHRyYWNrZWQgcmVhZCdzIHVzZXItbGV2ZWwga2V5IG9uIHRoZSByZWFkS2V5cyBsaXN0IChsYXcgNSkg4oCUIGEgbm8tb3AgdW5sZXNzIHRoZSBmcmFtZSBrZWVwcyBvbmUuICovXG4gIG5vdGVSZWFkKHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdLCBrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVuY29kaW5nPy53cml0ZVByb3ZlbmFuY2UgPT09ICdyZWFkcy1wcmVmaXgnKSB7XG4gICAgICAodGhpcy5yZWFkS2V5cyA/Pz0gbmV3IFNldCgpKS5hZGQocGF0aC5sZW5ndGggPiAwID8gWy4uLnBhdGgsIGtleV0uam9pbignLicpIDoga2V5KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGl2ZSBjb21taXR0ZWQgc3RhdGUgYXQgYGtleWA6IGF0IHRoZSBmcmFtZSdzIGFkZHJlc3MsIGVsc2UgYXQgdGhlIHJvb3Qg4oCUIG5ldmVyIHRoZSBzdGFnZSdzIG93blxuICAgKiB2aWV3LiBUeXBlZCBhcyBgU2hhcmVkTWVtb3J5IMK3IGdldFZhbHVlYCB0eXBlcyBpdCwgd2hpY2ggYFN0YWdlQ29udGV4dCDCtyBnZXRSb290YCBoYW5kcyBvbi5cbiAgICovXG4gIHJlYWRMaXZlKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuZ2V0VmFsdWUodGhpcy5fYWRkcmVzcywgW10sIGtleSk7XG4gIH1cblxuICAvKiogTGl2ZSBjb21taXR0ZWQgc3RhdGUgYXQgYGtleWAgYXQgdGhlIHJvb3Qg4oCUIHR5cGVkIGFzIGBTaGFyZWRNZW1vcnkgwrcgZ2V0VmFsdWVgIChgU3RhZ2VDb250ZXh0IMK3IGdldEdsb2JhbGApLiAqL1xuICByZWFkR2xvYmFsKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuZ2V0VmFsdWUoW10sIFtdLCBrZXkpO1xuICB9XG5cbiAgLyoqIERpZCBhIHN0YWdlZCBvcCB0b3VjaCBgcGF0aGAg4oCUIG9uIGl0LCBhYm92ZSBpdCBvciBiZWxvdyBpdD8gKEEgcmVwb3J0J3MgcXVlc3Rpb247IG5ldmVyIHRoZSBob3QgcGF0aC4pICovXG4gIHdhc1N0YWdlZChwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYnVmZmVyICE9PSB1bmRlZmluZWQgJiYgdGhpcy5idWZmZXIud2FzU3RhZ2VkKHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBhdCBgcGF0aGAgaW4gd2hhdCB0aGUgc3RhZ2UgaGFzIHNlZW4g4oCUIGl0cyB3b3JraW5nIGNvcHkgb25jZSBpdCB3cm90ZSwgZWxzZSBpdHNcbiAgICogZmlyc3QtdG91Y2ggYmFzZSDigJQgV0lUSE9VVCB0YWtpbmcgYSBwcml2YXRlIGNvcHk6IGZvciBhIHJlcG9ydCB0aGF0IG9ubHkgY29tcGFyZXMuXG4gICAqL1xuICBwZWVrKHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW10pOiB1bmtub3duIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXIgPyB0aGlzLmJ1ZmZlci5wZWVrKHBhdGgpIDogbmF0aXZlR2V0KHRoaXMuZmlyc3RUb3VjaCgpLCBwYXRoKTtcbiAgfVxuXG4gIC8qKiBUaGUgdmFsdWUgYXQgYHBhdGhgIGluIHRoZSBmaXJzdC10b3VjaCBiYXNlIOKAlCBjb21taXR0ZWQgc3RhdGUgYXMgdGhlIGZyYW1lIGZpcnN0IHRvdWNoZWQgaXQuICovXG4gIGJhc2VBdChwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogdW5rbm93biB7XG4gICAgcmV0dXJuIG5hdGl2ZUdldCh0aGlzLmZpcnN0VG91Y2goKSwgcGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkIHdoYXQgdGhlIGZyYW1lIHN0YWdlZCAobGF3IDYpOiB0aGUgYnVmZmVyJ3MgcGF5bG9hZCBmaXJzdCDigJQgbm9uZSwgdGhlIGVtcHR5IGNvbW1pdCwgd2hlblxuICAgKiBpdCBzdGFnZWQgbm90aGluZyAoIzEzOiB6ZXJvIGNsb25lcykg4oCUIHRoZW4gdGhlIG5hbWVzIChgc3RhbXBPZigpYCksIHJlYWQgb25jZSB0aGUgcGF5bG9hZCBpc1xuICAgKiBidWlsdCwgYW5kIGJvdGggdG8gYHJlY29yZENvbW1pdGAuIFVzZXIgY29kZSBjYW4gcnVuIHdoaWxlIHRoZSBwYXlsb2FkIGlzIGJ1aWx0IChhIGdldHRlciBvbiBhXG4gICAqIHN0YWdlZCB2YWx1ZSwgd2hpY2ggdGhlIG5ldC1jaGFuZ2UgY29tcGFyZSBhbmQgdGhlIGNsb25lIGludm9rZSk7IHdoYXQgaXQgYWRkcyB0byB0aGUgbmFtZXMg4oCUXG4gICAqIGFuIHVudHJhY2tlZCByZWFkLCBzYXkg4oCUIGlzIG9uIHRoZSBidW5kbGUuXG4gICAqL1xuICBjb21taXQoc3RhbXBPZjogKCkgPT4gQ29tbWl0U3RhbXApOiB2b2lkIHtcbiAgICBjb25zdCBwYXlsb2FkID0gdGhpcy5idWZmZXI/LmNvbW1pdCgpO1xuICAgIHJlY29yZENvbW1pdChwYXlsb2FkLCBzdGFtcE9mKCksIHsgc3RhdGU6IHRoaXMuc3RhdGUsIG1pcnJvcjogdGhpcy5fbWlycm9yLCBsb2c6IHRoaXMubG9nIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuZCB0aGUgZnJhbWUncyBob2xkIG9uIHN0YXRlICgjMTNiLCBsYXcgNik6IGRyb3AgdGhlIGJ1ZmZlciAoaXRzIHdvcmtpbmcgY29weSBhbmQgd2hhdGV2ZXIgcHJpdmF0ZVxuICAgKiBjb3BpZXMgaXRzIHJlYWRzIHRvb2spIGFuZCB0aGUgZmlyc3QtdG91Y2ggYmFzZSAoYSByZWZlcmVuY2UgdGhhdCBwaW5zIG9uZSBjb21taXR0ZWQtc3RhdGVcbiAgICogR0VORVJBVElPTikuIEJvdGggcmUtY3JlYXRlIGxhemlseTogYSBsYXRlciByZWFkIHJlLWFuY2hvcnMgb24gdGhlIENVUlJFTlQgY29tbWl0dGVkIHN0YXRlLCBhbmQgYVxuICAgKiBsYXRlciB3cml0ZSBidWlsZHMgYSBmcmVzaCBidWZmZXIgb24gaXQg4oCUIHNvIGEgc2Vjb25kIGNvbW1pdCBkaWZmcyBhZ2FpbnN0IHRoZSBzdGF0ZSBhZnRlciB0aGVcbiAgICogZmlyc3QuIFdpdGhvdXQgdGhlIHJlbGVhc2UsIHRoZSBleGVjdXRpb24gdHJlZSDigJQgd2hpY2ggcmV0YWlucyBldmVyeSBmcmFtZSBmb3IgdGhlIGxpZmV0aW1lIG9mXG4gICAqIHRoZSBydW4g4oCUIHJldGFpbnMgb25lIHN0YXRlIGdlbmVyYXRpb24gcGVyIGV4ZWN1dGVkIHN0YWdlIChtZWFzdXJlZCBPKE7CsikgYmVmb3JlIGNvcHktb24td3JpdGU7XG4gICAqIGEgNTAwLWl0ZXJhdGlvbiBhZ2VudCBPT01lZCBhIGRlZmF1bHQgTm9kZSBoZWFwLCBiYWNrbG9nICMxOCkuXG4gICAqL1xuICByZWxlYXNlKCk6IHZvaWQge1xuICAgIHRoaXMuYnVmZmVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuYmFzZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvdyBhd2F5IGV2ZXJ5dGhpbmcgdGhlIGZyYW1lIHN0YWdlZCBhbmQgcmVhZCAobGF3IDYpOiB0aGUgYnVmZmVyLCB0aGUgZmlyc3QtdG91Y2ggYmFzZSAodGhlIG5leHRcbiAgICogYXR0ZW1wdCByZS1hbmNob3JzIG9uIGNvbW1pdHRlZCBzdGF0ZSBhcyBpdCBzdGFuZHMgTk9XKSBhbmQgdGhlIHJlYWRLZXlzIGxpc3Qg4oCUIGEgZGlzY2FyZGVkXG4gICAqIGF0dGVtcHQncyByZWFkcyBtdXN0IG5ldmVyIHJlYWNoIHRoZSBuZXh0IGF0dGVtcHQncyBgVHJhY2VFbnRyeS5yZWFkS2V5c2AsIG9yIGEgYmFja3dhcmQgc2xpY2VcbiAgICogd291bGQgZm9sbG93IGFuIGVkZ2UgdGhhdCBubyBjb21taXR0ZWQgd3JpdGUgZXZlciBoYWQuIE5vdGhpbmcgaXMgcmVjb3JkZWQuXG4gICAqL1xuICBkaXNjYXJkKCk6IHZvaWQge1xuICAgIHRoaXMucmVsZWFzZSgpO1xuICAgIHRoaXMucmVhZEtleXMgPSB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdfQ==
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Like a runtime heap with namespace isolation:
5
5
  * - A value is written at an ADDRESS — a path prefix the caller computed
6
- * (C2: the engine's frame decides it, `StageContext.ts · runAddress`) — and read
6
+ * (C2: the engine's frame decides it, `runAddress.ts · runAddress`) — and read
7
7
  * there first, then at the root
8
8
  * - Default values seed the root, and the container at an address when a
9
9
  * write creates it
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Like a runtime heap with namespace isolation:
5
5
  * - A value is written at an ADDRESS — a path prefix the caller computed
6
- * (C2: the engine's frame decides it, `StageContext.ts · runAddress`) — and read
6
+ * (C2: the engine's frame decides it, `runAddress.ts · runAddress`) — and read
7
7
  * there first, then at the root
8
8
  * - Default values seed the root, and the container at an address when a
9
9
  * write creates it
@@ -79,4 +79,4 @@ export class SharedMemory {
79
79
  this.context = nextGeneration(this.context, updates, overwrite, trace);
80
80
  }
81
81
  }
82
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2hhcmVkTWVtb3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvU2hhcmVkTWVtb3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBRUgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFdkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXJILE1BQU0sT0FBTyxZQUFZO0lBQ2YsT0FBTyxHQUEyQixFQUFFLENBQUM7SUFDckMsY0FBYyxDQUFXO0lBRWpDLFlBQVksYUFBdUIsRUFBRSxjQUF3QjtRQUMzRCxJQUFJLENBQUMsY0FBYyxHQUFHLGFBQWEsQ0FBQztRQUNwQyxNQUFNLElBQUksR0FBRyxnQkFBZ0IsQ0FBQyxjQUFjLElBQUksRUFBRSxFQUFFLGFBQWEsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN6RSx3RUFBd0U7UUFDeEUsdUVBQXVFO1FBQ3ZFLHVFQUF1RTtRQUN2RSx3RUFBd0U7UUFDeEUsbUVBQW1FO1FBQ25FLDREQUE0RDtRQUM1RCxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDN0UsQ0FBQztJQUVELDBDQUEwQztJQUMxQyxnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNoRixDQUFDO0lBRUQsMkdBQTJHO0lBQzNHLFdBQVcsQ0FBQyxPQUEwQixFQUFFLElBQWMsRUFBRSxHQUFXLEVBQUUsS0FBYztRQUNqRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbEQsaUJBQWlCLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLENBQUM7SUFFRCw0R0FBNEc7SUFDNUcsUUFBUSxDQUFDLE9BQTBCLEVBQUUsSUFBYyxFQUFFLEdBQVcsRUFBRSxLQUFjO1FBQzlFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsRCxjQUFjLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7O09BR0c7SUFDSyxXQUFXLENBQUMsT0FBMEIsRUFBRSxJQUFjLEVBQUUsR0FBVztRQUN6RSxNQUFNLEtBQUssR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzlDLE1BQU0sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsb0JBQW9CLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3pELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7T0FHRztJQUNILFFBQVEsQ0FBQyxPQUEyQixFQUFFLElBQWUsRUFBRSxHQUFZO1FBQ2pFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEdBQUcsb0JBQW9CLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDL0UsT0FBTyxPQUFPLEtBQUssS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzlGLENBQUM7SUFFRCxzR0FBc0c7SUFDdEcsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQsa0dBQWtHO0lBQ2xHLFVBQVUsQ0FBQyxTQUFzQixFQUFFLE9BQW9CLEVBQUUsS0FBbUI7UUFDMUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3pFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2hhcmVkTWVtb3J5IOKAlCBUaGUgc2hhcmVkIHN0YXRlIGNvbnRhaW5lciBmb3IgYWxsIGZsb3djaGFydCBleGVjdXRpb25cbiAqXG4gKiBMaWtlIGEgcnVudGltZSBoZWFwIHdpdGggbmFtZXNwYWNlIGlzb2xhdGlvbjpcbiAqIC0gQSB2YWx1ZSBpcyB3cml0dGVuIGF0IGFuIEFERFJFU1Mg4oCUIGEgcGF0aCBwcmVmaXggdGhlIGNhbGxlciBjb21wdXRlZFxuICogICAoQzI6IHRoZSBlbmdpbmUncyBmcmFtZSBkZWNpZGVzIGl0LCBgU3RhZ2VDb250ZXh0LnRzIMK3IHJ1bkFkZHJlc3NgKSDigJQgYW5kIHJlYWRcbiAqICAgdGhlcmUgZmlyc3QsIHRoZW4gYXQgdGhlIHJvb3RcbiAqIC0gRGVmYXVsdCB2YWx1ZXMgc2VlZCB0aGUgcm9vdCwgYW5kIHRoZSBjb250YWluZXIgYXQgYW4gYWRkcmVzcyB3aGVuIGFcbiAqICAgd3JpdGUgY3JlYXRlcyBpdFxuICogLSBBY2NlcHRzIGNvbW1pdCBidW5kbGVzIGZyb20gVHJhbnNhY3Rpb25CdWZmZXJcbiAqXG4gKiBDT1BZLU9OLVdSSVRFICg5LjI5LjAg4oCUIGRvY3MvZGVzaWduLzIwMjYtMTAtY29weS1vbi13cml0ZS1jb21taXQubWQpOlxuICogYGNvbnRleHRgIGlzIGEgR0VORVJBVElPTiwgYW5kIGEgZ2VuZXJhdGlvbiBpcyBuZXZlciBlZGl0ZWQuIEV2ZXJ5IHdyaXRlIOKAlFxuICogYGFwcGx5UGF0Y2hgIChhIHN0YWdlIGNvbW1pdCksIGBzZXRWYWx1ZWAsIGB1cGRhdGVWYWx1ZWAg4oCUIGJ1aWxkcyB0aGUgbmV4dFxuICogZ2VuZXJhdGlvbiBieSBjb3B5aW5nIHRoZSByb290IGFuZCB0aGUgY29udGFpbmVycyBvbiBlYWNoIHdyaXR0ZW4gcGF0aCxcbiAqIHNoYXJlcyBldmVyeSBvdGhlciBzdWJ0cmVlIHdpdGggdGhlIGdlbmVyYXRpb24gYmVmb3JlIGl0LCBhbmQgc3dhcHMuIFNvIGFcbiAqIGdlbmVyYXRpb24gYSBzdGFnZSBjYXB0dXJlZCAoaXRzIGZpcnN0LXRvdWNoIHZpZXcsIGl0cyB0cmFuc2FjdGlvblxuICogYnVmZmVyJ3MgZGlmZiBiYXNlKSBzdGF5cyBleGFjdGx5IHdoYXQgaXQgd2FzLCBhbmQgYSB3cml0ZSBjb3N0cyBPKHdoYXQgaXRcbiAqIHdyb3RlKSwgbm90IE8oc3RhdGUpLlxuICovXG5cbmltcG9ydCB7IG1lcmdlQ29udGV4dFdpbnMsIG93bmVkUm9vdE9mLCBvd25TcGluZSB9IGZyb20gJy4vcGF0aE9wcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeVBhdGNoLCBUcmFjZUVudHJ5IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5pbXBvcnQgeyBnZXROZXN0ZWRWYWx1ZSwgZ2V0UnVuQW5kR2xvYmFsUGF0aHMsIG5leHRHZW5lcmF0aW9uLCBzZXROZXN0ZWRWYWx1ZSwgdXBkYXRlTmVzdGVkVmFsdWUgfSBmcm9tICcuL3V0aWxzLmpzJztcblxuZXhwb3J0IGNsYXNzIFNoYXJlZE1lbW9yeSB7XG4gIHByaXZhdGUgY29udGV4dDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICBwcml2YXRlIF9kZWZhdWx0VmFsdWVzPzogdW5rbm93bjtcblxuICBjb25zdHJ1Y3RvcihkZWZhdWx0VmFsdWVzPzogdW5rbm93biwgaW5pdGlhbENvbnRleHQ/OiB1bmtub3duKSB7XG4gICAgdGhpcy5fZGVmYXVsdFZhbHVlcyA9IGRlZmF1bHRWYWx1ZXM7XG4gICAgY29uc3Qgc2VlZCA9IG1lcmdlQ29udGV4dFdpbnMoaW5pdGlhbENvbnRleHQgfHwge30sIGRlZmF1bHRWYWx1ZXMgfHwge30pO1xuICAgIC8vIERldGFjaGVkIE9OQ0UsIGhlcmU6IGBtZXJnZUNvbnRleHRXaW5zYCBjb3BpZXMgb25seSB0aGUgdG9wIGxldmVsLCBzb1xuICAgIC8vIHRoZSBzZWVkJ3MgbmVzdGVkIHZhbHVlcyBhcmUgdGhlIGNhbGxlcidzIG93biBvYmplY3RzLiBCZWZvcmUgOS4yOS4wXG4gICAgLy8gdGhlIGZpcnN0IGNvbW1pdCdzIHdob2xlLXN0YXRlIGNsb25lIGRldGFjaGVkIHRoZW0gKGFuZCB1bnRpbCB0aGVuIGFcbiAgICAvLyBjYWxsZXIgbXV0YXRpbmcgaXRzIGBpbml0aWFsQ29udGV4dGAgY2hhbmdlZCBsaXZlIHN0YXRlIHdpdGggbm8gcm93KTtcbiAgICAvLyBub3RoaW5nIHJlLWNsb25lcyB0aGUgc3RhdGUgYW55IG1vcmUsIHNvIHRoZSBzZWVkIGlzIGRldGFjaGVkIGF0XG4gICAgLy8gY29uc3RydWN0aW9uIOKAlCBvbmUgY2xvbmUgcGVyIHJ1bnRpbWUsIG5vdCBvbmUgcGVyIGNvbW1pdC5cbiAgICB0aGlzLmNvbnRleHQgPSBPYmplY3Qua2V5cyhzZWVkKS5sZW5ndGggPiAwID8gc3RydWN0dXJlZENsb25lKHNlZWQpIDogc2VlZDtcbiAgfVxuXG4gIC8qKiBHZXRzIGEgY2xvbmUgb2YgdGhlIGRlZmF1bHQgdmFsdWVzLiAqL1xuICBnZXREZWZhdWx0VmFsdWVzKCkge1xuICAgIHJldHVybiB0aGlzLl9kZWZhdWx0VmFsdWVzID8gc3RydWN0dXJlZENsb25lKHRoaXMuX2RlZmF1bHRWYWx1ZXMpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFVwZGF0ZXMgYSB2YWx1ZSBhdCBgYWRkcmVzc2AgKyBgcGF0aGAgdXNpbmcgbWVyZ2Ugc2VtYW50aWNzLCBhcyBhIG5ldyBnZW5lcmF0aW9uIChwYXRoIGNvcHkgKyBzd2FwKS4gKi9cbiAgdXBkYXRlVmFsdWUoYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sIHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5vd25lZFBhdGhUbyhhZGRyZXNzLCBwYXRoLCBrZXkpO1xuICAgIHVwZGF0ZU5lc3RlZFZhbHVlKG5leHQsIGFkZHJlc3MsIHBhdGgsIGtleSwgdmFsdWUsIHRoaXMuZ2V0RGVmYXVsdFZhbHVlcygpKTtcbiAgICB0aGlzLmNvbnRleHQgPSBuZXh0O1xuICB9XG5cbiAgLyoqIFNldHMgYSB2YWx1ZSBhdCBgYWRkcmVzc2AgKyBgcGF0aGAgdXNpbmcgb3ZlcndyaXRlIHNlbWFudGljcywgYXMgYSBuZXcgZ2VuZXJhdGlvbiAocGF0aCBjb3B5ICsgc3dhcCkuICovXG4gIHNldFZhbHVlKGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdLCBwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgY29uc3QgbmV4dCA9IHRoaXMub3duZWRQYXRoVG8oYWRkcmVzcywgcGF0aCwga2V5KTtcbiAgICBzZXROZXN0ZWRWYWx1ZShuZXh0LCBhZGRyZXNzLCBwYXRoLCBrZXksIHZhbHVlLCB0aGlzLmdldERlZmF1bHRWYWx1ZXMoKSk7XG4gICAgdGhpcy5jb250ZXh0ID0gbmV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGNvcHkgb2YgdGhlIGN1cnJlbnQgZ2VuZXJhdGlvbidzIHJvb3Qgd2hvc2UgY29udGFpbmVycyBvbiB0aGUgd2F5IHRvXG4gICAqIGBrZXlgIGFyZSBvd25lZCDigJQgdGhlIGluLXBsYWNlIGhlbHBlcnMgYWJvdmUgdGhlbiBlZGl0IG9ubHkgY29waWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBvd25lZFBhdGhUbyhhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSwgcGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XG4gICAgY29uc3Qgb3duZWQgPSBuZXcgV2Vha1NldDxvYmplY3Q+KCk7XG4gICAgY29uc3Qgcm9vdCA9IG93bmVkUm9vdE9mKHRoaXMuY29udGV4dCwgb3duZWQpO1xuICAgIGNvbnN0IHsgcnVuUGF0aCwgZ2xvYmFsUGF0aCB9ID0gZ2V0UnVuQW5kR2xvYmFsUGF0aHMoYWRkcmVzcywgcGF0aCk7XG4gICAgb3duU3BpbmUocm9vdCwgWy4uLihydW5QYXRoIHx8IGdsb2JhbFBhdGgpLCBrZXldLCBvd25lZCk7XG4gICAgcmV0dXJuIHJvb3Q7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYSB2YWx1ZSBmcm9tIHRoZSBzdG9yZS5cbiAgICogTG9va3MgdXAgYXQgYGFkZHJlc3NgIGZpcnN0LCBmYWxscyBiYWNrIHRvIHRoZSByb290LlxuICAgKi9cbiAgZ2V0VmFsdWUoYWRkcmVzcz86IHJlYWRvbmx5IHN0cmluZ1tdLCBwYXRoPzogc3RyaW5nW10sIGtleT86IHN0cmluZyk6IGFueSB7XG4gICAgY29uc3QgeyBnbG9iYWxQYXRoLCBydW5QYXRoIH0gPSBnZXRSdW5BbmRHbG9iYWxQYXRocyhhZGRyZXNzLCBwYXRoKTtcbiAgICBjb25zdCB2YWx1ZSA9IHJ1blBhdGggPyBnZXROZXN0ZWRWYWx1ZSh0aGlzLmNvbnRleHQsIHJ1blBhdGgsIGtleSkgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgPyB2YWx1ZSA6IGdldE5lc3RlZFZhbHVlKHRoaXMuY29udGV4dCwgZ2xvYmFsUGF0aCwga2V5KTtcbiAgfVxuXG4gIC8qKiBHZXRzIHRoZSBlbnRpcmUgc3RhdGUgYXMgYSBKU09OIG9iamVjdCDigJQgdGhlIGN1cnJlbnQgZ2VuZXJhdGlvbiwgYnkgcmVmZXJlbmNlLiBOZXZlciBtdXRhdGUgaXQuICovXG4gIGdldFN0YXRlKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0O1xuICB9XG5cbiAgLyoqIEFwcGxpZXMgYSBjb21taXQgYnVuZGxlIGZyb20gVHJhbnNhY3Rpb25CdWZmZXI6IGJ1aWxkcyB0aGUgbmV4dCBnZW5lcmF0aW9uIGFuZCBzd2FwcyBpdCBpbi4gKi9cbiAgYXBwbHlQYXRjaChvdmVyd3JpdGU6IE1lbW9yeVBhdGNoLCB1cGRhdGVzOiBNZW1vcnlQYXRjaCwgdHJhY2U6IFRyYWNlRW50cnlbXSk6IHZvaWQge1xuICAgIHRoaXMuY29udGV4dCA9IG5leHRHZW5lcmF0aW9uKHRoaXMuY29udGV4dCwgdXBkYXRlcywgb3ZlcndyaXRlLCB0cmFjZSk7XG4gIH1cbn1cbiJdfQ==
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2hhcmVkTWVtb3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvU2hhcmVkTWVtb3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBRUgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFdkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXJILE1BQU0sT0FBTyxZQUFZO0lBQ2YsT0FBTyxHQUEyQixFQUFFLENBQUM7SUFDckMsY0FBYyxDQUFXO0lBRWpDLFlBQVksYUFBdUIsRUFBRSxjQUF3QjtRQUMzRCxJQUFJLENBQUMsY0FBYyxHQUFHLGFBQWEsQ0FBQztRQUNwQyxNQUFNLElBQUksR0FBRyxnQkFBZ0IsQ0FBQyxjQUFjLElBQUksRUFBRSxFQUFFLGFBQWEsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN6RSx3RUFBd0U7UUFDeEUsdUVBQXVFO1FBQ3ZFLHVFQUF1RTtRQUN2RSx3RUFBd0U7UUFDeEUsbUVBQW1FO1FBQ25FLDREQUE0RDtRQUM1RCxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDN0UsQ0FBQztJQUVELDBDQUEwQztJQUMxQyxnQkFBZ0I7UUFDZCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNoRixDQUFDO0lBRUQsMkdBQTJHO0lBQzNHLFdBQVcsQ0FBQyxPQUEwQixFQUFFLElBQWMsRUFBRSxHQUFXLEVBQUUsS0FBYztRQUNqRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbEQsaUJBQWlCLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLENBQUM7SUFFRCw0R0FBNEc7SUFDNUcsUUFBUSxDQUFDLE9BQTBCLEVBQUUsSUFBYyxFQUFFLEdBQVcsRUFBRSxLQUFjO1FBQzlFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsRCxjQUFjLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7O09BR0c7SUFDSyxXQUFXLENBQUMsT0FBMEIsRUFBRSxJQUFjLEVBQUUsR0FBVztRQUN6RSxNQUFNLEtBQUssR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzlDLE1BQU0sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsb0JBQW9CLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BFLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3pELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7T0FHRztJQUNILFFBQVEsQ0FBQyxPQUEyQixFQUFFLElBQWUsRUFBRSxHQUFZO1FBQ2pFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEdBQUcsb0JBQW9CLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDL0UsT0FBTyxPQUFPLEtBQUssS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzlGLENBQUM7SUFFRCxzR0FBc0c7SUFDdEcsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQsa0dBQWtHO0lBQ2xHLFVBQVUsQ0FBQyxTQUFzQixFQUFFLE9BQW9CLEVBQUUsS0FBbUI7UUFDMUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3pFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2hhcmVkTWVtb3J5IOKAlCBUaGUgc2hhcmVkIHN0YXRlIGNvbnRhaW5lciBmb3IgYWxsIGZsb3djaGFydCBleGVjdXRpb25cbiAqXG4gKiBMaWtlIGEgcnVudGltZSBoZWFwIHdpdGggbmFtZXNwYWNlIGlzb2xhdGlvbjpcbiAqIC0gQSB2YWx1ZSBpcyB3cml0dGVuIGF0IGFuIEFERFJFU1Mg4oCUIGEgcGF0aCBwcmVmaXggdGhlIGNhbGxlciBjb21wdXRlZFxuICogICAoQzI6IHRoZSBlbmdpbmUncyBmcmFtZSBkZWNpZGVzIGl0LCBgcnVuQWRkcmVzcy50cyDCtyBydW5BZGRyZXNzYCkg4oCUIGFuZCByZWFkXG4gKiAgIHRoZXJlIGZpcnN0LCB0aGVuIGF0IHRoZSByb290XG4gKiAtIERlZmF1bHQgdmFsdWVzIHNlZWQgdGhlIHJvb3QsIGFuZCB0aGUgY29udGFpbmVyIGF0IGFuIGFkZHJlc3Mgd2hlbiBhXG4gKiAgIHdyaXRlIGNyZWF0ZXMgaXRcbiAqIC0gQWNjZXB0cyBjb21taXQgYnVuZGxlcyBmcm9tIFRyYW5zYWN0aW9uQnVmZmVyXG4gKlxuICogQ09QWS1PTi1XUklURSAoOS4yOS4wIOKAlCBkb2NzL2Rlc2lnbi8yMDI2LTEwLWNvcHktb24td3JpdGUtY29tbWl0Lm1kKTpcbiAqIGBjb250ZXh0YCBpcyBhIEdFTkVSQVRJT04sIGFuZCBhIGdlbmVyYXRpb24gaXMgbmV2ZXIgZWRpdGVkLiBFdmVyeSB3cml0ZSDigJRcbiAqIGBhcHBseVBhdGNoYCAoYSBzdGFnZSBjb21taXQpLCBgc2V0VmFsdWVgLCBgdXBkYXRlVmFsdWVgIOKAlCBidWlsZHMgdGhlIG5leHRcbiAqIGdlbmVyYXRpb24gYnkgY29weWluZyB0aGUgcm9vdCBhbmQgdGhlIGNvbnRhaW5lcnMgb24gZWFjaCB3cml0dGVuIHBhdGgsXG4gKiBzaGFyZXMgZXZlcnkgb3RoZXIgc3VidHJlZSB3aXRoIHRoZSBnZW5lcmF0aW9uIGJlZm9yZSBpdCwgYW5kIHN3YXBzLiBTbyBhXG4gKiBnZW5lcmF0aW9uIGEgc3RhZ2UgY2FwdHVyZWQgKGl0cyBmaXJzdC10b3VjaCB2aWV3LCBpdHMgdHJhbnNhY3Rpb25cbiAqIGJ1ZmZlcidzIGRpZmYgYmFzZSkgc3RheXMgZXhhY3RseSB3aGF0IGl0IHdhcywgYW5kIGEgd3JpdGUgY29zdHMgTyh3aGF0IGl0XG4gKiB3cm90ZSksIG5vdCBPKHN0YXRlKS5cbiAqL1xuXG5pbXBvcnQgeyBtZXJnZUNvbnRleHRXaW5zLCBvd25lZFJvb3RPZiwgb3duU3BpbmUgfSBmcm9tICcuL3BhdGhPcHMuanMnO1xuaW1wb3J0IHR5cGUgeyBNZW1vcnlQYXRjaCwgVHJhY2VFbnRyeSB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgZ2V0TmVzdGVkVmFsdWUsIGdldFJ1bkFuZEdsb2JhbFBhdGhzLCBuZXh0R2VuZXJhdGlvbiwgc2V0TmVzdGVkVmFsdWUsIHVwZGF0ZU5lc3RlZFZhbHVlIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbmV4cG9ydCBjbGFzcyBTaGFyZWRNZW1vcnkge1xuICBwcml2YXRlIGNvbnRleHQ6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgcHJpdmF0ZSBfZGVmYXVsdFZhbHVlcz86IHVua25vd247XG5cbiAgY29uc3RydWN0b3IoZGVmYXVsdFZhbHVlcz86IHVua25vd24sIGluaXRpYWxDb250ZXh0PzogdW5rbm93bikge1xuICAgIHRoaXMuX2RlZmF1bHRWYWx1ZXMgPSBkZWZhdWx0VmFsdWVzO1xuICAgIGNvbnN0IHNlZWQgPSBtZXJnZUNvbnRleHRXaW5zKGluaXRpYWxDb250ZXh0IHx8IHt9LCBkZWZhdWx0VmFsdWVzIHx8IHt9KTtcbiAgICAvLyBEZXRhY2hlZCBPTkNFLCBoZXJlOiBgbWVyZ2VDb250ZXh0V2luc2AgY29waWVzIG9ubHkgdGhlIHRvcCBsZXZlbCwgc29cbiAgICAvLyB0aGUgc2VlZCdzIG5lc3RlZCB2YWx1ZXMgYXJlIHRoZSBjYWxsZXIncyBvd24gb2JqZWN0cy4gQmVmb3JlIDkuMjkuMFxuICAgIC8vIHRoZSBmaXJzdCBjb21taXQncyB3aG9sZS1zdGF0ZSBjbG9uZSBkZXRhY2hlZCB0aGVtIChhbmQgdW50aWwgdGhlbiBhXG4gICAgLy8gY2FsbGVyIG11dGF0aW5nIGl0cyBgaW5pdGlhbENvbnRleHRgIGNoYW5nZWQgbGl2ZSBzdGF0ZSB3aXRoIG5vIHJvdyk7XG4gICAgLy8gbm90aGluZyByZS1jbG9uZXMgdGhlIHN0YXRlIGFueSBtb3JlLCBzbyB0aGUgc2VlZCBpcyBkZXRhY2hlZCBhdFxuICAgIC8vIGNvbnN0cnVjdGlvbiDigJQgb25lIGNsb25lIHBlciBydW50aW1lLCBub3Qgb25lIHBlciBjb21taXQuXG4gICAgdGhpcy5jb250ZXh0ID0gT2JqZWN0LmtleXMoc2VlZCkubGVuZ3RoID4gMCA/IHN0cnVjdHVyZWRDbG9uZShzZWVkKSA6IHNlZWQ7XG4gIH1cblxuICAvKiogR2V0cyBhIGNsb25lIG9mIHRoZSBkZWZhdWx0IHZhbHVlcy4gKi9cbiAgZ2V0RGVmYXVsdFZhbHVlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFZhbHVlcyA/IHN0cnVjdHVyZWRDbG9uZSh0aGlzLl9kZWZhdWx0VmFsdWVzKSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBVcGRhdGVzIGEgdmFsdWUgYXQgYGFkZHJlc3NgICsgYHBhdGhgIHVzaW5nIG1lcmdlIHNlbWFudGljcywgYXMgYSBuZXcgZ2VuZXJhdGlvbiAocGF0aCBjb3B5ICsgc3dhcCkuICovXG4gIHVwZGF0ZVZhbHVlKGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdLCBwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgY29uc3QgbmV4dCA9IHRoaXMub3duZWRQYXRoVG8oYWRkcmVzcywgcGF0aCwga2V5KTtcbiAgICB1cGRhdGVOZXN0ZWRWYWx1ZShuZXh0LCBhZGRyZXNzLCBwYXRoLCBrZXksIHZhbHVlLCB0aGlzLmdldERlZmF1bHRWYWx1ZXMoKSk7XG4gICAgdGhpcy5jb250ZXh0ID0gbmV4dDtcbiAgfVxuXG4gIC8qKiBTZXRzIGEgdmFsdWUgYXQgYGFkZHJlc3NgICsgYHBhdGhgIHVzaW5nIG92ZXJ3cml0ZSBzZW1hbnRpY3MsIGFzIGEgbmV3IGdlbmVyYXRpb24gKHBhdGggY29weSArIHN3YXApLiAqL1xuICBzZXRWYWx1ZShhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSwgcGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLm93bmVkUGF0aFRvKGFkZHJlc3MsIHBhdGgsIGtleSk7XG4gICAgc2V0TmVzdGVkVmFsdWUobmV4dCwgYWRkcmVzcywgcGF0aCwga2V5LCB2YWx1ZSwgdGhpcy5nZXREZWZhdWx0VmFsdWVzKCkpO1xuICAgIHRoaXMuY29udGV4dCA9IG5leHQ7XG4gIH1cblxuICAvKipcbiAgICogQSBjb3B5IG9mIHRoZSBjdXJyZW50IGdlbmVyYXRpb24ncyByb290IHdob3NlIGNvbnRhaW5lcnMgb24gdGhlIHdheSB0b1xuICAgKiBga2V5YCBhcmUgb3duZWQg4oCUIHRoZSBpbi1wbGFjZSBoZWxwZXJzIGFib3ZlIHRoZW4gZWRpdCBvbmx5IGNvcGllcy5cbiAgICovXG4gIHByaXZhdGUgb3duZWRQYXRoVG8oYWRkcmVzczogcmVhZG9ubHkgc3RyaW5nW10sIHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZyk6IHsgW2tleTogc3RyaW5nXTogYW55IH0ge1xuICAgIGNvbnN0IG93bmVkID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuICAgIGNvbnN0IHJvb3QgPSBvd25lZFJvb3RPZih0aGlzLmNvbnRleHQsIG93bmVkKTtcbiAgICBjb25zdCB7IHJ1blBhdGgsIGdsb2JhbFBhdGggfSA9IGdldFJ1bkFuZEdsb2JhbFBhdGhzKGFkZHJlc3MsIHBhdGgpO1xuICAgIG93blNwaW5lKHJvb3QsIFsuLi4ocnVuUGF0aCB8fCBnbG9iYWxQYXRoKSwga2V5XSwgb3duZWQpO1xuICAgIHJldHVybiByb290O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGEgdmFsdWUgZnJvbSB0aGUgc3RvcmUuXG4gICAqIExvb2tzIHVwIGF0IGBhZGRyZXNzYCBmaXJzdCwgZmFsbHMgYmFjayB0byB0aGUgcm9vdC5cbiAgICovXG4gIGdldFZhbHVlKGFkZHJlc3M/OiByZWFkb25seSBzdHJpbmdbXSwgcGF0aD86IHN0cmluZ1tdLCBrZXk/OiBzdHJpbmcpOiBhbnkge1xuICAgIGNvbnN0IHsgZ2xvYmFsUGF0aCwgcnVuUGF0aCB9ID0gZ2V0UnVuQW5kR2xvYmFsUGF0aHMoYWRkcmVzcywgcGF0aCk7XG4gICAgY29uc3QgdmFsdWUgPSBydW5QYXRoID8gZ2V0TmVzdGVkVmFsdWUodGhpcy5jb250ZXh0LCBydW5QYXRoLCBrZXkpIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnID8gdmFsdWUgOiBnZXROZXN0ZWRWYWx1ZSh0aGlzLmNvbnRleHQsIGdsb2JhbFBhdGgsIGtleSk7XG4gIH1cblxuICAvKiogR2V0cyB0aGUgZW50aXJlIHN0YXRlIGFzIGEgSlNPTiBvYmplY3Qg4oCUIHRoZSBjdXJyZW50IGdlbmVyYXRpb24sIGJ5IHJlZmVyZW5jZS4gTmV2ZXIgbXV0YXRlIGl0LiAqL1xuICBnZXRTdGF0ZSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dDtcbiAgfVxuXG4gIC8qKiBBcHBsaWVzIGEgY29tbWl0IGJ1bmRsZSBmcm9tIFRyYW5zYWN0aW9uQnVmZmVyOiBidWlsZHMgdGhlIG5leHQgZ2VuZXJhdGlvbiBhbmQgc3dhcHMgaXQgaW4uICovXG4gIGFwcGx5UGF0Y2gob3ZlcndyaXRlOiBNZW1vcnlQYXRjaCwgdXBkYXRlczogTWVtb3J5UGF0Y2gsIHRyYWNlOiBUcmFjZUVudHJ5W10pOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRleHQgPSBuZXh0R2VuZXJhdGlvbih0aGlzLmNvbnRleHQsIHVwZGF0ZXMsIG92ZXJ3cml0ZSwgdHJhY2UpO1xuICB9XG59XG4iXX0=