@rowger_go/chatu 0.1.3
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/.github/workflows/ci.yml +30 -0
- package/.github/workflows/publish.yml +55 -0
- package/INSTALL.md +285 -0
- package/INSTALL.zh.md +285 -0
- package/LICENSE +21 -0
- package/README.md +293 -0
- package/README.zh.md +293 -0
- package/dist/index.d.ts +96 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1381 -0
- package/dist/index.js.map +1 -0
- package/dist/index.test.d.ts +5 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +334 -0
- package/dist/index.test.js.map +1 -0
- package/dist/sdk/adapters/cache.d.ts +94 -0
- package/dist/sdk/adapters/cache.d.ts.map +1 -0
- package/dist/sdk/adapters/cache.js +158 -0
- package/dist/sdk/adapters/cache.js.map +1 -0
- package/dist/sdk/adapters/cache.test.d.ts +14 -0
- package/dist/sdk/adapters/cache.test.d.ts.map +1 -0
- package/dist/sdk/adapters/cache.test.js +178 -0
- package/dist/sdk/adapters/cache.test.js.map +1 -0
- package/dist/sdk/adapters/default.d.ts +24 -0
- package/dist/sdk/adapters/default.d.ts.map +1 -0
- package/dist/sdk/adapters/default.js +151 -0
- package/dist/sdk/adapters/default.js.map +1 -0
- package/dist/sdk/adapters/webhub.d.ts +336 -0
- package/dist/sdk/adapters/webhub.d.ts.map +1 -0
- package/dist/sdk/adapters/webhub.js +663 -0
- package/dist/sdk/adapters/webhub.js.map +1 -0
- package/dist/sdk/adapters/websocket.d.ts +133 -0
- package/dist/sdk/adapters/websocket.d.ts.map +1 -0
- package/dist/sdk/adapters/websocket.js +314 -0
- package/dist/sdk/adapters/websocket.js.map +1 -0
- package/dist/sdk/core/channel.d.ts +104 -0
- package/dist/sdk/core/channel.d.ts.map +1 -0
- package/dist/sdk/core/channel.js +158 -0
- package/dist/sdk/core/channel.js.map +1 -0
- package/dist/sdk/index.d.ts +27 -0
- package/dist/sdk/index.d.ts.map +1 -0
- package/dist/sdk/index.js +33 -0
- package/dist/sdk/index.js.map +1 -0
- package/dist/sdk/types/adapters.d.ts +128 -0
- package/dist/sdk/types/adapters.d.ts.map +1 -0
- package/dist/sdk/types/adapters.js +10 -0
- package/dist/sdk/types/adapters.js.map +1 -0
- package/dist/sdk/types/channel.d.ts +270 -0
- package/dist/sdk/types/channel.d.ts.map +1 -0
- package/dist/sdk/types/channel.js +36 -0
- package/dist/sdk/types/channel.js.map +1 -0
- package/docs/channel/01-overview.md +117 -0
- package/docs/channel/02-configuration.md +138 -0
- package/docs/channel/03-capabilities.md +86 -0
- package/docs/channel/04-api-reference.md +394 -0
- package/docs/channel/05-message-protocol.md +194 -0
- package/docs/channel/06-security.md +83 -0
- package/docs/channel/README.md +30 -0
- package/docs/sdk/README.md +13 -0
- package/docs/sdk/v2026.1.29-v2026.2.19.md +630 -0
- package/jest.config.js +19 -0
- package/openclaw.plugin.json +113 -0
- package/package.json +74 -0
- package/run-poll.mjs +209 -0
- package/scripts/reload-plugin.sh +78 -0
- package/src/index.test.ts +432 -0
- package/src/index.ts +1638 -0
- package/src/sdk/adapters/cache.test.ts +205 -0
- package/src/sdk/adapters/cache.ts +193 -0
- package/src/sdk/adapters/default.ts +196 -0
- package/src/sdk/adapters/webhub.ts +857 -0
- package/src/sdk/adapters/websocket.ts +378 -0
- package/src/sdk/core/channel.ts +230 -0
- package/src/sdk/index.ts +36 -0
- package/src/sdk/types/adapters.ts +169 -0
- package/src/sdk/types/channel.ts +346 -0
- package/tsconfig.json +31 -0
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
/******************************************************************
|
|
2
|
+
* Channel SDK - WebHub Adapter with Performance Degradation
|
|
3
|
+
*
|
|
4
|
+
* 支持从高性能到低性能的优雅退化:
|
|
5
|
+
* 1. WebSocket (最高性能) - 实时双向通信
|
|
6
|
+
* 2. Server-Sent Events (SSE) - 单向推送
|
|
7
|
+
* 3. HTTP Polling (最低性能) - 简单轮询
|
|
8
|
+
*
|
|
9
|
+
* URL 从 config.webhubUrl 配置中获取
|
|
10
|
+
*
|
|
11
|
+
* @see https://github.com/chatu-ai/openclaw-web-hub-channel
|
|
12
|
+
******************************************************************/
|
|
13
|
+
import { InboundMessage, OutboundMessage, SendResult, ConnectionConfig, ConnectionStatus, ChannelStats, MessageType, TargetType } from '../types/channel';
|
|
14
|
+
import type { ConnectionAdapter, MessageCallback, StatusCallback, AdapterFactory } from '../types/adapters';
|
|
15
|
+
/**
|
|
16
|
+
* 将 WebHub API 原始消息 JSON 映射为 Channel SDK InboundMessage 格式。
|
|
17
|
+
*
|
|
18
|
+
* 这是跨层映射的唯一位置 (SC-003):
|
|
19
|
+
* - WebHub sender.name → InboundMessage.sender.displayName
|
|
20
|
+
* - WebHub sender.avatar → InboundMessage.sender.avatarUrl
|
|
21
|
+
* - WebHub authorDisplayName (旧字段兼容) → InboundMessage.sender.displayName
|
|
22
|
+
* - WebHub authorId (旧字段兼容) → InboundMessage.sender.id
|
|
23
|
+
* - WebHub replyTo.id → InboundMessage.replyTo.messageId
|
|
24
|
+
* - WebHub replyTo.quoteText → InboundMessage.replyTo.quotedText
|
|
25
|
+
* - WebHub content (string 或 {text}) → InboundMessage.content.text
|
|
26
|
+
* - WebHub createdAt (string) → InboundMessage.timestamp (ms)
|
|
27
|
+
*/
|
|
28
|
+
export declare function mapRawToInboundMessage(raw: unknown): InboundMessage;
|
|
29
|
+
/**
|
|
30
|
+
* 将 Channel SDK Media 对象映射为 WebHub API 可接受的媒体格式。
|
|
31
|
+
*
|
|
32
|
+
* Channel SDK Media 字段名称(thumbnailUrl / width / height)已与 WebHub 对齐;
|
|
33
|
+
* 此函数负责补充 WebHub 要求但 SDK 未提供的 filename 字段(从 url 推断),
|
|
34
|
+
* 是全局唯一的媒体映射位置(SC-003)。
|
|
35
|
+
*
|
|
36
|
+
* @param media - Channel SDK Media 对象
|
|
37
|
+
* @returns WebHub 媒体对象
|
|
38
|
+
*/
|
|
39
|
+
export declare function mapChannelSdkMedia(media: {
|
|
40
|
+
type: MessageType;
|
|
41
|
+
url: string;
|
|
42
|
+
mimeType?: string;
|
|
43
|
+
size?: number;
|
|
44
|
+
width?: number;
|
|
45
|
+
height?: number;
|
|
46
|
+
duration?: number;
|
|
47
|
+
thumbnailUrl?: string;
|
|
48
|
+
}): {
|
|
49
|
+
type: MessageType;
|
|
50
|
+
url: string;
|
|
51
|
+
mimeType?: string;
|
|
52
|
+
size?: number;
|
|
53
|
+
width?: number;
|
|
54
|
+
height?: number;
|
|
55
|
+
duration?: number;
|
|
56
|
+
thumbnailUrl?: string;
|
|
57
|
+
filename?: string;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* 性能模式
|
|
61
|
+
*/
|
|
62
|
+
export type PerformanceMode = 'websocket' | 'sse' | 'polling';
|
|
63
|
+
/**
|
|
64
|
+
* WebHub 适配器配置 (继承 ConnectionConfig)
|
|
65
|
+
*/
|
|
66
|
+
export interface WebHubAdapterConfig extends ConnectionConfig {
|
|
67
|
+
/** 首选性能模式 (默认: websocket) */
|
|
68
|
+
preferredMode?: PerformanceMode;
|
|
69
|
+
/** SSE URL 路径 */
|
|
70
|
+
ssePath?: string;
|
|
71
|
+
/** 轮询间隔 (毫秒) */
|
|
72
|
+
pollInterval?: number;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* WebHub 适配器
|
|
76
|
+
*
|
|
77
|
+
* 支持三种模式的优雅退化:
|
|
78
|
+
* - WebSocket: 实时双向通信
|
|
79
|
+
* - SSE: 单向推送 + HTTP 发送
|
|
80
|
+
* - Polling: HTTP 轮询
|
|
81
|
+
*
|
|
82
|
+
* URL 从 config.webhubUrl 配置中获取
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* ```typescript
|
|
86
|
+
* // 配置时设置 webhubUrl
|
|
87
|
+
* const channel = new Channel({
|
|
88
|
+
* config: {
|
|
89
|
+
* channelId: 'wh_ch_xxx',
|
|
90
|
+
* accessToken: 'token_xxx',
|
|
91
|
+
* webhubUrl: 'http://localhost:3000', // 从配置获取
|
|
92
|
+
* }
|
|
93
|
+
* });
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
96
|
+
export declare class WebHubAdapter implements ConnectionAdapter {
|
|
97
|
+
/** 配置 [Channel SDK 标准] */
|
|
98
|
+
config: WebHubAdapterConfig;
|
|
99
|
+
/** 当前状态 [Channel SDK 标准] */
|
|
100
|
+
private _status;
|
|
101
|
+
/** 实际使用的性能模式 */
|
|
102
|
+
private currentMode;
|
|
103
|
+
/** WebHub URL (从配置获取) */
|
|
104
|
+
private get webhubUrl();
|
|
105
|
+
/** 消息回调 [Channel SDK 标准] */
|
|
106
|
+
private messageCallbacks;
|
|
107
|
+
/** 状态回调 [Channel SDK 标准] */
|
|
108
|
+
private statusCallbacks;
|
|
109
|
+
/** 待确认消息 */
|
|
110
|
+
private pendingMessages;
|
|
111
|
+
/** 最后心跳时间 */
|
|
112
|
+
private lastHeartbeat;
|
|
113
|
+
/** 心跳定时器 */
|
|
114
|
+
private heartbeatTimer;
|
|
115
|
+
/** 轮询定时器 */
|
|
116
|
+
private pollTimer;
|
|
117
|
+
/** SSE EventSource */
|
|
118
|
+
private eventSource;
|
|
119
|
+
/** WebSocket 实例 */
|
|
120
|
+
private ws;
|
|
121
|
+
/** 统计 [Channel SDK 标准] */
|
|
122
|
+
private stats;
|
|
123
|
+
/**
|
|
124
|
+
* 创建 WebHub 适配器
|
|
125
|
+
*/
|
|
126
|
+
constructor(config: WebHubAdapterConfig);
|
|
127
|
+
/**
|
|
128
|
+
* 获取当前状态 [Channel SDK 标准]
|
|
129
|
+
*/
|
|
130
|
+
get status(): ConnectionStatus;
|
|
131
|
+
/**
|
|
132
|
+
* 获取实际使用的性能模式
|
|
133
|
+
*/
|
|
134
|
+
get mode(): PerformanceMode;
|
|
135
|
+
/**
|
|
136
|
+
* 连接到 WebHub [Channel SDK 标准]
|
|
137
|
+
*/
|
|
138
|
+
connect(): Promise<void>;
|
|
139
|
+
/**
|
|
140
|
+
* 获取完整的 WebHub URL
|
|
141
|
+
*/
|
|
142
|
+
private getUrl;
|
|
143
|
+
/**
|
|
144
|
+
* 尝试 WebSocket 连接
|
|
145
|
+
*/
|
|
146
|
+
private tryWebSocket;
|
|
147
|
+
/**
|
|
148
|
+
* 尝试 SSE 连接
|
|
149
|
+
*/
|
|
150
|
+
private trySSE;
|
|
151
|
+
/**
|
|
152
|
+
* 清理 WebSocket
|
|
153
|
+
*/
|
|
154
|
+
private cleanupWebSocket;
|
|
155
|
+
/**
|
|
156
|
+
* 清理 SSE
|
|
157
|
+
*/
|
|
158
|
+
private cleanupSSE;
|
|
159
|
+
/**
|
|
160
|
+
* 注册频道
|
|
161
|
+
*/
|
|
162
|
+
private register;
|
|
163
|
+
/**
|
|
164
|
+
* 连接到 Hub
|
|
165
|
+
*/
|
|
166
|
+
private connectToHub;
|
|
167
|
+
/**
|
|
168
|
+
* 断开连接 [Channel SDK 标准]
|
|
169
|
+
*/
|
|
170
|
+
disconnect(): Promise<void>;
|
|
171
|
+
/**
|
|
172
|
+
* 发送消息 [Channel SDK 标准]
|
|
173
|
+
*/
|
|
174
|
+
send(message: OutboundMessage): Promise<SendResult>;
|
|
175
|
+
/**
|
|
176
|
+
* US3 Cross-Channel Relay: forward a message from another OpenClaw channel
|
|
177
|
+
* to this ChatU WebHub channel so it appears in the frontend with a special
|
|
178
|
+
* source-channel badge.
|
|
179
|
+
*
|
|
180
|
+
* Calls POST /api/channel/cross-channel-messages authenticated via
|
|
181
|
+
* X-Access-Token (same token used for polling / outbound delivery).
|
|
182
|
+
*
|
|
183
|
+
* @param payload - Cross-channel message payload
|
|
184
|
+
* @returns Resolves with the stored message id, channelId and createdAt from the service
|
|
185
|
+
*/
|
|
186
|
+
postCrossChannelMessage(payload: {
|
|
187
|
+
/** Originating channel id (lowercase, max 64 chars, /^[a-z0-9_-]{1,64}$/) */
|
|
188
|
+
sourceChannel: string;
|
|
189
|
+
/** 'inbound' = AI reply, 'outbound' = user message */
|
|
190
|
+
direction: 'inbound' | 'outbound';
|
|
191
|
+
/** Sender object — id is optional, name is required */
|
|
192
|
+
sender: {
|
|
193
|
+
id?: string;
|
|
194
|
+
name: string;
|
|
195
|
+
};
|
|
196
|
+
/** Text content of the message */
|
|
197
|
+
content: string;
|
|
198
|
+
/** Session key from the originating channel */
|
|
199
|
+
sessionKey: string;
|
|
200
|
+
/** Optional extra metadata forwarded as-is */
|
|
201
|
+
metadata?: Record<string, unknown>;
|
|
202
|
+
}): Promise<{
|
|
203
|
+
id: string;
|
|
204
|
+
channelId: string;
|
|
205
|
+
createdAt: string;
|
|
206
|
+
}>;
|
|
207
|
+
/**
|
|
208
|
+
* 订阅消息 [Channel SDK 标准]
|
|
209
|
+
*/
|
|
210
|
+
onMessage(callback: MessageCallback): void;
|
|
211
|
+
/**
|
|
212
|
+
* 订阅状态变化 [Channel SDK 标准]
|
|
213
|
+
*/
|
|
214
|
+
onStatusChange(callback: StatusCallback): void;
|
|
215
|
+
/**
|
|
216
|
+
* 获取统计 [Channel SDK 标准]
|
|
217
|
+
*/
|
|
218
|
+
getStats(): Promise<ChannelStats>;
|
|
219
|
+
/**
|
|
220
|
+
* 发起 HTTP 请求
|
|
221
|
+
*/
|
|
222
|
+
private request;
|
|
223
|
+
/**
|
|
224
|
+
* 启动轮询接收消息
|
|
225
|
+
*/
|
|
226
|
+
private startPolling;
|
|
227
|
+
/**
|
|
228
|
+
* 停止轮询
|
|
229
|
+
*/
|
|
230
|
+
private stopPolling;
|
|
231
|
+
/**
|
|
232
|
+
* 启动心跳
|
|
233
|
+
*/
|
|
234
|
+
private startHeartbeat;
|
|
235
|
+
/**
|
|
236
|
+
* 停止心跳
|
|
237
|
+
*/
|
|
238
|
+
private stopHeartbeat;
|
|
239
|
+
/**
|
|
240
|
+
* 通知消息
|
|
241
|
+
*/
|
|
242
|
+
private notifyMessage;
|
|
243
|
+
/**
|
|
244
|
+
* 通知状态变化
|
|
245
|
+
*/
|
|
246
|
+
private notifyStatus;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* 性能模式配置
|
|
250
|
+
*/
|
|
251
|
+
export interface PerformanceModeConfig {
|
|
252
|
+
/** 首选模式 */
|
|
253
|
+
preferred: PerformanceMode;
|
|
254
|
+
/** WebSocket 配置 */
|
|
255
|
+
websocket?: {
|
|
256
|
+
/** 重试次数 */
|
|
257
|
+
maxRetries?: number;
|
|
258
|
+
/** 重试间隔 (毫秒) */
|
|
259
|
+
retryInterval?: number;
|
|
260
|
+
};
|
|
261
|
+
/** SSE 配置 */
|
|
262
|
+
sse?: {
|
|
263
|
+
/** 重试次数 */
|
|
264
|
+
maxRetries?: number;
|
|
265
|
+
};
|
|
266
|
+
/** Polling 配置 */
|
|
267
|
+
polling?: {
|
|
268
|
+
/** 轮询间隔 (毫秒) */
|
|
269
|
+
interval?: number;
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* WebHub 适配器工厂
|
|
274
|
+
*/
|
|
275
|
+
export declare class WebHubAdapterFactory implements AdapterFactory {
|
|
276
|
+
/** 性能模式配置 */
|
|
277
|
+
private modeConfig;
|
|
278
|
+
constructor(modeConfig?: PerformanceModeConfig);
|
|
279
|
+
/**
|
|
280
|
+
* 创建 WebHub 适配器 (从 config.webhubUrl 获取 URL)
|
|
281
|
+
*/
|
|
282
|
+
createConnectionAdapter(config: ConnectionConfig): ConnectionAdapter;
|
|
283
|
+
/**
|
|
284
|
+
* 创建消息适配器
|
|
285
|
+
*/
|
|
286
|
+
createMessageAdapter(): {
|
|
287
|
+
parseInbound: typeof mapRawToInboundMessage;
|
|
288
|
+
formatOutbound: (message: OutboundMessage) => unknown;
|
|
289
|
+
validate: (message: unknown) => boolean;
|
|
290
|
+
sanitize: (text: string) => string;
|
|
291
|
+
};
|
|
292
|
+
/**
|
|
293
|
+
* 创建心跳适配器
|
|
294
|
+
*/
|
|
295
|
+
createHeartbeatAdapter(): {
|
|
296
|
+
send: () => Promise<boolean>;
|
|
297
|
+
handleResponse: () => void;
|
|
298
|
+
isTimeout: () => boolean;
|
|
299
|
+
getNextHeartbeatTime: () => number;
|
|
300
|
+
};
|
|
301
|
+
/**
|
|
302
|
+
* 创建认证适配器
|
|
303
|
+
*/
|
|
304
|
+
createAuthAdapter(): {
|
|
305
|
+
getAuthHeaders: () => Record<string, string>;
|
|
306
|
+
validateResponse: (response: unknown) => boolean;
|
|
307
|
+
refreshToken: () => Promise<boolean>;
|
|
308
|
+
};
|
|
309
|
+
/**
|
|
310
|
+
* 创建能力适配器
|
|
311
|
+
*/
|
|
312
|
+
createCapabilitiesAdapter(): {
|
|
313
|
+
getCapabilities: () => Promise<{
|
|
314
|
+
messageTypes: MessageType[];
|
|
315
|
+
targetTypes: TargetType[];
|
|
316
|
+
richFormats: ("markdown" | "html")[];
|
|
317
|
+
attachments: boolean;
|
|
318
|
+
reply: boolean;
|
|
319
|
+
}>;
|
|
320
|
+
hasCapability: () => boolean;
|
|
321
|
+
};
|
|
322
|
+
/**
|
|
323
|
+
* 创建日志适配器
|
|
324
|
+
*/
|
|
325
|
+
createLoggerAdapter(): {
|
|
326
|
+
debug: (message: string, data?: unknown) => void;
|
|
327
|
+
info: (message: string, data?: unknown) => void;
|
|
328
|
+
warn: (message: string, data?: unknown) => void;
|
|
329
|
+
error: (message: string, error?: Error) => void;
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* 创建 WebHub 适配器工厂
|
|
334
|
+
*/
|
|
335
|
+
export declare function createWebHubFactory(modeConfig?: PerformanceModeConfig): WebHubAdapterFactory;
|
|
336
|
+
//# sourceMappingURL=webhub.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhub.d.ts","sourceRoot":"","sources":["../../../src/sdk/adapters/webhub.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;oEAWoE;AAEpE,OAAO,EACL,cAAc,EACd,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,UAAU,EAEX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,cAAc,EACf,MAAM,mBAAmB,CAAC;AAG3B;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,CAwEnE;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,IAAI,EAAE,WAAW,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG;IACF,IAAI,EAAE,WAAW,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAgBA;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,KAAK,GAAG,SAAS,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,gBAAgB;IAC3D,6BAA6B;IAC7B,aAAa,CAAC,EAAE,eAAe,CAAC;IAChC,iBAAiB;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAcD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,aAAc,YAAW,iBAAiB;IACrD,0BAA0B;IACnB,MAAM,EAAE,mBAAmB,CAAC;IAEnC,4BAA4B;IAC5B,OAAO,CAAC,OAAO,CAAoC;IAEnD,gBAAgB;IAChB,OAAO,CAAC,WAAW,CAA8B;IAEjD,yBAAyB;IACzB,OAAO,KAAK,SAAS,GAEpB;IAED,4BAA4B;IAC5B,OAAO,CAAC,gBAAgB,CAAmC;IAE3D,4BAA4B;IAC5B,OAAO,CAAC,eAAe,CAAkC;IAEzD,YAAY;IACZ,OAAO,CAAC,eAAe,CAAiD;IAExE,aAAa;IACb,OAAO,CAAC,aAAa,CAAa;IAElC,YAAY;IACZ,OAAO,CAAC,cAAc,CAA+C;IAErE,YAAY;IACZ,OAAO,CAAC,SAAS,CAA+C;IAEhE,sBAAsB;IACtB,OAAO,CAAC,WAAW,CAA4B;IAE/C,mBAAmB;IACnB,OAAO,CAAC,EAAE,CAA0B;IAEpC,0BAA0B;IAC1B,OAAO,CAAC,KAAK,CAKX;IAEF;;OAEG;gBACS,MAAM,EAAE,mBAAmB;IAYvC;;OAEG;IACH,IAAI,MAAM,IAAI,gBAAgB,CAE7B;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,eAAe,CAE1B;IAED;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAkD9B;;OAEG;IACH,OAAO,CAAC,MAAM;IAMd;;OAEG;YACW,YAAY;IAmD1B;;OAEG;YACW,MAAM;IA2CpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;OAEG;IACH,OAAO,CAAC,UAAU;IAOlB;;OAEG;YACW,QAAQ;IAatB;;OAEG;YACW,YAAY;IAU1B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBjC;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC;IAiDzD;;;;;;;;;;OAUG;IACG,uBAAuB,CAAC,OAAO,EAAE;QACrC,6EAA6E;QAC7E,aAAa,EAAE,MAAM,CAAC;QACtB,sDAAsD;QACtD,SAAS,EAAE,SAAS,GAAG,UAAU,CAAC;QAClC,uDAAuD;QACvD,MAAM,EAAE;YAAE,EAAE,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;QACtC,kCAAkC;QAClC,OAAO,EAAE,MAAM,CAAC;QAChB,+CAA+C;QAC/C,UAAU,EAAE,MAAM,CAAC;QACnB,8CAA8C;QAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACpC,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAgBjE;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IAI1C;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;IAI9C;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,YAAY,CAAC;IAOvC;;OAEG;YACW,OAAO;IAsBrB;;OAEG;IACH,OAAO,CAAC,YAAY;IAsBpB;;OAEG;IACH,OAAO,CAAC,WAAW;IAOnB;;OAEG;IACH,OAAO,CAAC,cAAc;IAStB;;OAEG;IACH,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACH,OAAO,CAAC,aAAa;IAIrB;;OAEG;IACH,OAAO,CAAC,YAAY;CAGrB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,WAAW;IACX,SAAS,EAAE,eAAe,CAAC;IAC3B,mBAAmB;IACnB,SAAS,CAAC,EAAE;QACV,WAAW;QACX,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,gBAAgB;QAChB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,aAAa;IACb,GAAG,CAAC,EAAE;QACJ,WAAW;QACX,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,iBAAiB;IACjB,OAAO,CAAC,EAAE;QACR,gBAAgB;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED;;GAEG;AACH,qBAAa,oBAAqB,YAAW,cAAc;IACzD,aAAa;IACb,OAAO,CAAC,UAAU,CAAwB;gBAE9B,UAAU,CAAC,EAAE,qBAAqB;IAS9C;;OAEG;IACH,uBAAuB,CAAC,MAAM,EAAE,gBAAgB,GAAG,iBAAiB;IAIpE;;OAEG;IACH,oBAAoB;;kCAGU,eAAe,KAAG,OAAO;4BAC/B,OAAO,KAAG,OAAO;yBACpB,MAAM,KAAG,MAAM;;IAIpC;;OAEG;IACH,sBAAsB;oBAEF,OAAO,CAAC,OAAO,CAAC;8BACZ,IAAI;yBACT,OAAO;oCACI,MAAM;;IAIpC;;OAEG;IACH,iBAAiB;8BAEO,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;qCACb,OAAO,KAAG,OAAO;4BACtB,OAAO,CAAC,OAAO,CAAC;;IAI5C;;OAEG;IACH,yBAAyB;;;;yBAKU,CAAC,UAAU,GAAG,MAAM,CAAC,EAAE;;;;6BAInC,OAAO;;IAI9B;;OAEG;IACH,mBAAmB;yBAEE,MAAM,SAAS,OAAO,KAAG,IAAI;wBAC9B,MAAM,SAAS,OAAO,KAAG,IAAI;wBAC7B,MAAM,SAAS,OAAO,KAAG,IAAI;yBAC5B,MAAM,UAAU,KAAK,KAAG,IAAI;;CAGlD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,CAAC,EAAE,qBAAqB,GAAG,oBAAoB,CAE5F"}
|