@coralai/sps-cli 0.65.75 → 0.65.77
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/dist/console/index.d.ts.map +1 -1
- package/dist/console/index.js +6 -0
- package/dist/console/index.js.map +1 -1
- package/dist/console/lib/artPaths.d.ts +4 -4
- package/dist/console/lib/artPaths.d.ts.map +1 -1
- package/dist/console/lib/artPaths.js +24 -16
- package/dist/console/lib/artPaths.js.map +1 -1
- package/dist/console/lib/artRunRequest.d.ts +46 -0
- package/dist/console/lib/artRunRequest.d.ts.map +1 -0
- package/dist/console/lib/artRunRequest.js +107 -0
- package/dist/console/lib/artRunRequest.js.map +1 -0
- package/dist/console/routes/art.d.ts.map +1 -1
- package/dist/console/routes/art.js +65 -47
- package/dist/console/routes/art.js.map +1 -1
- package/dist/console/routes/artPipeline.d.ts +16 -0
- package/dist/console/routes/artPipeline.d.ts.map +1 -0
- package/dist/console/routes/artPipeline.js +126 -0
- package/dist/console/routes/artPipeline.js.map +1 -0
- package/dist/core/art/artConcurrency.d.ts +63 -0
- package/dist/core/art/artConcurrency.d.ts.map +1 -0
- package/dist/core/art/artConcurrency.js +63 -0
- package/dist/core/art/artConcurrency.js.map +1 -0
- package/dist/core/art/artRunLauncher.d.ts +6 -0
- package/dist/core/art/artRunLauncher.d.ts.map +1 -0
- package/dist/core/art/artRunLauncher.js +91 -0
- package/dist/core/art/artRunLauncher.js.map +1 -0
- package/dist/core/art/artRunService.d.ts +115 -0
- package/dist/core/art/artRunService.d.ts.map +1 -0
- package/dist/core/art/artRunService.js +183 -0
- package/dist/core/art/artRunService.js.map +1 -0
- package/dist/core/art/assetLocator.d.ts +33 -0
- package/dist/core/art/assetLocator.d.ts.map +1 -0
- package/dist/core/art/assetLocator.js +61 -0
- package/dist/core/art/assetLocator.js.map +1 -0
- package/dist/providers/art/artDriver.d.ts +71 -0
- package/dist/providers/art/artDriver.d.ts.map +1 -0
- package/dist/providers/art/artDriver.js +119 -0
- package/dist/providers/art/artDriver.js.map +1 -0
- package/dist/providers/art/artEvents.d.ts +23 -0
- package/dist/providers/art/artEvents.d.ts.map +1 -0
- package/dist/providers/art/artEvents.js +40 -0
- package/dist/providers/art/artEvents.js.map +1 -0
- package/dist/providers/art/artGen.d.ts +259 -0
- package/dist/providers/art/artGen.d.ts.map +1 -0
- package/dist/providers/art/artGen.js +1303 -0
- package/dist/providers/art/artGen.js.map +1 -0
- package/dist/providers/art/artPrompt.d.ts +42 -0
- package/dist/providers/art/artPrompt.d.ts.map +1 -0
- package/dist/providers/art/artPrompt.js +41 -0
- package/dist/providers/art/artPrompt.js.map +1 -0
- package/dist/providers/art/artRunChild.d.ts +3 -0
- package/dist/providers/art/artRunChild.d.ts.map +1 -0
- package/dist/providers/art/artRunChild.js +153 -0
- package/dist/providers/art/artRunChild.js.map +1 -0
- package/dist/providers/art/atomicWrite.d.ts +16 -0
- package/dist/providers/art/atomicWrite.d.ts.map +1 -0
- package/dist/providers/art/atomicWrite.js +62 -0
- package/dist/providers/art/atomicWrite.js.map +1 -0
- package/dist/providers/art/cancelMarker.d.ts +9 -0
- package/dist/providers/art/cancelMarker.d.ts.map +1 -0
- package/dist/providers/art/cancelMarker.js +60 -0
- package/dist/providers/art/cancelMarker.js.map +1 -0
- package/dist/providers/art/composeAsset.d.ts +52 -0
- package/dist/providers/art/composeAsset.d.ts.map +1 -0
- package/dist/providers/art/composeAsset.js +73 -0
- package/dist/providers/art/composeAsset.js.map +1 -0
- package/dist/providers/art/imageSize.d.ts +31 -0
- package/dist/providers/art/imageSize.d.ts.map +1 -0
- package/dist/providers/art/imageSize.js +92 -0
- package/dist/providers/art/imageSize.js.map +1 -0
- package/dist/providers/art/jobContext.d.ts +25 -0
- package/dist/providers/art/jobContext.d.ts.map +1 -0
- package/dist/providers/art/jobContext.js +5 -0
- package/dist/providers/art/jobContext.js.map +1 -0
- package/dist/providers/art/rateLimitRetry.d.ts +25 -0
- package/dist/providers/art/rateLimitRetry.d.ts.map +1 -0
- package/dist/providers/art/rateLimitRetry.js +40 -0
- package/dist/providers/art/rateLimitRetry.js.map +1 -0
- package/dist/providers/art/uiKit.d.ts +61 -0
- package/dist/providers/art/uiKit.d.ts.map +1 -0
- package/dist/providers/art/uiKit.js +331 -0
- package/dist/providers/art/uiKit.js.map +1 -0
- package/dist/providers/art/visionJudge.d.ts +26 -0
- package/dist/providers/art/visionJudge.d.ts.map +1 -0
- package/dist/providers/art/visionJudge.js +127 -0
- package/dist/providers/art/visionJudge.js.map +1 -0
- package/dist/providers/art/withinDir.d.ts +2 -0
- package/dist/providers/art/withinDir.d.ts.map +1 -0
- package/dist/providers/art/withinDir.js +19 -0
- package/dist/providers/art/withinDir.js.map +1 -0
- package/dist/providers/media/gatewayMediaProviders.d.ts +58 -0
- package/dist/providers/media/gatewayMediaProviders.d.ts.map +1 -0
- package/dist/providers/media/gatewayMediaProviders.js +46 -0
- package/dist/providers/media/gatewayMediaProviders.js.map +1 -0
- package/dist/providers/media/generateAsset.d.ts +9 -0
- package/dist/providers/media/generateAsset.d.ts.map +1 -1
- package/dist/providers/media/generateAsset.js +7 -1
- package/dist/providers/media/generateAsset.js.map +1 -1
- package/dist/providers/media/mediaProviders.d.ts +31 -1
- package/dist/providers/media/mediaProviders.d.ts.map +1 -1
- package/dist/providers/media/mediaProviders.js +33 -1
- package/dist/providers/media/mediaProviders.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI 线稿契约(v1)——"结构靠图、风格靠词"的图生图 UI 套件。
|
|
3
|
+
*
|
|
4
|
+
* 核心思想:块面原型由【确定性代码】渲染(坐标生成前已知)→ 图生图只换风格(布局话语权 100% 在参考图)
|
|
5
|
+
* → 图集按【契约矩形】直切(零缝隙探测)、帧名全平台固定(worker 免查 asset-meta)。
|
|
6
|
+
* 实证:2026-07-17 codex 图生图 8 控件位置/尺寸/轮廓全保持(factory/ui-lab/ui-compare.png)。
|
|
7
|
+
*
|
|
8
|
+
* ⚠️ 契约即 ABI:帧名/矩形一经发布不改语义,扩展走 v2 追加。ui.js 的 makeBar 皮肤模式依赖
|
|
9
|
+
* BAR_* 常量与本表一致(血槽边框厚度),改这里必须同步 ui.js。
|
|
10
|
+
*/
|
|
11
|
+
import sharp from 'sharp';
|
|
12
|
+
// 画布 1536×1024,4 行:按钮 / 圆钮 / 面板+血条 / 语义图标。行高 256。
|
|
13
|
+
export const UI_KIT_CANVAS = { w: 1536, h: 1024 };
|
|
14
|
+
// 血条契约常量(ui.js makeBar 皮肤模式同步引用)。v1.1 起所有控件在矩形内统一内缩 INSET 绘制
|
|
15
|
+
// (给图生图的描边/贴纸边等风格装饰留余量,防溢出矩形被切):
|
|
16
|
+
// 外框:矩形 340×76,实绘 316×52(内缩12),边框 8 → 槽从矩形边缘内缩 20,槽 300×36;
|
|
17
|
+
// 填充:矩形 324×60,实绘 300×36(内缩12)= 恰与槽同尺寸。
|
|
18
|
+
export const UI_INSET = 12; // 所有控件的统一绘制内缩(px,画布坐标)
|
|
19
|
+
export const UI_BAR = { frameW: 340, frameH: 76, inset: UI_INSET, border: 8, fillRectW: 324, fillRectH: 60, fillW: 300, fillH: 36 };
|
|
20
|
+
const R1 = 0, R2 = 256, R3 = 512, R4 = 768;
|
|
21
|
+
export const UI_KIT_FRAMES = [
|
|
22
|
+
// ── 行1:按钮(大常态/大按下/中/小)──
|
|
23
|
+
{ name: 'ui_btn_lg', label: '大按钮·常态', x: 42, y: R1 + 78, w: 300, h: 100 },
|
|
24
|
+
{ name: 'ui_btn_lg_pr', label: '大按钮·按下', x: 426, y: R1 + 88, w: 300, h: 100 },
|
|
25
|
+
{ name: 'ui_btn_md', label: '中按钮', x: 838, y: R1 + 84, w: 244, h: 88 },
|
|
26
|
+
{ name: 'ui_btn_sm', label: '小按钮', x: 1246, y: R1 + 90, w: 196, h: 76 },
|
|
27
|
+
// ── 行2:圆形图标钮 ×6 ──
|
|
28
|
+
{ name: 'ui_icon_pause', label: '暂停钮', x: 48, y: R2 + 48, w: 160, h: 160 },
|
|
29
|
+
{ name: 'ui_icon_gear', label: '设置钮', x: 304, y: R2 + 48, w: 160, h: 160 },
|
|
30
|
+
{ name: 'ui_icon_sound', label: '音量钮', x: 560, y: R2 + 48, w: 160, h: 160 },
|
|
31
|
+
{ name: 'ui_icon_close', label: '关闭钮', x: 816, y: R2 + 48, w: 160, h: 160 },
|
|
32
|
+
{ name: 'ui_icon_back', label: '返回钮', x: 1072, y: R2 + 48, w: 160, h: 160 },
|
|
33
|
+
{ name: 'ui_icon_retry', label: '重试钮', x: 1328, y: R2 + 48, w: 160, h: 160 },
|
|
34
|
+
// ── 行3:面板 + 血条(外框血槽 / 填充条)──
|
|
35
|
+
{ name: 'ui_panel', label: '弹窗面板(带标题栏)', x: 40, y: R3 + 20, w: 400, h: 216 },
|
|
36
|
+
{ name: 'ui_banner', label: '横幅面板(HUD 底条)', x: 520, y: R3 + 78, w: 560, h: 100 },
|
|
37
|
+
{ name: 'ui_bar_frame', label: '血槽外框', x: 1140, y: R3 + 34, w: UI_BAR.frameW, h: UI_BAR.frameH },
|
|
38
|
+
{ name: 'ui_bar_fill', label: '血条填充', x: 1148, y: R3 + 150, w: UI_BAR.fillRectW, h: UI_BAR.fillRectH },
|
|
39
|
+
// ── 行4:语义图标(评分/资源展示)×6 ──
|
|
40
|
+
{ name: 'ui_star', label: '星星·实心', x: 48, y: R4 + 48, w: 160, h: 160 },
|
|
41
|
+
{ name: 'ui_star_empty', label: '星星·空心', x: 304, y: R4 + 48, w: 160, h: 160 },
|
|
42
|
+
{ name: 'ui_heart', label: '爱心', x: 560, y: R4 + 48, w: 160, h: 160 },
|
|
43
|
+
{ name: 'ui_coin', label: '金币', x: 816, y: R4 + 48, w: 160, h: 160 },
|
|
44
|
+
{ name: 'ui_diamond', label: '钻石', x: 1072, y: R4 + 48, w: 160, h: 160 },
|
|
45
|
+
{ name: 'ui_gem', label: '宝石', x: 1328, y: R4 + 48, w: 160, h: 160 },
|
|
46
|
+
];
|
|
47
|
+
// ── 灰阶块面原型渲染(全矢量,零字体依赖;确定性=逐像素可复现)──
|
|
48
|
+
const G = { fill: '#b5b5b5', dark: '#3a3a3a', mid: '#8a8a8a', hi: '#d9d9d9', panel: '#c4c4c4' };
|
|
49
|
+
const SW = 8; // 统一描边宽
|
|
50
|
+
function btnSvg(f, pressed) {
|
|
51
|
+
const hi = pressed ? '' : `<rect x="${f.x + 10}" y="${f.y + 10}" width="${f.w - 20}" height="${f.h * 0.3}" rx="${f.h * 0.15}" fill="${G.hi}"/>`;
|
|
52
|
+
return `<rect x="${f.x}" y="${f.y}" width="${f.w}" height="${f.h}" rx="${f.h * 0.3}" fill="${pressed ? G.mid : G.fill}" stroke="${G.dark}" stroke-width="${SW}"/>${hi}`;
|
|
53
|
+
}
|
|
54
|
+
function circleBase(f) {
|
|
55
|
+
const cx = f.x + f.w / 2, cy = f.y + f.h / 2, r = f.w / 2 - SW / 2;
|
|
56
|
+
return { cx, cy, r, svg: `<circle cx="${cx}" cy="${cy}" r="${r}" fill="${G.fill}" stroke="${G.dark}" stroke-width="${SW}"/>` };
|
|
57
|
+
}
|
|
58
|
+
function iconSvg(f, kind) {
|
|
59
|
+
const { cx, cy, r, svg } = circleBase(f);
|
|
60
|
+
const s = r * 0.9;
|
|
61
|
+
const glyphs = {
|
|
62
|
+
pause: `<rect x="${cx - s * 0.42}" y="${cy - s * 0.5}" width="${s * 0.3}" height="${s}" rx="6" fill="${G.dark}"/><rect x="${cx + s * 0.12}" y="${cy - s * 0.5}" width="${s * 0.3}" height="${s}" rx="6" fill="${G.dark}"/>`,
|
|
63
|
+
gear: `<circle cx="${cx}" cy="${cy}" r="${s * 0.34}" fill="none" stroke="${G.dark}" stroke-width="${s * 0.22}"/>` +
|
|
64
|
+
[0, 45, 90, 135, 180, 225, 270, 315].map((a) => `<rect x="${cx - s * 0.09}" y="${cy - s * 0.62}" width="${s * 0.18}" height="${s * 0.24}" fill="${G.dark}" transform="rotate(${a} ${cx} ${cy})"/>`).join(''),
|
|
65
|
+
sound: `<polygon points="${cx - s * 0.5},${cy - s * 0.2} ${cx - s * 0.15},${cy - s * 0.2} ${cx + s * 0.15},${cy - s * 0.5} ${cx + s * 0.15},${cy + s * 0.5} ${cx - s * 0.15},${cy + s * 0.2} ${cx - s * 0.5},${cy + s * 0.2}" fill="${G.dark}"/><path d="M ${cx + s * 0.3} ${cy - s * 0.28} A ${s * 0.36} ${s * 0.36} 0 0 1 ${cx + s * 0.3} ${cy + s * 0.28}" fill="none" stroke="${G.dark}" stroke-width="${s * 0.12}" stroke-linecap="round"/>`,
|
|
66
|
+
close: `<rect x="${cx - s * 0.5}" y="${cy - s * 0.11}" width="${s}" height="${s * 0.22}" rx="8" fill="${G.dark}" transform="rotate(45 ${cx} ${cy})"/><rect x="${cx - s * 0.5}" y="${cy - s * 0.11}" width="${s}" height="${s * 0.22}" rx="8" fill="${G.dark}" transform="rotate(-45 ${cx} ${cy})"/>`,
|
|
67
|
+
back: `<polygon points="${cx - s * 0.5},${cy} ${cx + s * 0.1},${cy - s * 0.45} ${cx + s * 0.1},${cy - s * 0.18} ${cx + s * 0.5},${cy - s * 0.18} ${cx + s * 0.5},${cy + s * 0.18} ${cx + s * 0.1},${cy + s * 0.18} ${cx + s * 0.1},${cy + s * 0.45}" fill="${G.dark}"/>`,
|
|
68
|
+
retry: `<path d="M ${cx + s * 0.42} ${cy} A ${s * 0.42} ${s * 0.42} 0 1 1 ${cx} ${cy - s * 0.42}" fill="none" stroke="${G.dark}" stroke-width="${s * 0.2}" stroke-linecap="round"/><polygon points="${cx - s * 0.12},${cy - s * 0.62} ${cx + s * 0.3},${cy - s * 0.42} ${cx - s * 0.12},${cy - s * 0.2}" fill="${G.dark}"/>`,
|
|
69
|
+
star: starPts(cx, cy, s, true),
|
|
70
|
+
star_empty: starPts(cx, cy, s, false),
|
|
71
|
+
heart: `<path d="M ${cx} ${cy + s * 0.45} C ${cx - s * 1.1} ${cy - s * 0.35}, ${cx - s * 0.45} ${cy - s * 0.85}, ${cx} ${cy - s * 0.3} C ${cx + s * 0.45} ${cy - s * 0.85}, ${cx + s * 1.1} ${cy - s * 0.35}, ${cx} ${cy + s * 0.45} Z" fill="${G.fill}" stroke="${G.dark}" stroke-width="${SW}"/>`,
|
|
72
|
+
coin: `<circle cx="${cx}" cy="${cy}" r="${s * 0.55}" fill="${G.fill}" stroke="${G.dark}" stroke-width="${SW}"/><circle cx="${cx}" cy="${cy}" r="${s * 0.36}" fill="none" stroke="${G.dark}" stroke-width="${SW * 0.7}"/>`,
|
|
73
|
+
diamond: `<polygon points="${cx - s * 0.55},${cy - s * 0.15} ${cx - s * 0.28},${cy - s * 0.45} ${cx + s * 0.28},${cy - s * 0.45} ${cx + s * 0.55},${cy - s * 0.15} ${cx},${cy + s * 0.55}" fill="${G.fill}" stroke="${G.dark}" stroke-width="${SW}"/><polyline points="${cx - s * 0.55},${cy - s * 0.15} ${cx + s * 0.55},${cy - s * 0.15}" stroke="${G.dark}" stroke-width="${SW * 0.6}" fill="none"/><polyline points="${cx - s * 0.28},${cy - s * 0.45} ${cx},${cy + s * 0.55} ${cx + s * 0.28},${cy - s * 0.45}" stroke="${G.dark}" stroke-width="${SW * 0.6}" fill="none"/>`,
|
|
74
|
+
gem: `<polygon points="${cx},${cy - s * 0.55} ${cx + s * 0.48},${cy - s * 0.28} ${cx + s * 0.48},${cy + s * 0.28} ${cx},${cy + s * 0.55} ${cx - s * 0.48},${cy + s * 0.28} ${cx - s * 0.48},${cy - s * 0.28}" fill="${G.fill}" stroke="${G.dark}" stroke-width="${SW}"/><polygon points="${cx},${cy - s * 0.22} ${cx + s * 0.2},${cy} ${cx},${cy + s * 0.22} ${cx - s * 0.2},${cy}" fill="none" stroke="${G.dark}" stroke-width="${SW * 0.6}"/>`,
|
|
75
|
+
};
|
|
76
|
+
// 图标类:圆钮带底盘;语义图标(星/心/币/钻/宝)不带底盘,裸形状
|
|
77
|
+
const bare = ['star', 'star_empty', 'heart', 'coin', 'diamond', 'gem'].includes(kind);
|
|
78
|
+
return bare ? glyphs[kind] : svg + glyphs[kind];
|
|
79
|
+
}
|
|
80
|
+
function starPts(cx, cy, s, filled) {
|
|
81
|
+
const pts = [];
|
|
82
|
+
for (let i = 0; i < 10; i++) {
|
|
83
|
+
const rr = i % 2 === 0 ? s * 0.62 : s * 0.26;
|
|
84
|
+
const a = -Math.PI / 2 + (i * Math.PI) / 5;
|
|
85
|
+
pts.push(`${cx + rr * Math.cos(a)},${cy + rr * Math.sin(a)}`);
|
|
86
|
+
}
|
|
87
|
+
return `<polygon points="${pts.join(' ')}" fill="${filled ? G.fill : 'none'}" stroke="${G.dark}" stroke-width="${SW}"/>`;
|
|
88
|
+
}
|
|
89
|
+
/** 渲染灰阶块面原型(参考图 + 占位资产双用途)。确定性:同版本契约逐像素一致。
|
|
90
|
+
* v1.1:所有控件在契约矩形内统一内缩 UI_INSET 绘制——图生图的风格装饰(外描边/贴纸边/发光)
|
|
91
|
+
* 会贴着原轮廓外扩,零边距时必溢出矩形、切分即被硬切(合成大西瓜局白色贴纸边全切平的事故)。 */
|
|
92
|
+
export async function renderUiWireframe() {
|
|
93
|
+
const parts = [];
|
|
94
|
+
for (const f0 of UI_KIT_FRAMES) {
|
|
95
|
+
const f = { ...f0, x: f0.x + UI_INSET, y: f0.y + UI_INSET, w: f0.w - UI_INSET * 2, h: f0.h - UI_INSET * 2 };
|
|
96
|
+
if (f.name === 'ui_btn_lg')
|
|
97
|
+
parts.push(btnSvg(f, false));
|
|
98
|
+
else if (f.name === 'ui_btn_lg_pr')
|
|
99
|
+
parts.push(btnSvg(f, true));
|
|
100
|
+
else if (f.name === 'ui_btn_md' || f.name === 'ui_btn_sm')
|
|
101
|
+
parts.push(btnSvg(f, false));
|
|
102
|
+
else if (f.name === 'ui_panel')
|
|
103
|
+
parts.push(`<rect x="${f.x}" y="${f.y}" width="${f.w}" height="${f.h}" rx="20" fill="${G.panel}" stroke="${G.dark}" stroke-width="${SW}"/><path d="M ${f.x} ${f.y + 52} h ${f.w}" stroke="${G.dark}" stroke-width="${SW * 0.6}"/><rect x="${f.x}" y="${f.y}" width="${f.w}" height="52" rx="20" fill="${G.mid}"/>`);
|
|
104
|
+
else if (f.name === 'ui_banner')
|
|
105
|
+
parts.push(`<rect x="${f.x}" y="${f.y}" width="${f.w}" height="${f.h}" rx="${f.h / 2}" fill="${G.panel}" stroke="${G.dark}" stroke-width="${SW}"/>`);
|
|
106
|
+
else if (f.name === 'ui_bar_frame')
|
|
107
|
+
parts.push(`<rect x="${f.x}" y="${f.y}" width="${f.w}" height="${f.h}" rx="${f.h / 2}" fill="${G.mid}" stroke="${G.dark}" stroke-width="${SW}"/><rect x="${f.x + UI_BAR.border}" y="${f.y + UI_BAR.border}" width="${f.w - UI_BAR.border * 2}" height="${f.h - UI_BAR.border * 2}" rx="${(f.h - UI_BAR.border * 2) / 2}" fill="#4a4a4a"/>`);
|
|
108
|
+
else if (f.name === 'ui_bar_fill')
|
|
109
|
+
parts.push(`<rect x="${f.x}" y="${f.y}" width="${f.w}" height="${f.h}" rx="${f.h / 2}" fill="${G.fill}" stroke="${G.dark}" stroke-width="${SW * 0.6}"/>`);
|
|
110
|
+
else
|
|
111
|
+
parts.push(iconSvg(f, f.name.replace('ui_icon_', '').replace('ui_', '')));
|
|
112
|
+
}
|
|
113
|
+
const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="${UI_KIT_CANVAS.w}" height="${UI_KIT_CANVAS.h}">${parts.join('\n')}</svg>`;
|
|
114
|
+
return sharp(Buffer.from(svg)).png().toBuffer();
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* v1.2 内容自适应切分:在契约矩形的【安全扩展窗口】内按 alpha 求实际内容外接框。
|
|
118
|
+
* 为什么:图生图会把宽扁控件(按钮/面板/横幅/血条)画大、外描边吃掉内缩余量(实测贴边 38~47%),
|
|
119
|
+
* prompt 约束不可靠;而溢出的内容并没有丢——就画在帧间空隙里。矩形按实际 bbox 校正 = 确定性零裁切。
|
|
120
|
+
* 帧名/语义仍是 ABI;矩形本来就是每局图集 json 携带的,按实际内容写不破坏任何消费方
|
|
121
|
+
* (worker setDisplaySize 按玩法比例;makeBar 皮肤模式用比例几何,见 ui.js)。
|
|
122
|
+
* 窗口外扩 EXPAND=20px:所有相邻帧/画布边的最小间距 ≥40px,20px 双向扩不会吃进邻帧。
|
|
123
|
+
*/
|
|
124
|
+
/** 每帧的 bbox 搜索窗:向四邻扩到【与最近邻帧标称矩形的半距-2px】(封顶 60),不吃邻帧、不封死溢出。
|
|
125
|
+
* v1.2 曾用死 20px:AI 把大按钮画宽 >20px 溢出仍被窗口截断(用户实测右缘裁一点点)。 */
|
|
126
|
+
function searchWindows() {
|
|
127
|
+
const CAP = 60;
|
|
128
|
+
return UI_KIT_FRAMES.map((f) => {
|
|
129
|
+
let gl = f.x, gr = UI_KIT_CANVAS.w - (f.x + f.w), gt = f.y, gb = UI_KIT_CANVAS.h - (f.y + f.h);
|
|
130
|
+
for (const o of UI_KIT_FRAMES) {
|
|
131
|
+
if (o === f)
|
|
132
|
+
continue;
|
|
133
|
+
const overlapY = o.y < f.y + f.h && o.y + o.h > f.y;
|
|
134
|
+
const overlapX = o.x < f.x + f.w && o.x + o.w > f.x;
|
|
135
|
+
if (overlapY) {
|
|
136
|
+
if (o.x + o.w <= f.x)
|
|
137
|
+
gl = Math.min(gl, f.x - (o.x + o.w));
|
|
138
|
+
if (o.x >= f.x + f.w)
|
|
139
|
+
gr = Math.min(gr, o.x - (f.x + f.w));
|
|
140
|
+
}
|
|
141
|
+
if (overlapX) {
|
|
142
|
+
if (o.y + o.h <= f.y)
|
|
143
|
+
gt = Math.min(gt, f.y - (o.y + o.h));
|
|
144
|
+
if (o.y >= f.y + f.h)
|
|
145
|
+
gb = Math.min(gb, o.y - (f.y + f.h));
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
const e = (g) => Math.max(0, Math.min(CAP, Math.floor(g / 2) - 2));
|
|
149
|
+
return {
|
|
150
|
+
x0: Math.max(0, f.x - e(gl)),
|
|
151
|
+
y0: Math.max(0, f.y - e(gt)),
|
|
152
|
+
x1: Math.min(UI_KIT_CANVAS.w, f.x + f.w + e(gr)),
|
|
153
|
+
y1: Math.min(UI_KIT_CANVAS.h, f.y + f.h + e(gb)),
|
|
154
|
+
};
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
export async function contentFitFrames(png) {
|
|
158
|
+
const { data, info } = await sharp(png).ensureAlpha().raw().toBuffer({ resolveWithObject: true });
|
|
159
|
+
const W = info.width;
|
|
160
|
+
const alphaAt = (x, y) => data[(y * W + x) * 4 + 3];
|
|
161
|
+
const wins = searchWindows();
|
|
162
|
+
return UI_KIT_FRAMES.map((f, i) => {
|
|
163
|
+
const { x0, y0, x1, y1 } = wins[i];
|
|
164
|
+
let minX = x1, minY = y1, maxX = x0 - 1, maxY = y0 - 1;
|
|
165
|
+
for (let y = y0; y < y1; y++)
|
|
166
|
+
for (let x = x0; x < x1; x++)
|
|
167
|
+
if (alphaAt(x, y) > 24) {
|
|
168
|
+
if (x < minX)
|
|
169
|
+
minX = x;
|
|
170
|
+
if (x > maxX)
|
|
171
|
+
maxX = x;
|
|
172
|
+
if (y < minY)
|
|
173
|
+
minY = y;
|
|
174
|
+
if (y > maxY)
|
|
175
|
+
maxY = y;
|
|
176
|
+
}
|
|
177
|
+
// 全透明(该帧没画出来)→ 退回契约矩形,别写出 0 尺寸帧
|
|
178
|
+
if (maxX < minX || maxY < minY)
|
|
179
|
+
return { name: f.name, x: f.x, y: f.y, w: f.w, h: f.h };
|
|
180
|
+
return { name: f.name, x: minX, y: minY, w: maxX - minX + 1, h: maxY - minY + 1 };
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* 裁切重组(v1.3,用户定案):bbox 逐帧裁出 → 按契约 4 行紧凑重排成新图集。
|
|
185
|
+
* ① atlas 尺寸 = 实际内容尺寸(帧名/语义仍固定);② 挤掉画布里的大片空隙(1536×1024 → 紧凑)。
|
|
186
|
+
* 行分组按标称 y(行1 按钮/行2 圆钮/行3 面板血条/行4 图标),行内左起排、GAP 间隔。
|
|
187
|
+
*/
|
|
188
|
+
export const UIKIT_STRUCTURE_BROKEN = 'uikit-structure-broken';
|
|
189
|
+
/** alpha 连通域(4-连通,2x 降采样提速;面积 <150px² 视为噪点丢弃)。返回全分辨率 bbox。 */
|
|
190
|
+
async function alphaComponents(png) {
|
|
191
|
+
const { data, info } = await sharp(png).ensureAlpha().raw().toBuffer({ resolveWithObject: true });
|
|
192
|
+
const W = info.width, H = info.height, D = 2;
|
|
193
|
+
const w2 = Math.ceil(W / D), h2 = Math.ceil(H / D);
|
|
194
|
+
const mask = new Uint8Array(w2 * h2);
|
|
195
|
+
for (let y = 0; y < H; y++)
|
|
196
|
+
for (let x = 0; x < W; x++)
|
|
197
|
+
if (data[(y * W + x) * 4 + 3] > 24)
|
|
198
|
+
mask[Math.floor(y / D) * w2 + Math.floor(x / D)] = 1;
|
|
199
|
+
const label = new Int32Array(w2 * h2).fill(-1);
|
|
200
|
+
const comps = [];
|
|
201
|
+
const qx = new Int32Array(w2 * h2), qy = new Int32Array(w2 * h2);
|
|
202
|
+
for (let y = 0; y < h2; y++)
|
|
203
|
+
for (let x = 0; x < w2; x++) {
|
|
204
|
+
if (!mask[y * w2 + x] || label[y * w2 + x] >= 0)
|
|
205
|
+
continue;
|
|
206
|
+
const id = comps.length;
|
|
207
|
+
let head = 0, tail = 0;
|
|
208
|
+
qx[tail] = x;
|
|
209
|
+
qy[tail] = y;
|
|
210
|
+
tail++;
|
|
211
|
+
label[y * w2 + x] = id;
|
|
212
|
+
let x0 = x, y0 = y, x1 = x, y1 = y, area = 0;
|
|
213
|
+
while (head < tail) {
|
|
214
|
+
const cx = qx[head], cy = qy[head];
|
|
215
|
+
head++;
|
|
216
|
+
area++;
|
|
217
|
+
if (cx < x0)
|
|
218
|
+
x0 = cx;
|
|
219
|
+
if (cx > x1)
|
|
220
|
+
x1 = cx;
|
|
221
|
+
if (cy < y0)
|
|
222
|
+
y0 = cy;
|
|
223
|
+
if (cy > y1)
|
|
224
|
+
y1 = cy;
|
|
225
|
+
for (const [dx, dy] of [[1, 0], [-1, 0], [0, 1], [0, -1]]) {
|
|
226
|
+
const nx = cx + dx, ny = cy + dy;
|
|
227
|
+
if (nx < 0 || ny < 0 || nx >= w2 || ny >= h2)
|
|
228
|
+
continue;
|
|
229
|
+
const ni = ny * w2 + nx;
|
|
230
|
+
if (mask[ni] && label[ni] < 0) {
|
|
231
|
+
label[ni] = id;
|
|
232
|
+
qx[tail] = nx;
|
|
233
|
+
qy[tail] = ny;
|
|
234
|
+
tail++;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
comps.push({ x0: x0 * D, y0: y0 * D, x1: Math.min(W - 1, x1 * D + D - 1), y1: Math.min(H - 1, y1 * D + D - 1), area: area * D * D });
|
|
239
|
+
}
|
|
240
|
+
return comps.filter((c) => c.area >= 150);
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* v1.5 切割改【连通域 + 名义位置命名】(位置锚定窗口切分退役):
|
|
244
|
+
* - 连通域保证控件整块切出,永不夹断(风格画多大都完整);
|
|
245
|
+
* - 语义命名靠契约名义中心:含住该中心的组件 = 该帧主体(纯边缘切割给不了名字,位置才是语义源);
|
|
246
|
+
* - 结构失守确定性识破:一个组件含住 ≥2 个名义中心(自由排版的大控件横跨多位)或 >3 帧无主体 → 拒切上抛。
|
|
247
|
+
* - 帧内容框 = 主体 bbox ∪ 搜索窗内的小卫星组件(音量弧线/装饰星点这类离体笔画)。
|
|
248
|
+
*/
|
|
249
|
+
export async function fitAndRepackUiKit(png) {
|
|
250
|
+
const comps = await alphaComponents(png);
|
|
251
|
+
const wins = searchWindows();
|
|
252
|
+
const mainOf = new Map(); // comp idx → 命中的帧 idx 列表
|
|
253
|
+
const frameMain = UI_KIT_FRAMES.map((f, fi) => {
|
|
254
|
+
const cx = f.x + f.w / 2, cy = f.y + f.h / 2;
|
|
255
|
+
let best = -1, bestArea = 0;
|
|
256
|
+
comps.forEach((c, ci) => {
|
|
257
|
+
if (cx >= c.x0 && cx <= c.x1 && cy >= c.y0 && cy <= c.y1 && c.area > bestArea) {
|
|
258
|
+
best = ci;
|
|
259
|
+
bestArea = c.area;
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
if (best < 0)
|
|
263
|
+
return null;
|
|
264
|
+
mainOf.set(best, [...(mainOf.get(best) ?? []), fi]);
|
|
265
|
+
return best;
|
|
266
|
+
});
|
|
267
|
+
const spanning = [...mainOf.entries()].filter(([, fs]) => fs.length >= 2);
|
|
268
|
+
const unmatched = frameMain.filter((m) => m === null).length;
|
|
269
|
+
if (spanning.length > 0 || unmatched > 3) {
|
|
270
|
+
const names = spanning.flatMap(([, fs]) => fs.map((i) => UI_KIT_FRAMES[i].name));
|
|
271
|
+
throw new Error(`${UIKIT_STRUCTURE_BROKEN}: 生成图未遵守线稿布局,拒切(跨位组件:${names.join('/') || '无'};无主体帧:${unmatched})`);
|
|
272
|
+
}
|
|
273
|
+
const mains = new Set(frameMain.filter((m) => m !== null));
|
|
274
|
+
const fit = UI_KIT_FRAMES.map((f, fi) => {
|
|
275
|
+
const mi = frameMain[fi];
|
|
276
|
+
if (mi === null)
|
|
277
|
+
return { name: f.name, x: f.x, y: f.y, w: f.w, h: f.h }; // 无主体(≤3 帧容忍)→ 名义矩形(空)
|
|
278
|
+
const m = comps[mi];
|
|
279
|
+
let x0 = m.x0, y0 = m.y0, x1 = m.x1, y1 = m.y1;
|
|
280
|
+
const win = wins[fi];
|
|
281
|
+
comps.forEach((c, ci) => {
|
|
282
|
+
if (ci === mi || mains.has(ci))
|
|
283
|
+
return;
|
|
284
|
+
const ccx = (c.x0 + c.x1) / 2, ccy = (c.y0 + c.y1) / 2;
|
|
285
|
+
if (ccx >= win.x0 && ccx <= win.x1 && ccy >= win.y0 && ccy <= win.y1 && c.x0 >= win.x0 && c.x1 <= win.x1 && c.y0 >= win.y0 && c.y1 <= win.y1) {
|
|
286
|
+
x0 = Math.min(x0, c.x0);
|
|
287
|
+
y0 = Math.min(y0, c.y0);
|
|
288
|
+
x1 = Math.max(x1, c.x1);
|
|
289
|
+
y1 = Math.max(y1, c.y1);
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
return { name: f.name, x: x0, y: y0, w: x1 - x0 + 1, h: y1 - y0 + 1 };
|
|
293
|
+
});
|
|
294
|
+
const GAP = 4;
|
|
295
|
+
// 行号 = 标称 y 所在 256px 行带
|
|
296
|
+
const rowOf = (name) => Math.floor((UI_KIT_FRAMES.find((f) => f.name === name)?.y ?? 0) / 256);
|
|
297
|
+
const rows = [[], [], [], []];
|
|
298
|
+
for (const f of fit)
|
|
299
|
+
rows[rowOf(f.name)].push({ name: f.name, w: f.w, h: f.h, src: { x: f.x, y: f.y } });
|
|
300
|
+
let outW = 0, outH = 0;
|
|
301
|
+
const placed = [];
|
|
302
|
+
for (const row of rows) {
|
|
303
|
+
if (!row.length)
|
|
304
|
+
continue;
|
|
305
|
+
const rowH = Math.max(...row.map((r) => r.h));
|
|
306
|
+
let x = 0;
|
|
307
|
+
for (const r of row) {
|
|
308
|
+
placed.push({ name: r.name, x, y: outH + Math.floor((rowH - r.h) / 2), w: r.w, h: r.h, src: r.src });
|
|
309
|
+
x += r.w + GAP;
|
|
310
|
+
}
|
|
311
|
+
outW = Math.max(outW, x - GAP);
|
|
312
|
+
outH += rowH + GAP;
|
|
313
|
+
}
|
|
314
|
+
outH -= GAP;
|
|
315
|
+
const parts = [];
|
|
316
|
+
for (const pcd of placed) {
|
|
317
|
+
parts.push({ input: await sharp(png).extract({ left: pcd.src.x, top: pcd.src.y, width: pcd.w, height: pcd.h }).png().toBuffer(), left: pcd.x, top: pcd.y });
|
|
318
|
+
}
|
|
319
|
+
const buf = await sharp({ create: { width: outW, height: outH, channels: 4, background: { r: 0, g: 0, b: 0, alpha: 0 } } })
|
|
320
|
+
.composite(parts).png().toBuffer();
|
|
321
|
+
return { buf, frames: placed.map(({ name, x, y, w, h }) => ({ name, x, y, w, h })) };
|
|
322
|
+
}
|
|
323
|
+
/** 图生图 prompt(结构靠参考图,这里只点名控件语义 + 注入风格;绝不描述布局)。 */
|
|
324
|
+
export function uiKitPrompt(style) {
|
|
325
|
+
const names = UI_KIT_FRAMES.map((f) => f.label).join('、');
|
|
326
|
+
return (`游戏 UI 控件套件图。🔴 以参考图为【结构原型】:严格保持每个控件的位置、尺寸、轮廓形状与圆角,不新增、不删减、不移动;` +
|
|
327
|
+
`控件依次为:${names}。把灰色块面重绘成【${style || '明快卡通,圆润厚重,高对比描边'}】风格;` +
|
|
328
|
+
`图标符号含义保持不变;血槽外框保留内凹槽结构、血条填充为均匀可平铺的实心条;` +
|
|
329
|
+
`不烤任何文字;各控件之间保持干净间隔,严禁网格线/边框/背景装饰;🔴 每个控件的外接尺寸严格等于参考图中的灰色块面,绝不放大加粗到超出;描边/贴纸边/发光等一切装饰必须完全落在原控件轮廓范围内(可向内、绝不向外扩),控件之间的空隙必须保持完全透明。`);
|
|
330
|
+
}
|
|
331
|
+
//# sourceMappingURL=uiKit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uiKit.js","sourceRoot":"","sources":["../../../src/providers/art/uiKit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAQ1B,kDAAkD;AAClD,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;AAClD,6DAA6D;AAC7D,iCAAiC;AACjC,8DAA8D;AAC9D,0CAA0C;AAC1C,MAAM,CAAC,MAAM,QAAQ,GAAG,EAAE,CAAC,CAAC,uBAAuB;AACnD,MAAM,CAAC,MAAM,MAAM,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AAEpI,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,CAAC;AAC3C,MAAM,CAAC,MAAM,aAAa,GAAiB;IACzC,0BAA0B;IAC1B,EAAE,IAAI,EAAE,WAAW,EAAK,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAI,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;IAC9E,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAG,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;IAC9E,EAAE,IAAI,EAAE,WAAW,EAAK,KAAK,EAAE,KAAK,EAAO,CAAC,EAAE,GAAG,EAAG,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE;IAC/E,EAAE,IAAI,EAAE,WAAW,EAAK,KAAK,EAAE,KAAK,EAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE;IAC/E,oBAAoB;IACpB,EAAE,IAAI,EAAE,eAAe,EAAG,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAI,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;IAC7E,EAAE,IAAI,EAAE,cAAc,EAAI,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAG,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;IAC7E,EAAE,IAAI,EAAE,eAAe,EAAG,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAG,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;IAC7E,EAAE,IAAI,EAAE,eAAe,EAAG,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAG,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;IAC7E,EAAE,IAAI,EAAE,cAAc,EAAI,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;IAC7E,EAAE,IAAI,EAAE,eAAe,EAAG,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;IAC7E,8BAA8B;IAC9B,EAAE,IAAI,EAAE,UAAU,EAAM,KAAK,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE,EAAI,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;IAClF,EAAE,IAAI,EAAE,WAAW,EAAK,KAAK,EAAE,cAAc,EAAE,CAAC,EAAE,GAAG,EAAG,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;IACpF,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAa,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;IAC3G,EAAE,IAAI,EAAE,aAAa,EAAG,KAAK,EAAE,MAAM,EAAa,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,CAAC,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,EAAE,MAAM,CAAC,SAAS,EAAE;IAClH,2BAA2B;IAC3B,EAAE,IAAI,EAAE,SAAS,EAAQ,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAI,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;IAC9E,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,EAAG,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;IAC9E,EAAE,IAAI,EAAE,UAAU,EAAO,KAAK,EAAE,IAAI,EAAO,CAAC,EAAE,GAAG,EAAG,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;IAChF,EAAE,IAAI,EAAE,SAAS,EAAQ,KAAK,EAAE,IAAI,EAAO,CAAC,EAAE,GAAG,EAAG,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;IAChF,EAAE,IAAI,EAAE,YAAY,EAAK,KAAK,EAAE,IAAI,EAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;IAChF,EAAE,IAAI,EAAE,QAAQ,EAAS,KAAK,EAAE,IAAI,EAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE;CACjF,CAAC;AAEF,sCAAsC;AACtC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAChG,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ;AAEtB,SAAS,MAAM,CAAC,CAAa,EAAE,OAAgB;IAC7C,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC;IAChJ,OAAO,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,WAAW,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,IAAI,mBAAmB,EAAE,MAAM,EAAE,EAAE,CAAC;AAC1K,CAAC;AACD,SAAS,UAAU,CAAC,CAAa;IAC/B,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACnE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,eAAe,EAAE,SAAS,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,IAAI,mBAAmB,EAAE,KAAK,EAAE,CAAC;AACjI,CAAC;AACD,SAAS,OAAO,CAAC,CAAa,EAAE,IAAY;IAC1C,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IAClB,MAAM,MAAM,GAA2B;QACrC,KAAK,EAAE,YAAY,EAAE,GAAG,CAAC,GAAG,IAAI,QAAQ,EAAE,GAAG,CAAC,GAAG,GAAG,YAAY,CAAC,GAAG,GAAG,aAAa,CAAC,kBAAkB,CAAC,CAAC,IAAI,eAAe,EAAE,GAAG,CAAC,GAAG,IAAI,QAAQ,EAAE,GAAG,CAAC,GAAG,GAAG,YAAY,CAAC,GAAG,GAAG,aAAa,CAAC,kBAAkB,CAAC,CAAC,IAAI,KAAK;QAC3N,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,QAAQ,CAAC,GAAG,IAAI,yBAAyB,CAAC,CAAC,IAAI,mBAAmB,CAAC,GAAG,IAAI,KAAK;YAC/G,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,EAAE,GAAG,CAAC,GAAG,IAAI,QAAQ,EAAE,GAAG,CAAC,GAAG,IAAI,YAAY,CAAC,GAAG,IAAI,aAAa,CAAC,GAAG,IAAI,WAAW,CAAC,CAAC,IAAI,uBAAuB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9M,KAAK,EAAE,oBAAoB,EAAE,GAAG,CAAC,GAAG,GAAG,IAAI,EAAE,GAAG,CAAC,GAAG,GAAG,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,GAAG,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,GAAG,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,GAAG,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,GAAG,IAAI,EAAE,GAAG,CAAC,GAAG,GAAG,IAAI,EAAE,GAAG,CAAC,GAAG,GAAG,WAAW,CAAC,CAAC,IAAI,iBAAiB,EAAE,GAAG,CAAC,GAAG,GAAG,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,IAAI,UAAU,EAAE,GAAG,CAAC,GAAG,GAAG,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,yBAAyB,CAAC,CAAC,IAAI,mBAAmB,CAAC,GAAG,IAAI,4BAA4B;QACjb,KAAK,EAAE,YAAY,EAAE,GAAG,CAAC,GAAG,GAAG,QAAQ,EAAE,GAAG,CAAC,GAAG,IAAI,YAAY,CAAC,aAAa,CAAC,GAAG,IAAI,kBAAkB,CAAC,CAAC,IAAI,0BAA0B,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,CAAC,GAAG,GAAG,QAAQ,EAAE,GAAG,CAAC,GAAG,IAAI,YAAY,CAAC,aAAa,CAAC,GAAG,IAAI,kBAAkB,CAAC,CAAC,IAAI,2BAA2B,EAAE,IAAI,EAAE,MAAM;QACpS,IAAI,EAAE,oBAAoB,EAAE,GAAG,CAAC,GAAG,GAAG,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,GAAG,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,GAAG,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,GAAG,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,GAAG,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,GAAG,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,GAAG,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,WAAW,CAAC,CAAC,IAAI,KAAK;QACxQ,KAAK,EAAE,cAAc,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,IAAI,UAAU,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,yBAAyB,CAAC,CAAC,IAAI,mBAAmB,CAAC,GAAG,GAAG,8CAA8C,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,GAAG,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,GAAG,WAAW,CAAC,CAAC,IAAI,KAAK;QAC5T,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC;QAC9B,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC;QACrC,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,KAAK,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,GAAG,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,KAAK,EAAE,GAAG,CAAC,GAAG,GAAG,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,aAAa,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,IAAI,mBAAmB,EAAE,KAAK;QACnS,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,QAAQ,CAAC,GAAG,IAAI,WAAW,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,IAAI,mBAAmB,EAAE,kBAAkB,EAAE,SAAS,EAAE,QAAQ,CAAC,GAAG,IAAI,yBAAyB,CAAC,CAAC,IAAI,mBAAmB,EAAE,GAAG,GAAG,KAAK;QACzN,OAAO,EAAE,oBAAoB,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,WAAW,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,IAAI,mBAAmB,EAAE,wBAAwB,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,aAAa,CAAC,CAAC,IAAI,mBAAmB,EAAE,GAAG,GAAG,oCAAoC,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,aAAa,CAAC,CAAC,IAAI,mBAAmB,EAAE,GAAG,GAAG,iBAAiB;QACjjB,GAAG,EAAE,oBAAoB,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,WAAW,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,IAAI,mBAAmB,EAAE,uBAAuB,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,CAAC,GAAG,GAAG,IAAI,EAAE,yBAAyB,CAAC,CAAC,IAAI,mBAAmB,EAAE,GAAG,GAAG,KAAK;KACjb,CAAC;IACF,oCAAoC;IACpC,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACtF,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;AAClD,CAAC;AACD,SAAS,OAAO,CAAC,EAAU,EAAE,EAAU,EAAE,CAAS,EAAE,MAAe;IACjE,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QAC7C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QAC3C,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,oBAAoB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,aAAa,CAAC,CAAC,IAAI,mBAAmB,EAAE,KAAK,CAAC;AAC3H,CAAC;AAED;;oDAEoD;AACpD,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,EAAE,IAAI,aAAa,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAe,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC;QACxH,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW;YAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;aACpD,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc;YAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;aAC3D,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW;YAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;aACnF,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU;YAC5B,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC,IAAI,mBAAmB,EAAE,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,IAAI,mBAAmB,EAAE,GAAG,GAAG,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;aACjT,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW;YAC7B,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC,IAAI,mBAAmB,EAAE,KAAK,CAAC,CAAC;aAClJ,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc;YAChC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,IAAI,mBAAmB,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,YAAY,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;aACzU,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa;YAC/B,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,IAAI,mBAAmB,EAAE,GAAG,GAAG,KAAK,CAAC,CAAC;;YACvJ,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACjF,CAAC;IACD,MAAM,GAAG,GAAG,kDAAkD,aAAa,CAAC,CAAC,aAAa,aAAa,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;IACvI,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;AAClD,CAAC;AAED;;;;;;;GAOG;AACH;0DAC0D;AAC1D,SAAS,aAAa;IACpB,MAAM,GAAG,GAAG,EAAE,CAAC;IACf,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC7B,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/F,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;YAC9B,IAAI,CAAC,KAAK,CAAC;gBAAE,SAAS;YACtB,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACpD,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACpD,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;oBAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3D,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;oBAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7D,CAAC;YACD,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;oBAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3D,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;oBAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACnF,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;YAC5B,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;YAC5B,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;YAChD,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;SACjD,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAW;IAChD,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;IAClG,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;IACrB,MAAM,OAAO,GAAG,CAAC,CAAS,EAAE,CAAS,EAAU,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5E,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;IAC7B,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAChC,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,IAAI,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;QACvD,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;YAC1B,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;gBAC1B,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;oBACvB,IAAI,CAAC,GAAG,IAAI;wBAAE,IAAI,GAAG,CAAC,CAAC;oBACvB,IAAI,CAAC,GAAG,IAAI;wBAAE,IAAI,GAAG,CAAC,CAAC;oBACvB,IAAI,CAAC,GAAG,IAAI;wBAAE,IAAI,GAAG,CAAC,CAAC;oBACvB,IAAI,CAAC,GAAG,IAAI;wBAAE,IAAI,GAAG,CAAC,CAAC;gBACzB,CAAC;QACL,gCAAgC;QAChC,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI;YAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxF,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC;IACpF,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,wBAAwB,CAAC;AAE/D,8DAA8D;AAC9D,KAAK,UAAU,eAAe,CAAC,GAAW;IACxC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;IAClG,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;IAC7C,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YACxB,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE;gBAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7F,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAuE,EAAE,CAAC;IACrF,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,IAAI,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IACjE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;QACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC1D,MAAM,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC;YACxB,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC;YACvB,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAAC,IAAI,EAAE,CAAC;YACnC,KAAK,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACvB,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC;YAC7C,OAAO,IAAI,GAAG,IAAI,EAAE,CAAC;gBACnB,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;gBAAC,IAAI,EAAE,CAAC;gBAC3C,IAAI,EAAE,CAAC;gBACP,IAAI,EAAE,GAAG,EAAE;oBAAE,EAAE,GAAG,EAAE,CAAC;gBAAC,IAAI,EAAE,GAAG,EAAE;oBAAE,EAAE,GAAG,EAAE,CAAC;gBAAC,IAAI,EAAE,GAAG,EAAE;oBAAE,EAAE,GAAG,EAAE,CAAC;gBAAC,IAAI,EAAE,GAAG,EAAE;oBAAE,EAAE,GAAG,EAAE,CAAC;gBACvF,KAAK,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAU,EAAE,CAAC;oBACnE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;oBACjC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;wBAAE,SAAS;oBACvD,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;oBACxB,IAAI,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;wBAAC,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;wBAAC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;wBAAC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;wBAAC,IAAI,EAAE,CAAC;oBAAC,CAAC;gBAC1F,CAAC;YACH,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvI,CAAC;IACH,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAW;IACjD,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC,CAAC,yBAAyB;IACrE,MAAM,SAAS,GAAsB,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE;QAC/D,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC7C,IAAI,IAAI,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC;QAC5B,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE;YACtB,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,GAAG,QAAQ,EAAE,CAAC;gBAAC,IAAI,GAAG,EAAE,CAAC;gBAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC;YAAC,CAAC;QAClH,CAAC,CAAC,CAAC;QACH,IAAI,IAAI,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1B,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC;IAC7D,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACjF,MAAM,IAAI,KAAK,CAAC,GAAG,sBAAsB,wBAAwB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,SAAS,SAAS,GAAG,CAAC,CAAC;IAChH,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;IACxE,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE;QACtC,MAAM,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;QACzB,IAAI,EAAE,KAAK,IAAI;YAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,uBAAuB;QACjG,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;QACpB,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;QAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;QACrB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE;YACtB,IAAI,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,OAAO;YACvC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;YACvD,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;gBAC7I,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;gBAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;gBAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;gBAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACrG,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;IACxE,CAAC,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,CAAC,CAAC;IACd,wBAAwB;IACxB,MAAM,KAAK,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IAC/G,MAAM,IAAI,GAA8E,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACzG,KAAK,MAAM,CAAC,IAAI,GAAG;QAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzG,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC;IACvB,MAAM,MAAM,GAAkG,EAAE,CAAC;IACjH,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,MAAM;YAAE,SAAS;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YACrG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QACjB,CAAC;QACD,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;QAC/B,IAAI,IAAI,IAAI,GAAG,GAAG,CAAC;IACrB,CAAC;IACD,IAAI,IAAI,GAAG,CAAC;IACZ,MAAM,KAAK,GAAmD,EAAE,CAAC;IACjE,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IAC9J,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;SACxH,SAAS,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IACrC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AACvF,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1D,OAAO,CACL,gEAAgE;QAChE,SAAS,KAAK,aAAa,KAAK,IAAI,iBAAiB,MAAM;QAC3D,wCAAwC;QACxC,+HAA+H,CAChI,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 视觉判定一张精灵图的朝向(侧面)。
|
|
3
|
+
* 🔴 失败/不确定一律返回 `'unknown'`,**绝不抛错打断生成** —— 判定是增强,不是前置条件。
|
|
4
|
+
*/
|
|
5
|
+
export declare function detectFacing(imageDataUrl: string): Promise<'left' | 'right' | 'unknown'>;
|
|
6
|
+
export type SheetFacing = 'left' | 'right' | 'up' | 'down' | 'none';
|
|
7
|
+
/**
|
|
8
|
+
* 视觉给图集每帧打语义标签 + 逐帧朝向(平台契约:角色美术统一面朝右;`facing==='left'` 的帧由调用方翻转)。
|
|
9
|
+
* 入参图须在每帧左上角标了序号(**显式对齐索引** —— 否则模型的"第几个"和我们的第几个对不上)。
|
|
10
|
+
* 失败/解析不出 → 空数组,绝不抛错打断生成。
|
|
11
|
+
*/
|
|
12
|
+
export declare function inspectSheetLabels(imageDataUrl: string, count: number, desc?: string): Promise<{
|
|
13
|
+
labels: string[];
|
|
14
|
+
facing: SheetFacing[];
|
|
15
|
+
}>;
|
|
16
|
+
/**
|
|
17
|
+
* 成品验收评委(`verify` 为 true 时才跑)—— 看每张成品图,输出 issues。
|
|
18
|
+
*
|
|
19
|
+
* 🔴 这是美术链里**唯一真正需要 agent 的地方**:看图评判"切对没/抠对没/内容对没/方向对没"
|
|
20
|
+
* 是综合视觉判断,确定性代码做不到。**只判不做** —— 疑难交用户 / 下轮 reviser。
|
|
21
|
+
*
|
|
22
|
+
* ⚠️ 它是**尾部可选的一步,不是一条分支**:`verify` 的两个取值下,
|
|
23
|
+
* **图处理的每一行都必须相同**。如果你发现自己在写 `if (verify) …else…` 包住任何处理逻辑,就是走岔了。
|
|
24
|
+
*/
|
|
25
|
+
export declare function runVisionJudge(instructions: string, brief: string, images?: string[]): Promise<string>;
|
|
26
|
+
//# sourceMappingURL=visionJudge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visionJudge.d.ts","sourceRoot":"","sources":["../../../src/providers/art/visionJudge.ts"],"names":[],"mappings":"AA0DA;;;GAGG;AACH,wBAAsB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAiB9F;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;AASpE;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,WAAW,EAAE,CAAA;CAAE,CAAC,CAsBtD;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ5G"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module providers/art/visionJudge
|
|
3
|
+
* @description 美术链的三处**模型判断**(1.3)。由 coral-studio `src/agents/runtime.ts` 移交。
|
|
4
|
+
* @layer provider
|
|
5
|
+
* @boundedContext art
|
|
6
|
+
*
|
|
7
|
+
* 与 studio 版的唯一差别:`callSubAgent`(HTTP 出站)→ `runSubAgent`(**本地库调用**)。
|
|
8
|
+
* 提示词、解析方式、失败语义**一字未改** —— 那些常数是实测的化石。
|
|
9
|
+
*
|
|
10
|
+
* ══════════════════════════════════════════════════════════════════════════
|
|
11
|
+
* 🔴🔴 **三处一律不加 `outputSchema`。这是实测结论,不是风格偏好。**
|
|
12
|
+
*
|
|
13
|
+
* 实测(2026-08-01,gpt-5.4 / codex,单帧精灵 n=8):
|
|
14
|
+
* ```
|
|
15
|
+
* 自由文本 + JSON 提取 7/8 正确
|
|
16
|
+
* json_schema 结构化输出 1/8 正确
|
|
17
|
+
* schema + "先写 reason 再结论" 字段 2/8
|
|
18
|
+
* ```
|
|
19
|
+
* json_schema 模式下模型**明显少推理**。看图判定一律走自由文本 + 正则提 JSON。
|
|
20
|
+
*
|
|
21
|
+
* ⚠️ **为什么这条最容易被顺手做掉**:改成本地调用之后,`runSubAgent` 就在手边、
|
|
22
|
+
* 它**支持** `outputSchema`,加上去代码还更短更"干净" ——
|
|
23
|
+
* **所有让它变好看的理由都成立,只有正确率不成立。**
|
|
24
|
+
* 本文件配了一条测试专门断言"传给 runSubAgent 的 spec 里没有 outputSchema"。
|
|
25
|
+
* ══════════════════════════════════════════════════════════════════════════
|
|
26
|
+
*/
|
|
27
|
+
import { runSubAgent, SubAgentError } from '../subagent/runSubAgent.js';
|
|
28
|
+
/** 快判定的超时(与 studio 侧同量级)。 */
|
|
29
|
+
const TIMEOUT_QUICK = 90_000;
|
|
30
|
+
async function judge(spec) {
|
|
31
|
+
// toolMode:'none' —— 纯推理,不给文件工具(看图判定不需要,给了反而多一份越权面)。
|
|
32
|
+
const r = await runSubAgent({ ...spec, toolMode: 'none' });
|
|
33
|
+
return r.output;
|
|
34
|
+
}
|
|
35
|
+
/** 从自由文本里抠出第一个 JSON 对象。模型爱加解释/代码块,这是移交时就有的做法。 */
|
|
36
|
+
function extractJson(output) {
|
|
37
|
+
const m = /\{[\s\S]*\}/.exec(output);
|
|
38
|
+
if (!m)
|
|
39
|
+
return null;
|
|
40
|
+
try {
|
|
41
|
+
return JSON.parse(m[0]);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const FACING_INSTRUCTIONS = '你在判断一张游戏精灵图主体的朝向。只看主体的脸/身体/机头指向画面哪一侧。' +
|
|
48
|
+
'只输出 JSON、不要解释、不要代码块:{"facing":"left"|"right"|"unknown"}。拿不准就 "unknown"。';
|
|
49
|
+
/**
|
|
50
|
+
* 视觉判定一张精灵图的朝向(侧面)。
|
|
51
|
+
* 🔴 失败/不确定一律返回 `'unknown'`,**绝不抛错打断生成** —— 判定是增强,不是前置条件。
|
|
52
|
+
*/
|
|
53
|
+
export async function detectFacing(imageDataUrl) {
|
|
54
|
+
try {
|
|
55
|
+
const output = await judge({
|
|
56
|
+
name: 'facing-detector',
|
|
57
|
+
instructions: FACING_INSTRUCTIONS,
|
|
58
|
+
task: '判断这张图主体的朝向,只输出 JSON。',
|
|
59
|
+
images: [imageDataUrl],
|
|
60
|
+
timeoutMs: TIMEOUT_QUICK,
|
|
61
|
+
});
|
|
62
|
+
const j = extractJson(output);
|
|
63
|
+
const f = j?.facing;
|
|
64
|
+
return f === 'left' || f === 'right' ? f : 'unknown';
|
|
65
|
+
}
|
|
66
|
+
catch (e) {
|
|
67
|
+
// 分类可见:一眼看出是超时还是模型问题(契约 §4.4:sps 只做错误分类,不吞异常语义)
|
|
68
|
+
if (e instanceof SubAgentError)
|
|
69
|
+
console.warn(`[detectFacing] ${e.kind}: ${e.message}`);
|
|
70
|
+
return 'unknown';
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const SHEET_LABEL_INSTRUCTIONS = '你在给一张游戏图集的每个元素打语义标签。图上每个元素左上角标了红色序号(0,1,2…)。' +
|
|
74
|
+
'针对每个序号,用 1–3 个词说它是什么(中/英皆可,如 "红桃K"/"8号球"/"红色宝石"/"走路帧2");' +
|
|
75
|
+
'并判断朝向 facing:仅当元素是有明确脸部/身体/机头朝向的【角色/生物/载具】时给 "left"/"right"/"up"/"down"(脸或机头朝画面哪个方向;飞机/火箭/飞船看机头尖端指向),' +
|
|
76
|
+
'无方向物件(宝石/按钮/图标/正面对称元素)一律 "none"——拿不准就 "none",宁缺勿错。' +
|
|
77
|
+
'只输出 JSON、不要解释、不要代码块:{"labels":["…",…],"facing":["none"|"left"|"right"|"up"|"down",…]},两个数组顺序严格按序号、长度=元素个数。';
|
|
78
|
+
/**
|
|
79
|
+
* 视觉给图集每帧打语义标签 + 逐帧朝向(平台契约:角色美术统一面朝右;`facing==='left'` 的帧由调用方翻转)。
|
|
80
|
+
* 入参图须在每帧左上角标了序号(**显式对齐索引** —— 否则模型的"第几个"和我们的第几个对不上)。
|
|
81
|
+
* 失败/解析不出 → 空数组,绝不抛错打断生成。
|
|
82
|
+
*/
|
|
83
|
+
export async function inspectSheetLabels(imageDataUrl, count, desc) {
|
|
84
|
+
try {
|
|
85
|
+
const output = await judge({
|
|
86
|
+
name: 'sheet-labeler',
|
|
87
|
+
instructions: SHEET_LABEL_INSTRUCTIONS,
|
|
88
|
+
task: `这是一张图集,共 ${count} 个元素(序号 0..${count - 1})。${desc ? `整体描述:${desc}。` : ''}给每个序号打标签和朝向,只输出 JSON。`,
|
|
89
|
+
images: [imageDataUrl],
|
|
90
|
+
timeoutMs: TIMEOUT_QUICK,
|
|
91
|
+
});
|
|
92
|
+
const j = extractJson(output);
|
|
93
|
+
if (!j)
|
|
94
|
+
return { labels: [], facing: [] };
|
|
95
|
+
const labels = Array.isArray(j.labels) ? j.labels.slice(0, count).map((x) => String(x)) : [];
|
|
96
|
+
const facing = Array.isArray(j.facing)
|
|
97
|
+
? j.facing
|
|
98
|
+
.slice(0, count)
|
|
99
|
+
.map((x) => (x === 'left' || x === 'right' || x === 'up' || x === 'down' ? x : 'none'))
|
|
100
|
+
: [];
|
|
101
|
+
return { labels, facing };
|
|
102
|
+
}
|
|
103
|
+
catch (e) {
|
|
104
|
+
if (e instanceof SubAgentError)
|
|
105
|
+
console.warn(`[inspectSheetLabels] ${e.kind}: ${e.message}`);
|
|
106
|
+
return { labels: [], facing: [] };
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* 成品验收评委(`verify` 为 true 时才跑)—— 看每张成品图,输出 issues。
|
|
111
|
+
*
|
|
112
|
+
* 🔴 这是美术链里**唯一真正需要 agent 的地方**:看图评判"切对没/抠对没/内容对没/方向对没"
|
|
113
|
+
* 是综合视觉判断,确定性代码做不到。**只判不做** —— 疑难交用户 / 下轮 reviser。
|
|
114
|
+
*
|
|
115
|
+
* ⚠️ 它是**尾部可选的一步,不是一条分支**:`verify` 的两个取值下,
|
|
116
|
+
* **图处理的每一行都必须相同**。如果你发现自己在写 `if (verify) …else…` 包住任何处理逻辑,就是走岔了。
|
|
117
|
+
*/
|
|
118
|
+
export async function runVisionJudge(instructions, brief, images) {
|
|
119
|
+
return judge({
|
|
120
|
+
name: 'art-judge',
|
|
121
|
+
instructions,
|
|
122
|
+
task: brief,
|
|
123
|
+
...(images?.length ? { images } : {}),
|
|
124
|
+
timeoutMs: TIMEOUT_QUICK,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=visionJudge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visionJudge.js","sourceRoot":"","sources":["../../../src/providers/art/visionJudge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"withinDir.d.ts","sourceRoot":"","sources":["../../../src/providers/art/withinDir.ts"],"names":[],"mappings":"AAcA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAI/D"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module providers/art/withinDir
|
|
3
|
+
* @description "这个路径在不在那个目录里" —— 由 studio `pathGuard.ts` 移交(语义一字未改)。
|
|
4
|
+
* @layer provider
|
|
5
|
+
* @boundedContext art
|
|
6
|
+
*
|
|
7
|
+
* ⚠️ 它**不是**落点围栏。落点由 `core/art/assetLocator` **构造**保证(sps 自己拼路径);
|
|
8
|
+
* 这里守的是另一件事:**manifest 里由设计师填的引用路径**(`ref` / `provided`)
|
|
9
|
+
* 可能写成 `../../etc/passwd` —— 那是**内容**,不是我们拼的,必须查。
|
|
10
|
+
*
|
|
11
|
+
* 🔴 必须比到分隔符:裸 `startsWith(root)` 会放行 `<root>-old`(同 console/lib/artPaths 的判据)。
|
|
12
|
+
*/
|
|
13
|
+
import { resolve, sep } from 'node:path';
|
|
14
|
+
export function withinDir(root, target) {
|
|
15
|
+
const r = resolve(root);
|
|
16
|
+
const t = resolve(target);
|
|
17
|
+
return t === r || t.startsWith(r.endsWith(sep) ? r : `${r}${sep}`);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=withinDir.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"withinDir.js","sourceRoot":"","sources":["../../../src/providers/art/withinDir.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEzC,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,MAAc;IACpD,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;AACrE,CAAC"}
|