driftdetect-core 0.4.1 → 0.4.2

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 (237) hide show
  1. package/dist/boundaries/boundary-scanner.d.ts +76 -0
  2. package/dist/boundaries/boundary-scanner.d.ts.map +1 -0
  3. package/dist/boundaries/boundary-scanner.js +801 -0
  4. package/dist/boundaries/boundary-scanner.js.map +1 -0
  5. package/dist/boundaries/data-access-learner.d.ts +126 -0
  6. package/dist/boundaries/data-access-learner.d.ts.map +1 -0
  7. package/dist/boundaries/data-access-learner.js +486 -0
  8. package/dist/boundaries/data-access-learner.js.map +1 -0
  9. package/dist/boundaries/index.d.ts +6 -0
  10. package/dist/boundaries/index.d.ts.map +1 -1
  11. package/dist/boundaries/index.js +6 -0
  12. package/dist/boundaries/index.js.map +1 -1
  13. package/dist/boundaries/security-prioritizer.d.ts +118 -0
  14. package/dist/boundaries/security-prioritizer.d.ts.map +1 -0
  15. package/dist/boundaries/security-prioritizer.js +316 -0
  16. package/dist/boundaries/security-prioritizer.js.map +1 -0
  17. package/dist/call-graph/analysis/coverage-analyzer.d.ts +201 -0
  18. package/dist/call-graph/analysis/coverage-analyzer.d.ts.map +1 -0
  19. package/dist/call-graph/analysis/coverage-analyzer.js +553 -0
  20. package/dist/call-graph/analysis/coverage-analyzer.js.map +1 -0
  21. package/dist/call-graph/analysis/dead-code-detector.d.ts +145 -0
  22. package/dist/call-graph/analysis/dead-code-detector.d.ts.map +1 -0
  23. package/dist/call-graph/analysis/dead-code-detector.js +391 -0
  24. package/dist/call-graph/analysis/dead-code-detector.js.map +1 -0
  25. package/dist/call-graph/analysis/graph-builder.d.ts +142 -0
  26. package/dist/call-graph/analysis/graph-builder.d.ts.map +1 -0
  27. package/dist/call-graph/analysis/graph-builder.js +624 -0
  28. package/dist/call-graph/analysis/graph-builder.js.map +1 -0
  29. package/dist/call-graph/analysis/impact-analyzer.d.ts +150 -0
  30. package/dist/call-graph/analysis/impact-analyzer.d.ts.map +1 -0
  31. package/dist/call-graph/analysis/impact-analyzer.js +329 -0
  32. package/dist/call-graph/analysis/impact-analyzer.js.map +1 -0
  33. package/dist/call-graph/analysis/index.d.ts +11 -0
  34. package/dist/call-graph/analysis/index.d.ts.map +1 -0
  35. package/dist/call-graph/analysis/index.js +9 -0
  36. package/dist/call-graph/analysis/index.js.map +1 -0
  37. package/dist/call-graph/analysis/path-finder.d.ts +117 -0
  38. package/dist/call-graph/analysis/path-finder.d.ts.map +1 -0
  39. package/dist/call-graph/analysis/path-finder.js +360 -0
  40. package/dist/call-graph/analysis/path-finder.js.map +1 -0
  41. package/dist/call-graph/analysis/reachability.d.ts +56 -0
  42. package/dist/call-graph/analysis/reachability.d.ts.map +1 -0
  43. package/dist/call-graph/analysis/reachability.js +357 -0
  44. package/dist/call-graph/analysis/reachability.js.map +1 -0
  45. package/dist/call-graph/demo.d.ts +11 -0
  46. package/dist/call-graph/demo.d.ts.map +1 -0
  47. package/dist/call-graph/demo.js +339 -0
  48. package/dist/call-graph/demo.js.map +1 -0
  49. package/dist/call-graph/enrichment/enrichment-engine.d.ts +126 -0
  50. package/dist/call-graph/enrichment/enrichment-engine.d.ts.map +1 -0
  51. package/dist/call-graph/enrichment/enrichment-engine.js +760 -0
  52. package/dist/call-graph/enrichment/enrichment-engine.js.map +1 -0
  53. package/dist/call-graph/enrichment/impact-scorer.d.ts +59 -0
  54. package/dist/call-graph/enrichment/impact-scorer.d.ts.map +1 -0
  55. package/dist/call-graph/enrichment/impact-scorer.js +328 -0
  56. package/dist/call-graph/enrichment/impact-scorer.js.map +1 -0
  57. package/dist/call-graph/enrichment/index.d.ts +12 -0
  58. package/dist/call-graph/enrichment/index.d.ts.map +1 -0
  59. package/dist/call-graph/enrichment/index.js +15 -0
  60. package/dist/call-graph/enrichment/index.js.map +1 -0
  61. package/dist/call-graph/enrichment/remediation-generator.d.ts +41 -0
  62. package/dist/call-graph/enrichment/remediation-generator.d.ts.map +1 -0
  63. package/dist/call-graph/enrichment/remediation-generator.js +609 -0
  64. package/dist/call-graph/enrichment/remediation-generator.js.map +1 -0
  65. package/dist/call-graph/enrichment/sensitivity-classifier.d.ts +71 -0
  66. package/dist/call-graph/enrichment/sensitivity-classifier.d.ts.map +1 -0
  67. package/dist/call-graph/enrichment/sensitivity-classifier.js +454 -0
  68. package/dist/call-graph/enrichment/sensitivity-classifier.js.map +1 -0
  69. package/dist/call-graph/enrichment/types.d.ts +402 -0
  70. package/dist/call-graph/enrichment/types.d.ts.map +1 -0
  71. package/dist/call-graph/enrichment/types.js +9 -0
  72. package/dist/call-graph/enrichment/types.js.map +1 -0
  73. package/dist/call-graph/extractors/base-extractor.d.ts +112 -0
  74. package/dist/call-graph/extractors/base-extractor.d.ts.map +1 -0
  75. package/dist/call-graph/extractors/base-extractor.js +140 -0
  76. package/dist/call-graph/extractors/base-extractor.js.map +1 -0
  77. package/dist/call-graph/extractors/csharp-data-access-extractor.d.ts +76 -0
  78. package/dist/call-graph/extractors/csharp-data-access-extractor.d.ts.map +1 -0
  79. package/dist/call-graph/extractors/csharp-data-access-extractor.js +387 -0
  80. package/dist/call-graph/extractors/csharp-data-access-extractor.js.map +1 -0
  81. package/dist/call-graph/extractors/csharp-extractor.d.ts +87 -0
  82. package/dist/call-graph/extractors/csharp-extractor.d.ts.map +1 -0
  83. package/dist/call-graph/extractors/csharp-extractor.js +470 -0
  84. package/dist/call-graph/extractors/csharp-extractor.js.map +1 -0
  85. package/dist/call-graph/extractors/data-access-extractor.d.ts +76 -0
  86. package/dist/call-graph/extractors/data-access-extractor.d.ts.map +1 -0
  87. package/dist/call-graph/extractors/data-access-extractor.js +234 -0
  88. package/dist/call-graph/extractors/data-access-extractor.js.map +1 -0
  89. package/dist/call-graph/extractors/index.d.ts +26 -0
  90. package/dist/call-graph/extractors/index.d.ts.map +1 -0
  91. package/dist/call-graph/extractors/index.js +36 -0
  92. package/dist/call-graph/extractors/index.js.map +1 -0
  93. package/dist/call-graph/extractors/java-data-access-extractor.d.ts +101 -0
  94. package/dist/call-graph/extractors/java-data-access-extractor.d.ts.map +1 -0
  95. package/dist/call-graph/extractors/java-data-access-extractor.js +611 -0
  96. package/dist/call-graph/extractors/java-data-access-extractor.js.map +1 -0
  97. package/dist/call-graph/extractors/java-extractor.d.ts +87 -0
  98. package/dist/call-graph/extractors/java-extractor.d.ts.map +1 -0
  99. package/dist/call-graph/extractors/java-extractor.js +510 -0
  100. package/dist/call-graph/extractors/java-extractor.js.map +1 -0
  101. package/dist/call-graph/extractors/php-data-access-extractor.d.ts +93 -0
  102. package/dist/call-graph/extractors/php-data-access-extractor.d.ts.map +1 -0
  103. package/dist/call-graph/extractors/php-data-access-extractor.js +589 -0
  104. package/dist/call-graph/extractors/php-data-access-extractor.js.map +1 -0
  105. package/dist/call-graph/extractors/php-extractor.d.ts +104 -0
  106. package/dist/call-graph/extractors/php-extractor.d.ts.map +1 -0
  107. package/dist/call-graph/extractors/php-extractor.js +619 -0
  108. package/dist/call-graph/extractors/php-extractor.js.map +1 -0
  109. package/dist/call-graph/extractors/python-data-access-extractor.d.ts +90 -0
  110. package/dist/call-graph/extractors/python-data-access-extractor.d.ts.map +1 -0
  111. package/dist/call-graph/extractors/python-data-access-extractor.js +537 -0
  112. package/dist/call-graph/extractors/python-data-access-extractor.js.map +1 -0
  113. package/dist/call-graph/extractors/python-extractor.d.ts +98 -0
  114. package/dist/call-graph/extractors/python-extractor.d.ts.map +1 -0
  115. package/dist/call-graph/extractors/python-extractor.js +681 -0
  116. package/dist/call-graph/extractors/python-extractor.js.map +1 -0
  117. package/dist/call-graph/extractors/semantic-data-access-scanner.d.ts +91 -0
  118. package/dist/call-graph/extractors/semantic-data-access-scanner.d.ts.map +1 -0
  119. package/dist/call-graph/extractors/semantic-data-access-scanner.js +498 -0
  120. package/dist/call-graph/extractors/semantic-data-access-scanner.js.map +1 -0
  121. package/dist/call-graph/extractors/typescript-data-access-extractor.d.ts +122 -0
  122. package/dist/call-graph/extractors/typescript-data-access-extractor.d.ts.map +1 -0
  123. package/dist/call-graph/extractors/typescript-data-access-extractor.js +788 -0
  124. package/dist/call-graph/extractors/typescript-data-access-extractor.js.map +1 -0
  125. package/dist/call-graph/extractors/typescript-extractor.d.ts +145 -0
  126. package/dist/call-graph/extractors/typescript-extractor.d.ts.map +1 -0
  127. package/dist/call-graph/extractors/typescript-extractor.js +904 -0
  128. package/dist/call-graph/extractors/typescript-extractor.js.map +1 -0
  129. package/dist/call-graph/index.d.ts +127 -0
  130. package/dist/call-graph/index.d.ts.map +1 -0
  131. package/dist/call-graph/index.js +247 -0
  132. package/dist/call-graph/index.js.map +1 -0
  133. package/dist/call-graph/store/call-graph-store.d.ts +70 -0
  134. package/dist/call-graph/store/call-graph-store.d.ts.map +1 -0
  135. package/dist/call-graph/store/call-graph-store.js +210 -0
  136. package/dist/call-graph/store/call-graph-store.js.map +1 -0
  137. package/dist/call-graph/store/index.d.ts +7 -0
  138. package/dist/call-graph/store/index.d.ts.map +1 -0
  139. package/dist/call-graph/store/index.js +7 -0
  140. package/dist/call-graph/store/index.js.map +1 -0
  141. package/dist/call-graph/types.d.ts +376 -0
  142. package/dist/call-graph/types.d.ts.map +1 -0
  143. package/dist/call-graph/types.js +8 -0
  144. package/dist/call-graph/types.js.map +1 -0
  145. package/dist/index.d.ts +8 -0
  146. package/dist/index.d.ts.map +1 -1
  147. package/dist/index.js +12 -0
  148. package/dist/index.js.map +1 -1
  149. package/dist/lake/callgraph-shard-store.d.ts +168 -0
  150. package/dist/lake/callgraph-shard-store.d.ts.map +1 -0
  151. package/dist/lake/callgraph-shard-store.js +466 -0
  152. package/dist/lake/callgraph-shard-store.js.map +1 -0
  153. package/dist/lake/examples-store.d.ts +127 -0
  154. package/dist/lake/examples-store.d.ts.map +1 -0
  155. package/dist/lake/examples-store.js +389 -0
  156. package/dist/lake/examples-store.js.map +1 -0
  157. package/dist/lake/index-store.d.ts +82 -0
  158. package/dist/lake/index-store.d.ts.map +1 -0
  159. package/dist/lake/index-store.js +359 -0
  160. package/dist/lake/index-store.js.map +1 -0
  161. package/dist/lake/index.d.ts +93 -0
  162. package/dist/lake/index.d.ts.map +1 -0
  163. package/dist/lake/index.js +138 -0
  164. package/dist/lake/index.js.map +1 -0
  165. package/dist/lake/lake.bak/index-store.d.ts +82 -0
  166. package/dist/lake/lake.bak/index-store.d.ts.map +1 -0
  167. package/dist/lake/lake.bak/index-store.js +357 -0
  168. package/dist/lake/lake.bak/index-store.js.map +1 -0
  169. package/dist/lake/lake.bak/index.d.ts +81 -0
  170. package/dist/lake/lake.bak/index.d.ts.map +1 -0
  171. package/dist/lake/lake.bak/index.js +114 -0
  172. package/dist/lake/lake.bak/index.js.map +1 -0
  173. package/dist/lake/lake.bak/manifest-store.d.ts +51 -0
  174. package/dist/lake/lake.bak/manifest-store.d.ts.map +1 -0
  175. package/dist/lake/lake.bak/manifest-store.js +347 -0
  176. package/dist/lake/lake.bak/manifest-store.js.map +1 -0
  177. package/dist/lake/lake.bak/query-engine.d.ts +112 -0
  178. package/dist/lake/lake.bak/query-engine.d.ts.map +1 -0
  179. package/dist/lake/lake.bak/query-engine.js +370 -0
  180. package/dist/lake/lake.bak/query-engine.js.map +1 -0
  181. package/dist/lake/lake.bak/types.d.ts +428 -0
  182. package/dist/lake/lake.bak/types.d.ts.map +1 -0
  183. package/dist/lake/lake.bak/types.js +46 -0
  184. package/dist/lake/lake.bak/types.js.map +1 -0
  185. package/dist/lake/lake.bak/view-materializer.d.ts +70 -0
  186. package/dist/lake/lake.bak/view-materializer.d.ts.map +1 -0
  187. package/dist/lake/lake.bak/view-materializer.js +314 -0
  188. package/dist/lake/lake.bak/view-materializer.js.map +1 -0
  189. package/dist/lake/lake.bak/view-store.d.ts +57 -0
  190. package/dist/lake/lake.bak/view-store.d.ts.map +1 -0
  191. package/dist/lake/lake.bak/view-store.js +348 -0
  192. package/dist/lake/lake.bak/view-store.js.map +1 -0
  193. package/dist/lake/manifest-store.d.ts +51 -0
  194. package/dist/lake/manifest-store.d.ts.map +1 -0
  195. package/dist/lake/manifest-store.js +348 -0
  196. package/dist/lake/manifest-store.js.map +1 -0
  197. package/dist/lake/pattern-shard-store.d.ts +87 -0
  198. package/dist/lake/pattern-shard-store.d.ts.map +1 -0
  199. package/dist/lake/pattern-shard-store.js +347 -0
  200. package/dist/lake/pattern-shard-store.js.map +1 -0
  201. package/dist/lake/query-engine.d.ts +124 -0
  202. package/dist/lake/query-engine.d.ts.map +1 -0
  203. package/dist/lake/query-engine.js +453 -0
  204. package/dist/lake/query-engine.js.map +1 -0
  205. package/dist/lake/security-shard-store.d.ts +156 -0
  206. package/dist/lake/security-shard-store.d.ts.map +1 -0
  207. package/dist/lake/security-shard-store.js +498 -0
  208. package/dist/lake/security-shard-store.js.map +1 -0
  209. package/dist/lake/types.d.ts +428 -0
  210. package/dist/lake/types.d.ts.map +1 -0
  211. package/dist/lake/types.js +46 -0
  212. package/dist/lake/types.js.map +1 -0
  213. package/dist/lake/view-materializer.d.ts +70 -0
  214. package/dist/lake/view-materializer.d.ts.map +1 -0
  215. package/dist/lake/view-materializer.js +314 -0
  216. package/dist/lake/view-materializer.js.map +1 -0
  217. package/dist/lake/view-store.d.ts +57 -0
  218. package/dist/lake/view-store.d.ts.map +1 -0
  219. package/dist/lake/view-store.js +348 -0
  220. package/dist/lake/view-store.js.map +1 -0
  221. package/dist/parsers/tree-sitter/index.d.ts +1 -0
  222. package/dist/parsers/tree-sitter/index.d.ts.map +1 -1
  223. package/dist/parsers/tree-sitter/index.js +4 -0
  224. package/dist/parsers/tree-sitter/index.js.map +1 -1
  225. package/dist/parsers/tree-sitter/typescript-loader.d.ts +58 -0
  226. package/dist/parsers/tree-sitter/typescript-loader.d.ts.map +1 -0
  227. package/dist/parsers/tree-sitter/typescript-loader.js +250 -0
  228. package/dist/parsers/tree-sitter/typescript-loader.js.map +1 -0
  229. package/dist/store/project-config.d.ts +154 -0
  230. package/dist/store/project-config.d.ts.map +1 -0
  231. package/dist/store/project-config.js +235 -0
  232. package/dist/store/project-config.js.map +1 -0
  233. package/dist/store/project-registry.d.ts +241 -0
  234. package/dist/store/project-registry.d.ts.map +1 -0
  235. package/dist/store/project-registry.js +557 -0
  236. package/dist/store/project-registry.js.map +1 -0
  237. package/package.json +4 -2
