@mcp-web/bridge 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +311 -0
  3. package/dist/adapters/bun.d.ts +95 -0
  4. package/dist/adapters/bun.d.ts.map +1 -0
  5. package/dist/adapters/bun.js +286 -0
  6. package/dist/adapters/bun.js.map +1 -0
  7. package/dist/adapters/deno.d.ts +89 -0
  8. package/dist/adapters/deno.d.ts.map +1 -0
  9. package/dist/adapters/deno.js +249 -0
  10. package/dist/adapters/deno.js.map +1 -0
  11. package/dist/adapters/index.d.ts +21 -0
  12. package/dist/adapters/index.d.ts.map +1 -0
  13. package/dist/adapters/index.js +21 -0
  14. package/dist/adapters/index.js.map +1 -0
  15. package/dist/adapters/node.d.ts +112 -0
  16. package/dist/adapters/node.d.ts.map +1 -0
  17. package/dist/adapters/node.js +309 -0
  18. package/dist/adapters/node.js.map +1 -0
  19. package/dist/adapters/partykit.d.ts +153 -0
  20. package/dist/adapters/partykit.d.ts.map +1 -0
  21. package/dist/adapters/partykit.js +372 -0
  22. package/dist/adapters/partykit.js.map +1 -0
  23. package/dist/bridge.d.ts +38 -0
  24. package/dist/bridge.d.ts.map +1 -0
  25. package/dist/bridge.js +1004 -0
  26. package/dist/bridge.js.map +1 -0
  27. package/dist/core.d.ts +75 -0
  28. package/dist/core.d.ts.map +1 -0
  29. package/dist/core.js +1508 -0
  30. package/dist/core.js.map +1 -0
  31. package/dist/index.d.ts +38 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +42 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/runtime/index.d.ts +11 -0
  36. package/dist/runtime/index.d.ts.map +1 -0
  37. package/dist/runtime/index.js +9 -0
  38. package/dist/runtime/index.js.map +1 -0
  39. package/dist/runtime/scheduler.d.ts +69 -0
  40. package/dist/runtime/scheduler.d.ts.map +1 -0
  41. package/dist/runtime/scheduler.js +88 -0
  42. package/dist/runtime/scheduler.js.map +1 -0
  43. package/dist/runtime/types.d.ts +144 -0
  44. package/dist/runtime/types.d.ts.map +1 -0
  45. package/dist/runtime/types.js +82 -0
  46. package/dist/runtime/types.js.map +1 -0
  47. package/dist/schemas.d.ts +6 -0
  48. package/dist/schemas.d.ts.map +1 -0
  49. package/dist/schemas.js +6 -0
  50. package/dist/schemas.js.map +1 -0
  51. package/dist/types.d.ts +130 -0
  52. package/dist/types.d.ts.map +1 -0
  53. package/dist/types.js +2 -0
  54. package/dist/types.js.map +1 -0
  55. package/package.json +28 -0
  56. package/src/adapters/bun.ts +354 -0
  57. package/src/adapters/deno.ts +282 -0
  58. package/src/adapters/index.ts +28 -0
  59. package/src/adapters/node.ts +385 -0
  60. package/src/adapters/partykit.ts +482 -0
  61. package/src/bridge.test.ts +64 -0
  62. package/src/core.ts +2176 -0
  63. package/src/index.ts +90 -0
  64. package/src/limits.test.ts +436 -0
  65. package/src/remote-mcp.test.ts +770 -0
  66. package/src/runtime/index.ts +24 -0
  67. package/src/runtime/scheduler.ts +130 -0
  68. package/src/runtime/types.ts +229 -0
  69. package/src/schemas.ts +6 -0
  70. package/src/session-naming.test.ts +443 -0
  71. package/src/types.ts +180 -0
  72. package/tsconfig.json +12 -0
