@zhin.js/client 1.1.5 → 1.1.7

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 (103) hide show
  1. package/README.md +25 -19
  2. package/client/app.test.ts +37 -0
  3. package/client/app.ts +130 -138
  4. package/client/bootstrap/loadConsoleEntries.test.ts +0 -15
  5. package/client/bootstrap/loadConsoleEntries.ts +1 -20
  6. package/client/console-client-context.ts +24 -0
  7. package/client/console-client.test.ts +46 -0
  8. package/client/console-client.ts +70 -0
  9. package/client/console-events.ts +4 -3
  10. package/client/console-utils/remoteApi.ts +0 -7
  11. package/client/index.ts +21 -13
  12. package/client/persistence/idb-store.test.ts +0 -18
  13. package/client/persistence/idb-store.ts +3 -6
  14. package/client/segments.test.ts +2 -0
  15. package/client/segments.ts +1 -1
  16. package/client/{websocket/manager.test.ts → transport/console-transport.test.ts} +79 -34
  17. package/client/{websocket/manager.ts → transport/console-transport.ts} +237 -178
  18. package/client/{websocket → transport}/hooks.ts +240 -23
  19. package/client/transport/index.ts +23 -0
  20. package/client/{websocket → transport}/types.ts +11 -17
  21. package/client/types.ts +0 -3
  22. package/client/workroom/registerWorkroomConsole.test.ts +0 -1
  23. package/dist/app.d.ts +17 -52
  24. package/dist/app.d.ts.map +1 -1
  25. package/dist/app.js +110 -95
  26. package/dist/app.js.map +1 -1
  27. package/dist/bootstrap/loadConsoleEntries.d.ts +0 -6
  28. package/dist/bootstrap/loadConsoleEntries.d.ts.map +1 -1
  29. package/dist/bootstrap/loadConsoleEntries.js +0 -9
  30. package/dist/bootstrap/loadConsoleEntries.js.map +1 -1
  31. package/dist/console-client-context.d.ts +9 -0
  32. package/dist/console-client-context.d.ts.map +1 -0
  33. package/dist/console-client-context.js +13 -0
  34. package/dist/console-client-context.js.map +1 -0
  35. package/dist/console-client.d.ts +25 -0
  36. package/dist/console-client.d.ts.map +1 -0
  37. package/dist/console-client.js +45 -0
  38. package/dist/console-client.js.map +1 -0
  39. package/dist/console-events.d.ts +1 -0
  40. package/dist/console-events.d.ts.map +1 -1
  41. package/dist/console-events.js +3 -3
  42. package/dist/console-events.js.map +1 -1
  43. package/dist/console-utils/remoteApi.d.ts +0 -1
  44. package/dist/console-utils/remoteApi.d.ts.map +1 -1
  45. package/dist/console-utils/remoteApi.js +0 -6
  46. package/dist/console-utils/remoteApi.js.map +1 -1
  47. package/dist/index.d.ts +7 -6
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +9 -8
  50. package/dist/index.js.map +1 -1
  51. package/dist/persistence/idb-store.d.ts.map +1 -1
  52. package/dist/persistence/idb-store.js +3 -5
  53. package/dist/persistence/idb-store.js.map +1 -1
  54. package/dist/segments.js +1 -1
  55. package/dist/segments.js.map +1 -1
  56. package/dist/transport/console-transport.d.ts +217 -0
  57. package/dist/transport/console-transport.d.ts.map +1 -0
  58. package/dist/{websocket/manager.js → transport/console-transport.js} +147 -165
  59. package/dist/transport/console-transport.js.map +1 -0
  60. package/dist/transport/hooks.d.ts +253 -0
  61. package/dist/transport/hooks.d.ts.map +1 -0
  62. package/dist/{websocket → transport}/hooks.js +234 -19
  63. package/dist/transport/hooks.js.map +1 -0
  64. package/dist/transport/index.d.ts +4 -0
  65. package/dist/transport/index.d.ts.map +1 -0
  66. package/dist/transport/index.js +4 -0
  67. package/dist/transport/index.js.map +1 -0
  68. package/dist/{websocket → transport}/types.d.ts +10 -13
  69. package/dist/transport/types.d.ts.map +1 -0
  70. package/dist/{websocket → transport}/types.js +4 -9
  71. package/dist/transport/types.js.map +1 -0
  72. package/dist/types.d.ts +0 -1
  73. package/dist/types.d.ts.map +1 -1
  74. package/package.json +3 -3
  75. package/client/runtime/index.ts +0 -12
  76. package/client/websocket/index.ts +0 -11
  77. package/client/websocket/instance.ts +0 -24
  78. package/client/websocket/remote-settings.ts +0 -47
  79. package/dist/runtime/index.d.ts +0 -6
  80. package/dist/runtime/index.d.ts.map +0 -1
  81. package/dist/runtime/index.js +0 -10
  82. package/dist/runtime/index.js.map +0 -1
  83. package/dist/websocket/hooks.d.ts +0 -114
  84. package/dist/websocket/hooks.d.ts.map +0 -1
  85. package/dist/websocket/hooks.js.map +0 -1
  86. package/dist/websocket/index.d.ts +0 -7
  87. package/dist/websocket/index.d.ts.map +0 -1
  88. package/dist/websocket/index.js +0 -7
  89. package/dist/websocket/index.js.map +0 -1
  90. package/dist/websocket/instance.d.ts +0 -5
  91. package/dist/websocket/instance.d.ts.map +0 -1
  92. package/dist/websocket/instance.js +0 -21
  93. package/dist/websocket/instance.js.map +0 -1
  94. package/dist/websocket/manager.d.ts +0 -131
  95. package/dist/websocket/manager.d.ts.map +0 -1
  96. package/dist/websocket/manager.js.map +0 -1
  97. package/dist/websocket/remote-settings.d.ts +0 -5
  98. package/dist/websocket/remote-settings.d.ts.map +0 -1
  99. package/dist/websocket/remote-settings.js +0 -47
  100. package/dist/websocket/remote-settings.js.map +0 -1
  101. package/dist/websocket/types.d.ts.map +0 -1
  102. package/dist/websocket/types.js.map +0 -1
  103. /package/client/{websocket → transport}/hooks.test.ts +0 -0
