opencode-windsurf-codeium 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.
@@ -0,0 +1,521 @@
1
+ /**
2
+ * gRPC Client for Windsurf Language Server
3
+ *
4
+ * Implements HTTP/2-based gRPC communication with the local Windsurf language server.
5
+ * Uses manual protobuf encoding (no external protobuf library needed).
6
+ */
7
+ import * as http2 from 'http2';
8
+ import * as crypto from 'crypto';
9
+ import { ChatMessageSource } from './types.js';
10
+ import { modelNameToEnum } from './models.js';
11
+ import { WindsurfError, WindsurfErrorCode } from './auth.js';
12
+ // ============================================================================
13
+ // Protobuf Encoding Helpers
14
+ // ============================================================================
15
+ /**
16
+ * Encode a number as a varint (variable-length integer)
17
+ */
18
+ function encodeVarint(value) {
19
+ const bytes = [];
20
+ let v = BigInt(value);
21
+ while (v > 127n) {
22
+ bytes.push(Number(v & 0x7fn) | 0x80);
23
+ v >>= 7n;
24
+ }
25
+ bytes.push(Number(v));
26
+ return bytes;
27
+ }
28
+ /**
29
+ * Encode a string field (wire type 2: length-delimited)
30
+ */
31
+ function encodeString(fieldNum, str) {
32
+ const strBytes = Buffer.from(str, 'utf8');
33
+ return [(fieldNum << 3) | 2, ...encodeVarint(strBytes.length), ...strBytes];
34
+ }
35
+ /**
36
+ * Encode a nested message field (wire type 2: length-delimited)
37
+ */
38
+ function encodeMessage(fieldNum, data) {
39
+ return [(fieldNum << 3) | 2, ...encodeVarint(data.length), ...data];
40
+ }
41
+ /**
42
+ * Encode a varint field (wire type 0)
43
+ */
44
+ function encodeVarintField(fieldNum, value) {
45
+ return [(fieldNum << 3) | 0, ...encodeVarint(value)];
46
+ }
47
+ // ============================================================================
48
+ // Request Building
49
+ // ============================================================================
50
+ /**
51
+ * Generate a UUID for message and conversation IDs
52
+ */
53
+ function generateUUID() {
54
+ return crypto.randomUUID();
55
+ }
56
+ /**
57
+ * Encode a google.protobuf.Timestamp
58
+ * Field 1: seconds (int64)
59
+ * Field 2: nanos (int32)
60
+ */
61
+ function encodeTimestamp() {
62
+ const now = Date.now();
63
+ const seconds = Math.floor(now / 1000);
64
+ const nanos = (now % 1000) * 1_000_000;
65
+ const bytes = [];
66
+ bytes.push(...encodeVarintField(1, seconds));
67
+ if (nanos > 0) {
68
+ bytes.push(...encodeVarintField(2, nanos));
69
+ }
70
+ return bytes;
71
+ }
72
+ /**
73
+ * Encode IntentGeneric message
74
+ * Field 1: text (string)
75
+ */
76
+ function encodeIntentGeneric(text) {
77
+ return encodeString(1, text);
78
+ }
79
+ /**
80
+ * Encode ChatMessageIntent message
81
+ * Field 1: generic (IntentGeneric, oneof)
82
+ * Field 12: num_tokens (int32)
83
+ */
84
+ function encodeChatMessageIntent(text) {
85
+ const generic = encodeIntentGeneric(text);
86
+ return encodeMessage(1, generic);
87
+ }
88
+ /**
89
+ * Encode a ChatMessage for the RawGetChatMessageRequest
90
+ *
91
+ * ChatMessage structure (from reverse engineering):
92
+ * Field 1: message_id (string, required)
93
+ * Field 2: source (enum: 1=USER, 2=SYSTEM)
94
+ * Field 3: timestamp (google.protobuf.Timestamp, required)
95
+ * Field 4: conversation_id (string, required)
96
+ * Field 5: intent (ChatMessageIntent, oneof content)
97
+ */
98
+ function encodeChatMessage(content, source, conversationId) {
99
+ const messageId = generateUUID();
100
+ const bytes = [];
101
+ // Field 1: message_id (required)
102
+ bytes.push(...encodeString(1, messageId));
103
+ // Field 2: source
104
+ bytes.push(...encodeVarintField(2, source));
105
+ // Field 3: timestamp (required)
106
+ const timestamp = encodeTimestamp();
107
+ bytes.push(...encodeMessage(3, timestamp));
108
+ // Field 4: conversation_id (required)
109
+ bytes.push(...encodeString(4, conversationId));
110
+ // Field 5: intent (ChatMessageIntent)
111
+ const intent = encodeChatMessageIntent(content);
112
+ bytes.push(...encodeMessage(5, intent));
113
+ return bytes;
114
+ }
115
+ /**
116
+ * Build the metadata message for the request
117
+ *
118
+ * Metadata structure:
119
+ * Field 1: ide_name (string)
120
+ * Field 2: extension_version (string)
121
+ * Field 3: api_key (string, required)
122
+ * Field 4: locale (string)
123
+ * Field 7: ide_version (string)
124
+ * Field 12: extension_name (string)
125
+ */
126
+ function encodeMetadata(apiKey, version) {
127
+ return [
128
+ ...encodeString(1, 'windsurf'), // ide_name
129
+ ...encodeString(2, version), // extension_version
130
+ ...encodeString(3, apiKey), // api_key (required)
131
+ ...encodeString(4, 'en'), // locale
132
+ ...encodeString(7, version), // ide_version
133
+ ...encodeString(12, 'windsurf'), // extension_name
134
+ ];
135
+ }
136
+ /**
137
+ * Map role string to ChatMessageSource enum value
138
+ */
139
+ function roleToSource(role) {
140
+ switch (role) {
141
+ case 'user':
142
+ return ChatMessageSource.USER;
143
+ case 'assistant':
144
+ return ChatMessageSource.ASSISTANT;
145
+ case 'system':
146
+ return ChatMessageSource.SYSTEM;
147
+ case 'tool':
148
+ return ChatMessageSource.TOOL;
149
+ default:
150
+ return ChatMessageSource.USER;
151
+ }
152
+ }
153
+ /**
154
+ * Build the complete chat request buffer using RawGetChatMessageRequest format
155
+ *
156
+ * RawGetChatMessageRequest structure:
157
+ * Field 1: metadata (Metadata message)
158
+ * Field 2: chat_messages (repeated ChatMessage)
159
+ * Field 3: system_prompt_override (string) - optional
160
+ * Field 4: chat_model (enum: Model)
161
+ * Field 5: chat_model_name (string) - optional
162
+ */
163
+ function buildChatRequest(apiKey, version, modelEnum, messages) {
164
+ const metadata = encodeMetadata(apiKey, version);
165
+ const conversationId = generateUUID();
166
+ // Build the request with all messages
167
+ const request = [];
168
+ // Field 1: metadata
169
+ request.push(...encodeMessage(1, metadata));
170
+ // Field 2: chat_messages (repeated ChatMessage)
171
+ // Extract system message if present and handle separately
172
+ let systemPrompt = '';
173
+ for (const msg of messages) {
174
+ if (msg.role === 'system') {
175
+ systemPrompt = msg.content;
176
+ }
177
+ else {
178
+ // Encode each message as ChatMessage with ChatMessageIntent
179
+ const source = roleToSource(msg.role);
180
+ const chatMsg = encodeChatMessage(msg.content, source, conversationId);
181
+ request.push(...encodeMessage(2, chatMsg));
182
+ }
183
+ }
184
+ // Field 3: system_prompt_override (if we have a system message)
185
+ if (systemPrompt) {
186
+ request.push(...encodeString(3, systemPrompt));
187
+ }
188
+ // Field 4: model enum
189
+ request.push(...encodeVarintField(4, modelEnum));
190
+ const payload = Buffer.from(request);
191
+ // gRPC framing: 1 byte compression flag (0) + 4 bytes length + payload
192
+ const frame = Buffer.alloc(5 + payload.length);
193
+ frame[0] = 0; // No compression
194
+ frame.writeUInt32BE(payload.length, 1);
195
+ payload.copy(frame, 5);
196
+ return frame;
197
+ }
198
+ // ============================================================================
199
+ // Response Parsing (Protobuf Decoding)
200
+ // ============================================================================
201
+ /**
202
+ * Decode a varint from a buffer starting at offset
203
+ * @returns [value, bytesRead]
204
+ */
205
+ function decodeVarint(buffer, offset) {
206
+ let result = 0n;
207
+ let shift = 0n;
208
+ let bytesRead = 0;
209
+ while (offset + bytesRead < buffer.length) {
210
+ const byte = buffer[offset + bytesRead];
211
+ bytesRead++;
212
+ result |= BigInt(byte & 0x7f) << shift;
213
+ if ((byte & 0x80) === 0) {
214
+ break;
215
+ }
216
+ shift += 7n;
217
+ }
218
+ return [result, bytesRead];
219
+ }
220
+ /**
221
+ * Parse a protobuf field from buffer
222
+ * @returns { fieldNum, wireType, value, bytesConsumed } or null if can't parse
223
+ */
224
+ function parseProtobufField(buffer, offset) {
225
+ if (offset >= buffer.length)
226
+ return null;
227
+ const [tag, tagBytes] = decodeVarint(buffer, offset);
228
+ const fieldNum = Number(tag >> 3n);
229
+ const wireType = Number(tag & 0x7n);
230
+ let bytesConsumed = tagBytes;
231
+ let value;
232
+ switch (wireType) {
233
+ case 0: // Varint
234
+ const [varintValue, varintBytes] = decodeVarint(buffer, offset + bytesConsumed);
235
+ value = varintValue;
236
+ bytesConsumed += varintBytes;
237
+ break;
238
+ case 2: // Length-delimited (string, bytes, embedded message)
239
+ const [length, lengthBytes] = decodeVarint(buffer, offset + bytesConsumed);
240
+ bytesConsumed += lengthBytes;
241
+ const len = Number(length);
242
+ if (offset + bytesConsumed + len > buffer.length) {
243
+ // Not enough data
244
+ return null;
245
+ }
246
+ value = buffer.subarray(offset + bytesConsumed, offset + bytesConsumed + len);
247
+ bytesConsumed += len;
248
+ break;
249
+ case 1: // 64-bit (fixed64, sfixed64, double)
250
+ if (offset + bytesConsumed + 8 > buffer.length)
251
+ return null;
252
+ value = buffer.subarray(offset + bytesConsumed, offset + bytesConsumed + 8);
253
+ bytesConsumed += 8;
254
+ break;
255
+ case 5: // 32-bit (fixed32, sfixed32, float)
256
+ if (offset + bytesConsumed + 4 > buffer.length)
257
+ return null;
258
+ value = buffer.subarray(offset + bytesConsumed, offset + bytesConsumed + 4);
259
+ bytesConsumed += 4;
260
+ break;
261
+ default:
262
+ // Unknown wire type, can't parse
263
+ return null;
264
+ }
265
+ return { fieldNum, wireType, value, bytesConsumed };
266
+ }
267
+ /**
268
+ * Extract text from RawChatMessage protobuf
269
+ *
270
+ * RawChatMessage structure:
271
+ * Field 1: message_id (string)
272
+ * Field 2: source (enum)
273
+ * Field 3: timestamp (message)
274
+ * Field 4: conversation_id (string)
275
+ * Field 5: text (string) ← What we want
276
+ * Field 6: in_progress (bool)
277
+ * Field 7: is_error (bool)
278
+ */
279
+ function extractTextFromRawChatMessage(buffer) {
280
+ let offset = 0;
281
+ while (offset < buffer.length) {
282
+ const field = parseProtobufField(buffer, offset);
283
+ if (!field)
284
+ break;
285
+ offset += field.bytesConsumed;
286
+ // Field 5 is the text content
287
+ if (field.fieldNum === 5 && field.wireType === 2 && Buffer.isBuffer(field.value)) {
288
+ return field.value.toString('utf8');
289
+ }
290
+ }
291
+ return '';
292
+ }
293
+ /**
294
+ * Extract text from RawGetChatMessageResponse protobuf
295
+ *
296
+ * RawGetChatMessageResponse structure:
297
+ * Field 1: delta_message (RawChatMessage)
298
+ */
299
+ function extractTextFromResponse(buffer) {
300
+ let offset = 0;
301
+ while (offset < buffer.length) {
302
+ const field = parseProtobufField(buffer, offset);
303
+ if (!field)
304
+ break;
305
+ offset += field.bytesConsumed;
306
+ // Field 1 is delta_message (RawChatMessage)
307
+ if (field.fieldNum === 1 && field.wireType === 2 && Buffer.isBuffer(field.value)) {
308
+ const text = extractTextFromRawChatMessage(field.value);
309
+ if (text)
310
+ return text;
311
+ }
312
+ }
313
+ return '';
314
+ }
315
+ /**
316
+ * Extract readable text from a gRPC response chunk
317
+ *
318
+ * The response is gRPC-framed: 1 byte compression + 4 bytes length + protobuf payload
319
+ * We parse the protobuf to extract the text field from RawChatMessage.
320
+ */
321
+ function extractTextFromChunk(chunk) {
322
+ // gRPC frame: 1 byte compression flag + 4 bytes message length + message
323
+ // Multiple messages may be concatenated in a single chunk
324
+ const results = [];
325
+ let offset = 0;
326
+ while (offset + 5 <= chunk.length) {
327
+ const compressed = chunk[offset];
328
+ const messageLength = chunk.readUInt32BE(offset + 1);
329
+ if (compressed !== 0) {
330
+ // Compressed data not supported, skip
331
+ offset += 5 + messageLength;
332
+ continue;
333
+ }
334
+ if (offset + 5 + messageLength > chunk.length) {
335
+ // Not enough data for the full message, try as raw protobuf
336
+ break;
337
+ }
338
+ const messageData = chunk.subarray(offset + 5, offset + 5 + messageLength);
339
+ const text = extractTextFromResponse(messageData);
340
+ if (text) {
341
+ results.push(text);
342
+ }
343
+ offset += 5 + messageLength;
344
+ }
345
+ // If we extracted text from proper protobuf parsing, return it
346
+ if (results.length > 0) {
347
+ return results.join('');
348
+ }
349
+ // Fallback: try parsing the entire chunk as protobuf (in case framing was already stripped)
350
+ const fallbackText = extractTextFromResponse(chunk);
351
+ if (fallbackText) {
352
+ return fallbackText;
353
+ }
354
+ // Last resort: heuristic extraction for edge cases
355
+ return extractTextHeuristic(chunk);
356
+ }
357
+ /**
358
+ * Fallback heuristic text extraction for edge cases
359
+ */
360
+ function extractTextHeuristic(chunk) {
361
+ // Convert to string, filtering out non-printable characters
362
+ const readable = chunk
363
+ .toString('utf8')
364
+ .replace(/[^\x20-\x7E\n\r\t]/g, ' ')
365
+ .replace(/\s+/g, ' ')
366
+ .trim();
367
+ // Look for text content that doesn't look like UUIDs or binary artifacts
368
+ const parts = readable.split(/\s{2,}/);
369
+ for (const part of parts) {
370
+ const cleaned = part.trim();
371
+ if (cleaned.length > 2 &&
372
+ !cleaned.match(/^[a-f0-9-]{8,}$/i) && // Not a UUID
373
+ !cleaned.match(/^[\x00-\x1f\x7f-\xff]+$/) // Not binary
374
+ ) {
375
+ return cleaned;
376
+ }
377
+ }
378
+ return '';
379
+ }
380
+ // ============================================================================
381
+ // Streaming API
382
+ // ============================================================================
383
+ /**
384
+ * Stream chat completion using Promise-based API
385
+ *
386
+ * @param credentials - Windsurf credentials (csrf, port, apiKey, version)
387
+ * @param options - Chat options including model, messages, and callbacks
388
+ * @returns Promise that resolves to the full response text
389
+ */
390
+ export function streamChat(credentials, options) {
391
+ const { csrfToken, port, apiKey, version } = credentials;
392
+ const modelEnum = modelNameToEnum(options.model);
393
+ const body = buildChatRequest(apiKey, version, modelEnum, options.messages);
394
+ return new Promise((resolve, reject) => {
395
+ const client = http2.connect(`http://localhost:${port}`);
396
+ const chunks = [];
397
+ client.on('error', (err) => {
398
+ options.onError?.(err);
399
+ reject(new WindsurfError(`Connection failed: ${err.message}`, WindsurfErrorCode.CONNECTION_FAILED, err));
400
+ });
401
+ client.on('connect', () => {
402
+ const req = client.request({
403
+ ':method': 'POST',
404
+ ':path': '/exa.language_server_pb.LanguageServerService/RawGetChatMessage',
405
+ 'content-type': 'application/grpc',
406
+ 'te': 'trailers',
407
+ 'x-codeium-csrf-token': csrfToken,
408
+ });
409
+ req.on('data', (chunk) => {
410
+ const text = extractTextFromChunk(chunk);
411
+ if (text) {
412
+ chunks.push(text);
413
+ options.onChunk?.(text);
414
+ }
415
+ });
416
+ req.on('trailers', (trailers) => {
417
+ const status = trailers['grpc-status'];
418
+ if (status !== '0') {
419
+ const message = trailers['grpc-message'];
420
+ const err = new WindsurfError(`gRPC error ${status}: ${message ? decodeURIComponent(message) : 'Unknown error'}`, WindsurfErrorCode.STREAM_ERROR);
421
+ options.onError?.(err);
422
+ reject(err);
423
+ }
424
+ });
425
+ req.on('end', () => {
426
+ client.close();
427
+ const fullText = chunks.join('');
428
+ options.onComplete?.(fullText);
429
+ resolve(fullText);
430
+ });
431
+ req.on('error', (err) => {
432
+ client.close();
433
+ options.onError?.(err);
434
+ reject(new WindsurfError(`Request failed: ${err.message}`, WindsurfErrorCode.STREAM_ERROR, err));
435
+ });
436
+ req.write(body);
437
+ req.end();
438
+ });
439
+ // Timeout after 2 minutes
440
+ setTimeout(() => {
441
+ client.close();
442
+ const fullText = chunks.join('');
443
+ options.onComplete?.(fullText);
444
+ resolve(fullText);
445
+ }, 120000);
446
+ });
447
+ }
448
+ /**
449
+ * Stream chat completion using async generator
450
+ *
451
+ * Yields text chunks as they arrive, for use with SSE streaming.
452
+ *
453
+ * @param credentials - Windsurf credentials
454
+ * @param options - Chat options (model and messages)
455
+ * @yields Text chunks as they arrive
456
+ */
457
+ export async function* streamChatGenerator(credentials, options) {
458
+ const { csrfToken, port, apiKey, version } = credentials;
459
+ const modelEnum = modelNameToEnum(options.model);
460
+ const body = buildChatRequest(apiKey, version, modelEnum, options.messages);
461
+ const client = http2.connect(`http://localhost:${port}`);
462
+ const chunkQueue = [];
463
+ let done = false;
464
+ let error = null;
465
+ let resolveWait = null;
466
+ client.on('error', (err) => {
467
+ error = new WindsurfError(`Connection failed: ${err.message}`, WindsurfErrorCode.CONNECTION_FAILED, err);
468
+ done = true;
469
+ resolveWait?.();
470
+ });
471
+ const req = client.request({
472
+ ':method': 'POST',
473
+ ':path': '/exa.language_server_pb.LanguageServerService/RawGetChatMessage',
474
+ 'content-type': 'application/grpc',
475
+ 'te': 'trailers',
476
+ 'x-codeium-csrf-token': csrfToken,
477
+ });
478
+ req.on('data', (chunk) => {
479
+ const text = extractTextFromChunk(chunk);
480
+ if (text) {
481
+ chunkQueue.push(text);
482
+ resolveWait?.();
483
+ }
484
+ });
485
+ req.on('trailers', (trailers) => {
486
+ const status = trailers['grpc-status'];
487
+ if (status !== '0') {
488
+ const message = trailers['grpc-message'];
489
+ error = new WindsurfError(`gRPC error ${status}: ${message ? decodeURIComponent(message) : 'Unknown error'}`, WindsurfErrorCode.STREAM_ERROR);
490
+ }
491
+ });
492
+ req.on('end', () => {
493
+ done = true;
494
+ client.close();
495
+ resolveWait?.();
496
+ });
497
+ req.on('error', (err) => {
498
+ error = new WindsurfError(`Request failed: ${err.message}`, WindsurfErrorCode.STREAM_ERROR, err);
499
+ done = true;
500
+ client.close();
501
+ resolveWait?.();
502
+ });
503
+ req.write(body);
504
+ req.end();
505
+ // Yield chunks as they arrive
506
+ while (!done || chunkQueue.length > 0) {
507
+ if (chunkQueue.length > 0) {
508
+ yield chunkQueue.shift();
509
+ }
510
+ else if (!done) {
511
+ await new Promise((resolve) => {
512
+ resolveWait = resolve;
513
+ });
514
+ resolveWait = null;
515
+ }
516
+ }
517
+ if (error) {
518
+ throw error;
519
+ }
520
+ }
521
+ //# sourceMappingURL=grpc-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grpc-client.js","sourceRoot":"","sources":["../../../src/plugin/grpc-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Model name to enum mappings for Windsurf gRPC protocol
3
+ *
4
+ * Maps OpenAI-compatible model names to Windsurf protobuf enum values.
5
+ * These values were extracted from Windsurf's extension.js.
6
+ *
7
+ * To discover/verify these values:
8
+ * 1. Find: /Applications/Windsurf.app/Contents/Resources/app/extensions/windsurf/dist/extension.js
9
+ * 2. Search: grep -oE 'CLAUDE[A-Z0-9_]+\s*=\s*[0-9]+' extension.js
10
+ */
11
+ import { type ModelEnumValue } from './types.js';
12
+ /**
13
+ * Convert a model name string to its protobuf enum value
14
+ * @param modelName - Model name (e.g., "claude-4-sonnet", "gpt-4o")
15
+ * @returns The corresponding enum value, defaults to CLAUDE_3_5_SONNET if unknown
16
+ */
17
+ export declare function modelNameToEnum(modelName: string): ModelEnumValue;
18
+ /**
19
+ * Convert a protobuf enum value to a canonical model name
20
+ * @param enumValue - The enum value
21
+ * @returns The canonical model name string
22
+ */
23
+ export declare function enumToModelName(enumValue: ModelEnumValue): string;
24
+ /**
25
+ * Get all supported model names
26
+ * @returns Array of all supported model name strings
27
+ */
28
+ export declare function getSupportedModels(): string[];
29
+ /**
30
+ * Check if a model name is supported
31
+ * @param modelName - Model name to check
32
+ * @returns True if the model is supported
33
+ */
34
+ export declare function isModelSupported(modelName: string): boolean;
35
+ /**
36
+ * Get the default model name
37
+ * @returns The default model name
38
+ */
39
+ export declare function getDefaultModel(): string;
40
+ /**
41
+ * Get the default model enum value
42
+ * @returns The default model enum value
43
+ */
44
+ export declare function getDefaultModelEnum(): ModelEnumValue;
45
+ /**
46
+ * Get canonical model names (one per enum value, no aliases)
47
+ * @returns Array of canonical model names
48
+ */
49
+ export declare function getCanonicalModels(): string[];
50
+ //# sourceMappingURL=models.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../../src/plugin/models.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AA4W5D;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAGjE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,cAAc,GAAG,MAAM,CAEjE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAE7C;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,cAAc,CAEpD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAE7C"}