@@ -0,0 +1,498 @@
1
+ /**
2
+ * Security Shard Store
3
+ *
4
+ * Manages sharded security/access-map storage - one file per table.
5
+ * This allows loading only the access data you need instead of the entire map.
6
+ *
7
+ * Storage structure:
8
+ * .drift/lake/security/
9
+ * ├── index.json # Security summary index
10
+ * ├── tables/
11
+ * │ ├── users.json # Access points for users table
12
+ * │ ├── orders.json # Access points for orders table
13
+ * │ └── ...
14
+ * └── sensitive.json # Sensitive field registry
15
+ *
16
+ * Key features:
17
+ * - Load access data by table (not all at once)
18
+ * - Pre-computed security summary
19
+ * - Incremental updates per table
20
+ */
21
+ import * as fs from 'node:fs/promises';
22
+ import * as path from 'node:path';
23
+ import * as crypto from 'node:crypto';
24
+ import { EventEmitter } from 'node:events';
25
+ import { LAKE_DIRS, DEFAULT_DATA_LAKE_CONFIG, } from './types.js';
26
+ // ============================================================================
27
+ // Constants
28
+ // ============================================================================
29
+ const SECURITY_SHARD_DIR = 'security';
30
+ const TABLES_SUBDIR = 'tables';
31
+ const INDEX_FILE = 'index.json';
32
+ const SENSITIVE_FILE = 'sensitive.json';
33
+ const SHARD_VERSION = '1.0.0';
34
+ // ============================================================================
35
+ // Helper Functions
36
+ // ============================================================================
37
+ async function fileExists(filePath) {
38
+ try {
39
+ await fs.access(filePath);
40
+ return true;
41
+ }
42
+ catch {
43
+ return false;
44
+ }
45
+ }
46
+ async function ensureDir(dirPath) {
47
+ await fs.mkdir(dirPath, { recursive: true });
48
+ }
49
+ function generateChecksum(data) {
50
+ const content = JSON.stringify(data);
51
+ return crypto.createHash('sha256').update(content).digest('hex').slice(0, 16);
52
+ }
53
+ function sanitizeTableName(table) {
54
+ // Convert table name to safe filename
55
+ return table.replace(/[^a-zA-Z0-9_-]/g, '_').toLowerCase();
56
+ }
57
+ // ============================================================================
58
+ // Security Shard Store Class
59
+ // ============================================================================
60
+ export class SecurityShardStore extends EventEmitter {
61
+ config;
62
+ securityDir;
63
+ tablesDir;
64
+ // In-memory cache
65
+ indexCache = null;
66
+ tableCache = new Map();
67
+ sensitiveCache = null;
68
+ constructor(config = {}) {
69
+ super();
70
+ this.config = { ...DEFAULT_DATA_LAKE_CONFIG, ...config };
71
+ this.securityDir = path.join(this.config.rootDir, LAKE_DIRS.root, LAKE_DIRS.lake, SECURITY_SHARD_DIR);
72
+ this.tablesDir = path.join(this.securityDir, TABLES_SUBDIR);
73
+ }
74
+ // ==========================================================================
75
+ // Initialization
76
+ // ==========================================================================
77
+ async initialize() {
78
+ await ensureDir(this.securityDir);
79
+ await ensureDir(this.tablesDir);
80
+ }
81
+ // ==========================================================================
82
+ // Index Operations
83
+ // ==========================================================================
84
+ /**
85
+ * Get the security index (summary of all security data)
86
+ */
87
+ async getIndex() {
88
+ if (this.indexCache) {
89
+ return this.indexCache;
90
+ }
91
+ const indexPath = path.join(this.securityDir, INDEX_FILE);
92
+ if (!(await fileExists(indexPath))) {
93
+ return null;
94
+ }
95
+ try {
96
+ const content = await fs.readFile(indexPath, 'utf-8');
97
+ this.indexCache = JSON.parse(content);
98
+ return this.indexCache;
99
+ }
100
+ catch {
101
+ return null;
102
+ }
103
+ }
104
+ /**
105
+ * Save the security index
106
+ */
107
+ async saveIndex(index) {
108
+ await ensureDir(this.securityDir);
109
+ const indexPath = path.join(this.securityDir, INDEX_FILE);
110
+ await fs.writeFile(indexPath, JSON.stringify(index, null, 2));
111
+ this.indexCache = index;
112
+ this.emit('index:saved');
113
+ }
114
+ /**
115
+ * Build security index from table shards
116
+ */
117
+ async buildIndex() {
118
+ const tables = await this.listTables();
119
+ const tableEntries = [];
120
+ const sensitiveTables = [];
121
+ const violations = [];
122
+ let totalAccessPoints = 0;
123
+ let sensitiveTablesCount = 0;
124
+ let violationCount = 0;
125
+ for (const tableName of tables) {
126
+ const shard = await this.getTableShard(tableName);
127
+ if (!shard)
128
+ continue;
129
+ const sensitiveFieldCount = shard.sensitiveFields.length;
130
+ const accessPointCount = shard.accessPoints.length;
131
+ totalAccessPoints += accessPointCount;
132
+ // Check for violations (simplified - real implementation would check rules)
133
+ const tableViolations = this.detectViolations(shard);
134
+ violations.push(...tableViolations);
135
+ violationCount += tableViolations.length;
136
+ // Build table entry, only including model if defined
137
+ const tableEntry = {
138
+ table: shard.table,
139
+ fieldCount: shard.fields.length,
140
+ sensitiveFieldCount,
141
+ accessPointCount,
142
+ hasViolations: tableViolations.length > 0,
143
+ };
144
+ if (shard.model !== undefined) {
145
+ tableEntry.model = shard.model;
146
+ }
147
+ tableEntries.push(tableEntry);
148
+ if (sensitiveFieldCount > 0) {
149
+ sensitiveTablesCount++;
150
+ sensitiveTables.push({
151
+ table: shard.table,
152
+ sensitiveFields: sensitiveFieldCount,
153
+ accessPoints: accessPointCount,
154
+ riskScore: this.calculateRiskScore(shard),
155
+ });
156
+ }
157
+ }
158
+ // Sort sensitive tables by risk
159
+ sensitiveTables.sort((a, b) => b.riskScore - a.riskScore);
160
+ // Sort violations by severity
161
+ const severityOrder = { critical: 0, warning: 1, info: 2 };
162
+ violations.sort((a, b) => severityOrder[a.severity] - severityOrder[b.severity]);
163
+ const index = {
164
+ version: SHARD_VERSION,
165
+ generatedAt: new Date().toISOString(),
166
+ summary: {
167
+ riskLevel: this.calculateOverallRisk(sensitiveTables, violationCount),
168
+ totalTables: tables.length,
169
+ sensitiveTablesCount,
170
+ totalAccessPoints,
171
+ violationCount,
172
+ },
173
+ tables: tableEntries,
174
+ topSensitiveTables: sensitiveTables.slice(0, 10),
175
+ topViolations: violations.slice(0, 10),
176
+ };
177
+ await this.saveIndex(index);
178
+ return index;
179
+ }
180
+ // ==========================================================================
181
+ // Table Shard Operations
182
+ // ==========================================================================
183
+ /**
184
+ * Get access data for a specific table
185
+ */
186
+ async getTableShard(table) {
187
+ // Check cache first
188
+ const cached = this.tableCache.get(table);
189
+ if (cached) {
190
+ return cached;
191
+ }
192
+ const filePath = path.join(this.tablesDir, `${sanitizeTableName(table)}.json`);
193
+ if (!(await fileExists(filePath))) {
194
+ return null;
195
+ }
196
+ try {
197
+ const content = await fs.readFile(filePath, 'utf-8');
198
+ const data = JSON.parse(content);
199
+ const shard = {
200
+ table: data.table,
201
+ model: data.model,
202
+ fields: data.fields,
203
+ sensitiveFields: data.sensitiveFields,
204
+ accessPoints: data.accessPoints,
205
+ };
206
+ this.tableCache.set(table, shard);
207
+ return shard;
208
+ }
209
+ catch {
210
+ return null;
211
+ }
212
+ }
213
+ /**
214
+ * Save access data for a table
215
+ */
216
+ async saveTableShard(shard) {
217
+ await ensureDir(this.tablesDir);
218
+ const filePath = path.join(this.tablesDir, `${sanitizeTableName(shard.table)}.json`);
219
+ const shardFile = {
220
+ version: SHARD_VERSION,
221
+ generatedAt: new Date().toISOString(),
222
+ checksum: generateChecksum(shard),
223
+ ...shard,
224
+ };
225
+ await fs.writeFile(filePath, JSON.stringify(shardFile, null, 2));
226
+ this.tableCache.set(shard.table, shard);
227
+ this.emit('table:saved', shard.table);
228
+ }
229
+ /**
230
+ * Get access data for multiple tables
231
+ */
232
+ async getTableShards(tables) {
233
+ const results = [];
234
+ const shards = await Promise.all(tables.map(t => this.getTableShard(t)));
235
+ for (const shard of shards) {
236
+ if (shard) {
237
+ results.push(shard);
238
+ }
239
+ }
240
+ return results;
241
+ }
242
+ /**
243
+ * List all available tables
244
+ */
245
+ async listTables() {
246
+ if (!(await fileExists(this.tablesDir))) {
247
+ return [];
248
+ }
249
+ const files = await fs.readdir(this.tablesDir);
250
+ return files
251
+ .filter(f => f.endsWith('.json'))
252
+ .map(f => f.replace('.json', ''));
253
+ }
254
+ /**
255
+ * Delete a table shard
256
+ */
257
+ async deleteTableShard(table) {
258
+ const filePath = path.join(this.tablesDir, `${sanitizeTableName(table)}.json`);
259
+ try {
260
+ await fs.unlink(filePath);
261
+ this.tableCache.delete(table);
262
+ this.emit('table:deleted', table);
263
+ }
264
+ catch {
265
+ // Ignore if doesn't exist
266
+ }
267
+ }
268
+ // ==========================================================================
269
+ // Sensitive Fields Operations
270
+ // ==========================================================================
271
+ /**
272
+ * Get the sensitive field registry
273
+ */
274
+ async getSensitiveFields() {
275
+ if (this.sensitiveCache) {
276
+ return this.sensitiveCache;
277
+ }
278
+ const filePath = path.join(this.securityDir, SENSITIVE_FILE);
279
+ if (!(await fileExists(filePath))) {
280
+ return null;
281
+ }
282
+ try {
283
+ const content = await fs.readFile(filePath, 'utf-8');
284
+ this.sensitiveCache = JSON.parse(content);
285
+ return this.sensitiveCache;
286
+ }
287
+ catch {
288
+ return null;
289
+ }
290
+ }
291
+ /**
292
+ * Save the sensitive field registry
293
+ */
294
+ async saveSensitiveFields(registry) {
295
+ await ensureDir(this.securityDir);
296
+ const filePath = path.join(this.securityDir, SENSITIVE_FILE);
297
+ await fs.writeFile(filePath, JSON.stringify(registry, null, 2));
298
+ this.sensitiveCache = registry;
299
+ this.emit('sensitive:saved');
300
+ }
301
+ /**
302
+ * Build sensitive field registry from table shards
303
+ */
304
+ async buildSensitiveRegistry() {
305
+ const tables = await this.listTables();
306
+ const fields = [];
307
+ for (const tableName of tables) {
308
+ const shard = await this.getTableShard(tableName);
309
+ if (!shard)
310
+ continue;
311
+ for (const sf of shard.sensitiveFields) {
312
+ // Count access points that touch this field
313
+ const accessCount = shard.accessPoints.filter(ap => ap.fields.includes(sf.field)).length;
314
+ fields.push({
315
+ table: shard.table,
316
+ field: sf.field,
317
+ sensitivity: sf.sensitivity,
318
+ reason: sf.reason,
319
+ accessCount,
320
+ });
321
+ }
322
+ }
323
+ // Sort by access count (most accessed first)
324
+ fields.sort((a, b) => b.accessCount - a.accessCount);
325
+ const registry = {
326
+ version: SHARD_VERSION,
327
+ generatedAt: new Date().toISOString(),
328
+ fields,
329
+ };
330
+ await this.saveSensitiveFields(registry);
331
+ return registry;
332
+ }
333
+ // ==========================================================================
334
+ // Query Helpers
335
+ // ==========================================================================
336
+ /**
337
+ * Get access points for a specific file
338
+ */
339
+ async getAccessPointsByFile(file) {
340
+ const tables = await this.listTables();
341
+ const results = [];
342
+ for (const tableName of tables) {
343
+ const shard = await this.getTableShard(tableName);
344
+ if (!shard)
345
+ continue;
346
+ const fileAccessPoints = shard.accessPoints.filter(ap => ap.file === file);
347
+ results.push(...fileAccessPoints);
348
+ }
349
+ return results;
350
+ }
351
+ /**
352
+ * Get all access points for sensitive fields
353
+ */
354
+ async getSensitiveAccessPoints() {
355
+ const tables = await this.listTables();
356
+ const results = [];
357
+ for (const tableName of tables) {
358
+ const shard = await this.getTableShard(tableName);
359
+ if (!shard || shard.sensitiveFields.length === 0)
360
+ continue;
361
+ const sensitiveFieldNames = new Set(shard.sensitiveFields.map(sf => sf.field));
362
+ const sensitivityMap = new Map(shard.sensitiveFields.map(sf => [sf.field, sf.sensitivity]));
363
+ for (const ap of shard.accessPoints) {
364
+ const sensitiveFieldsAccessed = ap.fields.filter(f => sensitiveFieldNames.has(f));
365
+ if (sensitiveFieldsAccessed.length > 0) {
366
+ const firstField = sensitiveFieldsAccessed[0];
367
+ const sensitivity = firstField !== undefined ? sensitivityMap.get(firstField) : undefined;
368
+ results.push({
369
+ ...ap,
370
+ table: shard.table,
371
+ sensitivity: sensitivity ?? 'custom',
372
+ });
373
+ }
374
+ }
375
+ }
376
+ return results;
377
+ }
378
+ // ==========================================================================
379
+ // Cache Management
380
+ // ==========================================================================
381
+ /**
382
+ * Invalidate all caches
383
+ */
384
+ invalidateCache(table) {
385
+ if (table) {
386
+ this.tableCache.delete(table);
387
+ }
388
+ else {
389
+ this.indexCache = null;
390
+ this.tableCache.clear();
391
+ this.sensitiveCache = null;
392
+ }
393
+ }
394
+ /**
395
+ * Get cache stats
396
+ */
397
+ getCacheStats() {
398
+ return {
399
+ cachedTables: this.tableCache.size,
400
+ hasIndex: this.indexCache !== null,
401
+ hasSensitive: this.sensitiveCache !== null,
402
+ };
403
+ }
404
+ // ==========================================================================
405
+ // Conversion Helpers
406
+ // ==========================================================================
407
+ /**
408
+ * Convert security index to SecuritySummaryView
409
+ */
410
+ indexToSummaryView(index) {
411
+ return {
412
+ generatedAt: index.generatedAt,
413
+ riskLevel: index.summary.riskLevel,
414
+ summary: {
415
+ totalTables: index.summary.totalTables,
416
+ sensitiveTablesCount: index.summary.sensitiveTablesCount,
417
+ totalAccessPoints: index.summary.totalAccessPoints,
418
+ violationCount: index.summary.violationCount,
419
+ },
420
+ topSensitiveTables: index.topSensitiveTables.map(t => ({
421
+ table: t.table,
422
+ sensitiveFields: t.sensitiveFields,
423
+ accessPoints: t.accessPoints,
424
+ riskScore: t.riskScore,
425
+ })),
426
+ topViolations: index.topViolations.map(v => ({
427
+ id: v.id,
428
+ severity: v.severity,
429
+ message: v.message,
430
+ file: v.file,
431
+ table: v.table,
432
+ })),
433
+ recentChanges: [], // Would need history tracking
434
+ };
435
+ }
436
+ // ==========================================================================
437
+ // Private Helpers
438
+ // ==========================================================================
439
+ detectViolations(shard) {
440
+ const violations = [];
441
+ // Simple violation detection - real implementation would use boundary rules
442
+ for (const ap of shard.accessPoints) {
443
+ const sensitiveFieldNames = new Set(shard.sensitiveFields.map(sf => sf.field));
444
+ const sensitiveAccessed = ap.fields.filter(f => sensitiveFieldNames.has(f));
445
+ // Flag low-confidence access to sensitive fields
446
+ if (sensitiveAccessed.length > 0 && ap.confidence < 0.7) {
447
+ violations.push({
448
+ id: `${shard.table}-${ap.id}-low-confidence`,
449
+ severity: 'warning',
450
+ message: `Low confidence access to sensitive field(s): ${sensitiveAccessed.join(', ')}`,
451
+ file: ap.file,
452
+ table: shard.table,
453
+ line: ap.line,
454
+ });
455
+ }
456
+ }
457
+ return violations;
458
+ }
459
+ calculateRiskScore(shard) {
460
+ // Risk score based on:
461
+ // - Number of sensitive fields
462
+ // - Number of access points
463
+ // - Types of sensitivity
464
+ const sensitiveWeight = {
465
+ pii: 3,
466
+ financial: 4,
467
+ auth: 5,
468
+ health: 4,
469
+ custom: 2,
470
+ };
471
+ let score = 0;
472
+ for (const sf of shard.sensitiveFields) {
473
+ score += sensitiveWeight[sf.sensitivity] ?? 2;
474
+ }
475
+ // Factor in access point count
476
+ score *= Math.log10(shard.accessPoints.length + 1) + 1;
477
+ return Math.round(score * 10) / 10;
478
+ }
479
+ calculateOverallRisk(sensitiveTables, violationCount) {
480
+ if (violationCount > 10 || sensitiveTables.some(t => t.riskScore > 50)) {
481
+ return 'critical';
482
+ }
483
+ if (violationCount > 5 || sensitiveTables.some(t => t.riskScore > 30)) {
484
+ return 'high';
485
+ }
486
+ if (violationCount > 0 || sensitiveTables.some(t => t.riskScore > 15)) {
487
+ return 'medium';
488
+ }
489
+ return 'low';
490
+ }
491
+ }
492
+ // ============================================================================
493
+ // Factory Function
494
+ // ============================================================================
495
+ export function createSecurityShardStore(config = {}) {
496
+ return new SecurityShardStore(config);
497
+ }
498
+ //# sourceMappingURL=security-shard-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-shard-store.js","sourceRoot":"","sources":["../../src/lake/security-shard-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAS3C,OAAO,EACL,SAAS,EACT,wBAAwB,GACzB,MAAM,YAAY,CAAC;AAEpB,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E,MAAM,kBAAkB,GAAG,UAAU,CAAC;AACtC,MAAM,aAAa,GAAG,QAAQ,CAAC;AAC/B,MAAM,UAAU,GAAG,YAAY,CAAC;AAChC,MAAM,cAAc,GAAG,gBAAgB,CAAC;AACxC,MAAM,aAAa,GAAG,OAAO,CAAC;AA4D9B,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,KAAK,UAAU,UAAU,CAAC,QAAgB;IACxC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,OAAe;IACtC,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAa;IACrC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa;IACtC,sCAAsC;IACtC,OAAO,KAAK,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;AAC7D,CAAC;AAED,+EAA+E;AAC/E,6BAA6B;AAC7B,+EAA+E;AAE/E,MAAM,OAAO,kBAAmB,SAAQ,YAAY;IACjC,MAAM,CAAiB;IACvB,WAAW,CAAS;IACpB,SAAS,CAAS;IAEnC,kBAAkB;IACV,UAAU,GAAyB,IAAI,CAAC;IACxC,UAAU,GAAgC,IAAI,GAAG,EAAE,CAAC;IACpD,cAAc,GAAkC,IAAI,CAAC;IAE7D,YAAY,SAAkC,EAAE;QAC9C,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,wBAAwB,EAAE,GAAG,MAAM,EAAE,CAAC;QACzD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAC1B,IAAI,CAAC,MAAM,CAAC,OAAO,EACnB,SAAS,CAAC,IAAI,EACd,SAAS,CAAC,IAAI,EACd,kBAAkB,CACnB,CAAC;QACF,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAC9D,CAAC;IAED,6EAA6E;IAC7E,iBAAiB;IACjB,6EAA6E;IAE7E,KAAK,CAAC,UAAU;QACd,MAAM,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAClC,MAAM,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;IAED,6EAA6E;IAC7E,mBAAmB;IACnB,6EAA6E;IAE7E;;OAEG;IACH,KAAK,CAAC,QAAQ;QACZ,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC,UAAU,CAAC;QACzB,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAC1D,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACtD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACtC,OAAO,IAAI,CAAC,UAAU,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,KAAoB;QAClC,MAAM,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAElC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAC1D,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAE9D,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACvC,MAAM,YAAY,GAAsB,EAAE,CAAC;QAC3C,MAAM,eAAe,GAA0B,EAAE,CAAC;QAClD,MAAM,UAAU,GAAqB,EAAE,CAAC;QAExC,IAAI,iBAAiB,GAAG,CAAC,CAAC;QAC1B,IAAI,oBAAoB,GAAG,CAAC,CAAC;QAC7B,IAAI,cAAc,GAAG,CAAC,CAAC;QAEvB,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YAClD,IAAI,CAAC,KAAK;gBAAE,SAAS;YAErB,MAAM,mBAAmB,GAAG,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC;YACzD,MAAM,gBAAgB,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC;YACnD,iBAAiB,IAAI,gBAAgB,CAAC;YAEtC,4EAA4E;YAC5E,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;YACrD,UAAU,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,CAAC;YACpC,cAAc,IAAI,eAAe,CAAC,MAAM,CAAC;YAEzC,qDAAqD;YACrD,MAAM,UAAU,GAAoB;gBAClC,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM;gBAC/B,mBAAmB;gBACnB,gBAAgB;gBAChB,aAAa,EAAE,eAAe,CAAC,MAAM,GAAG,CAAC;aAC1C,CAAC;YACF,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC9B,UAAU,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YACjC,CAAC;YACD,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAE9B,IAAI,mBAAmB,GAAG,CAAC,EAAE,CAAC;gBAC5B,oBAAoB,EAAE,CAAC;gBACvB,eAAe,CAAC,IAAI,CAAC;oBACnB,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,eAAe,EAAE,mBAAmB;oBACpC,YAAY,EAAE,gBAAgB;oBAC9B,SAAS,EAAE,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;iBAC1C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,gCAAgC;QAChC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;QAE1D,8BAA8B;QAC9B,MAAM,aAAa,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC3D,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEjF,MAAM,KAAK,GAAkB;YAC3B,OAAO,EAAE,aAAa;YACtB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACrC,OAAO,EAAE;gBACP,SAAS,EAAE,IAAI,CAAC,oBAAoB,CAAC,eAAe,EAAE,cAAc,CAAC;gBACrE,WAAW,EAAE,MAAM,CAAC,MAAM;gBAC1B,oBAAoB;gBACpB,iBAAiB;gBACjB,cAAc;aACf;YACD,MAAM,EAAE,YAAY;YACpB,kBAAkB,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;YAChD,aAAa,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;SACvC,CAAC;QAEF,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC5B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,6EAA6E;IAC7E,yBAAyB;IACzB,6EAA6E;IAE7E;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,KAAa;QAC/B,oBAAoB;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/E,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACrD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACjC,MAAM,KAAK,GAAmB;gBAC5B,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,YAAY,EAAE,IAAI,CAAC,YAAY;aAChC,CAAC;YAEF,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAClC,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,KAAqB;QACxC,MAAM,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAEhC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrF,MAAM,SAAS,GAAG;YAChB,OAAO,EAAE,aAAa;YACtB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACrC,QAAQ,EAAE,gBAAgB,CAAC,KAAK,CAAC;YACjC,GAAG,KAAK;SACT,CAAC;QAEF,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAExC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,MAAgB;QACnC,MAAM,OAAO,GAAqB,EAAE,CAAC;QAErC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CACvC,CAAC;QAEF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;YACxC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/C,OAAO,KAAK;aACT,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;aAChC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,KAAa;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAE/E,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9B,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;QAC5B,CAAC;IACH,CAAC;IAED,6EAA6E;IAC7E,8BAA8B;IAC9B,6EAA6E;IAE7E;;OAEG;IACH,KAAK,CAAC,kBAAkB;QACtB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,cAAc,CAAC;QAC7B,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAC7D,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACrD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC1C,OAAO,IAAI,CAAC,cAAc,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CAAC,QAAgC;QACxD,MAAM,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAElC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAC7D,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAEhE,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,sBAAsB;QAC1B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACvC,MAAM,MAAM,GAA2B,EAAE,CAAC;QAE1C,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YAClD,IAAI,CAAC,KAAK;gBAAE,SAAS;YAErB,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;gBACvC,4CAA4C;gBAC5C,MAAM,WAAW,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAC3C,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,CACnC,CAAC,MAAM,CAAC;gBAET,MAAM,CAAC,IAAI,CAAC;oBACV,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,KAAK,EAAE,EAAE,CAAC,KAAK;oBACf,WAAW,EAAE,EAAE,CAAC,WAAW;oBAC3B,MAAM,EAAE,EAAE,CAAC,MAAM;oBACjB,WAAW;iBACZ,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,6CAA6C;QAC7C,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC;QAErD,MAAM,QAAQ,GAA2B;YACvC,OAAO,EAAE,aAAa;YACtB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACrC,MAAM;SACP,CAAC;QAEF,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QACzC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,6EAA6E;IAC7E,gBAAgB;IAChB,6EAA6E;IAE7E;;OAEG;IACH,KAAK,CAAC,qBAAqB,CAAC,IAAY;QACtC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACvC,MAAM,OAAO,GAAuB,EAAE,CAAC;QAEvC,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YAClD,IAAI,CAAC,KAAK;gBAAE,SAAS;YAErB,MAAM,gBAAgB,GAAG,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YAC3E,OAAO,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,CAAC;QACpC,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,wBAAwB;QAC5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACvC,MAAM,OAAO,GAAqE,EAAE,CAAC;QAErF,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YAClD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,eAAe,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAE3D,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/E,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YAE5F,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;gBACpC,MAAM,uBAAuB,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClF,IAAI,uBAAuB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvC,MAAM,UAAU,GAAG,uBAAuB,CAAC,CAAC,CAAC,CAAC;oBAC9C,MAAM,WAAW,GAAG,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;oBAC1F,OAAO,CAAC,IAAI,CAAC;wBACX,GAAG,EAAE;wBACL,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB,WAAW,EAAE,WAAW,IAAI,QAAQ;qBACrC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,6EAA6E;IAC7E,mBAAmB;IACnB,6EAA6E;IAE7E;;OAEG;IACH,eAAe,CAAC,KAAc;QAC5B,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACxB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO;YACL,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI;YAClC,QAAQ,EAAE,IAAI,CAAC,UAAU,KAAK,IAAI;YAClC,YAAY,EAAE,IAAI,CAAC,cAAc,KAAK,IAAI;SAC3C,CAAC;IACJ,CAAC;IAED,6EAA6E;IAC7E,qBAAqB;IACrB,6EAA6E;IAE7E;;OAEG;IACH,kBAAkB,CAAC,KAAoB;QACrC,OAAO;YACL,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS;YAClC,OAAO,EAAE;gBACP,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,WAAW;gBACtC,oBAAoB,EAAE,KAAK,CAAC,OAAO,CAAC,oBAAoB;gBACxD,iBAAiB,EAAE,KAAK,CAAC,OAAO,CAAC,iBAAiB;gBAClD,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,cAAc;aAC7C;YACD,kBAAkB,EAAE,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACrD,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,eAAe,EAAE,CAAC,CAAC,eAAe;gBAClC,YAAY,EAAE,CAAC,CAAC,YAAY;gBAC5B,SAAS,EAAE,CAAC,CAAC,SAAS;aACvB,CAAC,CAAC;YACH,aAAa,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC3C,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,KAAK,EAAE,CAAC,CAAC,KAAK;aACf,CAAC,CAAC;YACH,aAAa,EAAE,EAAE,EAAE,8BAA8B;SAClD,CAAC;IACJ,CAAC;IAED,6EAA6E;IAC7E,kBAAkB;IAClB,6EAA6E;IAErE,gBAAgB,CAAC,KAAqB;QAC5C,MAAM,UAAU,GAAqB,EAAE,CAAC;QAExC,4EAA4E;QAC5E,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;YACpC,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/E,MAAM,iBAAiB,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAE5E,iDAAiD;YACjD,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC;gBACxD,UAAU,CAAC,IAAI,CAAC;oBACd,EAAE,EAAE,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,iBAAiB;oBAC5C,QAAQ,EAAE,SAAS;oBACnB,OAAO,EAAE,gDAAgD,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;oBACvF,IAAI,EAAE,EAAE,CAAC,IAAI;oBACb,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,IAAI,EAAE,EAAE,CAAC,IAAI;iBACd,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAEO,kBAAkB,CAAC,KAAqB;QAC9C,uBAAuB;QACvB,+BAA+B;QAC/B,4BAA4B;QAC5B,yBAAyB;QAEzB,MAAM,eAAe,GAA2B;YAC9C,GAAG,EAAE,CAAC;YACN,SAAS,EAAE,CAAC;YACZ,IAAI,EAAE,CAAC;YACP,MAAM,EAAE,CAAC;YACT,MAAM,EAAE,CAAC;SACV,CAAC;QAEF,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;YACvC,KAAK,IAAI,eAAe,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAChD,CAAC;QAED,+BAA+B;QAC/B,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAEvD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;IACrC,CAAC;IAEO,oBAAoB,CAC1B,eAAsC,EACtC,cAAsB;QAEtB,IAAI,cAAc,GAAG,EAAE,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,EAAE,CAAC;YACvE,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,IAAI,cAAc,GAAG,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,EAAE,CAAC;YACtE,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,IAAI,cAAc,GAAG,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,EAAE,CAAC,EAAE,CAAC;YACtE,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAED,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,MAAM,UAAU,wBAAwB,CAAC,SAAkC,EAAE;IAC3E,OAAO,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACxC,CAAC"}