usertrust 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/dist/audit/canonical.d.ts +7 -0
  2. package/dist/audit/canonical.d.ts.map +1 -0
  3. package/dist/audit/canonical.js +24 -0
  4. package/dist/audit/canonical.js.map +1 -0
  5. package/dist/audit/chain.d.ts +33 -0
  6. package/dist/audit/chain.d.ts.map +1 -0
  7. package/dist/audit/chain.js +285 -0
  8. package/dist/audit/chain.js.map +1 -0
  9. package/dist/audit/entropy.d.ts +95 -0
  10. package/dist/audit/entropy.d.ts.map +1 -0
  11. package/dist/audit/entropy.js +229 -0
  12. package/dist/audit/entropy.js.map +1 -0
  13. package/dist/audit/merkle.d.ts +87 -0
  14. package/dist/audit/merkle.d.ts.map +1 -0
  15. package/dist/audit/merkle.js +315 -0
  16. package/dist/audit/merkle.js.map +1 -0
  17. package/dist/audit/rotation.d.ts +61 -0
  18. package/dist/audit/rotation.d.ts.map +1 -0
  19. package/dist/audit/rotation.js +160 -0
  20. package/dist/audit/rotation.js.map +1 -0
  21. package/dist/audit/verify.d.ts +20 -0
  22. package/dist/audit/verify.d.ts.map +1 -0
  23. package/dist/audit/verify.js +73 -0
  24. package/dist/audit/verify.js.map +1 -0
  25. package/dist/board/board.d.ts +67 -0
  26. package/dist/board/board.d.ts.map +1 -0
  27. package/dist/board/board.js +191 -0
  28. package/dist/board/board.js.map +1 -0
  29. package/dist/board/concerns.d.ts +59 -0
  30. package/dist/board/concerns.d.ts.map +1 -0
  31. package/dist/board/concerns.js +149 -0
  32. package/dist/board/concerns.js.map +1 -0
  33. package/dist/board/director.d.ts +49 -0
  34. package/dist/board/director.d.ts.map +1 -0
  35. package/dist/board/director.js +127 -0
  36. package/dist/board/director.js.map +1 -0
  37. package/dist/cli/health.d.ts +8 -0
  38. package/dist/cli/health.d.ts.map +1 -0
  39. package/dist/cli/health.js +119 -0
  40. package/dist/cli/health.js.map +1 -0
  41. package/dist/cli/init.d.ts +8 -0
  42. package/dist/cli/init.d.ts.map +1 -0
  43. package/dist/cli/init.js +67 -0
  44. package/dist/cli/init.js.map +1 -0
  45. package/dist/cli/inspect.d.ts +8 -0
  46. package/dist/cli/inspect.d.ts.map +1 -0
  47. package/dist/cli/inspect.js +114 -0
  48. package/dist/cli/inspect.js.map +1 -0
  49. package/dist/cli/main.d.ts +3 -0
  50. package/dist/cli/main.d.ts.map +1 -0
  51. package/dist/cli/main.js +35 -0
  52. package/dist/cli/main.js.map +1 -0
  53. package/dist/cli/snapshot.d.ts +10 -0
  54. package/dist/cli/snapshot.d.ts.map +1 -0
  55. package/dist/cli/snapshot.js +61 -0
  56. package/dist/cli/snapshot.js.map +1 -0
  57. package/dist/cli/tb.d.ts +8 -0
  58. package/dist/cli/tb.d.ts.map +1 -0
  59. package/dist/cli/tb.js +43 -0
  60. package/dist/cli/tb.js.map +1 -0
  61. package/dist/cli/verify.d.ts +7 -0
  62. package/dist/cli/verify.d.ts.map +1 -0
  63. package/dist/cli/verify.js +32 -0
  64. package/dist/cli/verify.js.map +1 -0
  65. package/dist/config.d.ts +12 -0
  66. package/dist/config.d.ts.map +1 -0
  67. package/dist/config.js +34 -0
  68. package/dist/config.js.map +1 -0
  69. package/dist/detect.d.ts +18 -0
  70. package/dist/detect.d.ts.map +1 -0
  71. package/dist/detect.js +49 -0
  72. package/dist/detect.js.map +1 -0
  73. package/dist/govern.d.ts +75 -0
  74. package/dist/govern.d.ts.map +1 -0
  75. package/dist/govern.js +581 -0
  76. package/dist/govern.js.map +1 -0
  77. package/dist/index.d.ts +6 -0
  78. package/dist/index.d.ts.map +1 -0
  79. package/dist/index.js +8 -0
  80. package/dist/index.js.map +1 -0
  81. package/dist/ledger/client.d.ts +89 -0
  82. package/dist/ledger/client.d.ts.map +1 -0
  83. package/dist/ledger/client.js +417 -0
  84. package/dist/ledger/client.js.map +1 -0
  85. package/dist/ledger/engine.d.ts +68 -0
  86. package/dist/ledger/engine.d.ts.map +1 -0
  87. package/dist/ledger/engine.js +142 -0
  88. package/dist/ledger/engine.js.map +1 -0
  89. package/dist/ledger/pricing.d.ts +35 -0
  90. package/dist/ledger/pricing.d.ts.map +1 -0
  91. package/dist/ledger/pricing.js +142 -0
  92. package/dist/ledger/pricing.js.map +1 -0
  93. package/dist/memory/patterns.d.ts +35 -0
  94. package/dist/memory/patterns.d.ts.map +1 -0
  95. package/dist/memory/patterns.js +152 -0
  96. package/dist/memory/patterns.js.map +1 -0
  97. package/dist/policy/decay.d.ts +95 -0
  98. package/dist/policy/decay.d.ts.map +1 -0
  99. package/dist/policy/decay.js +133 -0
  100. package/dist/policy/decay.js.map +1 -0
  101. package/dist/policy/default-rules.d.ts +21 -0
  102. package/dist/policy/default-rules.d.ts.map +1 -0
  103. package/dist/policy/default-rules.js +60 -0
  104. package/dist/policy/default-rules.js.map +1 -0
  105. package/dist/policy/gate.d.ts +116 -0
  106. package/dist/policy/gate.d.ts.map +1 -0
  107. package/dist/policy/gate.js +227 -0
  108. package/dist/policy/gate.js.map +1 -0
  109. package/dist/policy/pii.d.ts +28 -0
  110. package/dist/policy/pii.d.ts.map +1 -0
  111. package/dist/policy/pii.js +124 -0
  112. package/dist/policy/pii.js.map +1 -0
  113. package/dist/proxy.d.ts +33 -0
  114. package/dist/proxy.d.ts.map +1 -0
  115. package/dist/proxy.js +36 -0
  116. package/dist/proxy.js.map +1 -0
  117. package/dist/resilience/circuit.d.ts +87 -0
  118. package/dist/resilience/circuit.d.ts.map +1 -0
  119. package/dist/resilience/circuit.js +167 -0
  120. package/dist/resilience/circuit.js.map +1 -0
  121. package/dist/resilience/scope.d.ts +97 -0
  122. package/dist/resilience/scope.d.ts.map +1 -0
  123. package/dist/resilience/scope.js +244 -0
  124. package/dist/resilience/scope.js.map +1 -0
  125. package/dist/shared/constants.d.ts +7 -0
  126. package/dist/shared/constants.d.ts.map +1 -0
  127. package/dist/shared/constants.js +7 -0
  128. package/dist/shared/constants.js.map +1 -0
  129. package/dist/shared/errors.d.ts +31 -0
  130. package/dist/shared/errors.d.ts.map +1 -0
  131. package/dist/shared/errors.js +61 -0
  132. package/dist/shared/errors.js.map +1 -0
  133. package/dist/shared/ids.d.ts +7 -0
  134. package/dist/shared/ids.d.ts.map +1 -0
  135. package/dist/shared/ids.js +31 -0
  136. package/dist/shared/ids.js.map +1 -0
  137. package/dist/shared/types.d.ts +162 -0
  138. package/dist/shared/types.d.ts.map +1 -0
  139. package/dist/shared/types.js +41 -0
  140. package/dist/shared/types.js.map +1 -0
  141. package/dist/snapshot/checkpoint.d.ts +22 -0
  142. package/dist/snapshot/checkpoint.d.ts.map +1 -0
  143. package/dist/snapshot/checkpoint.js +172 -0
  144. package/dist/snapshot/checkpoint.js.map +1 -0
  145. package/dist/streaming.d.ts +44 -0
  146. package/dist/streaming.d.ts.map +1 -0
  147. package/dist/streaming.js +123 -0
  148. package/dist/streaming.js.map +1 -0
  149. package/package.json +54 -0
