@quarry-systems/drift-vector-chroma 0.1.0-alpha.1 → 0.1.1-alpha.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quarry-systems/drift-vector-chroma",
3
- "version": "0.1.0-alpha.1",
3
+ "version": "0.1.1-alpha.1",
4
4
  "description": "Chroma vector store adapter for Drift RAG pipelines",
5
5
  "main": "./src/index.js",
6
6
  "types": "./src/index.d.ts",
@@ -30,7 +30,7 @@
30
30
  "vitest": "^2.1.0"
31
31
  },
32
32
  "files": [
33
- "dist",
33
+ "src",
34
34
  "README.md",
35
35
  "LICENSE.md",
36
36
  "CHANGELOG.md"
package/src/index.d.ts ADDED
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Copyright (c) 2025-2026 Quarry Systems (Brett Nye)
3
+ *
4
+ * This file is part of MCG (Managed Cyclic Graph).
5
+ *
6
+ * MCG is dual-licensed under:
7
+ * 1. GNU Affero General Public License v3.0 (AGPL-3.0)
8
+ * See LICENSE-AGPL or https://www.gnu.org/licenses/agpl-3.0.html
9
+ * 2. Commercial License
10
+ * See LICENSE-COMMERCIAL.md or contact licensing@quarry-systems.com
11
+ *
12
+ * You may use this file under the terms of either license.
13
+ *
14
+ * For commercial licensing inquiries:
15
+ * Email: licensing@quarry-systems.com
16
+ * Web: https://quarry-systems.com/license
17
+ */
18
+ import type { VectorAdapter } from '@quarry-systems/drift-contracts';
19
+ /**
20
+ * Chroma vector store configuration.
21
+ */
22
+ export interface ChromaVectorConfig {
23
+ /** Collection name (default: 'mcg_vectors') */
24
+ collection?: string;
25
+ /** Chroma server URL (default: 'http://localhost:8000' for server mode) */
26
+ url?: string;
27
+ /** Path for local persistence (default: in-memory if not specified) */
28
+ persistPath?: string;
29
+ /** Embedding dimension (optional, auto-detected from first insert) */
30
+ dimension?: number;
31
+ /** Distance metric (default: 'cosine') */
32
+ distanceMetric?: 'cosine' | 'l2' | 'ip';
33
+ }
34
+ /**
35
+ * Create a Chroma vector adapter.
36
+ *
37
+ * @example
38
+ * ```typescript
39
+ * // In-memory (for testing)
40
+ * const vectors = await createChromaVector({ collection: 'test' });
41
+ *
42
+ * // Local persistence
43
+ * const vectors = await createChromaVector({
44
+ * collection: 'docs',
45
+ * persistPath: './chroma_data'
46
+ * });
47
+ *
48
+ * // Server mode
49
+ * const vectors = await createChromaVector({
50
+ * collection: 'docs',
51
+ * url: 'http://localhost:8000'
52
+ * });
53
+ *
54
+ * // Upsert vectors
55
+ * await vectors.upsert([
56
+ * {
57
+ * id: 'doc-1-chunk-0',
58
+ * vector: [0.1, 0.2, 0.3, ...],
59
+ * metadata: { docId: 'doc-1', sequence: 0 },
60
+ * document: 'First paragraph...'
61
+ * }
62
+ * ]);
63
+ *
64
+ * // Query
65
+ * const results = await vectors.query({
66
+ * vector: [0.15, 0.25, 0.35, ...],
67
+ * topK: 5
68
+ * });
69
+ * ```
70
+ */
71
+ export declare function createChromaVector(config?: ChromaVectorConfig): Promise<VectorAdapter>;
72
+ export type { VectorAdapter, VectorItem, VectorQueryOptions, VectorMatch, } from '@quarry-systems/drift-contracts';
package/src/index.js ADDED
@@ -0,0 +1,205 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright (c) 2025-2026 Quarry Systems (Brett Nye)
4
+ *
5
+ * This file is part of MCG (Managed Cyclic Graph).
6
+ *
7
+ * MCG is dual-licensed under:
8
+ * 1. GNU Affero General Public License v3.0 (AGPL-3.0)
9
+ * See LICENSE-AGPL or https://www.gnu.org/licenses/agpl-3.0.html
10
+ * 2. Commercial License
11
+ * See LICENSE-COMMERCIAL.md or contact licensing@quarry-systems.com
12
+ *
13
+ * You may use this file under the terms of either license.
14
+ *
15
+ * For commercial licensing inquiries:
16
+ * Email: licensing@quarry-systems.com
17
+ * Web: https://quarry-systems.com/license
18
+ */
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.createChromaVector = createChromaVector;
21
+ /**
22
+ * MCG Chroma Vector Adapter
23
+ *
24
+ * Chroma-based vector storage for semantic search and RAG.
25
+ * Ideal for local development, demos, and indie-tier deployments.
26
+ *
27
+ * @packageDocumentation
28
+ */
29
+ const chromadb_1 = require("chromadb");
30
+ // ============================================================================
31
+ // Chroma Vector Implementation
32
+ // ============================================================================
33
+ /**
34
+ * Create a Chroma vector adapter.
35
+ *
36
+ * @example
37
+ * ```typescript
38
+ * // In-memory (for testing)
39
+ * const vectors = await createChromaVector({ collection: 'test' });
40
+ *
41
+ * // Local persistence
42
+ * const vectors = await createChromaVector({
43
+ * collection: 'docs',
44
+ * persistPath: './chroma_data'
45
+ * });
46
+ *
47
+ * // Server mode
48
+ * const vectors = await createChromaVector({
49
+ * collection: 'docs',
50
+ * url: 'http://localhost:8000'
51
+ * });
52
+ *
53
+ * // Upsert vectors
54
+ * await vectors.upsert([
55
+ * {
56
+ * id: 'doc-1-chunk-0',
57
+ * vector: [0.1, 0.2, 0.3, ...],
58
+ * metadata: { docId: 'doc-1', sequence: 0 },
59
+ * document: 'First paragraph...'
60
+ * }
61
+ * ]);
62
+ *
63
+ * // Query
64
+ * const results = await vectors.query({
65
+ * vector: [0.15, 0.25, 0.35, ...],
66
+ * topK: 5
67
+ * });
68
+ * ```
69
+ */
70
+ async function createChromaVector(config = {}) {
71
+ const collectionName = config.collection || 'mcg_vectors';
72
+ const distanceMetric = config.distanceMetric || 'cosine';
73
+ // Initialize Chroma client
74
+ // Note: ChromaDB JS client defaults to in-memory mode when no path is provided
75
+ const clientConfig = {};
76
+ if (config.url) {
77
+ clientConfig.path = config.url;
78
+ }
79
+ // persistPath is not directly supported by chromadb JS client
80
+ // For persistence, users should run a Chroma server
81
+ const client = new chromadb_1.ChromaClient(clientConfig);
82
+ // Get or create collection
83
+ let collection;
84
+ try {
85
+ collection = await client.getOrCreateCollection({
86
+ name: collectionName,
87
+ metadata: {
88
+ 'hnsw:space': distanceMetric,
89
+ },
90
+ });
91
+ }
92
+ catch (error) {
93
+ throw new Error(`Failed to initialize Chroma collection: ${error}`);
94
+ }
95
+ return {
96
+ name: 'chroma',
97
+ async upsert(items) {
98
+ if (items.length === 0)
99
+ return;
100
+ const ids = items.map(item => item.id);
101
+ const embeddings = items.map(item => item.vector);
102
+ // Convert metadata to Chroma's strict type (string | number | boolean values only)
103
+ const metadatas = items.map(item => {
104
+ if (!item.metadata)
105
+ return {};
106
+ const chromaMeta = {};
107
+ for (const [key, value] of Object.entries(item.metadata)) {
108
+ if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
109
+ chromaMeta[key] = value;
110
+ }
111
+ else if (value !== null && value !== undefined) {
112
+ // Serialize complex values as JSON strings
113
+ chromaMeta[key] = JSON.stringify(value);
114
+ }
115
+ }
116
+ return chromaMeta;
117
+ });
118
+ // Filter out undefined documents
119
+ const documents = items.map(item => item.document ?? '');
120
+ await collection.upsert({
121
+ ids,
122
+ embeddings,
123
+ metadatas,
124
+ documents,
125
+ });
126
+ },
127
+ async query(options) {
128
+ const results = await collection.query({
129
+ queryEmbeddings: [options.vector],
130
+ nResults: options.topK,
131
+ where: options.filter,
132
+ include: [
133
+ chromadb_1.IncludeEnum.Metadatas,
134
+ chromadb_1.IncludeEnum.Documents,
135
+ chromadb_1.IncludeEnum.Distances,
136
+ ],
137
+ });
138
+ if (!results.ids[0] || results.ids[0].length === 0) {
139
+ return [];
140
+ }
141
+ const matches = [];
142
+ for (let i = 0; i < results.ids[0].length; i++) {
143
+ const id = results.ids[0][i];
144
+ const distance = results.distances?.[0]?.[i] ?? 1;
145
+ // Convert distance to similarity score (0-1, higher is better)
146
+ // For cosine: distance is already 0-2, convert to similarity
147
+ // For L2: distance is euclidean, convert to similarity
148
+ let score;
149
+ if (distanceMetric === 'cosine') {
150
+ // Cosine distance: 0 = identical, 2 = opposite
151
+ score = 1 - (distance / 2);
152
+ }
153
+ else if (distanceMetric === 'l2') {
154
+ // L2 distance: 0 = identical, higher = more different
155
+ // Use exponential decay for similarity
156
+ score = Math.exp(-distance);
157
+ }
158
+ else {
159
+ // Inner product: higher is better (already similarity-like)
160
+ score = distance;
161
+ }
162
+ // Apply minimum score filter
163
+ if (options.minScore !== undefined && score < options.minScore) {
164
+ continue;
165
+ }
166
+ matches.push({
167
+ id,
168
+ score,
169
+ metadata: results.metadatas?.[0]?.[i],
170
+ document: results.documents?.[0]?.[i] ?? undefined,
171
+ });
172
+ }
173
+ return matches;
174
+ },
175
+ async delete(ids) {
176
+ if (ids.length === 0)
177
+ return;
178
+ await collection.delete({ ids });
179
+ },
180
+ async get(id) {
181
+ const results = await collection.get({
182
+ ids: [id],
183
+ include: [
184
+ chromadb_1.IncludeEnum.Metadatas,
185
+ chromadb_1.IncludeEnum.Documents,
186
+ chromadb_1.IncludeEnum.Embeddings,
187
+ ],
188
+ });
189
+ if (!results.ids || results.ids.length === 0) {
190
+ return null;
191
+ }
192
+ return {
193
+ id: results.ids[0],
194
+ vector: results.embeddings?.[0] ?? [],
195
+ metadata: results.metadatas?.[0],
196
+ document: results.documents?.[0] ?? undefined,
197
+ };
198
+ },
199
+ async count() {
200
+ const result = await collection.count();
201
+ return result;
202
+ },
203
+ };
204
+ }
205
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../libs/drift/drift-plugins/mcg-vector-chroma/src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;GAgBG;;AAoFH,gDAqJC;AAvOD;;;;;;;GAOG;AAEH,uCAAiE;AAgCjE,+EAA+E;AAC/E,+BAA+B;AAC/B,+EAA+E;AAE/E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACI,KAAK,UAAU,kBAAkB,CAAC,SAA6B,EAAE;IACtE,MAAM,cAAc,GAAG,MAAM,CAAC,UAAU,IAAI,aAAa,CAAC;IAC1D,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,QAAQ,CAAC;IAEzD,2BAA2B;IAC3B,+EAA+E;IAC/E,MAAM,YAAY,GAAsB,EAAE,CAAC;IAC3C,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QACf,YAAY,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC;IACjC,CAAC;IACD,8DAA8D;IAC9D,oDAAoD;IAEpD,MAAM,MAAM,GAAG,IAAI,uBAAY,CAAC,YAAY,CAAC,CAAC;IAE9C,2BAA2B;IAC3B,IAAI,UAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,UAAU,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC;YAC9C,IAAI,EAAE,cAAc;YACpB,QAAQ,EAAE;gBACR,YAAY,EAAE,cAAc;aAC7B;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,2CAA2C,KAAK,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,OAAO;QACL,IAAI,EAAE,QAAQ;QAEd,KAAK,CAAC,MAAM,CAAC,KAAmB;YAC9B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAE/B,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvC,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAElD,mFAAmF;YACnF,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;gBACjC,IAAI,CAAC,IAAI,CAAC,QAAQ;oBAAE,OAAO,EAAE,CAAC;gBAC9B,MAAM,UAAU,GAA8C,EAAE,CAAC;gBACjE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACzD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;wBACzF,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;oBAC1B,CAAC;yBAAM,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;wBACjD,2CAA2C;wBAC3C,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;oBAC1C,CAAC;gBACH,CAAC;gBACD,OAAO,UAAU,CAAC;YACpB,CAAC,CAAC,CAAC;YAEH,iCAAiC;YACjC,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;YAEzD,MAAM,UAAU,CAAC,MAAM,CAAC;gBACtB,GAAG;gBACH,UAAU;gBACV,SAAS;gBACT,SAAS;aACV,CAAC,CAAC;QACL,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,OAA2B;YACrC,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC;gBACrC,eAAe,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;gBACjC,QAAQ,EAAE,OAAO,CAAC,IAAI;gBACtB,KAAK,EAAE,OAAO,CAAC,MAA+D;gBAC9E,OAAO,EAAE;oBACP,sBAAW,CAAC,SAAS;oBACrB,sBAAW,CAAC,SAAS;oBACrB,sBAAW,CAAC,SAAS;iBACtB;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACnD,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,MAAM,OAAO,GAAkB,EAAE,CAAC;YAElC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/C,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7B,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAElD,+DAA+D;gBAC/D,6DAA6D;gBAC7D,uDAAuD;gBACvD,IAAI,KAAa,CAAC;gBAClB,IAAI,cAAc,KAAK,QAAQ,EAAE,CAAC;oBAChC,+CAA+C;oBAC/C,KAAK,GAAG,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;gBAC7B,CAAC;qBAAM,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;oBACnC,sDAAsD;oBACtD,uCAAuC;oBACvC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;gBAC9B,CAAC;qBAAM,CAAC;oBACN,4DAA4D;oBAC5D,KAAK,GAAG,QAAQ,CAAC;gBACnB,CAAC;gBAED,6BAA6B;gBAC7B,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;oBAC/D,SAAS;gBACX,CAAC;gBAED,OAAO,CAAC,IAAI,CAAC;oBACX,EAAE;oBACF,KAAK;oBACL,QAAQ,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAwC;oBAC5E,QAAQ,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS;iBACnD,CAAC,CAAC;YACL,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,GAAa;YACxB,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAC7B,MAAM,UAAU,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QACnC,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,EAAU;YAClB,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC;gBACnC,GAAG,EAAE,CAAC,EAAE,CAAC;gBACT,OAAO,EAAE;oBACP,sBAAW,CAAC,SAAS;oBACrB,sBAAW,CAAC,SAAS;oBACrB,sBAAW,CAAC,UAAU;iBACvB;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC7C,OAAO,IAAI,CAAC;YACd,CAAC;YAED,OAAO;gBACL,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;gBAClB,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAa,IAAI,EAAE;gBACjD,QAAQ,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAwC;gBACvE,QAAQ,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS;aAC9C,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,KAAK;YACT,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;YACxC,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Plugin Manifest for @quarry-systems/mcg-vector-chroma
3
+ *
4
+ * This manifest declares the plugin's metadata, capabilities, and requirements.
5
+ * It enables future security policies, sandboxing, and hosted execution.
6
+ */
7
+ import type { PluginManifest } from '@quarry-systems/drift-contracts';
8
+ export declare const manifest: PluginManifest;
9
+ export default manifest;
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ /**
3
+ * Plugin Manifest for @quarry-systems/mcg-vector-chroma
4
+ *
5
+ * This manifest declares the plugin's metadata, capabilities, and requirements.
6
+ * It enables future security policies, sandboxing, and hosted execution.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.manifest = void 0;
10
+ exports.manifest = {
11
+ name: '@quarry-systems/mcg-vector-chroma',
12
+ version: '0.6.0',
13
+ apiVersion: '1.0',
14
+ description: 'ChromaDB vector store plugin for Managed Cyclic Graph (MCG)',
15
+ author: {
16
+ name: 'Quarry Systems',
17
+ email: 'support@quarrysystems.com',
18
+ },
19
+ license: 'ISC',
20
+ type: ['node'],
21
+ capabilities: {
22
+ network: true, // Makes API calls to ChromaDB
23
+ filesystem: false,
24
+ secrets: false,
25
+ subprocess: false,
26
+ },
27
+ nodes: [],
28
+ services: [
29
+ {
30
+ id: 'chromaVectorStore',
31
+ name: 'Chroma Vector Store Service',
32
+ description: 'ChromaDB-based vector storage and similarity search service',
33
+ },
34
+ ],
35
+ peerDependencies: {
36
+ '@quarry-systems/drift-core': '^0.6.0',
37
+ '@quarry-systems/drift-contracts': '^0.6.0',
38
+ },
39
+ keywords: ['drift', 'mcg', 'managed-cyclic-graph', 'plugin', 'vector', 'chroma', 'chromadb', 'embeddings', 'similarity'],
40
+ repository: {
41
+ type: 'git',
42
+ url: 'https://github.com/quarry-systems/quarry-systems',
43
+ directory: 'libs/drift/drift-plugins/mcg-vector-chroma',
44
+ },
45
+ };
46
+ exports.default = exports.manifest;
47
+ //# sourceMappingURL=plugin.manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.manifest.js","sourceRoot":"","sources":["../../../../../../libs/drift/drift-plugins/mcg-vector-chroma/src/plugin.manifest.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAIU,QAAA,QAAQ,GAAmB;IACtC,IAAI,EAAE,mCAAmC;IACzC,OAAO,EAAE,OAAO;IAChB,UAAU,EAAE,KAAK;IAEjB,WAAW,EAAE,6DAA6D;IAE1E,MAAM,EAAE;QACN,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,2BAA2B;KACnC;IAED,OAAO,EAAE,KAAK;IAEd,IAAI,EAAE,CAAC,MAAM,CAAC;IAEd,YAAY,EAAE;QACZ,OAAO,EAAE,IAAI,EAAO,8BAA8B;QAClD,UAAU,EAAE,KAAK;QACjB,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,KAAK;KAClB;IAED,KAAK,EAAE,EAAE;IAET,QAAQ,EAAE;QACR;YACE,EAAE,EAAE,mBAAmB;YACvB,IAAI,EAAE,6BAA6B;YACnC,WAAW,EAAE,6DAA6D;SAC3E;KACF;IAED,gBAAgB,EAAE;QAChB,4BAA4B,EAAE,QAAQ;QACtC,iCAAiC,EAAE,QAAQ;KAC5C;IAED,QAAQ,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,sBAAsB,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,CAAC;IAExH,UAAU,EAAE;QACV,IAAI,EAAE,KAAK;QACX,GAAG,EAAE,kDAAkD;QACvD,SAAS,EAAE,4CAA4C;KACxD;CACF,CAAC;AAEF,kBAAe,gBAAQ,CAAC"}