@j0hanz/fetch-url-mcp 1.10.23 → 1.10.25
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/dist/http/native.d.ts.map +1 -1
- package/dist/http/native.js +85 -66
- package/dist/lib/core.d.ts.map +1 -1
- package/dist/lib/core.js +48 -14
- package/dist/lib/dom-prep.d.ts +1 -0
- package/dist/lib/dom-prep.d.ts.map +1 -1
- package/dist/lib/dom-prep.js +103 -98
- package/dist/lib/fetch-pipeline.d.ts +2 -2
- package/dist/lib/fetch-pipeline.d.ts.map +1 -1
- package/dist/lib/fetch-pipeline.js +13 -6
- package/dist/lib/http.d.ts.map +1 -1
- package/dist/lib/http.js +43 -34
- package/dist/lib/task-handlers.js +1 -1
- package/dist/lib/url.d.ts +3 -0
- package/dist/lib/url.d.ts.map +1 -1
- package/dist/lib/url.js +45 -53
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js +2 -1
- package/dist/schemas.js +1 -1
- package/dist/tasks/execution.d.ts.map +1 -1
- package/dist/tasks/execution.js +1 -1
- package/dist/tasks/manager.d.ts +1 -17
- package/dist/tasks/manager.d.ts.map +1 -1
- package/dist/tasks/manager.js +27 -49
- package/dist/tasks/registry.d.ts +18 -0
- package/dist/tasks/registry.d.ts.map +1 -0
- package/dist/tasks/registry.js +28 -0
- package/dist/tools/fetch-url.d.ts +7 -6
- package/dist/tools/fetch-url.d.ts.map +1 -1
- package/dist/tools/fetch-url.js +108 -106
- package/dist/transform/html-translators.d.ts +1 -1
- package/dist/transform/html-translators.d.ts.map +1 -1
- package/dist/transform/html-translators.js +301 -320
- package/dist/transform/metadata.d.ts.map +1 -1
- package/dist/transform/metadata.js +5 -10
- package/dist/transform/next-flight.d.ts.map +1 -1
- package/dist/transform/next-flight.js +131 -63
- package/dist/transform/transform.d.ts.map +1 -1
- package/dist/transform/transform.js +2 -1
- package/dist/transform/worker-pool.d.ts +1 -0
- package/dist/transform/worker-pool.d.ts.map +1 -1
- package/dist/transform/worker-pool.js +29 -35
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../src/http/native.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../src/http/native.ts"],"names":[],"mappings":"AAgoCA,wBAAsB,eAAe,IAAI,OAAO,CAAC;IAC/C,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAAC,CA0DD"}
|
package/dist/http/native.js
CHANGED
|
@@ -157,15 +157,14 @@ class McpSessionGateway {
|
|
|
157
157
|
const method = typeof body.method === 'string' ? body.method : null;
|
|
158
158
|
const isInitializedMethod = method !== null && isInitializedNotification(method);
|
|
159
159
|
const isInitNotification = isInitializedMethod && body.id === undefined;
|
|
160
|
-
const sessionId = getMcpSessionId(ctx.req);
|
|
161
160
|
if (isInitializedMethod && !isInitNotification) {
|
|
162
161
|
sendError(ctx.res, -32600, 'notifications/initialized must be sent as a notification', 400, requestId);
|
|
163
162
|
return null;
|
|
164
163
|
}
|
|
165
|
-
const
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
164
|
+
const sessionState = this.getOptionalAuthenticatedSession(ctx, requestId);
|
|
165
|
+
if (!sessionState)
|
|
166
|
+
return null;
|
|
167
|
+
const { sessionId, session } = sessionState;
|
|
169
168
|
if (!this.ensurePostSessionAccess({
|
|
170
169
|
ctx,
|
|
171
170
|
sessionId,
|
|
@@ -248,14 +247,25 @@ class McpSessionGateway {
|
|
|
248
247
|
this.store.touch(sessionId);
|
|
249
248
|
return session.transport;
|
|
250
249
|
}
|
|
251
|
-
|
|
252
|
-
const sessionId =
|
|
250
|
+
getOptionalAuthenticatedSession(ctx, requestId = null) {
|
|
251
|
+
const sessionId = getMcpSessionId(ctx.req);
|
|
253
252
|
if (!sessionId)
|
|
254
|
-
return null;
|
|
253
|
+
return { sessionId: null, session: undefined };
|
|
255
254
|
const authFingerprint = buildAuthFingerprint(ctx.auth);
|
|
256
255
|
const session = this.getAuthenticatedSessionById(sessionId, authFingerprint, ctx.res, requestId);
|
|
257
256
|
if (!session)
|
|
258
257
|
return null;
|
|
258
|
+
return { sessionId, session };
|
|
259
|
+
}
|
|
260
|
+
getRequiredAuthenticatedSession(ctx, requestId = null, options) {
|
|
261
|
+
const state = this.getOptionalAuthenticatedSession(ctx, requestId);
|
|
262
|
+
if (!state)
|
|
263
|
+
return null;
|
|
264
|
+
const { sessionId, session } = state;
|
|
265
|
+
if (!sessionId || !session) {
|
|
266
|
+
sendError(ctx.res, -32600, 'Missing session ID', 400, requestId);
|
|
267
|
+
return null;
|
|
268
|
+
}
|
|
259
269
|
if (!this.ensureSessionProtocolVersion(ctx, session))
|
|
260
270
|
return null;
|
|
261
271
|
if (options?.requireInitialized && !session.protocolInitialized) {
|
|
@@ -264,13 +274,6 @@ class McpSessionGateway {
|
|
|
264
274
|
}
|
|
265
275
|
return { sessionId, session };
|
|
266
276
|
}
|
|
267
|
-
getRequiredSessionId(req, res, requestId = null) {
|
|
268
|
-
const sessionId = getMcpSessionId(req);
|
|
269
|
-
if (sessionId)
|
|
270
|
-
return sessionId;
|
|
271
|
-
sendError(res, -32600, 'Missing session ID', 400, requestId);
|
|
272
|
-
return null;
|
|
273
|
-
}
|
|
274
277
|
getAuthenticatedSessionById(sessionId, authFingerprint, res, requestId = null) {
|
|
275
278
|
const session = this.store.get(sessionId);
|
|
276
279
|
if (!session) {
|
|
@@ -296,50 +299,29 @@ class McpSessionGateway {
|
|
|
296
299
|
if (sessionId)
|
|
297
300
|
this.store.touch(sessionId);
|
|
298
301
|
}
|
|
299
|
-
|
|
300
|
-
const authFingerprint = buildAuthFingerprint(ctx.auth);
|
|
301
|
-
if (!authFingerprint) {
|
|
302
|
-
sendError(ctx.res, -32603, 'Missing auth context', 500, requestId);
|
|
303
|
-
return null;
|
|
304
|
-
}
|
|
305
|
-
if (!this.reserveCapacity(ctx.res, requestId))
|
|
306
|
-
return null;
|
|
307
|
-
const tracker = createSlotTracker(this.store);
|
|
308
|
-
const newSessionId = randomUUID();
|
|
309
|
-
let sessionServer;
|
|
310
|
-
try {
|
|
311
|
-
sessionServer = await this.createSessionServer();
|
|
312
|
-
}
|
|
313
|
-
catch (error) {
|
|
314
|
-
tracker.releaseSlot();
|
|
315
|
-
throw error;
|
|
316
|
-
}
|
|
317
|
-
const transportImpl = new StreamableHTTPServerTransport({
|
|
318
|
-
sessionIdGenerator: () => newSessionId,
|
|
319
|
-
});
|
|
320
|
-
const unpublishedSession = {
|
|
321
|
-
server: sessionServer,
|
|
322
|
-
transport: transportImpl,
|
|
323
|
-
};
|
|
302
|
+
createSessionInitTimeout(sessionId, tracker, unpublishedSession) {
|
|
324
303
|
const initTimeout = setTimeout(() => {
|
|
325
|
-
const session = this.store.get(
|
|
304
|
+
const session = this.store.get(sessionId);
|
|
326
305
|
if (session) {
|
|
327
306
|
if (session.protocolInitialized) {
|
|
328
|
-
this.clearSessionInitTimeout(
|
|
307
|
+
this.clearSessionInitTimeout(sessionId);
|
|
329
308
|
return;
|
|
330
309
|
}
|
|
331
|
-
this.cleanupSessionRecord(
|
|
310
|
+
this.cleanupSessionRecord(sessionId, 'session-init-timeout');
|
|
332
311
|
return;
|
|
333
312
|
}
|
|
334
313
|
tracker.releaseSlot();
|
|
335
314
|
void teardownUnregisteredSessionResources(unpublishedSession, 'session-init-timeout');
|
|
336
315
|
}, config.server.sessionInitTimeoutMs);
|
|
337
316
|
initTimeout.unref();
|
|
317
|
+
return initTimeout;
|
|
318
|
+
}
|
|
319
|
+
async connectTransport(sessionServer, transportImpl, initTimeout, tracker, unpublishedSession, sessionId) {
|
|
338
320
|
const connectState = { transportClosed: false };
|
|
339
321
|
transportImpl.onclose = () => {
|
|
340
322
|
connectState.transportClosed = true;
|
|
341
323
|
clearTimeout(initTimeout);
|
|
342
|
-
this.sessionInitTimeouts.delete(
|
|
324
|
+
this.sessionInitTimeouts.delete(sessionId);
|
|
343
325
|
tracker.releaseSlot();
|
|
344
326
|
};
|
|
345
327
|
try {
|
|
@@ -352,8 +334,37 @@ class McpSessionGateway {
|
|
|
352
334
|
void teardownUnregisteredSessionResources(unpublishedSession, 'session-connect-failed');
|
|
353
335
|
throw err;
|
|
354
336
|
}
|
|
337
|
+
return !connectState.transportClosed;
|
|
338
|
+
}
|
|
339
|
+
async createNewSession(ctx, requestId, negotiatedProtocolVersion) {
|
|
340
|
+
const authFingerprint = buildAuthFingerprint(ctx.auth);
|
|
341
|
+
if (!authFingerprint) {
|
|
342
|
+
sendError(ctx.res, -32603, 'Missing auth context', 500, requestId);
|
|
343
|
+
return null;
|
|
344
|
+
}
|
|
345
|
+
if (!this.reserveCapacity(ctx.res, requestId))
|
|
346
|
+
return null;
|
|
347
|
+
const tracker = createSlotTracker(this.store);
|
|
348
|
+
const newSessionId = randomUUID();
|
|
349
|
+
let sessionServer;
|
|
350
|
+
try {
|
|
351
|
+
sessionServer = await this.createSessionServer();
|
|
352
|
+
}
|
|
353
|
+
catch (error) {
|
|
354
|
+
tracker.releaseSlot();
|
|
355
|
+
throw error;
|
|
356
|
+
}
|
|
357
|
+
const transportImpl = new StreamableHTTPServerTransport({
|
|
358
|
+
sessionIdGenerator: () => newSessionId,
|
|
359
|
+
});
|
|
360
|
+
const unpublishedSession = {
|
|
361
|
+
server: sessionServer,
|
|
362
|
+
transport: transportImpl,
|
|
363
|
+
};
|
|
364
|
+
const initTimeout = this.createSessionInitTimeout(newSessionId, tracker, unpublishedSession);
|
|
365
|
+
const isConnected = await this.connectTransport(sessionServer, transportImpl, initTimeout, tracker, unpublishedSession, newSessionId);
|
|
355
366
|
tracker.releaseSlot();
|
|
356
|
-
if (
|
|
367
|
+
if (!isConnected) {
|
|
357
368
|
void teardownUnregisteredSessionResources(unpublishedSession, 'session-closed-during-connect');
|
|
358
369
|
return null;
|
|
359
370
|
}
|
|
@@ -533,29 +544,36 @@ class HttpDispatcher {
|
|
|
533
544
|
// ---------------------------------------------------------------------------
|
|
534
545
|
// Body parse error responses
|
|
535
546
|
// ---------------------------------------------------------------------------
|
|
547
|
+
const DEFAULT_BODY_ERROR = {
|
|
548
|
+
statusCode: 400,
|
|
549
|
+
mcpCode: -32700,
|
|
550
|
+
mcpMsg: 'Parse error',
|
|
551
|
+
restMsg: 'Invalid JSON',
|
|
552
|
+
};
|
|
553
|
+
const BODY_PARSE_ERRORS = {
|
|
554
|
+
'payload-too-large': {
|
|
555
|
+
statusCode: 413,
|
|
556
|
+
mcpCode: -32600,
|
|
557
|
+
mcpMsg: 'Request body too large',
|
|
558
|
+
restMsg: 'Payload too large',
|
|
559
|
+
},
|
|
560
|
+
'read-failed': {
|
|
561
|
+
statusCode: 400,
|
|
562
|
+
mcpCode: -32600,
|
|
563
|
+
mcpMsg: 'Request body read failed',
|
|
564
|
+
restMsg: 'Invalid JSON',
|
|
565
|
+
},
|
|
566
|
+
default: DEFAULT_BODY_ERROR,
|
|
567
|
+
};
|
|
536
568
|
function sendBodyParseError(ctx, bodyErrorKind, rawReq) {
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
sendError(ctx.res, -32600, 'Request body read failed', 400, null);
|
|
545
|
-
}
|
|
546
|
-
break;
|
|
547
|
-
case 'invalid-json':
|
|
548
|
-
default:
|
|
549
|
-
sendError(ctx.res, -32700, 'Parse error', 400, null);
|
|
550
|
-
break;
|
|
569
|
+
const errorDef = BODY_PARSE_ERRORS[bodyErrorKind ?? 'default'] ?? DEFAULT_BODY_ERROR;
|
|
570
|
+
if (bodyErrorKind !== 'read-failed' || !rawReq.destroyed) {
|
|
571
|
+
if (ctx.url.pathname === '/mcp') {
|
|
572
|
+
sendError(ctx.res, errorDef.mcpCode, errorDef.mcpMsg, errorDef.statusCode, null);
|
|
573
|
+
}
|
|
574
|
+
else {
|
|
575
|
+
sendJson(ctx.res, errorDef.statusCode, { error: errorDef.restMsg });
|
|
551
576
|
}
|
|
552
|
-
}
|
|
553
|
-
else {
|
|
554
|
-
sendJson(ctx.res, bodyErrorKind === 'payload-too-large' ? 413 : 400, {
|
|
555
|
-
error: bodyErrorKind === 'payload-too-large'
|
|
556
|
-
? 'Payload too large'
|
|
557
|
-
: 'Invalid JSON',
|
|
558
|
-
});
|
|
559
577
|
}
|
|
560
578
|
drainRequest(rawReq);
|
|
561
579
|
}
|
|
@@ -619,6 +637,7 @@ class HttpRequestPipeline {
|
|
|
619
637
|
return false;
|
|
620
638
|
}
|
|
621
639
|
if (!this.rateLimiter.check(ctx)) {
|
|
640
|
+
sendJson(ctx.res, 429, { error: 'Too Many Requests' });
|
|
622
641
|
drainRequest(rawReq);
|
|
623
642
|
return false;
|
|
624
643
|
}
|
package/dist/lib/core.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/lib/core.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/lib/core.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/core.js
CHANGED
|
@@ -584,10 +584,23 @@ class InMemoryCacheStore {
|
|
|
584
584
|
const now = Date.now();
|
|
585
585
|
const expiresAtMs = now + this.ttlMs;
|
|
586
586
|
const entrySize = content.length;
|
|
587
|
+
// Reject oversized entries before deleting the old one to avoid data loss
|
|
588
|
+
if (entrySize > this.maxBytes) {
|
|
589
|
+
logWarn('Cache entry exceeds max size', {
|
|
590
|
+
key: cacheKey,
|
|
591
|
+
size: entrySize,
|
|
592
|
+
max: this.maxBytes,
|
|
593
|
+
});
|
|
594
|
+
return;
|
|
595
|
+
}
|
|
596
|
+
const isUpdate = this.entries.has(cacheKey);
|
|
597
|
+
if (isUpdate) {
|
|
598
|
+
this.delete(cacheKey);
|
|
599
|
+
}
|
|
587
600
|
const capacity = this.ensureCapacity(cacheKey, entrySize);
|
|
588
601
|
if (!capacity.ok)
|
|
589
602
|
return;
|
|
590
|
-
let listChanged = !
|
|
603
|
+
let listChanged = !isUpdate || capacity.listChanged;
|
|
591
604
|
const entry = {
|
|
592
605
|
url: metadata.url,
|
|
593
606
|
content,
|
|
@@ -596,9 +609,6 @@ class InMemoryCacheStore {
|
|
|
596
609
|
expiresAtMs,
|
|
597
610
|
...(metadata.title ? { title: metadata.title } : {}),
|
|
598
611
|
};
|
|
599
|
-
if (this.entries.has(cacheKey)) {
|
|
600
|
-
this.delete(cacheKey);
|
|
601
|
-
}
|
|
602
612
|
this.entries.set(cacheKey, entry);
|
|
603
613
|
this.currentBytes += entrySize;
|
|
604
614
|
// Eviction (LRU: first insertion-order key) - Count based
|
|
@@ -1015,6 +1025,7 @@ export { composeCloseHandlers, createSessionStore, createSlotTracker, ensureSess
|
|
|
1015
1025
|
const MIN_CLEANUP_INTERVAL_MS = 10_000;
|
|
1016
1026
|
const MAX_CLEANUP_INTERVAL_MS = 60_000;
|
|
1017
1027
|
const SESSION_CLOSE_BATCH_SIZE = 10;
|
|
1028
|
+
const SESSION_CLOSE_TIMEOUT_MS = 5_000;
|
|
1018
1029
|
function getCleanupIntervalMs(sessionTtlMs) {
|
|
1019
1030
|
return Math.min(Math.max(Math.floor(sessionTtlMs / 2), MIN_CLEANUP_INTERVAL_MS), MAX_CLEANUP_INTERVAL_MS);
|
|
1020
1031
|
}
|
|
@@ -1080,23 +1091,46 @@ class SessionCleanupLoop {
|
|
|
1080
1091
|
});
|
|
1081
1092
|
}
|
|
1082
1093
|
}
|
|
1094
|
+
const closePromise = Promise.allSettled([
|
|
1095
|
+
session.transport.close(),
|
|
1096
|
+
session.server.close(),
|
|
1097
|
+
]);
|
|
1098
|
+
let timeoutId;
|
|
1099
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
1100
|
+
timeoutId = setTimeout(() => {
|
|
1101
|
+
reject(new Error('Session close timed out'));
|
|
1102
|
+
}, SESSION_CLOSE_TIMEOUT_MS);
|
|
1103
|
+
timeoutId.unref();
|
|
1104
|
+
});
|
|
1083
1105
|
try {
|
|
1084
|
-
|
|
1106
|
+
const [transportResult, serverResult] = await Promise.race([
|
|
1107
|
+
closePromise,
|
|
1108
|
+
timeoutPromise,
|
|
1109
|
+
]);
|
|
1110
|
+
if (transportResult.status === 'rejected') {
|
|
1111
|
+
this.logCloseFailure('transport', transportResult.reason);
|
|
1112
|
+
}
|
|
1113
|
+
if (serverResult.status === 'rejected') {
|
|
1114
|
+
this.logCloseFailure('server', serverResult.reason);
|
|
1115
|
+
}
|
|
1085
1116
|
}
|
|
1086
1117
|
catch (error) {
|
|
1087
|
-
logWarn('
|
|
1118
|
+
logWarn('Session close operation failed or timed out', {
|
|
1088
1119
|
error: getErrorMessage(error),
|
|
1089
1120
|
});
|
|
1090
1121
|
}
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
if (transportResult.status === 'rejected') {
|
|
1096
|
-
this.logCloseFailure('transport', transportResult.reason);
|
|
1122
|
+
finally {
|
|
1123
|
+
if (timeoutId) {
|
|
1124
|
+
clearTimeout(timeoutId);
|
|
1125
|
+
}
|
|
1097
1126
|
}
|
|
1098
|
-
|
|
1099
|
-
|
|
1127
|
+
try {
|
|
1128
|
+
unregisterMcpSessionServer(sessionId);
|
|
1129
|
+
}
|
|
1130
|
+
catch (error) {
|
|
1131
|
+
logWarn('Failed to unregister session server', {
|
|
1132
|
+
error: getErrorMessage(error),
|
|
1133
|
+
});
|
|
1100
1134
|
}
|
|
1101
1135
|
}
|
|
1102
1136
|
logCloseFailure(target, error) {
|
package/dist/lib/dom-prep.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ export declare function serializeDocumentForMarkdown(document: Document, fallbac
|
|
|
7
7
|
export declare function normalizeTabContent(document: Document): void;
|
|
8
8
|
export declare function surfaceCodeEditorContent(document: Document): void;
|
|
9
9
|
export declare function stripDocsControls(document: Document): void;
|
|
10
|
+
export declare function stripScreenReaderText(document: Document): void;
|
|
10
11
|
export declare function runDocsControlPass(document: Document): void;
|
|
11
12
|
export declare function prepareDocumentForMarkdown(document: Document, baseUrl?: string, signal?: AbortSignal): void;
|
|
12
13
|
export declare function removeNoiseFromHtml(html: string, document?: Document, baseUrl?: string, signal?: AbortSignal): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dom-prep.d.ts","sourceRoot":"","sources":["../../src/lib/dom-prep.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"dom-prep.d.ts","sourceRoot":"","sources":["../../src/lib/dom-prep.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AA4mB9D,eAAO,MAAM,sBAAsB,QAAmB,CAAC;AAyCvD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CA6B9D;AAuBD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAY/D;AAED,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,MAAM,GACf,MAAM,CASR;AA0CD,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAG5D;AA0RD,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CA2BjE;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAE1D;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAY9D;AAWD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAQ3D;AAuDD,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,QAAQ,EAClB,OAAO,CAAC,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,WAAW,GACnB,IAAI,CAON;AA4BD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,QAAQ,EACnB,OAAO,CAAC,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,WAAW,GACnB,MAAM,CAcR;AA0ED,wBAAgB,oBAAoB,CAClC,cAAc,EAAE,MAAM,GAAG,QAAQ,GAChC,MAAM,CAaR;AAiMD,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,gBAAgB,EACzB,QAAQ,EAAE,QAAQ,GACjB,QAAQ,GAAG,IAAI,CA8BjB"}
|