@@ -0,0 +1,372 @@
1
+ /**
2
+ * MCPWebBridgeParty - PartyKit adapter for the MCP Web Bridge.
3
+ *
4
+ * Enables deployment to Cloudflare's edge network via PartyKit.
5
+ * Uses PartyKit's Party.Server interface with Durable Objects for state management.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * // server.ts - PartyKit server entry point
10
+ * import { createPartyKitBridge } from '@mcp-web/bridge';
11
+ *
12
+ * export default createPartyKitBridge({
13
+ * name: 'My App',
14
+ * description: 'My awesome app on the edge',
15
+ * });
16
+ * ```
17
+ *
18
+ * @example With partykit.json configuration
19
+ * ```json
20
+ * {
21
+ * "name": "my-mcp-bridge",
22
+ * "main": "server.ts",
23
+ * "compatibility_date": "2024-01-01"
24
+ * }
25
+ * ```
26
+ *
27
+ * @example Deploy to PartyKit
28
+ * ```bash
29
+ * npx partykit deploy
30
+ * ```
31
+ *
32
+ * @remarks
33
+ * PartyKit provides:
34
+ * - Global edge deployment via Cloudflare
35
+ * - Durable Objects for stateful WebSocket handling
36
+ * - Hibernation support for cost efficiency
37
+ * - Alarms for scheduled tasks (used instead of setInterval)
38
+ *
39
+ * Key differences from other adapters:
40
+ * - No explicit port configuration (managed by PartyKit/Cloudflare)
41
+ * - Uses `Party.storage.setAlarm()` for session timeout checks
42
+ * - State can persist across hibernation cycles
43
+ *
44
+ * @see https://docs.partykit.io/
45
+ * @see https://docs.partykit.io/guides/scheduling-tasks-with-alarms/
46
+ */
47
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
48
+ if (kind === "m") throw new TypeError("Private method is not writable");
49
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
50
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
51
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
52
+ };
53
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
54
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
55
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
56
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
57
+ };
58
+ var _AlarmScheduler_instances, _AlarmScheduler_room, _AlarmScheduler_callbacks, _AlarmScheduler_intervals, _AlarmScheduler_nextAlarmId, _AlarmScheduler_updateAlarm;
59
+ import { MCPWebBridge } from '../core.js';
60
+ import { isSSEResponse } from '../runtime/types.js';
61
+ // ============================================================================
62
+ // Alarm-based Scheduler
63
+ // ============================================================================
64
+ /**
65
+ * Scheduler implementation using PartyKit alarms.
66
+ *
67
+ * PartyKit only supports one alarm at a time per room, so this scheduler
68
+ * tracks multiple scheduled callbacks and uses the alarm for the soonest one.
69
+ *
70
+ * @see https://docs.partykit.io/guides/scheduling-tasks-with-alarms/
71
+ */
72
+ export class AlarmScheduler {
73
+ constructor(room) {
74
+ _AlarmScheduler_instances.add(this);
75
+ _AlarmScheduler_room.set(this, void 0);
76
+ _AlarmScheduler_callbacks.set(this, new Map());
77
+ _AlarmScheduler_intervals.set(this, new Map());
78
+ _AlarmScheduler_nextAlarmId.set(this, null);
79
+ __classPrivateFieldSet(this, _AlarmScheduler_room, room, "f");
80
+ }
81
+ schedule(callback, delayMs) {
82
+ const id = crypto.randomUUID();
83
+ const fireAt = Date.now() + delayMs;
84
+ __classPrivateFieldGet(this, _AlarmScheduler_callbacks, "f").set(id, { callback, fireAt });
85
+ __classPrivateFieldGet(this, _AlarmScheduler_instances, "m", _AlarmScheduler_updateAlarm).call(this);
86
+ return id;
87
+ }
88
+ cancel(id) {
89
+ __classPrivateFieldGet(this, _AlarmScheduler_callbacks, "f").delete(id);
90
+ __classPrivateFieldGet(this, _AlarmScheduler_instances, "m", _AlarmScheduler_updateAlarm).call(this);
91
+ }
92
+ scheduleInterval(callback, intervalMs) {
93
+ const id = crypto.randomUUID();
94
+ const nextFireAt = Date.now() + intervalMs;
95
+ __classPrivateFieldGet(this, _AlarmScheduler_intervals, "f").set(id, { callback, intervalMs, nextFireAt });
96
+ __classPrivateFieldGet(this, _AlarmScheduler_instances, "m", _AlarmScheduler_updateAlarm).call(this);
97
+ return id;
98
+ }
99
+ cancelInterval(id) {
100
+ __classPrivateFieldGet(this, _AlarmScheduler_intervals, "f").delete(id);
101
+ __classPrivateFieldGet(this, _AlarmScheduler_instances, "m", _AlarmScheduler_updateAlarm).call(this);
102
+ }
103
+ dispose() {
104
+ __classPrivateFieldGet(this, _AlarmScheduler_callbacks, "f").clear();
105
+ __classPrivateFieldGet(this, _AlarmScheduler_intervals, "f").clear();
106
+ __classPrivateFieldGet(this, _AlarmScheduler_room, "f").storage.deleteAlarm().catch(() => { });
107
+ }
108
+ /**
109
+ * Called by the PartyKit server's onAlarm() handler.
110
+ * Executes due callbacks and reschedules the next alarm.
111
+ */
112
+ async handleAlarm() {
113
+ const now = Date.now();
114
+ // Execute due one-time callbacks
115
+ for (const [id, { callback, fireAt }] of __classPrivateFieldGet(this, _AlarmScheduler_callbacks, "f")) {
116
+ if (fireAt <= now) {
117
+ __classPrivateFieldGet(this, _AlarmScheduler_callbacks, "f").delete(id);
118
+ try {
119
+ callback();
120
+ }
121
+ catch (error) {
122
+ console.error('Alarm callback error:', error);
123
+ }
124
+ }
125
+ }
126
+ // Execute due interval callbacks and reschedule them
127
+ for (const [id, interval] of __classPrivateFieldGet(this, _AlarmScheduler_intervals, "f")) {
128
+ if (interval.nextFireAt <= now) {
129
+ interval.nextFireAt = now + interval.intervalMs;
130
+ try {
131
+ interval.callback();
132
+ }
133
+ catch (error) {
134
+ console.error('Interval callback error:', error);
135
+ }
136
+ }
137
+ }
138
+ // Schedule next alarm
139
+ await __classPrivateFieldGet(this, _AlarmScheduler_instances, "m", _AlarmScheduler_updateAlarm).call(this);
140
+ }
141
+ }
142
+ _AlarmScheduler_room = new WeakMap(), _AlarmScheduler_callbacks = new WeakMap(), _AlarmScheduler_intervals = new WeakMap(), _AlarmScheduler_nextAlarmId = new WeakMap(), _AlarmScheduler_instances = new WeakSet(), _AlarmScheduler_updateAlarm = async function _AlarmScheduler_updateAlarm() {
143
+ // Find the soonest scheduled callback
144
+ let soonest = null;
145
+ for (const { fireAt } of __classPrivateFieldGet(this, _AlarmScheduler_callbacks, "f").values()) {
146
+ if (soonest === null || fireAt < soonest) {
147
+ soonest = fireAt;
148
+ }
149
+ }
150
+ for (const { nextFireAt } of __classPrivateFieldGet(this, _AlarmScheduler_intervals, "f").values()) {
151
+ if (soonest === null || nextFireAt < soonest) {
152
+ soonest = nextFireAt;
153
+ }
154
+ }
155
+ if (soonest !== null) {
156
+ await __classPrivateFieldGet(this, _AlarmScheduler_room, "f").storage.setAlarm(soonest);
157
+ }
158
+ else {
159
+ await __classPrivateFieldGet(this, _AlarmScheduler_room, "f").storage.deleteAlarm();
160
+ }
161
+ };
162
+ /**
163
+ * Wraps a PartyKit Connection in our runtime-agnostic interface.
164
+ */
165
+ function wrapPartyConnection(connection) {
166
+ const messageHandlers = new Set();
167
+ return {
168
+ send(data) {
169
+ if (connection.readyState === 1) {
170
+ // OPEN
171
+ connection.send(data);
172
+ }
173
+ },
174
+ close(code, reason) {
175
+ connection.close(code, reason);
176
+ },
177
+ get readyState() {
178
+ switch (connection.readyState) {
179
+ case 0:
180
+ return 'CONNECTING';
181
+ case 1:
182
+ return 'OPEN';
183
+ case 2:
184
+ return 'CLOSING';
185
+ case 3:
186
+ default:
187
+ return 'CLOSED';
188
+ }
189
+ },
190
+ onMessage(handler) {
191
+ messageHandlers.add(handler);
192
+ },
193
+ offMessage(handler) {
194
+ messageHandlers.delete(handler);
195
+ },
196
+ // Internal: called by the PartyKit server to dispatch messages
197
+ _dispatchMessage(data) {
198
+ for (const handler of messageHandlers) {
199
+ handler(data);
200
+ }
201
+ },
202
+ };
203
+ }
204
+ /**
205
+ * Wraps a PartyKit/Cloudflare Request in our runtime-agnostic HttpRequest interface.
206
+ */
207
+ function wrapPartyRequest(req) {
208
+ return {
209
+ method: req.method,
210
+ url: req.url,
211
+ headers: {
212
+ get(name) {
213
+ return req.headers.get(name);
214
+ },
215
+ },
216
+ text() {
217
+ return req.text();
218
+ },
219
+ };
220
+ }
221
+ // ============================================================================
222
+ // PartyKit Bridge Server
223
+ // ============================================================================
224
+ /**
225
+ * Creates a PartyKit-compatible bridge server class.
226
+ *
227
+ * @example
228
+ * ```typescript
229
+ * // server.ts
230
+ * import { createPartyKitBridge } from '@mcp-web/bridge';
231
+ *
232
+ * export default createPartyKitBridge({
233
+ * name: 'My Bridge',
234
+ * description: 'MCP Web bridge on the edge',
235
+ * });
236
+ * ```
237
+ */
238
+ export function createPartyKitBridge(config) {
239
+ var _MCPWebBridgeParty_room, _MCPWebBridgeParty_core, _MCPWebBridgeParty_scheduler, _MCPWebBridgeParty_connections, _MCPWebBridgeParty_connectionSessionIds, _a;
240
+ return _a = class MCPWebBridgeParty {
241
+ constructor(room) {
242
+ _MCPWebBridgeParty_room.set(this, void 0);
243
+ _MCPWebBridgeParty_core.set(this, void 0);
244
+ _MCPWebBridgeParty_scheduler.set(this, void 0);
245
+ _MCPWebBridgeParty_connections.set(this, new Map());
246
+ _MCPWebBridgeParty_connectionSessionIds.set(this, new Map()); // connectionId -> sessionId
247
+ __classPrivateFieldSet(this, _MCPWebBridgeParty_room, room, "f");
248
+ __classPrivateFieldSet(this, _MCPWebBridgeParty_scheduler, new AlarmScheduler(room), "f");
249
+ __classPrivateFieldSet(this, _MCPWebBridgeParty_core, new MCPWebBridge(config, __classPrivateFieldGet(this, _MCPWebBridgeParty_scheduler, "f")), "f");
250
+ console.log(`🌉 MCP Web Bridge (PartyKit) initialized for room: ${room.id}`);
251
+ }
252
+ /**
253
+ * Handle new WebSocket connections.
254
+ */
255
+ async onConnect(connection, ctx) {
256
+ const url = new URL(ctx.request.url);
257
+ const sessionId = url.searchParams.get('session');
258
+ if (!sessionId) {
259
+ connection.close(1008, 'Missing session parameter');
260
+ return;
261
+ }
262
+ const wrapped = wrapPartyConnection(connection);
263
+ __classPrivateFieldGet(this, _MCPWebBridgeParty_connections, "f").set(connection.id, wrapped);
264
+ __classPrivateFieldGet(this, _MCPWebBridgeParty_connectionSessionIds, "f").set(connection.id, sessionId);
265
+ const handlers = __classPrivateFieldGet(this, _MCPWebBridgeParty_core, "f").getHandlers();
266
+ handlers.onWebSocketConnect(sessionId, wrapped, url);
267
+ }
268
+ /**
269
+ * Handle incoming WebSocket messages.
270
+ */
271
+ async onMessage(message, sender) {
272
+ const sessionId = __classPrivateFieldGet(this, _MCPWebBridgeParty_connectionSessionIds, "f").get(sender.id);
273
+ const wrapped = __classPrivateFieldGet(this, _MCPWebBridgeParty_connections, "f").get(sender.id);
274
+ if (!sessionId || !wrapped) {
275
+ return;
276
+ }
277
+ // Dispatch to message handlers on the wrapper
278
+ wrapped._dispatchMessage(message);
279
+ // Notify the bridge core
280
+ const handlers = __classPrivateFieldGet(this, _MCPWebBridgeParty_core, "f").getHandlers();
281
+ handlers.onWebSocketMessage(sessionId, wrapped, message);
282
+ }
283
+ /**
284
+ * Handle WebSocket connection close.
285
+ */
286
+ async onClose(connection) {
287
+ const sessionId = __classPrivateFieldGet(this, _MCPWebBridgeParty_connectionSessionIds, "f").get(connection.id);
288
+ if (sessionId) {
289
+ const handlers = __classPrivateFieldGet(this, _MCPWebBridgeParty_core, "f").getHandlers();
290
+ handlers.onWebSocketClose(sessionId);
291
+ }
292
+ __classPrivateFieldGet(this, _MCPWebBridgeParty_connections, "f").delete(connection.id);
293
+ __classPrivateFieldGet(this, _MCPWebBridgeParty_connectionSessionIds, "f").delete(connection.id);
294
+ }
295
+ /**
296
+ * Handle WebSocket errors.
297
+ */
298
+ async onError(connection, error) {
299
+ const sessionId = __classPrivateFieldGet(this, _MCPWebBridgeParty_connectionSessionIds, "f").get(connection.id);
300
+ console.error(`WebSocket error for session ${sessionId}:`, error);
301
+ }
302
+ /**
303
+ * Handle HTTP requests (MCP JSON-RPC, query endpoints).
304
+ */
305
+ async onRequest(request) {
306
+ const wrappedReq = wrapPartyRequest(request);
307
+ const handlers = __classPrivateFieldGet(this, _MCPWebBridgeParty_core, "f").getHandlers();
308
+ const httpResponse = await handlers.onHttpRequest(wrappedReq);
309
+ // Check if this is an SSE response
310
+ if (isSSEResponse(httpResponse)) {
311
+ // Create a ReadableStream for SSE
312
+ const stream = new ReadableStream({
313
+ start(controller) {
314
+ // Create writer function that sends SSE-formatted data
315
+ const writer = (data) => {
316
+ controller.enqueue(new TextEncoder().encode(`data: ${data}\n\n`));
317
+ };
318
+ // Set up the SSE stream
319
+ httpResponse.setup(writer, () => {
320
+ controller.close();
321
+ });
322
+ // Keep connection alive with periodic comments
323
+ const keepAlive = setInterval(() => {
324
+ try {
325
+ controller.enqueue(new TextEncoder().encode(': keepalive\n\n'));
326
+ }
327
+ catch {
328
+ clearInterval(keepAlive);
329
+ }
330
+ }, 30000);
331
+ },
332
+ });
333
+ return new Response(stream, {
334
+ status: httpResponse.status,
335
+ headers: httpResponse.headers,
336
+ });
337
+ }
338
+ return new Response(httpResponse.body, {
339
+ status: httpResponse.status,
340
+ headers: httpResponse.headers,
341
+ });
342
+ }
343
+ /**
344
+ * Handle PartyKit alarms for scheduled tasks.
345
+ * @see https://docs.partykit.io/guides/scheduling-tasks-with-alarms/
346
+ */
347
+ async onAlarm() {
348
+ await __classPrivateFieldGet(this, _MCPWebBridgeParty_scheduler, "f").handleAlarm();
349
+ }
350
+ },
351
+ _MCPWebBridgeParty_room = new WeakMap(),
352
+ _MCPWebBridgeParty_core = new WeakMap(),
353
+ _MCPWebBridgeParty_scheduler = new WeakMap(),
354
+ _MCPWebBridgeParty_connections = new WeakMap(),
355
+ _MCPWebBridgeParty_connectionSessionIds = new WeakMap(),
356
+ _a;
357
+ }
358
+ /**
359
+ * Pre-configured bridge class for direct export.
360
+ * Use `createPartyKitBridge()` if you need custom configuration.
361
+ *
362
+ * @example
363
+ * ```typescript
364
+ * // For simple cases where you configure via environment
365
+ * export { MCPWebBridgeParty } from '@mcp-web/bridge';
366
+ * ```
367
+ */
368
+ export const MCPWebBridgeParty = createPartyKitBridge({
369
+ name: 'MCP Web Bridge',
370
+ description: 'MCP Web bridge server on PartyKit',
371
+ });
372
+ //# sourceMappingURL=partykit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partykit.js","sourceRoot":"","sources":["../../src/adapters/partykit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env node
2
+ import { type MCPWebConfig } from '@mcp-web/types';
3
+ export declare class MCPWebBridge {
4
+ #private;
5
+ constructor(config?: MCPWebConfig);
6
+ private setupWebSocketServer;
7
+ private setupMCPServer;
8
+ private handleFrontendMessage;
9
+ private handleAuthentication;
10
+ private handleToolRegistration;
11
+ private handleActivity;
12
+ private handleQueryCancel;
13
+ private handleQuery;
14
+ private handleQueryProgressEndpoint;
15
+ private handleQueryCompleteEndpoint;
16
+ private handleQueryFailEndpoint;
17
+ private handleQueryCancelEndpoint;
18
+ private handleMCPRequest;
19
+ private getVersion;
20
+ private handleInitialize;
21
+ private getSessionAndSessionId;
22
+ private getSessionFromMetaParams;
23
+ private createSessionNotFoundError;
24
+ private handleToolsList;
25
+ private handleToolCall;
26
+ private handleResourcesList;
27
+ private handleResourceRead;
28
+ private listSessions;
29
+ private handlePromptsList;
30
+ private forwardToolCallToSession;
31
+ private sendMCPResponse;
32
+ private sendMCPError;
33
+ /**
34
+ * Close the bridge servers and cleanup all connections
35
+ */
36
+ close(): Promise<void>;
37
+ }
38
+ //# sourceMappingURL=bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":";AAMA,OAAO,EAOL,KAAK,YAAY,EAyBlB,MAAM,gBAAgB,CAAC;AAiDxB,qBAAa,YAAY;;gBAarB,MAAM,GAAE,YAKP;IAmBH,OAAO,CAAC,oBAAoB;IA6C5B,OAAO,CAAC,cAAc;IA6EtB,OAAO,CAAC,qBAAqB;IA2B7B,OAAO,CAAC,oBAAoB;IAkD5B,OAAO,CAAC,sBAAsB;IAY9B,OAAO,CAAC,cAAc;YAOR,iBAAiB;YA8BjB,WAAW;IAiFzB,OAAO,CAAC,2BAA2B;IA0BnC,OAAO,CAAC,2BAA2B;IAuDnC,OAAO,CAAC,uBAAuB;IA+B/B,OAAO,CAAC,yBAAyB;YAsCnB,gBAAgB;IAwF9B,OAAO,CAAC,UAAU;YAaJ,gBAAgB;IAiB9B,OAAO,CAAC,sBAAsB;IAwB9B,OAAO,CAAC,wBAAwB;IAShC,OAAO,CAAC,0BAA0B;YAWpB,eAAe;YA6Df,cAAc;YA8Dd,mBAAmB;YA6CnB,kBAAkB;IA0BhC,OAAO,CAAC,YAAY;YAaN,iBAAiB;YA+BjB,wBAAwB;IAkFtC,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,YAAY;IA2FpB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAiD7B"}