@pix3/agent-bridge 0.2.0 → 0.2.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/README.md +75 -75
- package/dist/cli.js +171 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.js +140 -0
- package/dist/config.js.map +1 -0
- package/dist/index.js +293 -0
- package/dist/index.js.map +1 -0
- package/dist/proxy.js +45 -0
- package/dist/proxy.js.map +1 -0
- package/dist/sessions.js +517 -0
- package/dist/sessions.js.map +1 -0
- package/dist/wire.js +121 -0
- package/dist/wire.js.map +1 -0
- package/package.json +47 -38
- package/src/cli.ts +195 -195
- package/src/config.ts +179 -179
- package/src/index.ts +350 -350
- package/src/proxy.ts +68 -68
- package/src/sessions.ts +597 -597
- package/src/wire.ts +161 -161
- package/tsconfig.json +16 -16
package/dist/index.js
ADDED
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Pix3AgentBridge — a LOCAL, personal bridge between the pix3 editor's in-editor agent and the LLM
|
|
4
|
+
* providers that a browser cannot reach directly.
|
|
5
|
+
*
|
|
6
|
+
* It does two jobs, both on 127.0.0.1:
|
|
7
|
+
*
|
|
8
|
+
* 1. Agent-SDK lane (`POST /v1/messages`, `GET /v1/models`): serves the Anthropic Messages wire
|
|
9
|
+
* shape from a real Claude Agent SDK (Claude Code / Pro/MAX subscription) session — no API key,
|
|
10
|
+
* usage draws from the subscription. This is the original bridge behaviour (see sessions.ts).
|
|
11
|
+
*
|
|
12
|
+
* 2. Provider proxy lane (`ALL /providers/:id/*`, `GET /v1/providers`): a credential-injecting
|
|
13
|
+
* reverse proxy for metered providers (OpenAI, Anthropic API, OpenCode Zen, custom
|
|
14
|
+
* OpenAI-compatible endpoints). The editor sends requests with only the pairing token; the
|
|
15
|
+
* bridge injects the provider key it stores in `~/.pix3/agent-bridge.json` and forwards to the
|
|
16
|
+
* fixed upstream. Keys never enter the browser. Providers are managed with the CLI:
|
|
17
|
+
*
|
|
18
|
+
* pix3-agent-bridge provider add openai --key sk-...
|
|
19
|
+
* pix3-agent-bridge provider list
|
|
20
|
+
*
|
|
21
|
+
* Usage:
|
|
22
|
+
* npx @pix3/agent-bridge (requires a `claude login`-ed Claude Code for lane 1)
|
|
23
|
+
* npx @pix3/agent-bridge provider add openai --key sk-...
|
|
24
|
+
* Options: --port <n> (default 8484), --origin <url> (repeatable, extra allowed origins)
|
|
25
|
+
*
|
|
26
|
+
* Security model (defense in depth for a localhost service):
|
|
27
|
+
* - binds to 127.0.0.1 only;
|
|
28
|
+
* - pairing token (generated once, stored in ~/.pix3/agent-bridge.json, printed on start) must
|
|
29
|
+
* accompany every API request (x-api-key / Authorization) — blocks other local processes/pages;
|
|
30
|
+
* - browser `Origin` allowlist (editor.pix3.dev / cloud.pix3.dev + local dev) — anything else 403;
|
|
31
|
+
* - `Host` header must be localhost — blocks DNS-rebinding;
|
|
32
|
+
* - the proxy lane never takes the upstream host from the client (fixed per provider) → no SSRF,
|
|
33
|
+
* and forwards only content-type + the injected key → the pairing token never leaks upstream;
|
|
34
|
+
* - the Agent-SDK session runs with zero built-in tools — the model can only call pix3 editor
|
|
35
|
+
* tools, never this machine's shell or filesystem.
|
|
36
|
+
*/
|
|
37
|
+
import http from 'node:http';
|
|
38
|
+
import { SessionManager } from "./sessions.js";
|
|
39
|
+
import { HttpError, parseMessagesRequest } from "./wire.js";
|
|
40
|
+
import { loadConfig, RESERVED_PROVIDER_IDS } from "./config.js";
|
|
41
|
+
import { runProviderCommand, usage } from "./cli.js";
|
|
42
|
+
import { forwardToProvider } from "./proxy.js";
|
|
43
|
+
const MAX_BODY_BYTES = 64 * 1024 * 1024;
|
|
44
|
+
/** Discovery entry for the intrinsic Agent-SDK (subscription) lane — not part of the provider table. */
|
|
45
|
+
const AGENT_SDK_PROVIDER = {
|
|
46
|
+
id: RESERVED_PROVIDER_IDS[0],
|
|
47
|
+
label: 'Claude Code (MAX)',
|
|
48
|
+
kind: 'agent-sdk',
|
|
49
|
+
};
|
|
50
|
+
function modelEntry(id, label, description, maxOutputTokens, contextWindow) {
|
|
51
|
+
return {
|
|
52
|
+
id,
|
|
53
|
+
label,
|
|
54
|
+
description,
|
|
55
|
+
capabilities: {
|
|
56
|
+
supportsTools: true,
|
|
57
|
+
supportsImages: true,
|
|
58
|
+
supportsSystemPrompt: true,
|
|
59
|
+
maxOutputTokens,
|
|
60
|
+
contextWindow,
|
|
61
|
+
},
|
|
62
|
+
pricing: { inputPer1M: 0, outputPer1M: 0 },
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/** Static catalog served to the Agent-SDK lane's `GET /v1/models` — subscription models, $0 marginal cost. */
|
|
66
|
+
const AGENT_SDK_MODELS = [
|
|
67
|
+
modelEntry('claude-fable-5', 'Claude Fable 5 (MAX)', 'Most capable — via Claude Code subscription.', 32000, 1_000_000),
|
|
68
|
+
modelEntry('claude-opus-4-8', 'Claude Opus 4.8 (MAX)', 'Highly capable — via Claude Code subscription.', 32000, 1_000_000),
|
|
69
|
+
modelEntry('claude-sonnet-5', 'Claude Sonnet 5 (MAX)', 'Balanced speed and quality — via Claude Code subscription.', 32000, 1_000_000),
|
|
70
|
+
modelEntry('claude-haiku-4-5', 'Claude Haiku 4.5 (MAX)', 'Fastest — via Claude Code subscription.', 16000, 200_000),
|
|
71
|
+
];
|
|
72
|
+
const log = (line) => {
|
|
73
|
+
console.log(`${new Date().toISOString().slice(11, 19)} ${line}`);
|
|
74
|
+
};
|
|
75
|
+
const hostAllowed = (req) => {
|
|
76
|
+
const host = (req.headers.host ?? '').toLowerCase();
|
|
77
|
+
return (host.startsWith('localhost:') ||
|
|
78
|
+
host.startsWith('127.0.0.1:') ||
|
|
79
|
+
host === 'localhost' ||
|
|
80
|
+
host === '127.0.0.1');
|
|
81
|
+
};
|
|
82
|
+
const readBody = (req) => new Promise((resolve, reject) => {
|
|
83
|
+
const chunks = [];
|
|
84
|
+
let size = 0;
|
|
85
|
+
req.on('data', (chunk) => {
|
|
86
|
+
size += chunk.length;
|
|
87
|
+
if (size > MAX_BODY_BYTES) {
|
|
88
|
+
reject(new HttpError(413, 'Request body too large.'));
|
|
89
|
+
req.destroy();
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
chunks.push(chunk);
|
|
93
|
+
});
|
|
94
|
+
req.on('end', () => resolve(Buffer.concat(chunks)));
|
|
95
|
+
req.on('error', reject);
|
|
96
|
+
});
|
|
97
|
+
const startServer = (config) => {
|
|
98
|
+
const manager = new SessionManager(log);
|
|
99
|
+
const withCors = (corsOrigin, extra = {}) => {
|
|
100
|
+
const headers = { 'Cache-Control': 'no-store', ...extra };
|
|
101
|
+
if (corsOrigin) {
|
|
102
|
+
headers['Access-Control-Allow-Origin'] = corsOrigin;
|
|
103
|
+
headers['Vary'] = 'Origin';
|
|
104
|
+
}
|
|
105
|
+
return headers;
|
|
106
|
+
};
|
|
107
|
+
const sendJson = (res, status, body, corsOrigin) => {
|
|
108
|
+
res.writeHead(status, withCors(corsOrigin, { 'Content-Type': 'application/json; charset=utf-8' }));
|
|
109
|
+
res.end(JSON.stringify(body));
|
|
110
|
+
};
|
|
111
|
+
const sendError = (res, status, message, corsOrigin) => {
|
|
112
|
+
sendJson(res, status, { type: 'error', error: { type: 'invalid_request_error', message } }, corsOrigin);
|
|
113
|
+
};
|
|
114
|
+
const server = http.createServer(async (req, res) => {
|
|
115
|
+
const rawUrl = req.url ?? '/';
|
|
116
|
+
const qIndex = rawUrl.indexOf('?');
|
|
117
|
+
const pathname = qIndex >= 0 ? rawUrl.slice(0, qIndex) : rawUrl;
|
|
118
|
+
const query = qIndex >= 0 ? rawUrl.slice(qIndex) : '';
|
|
119
|
+
const origin = typeof req.headers.origin === 'string' ? req.headers.origin : null;
|
|
120
|
+
if (!hostAllowed(req)) {
|
|
121
|
+
sendError(res, 403, 'Forbidden host.', null);
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
if (origin && !config.origins.includes(origin)) {
|
|
125
|
+
log(`403 rejected origin ${origin}`);
|
|
126
|
+
sendError(res, 403, 'Origin not allowed.', null);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
// CORS preflight (no auth — browsers strip credentials from preflights).
|
|
130
|
+
if (req.method === 'OPTIONS') {
|
|
131
|
+
const headers = {
|
|
132
|
+
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
|
|
133
|
+
'Access-Control-Allow-Headers': req.headers['access-control-request-headers'] ??
|
|
134
|
+
'content-type, x-api-key, authorization, x-pix3-bridge-token, anthropic-version, anthropic-dangerous-direct-browser-access',
|
|
135
|
+
'Access-Control-Max-Age': '86400',
|
|
136
|
+
};
|
|
137
|
+
if (origin) {
|
|
138
|
+
headers['Access-Control-Allow-Origin'] = origin;
|
|
139
|
+
headers['Vary'] = 'Origin';
|
|
140
|
+
}
|
|
141
|
+
// Chrome Private Network Access / Local Network Access preflight opt-in.
|
|
142
|
+
if (req.headers['access-control-request-private-network'] === 'true') {
|
|
143
|
+
headers['Access-Control-Allow-Private-Network'] = 'true';
|
|
144
|
+
}
|
|
145
|
+
res.writeHead(204, headers);
|
|
146
|
+
res.end();
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (req.method === 'GET' && (pathname === '/' || pathname === '/health')) {
|
|
150
|
+
sendJson(res, 200, {
|
|
151
|
+
ok: true,
|
|
152
|
+
name: 'pix3-agent-bridge',
|
|
153
|
+
hint: 'Paste the pairing token from the bridge console into pix3 (Settings → AI Agent).',
|
|
154
|
+
}, origin);
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
// Everything below requires the pairing token (dedicated header, x-api-key, or Authorization).
|
|
158
|
+
const auth = req.headers['x-pix3-bridge-token'] ??
|
|
159
|
+
req.headers['x-api-key'] ??
|
|
160
|
+
req.headers.authorization?.replace(/^Bearer\s+/i, '');
|
|
161
|
+
if (auth !== config.token) {
|
|
162
|
+
sendError(res, 401, 'Invalid or missing bridge pairing token.', origin);
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
// Discovery: which providers this bridge can serve right now (enabled + keyed) + the SDK lane.
|
|
166
|
+
if (req.method === 'GET' && pathname === '/v1/providers') {
|
|
167
|
+
const providers = Object.entries(config.providers)
|
|
168
|
+
.filter(([, p]) => p.enabled && p.apiKey)
|
|
169
|
+
.map(([id, p]) => ({ id, label: p.label, kind: p.kind, enabled: true }));
|
|
170
|
+
sendJson(res, 200, { providers: [...providers, AGENT_SDK_PROVIDER] }, origin);
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
// Provider proxy lane: /providers/:id/<rest> → {provider.baseUrl}/<rest>
|
|
174
|
+
if (pathname.startsWith('/providers/')) {
|
|
175
|
+
const rest = pathname.slice('/providers/'.length);
|
|
176
|
+
const slash = rest.indexOf('/');
|
|
177
|
+
const providerId = slash >= 0 ? rest.slice(0, slash) : rest;
|
|
178
|
+
const restPath = slash >= 0 ? rest.slice(slash) : '/';
|
|
179
|
+
const provider = config.providers[providerId];
|
|
180
|
+
if (!provider || !provider.enabled) {
|
|
181
|
+
sendError(res, 404, `Provider "${providerId}" is not configured or is disabled.`, origin);
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
if (!provider.apiKey) {
|
|
185
|
+
sendError(res, 400, `Provider "${providerId}" has no API key. Run: pix3-agent-bridge provider set-key ${providerId} <key>`, origin);
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
try {
|
|
189
|
+
const body = req.method === 'GET' || req.method === 'HEAD' ? null : await readBody(req);
|
|
190
|
+
const result = await forwardToProvider(provider, {
|
|
191
|
+
method: req.method ?? 'GET',
|
|
192
|
+
restPath,
|
|
193
|
+
query,
|
|
194
|
+
body,
|
|
195
|
+
});
|
|
196
|
+
res.writeHead(result.status, withCors(origin, { 'Content-Type': result.contentType }));
|
|
197
|
+
res.end(result.body);
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
if (error instanceof HttpError) {
|
|
201
|
+
sendError(res, error.status, error.message, origin);
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
log(`proxy error (${providerId}): ${error instanceof Error ? error.message : String(error)}`);
|
|
205
|
+
sendError(res, 502, `Upstream request to "${providerId}" failed.`, origin);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
// Agent-SDK lane.
|
|
211
|
+
if (req.method === 'GET' && pathname === '/v1/models') {
|
|
212
|
+
sendJson(res, 200, { models: AGENT_SDK_MODELS }, origin);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
if (req.method === 'POST' && pathname === '/v1/messages') {
|
|
216
|
+
const abort = new AbortController();
|
|
217
|
+
res.on('close', () => {
|
|
218
|
+
if (!res.writableEnded)
|
|
219
|
+
abort.abort();
|
|
220
|
+
});
|
|
221
|
+
try {
|
|
222
|
+
const body = (await readBody(req)).toString('utf8');
|
|
223
|
+
const request = parseMessagesRequest(JSON.parse(body));
|
|
224
|
+
const response = await manager.handle(request, abort.signal);
|
|
225
|
+
sendJson(res, response.status, response.body, origin);
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
if (res.writableEnded || abort.signal.aborted)
|
|
229
|
+
return;
|
|
230
|
+
if (error instanceof HttpError) {
|
|
231
|
+
sendError(res, error.status === 499 ? 400 : error.status, error.message, origin);
|
|
232
|
+
}
|
|
233
|
+
else if (error instanceof SyntaxError) {
|
|
234
|
+
sendError(res, 400, 'Request body is not valid JSON.', origin);
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
log(`500: ${error instanceof Error ? (error.stack ?? error.message) : String(error)}`);
|
|
238
|
+
sendError(res, 500, error instanceof Error ? error.message : 'Internal bridge error.', origin);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
sendError(res, 404, `No route: ${req.method} ${pathname}`, origin);
|
|
244
|
+
});
|
|
245
|
+
// Long model turns must not be killed by Node's default 5-minute request timeout.
|
|
246
|
+
server.requestTimeout = 0;
|
|
247
|
+
server.headersTimeout = 60_000;
|
|
248
|
+
server.listen(config.port, '127.0.0.1', () => {
|
|
249
|
+
const enabled = Object.entries(config.providers)
|
|
250
|
+
.filter(([, p]) => p.enabled && p.apiKey)
|
|
251
|
+
.map(([id]) => id);
|
|
252
|
+
console.log('');
|
|
253
|
+
console.log(` Pix3AgentBridge listening on http://127.0.0.1:${config.port}`);
|
|
254
|
+
console.log(` Pairing token: ${config.token}`);
|
|
255
|
+
console.log(` Allowed origins: ${config.origins.join(', ')}`);
|
|
256
|
+
console.log(` Proxy providers: ${enabled.length > 0 ? enabled.join(', ') : '(none — add one: pix3-agent-bridge provider add openai --key sk-...)'}`);
|
|
257
|
+
console.log('');
|
|
258
|
+
console.log(' In pix3: Settings → AI Agent → paste the pairing token; advanced providers appear when enabled here.');
|
|
259
|
+
console.log(' Agent-SDK (MAX) lane auth comes from your Claude Code login (`claude login`).');
|
|
260
|
+
console.log('');
|
|
261
|
+
});
|
|
262
|
+
const shutdown = () => {
|
|
263
|
+
log('shutting down');
|
|
264
|
+
manager.closeAll('bridge shutting down');
|
|
265
|
+
server.close(() => process.exit(0));
|
|
266
|
+
setTimeout(() => process.exit(0), 2000).unref();
|
|
267
|
+
};
|
|
268
|
+
process.on('SIGINT', shutdown);
|
|
269
|
+
process.on('SIGTERM', shutdown);
|
|
270
|
+
};
|
|
271
|
+
const main = () => {
|
|
272
|
+
const argv = process.argv.slice(2);
|
|
273
|
+
const command = argv[0];
|
|
274
|
+
if (command === 'provider') {
|
|
275
|
+
runProviderCommand(argv.slice(1));
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
if (command === 'help' || command === '--help' || command === '-h') {
|
|
279
|
+
usage();
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
const config = loadConfig();
|
|
283
|
+
// Serve-time flag overrides (not persisted): --port, --origin (repeatable).
|
|
284
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
285
|
+
if (argv[i] === '--port' && argv[i + 1])
|
|
286
|
+
config.port = Number(argv[i + 1]);
|
|
287
|
+
if (argv[i] === '--origin' && argv[i + 1])
|
|
288
|
+
config.origins.push(argv[i + 1]);
|
|
289
|
+
}
|
|
290
|
+
startServer(config);
|
|
291
|
+
};
|
|
292
|
+
main();
|
|
293
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/proxy.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Credential-injecting reverse proxy for the metered LLM providers. The editor talks to the bridge
|
|
3
|
+
* with the pairing token only; this module strips that token, builds a fresh upstream request with
|
|
4
|
+
* the provider's stored key, and forwards it to the fixed upstream base for that provider.
|
|
5
|
+
*
|
|
6
|
+
* Security properties:
|
|
7
|
+
* - the upstream host is NEVER taken from the client request — it comes from the provider's stored
|
|
8
|
+
* `baseUrl`, so this cannot be turned into an open relay / SSRF against arbitrary hosts;
|
|
9
|
+
* - the outbound request carries ONLY `content-type` + the injected auth header — the pairing
|
|
10
|
+
* token, cookies, Origin/Host and any other inbound headers are dropped, so the bridge token
|
|
11
|
+
* never leaks upstream;
|
|
12
|
+
* - the wire body is passed through verbatim, so the bridge stays agnostic to each provider's
|
|
13
|
+
* request/response format (OpenAI Chat Completions vs Anthropic Messages).
|
|
14
|
+
*/
|
|
15
|
+
const ANTHROPIC_VERSION = '2023-06-01';
|
|
16
|
+
const buildUpstreamHeaders = (provider) => {
|
|
17
|
+
const headers = { 'Content-Type': 'application/json' };
|
|
18
|
+
if (provider.kind === 'anthropic') {
|
|
19
|
+
headers['x-api-key'] = provider.apiKey;
|
|
20
|
+
headers['anthropic-version'] = ANTHROPIC_VERSION;
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
headers['Authorization'] = `Bearer ${provider.apiKey}`;
|
|
24
|
+
}
|
|
25
|
+
return headers;
|
|
26
|
+
};
|
|
27
|
+
/** Forward one editor request to its provider's upstream, injecting the stored key. */
|
|
28
|
+
export const forwardToProvider = async (provider, request) => {
|
|
29
|
+
const url = `${provider.baseUrl}${request.restPath}${request.query}`;
|
|
30
|
+
const init = {
|
|
31
|
+
method: request.method,
|
|
32
|
+
headers: buildUpstreamHeaders(provider),
|
|
33
|
+
};
|
|
34
|
+
if (request.body && request.method !== 'GET' && request.method !== 'HEAD') {
|
|
35
|
+
init.body = request.body;
|
|
36
|
+
}
|
|
37
|
+
const response = await fetch(url, init);
|
|
38
|
+
const body = Buffer.from(await response.arrayBuffer());
|
|
39
|
+
return {
|
|
40
|
+
status: response.status,
|
|
41
|
+
contentType: response.headers.get('content-type') ?? 'application/json',
|
|
42
|
+
body,
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAkBvC,MAAM,oBAAoB,GAAG,CAAC,QAAwB,EAA0B,EAAE;IAChF,MAAM,OAAO,GAA2B,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;IAC/E,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAClC,OAAO,CAAC,WAAW,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC;QACvC,OAAO,CAAC,mBAAmB,CAAC,GAAG,iBAAiB,CAAC;IACnD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,QAAQ,CAAC,MAAM,EAAE,CAAC;IACzD,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,uFAAuF;AACvF,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EACpC,QAAwB,EACxB,OAAqB,EACC,EAAE;IACxB,MAAM,GAAG,GAAG,GAAG,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IACrE,MAAM,IAAI,GAAgB;QACxB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,oBAAoB,CAAC,QAAQ,CAAC;KACxC,CAAC;IACF,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC1E,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IACvD,OAAO;QACL,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,kBAAkB;QACvE,IAAI;KACL,CAAC;AACJ,CAAC,CAAC"}
|