browser-debug-mcp-bridge 1.12.0 → 1.14.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 (33) hide show
  1. package/.agents/skills/browser-debug-cli/SKILL.md +44 -0
  2. package/README.md +17 -1
  3. package/apps/mcp-server/dist/cli/agent-instructions.js +89 -0
  4. package/apps/mcp-server/dist/cli/agent-instructions.js.map +1 -0
  5. package/apps/mcp-server/dist/cli/audit-log.js +12 -0
  6. package/apps/mcp-server/dist/cli/audit-log.js.map +1 -0
  7. package/apps/mcp-server/dist/cli/auth.js +66 -0
  8. package/apps/mcp-server/dist/cli/auth.js.map +1 -0
  9. package/apps/mcp-server/dist/cli/gateway.js +116 -0
  10. package/apps/mcp-server/dist/cli/gateway.js.map +1 -0
  11. package/apps/mcp-server/dist/cli/main.js +483 -0
  12. package/apps/mcp-server/dist/cli/main.js.map +1 -0
  13. package/apps/mcp-server/dist/db/migrations.js +221 -1
  14. package/apps/mcp-server/dist/db/migrations.js.map +1 -1
  15. package/apps/mcp-server/dist/db/schema.js +167 -2
  16. package/apps/mcp-server/dist/db/schema.js.map +1 -1
  17. package/apps/mcp-server/dist/lighthouse-report.js +1001 -0
  18. package/apps/mcp-server/dist/lighthouse-report.js.map +1 -0
  19. package/apps/mcp-server/dist/main.js +253 -1
  20. package/apps/mcp-server/dist/main.js.map +1 -1
  21. package/apps/mcp-server/dist/mcp/server.js +793 -1
  22. package/apps/mcp-server/dist/mcp/server.js.map +1 -1
  23. package/apps/mcp-server/dist/mock-store.js +408 -0
  24. package/apps/mcp-server/dist/mock-store.js.map +1 -0
  25. package/apps/mcp-server/dist/override-audit-contract.js +58 -0
  26. package/apps/mcp-server/dist/override-audit-contract.js.map +1 -1
  27. package/apps/mcp-server/dist/override-audit.js +97 -1
  28. package/apps/mcp-server/dist/override-audit.js.map +1 -1
  29. package/apps/mcp-server/dist/ssr-mock.js +480 -0
  30. package/apps/mcp-server/dist/ssr-mock.js.map +1 -0
  31. package/apps/mcp-server/package.json +5 -0
  32. package/package.json +12 -5
  33. package/scripts/browser-debug-cli.cjs +79 -0
