@optima-chat/optima-agent 0.9.13 → 0.9.14
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/.claude/skills/.kb-skills-managed.json +9 -9
- package/.claude/skills/ads/SKILL.md +244 -244
- package/.claude/skills/ads/template/campaign/CREATIVES.md +18 -18
- package/.claude/skills/ads/template/campaign/NOTES.md +10 -10
- package/.claude/skills/ads/template/campaign/STRATEGY.md +29 -29
- package/.claude/skills/ads/template/user/ADS.md +29 -29
- package/.claude/skills/ads/template/user/LEARNINGS.md +15 -15
- package/.claude/skills/ads/template/user/PROGRESS.md +20 -20
- package/.claude/skills/ads/template/user/README.md +25 -25
- package/.claude/skills/ads/template/user/assets/.gitignore +2 -2
- package/.claude/skills/bi/SKILL.md +131 -131
- package/.claude/skills/browser/SKILL.md +201 -201
- package/.claude/skills/channels/SKILL.md +188 -188
- package/.claude/skills/collection/SKILL.md +88 -88
- package/.claude/skills/douyin/SKILL.md +408 -408
- package/.claude/skills/ffmpeg/SKILL.md +164 -164
- package/.claude/skills/gen/SKILL.md +279 -279
- package/.claude/skills/growth/SKILL.md +90 -90
- package/.claude/skills/growth/template/ACCOUNTS.md +14 -14
- package/.claude/skills/growth/template/CALENDAR.md +7 -7
- package/.claude/skills/growth/template/COMMENTS.md +7 -7
- package/.claude/skills/growth/template/GROWTH.md +37 -37
- package/.claude/skills/growth/template/PROGRESS.md +4 -4
- package/.claude/skills/growth/template/README.md +20 -20
- package/.claude/skills/growth/template/TOPICS.md +7 -7
- package/.claude/skills/homepage/SKILL.md +177 -177
- package/.claude/skills/i18n/SKILL.md +517 -517
- package/.claude/skills/ingesting-sources/SKILL.md +94 -94
- package/.claude/skills/initializing-kb/SKILL.md +117 -117
- package/.claude/skills/instagram/SKILL.md +321 -321
- package/.claude/skills/inventory/SKILL.md +328 -328
- package/.claude/skills/kol-outreach/SKILL.md +232 -232
- package/.claude/skills/kol-outreach/template/campaign/CONFIG.md +60 -60
- package/.claude/skills/kol-outreach/template/campaign/KOLS.md +6 -6
- package/.claude/skills/kol-outreach/template/campaign/PROGRESS.md +3 -3
- package/.claude/skills/kol-outreach/template/campaign/TEMPLATES.md +88 -88
- package/.claude/skills/kol-outreach/template/merchant/BRAND.md +36 -36
- package/.claude/skills/kol-outreach/template/merchant/CAMPAIGNS.md +6 -6
- package/.claude/skills/kol-outreach/template/merchant/MERCHANT_LIMITS.md +16 -16
- package/.claude/skills/kol-outreach/template/merchant/PROGRESS.md +4 -4
- package/.claude/skills/kol-outreach/template/merchant/README.md +20 -20
- package/.claude/skills/linting-the-wiki/SKILL.md +68 -68
- package/.claude/skills/logistics/SKILL.md +180 -180
- package/.claude/skills/markdown-pdf/SKILL.md +72 -72
- package/.claude/skills/merchant/SKILL.md +110 -110
- package/.claude/skills/multigrid-poster/SKILL.md +192 -192
- package/.claude/skills/multigrid-poster/layouts/2x2.json +34 -34
- package/.claude/skills/multigrid-poster/layouts/3x3.json +43 -43
- package/.claude/skills/multigrid-poster/scripts/compose.py +116 -116
- package/.claude/skills/order/SKILL.md +452 -452
- package/.claude/skills/product/SKILL.md +379 -379
- package/.claude/skills/product-page/SKILL.md +106 -106
- package/.claude/skills/querying-the-wiki/SKILL.md +59 -59
- package/.claude/skills/reddit/SKILL.md +277 -277
- package/.claude/skills/review/SKILL.md +321 -321
- package/.claude/skills/scout/SKILL.md +575 -575
- package/.claude/skills/sentinel/SKILL.md +281 -281
- package/.claude/skills/shein/SKILL.md +246 -246
- package/.claude/skills/shipping/SKILL.md +200 -200
- package/.claude/skills/shop-content/SKILL.md +101 -101
- package/.claude/skills/shopify/SKILL.md +282 -282
- package/.claude/skills/skillify/SKILL.md +114 -114
- package/.claude/skills/taobao/SKILL.md +238 -238
- package/.claude/skills/tiktok/SKILL.md +381 -381
- package/.claude/skills/twitter/SKILL.md +302 -302
- package/.claude/skills/updating-related-pages/SKILL.md +65 -65
- package/.claude/skills/video-edit/SKILL.md +123 -138
- package/.claude/skills/video-gen/SKILL.md +720 -720
- package/.claude/skills/video-gen/templates/INDEX.md +78 -78
- package/.claude/skills/video-gen/templates/before-after-beauty.md +183 -183
- package/.claude/skills/video-gen/templates/drama-fmcg.md +183 -183
- package/.claude/skills/video-gen/templates/kol-reaction-food.md +193 -193
- package/.claude/skills/video-gen/templates/multi-point-apparel.md +185 -185
- package/.claude/skills/video-gen/templates/pain-solution-home.md +184 -184
- package/.claude/skills/video-gen/templates/pdp-360-showcase.md +189 -189
- package/.claude/skills/video-gen/templates/pdp-feature-highlight.md +182 -182
- package/.claude/skills/video-gen/templates/scene-digital.md +183 -183
- package/.claude/skills/wechat/SKILL.md +174 -174
- package/.claude/skills/xhs/SKILL.md +170 -170
- package/README.md +276 -276
- package/dist/bin/optima.js +26 -26
- package/dist/bin/serve.js +23 -23
- package/dist/src/agent.d.ts +1 -1
- package/dist/src/agent.js +4 -4
- package/dist/src/system-prompt.js +175 -175
- package/dist/src/tools/memory.js +10 -10
- package/dist/src/ui/headless.js +7 -7
- package/package.json +79 -79
- package/dist/bin/video-edit.d.ts +0 -3
- package/dist/bin/video-edit.d.ts.map +0 -1
- package/dist/bin/video-edit.js +0 -153
- package/dist/bin/video-edit.js.map +0 -1
package/dist/bin/video-edit.js
DELETED
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* video-edit CLI — TS 薄壳,透传到 Python 实现(tools/video-edit/video_edit.py)。
|
|
4
|
-
*
|
|
5
|
-
* 调用:pnpm video-edit <subcommand> <video-path>
|
|
6
|
-
* 子命令:analyze / cut / review / subtitle / both / doctor
|
|
7
|
-
*/
|
|
8
|
-
import { spawnSync } from "node:child_process";
|
|
9
|
-
import { existsSync } from "node:fs";
|
|
10
|
-
import { resolve, dirname, join, sep } from "node:path";
|
|
11
|
-
import { fileURLToPath } from "node:url";
|
|
12
|
-
import { parseArgs } from "node:util";
|
|
13
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
14
|
-
const __dirname = dirname(__filename);
|
|
15
|
-
/**
|
|
16
|
-
* 两种布局:
|
|
17
|
-
* 开发: <repo>/bin/video-edit.ts → PACKAGE_ROOT = <repo>
|
|
18
|
-
* 已安装:<pkg>/dist/bin/video-edit.js → PACKAGE_ROOT = <pkg>
|
|
19
|
-
* tools/ 在 PACKAGE_ROOT 下(npm 发布时通过 files: ["tools"] 带出来)。
|
|
20
|
-
*/
|
|
21
|
-
const PACKAGE_ROOT = __dirname.includes(`${sep}dist${sep}bin`)
|
|
22
|
-
? resolve(__dirname, "..", "..")
|
|
23
|
-
: resolve(__dirname, "..");
|
|
24
|
-
const PY_SCRIPT = join(PACKAGE_ROOT, "tools", "video-edit", "video_edit.py");
|
|
25
|
-
const REQUIREMENTS = join(PACKAGE_ROOT, "tools", "video-edit", "requirements.txt");
|
|
26
|
-
const SUBCOMMANDS = ["analyze", "cut", "review", "subtitle", "both", "doctor"];
|
|
27
|
-
function printHelp() {
|
|
28
|
-
console.log(`
|
|
29
|
-
video-edit - 口播/vlog 视频智能剪辑 CLI
|
|
30
|
-
|
|
31
|
-
用法:
|
|
32
|
-
pnpm video-edit <subcommand> <video-path>
|
|
33
|
-
|
|
34
|
-
子命令:
|
|
35
|
-
analyze <video> 转写 + 静音检测 → cut_proposal.md
|
|
36
|
-
cut <video> 读 proposal 出成片 → <stem>_edited.mp4
|
|
37
|
-
review <video> 声学质检 → review_report.md
|
|
38
|
-
subtitle <video> 自动字幕 → <stem>_subbed.mp4
|
|
39
|
-
both <video> analyze + cut(跳过人工编辑 proposal)
|
|
40
|
-
doctor 检查依赖(python / ffmpeg / faster-whisper)
|
|
41
|
-
|
|
42
|
-
示例:
|
|
43
|
-
pnpm video-edit analyze ~/vids/demo.mp4
|
|
44
|
-
pnpm video-edit doctor
|
|
45
|
-
|
|
46
|
-
详细 SOP 见 .claude/skills/editing-vlog-videos/SKILL.md
|
|
47
|
-
`);
|
|
48
|
-
}
|
|
49
|
-
function whichPython() {
|
|
50
|
-
for (const cmd of ["python", "python3"]) {
|
|
51
|
-
const r = spawnSync(cmd, ["--version"], { encoding: "utf-8" });
|
|
52
|
-
if (r.status === 0)
|
|
53
|
-
return cmd;
|
|
54
|
-
}
|
|
55
|
-
return null;
|
|
56
|
-
}
|
|
57
|
-
function doctor() {
|
|
58
|
-
console.log("=== video-edit doctor ===");
|
|
59
|
-
let ok = true;
|
|
60
|
-
// Python
|
|
61
|
-
const py = whichPython();
|
|
62
|
-
if (py) {
|
|
63
|
-
const ver = spawnSync(py, ["--version"], { encoding: "utf-8" });
|
|
64
|
-
console.log(`[OK] python: ${ver.stdout.trim() || ver.stderr.trim()}`);
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
console.log("[FAIL] python: 未找到,请安装 Python 3.10+");
|
|
68
|
-
ok = false;
|
|
69
|
-
}
|
|
70
|
-
// ffmpeg
|
|
71
|
-
const ffmpeg = spawnSync("ffmpeg", ["-version"], { encoding: "utf-8" });
|
|
72
|
-
if (ffmpeg.status === 0) {
|
|
73
|
-
console.log(`[OK] ffmpeg: ${ffmpeg.stdout.split("\n")[0]}`);
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
76
|
-
console.log("[FAIL] ffmpeg: 未找到,请按 OS 安装(winget / brew / apt)");
|
|
77
|
-
ok = false;
|
|
78
|
-
}
|
|
79
|
-
// faster-whisper
|
|
80
|
-
if (py) {
|
|
81
|
-
const fw = spawnSync(py, ["-c", "import faster_whisper; print(faster_whisper.__version__)"], { encoding: "utf-8" });
|
|
82
|
-
if (fw.status === 0) {
|
|
83
|
-
console.log(`[OK] faster-whisper: ${fw.stdout.trim()}`);
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
console.log(`[FAIL] faster-whisper 未安装。请运行:pip install -r ${REQUIREMENTS}`);
|
|
87
|
-
ok = false;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
// PY_SCRIPT
|
|
91
|
-
if (existsSync(PY_SCRIPT)) {
|
|
92
|
-
console.log(`[OK] ${PY_SCRIPT}`);
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
console.log(`[FAIL] Python 实现脚本缺失: ${PY_SCRIPT}`);
|
|
96
|
-
ok = false;
|
|
97
|
-
}
|
|
98
|
-
console.log(ok ? "\n[OK] 全部就绪" : "\n[FAIL] 有依赖缺失,按上述提示修复");
|
|
99
|
-
return ok ? 0 : 1;
|
|
100
|
-
}
|
|
101
|
-
function spawnPython(sub, videoPath) {
|
|
102
|
-
const py = whichPython();
|
|
103
|
-
if (!py) {
|
|
104
|
-
console.error("python 未找到,请装 Python 3.10+ 或跑 `pnpm video-edit doctor` 查依赖");
|
|
105
|
-
return 127;
|
|
106
|
-
}
|
|
107
|
-
if (!existsSync(PY_SCRIPT)) {
|
|
108
|
-
console.error(`Python 实现脚本缺失: ${PY_SCRIPT}`);
|
|
109
|
-
return 1;
|
|
110
|
-
}
|
|
111
|
-
const absVideo = resolve(videoPath);
|
|
112
|
-
const r = spawnSync(py, [PY_SCRIPT, sub, absVideo], {
|
|
113
|
-
stdio: "inherit",
|
|
114
|
-
env: { ...process.env, PYTHONIOENCODING: "utf-8" },
|
|
115
|
-
});
|
|
116
|
-
return r.status ?? 1;
|
|
117
|
-
}
|
|
118
|
-
function main() {
|
|
119
|
-
const { positionals, values } = parseArgs({
|
|
120
|
-
args: process.argv.slice(2),
|
|
121
|
-
options: {
|
|
122
|
-
help: { type: "boolean", short: "h" },
|
|
123
|
-
},
|
|
124
|
-
allowPositionals: true,
|
|
125
|
-
strict: false,
|
|
126
|
-
});
|
|
127
|
-
if (values.help || positionals.length === 0) {
|
|
128
|
-
printHelp();
|
|
129
|
-
return 0;
|
|
130
|
-
}
|
|
131
|
-
const sub = positionals[0];
|
|
132
|
-
if (!SUBCOMMANDS.includes(sub)) {
|
|
133
|
-
console.error(`未知子命令: ${sub}`);
|
|
134
|
-
printHelp();
|
|
135
|
-
return 2;
|
|
136
|
-
}
|
|
137
|
-
if (sub === "doctor") {
|
|
138
|
-
return doctor();
|
|
139
|
-
}
|
|
140
|
-
const video = positionals[1];
|
|
141
|
-
if (!video) {
|
|
142
|
-
console.error(`${sub} 需要视频路径参数`);
|
|
143
|
-
printHelp();
|
|
144
|
-
return 2;
|
|
145
|
-
}
|
|
146
|
-
if (!existsSync(video)) {
|
|
147
|
-
console.error(`视频文件不存在: ${video}`);
|
|
148
|
-
return 1;
|
|
149
|
-
}
|
|
150
|
-
return spawnPython(sub, video);
|
|
151
|
-
}
|
|
152
|
-
process.exit(main());
|
|
153
|
-
//# sourceMappingURL=video-edit.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"video-edit.js","sourceRoot":"","sources":["../../bin/video-edit.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC;;;;;GAKG;AACH,MAAM,YAAY,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,GAAG,OAAO,GAAG,KAAK,CAAC;IAC5D,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC;IAChC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC;AAC7E,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,kBAAkB,CAAC,CAAC;AAEnF,MAAM,WAAW,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAU,CAAC;AAGxF,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;CAmBb,CAAC,CAAC;AACH,CAAC;AAED,SAAS,WAAW;IAClB,KAAK,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/D,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,GAAG,CAAC;IACjC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,MAAM;IACb,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,IAAI,EAAE,GAAG,IAAI,CAAC;IAEd,SAAS;IACT,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC;IACzB,IAAI,EAAE,EAAE,CAAC;QACP,MAAM,GAAG,GAAG,SAAS,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACxE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACnD,EAAE,GAAG,KAAK,CAAC;IACb,CAAC;IAED,SAAS;IACT,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IACxE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;QAChE,EAAE,GAAG,KAAK,CAAC;IACb,CAAC;IAED,iBAAiB;IACjB,IAAI,EAAE,EAAE,CAAC;QACP,MAAM,EAAE,GAAG,SAAS,CAClB,EAAE,EACF,CAAC,IAAI,EAAE,0DAA0D,CAAC,EAClE,EAAE,QAAQ,EAAE,OAAO,EAAE,CACtB,CAAC;QACF,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,gDAAgD,YAAY,EAAE,CAAC,CAAC;YAC5E,EAAE,GAAG,KAAK,CAAC;QACb,CAAC;IACH,CAAC;IAED,YAAY;IACZ,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,QAAQ,SAAS,EAAE,CAAC,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,yBAAyB,SAAS,EAAE,CAAC,CAAC;QAClD,EAAE,GAAG,KAAK,CAAC;IACb,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC;IAC3D,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC;AAED,SAAS,WAAW,CAAC,GAAe,EAAE,SAAiB;IACrD,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC;IACzB,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAC5E,OAAO,GAAG,CAAC;IACb,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,kBAAkB,SAAS,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACpC,MAAM,CAAC,GAAG,SAAS,CAAC,EAAE,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE;QAClD,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,gBAAgB,EAAE,OAAO,EAAE;KACnD,CAAC,CAAC;IACH,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,IAAI;IACX,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QACxC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3B,OAAO,EAAE;YACP,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;SACtC;QACD,gBAAgB,EAAE,IAAI;QACtB,MAAM,EAAE,KAAK;KACd,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,IAAI,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5C,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAe,CAAC;IACzC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC;QAC/B,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrB,OAAO,MAAM,EAAE,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,WAAW,CAAC,CAAC;QACjC,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,YAAY,KAAK,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACjC,CAAC;AAED,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC"}
|