@@ -0,0 +1,229 @@
1
+ /**
2
+ * Entropy Diagnostics — Governance Health Signal
3
+ *
4
+ * Derives 6 entropy signals from audit event data to assess governance
5
+ * health. Entropy is a diagnostic signal, not a runtime gate.
6
+ *
7
+ * Signals:
8
+ * 1. Policy violations
9
+ * 2. Budget utilization
10
+ * 3. Chain integrity
11
+ * 4. PII detections
12
+ * 5. Circuit breaker trips
13
+ * 6. Pattern memory hits
14
+ *
15
+ * Returns a composite score 0–100 (0 = healthy, 100 = maximum entropy).
16
+ *
17
+ * Adapted from Field Project fermion/neutrino/entropy.ts — signals
18
+ * remapped to SDK vault structure.
19
+ */
20
+ // ── Signal extractors ──
21
+ /**
22
+ * Signal 1: Policy violations
23
+ *
24
+ * Events where kind contains "policy" and data indicates a deny/block decision.
25
+ */
26
+ export function extractPolicyViolations(events) {
27
+ const policyEvents = events.filter((e) => e.kind.includes("policy"));
28
+ let hits = 0;
29
+ for (const e of policyEvents) {
30
+ const decision = e.data.decision;
31
+ if (decision === "deny" || decision === "block" || decision === "blocked") {
32
+ hits++;
33
+ }
34
+ }
35
+ const total = policyEvents.length;
36
+ return {
37
+ condition: "policy_violations",
38
+ label: "Policy violations",
39
+ value: total > 0 ? hits / total : 0,
40
+ hits,
41
+ total,
42
+ };
43
+ }
44
+ /**
45
+ * Signal 2: Budget utilization
46
+ *
47
+ * Events with budget data where utilization exceeds 80%.
48
+ */
49
+ export function extractBudgetUtilization(events) {
50
+ let hits = 0;
51
+ let total = 0;
52
+ for (const e of events) {
53
+ const budget = e.data.budget;
54
+ const spent = e.data.spent;
55
+ const remaining = e.data.budgetRemaining;
56
+ const budgetTotal = e.data.budgetTotal;
57
+ if (typeof budget === "number" && typeof spent === "number" && budget > 0) {
58
+ total++;
59
+ if (spent / budget > 0.8) {
60
+ hits++;
61
+ }
62
+ }
63
+ else if (typeof remaining === "number" &&
64
+ typeof budgetTotal === "number" &&
65
+ budgetTotal > 0) {
66
+ total++;
67
+ if ((budgetTotal - remaining) / budgetTotal > 0.8) {
68
+ hits++;
69
+ }
70
+ }
71
+ }
72
+ return {
73
+ condition: "budget_utilization",
74
+ label: "Budget utilization (>80%)",
75
+ value: total > 0 ? hits / total : 0,
76
+ hits,
77
+ total,
78
+ };
79
+ }
80
+ /**
81
+ * Signal 3: Chain integrity
82
+ *
83
+ * Events indicating hash chain verification failures or audit degradation.
84
+ */
85
+ export function extractChainIntegrity(events) {
86
+ let hits = 0;
87
+ let total = 0;
88
+ for (const e of events) {
89
+ if (e.kind.includes("audit") || e.kind.includes("chain") || e.kind.includes("verify")) {
90
+ total++;
91
+ const valid = e.data.valid;
92
+ const degraded = e.data.degraded;
93
+ const errors = e.data.errors;
94
+ if (valid === false || degraded === true || (Array.isArray(errors) && errors.length > 0)) {
95
+ hits++;
96
+ }
97
+ }
98
+ }
99
+ return {
100
+ condition: "chain_integrity",
101
+ label: "Chain integrity failures",
102
+ value: total > 0 ? hits / total : 0,
103
+ hits,
104
+ total,
105
+ };
106
+ }
107
+ /**
108
+ * Signal 4: PII detections
109
+ *
110
+ * Events where PII was detected in the data flow.
111
+ */
112
+ export function extractPiiDetections(events) {
113
+ let hits = 0;
114
+ const total = events.length;
115
+ for (const e of events) {
116
+ const pii = e.data.piiDetected;
117
+ const piiCount = e.data.piiCount;
118
+ const piiAction = e.data.piiAction;
119
+ if (pii === true ||
120
+ (typeof piiCount === "number" && piiCount > 0) ||
121
+ piiAction === "redact" ||
122
+ piiAction === "block") {
123
+ hits++;
124
+ }
125
+ }
126
+ return {
127
+ condition: "pii_detections",
128
+ label: "PII detections",
129
+ value: total > 0 ? hits / total : 0,
130
+ hits,
131
+ total,
132
+ };
133
+ }
134
+ /**
135
+ * Signal 5: Circuit breaker trips
136
+ *
137
+ * Events where circuit breakers were triggered.
138
+ */
139
+ export function extractCircuitBreakerTrips(events) {
140
+ let hits = 0;
141
+ let total = 0;
142
+ for (const e of events) {
143
+ if (e.kind.includes("circuit") ||
144
+ e.kind.includes("breaker") ||
145
+ e.data.circuitBreaker !== undefined) {
146
+ total++;
147
+ const state = e.data.circuitBreakerState ?? e.data.state;
148
+ const tripped = e.data.circuitBreakerTripped ?? e.data.tripped;
149
+ if (state === "open" || state === "half-open" || tripped === true) {
150
+ hits++;
151
+ }
152
+ }
153
+ }
154
+ return {
155
+ condition: "circuit_breaker_trips",
156
+ label: "Circuit breaker trips",
157
+ value: total > 0 ? hits / total : 0,
158
+ hits,
159
+ total,
160
+ };
161
+ }
162
+ /**
163
+ * Signal 6: Pattern memory hits
164
+ *
165
+ * Events where pattern memory detected recurring issues or anomalies.
166
+ */
167
+ export function extractPatternMemoryHits(events) {
168
+ let hits = 0;
169
+ let total = 0;
170
+ for (const e of events) {
171
+ if (e.kind.includes("pattern") ||
172
+ e.kind.includes("memory") ||
173
+ e.data.patternMatch !== undefined) {
174
+ total++;
175
+ const match = e.data.patternMatch;
176
+ const anomaly = e.data.anomalyDetected;
177
+ const recurring = e.data.recurringIssue;
178
+ if (match === true || anomaly === true || recurring === true) {
179
+ hits++;
180
+ }
181
+ }
182
+ }
183
+ return {
184
+ condition: "pattern_memory_hits",
185
+ label: "Pattern memory hits",
186
+ value: total > 0 ? hits / total : 0,
187
+ hits,
188
+ total,
189
+ };
190
+ }
191
+ // ── Composite ──
192
+ const EXTRACTORS = [
193
+ extractPolicyViolations,
194
+ extractBudgetUtilization,
195
+ extractChainIntegrity,
196
+ extractPiiDetections,
197
+ extractCircuitBreakerTrips,
198
+ extractPatternMemoryHits,
199
+ ];
200
+ function classifyLevel(score) {
201
+ if (score >= 60)
202
+ return "critical";
203
+ if (score >= 30)
204
+ return "elevated";
205
+ return "low";
206
+ }
207
+ /**
208
+ * Compute the composite entropy report from audit events.
209
+ *
210
+ * Each of the 6 signals contributes equally (weight = 1/6).
211
+ * The composite score is 0–100.
212
+ *
213
+ * @param events - Array of audit events to analyze
214
+ * @returns Entropy report with composite score and per-signal breakdown
215
+ */
216
+ export function computeEntropyScore(events) {
217
+ const signals = EXTRACTORS.map((fn) => fn(events));
218
+ const sum = signals.reduce((acc, s) => acc + s.value, 0);
219
+ const rawScore = signals.length > 0 ? sum / signals.length : 0;
220
+ const score = Math.round(rawScore * 100);
221
+ return {
222
+ score,
223
+ level: classifyLevel(score),
224
+ signals,
225
+ computedAt: new Date().toISOString(),
226
+ eventCount: events.length,
227
+ };
228
+ }
229
+ //# sourceMappingURL=entropy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entropy.js","sourceRoot":"","sources":["../../src/audit/entropy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Merkle Tree — RFC 6962 domain-separated hashing
3
+ *
4
+ * Pure functions for building, proving, and verifying Merkle trees.
5
+ * No I/O, no side effects. All hash fields are hex-encoded strings.
6
+ *
7
+ * Domain-separated hashing (RFC 6962 Section 2.1):
8
+ * - Leaves: SHA-256(0x00 || data)
9
+ * - Internal: SHA-256(0x01 || left || right)
10
+ *
11
+ * Odd leaves are promoted to the next layer (NOT duplicated),
12
+ * avoiding CVE-2012-2459.
13
+ *
14
+ * Merged from usertools-stealth merkle-tree.ts + merkle-proofs.ts.
15
+ */
16
+ export interface MerkleSibling {
17
+ readonly hash: string;
18
+ readonly position: "left" | "right";
19
+ }
20
+ export interface MerkleInclusionProof {
21
+ readonly version: 1;
22
+ readonly leafHash: string;
23
+ readonly leafIndex: number;
24
+ readonly treeSize: number;
25
+ readonly root: string;
26
+ readonly siblings: readonly MerkleSibling[];
27
+ readonly segmentId: string;
28
+ }
29
+ export interface MerkleConsistencyProof {
30
+ readonly firstSize: number;
31
+ readonly secondSize: number;
32
+ readonly firstRoot: string;
33
+ readonly secondRoot: string;
34
+ readonly proof: readonly string[];
35
+ }
36
+ /**
37
+ * Hash a leaf node with domain separation.
38
+ * Input: hex-encoded data string.
39
+ * Output: hex-encoded SHA-256 hash.
40
+ */
41
+ export declare function hashLeaf(data: string): string;
42
+ /**
43
+ * Hash an internal node with domain separation.
44
+ * Inputs: two hex-encoded child hashes.
45
+ * Output: hex-encoded SHA-256 hash.
46
+ */
47
+ export declare function hashInternal(left: string, right: string): string;
48
+ /**
49
+ * Build a complete Merkle tree from an array of leaf hashes.
50
+ *
51
+ * Returns all layers (layer 0 = hashed leaves, last layer = [root]).
52
+ * Empty input returns { root: undefined, layers: [[]] }.
53
+ *
54
+ * Odd-count layers: the last node is promoted (not duplicated).
55
+ */
56
+ export declare function buildMerkleTree(leaves: string[]): {
57
+ root: string | undefined;
58
+ layers: string[][];
59
+ };
60
+ /**
61
+ * Generate an inclusion proof for a specific leaf in a Merkle tree.
62
+ *
63
+ * Builds the tree from the provided leaves, then walks from the target leaf
64
+ * up to the root, collecting sibling hashes at each level.
65
+ */
66
+ export declare function generateInclusionProof(leafIndex: number, leaves: string[], segmentId: string): MerkleInclusionProof;
67
+ /**
68
+ * Verify an inclusion proof against a published root and tree size.
69
+ *
70
+ * Pure function — no I/O, only crypto.createHash.
71
+ */
72
+ export declare function verifyInclusionProof(proof: MerkleInclusionProof, publishedRoot: string, publishedTreeSize: number): boolean;
73
+ /**
74
+ * Generate a consistency proof between two tree sizes.
75
+ *
76
+ * Proves that tree(firstSize) is a prefix of tree(secondSize) — i.e.,
77
+ * the tree is append-only.
78
+ */
79
+ export declare function generateConsistencyProof(firstSize: number, secondSize: number, leaves: string[]): MerkleConsistencyProof;
80
+ /**
81
+ * Verify a consistency proof.
82
+ *
83
+ * Recomputes the second root from the first root and proof nodes,
84
+ * verifying that tree(firstSize) is a prefix of tree(secondSize).
85
+ */
86
+ export declare function verifyConsistencyProof(proof: MerkleConsistencyProof): boolean;
87
+ //# sourceMappingURL=merkle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merkle.d.ts","sourceRoot":"","sources":["../../src/audit/merkle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAWH,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;CACpC;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAID;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG7C;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAQhE;AAID;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG;IAClD,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;CACnB,CAwBA;AAID;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACrC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EAAE,EAChB,SAAS,EAAE,MAAM,GACf,oBAAoB,CAiDtB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CACnC,KAAK,EAAE,oBAAoB,EAC3B,aAAa,EAAE,MAAM,EACrB,iBAAiB,EAAE,MAAM,GACvB,OAAO,CAoBT;AA4DD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACvC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EAAE,GACd,sBAAsB,CAgCxB;AAgFD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAqB7E"}
@@ -0,0 +1,315 @@
1
+ /**
2
+ * Merkle Tree — RFC 6962 domain-separated hashing
3
+ *
4
+ * Pure functions for building, proving, and verifying Merkle trees.
5
+ * No I/O, no side effects. All hash fields are hex-encoded strings.
6
+ *
7
+ * Domain-separated hashing (RFC 6962 Section 2.1):
8
+ * - Leaves: SHA-256(0x00 || data)
9
+ * - Internal: SHA-256(0x01 || left || right)
10
+ *
11
+ * Odd leaves are promoted to the next layer (NOT duplicated),
12
+ * avoiding CVE-2012-2459.
13
+ *
14
+ * Merged from usertools-stealth merkle-tree.ts + merkle-proofs.ts.
15
+ */
16
+ import { createHash } from "node:crypto";
17
+ // ── Constants ──
18
+ const LEAF_PREFIX = Buffer.from([0x00]);
19
+ const INTERNAL_PREFIX = Buffer.from([0x01]);
20
+ // ── Core hash functions ──
21
+ /**
22
+ * Hash a leaf node with domain separation.
23
+ * Input: hex-encoded data string.
24
+ * Output: hex-encoded SHA-256 hash.
25
+ */
26
+ export function hashLeaf(data) {
27
+ const dataBuffer = Buffer.from(data, "hex");
28
+ return createHash("sha256").update(LEAF_PREFIX).update(dataBuffer).digest("hex");
29
+ }
30
+ /**
31
+ * Hash an internal node with domain separation.
32
+ * Inputs: two hex-encoded child hashes.
33
+ * Output: hex-encoded SHA-256 hash.
34
+ */
35
+ export function hashInternal(left, right) {
36
+ const leftBuffer = Buffer.from(left, "hex");
37
+ const rightBuffer = Buffer.from(right, "hex");
38
+ return createHash("sha256")
39
+ .update(INTERNAL_PREFIX)
40
+ .update(leftBuffer)
41
+ .update(rightBuffer)
42
+ .digest("hex");
43
+ }
44
+ // ── Tree building ──
45
+ /**
46
+ * Build a complete Merkle tree from an array of leaf hashes.
47
+ *
48
+ * Returns all layers (layer 0 = hashed leaves, last layer = [root]).
49
+ * Empty input returns { root: undefined, layers: [[]] }.
50
+ *
51
+ * Odd-count layers: the last node is promoted (not duplicated).
52
+ */
53
+ export function buildMerkleTree(leaves) {
54
+ if (leaves.length === 0) {
55
+ return { root: undefined, layers: [[]] };
56
+ }
57
+ let currentLayer = leaves.map((leaf) => hashLeaf(leaf));
58
+ const layers = [currentLayer];
59
+ while (currentLayer.length > 1) {
60
+ const nextLayer = [];
61
+ for (let i = 0; i < currentLayer.length; i += 2) {
62
+ const left = currentLayer[i];
63
+ if (i + 1 < currentLayer.length) {
64
+ const right = currentLayer[i + 1];
65
+ nextLayer.push(hashInternal(left, right));
66
+ }
67
+ else {
68
+ nextLayer.push(left);
69
+ }
70
+ }
71
+ currentLayer = nextLayer;
72
+ layers.push(currentLayer);
73
+ }
74
+ return { root: currentLayer[0], layers };
75
+ }
76
+ // ── Inclusion proofs ──
77
+ /**
78
+ * Generate an inclusion proof for a specific leaf in a Merkle tree.
79
+ *
80
+ * Builds the tree from the provided leaves, then walks from the target leaf
81
+ * up to the root, collecting sibling hashes at each level.
82
+ */
83
+ export function generateInclusionProof(leafIndex, leaves, segmentId) {
84
+ if (leafIndex < 0 || leafIndex >= leaves.length) {
85
+ throw new RangeError(`leafIndex ${leafIndex} out of bounds for ${leaves.length} leaves`);
86
+ }
87
+ const { root, layers } = buildMerkleTree(leaves);
88
+ if (root === undefined) {
89
+ throw new Error("Cannot generate proof for empty tree");
90
+ }
91
+ const siblings = [];
92
+ let currentIndex = leafIndex;
93
+ for (let level = 0; level < layers.length - 1; level++) {
94
+ const layer = layers[level];
95
+ const layerSize = layer.length;
96
+ if (currentIndex === layerSize - 1 && layerSize % 2 === 1) {
97
+ currentIndex = Math.floor(currentIndex / 2);
98
+ continue;
99
+ }
100
+ if (currentIndex % 2 === 0) {
101
+ siblings.push({
102
+ hash: layer[currentIndex + 1],
103
+ position: "right",
104
+ });
105
+ }
106
+ else {
107
+ siblings.push({
108
+ hash: layer[currentIndex - 1],
109
+ position: "left",
110
+ });
111
+ }
112
+ currentIndex = Math.floor(currentIndex / 2);
113
+ }
114
+ const leafHash = leaves[leafIndex];
115
+ return {
116
+ version: 1,
117
+ leafHash,
118
+ leafIndex,
119
+ treeSize: leaves.length,
120
+ root,
121
+ segmentId,
122
+ siblings,
123
+ };
124
+ }
125
+ /**
126
+ * Verify an inclusion proof against a published root and tree size.
127
+ *
128
+ * Pure function — no I/O, only crypto.createHash.
129
+ */
130
+ export function verifyInclusionProof(proof, publishedRoot, publishedTreeSize) {
131
+ if (proof.treeSize !== publishedTreeSize) {
132
+ return false;
133
+ }
134
+ if (proof.root !== publishedRoot) {
135
+ return false;
136
+ }
137
+ let currentHash = hashLeaf(proof.leafHash);
138
+ for (const sibling of proof.siblings) {
139
+ if (sibling.position === "left") {
140
+ currentHash = hashInternal(sibling.hash, currentHash);
141
+ }
142
+ else {
143
+ currentHash = hashInternal(currentHash, sibling.hash);
144
+ }
145
+ }
146
+ return currentHash === proof.root;
147
+ }
148
+ // ── Consistency proofs ──
149
+ /**
150
+ * Find the largest power of 2 strictly less than n.
151
+ */
152
+ function largestPowerOf2LessThan(n) {
153
+ if (n <= 1)
154
+ return 0;
155
+ let k = 1;
156
+ while (k * 2 < n) {
157
+ k *= 2;
158
+ }
159
+ return k;
160
+ }
161
+ /**
162
+ * Check if n is a power of 2.
163
+ */
164
+ function isPowerOf2(n) {
165
+ return n > 0 && (n & (n - 1)) === 0;
166
+ }
167
+ /**
168
+ * Recursive consistency proof generation.
169
+ */
170
+ function subproof(m, n, leaves, proof, startFromOld) {
171
+ if (m === n) {
172
+ if (!startFromOld) {
173
+ const { root } = buildMerkleTree(leaves.slice(0, n));
174
+ if (root !== undefined) {
175
+ proof.push(root);
176
+ }
177
+ }
178
+ return;
179
+ }
180
+ const k = largestPowerOf2LessThan(n);
181
+ if (m <= k) {
182
+ subproof(m, k, leaves, proof, startFromOld);
183
+ const { root } = buildMerkleTree(leaves.slice(k, n));
184
+ if (root !== undefined) {
185
+ proof.push(root);
186
+ }
187
+ }
188
+ else {
189
+ subproof(m - k, n - k, leaves.slice(k), proof, false);
190
+ const { root } = buildMerkleTree(leaves.slice(0, k));
191
+ if (root !== undefined) {
192
+ proof.push(root);
193
+ }
194
+ }
195
+ }
196
+ /**
197
+ * Generate a consistency proof between two tree sizes.
198
+ *
199
+ * Proves that tree(firstSize) is a prefix of tree(secondSize) — i.e.,
200
+ * the tree is append-only.
201
+ */
202
+ export function generateConsistencyProof(firstSize, secondSize, leaves) {
203
+ if (firstSize < 1 || firstSize > secondSize) {
204
+ throw new RangeError(`Invalid sizes: firstSize=${firstSize}, secondSize=${secondSize}`);
205
+ }
206
+ if (secondSize > leaves.length) {
207
+ throw new RangeError(`secondSize ${secondSize} exceeds available leaves ${leaves.length}`);
208
+ }
209
+ const firstTree = buildMerkleTree(leaves.slice(0, firstSize));
210
+ const secondTree = buildMerkleTree(leaves.slice(0, secondSize));
211
+ if (firstSize === secondSize) {
212
+ return {
213
+ firstSize,
214
+ secondSize,
215
+ firstRoot: firstTree.root,
216
+ secondRoot: secondTree.root,
217
+ proof: [],
218
+ };
219
+ }
220
+ const proof = [];
221
+ const secondLeaves = leaves.slice(0, secondSize);
222
+ subproof(firstSize, secondSize, secondLeaves, proof, true);
223
+ return {
224
+ firstSize,
225
+ secondSize,
226
+ firstRoot: firstTree.root,
227
+ secondRoot: secondTree.root,
228
+ proof,
229
+ };
230
+ }
231
+ /**
232
+ * Recompute both roots from the consistency proof path.
233
+ */
234
+ function recomputeRoots(firstSize, secondSize, proofNodes, claimedFirstRoot) {
235
+ let idx = 0;
236
+ function consume() {
237
+ if (idx >= proofNodes.length)
238
+ return undefined;
239
+ return proofNodes[idx++];
240
+ }
241
+ const stack = [];
242
+ function collect(m, n, isOld) {
243
+ if (m === n) {
244
+ if (!isOld) {
245
+ const node = consume();
246
+ if (node !== undefined) {
247
+ stack.push({ hash: node, side: "both" });
248
+ }
249
+ }
250
+ return;
251
+ }
252
+ const k = largestPowerOf2LessThan(n);
253
+ if (m <= k) {
254
+ collect(m, k, isOld);
255
+ const node = consume();
256
+ if (node !== undefined) {
257
+ stack.push({ hash: node, side: "right" });
258
+ }
259
+ }
260
+ else {
261
+ collect(m - k, n - k, false);
262
+ const node = consume();
263
+ if (node !== undefined) {
264
+ stack.push({ hash: node, side: "left" });
265
+ }
266
+ }
267
+ }
268
+ collect(firstSize, secondSize, true);
269
+ if (stack.length === 0)
270
+ return { firstRoot: "", secondRoot: "" };
271
+ let fr;
272
+ let sr;
273
+ let startIdx;
274
+ if (isPowerOf2(firstSize)) {
275
+ fr = claimedFirstRoot;
276
+ sr = claimedFirstRoot;
277
+ startIdx = 0;
278
+ }
279
+ else {
280
+ fr = stack[0].hash;
281
+ sr = stack[0].hash;
282
+ startIdx = 1;
283
+ }
284
+ for (let i = startIdx; i < stack.length; i++) {
285
+ const entry = stack[i];
286
+ if (entry.side === "right") {
287
+ sr = hashInternal(sr, entry.hash);
288
+ }
289
+ else {
290
+ fr = hashInternal(entry.hash, fr);
291
+ sr = hashInternal(entry.hash, sr);
292
+ }
293
+ }
294
+ return { firstRoot: fr, secondRoot: sr };
295
+ }
296
+ /**
297
+ * Verify a consistency proof.
298
+ *
299
+ * Recomputes the second root from the first root and proof nodes,
300
+ * verifying that tree(firstSize) is a prefix of tree(secondSize).
301
+ */
302
+ export function verifyConsistencyProof(proof) {
303
+ if (proof.firstSize < 1 || proof.firstSize > proof.secondSize) {
304
+ return false;
305
+ }
306
+ if (proof.firstSize === proof.secondSize) {
307
+ return proof.proof.length === 0 && proof.firstRoot === proof.secondRoot;
308
+ }
309
+ if (proof.proof.length === 0) {
310
+ return false;
311
+ }
312
+ const { firstRoot, secondRoot } = recomputeRoots(proof.firstSize, proof.secondSize, proof.proof, proof.firstRoot);
313
+ return firstRoot === proof.firstRoot && secondRoot === proof.secondRoot;
314
+ }
315
+ //# sourceMappingURL=merkle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merkle.js","sourceRoot":"","sources":["../../src/audit/merkle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,kBAAkB;AAElB,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACxC,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AA2B5C,4BAA4B;AAE5B;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY;IACpC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAClF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,KAAa;IACvD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC9C,OAAO,UAAU,CAAC,QAAQ,CAAC;SACzB,MAAM,CAAC,eAAe,CAAC;SACvB,MAAM,CAAC,UAAU,CAAC;SAClB,MAAM,CAAC,WAAW,CAAC;SACnB,MAAM,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC;AAED,sBAAsB;AAEtB;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,MAAgB;IAI/C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAC1C,CAAC;IAED,IAAI,YAAY,GAAa,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAClE,MAAM,MAAM,GAAe,CAAC,YAAY,CAAC,CAAC;IAE1C,OAAO,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChC,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAW,CAAC;YACvC,IAAI,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC;gBACjC,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,GAAG,CAAC,CAAW,CAAC;gBAC5C,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACP,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,CAAC;QACF,CAAC;QACD,YAAY,GAAG,SAAS,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;AAC1C,CAAC;AAED,yBAAyB;AAEzB;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CACrC,SAAiB,EACjB,MAAgB,EAChB,SAAiB;IAEjB,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QACjD,MAAM,IAAI,UAAU,CAAC,aAAa,SAAS,sBAAsB,MAAM,CAAC,MAAM,SAAS,CAAC,CAAC;IAC1F,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAEjD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,IAAI,YAAY,GAAG,SAAS,CAAC;IAE7B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QACxD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAa,CAAC;QACxC,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC;QAE/B,IAAI,YAAY,KAAK,SAAS,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3D,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;YAC5C,SAAS;QACV,CAAC;QAED,IAAI,YAAY,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,QAAQ,CAAC,IAAI,CAAC;gBACb,IAAI,EAAE,KAAK,CAAC,YAAY,GAAG,CAAC,CAAW;gBACvC,QAAQ,EAAE,OAAO;aACjB,CAAC,CAAC;QACJ,CAAC;aAAM,CAAC;YACP,QAAQ,CAAC,IAAI,CAAC;gBACb,IAAI,EAAE,KAAK,CAAC,YAAY,GAAG,CAAC,CAAW;gBACvC,QAAQ,EAAE,MAAM;aAChB,CAAC,CAAC;QACJ,CAAC;QAED,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAW,CAAC;IAE7C,OAAO;QACN,OAAO,EAAE,CAAC;QACV,QAAQ;QACR,SAAS;QACT,QAAQ,EAAE,MAAM,CAAC,MAAM;QACvB,IAAI;QACJ,SAAS;QACT,QAAQ;KACR,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CACnC,KAA2B,EAC3B,aAAqB,EACrB,iBAAyB;IAEzB,IAAI,KAAK,CAAC,QAAQ,KAAK,iBAAiB,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAC;IACd,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QAClC,OAAO,KAAK,CAAC;IACd,CAAC;IAED,IAAI,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAE3C,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACtC,IAAI,OAAO,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;YACjC,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACP,WAAW,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACvD,CAAC;IACF,CAAC;IAED,OAAO,WAAW,KAAK,KAAK,CAAC,IAAI,CAAC;AACnC,CAAC;AAED,2BAA2B;AAE3B;;GAEG;AACH,SAAS,uBAAuB,CAAC,CAAS;IACzC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IACrB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAClB,CAAC,IAAI,CAAC,CAAC;IACR,CAAC;IACD,OAAO,CAAC,CAAC;AACV,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,SAAS,QAAQ,CAChB,CAAS,EACT,CAAS,EACT,MAAgB,EAChB,KAAe,EACf,YAAqB;IAErB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACb,IAAI,CAAC,YAAY,EAAE,CAAC;YACnB,MAAM,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACrD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC;QACF,CAAC;QACD,OAAO;IACR,CAAC;IAED,MAAM,CAAC,GAAG,uBAAuB,CAAC,CAAC,CAAC,CAAC;IAErC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACZ,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;QAC5C,MAAM,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACrD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;IACF,CAAC;SAAM,CAAC;QACP,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACtD,MAAM,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACrD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;IACF,CAAC;AACF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CACvC,SAAiB,EACjB,UAAkB,EAClB,MAAgB;IAEhB,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,GAAG,UAAU,EAAE,CAAC;QAC7C,MAAM,IAAI,UAAU,CAAC,4BAA4B,SAAS,gBAAgB,UAAU,EAAE,CAAC,CAAC;IACzF,CAAC;IACD,IAAI,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QAChC,MAAM,IAAI,UAAU,CAAC,cAAc,UAAU,6BAA6B,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;IAEhE,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;QAC9B,OAAO;YACN,SAAS;YACT,UAAU;YACV,SAAS,EAAE,SAAS,CAAC,IAAc;YACnC,UAAU,EAAE,UAAU,CAAC,IAAc;YACrC,KAAK,EAAE,EAAE;SACT,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IACjD,QAAQ,CAAC,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAE3D,OAAO;QACN,SAAS;QACT,UAAU;QACV,SAAS,EAAE,SAAS,CAAC,IAAc;QACnC,UAAU,EAAE,UAAU,CAAC,IAAc;QACrC,KAAK;KACL,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CACtB,SAAiB,EACjB,UAAkB,EAClB,UAA6B,EAC7B,gBAAwB;IAExB,IAAI,GAAG,GAAG,CAAC,CAAC;IAEZ,SAAS,OAAO;QACf,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QAC/C,OAAO,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC;IAC1B,CAAC;IAGD,MAAM,KAAK,GAAiB,EAAE,CAAC;IAE/B,SAAS,OAAO,CAAC,CAAS,EAAE,CAAS,EAAE,KAAc;QACpD,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,EAAE,CAAC;gBACZ,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;gBACvB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;oBACxB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC1C,CAAC;YACF,CAAC;YACD,OAAO;QACR,CAAC;QAED,MAAM,CAAC,GAAG,uBAAuB,CAAC,CAAC,CAAC,CAAC;QAErC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACZ,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;YACrB,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;YACvB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YAC3C,CAAC;QACF,CAAC;aAAM,CAAC;YACP,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;YAC7B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;YACvB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YAC1C,CAAC;QACF,CAAC;IACF,CAAC;IAED,OAAO,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IAErC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IAEjE,IAAI,EAAU,CAAC;IACf,IAAI,EAAU,CAAC;IACf,IAAI,QAAgB,CAAC;IAErB,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,EAAE,GAAG,gBAAgB,CAAC;QACtB,EAAE,GAAG,gBAAgB,CAAC;QACtB,QAAQ,GAAG,CAAC,CAAC;IACd,CAAC;SAAM,CAAC;QACP,EAAE,GAAI,KAAK,CAAC,CAAC,CAAgB,CAAC,IAAI,CAAC;QACnC,EAAE,GAAI,KAAK,CAAC,CAAC,CAAgB,CAAC,IAAI,CAAC;QACnC,QAAQ,GAAG,CAAC,CAAC;IACd,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAe,CAAC;QACrC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5B,EAAE,GAAG,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;aAAM,CAAC;YACP,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAClC,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACnC,CAAC;IACF,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;AAC1C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAA6B;IACnE,IAAI,KAAK,CAAC,SAAS,GAAG,CAAC,IAAI,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;QAC/D,OAAO,KAAK,CAAC;IACd,CAAC;IAED,IAAI,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,UAAU,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,UAAU,CAAC;IACzE,CAAC;IAED,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACd,CAAC;IAED,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,cAAc,CAC/C,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,SAAS,CACf,CAAC;IAEF,OAAO,SAAS,KAAK,KAAK,CAAC,SAAS,IAAI,UAAU,KAAK,KAAK,CAAC,UAAU,CAAC;AACzE,CAAC"}