@@ -1,17 +1,15 @@
1
- import { ConnectionState, WebSocketError, ConnectionError, MessageError, RequestTimeoutError } from './types';
2
- import { getApiBase, getStoredToken, resolveApiUrl } from "./remote-settings.js";
1
+ import { ConnectionState, ConnectionError, ConsoleTransportError, MessageError, } from './types.js';
2
+ import { getApiBase, getToken, resolveApiUrl } from '../console-utils/remoteApi.js';
3
3
  import { applyConsoleEvent } from "../persistence/idb-store.js";
4
4
  import { fetchConsoleEventHistory } from '../console-events.js';
5
- import { CONSOLE_EVENT_RECOVERY_GAP_EVENT, SIDE_EVENT_PUSH, normalizeConsolePushMessage, parseConsoleSseFrame, } from "@zhin.js/console-protocol";
6
- export class WebSocketManager {
7
- ws = null;
5
+ import { CONFIG_RPC, PLUGIN_RPC, ENDPOINT_RPC, CONSOLE_EVENT_RECOVERY_GAP_EVENT, SIDE_EVENT_PUSH, parseConsoleSseFrame, } from "@zhin.js/console-protocol";
6
+ export class ConsoleTransport {
8
7
  config;
9
8
  callbacks;
10
9
  state = ConnectionState.DISCONNECTED;
11
10
  reconnectAttempts = 0;
12
11
  reconnectTimer = null;
13
12
  requestId = 0;
14
- pendingRequests = new Map();
15
13
  connectedListeners = new Set();
16
14
  eventListeners = new Map();
17
15
  recoveryGapListeners = new Set();
@@ -19,10 +17,11 @@ export class WebSocketManager {
19
17
  eventRuntimeId = '';
20
18
  lastEventId = 0;
21
19
  durableCursorBlocked = false;
22
- useRestTransport = true;
20
+ disposed = false;
21
+ connectionGeneration = 0;
23
22
  constructor(config = {}, callbacks = {}) {
24
23
  this.config = {
25
- url: this.buildWebSocketUrl(config.url),
24
+ fetch: config.fetch ?? globalThis.fetch,
26
25
  reconnectInterval: config.reconnectInterval ?? 3000,
27
26
  maxReconnectAttempts: config.maxReconnectAttempts ?? 10,
28
27
  requestTimeout: config.requestTimeout ?? 10000,
@@ -30,11 +29,13 @@ export class WebSocketManager {
30
29
  this.callbacks = callbacks;
31
30
  }
32
31
  onConnectionChange(listener) {
32
+ this.assertActive();
33
33
  this.connectedListeners.add(listener);
34
34
  return () => this.connectedListeners.delete(listener);
35
35
  }
36
36
  /** Subscribe by event name; known names infer their exact payload type. */
37
37
  onConsoleEvent(type, listener) {
38
+ this.assertActive();
38
39
  let listeners = this.eventListeners.get(type);
39
40
  if (!listeners) {
40
41
  listeners = new Set();
@@ -50,6 +51,7 @@ export class WebSocketManager {
50
51
  }
51
52
  /** Observe a non-resumable cursor so domain views can perform a full resync. */
52
53
  onConsoleEventRecoveryGap(listener) {
54
+ this.assertActive();
53
55
  this.recoveryGapListeners.add(listener);
54
56
  return () => this.recoveryGapListeners.delete(listener);
55
57
  }
@@ -58,29 +60,17 @@ export class WebSocketManager {
58
60
  l(connected);
59
61
  }
60
62
  connect() {
61
- if (this.useRestTransport) {
62
- void this.connectRestSse();
63
- return;
64
- }
63
+ this.assertActive();
65
64
  if (this.state === ConnectionState.CONNECTED || this.state === ConnectionState.CONNECTING)
66
65
  return;
67
- this.setState(ConnectionState.CONNECTING);
68
- try {
69
- this.ws = new WebSocket(this.config.url);
70
- this.attachEventHandlers();
71
- }
72
- catch (error) {
73
- this.handleConnectionError(new ConnectionError("Failed to create WebSocket", error));
74
- this.setState(ConnectionState.RECONNECTING);
75
- this.notifyConnection(false);
76
- this.scheduleReconnect();
77
- }
66
+ const generation = ++this.connectionGeneration;
67
+ void this.connectSse(generation);
78
68
  }
79
- async connectRestSse() {
69
+ async connectSse(generation) {
80
70
  // Host without http.token allows unauthenticated SSE (authenticateHttp
81
71
  // returns full when TokenRegistry is empty). Still open the stream so
82
72
  // local dev Console receives hmr:reload / message.receive broadcasts.
83
- const token = getStoredToken();
73
+ const token = getToken();
84
74
  this.setState(ConnectionState.CONNECTING);
85
75
  this.sseAbort?.abort();
86
76
  this.sseAbort = new AbortController();
@@ -91,16 +81,22 @@ export class WebSocketManager {
91
81
  if (token)
92
82
  headers.Authorization = `Bearer ${token}`;
93
83
  await this.recoverEventHistory(this.sseAbort.signal);
84
+ if (!this.isCurrentConnection(generation))
85
+ return;
94
86
  const params = new URLSearchParams();
95
87
  if (this.eventRuntimeId)
96
88
  params.set('runtimeId', this.eventRuntimeId);
97
89
  if (this.lastEventId > 0)
98
90
  params.set('after', String(this.lastEventId));
99
91
  const suffix = params.size ? `?${params}` : '';
100
- const res = await fetch(resolveApiUrl(`/api/events${suffix}`), {
92
+ const res = await this.config.fetch(resolveApiUrl(`/api/events${suffix}`), {
101
93
  headers,
102
94
  signal: this.sseAbort.signal,
103
95
  });
96
+ if (!this.isCurrentConnection(generation)) {
97
+ await res.body?.cancel();
98
+ return;
99
+ }
104
100
  if (!res.ok || !res.body) {
105
101
  throw new ConnectionError(`SSE failed: HTTP ${res.status}`);
106
102
  }
@@ -108,29 +104,30 @@ export class WebSocketManager {
108
104
  this.reconnectAttempts = 0;
109
105
  this.notifyConnection(true);
110
106
  this.callbacks.onConnect?.();
111
- void this.pumpSse(res.body);
107
+ void this.pumpSse(res.body, generation);
112
108
  }
113
109
  catch (error) {
110
+ if (!this.isCurrentConnection(generation))
111
+ return;
114
112
  if (error.name === "AbortError")
115
113
  return;
116
- // Must set RECONNECTING (not ERROR) before scheduleReconnect — the timer
117
- // only fires when state === RECONNECTING; handleConnectionError(ERROR)
118
- // previously deadlocked reconnect after any transient SSE failure.
119
- this.callbacks.onError?.(error);
120
- console.error("[Console transport] SSE connect error:", error);
114
+ // Reconnect timers only run while the transport remains in RECONNECTING.
115
+ const connectionError = error instanceof Error ? error : new Error(String(error));
116
+ this.callbacks.onError?.(connectionError);
117
+ console.error("[Console transport] SSE connect error:", connectionError);
121
118
  this.setState(ConnectionState.RECONNECTING);
122
119
  this.notifyConnection(false);
123
120
  this.scheduleReconnect();
124
121
  }
125
122
  }
126
- async pumpSse(body) {
123
+ async pumpSse(body, generation) {
127
124
  const reader = body.getReader();
128
125
  const decoder = new TextDecoder();
129
126
  let buffer = "";
130
127
  try {
131
128
  while (true) {
132
129
  const { done, value } = await reader.read();
133
- if (done)
130
+ if (done || !this.isCurrentConnection(generation))
134
131
  break;
135
132
  buffer += decoder.decode(value, { stream: true });
136
133
  const parts = buffer.split(/\r?\n\r?\n/u);
@@ -156,9 +153,10 @@ export class WebSocketManager {
156
153
  /* closed */
157
154
  }
158
155
  finally {
159
- if (this.state === ConnectionState.CONNECTED) {
156
+ if (this.isCurrentConnection(generation) && this.state === ConnectionState.CONNECTED) {
160
157
  this.notifyConnection(false);
161
158
  this.setState(ConnectionState.RECONNECTING);
159
+ this.callbacks.onDisconnect?.();
162
160
  this.scheduleReconnect();
163
161
  }
164
162
  }
@@ -175,7 +173,7 @@ export class WebSocketManager {
175
173
  }
176
174
  for (;;) {
177
175
  const query = { runtimeId, after, limit: 500 };
178
- const page = await fetchConsoleEventHistory(query, { signal });
176
+ const page = await fetchConsoleEventHistory(query, { signal, fetch: this.config.fetch });
179
177
  if (page.runtimeId !== runtimeId) {
180
178
  runtimeId = page.runtimeId;
181
179
  after = 0;
@@ -209,7 +207,7 @@ export class WebSocketManager {
209
207
  && event.runtimeId === this.eventRuntimeId
210
208
  && event.eventId <= this.lastEventId)
211
209
  return;
212
- const message = normalizeConsolePushMessage({
210
+ const message = Object.freeze({
213
211
  type: event.type,
214
212
  data: event.data,
215
213
  runtimeId: event.runtimeId,
@@ -260,60 +258,26 @@ export class WebSocketManager {
260
258
  }
261
259
  }
262
260
  disconnect() {
261
+ const wasConnected = this.state === ConnectionState.CONNECTED;
262
+ this.connectionGeneration += 1;
263
263
  this.clearReconnectTimer();
264
- this.clearPendingRequests();
265
264
  this.sseAbort?.abort();
266
265
  this.sseAbort = null;
267
- if (this.ws) {
268
- this.ws.close();
269
- this.ws = null;
270
- }
271
266
  this.setState(ConnectionState.DISCONNECTED);
272
267
  this.notifyConnection(false);
268
+ if (wasConnected)
269
+ this.callbacks.onDisconnect?.();
273
270
  }
274
271
  send(message) {
275
- if (this.useRestTransport) {
276
- void this.sendRequest(message);
277
- return;
278
- }
279
- if (!this.isConnected())
280
- throw new WebSocketError("WebSocket is not connected", "NOT_CONNECTED");
281
- try {
282
- this.ws.send(JSON.stringify(message));
283
- }
284
- catch (error) {
285
- throw new MessageError("Failed to send message", error);
286
- }
272
+ this.assertActive();
273
+ void this.sendRequest(message);
287
274
  }
288
275
  async sendRequest(message) {
289
- if (this.useRestTransport) {
290
- return this.sendRestRequest(message);
291
- }
292
- if (!this.isConnected())
293
- throw new WebSocketError("WebSocket is not connected", "NOT_CONNECTED");
294
- return new Promise((resolve, reject) => {
295
- const requestId = ++this.requestId;
296
- const messageWithId = { ...message, requestId };
297
- const timer = setTimeout(() => {
298
- this.pendingRequests.delete(requestId);
299
- reject(new RequestTimeoutError(requestId));
300
- }, this.config.requestTimeout);
301
- this.pendingRequests.set(requestId, { resolve: resolve, reject, timer });
302
- try {
303
- this.ws.send(JSON.stringify(messageWithId));
304
- }
305
- catch (error) {
306
- this.pendingRequests.delete(requestId);
307
- clearTimeout(timer);
308
- reject(new MessageError("Failed to send request", error));
309
- }
310
- });
311
- }
312
- async sendRestRequest(message) {
276
+ this.assertActive();
313
277
  // Host may run without http.token (local smoke). Only require a token when
314
278
  // one is configured client-side; otherwise POST without Authorization and
315
279
  // let the Host accept (TokenRegistry empty → full scope).
316
- const token = getStoredToken();
280
+ const token = getToken();
317
281
  const requestId = ++this.requestId;
318
282
  const body = { ...message, requestId };
319
283
  try {
@@ -322,7 +286,7 @@ export class WebSocketManager {
322
286
  };
323
287
  if (token)
324
288
  headers.Authorization = `Bearer ${token}`;
325
- const res = await fetch(resolveApiUrl("/api/console/request"), {
289
+ const res = await this.config.fetch(resolveApiUrl("/api/console/request"), {
326
290
  method: "POST",
327
291
  headers,
328
292
  body: JSON.stringify(body),
@@ -330,31 +294,96 @@ export class WebSocketManager {
330
294
  });
331
295
  const json = (await res.json());
332
296
  if (!res.ok || json.success === false) {
333
- throw new WebSocketError(json.error ?? `HTTP ${res.status}`, "SERVER_ERROR");
297
+ throw new ConsoleTransportError(json.error ?? `HTTP ${res.status}`, "SERVER_ERROR");
334
298
  }
335
299
  return json.data;
336
300
  }
337
301
  catch (error) {
338
- if (error instanceof WebSocketError)
302
+ if (error instanceof ConsoleTransportError)
339
303
  throw error;
340
304
  throw new MessageError("REST request failed", error);
341
305
  }
342
306
  }
343
307
  isConnected() {
344
- if (this.useRestTransport) {
345
- return this.state === ConnectionState.CONNECTED;
346
- }
347
- return this.ws?.readyState === WebSocket.OPEN;
308
+ return this.state === ConnectionState.CONNECTED;
348
309
  }
349
310
  getState() {
350
311
  return this.state;
351
312
  }
313
+ dispose() {
314
+ if (this.disposed)
315
+ return;
316
+ this.disconnect();
317
+ this.disposed = true;
318
+ this.connectedListeners.clear();
319
+ this.eventListeners.clear();
320
+ this.recoveryGapListeners.clear();
321
+ }
352
322
  async getConfig(pluginName) {
353
- return this.sendRequest({ type: "config:get", pluginName });
323
+ return this.sendRequest({ type: CONFIG_RPC.GET, pluginName });
324
+ }
325
+ async planPluginInstall(packageName) {
326
+ return this.sendRequest({ type: PLUGIN_RPC.PLAN_INSTALL, packageName });
327
+ }
328
+ async installPlugin(packageName, expectedRevision) {
329
+ return this.sendRequest({ type: PLUGIN_RPC.INSTALL, packageName, expectedRevision });
330
+ }
331
+ async planPluginUninstall(packageName) {
332
+ return this.sendRequest({ type: PLUGIN_RPC.PLAN_UNINSTALL, packageName });
333
+ }
334
+ async uninstallPlugin(packageName, expectedRevision) {
335
+ return this.sendRequest({
336
+ type: PLUGIN_RPC.UNINSTALL,
337
+ packageName,
338
+ confirmation: packageName,
339
+ expectedRevision,
340
+ });
341
+ }
342
+ async planPluginUpdate(packageName, targetVersion) {
343
+ return this.sendRequest({ type: PLUGIN_RPC.PLAN_UPDATE, packageName, targetVersion });
344
+ }
345
+ async updatePlugin(packageName, targetVersion, expectedRevision) {
346
+ return this.sendRequest({ type: PLUGIN_RPC.UPDATE, packageName, targetVersion, expectedRevision });
347
+ }
348
+ async validatePluginConfig(pluginName, data) {
349
+ return this.sendRequest({ type: PLUGIN_RPC.VALIDATE_CONFIG, pluginName, data });
350
+ }
351
+ async diagnosePlugin(pluginName) {
352
+ return this.sendRequest({ type: PLUGIN_RPC.DIAGNOSE, pluginName });
353
+ }
354
+ async setPluginEnabled(instanceKey, enabled) {
355
+ return this.sendRequest({ type: PLUGIN_RPC.SET_ENABLED, instanceKey, enabled });
356
+ }
357
+ async listPlugins() {
358
+ return this.getRest('/api/plugins');
359
+ }
360
+ async searchMarketplace(query = {}) {
361
+ const params = new URLSearchParams();
362
+ const normalized = {
363
+ q: query.keyword,
364
+ category: query.category,
365
+ official: query.official,
366
+ page: query.page,
367
+ size: query.pageSize,
368
+ };
369
+ for (const [key, value] of Object.entries(normalized)) {
370
+ if (value !== undefined)
371
+ params.set(key, String(value));
372
+ }
373
+ return this.getRest(`/pub/marketplace/search${params.size ? `?${params}` : ''}`);
374
+ }
375
+ async getMarketplacePlugin(packageName) {
376
+ return this.getRest(`/pub/marketplace/detail/${encodeURIComponent(packageName)}`);
377
+ }
378
+ async getPluginUpdates() {
379
+ return this.getRest('/api/marketplace/updates');
380
+ }
381
+ async testEndpoint(adapter, endpointKey) {
382
+ return this.sendRequest({ type: ENDPOINT_RPC.TEST, adapter, endpointKey });
354
383
  }
355
384
  async setConfig(pluginName, config) {
356
385
  return this.sendRequest({
357
- type: "config:set",
386
+ type: CONFIG_RPC.SET,
358
387
  pluginName,
359
388
  data: config,
360
389
  });
@@ -363,16 +392,20 @@ export class WebSocketManager {
363
392
  return this.sendRequest({ type: "schema:get", pluginName });
364
393
  }
365
394
  async getAllConfigs() {
366
- return this.sendRequest({ type: "config:get-all" });
395
+ return this.sendRequest({ type: CONFIG_RPC.GET_ALL });
367
396
  }
368
397
  async getAllSchemas() {
369
398
  return this.sendRequest({ type: "schema:get-all" });
370
399
  }
371
- async getConfigYaml() {
372
- return this.sendRequest({ type: "config:get-yaml" });
400
+ async getConfigSource() {
401
+ return this.sendRequest({ type: CONFIG_RPC.GET_SOURCE });
373
402
  }
374
- async saveConfigYaml(yaml) {
375
- return this.sendRequest({ type: "config:save-yaml", yaml });
403
+ async replaceConfigSource(source, expectedRevision) {
404
+ return this.sendRequest({
405
+ type: CONFIG_RPC.REPLACE_SOURCE,
406
+ source,
407
+ expectedRevision,
408
+ });
376
409
  }
377
410
  async getEnvList() {
378
411
  return this.sendRequest({ type: "env:list" });
@@ -425,44 +458,24 @@ export class WebSocketManager {
425
458
  async kvGetEntries(table) {
426
459
  return this.sendRequest({ type: "db:kv:entries", table });
427
460
  }
428
- buildWebSocketUrl(customUrl) {
429
- if (customUrl)
430
- return customUrl;
431
- const protocol = window.location.protocol === "https:" ? "wss:" : "ws:";
432
- return `${protocol}//${window.location.host}/server`;
461
+ async getRest(path) {
462
+ const token = getToken();
463
+ const headers = { Accept: 'application/json' };
464
+ if (token)
465
+ headers.Authorization = `Bearer ${token}`;
466
+ const response = await this.config.fetch(resolveApiUrl(path), {
467
+ headers,
468
+ signal: AbortSignal.timeout(this.config.requestTimeout),
469
+ });
470
+ const body = await response.json();
471
+ if (!response.ok || body.success === false) {
472
+ throw new ConsoleTransportError(body.error ?? `HTTP ${response.status}`, 'SERVER_ERROR');
473
+ }
474
+ return body.data;
433
475
  }
434
476
  setState(newState) {
435
477
  this.state = newState;
436
478
  }
437
- attachEventHandlers() {
438
- if (!this.ws)
439
- return;
440
- this.ws.onopen = () => this.handleConnectionOpen();
441
- this.ws.onmessage = (event) => this.handleMessage(event);
442
- this.ws.onclose = () => this.handleConnectionClose();
443
- this.ws.onerror = (event) => this.handleConnectionError(new ConnectionError("WebSocket error", event));
444
- }
445
- handleConnectionOpen() {
446
- this.setState(ConnectionState.CONNECTED);
447
- this.reconnectAttempts = 0;
448
- this.notifyConnection(true);
449
- this.callbacks.onConnect?.();
450
- }
451
- handleMessage(event) {
452
- try {
453
- const message = normalizeConsolePushMessage(JSON.parse(event.data));
454
- if (message.requestId && this.pendingRequests.has(message.requestId)) {
455
- this.handleRequestResponse(message);
456
- return;
457
- }
458
- void applyConsoleEvent(message);
459
- this.handleBroadcast(message);
460
- this.callbacks.onMessage?.(message);
461
- }
462
- catch (error) {
463
- console.error("[WebSocket] Message parsing error:", error);
464
- }
465
- }
466
479
  handleBroadcast(message) {
467
480
  const t = message.type;
468
481
  if (t === SIDE_EVENT_PUSH.REQUEST_RECEIVE
@@ -484,37 +497,6 @@ export class WebSocketManager {
484
497
  return;
485
498
  }
486
499
  }
487
- handleRequestResponse(message) {
488
- const { requestId } = message;
489
- const pending = this.pendingRequests.get(requestId);
490
- if (!pending)
491
- return;
492
- this.pendingRequests.delete(requestId);
493
- clearTimeout(pending.timer);
494
- if (message.error) {
495
- pending.reject(new WebSocketError(message.error, "SERVER_ERROR"));
496
- }
497
- else {
498
- pending.resolve(message.data);
499
- }
500
- }
501
- handleConnectionClose() {
502
- this.ws = null;
503
- this.notifyConnection(false);
504
- if (this.state === ConnectionState.DISCONNECTED)
505
- return;
506
- this.setState(ConnectionState.RECONNECTING);
507
- this.callbacks.onDisconnect?.();
508
- this.scheduleReconnect();
509
- }
510
- handleConnectionError(error) {
511
- // Used by the legacy WS path. Do NOT clear the reconnect timer here —
512
- // callers that still want to retry should set RECONNECTING then call
513
- // scheduleReconnect(). Terminal failures go through scheduleReconnect's
514
- // maxAttempts branch which sets ERROR.
515
- console.error("[Console transport] Connection error:", error);
516
- this.callbacks.onError?.(error);
517
- }
518
500
  scheduleReconnect() {
519
501
  if (this.reconnectAttempts >= this.config.maxReconnectAttempts) {
520
502
  this.setState(ConnectionState.ERROR);
@@ -541,12 +523,12 @@ export class WebSocketManager {
541
523
  this.reconnectTimer = null;
542
524
  }
543
525
  }
544
- clearPendingRequests() {
545
- for (const [, { reject, timer }] of this.pendingRequests) {
546
- clearTimeout(timer);
547
- reject(new WebSocketError("Connection closed", "CONNECTION_CLOSED"));
548
- }
549
- this.pendingRequests.clear();
526
+ assertActive() {
527
+ if (this.disposed)
528
+ throw new Error('ConsoleTransport has been disposed');
529
+ }
530
+ isCurrentConnection(generation) {
531
+ return !this.disposed && generation === this.connectionGeneration;
550
532
  }
551
533
  }
552
534
  function eventCursorStorageKey() {
@@ -578,4 +560,4 @@ function writeEventCursor(cursor) {
578
560
  // HTTP history remains available when browser storage is unavailable.
579
561
  }
580
562
  }
581
- //# sourceMappingURL=manager.js.map
563
+ //# sourceMappingURL=console-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console-transport.js","sourceRoot":"","sources":["../../client/transport/console-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,eAAe,EACf,qBAAqB,EACrB,YAAY,GAIb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EACL,UAAU,EACV,UAAU,EACV,YAAY,EACZ,gCAAgC,EAChC,eAAe,EACf,oBAAoB,GAMrB,MAAM,2BAA2B,CAAC;AAgBnC,MAAM,OAAO,gBAAgB;IACnB,MAAM,CAAmC;IACzC,SAAS,CAA4B;IACrC,KAAK,GAAoB,eAAe,CAAC,YAAY,CAAC;IACtD,iBAAiB,GAAG,CAAC,CAAC;IACtB,cAAc,GAAyC,IAAI,CAAC;IAC5D,SAAS,GAAG,CAAC,CAAC;IACd,kBAAkB,GAAG,IAAI,GAAG,EAAgC,CAAC;IAC7D,cAAc,GAAG,IAAI,GAAG,EAA6C,CAAC;IACtE,oBAAoB,GAAG,IAAI,GAAG,EAAmC,CAAC;IAClE,QAAQ,GAA2B,IAAI,CAAC;IACxC,cAAc,GAAG,EAAE,CAAC;IACpB,WAAW,GAAG,CAAC,CAAC;IAChB,oBAAoB,GAAG,KAAK,CAAC;IAC7B,QAAQ,GAAG,KAAK,CAAC;IACjB,oBAAoB,GAAG,CAAC,CAAC;IAEjC,YAAY,SAAiC,EAAE,EAAE,YAAuC,EAAE;QACxF,IAAI,CAAC,MAAM,GAAG;YACZ,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK;YACvC,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,IAAI,IAAI;YACnD,oBAAoB,EAAE,MAAM,CAAC,oBAAoB,IAAI,EAAE;YACvD,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,KAAK;SAC/C,CAAC;QACF,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,kBAAkB,CAAC,QAAsC;QACvD,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtC,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACxD,CAAC;IAED,2EAA2E;IAC3E,cAAc,CAAsB,IAAU,EAAE,QAAoC;QAClF,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC;YACtB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAC3C,CAAC;QACD,MAAM,MAAM,GAAG,QAAwC,CAAC;QACxD,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACtB,OAAO,GAAG,EAAE;YACV,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAC1B,IAAI,SAAS,EAAE,IAAI,KAAK,CAAC;gBAAE,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9D,CAAC,CAAC;IACJ,CAAC;IAED,gFAAgF;IAChF,yBAAyB,CAAC,QAAyC;QACjE,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxC,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAEO,gBAAgB,CAAC,SAAkB;QACzC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,kBAAkB;YAAE,CAAC,CAAC,SAAS,CAAC,CAAC;IACxD,CAAC;IAED,OAAO;QACL,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,IAAI,CAAC,KAAK,KAAK,eAAe,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,KAAK,eAAe,CAAC,UAAU;YAAE,OAAO;QAClG,MAAM,UAAU,GAAG,EAAE,IAAI,CAAC,oBAAoB,CAAC;QAC/C,KAAK,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACnC,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,UAAkB;QACzC,uEAAuE;QACvE,sEAAsE;QACtE,sEAAsE;QACtE,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAC1C,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,OAAO,GAA2B;gBACtC,MAAM,EAAE,mBAAmB;aAC5B,CAAC;YACF,IAAI,KAAK;gBAAE,OAAO,CAAC,aAAa,GAAG,UAAU,KAAK,EAAE,CAAC;YACrD,MAAM,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACrD,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC;gBAAE,OAAO;YAClD,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,cAAc;gBAAE,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;YACtE,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC;gBAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;YACxE,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,cAAc,MAAM,EAAE,CAAC,EAAE;gBACzE,OAAO;gBACP,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;aAC7B,CAAC,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC1C,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;gBACzB,OAAO;YACT,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBACzB,MAAM,IAAI,eAAe,CAAC,oBAAoB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9D,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;YACzC,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;YAC3B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,CAAC;YAC7B,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC;gBAAE,OAAO;YAClD,IAAK,KAAe,CAAC,IAAI,KAAK,YAAY;gBAAE,OAAO;YACnD,yEAAyE;YACzE,MAAM,eAAe,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAClF,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,eAAe,CAAC,CAAC;YAC1C,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,eAAe,CAAC,CAAC;YACzE,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;YAC5C,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;YAC7B,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,OAAO,CACnB,IAAgC,EAChC,UAAkB;QAElB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC;YACH,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC5C,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC;oBAAE,MAAM;gBACzD,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBAClD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;gBAC1C,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;gBAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;oBAC1C,IAAI,CAAC,MAAM;wBAAE,SAAS;oBACtB,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,cAAc,CAAC;oBAC1D,MAAM,KAAK,GAAyB,MAAM,CAAC,MAAM,CAAC;wBAChD,SAAS;wBACT,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,CAAC;wBAC5B,IAAI,EAAE,MAAM,CAAC,IAAI;wBACjB,IAAI,EAAE,MAAM,CAAC,IAAI;wBACjB,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE;wBACzC,QAAQ,EAAE,MAAM;qBACjB,CAAC,CAAC;oBACH,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;gBACxC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;gBAAS,CAAC;YACT,IAAI,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,KAAK,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;gBACrF,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBAC7B,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;gBAC5C,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,CAAC;gBAChC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,MAAmB;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc;YAChC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE;YAC/D,CAAC,CAAC,eAAe,EAAE,CAAC;QACtB,IAAI,SAAS,GAAG,MAAM,EAAE,SAAS,CAAC;QAClC,IAAI,KAAK,GAAG,MAAM,EAAE,OAAO,IAAI,CAAC,CAAC;QACjC,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;YAChC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QAC3B,CAAC;QACD,SAAS,CAAC;YACR,MAAM,KAAK,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAqC,CAAC;YAClF,MAAM,IAAI,GAAG,MAAM,wBAAwB,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACzF,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBACjC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;gBAC3B,KAAK,GAAG,CAAC,CAAC;gBACV,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;gBACrB,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;YACpC,CAAC;YACD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC;YACrC,IAAI,IAAI,CAAC,GAAG;gBAAE,IAAI,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACtD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC9B,MAAM,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;gBAChF,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC;YACvB,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;gBACvD,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAC/B,gBAAgB,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC7E,CAAC;gBACD,OAAO;YACT,CAAC;YACD,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC;QACzB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,KAA2B;QAC3D,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;YAC/D,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,SAAS,CAAC;YACtC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;YACrB,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;QACpC,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC;eAChB,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC,cAAc;eACvC,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAC/C,MAAM,OAAO,GAA4B,MAAM,CAAC,MAAM,CAAC;YACrD,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,SAAS;YACnC,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB,CAAC,CAAC;QACH,IAAI,CAAC;YACH,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;YACjC,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,KAAK,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAC9B,IAAI,CAAC;YACH,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,gDAAgD,EAAE,KAAK,CAAC,CAAC;QACzE,CAAC;QACD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACjE,IAAI,CAAC;gBACH,QAAQ,CAAC,KAA8C,CAAC,CAAC;YAC3D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,4CAA4C,EAAE,KAAK,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACzC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7D,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;gBAC/B,gBAAgB,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,GAA4B;QACpD,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,MAAM,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,gCAAgC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAC3F,CAAC;QACD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACjD,IAAI,CAAC;gBACH,QAAQ,CAAC,GAAG,CAAC,CAAC;YAChB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,mDAAmD,EAAE,KAAK,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC;IACH,CAAC;IAED,UAAU;QACR,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,KAAK,eAAe,CAAC,SAAS,CAAC;QAC9D,IAAI,CAAC,oBAAoB,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;QAC5C,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,YAAY;YAAE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,CAAC;IACpD,CAAC;IAED,IAAI,CAAC,OAAgB;QACnB,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,KAAK,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,WAAW,CAAc,OAAgB;QAC7C,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,2EAA2E;QAC3E,0EAA0E;QAC1E,0DAA0D;QAC1D,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC;QACnC,MAAM,IAAI,GAAG,EAAE,GAAI,OAAmC,EAAE,SAAS,EAAE,CAAC;QACpE,IAAI,CAAC;YACH,MAAM,OAAO,GAA2B;gBACtC,cAAc,EAAE,kBAAkB;aACnC,CAAC;YACF,IAAI,KAAK;gBAAE,OAAO,CAAC,aAAa,GAAG,UAAU,KAAK,EAAE,CAAC;YACrD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,sBAAsB,CAAC,EAAE;gBACzE,MAAM,EAAE,MAAM;gBACd,OAAO;gBACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAC1B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;aACxD,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAK7B,CAAC;YACF,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;gBACtC,MAAM,IAAI,qBAAqB,CAAC,IAAI,CAAC,KAAK,IAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC;YACtF,CAAC;YACD,OAAO,IAAI,CAAC,IAAS,CAAC;QACxB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,qBAAqB;gBAAE,MAAM,KAAK,CAAC;YACxD,MAAM,IAAI,YAAY,CAAC,qBAAqB,EAAE,KAAc,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,KAAK,KAAK,eAAe,CAAC,SAAS,CAAC;IAClD,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,UAAkB;QAChC,OAAO,IAAI,CAAC,WAAW,CAAU,EAAE,IAAI,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,KAAK,CAAC,iBAAiB,CAAC,WAAmB;QACzC,OAAO,IAAI,CAAC,WAAW,CAQpB,EAAE,IAAI,EAAE,UAAU,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,KAAK,CAAC,aAAa,CAAC,WAAmB,EAAE,gBAAyB;QAChE,OAAO,IAAI,CAAC,WAAW,CAIpB,EAAE,IAAI,EAAE,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,KAAK,CAAC,mBAAmB,CAAC,WAAmB;QAC3C,OAAO,IAAI,CAAC,WAAW,CAOpB,EAAE,IAAI,EAAE,UAAU,CAAC,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,KAAK,CAAC,eAAe,CAAC,WAAmB,EAAE,gBAAyB;QAClE,OAAO,IAAI,CAAC,WAAW,CAIpB;YACD,IAAI,EAAE,UAAU,CAAC,SAAS;YAC1B,WAAW;YACX,YAAY,EAAE,WAAW;YACzB,gBAAgB;SACjB,CAAC,CAAC;IACL,CAAC;IACD,KAAK,CAAC,gBAAgB,CAAC,WAAmB,EAAE,aAAqB;QAC/D,OAAO,IAAI,CAAC,WAAW,CASpB,EAAE,IAAI,EAAE,UAAU,CAAC,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,KAAK,CAAC,YAAY,CAAC,WAAmB,EAAE,aAAqB,EAAE,gBAAyB;QACtF,OAAO,IAAI,CAAC,WAAW,CAKpB,EAAE,IAAI,EAAE,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAChF,CAAC;IACD,KAAK,CAAC,oBAAoB,CAAC,UAAkB,EAAE,IAAa;QAC1D,OAAO,IAAI,CAAC,WAAW,CAIpB,EAAE,IAAI,EAAE,UAAU,CAAC,eAAe,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,KAAK,CAAC,cAAc,CAAC,UAAkB;QACrC,OAAO,IAAI,CAAC,WAAW,CAIpB,EAAE,IAAI,EAAE,UAAU,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,KAAK,CAAC,gBAAgB,CAAC,WAAmB,EAAE,OAAgB;QAC1D,OAAO,IAAI,CAAC,WAAW,CAOpB,EAAE,IAAI,EAAE,UAAU,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,KAAK,CAAC,WAAW;QACf,OAAO,IAAI,CAAC,OAAO,CAAiC,cAAc,CAAC,CAAC;IACtE,CAAC;IACD,KAAK,CAAC,iBAAiB,CAAC,QAMpB,EAAE;QACJ,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,MAAM,UAAU,GAAG;YACjB,CAAC,EAAE,KAAK,CAAC,OAAO;YAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,QAAQ;SACrB,CAAC;QACF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YACtD,IAAI,KAAK,KAAK,SAAS;gBAAE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAU,0BAA0B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5F,CAAC;IACD,KAAK,CAAC,oBAAoB,CAAC,WAAmB;QAC5C,OAAO,IAAI,CAAC,OAAO,CAAU,2BAA2B,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAC7F,CAAC;IACD,KAAK,CAAC,gBAAgB;QACpB,OAAO,IAAI,CAAC,OAAO,CAAiC,0BAA0B,CAAC,CAAC;IAClF,CAAC;IACD,KAAK,CAAC,YAAY,CAAC,OAAe,EAAE,WAAmB;QACrD,OAAO,IAAI,CAAC,WAAW,CAQpB,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IACxD,CAAC;IACD,KAAK,CAAC,SAAS,CAAC,UAAkB,EAAE,MAAe;QACjD,OAAO,IAAI,CAAC,WAAW,CAA8D;YACnF,IAAI,EAAE,UAAU,CAAC,GAAG;YACpB,UAAU;YACV,IAAI,EAAE,MAAM;SACb,CAAC,CAAC;IACL,CAAC;IACD,KAAK,CAAC,SAAS,CAAC,UAAkB;QAChC,OAAO,IAAI,CAAC,WAAW,CAAU,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,KAAK,CAAC,aAAa;QACjB,OAAO,IAAI,CAAC,WAAW,CAA0B,EAAE,IAAI,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,KAAK,CAAC,aAAa;QACjB,OAAO,IAAI,CAAC,WAAW,CAA0B,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC/E,CAAC;IACD,KAAK,CAAC,eAAe;QACnB,OAAO,IAAI,CAAC,WAAW,CAAsB,EAAE,IAAI,EAAE,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC;IAChF,CAAC;IACD,KAAK,CAAC,mBAAmB,CAAC,MAAc,EAAE,gBAAwB;QAChE,OAAO,IAAI,CAAC,WAAW,CAKpB;YACD,IAAI,EAAE,UAAU,CAAC,cAAc;YAC/B,MAAM;YACN,gBAAgB;SACjB,CAAC,CAAC;IACL,CAAC;IACD,KAAK,CAAC,UAAU;QACd,OAAO,IAAI,CAAC,WAAW,CAAsD,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IACrG,CAAC;IACD,KAAK,CAAC,UAAU,CAAC,QAAgB;QAC/B,OAAO,IAAI,CAAC,WAAW,CAAsB,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,KAAK,CAAC,WAAW,CAAC,QAAgB,EAAE,OAAe;QACjD,OAAO,IAAI,CAAC,WAAW,CAAyC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3G,CAAC;IACD,KAAK,CAAC,WAAW;QACf,OAAO,IAAI,CAAC,WAAW,CAAgD,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;IACjG,CAAC;IACD,KAAK,CAAC,QAAQ,CAAC,QAAgB;QAC7B,OAAO,IAAI,CAAC,WAAW,CAAoC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC/F,CAAC;IACD,KAAK,CAAC,QAAQ,CAAC,QAAgB,EAAE,OAAe;QAC9C,OAAO,IAAI,CAAC,WAAW,CAAyC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAC7G,CAAC;IACD,KAAK,CAAC,SAAS;QACb,OAAO,IAAI,CAAC,WAAW,CAAoC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IAClF,CAAC;IACD,KAAK,CAAC,WAAW;QACf,OAAO,IAAI,CAAC,WAAW,CAA+C,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IAC/F,CAAC;IACD,KAAK,CAAC,QAAQ,CAAC,KAAa,EAAE,IAAa,EAAE,QAAiB,EAAE,KAAe;QAC7E,OAAO,IAAI,CAAC,WAAW,CAAoC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAClH,CAAC;IACD,KAAK,CAAC,QAAQ,CAAC,KAAa,EAAE,GAAY;QACxC,OAAO,IAAI,CAAC,WAAW,CAAuB,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IACnF,CAAC;IACD,KAAK,CAAC,QAAQ,CAAC,KAAa,EAAE,GAAY,EAAE,KAAc;QACxD,OAAO,IAAI,CAAC,WAAW,CAAyC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5G,CAAC;IACD,KAAK,CAAC,QAAQ,CAAC,KAAa,EAAE,KAAc;QAC1C,OAAO,IAAI,CAAC,WAAW,CAAwC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACtG,CAAC;IACD,KAAK,CAAC,WAAW,CAAC,KAAa;QAC7B,OAAO,IAAI,CAAC,WAAW,CAAuB,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC;IAClF,CAAC;IACD,KAAK,CAAC,KAAK,CAAC,KAAa,EAAE,GAAW;QACpC,OAAO,IAAI,CAAC,WAAW,CAAkC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9F,CAAC;IACD,KAAK,CAAC,KAAK,CAAC,KAAa,EAAE,GAAW,EAAE,KAAc,EAAE,GAAY;QAClE,OAAO,IAAI,CAAC,WAAW,CAAuB,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/F,CAAC;IACD,KAAK,CAAC,QAAQ,CAAC,KAAa,EAAE,GAAW;QACvC,OAAO,IAAI,CAAC,WAAW,CAAuB,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IACtF,CAAC;IACD,KAAK,CAAC,YAAY,CAAC,KAAa;QAC9B,OAAO,IAAI,CAAC,WAAW,CAA8C,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC;IACzG,CAAC;IAEO,KAAK,CAAC,OAAO,CAAI,IAAY;QACnC,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;QACzB,MAAM,OAAO,GAA2B,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;QACvE,IAAI,KAAK;YAAE,OAAO,CAAC,aAAa,GAAG,UAAU,KAAK,EAAE,CAAC;QACrD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE;YAC5D,OAAO;YACP,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;SACxD,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAqD,CAAC;QACtF,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC3C,MAAM,IAAI,qBAAqB,CAAC,IAAI,CAAC,KAAK,IAAI,QAAQ,QAAQ,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC;QAC3F,CAAC;QACD,OAAO,IAAI,CAAC,IAAS,CAAC;IACxB,CAAC;IAEO,QAAQ,CAAC,QAAyB;QACxC,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;IACxB,CAAC;IAEO,eAAe,CAAC,OAAgC;QACtD,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;QACvB,IACE,CAAC,KAAK,eAAe,CAAC,eAAe;eAClC,CAAC,KAAK,eAAe,CAAC,cAAc;eACpC,CAAC,KAAK,eAAe,CAAC,eAAe,EACxC,CAAC;YACD,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;gBAClC,MAAM,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;YACtF,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,CAAC,KAAK,YAAY,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACzD,OAAO,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;YACjD,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,KAAK,mBAAmB,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAChE,OAAO,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;YACnE,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,CAAC;YACjD,OAAO;QACT,CAAC;IACH,CAAC;IAEO,iBAAiB;QACvB,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC;YAC/D,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YACrC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;YAC7B,OAAO;QACT,CAAC;QACD,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,0EAA0E;QAC1E,IAAI,IAAI,CAAC,KAAK,KAAK,eAAe,CAAC,YAAY,EAAE,CAAC;YAChD,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;QAC9C,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;QACrE,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE;YACpC,IACE,IAAI,CAAC,KAAK,KAAK,eAAe,CAAC,YAAY;mBACxC,IAAI,CAAC,KAAK,KAAK,eAAe,CAAC,YAAY,EAC9C,CAAC;gBACD,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,CAAC;QACH,CAAC,EAAE,KAAK,CAAC,CAAC;IACZ,CAAC;IAEO,mBAAmB;QACzB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAClC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;IACH,CAAC;IAEO,YAAY;QAClB,IAAI,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAC3E,CAAC;IAEO,mBAAmB,CAAC,UAAkB;QAC5C,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,UAAU,KAAK,IAAI,CAAC,oBAAoB,CAAC;IACpE,CAAC;CACF;AAED,SAAS,qBAAqB;IAC5B,OAAO,6BAA6B,UAAU,EAAE,EAAE,CAAC;AACrD,CAAC;AAED,SAAS,eAAe;IACtB,IAAI,OAAO,YAAY,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IACrD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,IAAI,MAAM,CAAuC,CAAC;QACzH,OAAO,MAAM;eACR,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ;eACpC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC;eACpC,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAC9B,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,OAAiB,EAAE;YACpE,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,MAA0B;IAClD,IAAI,OAAO,YAAY,KAAK,WAAW;QAAE,OAAO;IAChD,IAAI,CAAC;QACH,YAAY,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,sEAAsE;IACxE,CAAC;AACH,CAAC"}