@lanbaolu/dsh-wechat-bridge 0.1.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 (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +152 -0
  3. package/cordis.patch.yml +12 -0
  4. package/docs/feasibility-plan.md +62 -0
  5. package/lib/bridge/commands/handlers.js +155 -0
  6. package/lib/bridge/commands/handlers.js.map +1 -0
  7. package/lib/bridge/commands/router.js +52 -0
  8. package/lib/bridge/commands/router.js.map +1 -0
  9. package/lib/bridge/config.js +40 -0
  10. package/lib/bridge/config.js.map +1 -0
  11. package/lib/bridge/constants.js +14 -0
  12. package/lib/bridge/constants.js.map +1 -0
  13. package/lib/bridge/dsh-client.js +100 -0
  14. package/lib/bridge/dsh-client.js.map +1 -0
  15. package/lib/bridge/logger.js +75 -0
  16. package/lib/bridge/logger.js.map +1 -0
  17. package/lib/bridge/main.js +546 -0
  18. package/lib/bridge/main.js.map +1 -0
  19. package/lib/bridge/pending-queue.js +55 -0
  20. package/lib/bridge/pending-queue.js.map +1 -0
  21. package/lib/bridge/session.js +84 -0
  22. package/lib/bridge/session.js.map +1 -0
  23. package/lib/bridge/store.js +38 -0
  24. package/lib/bridge/store.js.map +1 -0
  25. package/lib/bridge/wechat/accounts.js +50 -0
  26. package/lib/bridge/wechat/accounts.js.map +1 -0
  27. package/lib/bridge/wechat/api.js +197 -0
  28. package/lib/bridge/wechat/api.js.map +1 -0
  29. package/lib/bridge/wechat/cdn.js +45 -0
  30. package/lib/bridge/wechat/cdn.js.map +1 -0
  31. package/lib/bridge/wechat/crypto.js +17 -0
  32. package/lib/bridge/wechat/crypto.js.map +1 -0
  33. package/lib/bridge/wechat/login.js +139 -0
  34. package/lib/bridge/wechat/login.js.map +1 -0
  35. package/lib/bridge/wechat/media.js +138 -0
  36. package/lib/bridge/wechat/media.js.map +1 -0
  37. package/lib/bridge/wechat/monitor.js +104 -0
  38. package/lib/bridge/wechat/monitor.js.map +1 -0
  39. package/lib/bridge/wechat/send.js +172 -0
  40. package/lib/bridge/wechat/send.js.map +1 -0
  41. package/lib/bridge/wechat/sync-buf.js +11 -0
  42. package/lib/bridge/wechat/sync-buf.js.map +1 -0
  43. package/lib/bridge/wechat/types.js +35 -0
  44. package/lib/bridge/wechat/types.js.map +1 -0
  45. package/lib/bridge/wechat/upload.js +111 -0
  46. package/lib/bridge/wechat/upload.js.map +1 -0
  47. package/lib/client/Panel.js +205 -0
  48. package/lib/client/Panel.js.map +1 -0
  49. package/lib/client/index.js +11 -0
  50. package/lib/client/index.js.map +1 -0
  51. package/lib/client.js +376 -0
  52. package/lib/client.js.map +1 -0
  53. package/lib/index.js +828 -0
  54. package/lib/index.js.map +1 -0
  55. package/lib/types/bridge/commands/handlers.d.ts +18 -0
  56. package/lib/types/bridge/commands/router.d.ts +26 -0
  57. package/lib/types/bridge/config.d.ts +7 -0
  58. package/lib/types/bridge/constants.d.ts +10 -0
  59. package/lib/types/bridge/dsh-client.d.ts +39 -0
  60. package/lib/types/bridge/logger.d.ts +13 -0
  61. package/lib/types/bridge/main.d.ts +1 -0
  62. package/lib/types/bridge/pending-queue.d.ts +10 -0
  63. package/lib/types/bridge/session.d.ts +22 -0
  64. package/lib/types/bridge/store.d.ts +11 -0
  65. package/lib/types/bridge/wechat/accounts.d.ts +14 -0
  66. package/lib/types/bridge/wechat/api.d.ts +32 -0
  67. package/lib/types/bridge/wechat/cdn.d.ts +2 -0
  68. package/lib/types/bridge/wechat/crypto.d.ts +4 -0
  69. package/lib/types/bridge/wechat/login.d.ts +31 -0
  70. package/lib/types/bridge/wechat/media.d.ts +20 -0
  71. package/lib/types/bridge/wechat/monitor.d.ts +10 -0
  72. package/lib/types/bridge/wechat/send.d.ts +6 -0
  73. package/lib/types/bridge/wechat/sync-buf.d.ts +2 -0
  74. package/lib/types/bridge/wechat/types.d.ts +135 -0
  75. package/lib/types/bridge/wechat/upload.d.ts +11 -0
  76. package/lib/types/client/Panel.d.ts +3 -0
  77. package/lib/types/client/index.d.ts +9 -0
  78. package/lib/types/index.d.ts +39 -0
  79. package/package.json +92 -0
@@ -0,0 +1,111 @@
1
+ import { createHash, randomBytes } from 'node:crypto';
2
+ import { readFileSync, statSync } from 'node:fs';
3
+ import { basename, extname } from 'node:path';
4
+ import { encryptAesEcb, aesEcbPaddedSize } from './crypto.js';
5
+ import { UploadMediaType } from './types.js';
6
+ import { CDN_BASE_URL } from '../constants.js';
7
+ import { logger } from '../logger.js';
8
+ const MAX_FILE_SIZE = 25 * 1024 * 1024; // 25MB
9
+ const IMAGE_EXTENSIONS = new Set(['.png', '.jpg', '.jpeg', '.gif', '.webp', '.bmp', '.svg', '.ico']);
10
+ export function isImageFile(filePath) {
11
+ return IMAGE_EXTENSIONS.has(extname(filePath).toLowerCase());
12
+ }
13
+ export async function uploadFile(api, toUserId, filePath) {
14
+ const stat = statSync(filePath);
15
+ if (stat.size > MAX_FILE_SIZE) {
16
+ throw new Error(`文件过大 (${(stat.size / 1024 / 1024).toFixed(1)}MB),最大支持 25MB`);
17
+ }
18
+ const fileName = basename(filePath);
19
+ const isImage = isImageFile(filePath);
20
+ const mediaType = isImage ? UploadMediaType.IMAGE : UploadMediaType.FILE;
21
+ // Prepare file
22
+ const plaintext = readFileSync(filePath);
23
+ const rawSize = plaintext.length;
24
+ const rawFileMd5 = createHash('md5').update(plaintext).digest('hex');
25
+ const fileSize = aesEcbPaddedSize(rawSize);
26
+ const fileKey = randomBytes(16).toString('hex'); // 32-hex-char string
27
+ const aesKey = randomBytes(16); // 16 raw bytes
28
+ const aesKeyHex = aesKey.toString('hex');
29
+ // Get upload URL
30
+ logger.info('Requesting upload URL', { fileName, rawSize, mediaType, toUserId });
31
+ const uploadResp = await api.getUploadUrl({
32
+ filekey: fileKey,
33
+ media_type: mediaType,
34
+ to_user_id: toUserId,
35
+ rawsize: rawSize,
36
+ rawfilemd5: rawFileMd5,
37
+ filesize: fileSize,
38
+ no_need_thumb: true,
39
+ aeskey: aesKeyHex,
40
+ base_info: {
41
+ channel_version: '2.0.0',
42
+ bot_agent: 'wechat-claude-code',
43
+ },
44
+ });
45
+ logger.info('Upload URL response', { uploadResp });
46
+ if (!uploadResp.upload_full_url && !uploadResp.upload_param) {
47
+ throw new Error(`获取上传地址失败: ${JSON.stringify(uploadResp)}`);
48
+ }
49
+ // Encrypt
50
+ const encrypted = encryptAesEcb(aesKey, plaintext);
51
+ // Build CDN upload URL
52
+ let uploadUrl;
53
+ if (uploadResp.upload_full_url) {
54
+ uploadUrl = uploadResp.upload_full_url;
55
+ }
56
+ else {
57
+ uploadUrl = `${CDN_BASE_URL}/upload?encrypted_query_param=${encodeURIComponent(uploadResp.upload_param)}&filekey=${fileKey}`;
58
+ }
59
+ logger.info('Uploading to CDN', { uploadUrl, encryptedSize: encrypted.length });
60
+ // Upload to CDN (POST, get download param from response header)
61
+ const encryptQueryParam = await uploadToCdn(uploadUrl, encrypted);
62
+ logger.info('CDN upload succeeded', { fileName });
63
+ return {
64
+ mediaType: isImage ? 'image' : 'file',
65
+ encryptQueryParam,
66
+ aesKeyHex,
67
+ fileName,
68
+ fileSize,
69
+ rawSize,
70
+ };
71
+ }
72
+ async function uploadToCdn(url, encrypted) {
73
+ const MAX_RETRIES = 3;
74
+ for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
75
+ const controller = new AbortController();
76
+ const timer = setTimeout(() => controller.abort(), 60_000);
77
+ try {
78
+ const res = await fetch(url, {
79
+ method: 'POST',
80
+ body: new Uint8Array(encrypted),
81
+ signal: controller.signal,
82
+ headers: { 'Content-Type': 'application/octet-stream' },
83
+ });
84
+ if (res.status >= 400 && res.status < 500) {
85
+ const text = await res.text();
86
+ throw new Error(`CDN 上传失败 (4xx): ${res.status} ${text.slice(0, 200)}`);
87
+ }
88
+ if (res.status >= 500) {
89
+ logger.warn('CDN upload 5xx, retrying', { status: res.status, attempt });
90
+ continue;
91
+ }
92
+ // Get download param from response header
93
+ const param = res.headers.get('x-encrypted-param');
94
+ if (!param) {
95
+ throw new Error('CDN 上传成功但未返回 x-encrypted-param');
96
+ }
97
+ return param;
98
+ }
99
+ catch (err) {
100
+ if (err instanceof DOMException && err.name === 'AbortError') {
101
+ throw new Error('CDN 上传超时');
102
+ }
103
+ throw err;
104
+ }
105
+ finally {
106
+ clearTimeout(timer);
107
+ }
108
+ }
109
+ throw new Error('CDN 上传失败: 多次重试后仍失败');
110
+ }
111
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../../src/bridge/wechat/upload.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,205 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useState } from 'react';
3
+ const API_BASE = '/@lanbaolu/dsh-wechat-bridge';
4
+ const panelStyle = {
5
+ padding: '14px 16px',
6
+ fontFamily: 'ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif',
7
+ fontSize: 13,
8
+ lineHeight: 1.6,
9
+ color: 'var(--text-1, #1f2328)',
10
+ background: 'var(--surface-2, rgba(127,127,127,.06))',
11
+ border: '1px solid var(--border-color, rgba(127,127,127,.18))',
12
+ borderRadius: 10,
13
+ margin: '8px 0',
14
+ };
15
+ const titleStyle = {
16
+ fontWeight: 600,
17
+ fontSize: 14,
18
+ marginBottom: 8,
19
+ };
20
+ const outputStyle = {
21
+ margin: '4px 0 8px',
22
+ padding: '8px 10px',
23
+ background: 'var(--surface-3, rgba(0,0,0,.04))',
24
+ border: '1px solid var(--border-color, rgba(127,127,127,.15))',
25
+ borderRadius: 6,
26
+ whiteSpace: 'pre-wrap',
27
+ wordBreak: 'break-all',
28
+ fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace',
29
+ fontSize: 12,
30
+ maxHeight: 360,
31
+ overflow: 'auto',
32
+ };
33
+ const buttonRowStyle = {
34
+ display: 'flex',
35
+ gap: 8,
36
+ flexWrap: 'wrap',
37
+ alignItems: 'center',
38
+ };
39
+ const buttonStyle = {
40
+ padding: '4px 10px',
41
+ border: '1px solid var(--border-color, rgba(127,127,127,.4))',
42
+ borderRadius: 6,
43
+ background: 'var(--button-bg, #fff)',
44
+ color: 'var(--text-1, inherit)',
45
+ cursor: 'pointer',
46
+ fontSize: 12,
47
+ };
48
+ const inputStyle = {
49
+ padding: '4px 8px',
50
+ border: '1px solid var(--border-color, rgba(127,127,127,.4))',
51
+ borderRadius: 6,
52
+ background: 'var(--surface-3, rgba(127,127,127,.06))',
53
+ color: 'var(--text-1, inherit)',
54
+ fontSize: 12,
55
+ minWidth: 220,
56
+ };
57
+ const hintStyle = {
58
+ marginTop: 8,
59
+ fontSize: 12,
60
+ opacity: 0.7,
61
+ };
62
+ export function WechatBridgePanel(_props) {
63
+ const [output, setOutput] = useState('加载中…');
64
+ const [error, setError] = useState(null);
65
+ const [busy, setBusy] = useState(null);
66
+ const [workingDir, setWorkingDir] = useState('');
67
+ const [setupPhase, setSetupPhase] = useState('idle');
68
+ const [qrcodeDataUrl, setQrcodeDataUrl] = useState('');
69
+ const [qrcodeId, setQrcodeId] = useState('');
70
+ const [setupError, setSetupError] = useState('');
71
+ const [boundAccountId, setBoundAccountId] = useState('');
72
+ const refresh = useCallback(async () => {
73
+ try {
74
+ const res = await fetch(`${API_BASE}/status`, { cache: 'no-store' });
75
+ if (!res.ok)
76
+ throw new Error(`HTTP ${res.status}`);
77
+ const data = await res.json();
78
+ setOutput(JSON.stringify(data, null, 2));
79
+ if (typeof data.workingDirectory === 'string') {
80
+ setWorkingDir((prev) => prev || data.workingDirectory);
81
+ }
82
+ setError(null);
83
+ }
84
+ catch (err) {
85
+ setError(err instanceof Error ? err.message : String(err));
86
+ }
87
+ }, []);
88
+ useEffect(() => {
89
+ void refresh();
90
+ }, [refresh]);
91
+ async function run(path) {
92
+ setBusy(path);
93
+ setError(null);
94
+ try {
95
+ const res = await fetch(`${API_BASE}/${path}`, { method: 'POST' });
96
+ if (!res.ok)
97
+ throw new Error(`HTTP ${res.status}`);
98
+ const data = await res.json();
99
+ setOutput(JSON.stringify(data, null, 2));
100
+ await refresh();
101
+ }
102
+ catch (err) {
103
+ setError(err instanceof Error ? err.message : String(err));
104
+ }
105
+ finally {
106
+ setBusy(null);
107
+ }
108
+ }
109
+ async function showLogs() {
110
+ setBusy('logs');
111
+ setError(null);
112
+ try {
113
+ const res = await fetch(`${API_BASE}/logs`, { cache: 'no-store' });
114
+ if (!res.ok)
115
+ throw new Error(`HTTP ${res.status}`);
116
+ setOutput(await res.text());
117
+ }
118
+ catch (err) {
119
+ setError(err instanceof Error ? err.message : String(err));
120
+ }
121
+ finally {
122
+ setBusy(null);
123
+ }
124
+ }
125
+ async function startSetup() {
126
+ setSetupPhase('starting');
127
+ setSetupError('');
128
+ try {
129
+ const res = await fetch(`${API_BASE}/setup/start`, {
130
+ method: 'POST',
131
+ headers: { 'Content-Type': 'application/json' },
132
+ body: JSON.stringify({ workingDirectory: workingDir || undefined }),
133
+ });
134
+ if (!res.ok)
135
+ throw new Error(`HTTP ${res.status}`);
136
+ const data = await res.json();
137
+ if (!data.ok)
138
+ throw new Error(data.message || data.error || '启动扫码绑定失败');
139
+ setQrcodeDataUrl(data.qrcodeDataUrl);
140
+ setQrcodeId(data.qrcodeId);
141
+ setWorkingDir(data.workingDirectory || workingDir);
142
+ setSetupPhase('qr');
143
+ }
144
+ catch (err) {
145
+ setSetupPhase('error');
146
+ setSetupError(err instanceof Error ? err.message : String(err));
147
+ }
148
+ }
149
+ useEffect(() => {
150
+ if (setupPhase !== 'qr' || !qrcodeId)
151
+ return;
152
+ let cancelled = false;
153
+ let timer;
154
+ async function poll() {
155
+ try {
156
+ const res = await fetch(`${API_BASE}/setup/status?qrcodeId=${encodeURIComponent(qrcodeId)}`, { cache: 'no-store' });
157
+ if (!res.ok)
158
+ throw new Error(`HTTP ${res.status}`);
159
+ const data = await res.json();
160
+ if (cancelled)
161
+ return;
162
+ if (data.status === 'confirmed') {
163
+ setSetupPhase('confirmed');
164
+ setBoundAccountId(data.accountId || '');
165
+ void refresh();
166
+ return;
167
+ }
168
+ if (data.status === 'expired' || (data.status === 'error' && !data.retryable)) {
169
+ setSetupPhase('error');
170
+ setSetupError(data.message || '绑定失败,请重试');
171
+ return;
172
+ }
173
+ timer = window.setTimeout(() => void poll(), 3000);
174
+ }
175
+ catch (err) {
176
+ if (!cancelled) {
177
+ setSetupPhase('error');
178
+ setSetupError(err instanceof Error ? err.message : String(err));
179
+ }
180
+ }
181
+ }
182
+ void poll();
183
+ return () => {
184
+ cancelled = true;
185
+ if (timer)
186
+ window.clearTimeout(timer);
187
+ };
188
+ }, [setupPhase, qrcodeId, refresh]);
189
+ function cancelSetup() {
190
+ setSetupPhase('idle');
191
+ setQrcodeDataUrl('');
192
+ setQrcodeId('');
193
+ setSetupError('');
194
+ }
195
+ const actions = [
196
+ { label: '刷新状态', run: () => void refresh() },
197
+ { label: '扫码绑定', run: () => void startSetup(), disabled: setupPhase === 'starting' || setupPhase === 'qr' },
198
+ { label: '启动', run: () => void run('start'), disabled: busy !== null },
199
+ { label: '停止', run: () => void run('stop'), disabled: busy !== null },
200
+ { label: '重启', run: () => void run('restart'), disabled: busy !== null },
201
+ { label: '查看日志', run: () => void showLogs(), disabled: busy !== null },
202
+ ];
203
+ return (_jsxs("div", { style: panelStyle, role: "region", "aria-label": "DSH \u5FAE\u4FE1\u6865\u63A5\u7BA1\u7406\u9762\u677F", children: [_jsx("div", { style: titleStyle, children: "\uD83D\uDCF1 DSH \u5FAE\u4FE1\u6865\u63A5" }), error && _jsx("div", { role: "alert", style: { color: '#e5484d', marginBottom: 8 }, children: error }), _jsxs("label", { style: { display: 'block', marginBottom: 8, fontSize: 12 }, children: ["DSH \u5DE5\u4F5C\u76EE\u5F55", _jsx("input", { type: "text", value: workingDir, onChange: (e) => setWorkingDir(e.target.value), placeholder: "\u4F8B\u5982 ~/Documents/DSH", style: { ...inputStyle, marginLeft: 8 } })] }), setupPhase === 'starting' && (_jsx("div", { role: "status", style: { marginBottom: 8 }, children: "\u6B63\u5728\u751F\u6210\u4E8C\u7EF4\u7801\u2026" })), setupPhase === 'qr' && qrcodeDataUrl && (_jsxs("div", { style: { marginBottom: 8 }, children: [_jsx("div", { style: { fontWeight: 600, marginBottom: 4 }, children: "\u8BF7\u7528\u5FAE\u4FE1\u626B\u63CF\u4E0B\u65B9\u4E8C\u7EF4\u7801\u5B8C\u6210\u7ED1\u5B9A" }), _jsx("img", { src: qrcodeDataUrl, alt: "\u5FAE\u4FE1\u626B\u7801\u7ED1\u5B9A\u4E8C\u7EF4\u7801", width: 240, height: 240, style: { display: 'block', maxWidth: '100%', height: 'auto', borderRadius: 8, background: '#fff' } }), _jsxs("div", { style: { fontSize: 12, opacity: 0.7, marginTop: 4 }, children: ["\u5DE5\u4F5C\u76EE\u5F55\uFF1A", workingDir || '未设置', "\u3002\u7B49\u5F85\u626B\u7801\u786E\u8BA4\u4E2D\u2026"] }), _jsx("button", { type: "button", style: { ...buttonStyle, marginTop: 8 }, onClick: cancelSetup, children: "\u53D6\u6D88\u7ED1\u5B9A" })] })), setupPhase === 'confirmed' && (_jsxs("div", { role: "status", style: { marginBottom: 8, color: '#2f9e44' }, children: ["\u2705 \u7ED1\u5B9A\u6210\u529F", boundAccountId ? `:${boundAccountId}` : '', "\uFF0C\u53EF\u4EE5\u70B9\u51FB\u201C\u542F\u52A8\u201D\u5F00\u59CB\u4F7F\u7528\u3002"] })), setupPhase === 'error' && (_jsxs("div", { role: "alert", style: { marginBottom: 8, color: '#e5484d' }, children: ["\u274C ", setupError, _jsx("button", { type: "button", style: { ...buttonStyle, marginLeft: 8 }, onClick: () => setSetupPhase('idle'), children: "\u91CD\u65B0\u626B\u7801" })] })), _jsx("pre", { style: outputStyle, "aria-live": "polite", children: output }), _jsx("div", { style: buttonRowStyle, children: actions.map((action) => (_jsx("button", { type: "button", style: buttonStyle, disabled: action.disabled ?? false, onClick: action.run, children: action.label }, action.label))) }), _jsx("div", { style: hintStyle, children: "\u4E5F\u53EF\u5728 DSH \u5BF9\u8BDD\u4E2D\u76F4\u63A5\u4F7F\u7528 wechat_bridge_setup / wechat_bridge_status / wechat_bridge_start / wechat_bridge_stop / wechat_bridge_logs \u7B49\u5DE5\u5177\u3002" })] }));
204
+ }
205
+ //# sourceMappingURL=Panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Panel.js","sourceRoot":"","sources":["../../src/client/Panel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { WechatBridgePanel } from './Panel.js';
2
+ export const inject = ['slots'];
3
+ export function apply(ctx) {
4
+ ctx.effect(() => ctx.slots.inject('settings.section', () => ctx.slots.register({
5
+ name: 'settings.section',
6
+ id: '@lanbaolu/dsh-wechat-bridge-panel',
7
+ order: 55,
8
+ label: () => '📱 微信桥接',
9
+ }, WechatBridgePanel)), '@lanbaolu/dsh-wechat-bridge: panel');
10
+ }
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAE9C,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,CAAA;AAE/B,MAAM,UAAU,KAAK,CAAC,GAAkB;IACtC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,kBAAkB,EAAE,GAAG,EAAE,CACzD,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;QACjB,IAAI,EAAE,kBAAkB;QACxB,EAAE,EAAE,mCAAmC;QACvC,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS;KACvB,EAAE,iBAAiB,CAAC,CACtB,EAAE,oCAAoC,CAAC,CAAA;AAC1C,CAAC"}