@@ -0,0 +1,483 @@
1
+ #!/usr/bin/env node
2
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
3
+ import { dirname, resolve } from 'path';
4
+ import { pathToFileURL } from 'url';
5
+ import { appendCliAuditEvent } from './audit-log.js';
6
+ import { BROWSER_DEBUG_CLI_SKILL_NAME, COPILOT_INSTRUCTIONS_FILENAME, getAgentInstructions, getSkillInstructions, } from './agent-instructions.js';
7
+ import { CLI_TOKEN_HEADER, ensureCliToken } from './auth.js';
8
+ const DEFAULT_PORT = 8065;
9
+ const DEFAULT_HOST = '127.0.0.1';
10
+ const VERSION = '1.0.0';
11
+ function parseArgs(argv) {
12
+ const command = [];
13
+ const options = {};
14
+ for (let index = 0; index < argv.length; index += 1) {
15
+ const arg = argv[index] ?? '';
16
+ if (arg.startsWith('--')) {
17
+ const withoutPrefix = arg.slice(2);
18
+ const [rawKey, inlineValue] = withoutPrefix.split('=', 2);
19
+ const key = rawKey.trim();
20
+ if (!key) {
21
+ continue;
22
+ }
23
+ if (inlineValue !== undefined) {
24
+ options[key] = inlineValue;
25
+ continue;
26
+ }
27
+ const next = argv[index + 1];
28
+ if (next && !next.startsWith('-')) {
29
+ options[key] = next;
30
+ index += 1;
31
+ continue;
32
+ }
33
+ options[key] = true;
34
+ continue;
35
+ }
36
+ command.push(arg);
37
+ }
38
+ return { command, options };
39
+ }
40
+ function optionString(options, key) {
41
+ const value = options[key];
42
+ return typeof value === 'string' ? value : undefined;
43
+ }
44
+ function optionNumber(options, key) {
45
+ const value = optionString(options, key);
46
+ if (!value) {
47
+ return undefined;
48
+ }
49
+ const number = Number(value);
50
+ return Number.isFinite(number) ? number : undefined;
51
+ }
52
+ function hasFlag(options, key) {
53
+ return options[key] === true;
54
+ }
55
+ function getBaseUrl(options) {
56
+ const explicit = optionString(options, 'base-url') ?? process.env.BDMCP_BASE_URL;
57
+ if (explicit) {
58
+ return explicit.replace(/\/$/u, '');
59
+ }
60
+ const port = optionNumber(options, 'port') ?? Number(process.env.PORT ?? DEFAULT_PORT);
61
+ const host = optionString(options, 'host') ?? process.env.HOST ?? DEFAULT_HOST;
62
+ return `http://${host}:${Number.isFinite(port) ? port : DEFAULT_PORT}`;
63
+ }
64
+ function parseJsonObject(value, label) {
65
+ if (!value) {
66
+ return {};
67
+ }
68
+ const parsed = JSON.parse(value.replace(/^\uFEFF/u, ''));
69
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
70
+ throw new Error(`${label} must be a JSON object`);
71
+ }
72
+ return parsed;
73
+ }
74
+ async function fetchJson(baseUrl, pathname, init = {}) {
75
+ const response = await fetch(`${baseUrl}${pathname}`, {
76
+ ...init,
77
+ headers: {
78
+ Accept: 'application/json',
79
+ ...(init.body ? { 'Content-Type': 'application/json' } : {}),
80
+ ...(init.headers ?? {}),
81
+ },
82
+ });
83
+ const text = await response.text();
84
+ const payload = text ? JSON.parse(text) : {};
85
+ if (!response.ok || payload.ok === false) {
86
+ throw new Error(typeof payload.error === 'string' ? payload.error : `Bridge request failed: ${pathname}`);
87
+ }
88
+ return payload;
89
+ }
90
+ function printJson(value) {
91
+ process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
92
+ }
93
+ function printHelp() {
94
+ process.stdout.write(`Browser Debug MCP Bridge CLI ${VERSION}
95
+
96
+ Usage:
97
+ bdmcp health
98
+ bdmcp sessions [--live] [--json]
99
+ bdmcp summary <sessionId|@latest|@live|@recommended|@auto>
100
+ bdmcp console <session> [--level error] [--limit 50]
101
+ bdmcp live-console <session> [--level error] [--contains text]
102
+ bdmcp network <session> [--failures]
103
+ bdmcp page-state <session>
104
+ bdmcp snapshot <session> [--selector body] [--mode dom|png|both]
105
+ bdmcp steps <session> --file flow.json
106
+ bdmcp lighthouse --url http://localhost:3000
107
+ bdmcp tool list
108
+ bdmcp tool schema <toolName>
109
+ bdmcp tool run <toolName> --json-args '{"limit":10}'
110
+ bdmcp tool run <toolName> --args-file args.json
111
+ bdmcp init-copilot [--force|--dry-run]
112
+ bdmcp init-skill [--path .agents/skills] [--force|--dry-run]
113
+ bdmcp help --agent
114
+
115
+ Global options:
116
+ --base-url <url> Bridge base URL. Defaults to http://127.0.0.1:8065
117
+ --port <port> Bridge port when --base-url is not set
118
+ --json Print raw JSON
119
+ --max-bytes <n> Bound tool response size when the tool supports it
120
+ `);
121
+ }
122
+ function printAgentHelp() {
123
+ process.stdout.write(getAgentInstructions());
124
+ if (!getAgentInstructions().endsWith('\n')) {
125
+ process.stdout.write('\n');
126
+ }
127
+ }
128
+ function parseToolArguments(options) {
129
+ const argsFile = optionString(options, 'args-file');
130
+ if (argsFile) {
131
+ return parseJsonObject(readFileSync(resolve(argsFile), 'utf8'), 'tool arguments file');
132
+ }
133
+ return parseJsonObject(optionString(options, 'json-args') ?? optionString(options, 'args'), 'tool arguments');
134
+ }
135
+ async function callTool(baseUrl, toolName, input) {
136
+ const token = ensureCliToken();
137
+ const payload = await fetchJson(baseUrl, `/cli/tools/${encodeURIComponent(toolName)}`, {
138
+ method: 'POST',
139
+ headers: {
140
+ [CLI_TOKEN_HEADER]: token,
141
+ },
142
+ body: JSON.stringify({ arguments: input }),
143
+ });
144
+ return (payload.response ?? {});
145
+ }
146
+ function asRecordArray(value) {
147
+ return Array.isArray(value)
148
+ ? value.filter((entry) => Boolean(entry) && typeof entry === 'object' && !Array.isArray(entry))
149
+ : [];
150
+ }
151
+ function isLiveSession(session) {
152
+ const liveConnection = session.liveConnection;
153
+ return Boolean(liveConnection
154
+ && typeof liveConnection === 'object'
155
+ && !Array.isArray(liveConnection)
156
+ && liveConnection.connected === true);
157
+ }
158
+ async function resolveSessionAlias(baseUrl, value) {
159
+ if (!value.startsWith('@')) {
160
+ return value;
161
+ }
162
+ const response = await callTool(baseUrl, 'list_sessions', {
163
+ sinceMinutes: 240,
164
+ limit: 25,
165
+ maxResponseBytes: 65_536,
166
+ });
167
+ const sessions = asRecordArray(response.sessions);
168
+ if (sessions.length === 0) {
169
+ throw new Error(`No sessions available for alias ${value}`);
170
+ }
171
+ const connected = sessions.find(isLiveSession);
172
+ if (value === '@live' || value === '@recommended') {
173
+ const candidate = connected ?? sessions[0];
174
+ const sessionId = candidate?.sessionId;
175
+ if (typeof sessionId !== 'string') {
176
+ throw new Error(`Unable to resolve session alias ${value}`);
177
+ }
178
+ return sessionId;
179
+ }
180
+ if (value === '@auto') {
181
+ const candidate = connected ?? sessions[0];
182
+ const sessionId = candidate?.sessionId;
183
+ if (typeof sessionId !== 'string') {
184
+ throw new Error(`Unable to resolve session alias ${value}`);
185
+ }
186
+ return sessionId;
187
+ }
188
+ if (value === '@latest') {
189
+ const sessionId = sessions[0]?.sessionId;
190
+ if (typeof sessionId !== 'string') {
191
+ throw new Error(`Unable to resolve session alias ${value}`);
192
+ }
193
+ return sessionId;
194
+ }
195
+ throw new Error(`Unknown session alias: ${value}`);
196
+ }
197
+ function withCommonLimits(input, options) {
198
+ const limit = optionNumber(options, 'limit');
199
+ const maxResponseBytes = optionNumber(options, 'max-bytes');
200
+ return {
201
+ ...input,
202
+ ...(limit ? { limit } : {}),
203
+ ...(maxResponseBytes ? { maxResponseBytes } : {}),
204
+ };
205
+ }
206
+ function printCompactToolResponse(toolName, response) {
207
+ if (toolName === 'list_sessions') {
208
+ const sessions = asRecordArray(response.sessions);
209
+ if (sessions.length === 0) {
210
+ process.stdout.write('No sessions found.\n');
211
+ return;
212
+ }
213
+ for (const session of sessions) {
214
+ const live = session.liveConnection;
215
+ const connected = live?.connected === true ? 'live' : 'offline';
216
+ process.stdout.write(`${String(session.sessionId)} ${connected} ${String(session.status ?? '')} ${String(session.lastUrl ?? session.urlLast ?? '')}\n`);
217
+ }
218
+ return;
219
+ }
220
+ if (toolName === 'get_session_summary') {
221
+ process.stdout.write(`${JSON.stringify(response, null, 2)}\n`);
222
+ return;
223
+ }
224
+ if (toolName === 'get_recent_events') {
225
+ const events = asRecordArray(response.events);
226
+ for (const event of events) {
227
+ process.stdout.write(`${String(event.ts ?? event.timestamp ?? '')} ${String(event.type ?? '')} ${String(event.summary ?? '')}\n`);
228
+ }
229
+ return;
230
+ }
231
+ if (toolName === 'get_console_events' || toolName === 'get_live_console_logs') {
232
+ const logs = asRecordArray(response.logs ?? response.events);
233
+ for (const log of logs) {
234
+ process.stdout.write(`${String(log.level ?? log.type ?? '')} ${String(log.message ?? log.text ?? log.summary ?? '')}\n`);
235
+ }
236
+ return;
237
+ }
238
+ if (toolName === 'get_network_failures' || toolName === 'get_network_calls') {
239
+ const rows = asRecordArray(response.failures ?? response.calls ?? response.network);
240
+ for (const row of rows) {
241
+ process.stdout.write(`${String(row.method ?? '')} ${String(row.status ?? row.statusCode ?? '')} ${String(row.url ?? '')}\n`);
242
+ }
243
+ return;
244
+ }
245
+ printJson(response);
246
+ }
247
+ async function handleToolCommand(baseUrl, parsed) {
248
+ const [, subcommand, toolName] = parsed.command;
249
+ if (subcommand === 'list') {
250
+ const response = await fetchJson(baseUrl, '/cli/tools');
251
+ if (hasFlag(parsed.options, 'json')) {
252
+ printJson(response);
253
+ return;
254
+ }
255
+ for (const tool of asRecordArray(response.tools)) {
256
+ process.stdout.write(`${String(tool.name)} - ${String(tool.description)}\n`);
257
+ }
258
+ return;
259
+ }
260
+ if (subcommand === 'schema') {
261
+ if (!toolName) {
262
+ throw new Error('tool schema requires a tool name');
263
+ }
264
+ const response = await fetchJson(baseUrl, '/cli/tools');
265
+ const tool = asRecordArray(response.tools).find((entry) => entry.name === toolName);
266
+ if (!tool) {
267
+ throw new Error(`Unknown tool: ${toolName}`);
268
+ }
269
+ printJson(tool.inputSchema);
270
+ return;
271
+ }
272
+ if (subcommand === 'run') {
273
+ if (!toolName) {
274
+ throw new Error('tool run requires a tool name');
275
+ }
276
+ const input = parseToolArguments(parsed.options);
277
+ const session = optionString(parsed.options, 'session');
278
+ const response = await callTool(baseUrl, toolName, withCommonLimits({
279
+ ...input,
280
+ ...(session ? { sessionId: await resolveSessionAlias(baseUrl, session) } : {}),
281
+ }, parsed.options));
282
+ if (hasFlag(parsed.options, 'json')) {
283
+ printJson(response);
284
+ return;
285
+ }
286
+ printCompactToolResponse(toolName, response);
287
+ return;
288
+ }
289
+ throw new Error('Unknown tool command. Use `bdmcp tool list`, `bdmcp tool schema`, or `bdmcp tool run`.');
290
+ }
291
+ async function handleFriendlyTool(baseUrl, parsed) {
292
+ const command = parsed.command[0] ?? '';
293
+ const sessionArg = parsed.command[1];
294
+ let toolName = '';
295
+ let input = {};
296
+ if (command === 'sessions') {
297
+ toolName = 'list_sessions';
298
+ input = withCommonLimits({
299
+ sinceMinutes: optionNumber(parsed.options, 'since-minutes') ?? 240,
300
+ limit: optionNumber(parsed.options, 'limit') ?? 25,
301
+ }, parsed.options);
302
+ }
303
+ else {
304
+ if (!sessionArg && command !== 'lighthouse') {
305
+ throw new Error(`${command} requires a session id or alias`);
306
+ }
307
+ const sessionId = sessionArg ? await resolveSessionAlias(baseUrl, sessionArg) : undefined;
308
+ switch (command) {
309
+ case 'summary':
310
+ toolName = 'get_session_summary';
311
+ input = { sessionId };
312
+ break;
313
+ case 'events':
314
+ toolName = 'get_recent_events';
315
+ input = withCommonLimits({ sessionId, responseProfile: 'compact' }, parsed.options);
316
+ break;
317
+ case 'console':
318
+ toolName = 'get_console_events';
319
+ input = withCommonLimits({ sessionId, level: optionString(parsed.options, 'level') }, parsed.options);
320
+ break;
321
+ case 'live-console':
322
+ toolName = 'get_live_console_logs';
323
+ input = withCommonLimits({
324
+ sessionId,
325
+ responseProfile: 'compact',
326
+ levels: optionString(parsed.options, 'level') ? [optionString(parsed.options, 'level')] : undefined,
327
+ contains: optionString(parsed.options, 'contains'),
328
+ }, parsed.options);
329
+ break;
330
+ case 'network':
331
+ toolName = hasFlag(parsed.options, 'failures') ? 'get_network_failures' : 'get_network_calls';
332
+ input = withCommonLimits({ sessionId }, parsed.options);
333
+ break;
334
+ case 'page-state':
335
+ toolName = 'get_page_state';
336
+ input = withCommonLimits({ sessionId }, parsed.options);
337
+ break;
338
+ case 'snapshot':
339
+ toolName = 'capture_ui_snapshot';
340
+ input = withCommonLimits({
341
+ sessionId,
342
+ selector: optionString(parsed.options, 'selector'),
343
+ mode: optionString(parsed.options, 'mode') ?? 'dom',
344
+ }, parsed.options);
345
+ break;
346
+ case 'steps': {
347
+ const file = optionString(parsed.options, 'file');
348
+ if (!file) {
349
+ throw new Error('steps requires --file <flow.json>');
350
+ }
351
+ const parsedFile = JSON.parse(readFileSync(resolve(file), 'utf8'));
352
+ if (!parsedFile || typeof parsedFile !== 'object' || Array.isArray(parsedFile)) {
353
+ throw new Error('steps file must contain a JSON object');
354
+ }
355
+ toolName = 'run_ui_steps';
356
+ input = { ...parsedFile, sessionId };
357
+ break;
358
+ }
359
+ case 'lighthouse':
360
+ toolName = 'run_lighthouse_report';
361
+ input = {
362
+ url: optionString(parsed.options, 'url'),
363
+ sessionId,
364
+ formFactor: optionString(parsed.options, 'form-factor'),
365
+ };
366
+ break;
367
+ default:
368
+ throw new Error(`Unknown command: ${command}`);
369
+ }
370
+ }
371
+ const response = await callTool(baseUrl, toolName, input);
372
+ if (command === 'sessions' && hasFlag(parsed.options, 'live')) {
373
+ response.sessions = asRecordArray(response.sessions).filter(isLiveSession);
374
+ }
375
+ if (hasFlag(parsed.options, 'json')) {
376
+ printJson(response);
377
+ return;
378
+ }
379
+ printCompactToolResponse(toolName, response);
380
+ }
381
+ async function handleHealth(baseUrl, json) {
382
+ const health = await fetchJson(baseUrl, '/health');
383
+ if (json) {
384
+ printJson(health);
385
+ return;
386
+ }
387
+ const websocket = health.websocket;
388
+ process.stdout.write(`Bridge: ${String(health.status)}\n`);
389
+ process.stdout.write(`Database: ${String(health.database)}\n`);
390
+ process.stdout.write(`WebSocket connections: ${String(websocket?.connections ?? 0)}\n`);
391
+ process.stdout.write(`Active sessions: ${String(websocket?.activeSessions ?? 0)}\n`);
392
+ }
393
+ function initCopilot(options) {
394
+ const targetPath = resolve('.github', 'instructions', COPILOT_INSTRUCTIONS_FILENAME);
395
+ const content = getAgentInstructions();
396
+ if (hasFlag(options, 'dry-run')) {
397
+ process.stdout.write(`# Would write ${targetPath}\n\n${content}`);
398
+ return;
399
+ }
400
+ if (existsSync(targetPath) && !hasFlag(options, 'force')) {
401
+ throw new Error(`${targetPath} already exists. Pass --force to overwrite.`);
402
+ }
403
+ mkdirSync(dirname(targetPath), { recursive: true });
404
+ writeFileSync(targetPath, content, 'utf8');
405
+ process.stdout.write(`Wrote ${targetPath}\n`);
406
+ }
407
+ function initSkill(options) {
408
+ const root = optionString(options, 'path') ?? resolve('.agents', 'skills');
409
+ const targetPath = resolve(root, BROWSER_DEBUG_CLI_SKILL_NAME, 'SKILL.md');
410
+ const content = getSkillInstructions();
411
+ if (hasFlag(options, 'dry-run')) {
412
+ process.stdout.write(`# Would write ${targetPath}\n\n${content}`);
413
+ return;
414
+ }
415
+ if (existsSync(targetPath) && !hasFlag(options, 'force')) {
416
+ throw new Error(`${targetPath} already exists. Pass --force to overwrite.`);
417
+ }
418
+ mkdirSync(dirname(targetPath), { recursive: true });
419
+ writeFileSync(targetPath, content, 'utf8');
420
+ process.stdout.write(`Wrote ${targetPath}\n`);
421
+ }
422
+ async function run(parsed) {
423
+ const baseUrl = getBaseUrl(parsed.options);
424
+ const command = parsed.command[0] ?? 'help';
425
+ if (command === 'help' || hasFlag(parsed.options, 'help')) {
426
+ if (hasFlag(parsed.options, 'agent')) {
427
+ printAgentHelp();
428
+ return;
429
+ }
430
+ printHelp();
431
+ return;
432
+ }
433
+ if (command === 'agent-instructions') {
434
+ printAgentHelp();
435
+ return;
436
+ }
437
+ if (command === 'init-copilot') {
438
+ initCopilot(parsed.options);
439
+ return;
440
+ }
441
+ if (command === 'init-skill') {
442
+ initSkill(parsed.options);
443
+ return;
444
+ }
445
+ if (command === 'health') {
446
+ await handleHealth(baseUrl, hasFlag(parsed.options, 'json'));
447
+ return;
448
+ }
449
+ if (command === 'tool') {
450
+ await handleToolCommand(baseUrl, parsed);
451
+ return;
452
+ }
453
+ await handleFriendlyTool(baseUrl, parsed);
454
+ }
455
+ const entryUrl = process.argv[1] ? pathToFileURL(process.argv[1]).href : null;
456
+ if (entryUrl && import.meta.url === entryUrl) {
457
+ const startedAt = Date.now();
458
+ const parsed = parseArgs(process.argv.slice(2));
459
+ run(parsed)
460
+ .then(() => {
461
+ appendCliAuditEvent({
462
+ command: parsed.command.join(' ') || 'help',
463
+ args: process.argv.slice(2),
464
+ ok: true,
465
+ durationMs: Date.now() - startedAt,
466
+ });
467
+ })
468
+ .catch((error) => {
469
+ const message = error instanceof Error ? error.message : String(error);
470
+ appendCliAuditEvent({
471
+ command: parsed.command.join(' ') || 'help',
472
+ args: process.argv.slice(2),
473
+ ok: false,
474
+ durationMs: Date.now() - startedAt,
475
+ error: message,
476
+ });
477
+ process.stderr.write(`[bdmcp] ${message}\n`);
478
+ process.stderr.write('[bdmcp] If the bridge is not running, start it with: browser-debug-mcp-bridge --standalone\n');
479
+ process.exitCode = 1;
480
+ });
481
+ }
482
+ export { getBaseUrl, isLiveSession, parseArgs, parseJsonObject, resolveSessionAlias, withCommonLimits, };
483
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EACL,4BAA4B,EAC5B,6BAA6B,EAC7B,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAc7D,MAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,MAAM,YAAY,GAAG,WAAW,CAAC;AACjC,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAqC,EAAE,CAAC;IAErD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,aAAa,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAC1D,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;YAC1B,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,SAAS;YACX,CAAC;YACD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC;gBAC3B,SAAS;YACX,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAC7B,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClC,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;gBACpB,KAAK,IAAI,CAAC,CAAC;gBACX,SAAS;YACX,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YACpB,SAAS;QACX,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,YAAY,CAAC,OAAyC,EAAE,GAAW;IAC1E,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,SAAS,YAAY,CAAC,OAAyC,EAAE,GAAW;IAC1E,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACzC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACtD,CAAC;AAED,SAAS,OAAO,CAAC,OAAyC,EAAE,GAAW;IACrE,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;AAC/B,CAAC;AAED,SAAS,UAAU,CAAC,OAAyC;IAC3D,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IACjF,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,YAAY,CAAC,CAAC;IACvF,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,YAAY,CAAC;IAC/E,OAAO,UAAU,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC;AACzE,CAAC;AAED,SAAS,eAAe,CAAC,KAAyB,EAAE,KAAa;IAC/D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAY,CAAC;IACpE,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,wBAAwB,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,MAAiC,CAAC;AAC3C,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,OAAe,EAAE,QAAgB,EAAE,OAAoB,EAAE;IAChF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,GAAG,QAAQ,EAAE,EAAE;QACpD,GAAG,IAAI;QACP,OAAO,EAAE;YACP,MAAM,EAAE,kBAAkB;YAC1B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5D,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;SACxB;KACF,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC,CAAC,CAAC,EAAE,CAAC;IACxE,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,OAAO,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;IAC5G,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;CA0B7D,CAAC,CAAC;AACH,CAAC;AAED,SAAS,cAAc;IACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC7C,IAAI,CAAC,oBAAoB,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAyC;IACnE,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACpD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,eAAe,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,EAAE,qBAAqB,CAAC,CAAC;IACzF,CAAC;IACD,OAAO,eAAe,CAAC,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,gBAAgB,CAAC,CAAC;AAChH,CAAC;AAED,KAAK,UAAU,QAAQ,CACrB,OAAe,EACf,QAAgB,EAChB,KAA8B;IAE9B,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,cAAc,kBAAkB,CAAC,QAAQ,CAAC,EAAE,EAAE;QACrF,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,CAAC,gBAAgB,CAAC,EAAE,KAAK;SAC1B;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;KAC3C,CAA6B,CAAC;IAC/B,OAAO,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAA4B,CAAC;AAC7D,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACzB,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAoC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACjI,CAAC,CAAC,EAAE,CAAC;AACT,CAAC;AAED,SAAS,aAAa,CAAC,OAAgC;IACrD,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAC9C,OAAO,OAAO,CACZ,cAAc;WACX,OAAO,cAAc,KAAK,QAAQ;WAClC,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC;WAC7B,cAA0C,CAAC,SAAS,KAAK,IAAI,CAClE,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,OAAe,EAAE,KAAa;IAC/D,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,eAAe,EAAE;QACxD,YAAY,EAAE,GAAG;QACjB,KAAK,EAAE,EAAE;QACT,gBAAgB,EAAE,MAAM;KACzB,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAClD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC/C,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,cAAc,EAAE,CAAC;QAClD,MAAM,SAAS,GAAG,SAAS,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,SAAS,EAAE,SAAS,CAAC;QACvC,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QACtB,MAAM,SAAS,GAAG,SAAS,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,SAAS,EAAE,SAAS,CAAC;QACvC,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC;QACzC,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,EAAE,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,gBAAgB,CAAC,KAA8B,EAAE,OAAyC;IACjG,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,gBAAgB,GAAG,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC5D,OAAO;QACL,GAAG,KAAK;QACR,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClD,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAAC,QAAgB,EAAE,QAAiC;IACnF,IAAI,QAAQ,KAAK,eAAe,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,cAAqD,CAAC;YAC3E,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;YAChE,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,IAAI,CAClI,CAAC;QACJ,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,QAAQ,KAAK,qBAAqB,EAAE,CAAC;QACvC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC/D,OAAO;IACT,CAAC;IAED,IAAI,QAAQ,KAAK,mBAAmB,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC9C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;QACpI,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,QAAQ,KAAK,oBAAoB,IAAI,QAAQ,KAAK,uBAAuB,EAAE,CAAC;QAC9E,MAAM,IAAI,GAAG,aAAa,CAAC,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC7D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;QAC3H,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,QAAQ,KAAK,sBAAsB,IAAI,QAAQ,KAAK,mBAAmB,EAAE,CAAC;QAC5E,MAAM,IAAI,GAAG,aAAa,CAAC,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC;QACpF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;QAC/H,CAAC;QACD,OAAO;IACT,CAAC;IAED,SAAS,CAAC,QAAQ,CAAC,CAAC;AACtB,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,OAAe,EAAE,MAAkB;IAClE,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC;IAChD,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACxD,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;YACpC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACpB,OAAO;QACT,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACjD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC/E,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACxD,MAAM,IAAI,GAAG,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QACpF,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,iBAAiB,QAAQ,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5B,OAAO;IACT,CAAC;IAED,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QACD,MAAM,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAC7B,OAAO,EACP,QAAQ,EACR,gBAAgB,CAAC;YACf,GAAG,KAAK;YACR,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC/E,EAAE,MAAM,CAAC,OAAO,CAAC,CACnB,CAAC;QACF,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;YACpC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACpB,OAAO;QACT,CAAC;QACD,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,wFAAwF,CAAC,CAAC;AAC5G,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,OAAe,EAAE,MAAkB;IACnE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACrC,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,KAAK,GAA4B,EAAE,CAAC;IAExC,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;QAC3B,QAAQ,GAAG,eAAe,CAAC;QAC3B,KAAK,GAAG,gBAAgB,CAAC;YACvB,YAAY,EAAE,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,IAAI,GAAG;YAClE,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE;SACnD,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACrB,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,UAAU,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,iCAAiC,CAAC,CAAC;QAC/D,CAAC;QACD,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1F,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,SAAS;gBACZ,QAAQ,GAAG,qBAAqB,CAAC;gBACjC,KAAK,GAAG,EAAE,SAAS,EAAE,CAAC;gBACtB,MAAM;YACR,KAAK,QAAQ;gBACX,QAAQ,GAAG,mBAAmB,CAAC;gBAC/B,KAAK,GAAG,gBAAgB,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;gBACpF,MAAM;YACR,KAAK,SAAS;gBACZ,QAAQ,GAAG,oBAAoB,CAAC;gBAChC,KAAK,GAAG,gBAAgB,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;gBACtG,MAAM;YACR,KAAK,cAAc;gBACjB,QAAQ,GAAG,uBAAuB,CAAC;gBACnC,KAAK,GAAG,gBAAgB,CAAC;oBACvB,SAAS;oBACT,eAAe,EAAE,SAAS;oBAC1B,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;oBACnG,QAAQ,EAAE,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC;iBACnD,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;gBACnB,MAAM;YACR,KAAK,SAAS;gBACZ,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,mBAAmB,CAAC;gBAC9F,KAAK,GAAG,gBAAgB,CAAC,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;gBACxD,MAAM;YACR,KAAK,YAAY;gBACf,QAAQ,GAAG,gBAAgB,CAAC;gBAC5B,KAAK,GAAG,gBAAgB,CAAC,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;gBACxD,MAAM;YACR,KAAK,UAAU;gBACb,QAAQ,GAAG,qBAAqB,CAAC;gBACjC,KAAK,GAAG,gBAAgB,CAAC;oBACvB,SAAS;oBACT,QAAQ,EAAE,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC;oBAClD,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,KAAK;iBACpD,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;gBACnB,MAAM;YACR,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBAClD,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;gBACvD,CAAC;gBACD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAY,CAAC;gBAC9E,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC/E,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;gBAC3D,CAAC;gBACD,QAAQ,GAAG,cAAc,CAAC;gBAC1B,KAAK,GAAG,EAAE,GAAI,UAAsC,EAAE,SAAS,EAAE,CAAC;gBAClE,MAAM;YACR,CAAC;YACD,KAAK,YAAY;gBACf,QAAQ,GAAG,uBAAuB,CAAC;gBACnC,KAAK,GAAG;oBACN,GAAG,EAAE,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC;oBACxC,SAAS;oBACT,UAAU,EAAE,YAAY,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC;iBACxD,CAAC;gBACF,MAAM;YACR;gBACE,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC1D,IAAI,OAAO,KAAK,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;QAC9D,QAAQ,CAAC,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;QACpC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACpB,OAAO;IACT,CAAC;IACD,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC/C,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,OAAe,EAAE,IAAa;IACxD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACnD,IAAI,IAAI,EAAE,CAAC;QACT,SAAS,CAAC,MAAM,CAAC,CAAC;QAClB,OAAO;IACT,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,SAAgD,CAAC;IAC1E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,MAAM,CAAC,SAAS,EAAE,WAAW,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IACxF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,MAAM,CAAC,SAAS,EAAE,cAAc,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;AACvF,CAAC;AAED,SAAS,WAAW,CAAC,OAAyC;IAC5D,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,EAAE,cAAc,EAAE,6BAA6B,CAAC,CAAC;IACrF,MAAM,OAAO,GAAG,oBAAoB,EAAE,CAAC;IACvC,IAAI,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,UAAU,OAAO,OAAO,EAAE,CAAC,CAAC;QAClE,OAAO;IACT,CAAC;IACD,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,GAAG,UAAU,6CAA6C,CAAC,CAAC;IAC9E,CAAC;IACD,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC3C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,UAAU,IAAI,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,SAAS,CAAC,OAAyC;IAC1D,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC3E,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,4BAA4B,EAAE,UAAU,CAAC,CAAC;IAC3E,MAAM,OAAO,GAAG,oBAAoB,EAAE,CAAC;IACvC,IAAI,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,UAAU,OAAO,OAAO,EAAE,CAAC,CAAC;QAClE,OAAO;IACT,CAAC;IACD,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,GAAG,UAAU,6CAA6C,CAAC,CAAC;IAC9E,CAAC;IACD,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC3C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,UAAU,IAAI,CAAC,CAAC;AAChD,CAAC;AAED,KAAK,UAAU,GAAG,CAAC,MAAkB;IACnC,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;IAE5C,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;QAC1D,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;YACrC,cAAc,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QACD,SAAS,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,oBAAoB,EAAE,CAAC;QACrC,cAAc,EAAE,CAAC;QACjB,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,cAAc,EAAE,CAAC;QAC/B,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC5B,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;QAC7B,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,MAAM,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QAC7D,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACzC,OAAO;IACT,CAAC;IAED,MAAM,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAE9E,IAAI,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,GAAG,CAAC,MAAM,CAAC;SACR,IAAI,CAAC,GAAG,EAAE;QACT,mBAAmB,CAAC;YAClB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM;YAC3C,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3B,EAAE,EAAE,IAAI;YACR,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;SACnC,CAAC,CAAC;IACL,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,mBAAmB,CAAC;YAClB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM;YAC3C,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3B,EAAE,EAAE,KAAK;YACT,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;YAClC,KAAK,EAAE,OAAO;SACf,CAAC,CAAC;QACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,OAAO,IAAI,CAAC,CAAC;QAC7C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8FAA8F,CAAC,CAAC;QACrH,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACP,CAAC;AAED,OAAO,EACL,UAAU,EACV,aAAa,EACb,SAAS,EACT,eAAe,EACf,mBAAmB,EACnB,gBAAgB,GACjB,CAAC"}