skannr 0.1.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 (142) hide show
  1. package/.eslintrc.js +22 -0
  2. package/README.md +109 -0
  3. package/dist/agent-cli.d.ts +7 -0
  4. package/dist/agent-cli.d.ts.map +1 -0
  5. package/dist/agent-cli.js +364 -0
  6. package/dist/agent-cli.js.map +1 -0
  7. package/dist/agent.d.ts +115 -0
  8. package/dist/agent.d.ts.map +1 -0
  9. package/dist/agent.js +340 -0
  10. package/dist/agent.js.map +1 -0
  11. package/dist/benchmark.d.ts +53 -0
  12. package/dist/benchmark.d.ts.map +1 -0
  13. package/dist/benchmark.js +307 -0
  14. package/dist/benchmark.js.map +1 -0
  15. package/dist/cache.d.ts +97 -0
  16. package/dist/cache.d.ts.map +1 -0
  17. package/dist/cache.js +284 -0
  18. package/dist/cache.js.map +1 -0
  19. package/dist/cli.d.ts +6 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +238 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/config.d.ts +8 -0
  24. package/dist/config.d.ts.map +1 -0
  25. package/dist/config.js +52 -0
  26. package/dist/config.js.map +1 -0
  27. package/dist/index.d.ts +18 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +176 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/languages/GenericAdapter.d.ts +10 -0
  32. package/dist/languages/GenericAdapter.d.ts.map +1 -0
  33. package/dist/languages/GenericAdapter.js +41 -0
  34. package/dist/languages/GenericAdapter.js.map +1 -0
  35. package/dist/languages/LanguageAdapter.d.ts +14 -0
  36. package/dist/languages/LanguageAdapter.d.ts.map +1 -0
  37. package/dist/languages/LanguageAdapter.js +3 -0
  38. package/dist/languages/LanguageAdapter.js.map +1 -0
  39. package/dist/languages/PythonAdapter.d.ts +10 -0
  40. package/dist/languages/PythonAdapter.d.ts.map +1 -0
  41. package/dist/languages/PythonAdapter.js +98 -0
  42. package/dist/languages/PythonAdapter.js.map +1 -0
  43. package/dist/languages/TypeScriptAdapter.d.ts +17 -0
  44. package/dist/languages/TypeScriptAdapter.d.ts.map +1 -0
  45. package/dist/languages/TypeScriptAdapter.js +321 -0
  46. package/dist/languages/TypeScriptAdapter.js.map +1 -0
  47. package/dist/languages/registry.d.ts +4 -0
  48. package/dist/languages/registry.d.ts.map +1 -0
  49. package/dist/languages/registry.js +86 -0
  50. package/dist/languages/registry.js.map +1 -0
  51. package/dist/mapper.d.ts +49 -0
  52. package/dist/mapper.d.ts.map +1 -0
  53. package/dist/mapper.js +386 -0
  54. package/dist/mapper.js.map +1 -0
  55. package/dist/ranker-enhanced.d.ts +37 -0
  56. package/dist/ranker-enhanced.d.ts.map +1 -0
  57. package/dist/ranker-enhanced.js +395 -0
  58. package/dist/ranker-enhanced.js.map +1 -0
  59. package/dist/ranker.d.ts +14 -0
  60. package/dist/ranker.d.ts.map +1 -0
  61. package/dist/ranker.js +105 -0
  62. package/dist/ranker.js.map +1 -0
  63. package/dist/rocket-chat-scope.d.ts +7 -0
  64. package/dist/rocket-chat-scope.d.ts.map +1 -0
  65. package/dist/rocket-chat-scope.js +95 -0
  66. package/dist/rocket-chat-scope.js.map +1 -0
  67. package/dist/scanner.d.ts +16 -0
  68. package/dist/scanner.d.ts.map +1 -0
  69. package/dist/scanner.js +228 -0
  70. package/dist/scanner.js.map +1 -0
  71. package/dist/skeletonizer.d.ts +5 -0
  72. package/dist/skeletonizer.d.ts.map +1 -0
  73. package/dist/skeletonizer.js +52 -0
  74. package/dist/skeletonizer.js.map +1 -0
  75. package/dist/tokenizer.d.ts +9 -0
  76. package/dist/tokenizer.d.ts.map +1 -0
  77. package/dist/tokenizer.js +21 -0
  78. package/dist/tokenizer.js.map +1 -0
  79. package/dist/types.d.ts +68 -0
  80. package/dist/types.d.ts.map +1 -0
  81. package/dist/types.js +6 -0
  82. package/dist/types.js.map +1 -0
  83. package/gemini-extension/GEMINI.md +26 -0
  84. package/gemini-extension/gemini-extension.json +12 -0
  85. package/gemini-extension/package.json +14 -0
  86. package/gemini-extension/src/server.ts +63 -0
  87. package/gemini-extension/tsconfig.json +14 -0
  88. package/jest.config.js +5 -0
  89. package/package.json +46 -0
  90. package/src/agent-cli.ts +383 -0
  91. package/src/agent.ts +344 -0
  92. package/src/benchmark.ts +389 -0
  93. package/src/cache.ts +317 -0
  94. package/src/cli.ts +223 -0
  95. package/src/config.ts +22 -0
  96. package/src/index.ts +215 -0
  97. package/src/languages/GenericAdapter.ts +44 -0
  98. package/src/languages/LanguageAdapter.ts +14 -0
  99. package/src/languages/PythonAdapter.ts +74 -0
  100. package/src/languages/TypeScriptAdapter.ts +338 -0
  101. package/src/languages/registry.ts +49 -0
  102. package/src/mapper.ts +448 -0
  103. package/src/ranker-enhanced.ts +460 -0
  104. package/src/ranker.ts +92 -0
  105. package/src/scanner.ts +201 -0
  106. package/src/skeletonizer.ts +16 -0
  107. package/src/tokenizer.ts +20 -0
  108. package/src/types.ts +71 -0
  109. package/tests/agent.tools.test.ts +81 -0
  110. package/tests/benchmark.test.ts +31 -0
  111. package/tests/fixtures/sample.py +17 -0
  112. package/tests/fixtures/sample.ts +13 -0
  113. package/tests/fixtures/src/api/routes.ts +1 -0
  114. package/tests/fixtures/src/auth/permission.ts +3 -0
  115. package/tests/ranker-enhanced.test.ts +68 -0
  116. package/tests/ranker.test.ts +75 -0
  117. package/tests/scanner.scope.test.ts +41 -0
  118. package/tests/setup-fixtures.js +29 -0
  119. package/tests/skeletonizer.test.ts +142 -0
  120. package/tsconfig.json +21 -0
  121. package/uca-landing/index.html +17 -0
  122. package/uca-landing/package.json +23 -0
  123. package/uca-landing/postcss.config.js +6 -0
  124. package/uca-landing/src/App.jsx +43 -0
  125. package/uca-landing/src/components/AgentMode.jsx +45 -0
  126. package/uca-landing/src/components/CliReference.jsx +49 -0
  127. package/uca-landing/src/components/Features.jsx +63 -0
  128. package/uca-landing/src/components/Footer.jsx +35 -0
  129. package/uca-landing/src/components/Hero.jsx +124 -0
  130. package/uca-landing/src/components/HowItWorks.jsx +60 -0
  131. package/uca-landing/src/components/Install.jsx +90 -0
  132. package/uca-landing/src/components/LanguageSupport.jsx +63 -0
  133. package/uca-landing/src/components/Navbar.jsx +86 -0
  134. package/uca-landing/src/components/Problem.jsx +51 -0
  135. package/uca-landing/src/components/Reveal.jsx +40 -0
  136. package/uca-landing/src/components/WorksWith.jsx +59 -0
  137. package/uca-landing/src/hooks/useScrollNav.js +13 -0
  138. package/uca-landing/src/hooks/useTypewriter.js +41 -0
  139. package/uca-landing/src/index.css +13 -0
  140. package/uca-landing/src/main.jsx +10 -0
  141. package/uca-landing/tailwind.config.js +68 -0
  142. package/uca-landing/vite.config.js +6 -0
package/dist/agent.js ADDED
@@ -0,0 +1,340 @@
1
+ "use strict";
2
+ /**
3
+ * Gemini AI Agent Integration for Code Analysis
4
+ * This module provides tool definitions and agent setup for agentic code analysis
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.CodeAnalysisAgent = exports.analyzeFileDependenciesTool = exports.searchSymbolsTool = exports.getSymbolDetailsTool = void 0;
41
+ exports.createCodeAnalysisAgent = createCodeAnalysisAgent;
42
+ const generative_ai_1 = require("@google/generative-ai");
43
+ const mapper_1 = require("./mapper");
44
+ const fs = __importStar(require("fs"));
45
+ const path = __importStar(require("path"));
46
+ /**
47
+ * Tool definition for getting symbol details
48
+ */
49
+ exports.getSymbolDetailsTool = {
50
+ name: 'get_symbol_details',
51
+ description: `Retrieve the full implementation of a code symbol (function, method, class) from the original source file.
52
+ Use this when you need to see the actual implementation of a function or method that was marked with [SYMBOL:...] in the skeleton.
53
+ The symbolId is in the format "ClassName.methodName" or "functionName" for top-level functions.`,
54
+ parameters: {
55
+ type: generative_ai_1.SchemaType.OBJECT,
56
+ properties: {
57
+ symbolId: {
58
+ type: generative_ai_1.SchemaType.STRING,
59
+ description: 'The symbol identifier from the skeleton code (e.g., "AuthService.login" or "sendMessage")',
60
+ },
61
+ },
62
+ required: ['symbolId'],
63
+ },
64
+ };
65
+ /**
66
+ * Tool definition for searching code symbols
67
+ */
68
+ exports.searchSymbolsTool = {
69
+ name: 'search_symbols',
70
+ description: `Search for available symbols in the generated skeletons. Returns a list of matching symbols that can be retrieved using get_symbol_details.
71
+ Use this to discover what functions/methods are available before requesting their full implementation.`,
72
+ parameters: {
73
+ type: generative_ai_1.SchemaType.OBJECT,
74
+ properties: {
75
+ query: {
76
+ type: generative_ai_1.SchemaType.STRING,
77
+ description: 'Search query to match against symbol names, file paths, or signatures',
78
+ },
79
+ symbolType: {
80
+ type: generative_ai_1.SchemaType.STRING,
81
+ description: 'Optional filter by symbol type: function, method, constructor, arrow-function, variable',
82
+ enum: ['function', 'method', 'constructor', 'arrow-function', 'variable'],
83
+ },
84
+ },
85
+ required: ['query'],
86
+ },
87
+ };
88
+ /**
89
+ * Tool definition for analyzing file dependencies
90
+ */
91
+ exports.analyzeFileDependenciesTool = {
92
+ name: 'analyze_file_dependencies',
93
+ description: `Analyze import/export relationships for a specific file from the skeleton.
94
+ Use this to understand what other files a given file depends on.`,
95
+ parameters: {
96
+ type: generative_ai_1.SchemaType.OBJECT,
97
+ properties: {
98
+ filePath: {
99
+ type: generative_ai_1.SchemaType.STRING,
100
+ description: 'Relative path to the file (as shown in the skeleton)',
101
+ },
102
+ },
103
+ required: ['filePath'],
104
+ },
105
+ };
106
+ /**
107
+ * Code Analysis Agent
108
+ */
109
+ class CodeAnalysisAgent {
110
+ genAI;
111
+ mapping = null;
112
+ model;
113
+ constructor(apiKey, modelName = 'gemini-2.0-flash-exp') {
114
+ this.genAI = new generative_ai_1.GoogleGenerativeAI(apiKey);
115
+ this.model = this.genAI.getGenerativeModel({
116
+ model: modelName,
117
+ tools: [
118
+ {
119
+ functionDeclarations: [
120
+ exports.getSymbolDetailsTool,
121
+ exports.searchSymbolsTool,
122
+ exports.analyzeFileDependenciesTool,
123
+ ],
124
+ },
125
+ ],
126
+ });
127
+ }
128
+ /**
129
+ * Load symbol mapping
130
+ */
131
+ loadMapping(mappingPath) {
132
+ if (!fs.existsSync(mappingPath)) {
133
+ throw new Error(`Mapping file not found: ${mappingPath}`);
134
+ }
135
+ this.mapping = (0, mapper_1.loadMappingFromFile)(mappingPath);
136
+ console.log(`Loaded mapping with ${Object.keys(this.mapping.files).length} files`);
137
+ }
138
+ /**
139
+ * Handle tool calls from the model
140
+ */
141
+ async handleToolCall(functionCall) {
142
+ const { name, args } = functionCall;
143
+ switch (name) {
144
+ case 'get_symbol_details':
145
+ return this.handleGetSymbolDetails(args.symbolId);
146
+ case 'search_symbols':
147
+ return this.handleSearchSymbols(args.query, args.symbolType);
148
+ case 'analyze_file_dependencies':
149
+ return this.handleAnalyzeFileDependencies(args.filePath);
150
+ default:
151
+ return { error: `Unknown tool: ${name}` };
152
+ }
153
+ }
154
+ /**
155
+ * Get symbol details
156
+ */
157
+ handleGetSymbolDetails(symbolId) {
158
+ if (!this.mapping) {
159
+ return { error: 'No mapping loaded. Please load a mapping file first.' };
160
+ }
161
+ const result = (0, mapper_1.getSymbolDetails)(symbolId, this.mapping);
162
+ if (!result) {
163
+ return { error: `Symbol not found: ${symbolId}` };
164
+ }
165
+ return {
166
+ symbolId,
167
+ content: result.content,
168
+ location: {
169
+ file: result.location.filePath,
170
+ lines: `${result.location.startLine}-${result.location.endLine}`,
171
+ type: result.location.symbolType,
172
+ parentClass: result.location.parentClass,
173
+ },
174
+ };
175
+ }
176
+ /**
177
+ * Search symbols
178
+ */
179
+ handleSearchSymbols(query, symbolType) {
180
+ if (!this.mapping) {
181
+ return { error: 'No mapping loaded. Please load a mapping file first.' };
182
+ }
183
+ const results = [];
184
+ const queryLower = query.toLowerCase();
185
+ for (const [filePath, fileInfo] of Object.entries(this.mapping.files)) {
186
+ for (const symbol of fileInfo.symbols) {
187
+ // Filter by type if specified
188
+ if (symbolType && symbol.symbolType !== symbolType) {
189
+ continue;
190
+ }
191
+ // Check if query matches
192
+ const matchesName = symbol.symbolName.toLowerCase().includes(queryLower);
193
+ const matchesFile = filePath.toLowerCase().includes(queryLower);
194
+ const matchesSignature = symbol.signature?.toLowerCase().includes(queryLower);
195
+ if (matchesName || matchesFile || matchesSignature) {
196
+ results.push({
197
+ symbolId: symbol.symbolId,
198
+ name: symbol.symbolName,
199
+ type: symbol.symbolType,
200
+ file: filePath,
201
+ parentClass: symbol.parentClass,
202
+ signature: symbol.signature,
203
+ });
204
+ }
205
+ }
206
+ }
207
+ return {
208
+ query,
209
+ count: results.length,
210
+ results: results.slice(0, 20), // Limit to 20 results
211
+ };
212
+ }
213
+ /**
214
+ * Analyze file dependencies
215
+ */
216
+ handleAnalyzeFileDependencies(filePath) {
217
+ if (!this.mapping) {
218
+ return { error: 'No mapping loaded. Please load a mapping file first.' };
219
+ }
220
+ const fileInfo = this.mapping.files[filePath];
221
+ if (!fileInfo) {
222
+ return { error: `File not found in mapping: ${filePath}` };
223
+ }
224
+ // Read the original file to extract imports
225
+ const fullPath = path.join(this.mapping.rootPath, filePath);
226
+ if (!fs.existsSync(fullPath)) {
227
+ return { error: `Source file not found: ${fullPath}` };
228
+ }
229
+ const content = fs.readFileSync(fullPath, 'utf-8');
230
+ const importRegex = /import\s+(?:{[^}]*}|[^;]+)\s+from\s+['"]([^'"]+)['"]/g;
231
+ const imports = [];
232
+ let match;
233
+ while ((match = importRegex.exec(content)) !== null) {
234
+ imports.push(match[1]);
235
+ }
236
+ return {
237
+ file: filePath,
238
+ imports,
239
+ symbolCount: fileInfo.symbols.length,
240
+ symbols: fileInfo.symbols.map(s => ({
241
+ id: s.symbolId,
242
+ name: s.symbolName,
243
+ type: s.symbolType,
244
+ })),
245
+ };
246
+ }
247
+ /**
248
+ * Start a conversation with the agent
249
+ */
250
+ async chat(userMessage, skeletonContext) {
251
+ if (!this.mapping) {
252
+ throw new Error('No mapping loaded. Call loadMapping() first.');
253
+ }
254
+ let context = userMessage;
255
+ if (skeletonContext) {
256
+ context = [
257
+ 'You are a code analysis assistant.',
258
+ 'Base your answer on the provided skeletons and tool results.',
259
+ 'If evidence is insufficient, say so explicitly.',
260
+ 'Include a final section titled "Evidence" with bullet points that reference concrete files or symbols used.',
261
+ '',
262
+ 'Here are the code skeletons for context:',
263
+ skeletonContext,
264
+ '',
265
+ `User question: ${userMessage}`,
266
+ ].join('\n');
267
+ }
268
+ const chat = this.model.startChat({
269
+ history: [],
270
+ });
271
+ let response = await chat.sendMessage(context);
272
+ let responseText = '';
273
+ // Handle function calls in a loop
274
+ while (response.response.functionCalls()) {
275
+ const functionCalls = response.response.functionCalls();
276
+ const functionResponses = [];
277
+ for (const call of functionCalls) {
278
+ console.log(`[Agent] Calling tool: ${call.name}(${JSON.stringify(call.args)})`);
279
+ const result = await this.handleToolCall(call);
280
+ functionResponses.push({
281
+ name: call.name,
282
+ response: result,
283
+ });
284
+ }
285
+ // Send function responses back to the model
286
+ response = await chat.sendMessage(functionResponses);
287
+ }
288
+ responseText = response.response.text();
289
+ return responseText;
290
+ }
291
+ /**
292
+ * Local wrapper for symbol search without model invocation.
293
+ */
294
+ searchSymbols(query, symbolType) {
295
+ return this.handleSearchSymbols(query, symbolType);
296
+ }
297
+ /**
298
+ * Local wrapper for fetching symbol implementation by ID.
299
+ */
300
+ getSymbolDetails(symbolId) {
301
+ return this.handleGetSymbolDetails(symbolId);
302
+ }
303
+ /**
304
+ * Local wrapper for file dependency analysis.
305
+ */
306
+ analyzeFileDependencies(filePath) {
307
+ return this.handleAnalyzeFileDependencies(filePath);
308
+ }
309
+ /**
310
+ * Get statistics about the loaded mapping
311
+ */
312
+ getStats() {
313
+ if (!this.mapping) {
314
+ return { error: 'No mapping loaded' };
315
+ }
316
+ let totalSymbols = 0;
317
+ const symbolTypes = {};
318
+ for (const fileInfo of Object.values(this.mapping.files)) {
319
+ totalSymbols += fileInfo.symbols.length;
320
+ for (const symbol of fileInfo.symbols) {
321
+ symbolTypes[symbol.symbolType] = (symbolTypes[symbol.symbolType] || 0) + 1;
322
+ }
323
+ }
324
+ return {
325
+ rootPath: this.mapping.rootPath,
326
+ generatedAt: this.mapping.generatedAt,
327
+ totalFiles: Object.keys(this.mapping.files).length,
328
+ totalSymbols,
329
+ symbolsByType: symbolTypes,
330
+ };
331
+ }
332
+ }
333
+ exports.CodeAnalysisAgent = CodeAnalysisAgent;
334
+ /**
335
+ * Helper function to create an agent instance
336
+ */
337
+ function createCodeAnalysisAgent(apiKey, modelName) {
338
+ return new CodeAnalysisAgent(apiKey, modelName);
339
+ }
340
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Benchmark script for code-analyzer
3
+ * Runs against a repository root to measure token reduction.
4
+ * Compares full-scan token cost vs skeletonized analysis across representative queries.
5
+ */
6
+ interface BenchmarkScenario {
7
+ moduleKey: string;
8
+ query: string;
9
+ limit: number;
10
+ }
11
+ interface BenchmarkResult {
12
+ projectName: string;
13
+ projectRoot: string;
14
+ query: string;
15
+ allFilesCount: number;
16
+ allFilesTotalTokens: number;
17
+ analyzedFileCount: number;
18
+ analyzedOriginalTokens: number;
19
+ analyzedSkeletonTokens: number;
20
+ tokenReductionVsFullScan: number;
21
+ tokenReductionVsTopN: number;
22
+ top1KeywordCoverage: number;
23
+ avgTopKKeywordCoverage: number;
24
+ pathIntentMatchRate: number;
25
+ directoryDiversity: number;
26
+ enhancedRanking: boolean;
27
+ executionTimeMs: number;
28
+ topFiles: {
29
+ path: string;
30
+ score: number;
31
+ originalTokens: number;
32
+ skeletonTokens: number;
33
+ reductionPct: number;
34
+ }[];
35
+ }
36
+ export declare const BENCHMARK_SCENARIOS: BenchmarkScenario[];
37
+ /**
38
+ * Run a single benchmark scenario
39
+ */
40
+ declare function benchmarkProject(appRoot: string, moduleKey: string, projectName: string, query: string, options?: {
41
+ limit?: number;
42
+ enhancedRanking?: boolean;
43
+ }): Promise<BenchmarkResult>;
44
+ /**
45
+ * Format results for console output
46
+ */
47
+ declare function formatResults(results: BenchmarkResult[]): string;
48
+ /**
49
+ * Save benchmark output to JSON
50
+ */
51
+ declare function saveResults(results: BenchmarkResult[], outputPath: string): void;
52
+ export { benchmarkProject, formatResults, saveResults };
53
+ //# sourceMappingURL=benchmark.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmark.d.ts","sourceRoot":"","sources":["../src/benchmark.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,UAAU,iBAAiB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,eAAe;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IAEd,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAE5B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,wBAAwB,EAAE,MAAM,CAAC;IACjC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;KACtB,EAAE,CAAC;CACL;AA2DD,eAAO,MAAM,mBAAmB,EAAE,iBAAiB,EAIlD,CAAC;AA+BF;;GAEG;AACH,iBAAe,gBAAgB,CAC7B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,OAAO,CAAA;CAAO,GAC1D,OAAO,CAAC,eAAe,CAAC,CAwE1B;AAED;;GAEG;AACH,iBAAS,aAAa,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,CAkEzD;AAED;;GAEG;AACH,iBAAS,WAAW,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAsBzE;AAuED,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC"}