@aalis/plugin-user-relation 0.4.1
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/LICENSE +21 -0
- package/dist/actions.d.ts +13 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +705 -0
- package/dist/actions.js.map +1 -0
- package/dist/commands.d.ts +46 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +601 -0
- package/dist/commands.js.map +1 -0
- package/dist/consolidate-llm.d.ts +150 -0
- package/dist/consolidate-llm.d.ts.map +1 -0
- package/dist/consolidate-llm.js +373 -0
- package/dist/consolidate-llm.js.map +1 -0
- package/dist/extractor.d.ts +308 -0
- package/dist/extractor.d.ts.map +1 -0
- package/dist/extractor.js +1356 -0
- package/dist/extractor.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +626 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware.d.ts +41 -0
- package/dist/middleware.d.ts.map +1 -0
- package/dist/middleware.js +281 -0
- package/dist/middleware.js.map +1 -0
- package/dist/rename-watcher.d.ts +16 -0
- package/dist/rename-watcher.d.ts.map +1 -0
- package/dist/rename-watcher.js +16 -0
- package/dist/rename-watcher.js.map +1 -0
- package/dist/service.d.ts +1108 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +4462 -0
- package/dist/service.js.map +1 -0
- package/dist/store.d.ts +89 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +207 -0
- package/dist/store.js.map +1 -0
- package/dist/tools.d.ts +48 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +1630 -0
- package/dist/tools.js.map +1 -0
- package/dist/types.d.ts +432 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +94 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +419 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +1630 -0
- package/dist/utils.js.map +1 -0
- package/package.json +57 -0
package/dist/commands.js
ADDED
|
@@ -0,0 +1,601 @@
|
|
|
1
|
+
import { useCommandService } from '@aalis/plugin-commands-api';
|
|
2
|
+
import { sendPlatformMessage } from '@aalis/plugin-platform-api';
|
|
3
|
+
import { getKnownPlatformsLower, isPlaceholderSelfPersonId } from './extractor.js';
|
|
4
|
+
export function registerRelationCommands(ctx, service, options) {
|
|
5
|
+
const cmds = useCommandService(ctx);
|
|
6
|
+
// ---- show ----
|
|
7
|
+
cmds
|
|
8
|
+
.command('relation.show <kind:string> <id:text>', '查看关系图中某节点及其直连边')
|
|
9
|
+
.example('relation show person onebot:1234567')
|
|
10
|
+
.example('relation show entity 9f3a2b...')
|
|
11
|
+
.action(async (_argv, kindArg, idArg) => {
|
|
12
|
+
const kind = String(kindArg ?? '').toLowerCase();
|
|
13
|
+
const id = String(idArg ?? '').trim();
|
|
14
|
+
if (!id)
|
|
15
|
+
return '用法: relation show <person|event|entity> <id>';
|
|
16
|
+
const snap = await service.loadAll();
|
|
17
|
+
if (kind === 'person') {
|
|
18
|
+
if (!id.includes(':'))
|
|
19
|
+
return 'person id 应为 platform:userId';
|
|
20
|
+
const p = snap.persons.find(x => x.id === id);
|
|
21
|
+
if (!p)
|
|
22
|
+
return `未找到 person: ${id}`;
|
|
23
|
+
const nb = await service.getNeighborhood(id);
|
|
24
|
+
return formatPerson(p, nb.events, nb.entities, nb.edges);
|
|
25
|
+
}
|
|
26
|
+
if (kind === 'event') {
|
|
27
|
+
const e = snap.events.find(x => x.id === id);
|
|
28
|
+
if (!e)
|
|
29
|
+
return `未找到 event: ${id}`;
|
|
30
|
+
const edges = snap.edges.filter(ed => (ed.kind === 'person-event' && ed.toEventId === id) ||
|
|
31
|
+
(ed.kind === 'event-event' && (ed.fromEventId === id || ed.toEventId === id)));
|
|
32
|
+
return formatEvent(e, edges);
|
|
33
|
+
}
|
|
34
|
+
if (kind === 'entity') {
|
|
35
|
+
const ent = snap.entities.find(x => x.id === id);
|
|
36
|
+
if (!ent)
|
|
37
|
+
return `未找到 entity: ${id}`;
|
|
38
|
+
const edges = snap.edges.filter(ed => ed.kind === 'person-entity' && ed.toEntityId === id);
|
|
39
|
+
return formatEntity(ent, edges);
|
|
40
|
+
}
|
|
41
|
+
return `未知 kind: ${kind}(应为 person / event / entity)`;
|
|
42
|
+
});
|
|
43
|
+
// ---- orphans (list) ----
|
|
44
|
+
cmds.command('relation.orphans', '列出图中所有孤立点(不被任何边引用)').action(async () => {
|
|
45
|
+
const snap = await service.loadAll();
|
|
46
|
+
const { orphanPersons, orphanEvents, orphanEntities } = collectOrphans(snap);
|
|
47
|
+
if (orphanPersons.length + orphanEvents.length + orphanEntities.length === 0) {
|
|
48
|
+
return '✓ 无孤立点。';
|
|
49
|
+
}
|
|
50
|
+
const lines = ['# 孤立点'];
|
|
51
|
+
if (orphanPersons.length) {
|
|
52
|
+
lines.push(`## 人物 (${orphanPersons.length})`);
|
|
53
|
+
for (const p of orphanPersons)
|
|
54
|
+
lines.push(`- ${p.id} ${p.displayName ?? ''}`);
|
|
55
|
+
}
|
|
56
|
+
if (orphanEvents.length) {
|
|
57
|
+
lines.push(`## 事件 (${orphanEvents.length})`);
|
|
58
|
+
for (const e of orphanEvents)
|
|
59
|
+
lines.push(`- ${e.id} ${e.title}`);
|
|
60
|
+
}
|
|
61
|
+
if (orphanEntities.length) {
|
|
62
|
+
lines.push(`## 实体 (${orphanEntities.length})`);
|
|
63
|
+
for (const e of orphanEntities)
|
|
64
|
+
lines.push(`- ${e.id} [${e.entityKind}] ${e.name}`);
|
|
65
|
+
}
|
|
66
|
+
return lines.join('\n');
|
|
67
|
+
});
|
|
68
|
+
// ---- cleanup person/event/entity ----
|
|
69
|
+
cmds
|
|
70
|
+
.command('relation.cleanup.person <id:text>', '删除人物及其所有相关边', { visibility: 'restricted' })
|
|
71
|
+
.action(async (_argv, idArg) => {
|
|
72
|
+
const id = String(idArg ?? '').trim();
|
|
73
|
+
if (!id.includes(':'))
|
|
74
|
+
return 'person id 应为 platform:userId';
|
|
75
|
+
const [platform, userId] = id.split(':', 2);
|
|
76
|
+
const r = await service.deletePerson(platform, userId);
|
|
77
|
+
return `✓ 已删除 person ${id}(级联 ${r.deletedEdges} 条边)`;
|
|
78
|
+
});
|
|
79
|
+
// ---- forget-me:用户自助清理自己的节点 ----
|
|
80
|
+
// 注意:只能清掉「自己作为发言者」被记录的节点和直接挂在节点上的边;
|
|
81
|
+
// 别人在事件 title / evidence 里**提及**你的名字(纯字符串)无法清理——
|
|
82
|
+
// 因为这种情况下系统压根没把"你"识别为一个节点,没有 id 可定位。
|
|
83
|
+
cmds
|
|
84
|
+
.command('relation.forget-me', '清理我自己在关系图中的节点与直接关联(不清理别人对我的文本提及)')
|
|
85
|
+
.action(async (argv) => {
|
|
86
|
+
const { platform, userId } = argv.session;
|
|
87
|
+
if (!platform || !userId)
|
|
88
|
+
return '当前会话无法识别你的身份(缺少 platform / userId)';
|
|
89
|
+
const id = `${platform}:${userId}`;
|
|
90
|
+
const snap = await service.loadAll();
|
|
91
|
+
const exists = snap.persons.some(p => p.id === id);
|
|
92
|
+
if (!exists)
|
|
93
|
+
return `✓ 关系图中没有你的节点(${id}),无需清理。`;
|
|
94
|
+
const r = await service.deletePerson(platform, userId);
|
|
95
|
+
return `✓ 已删除你的节点 ${id}(级联 ${r.deletedEdges} 条边)。注意:别人在事件文本中提到你的字符串不会被清理。`;
|
|
96
|
+
});
|
|
97
|
+
cmds
|
|
98
|
+
.command('relation.cleanup.event <id:text>', '删除事件及其所有相关边', { visibility: 'restricted' })
|
|
99
|
+
.action(async (_argv, idArg) => {
|
|
100
|
+
const id = String(idArg ?? '').trim();
|
|
101
|
+
if (!id)
|
|
102
|
+
return '请提供 event id';
|
|
103
|
+
const r = await service.deleteEvent(id);
|
|
104
|
+
return `✓ 已删除 event ${id}(级联 ${r.deletedEdges} 条边)`;
|
|
105
|
+
});
|
|
106
|
+
cmds
|
|
107
|
+
.command('relation.cleanup.entity <id:text>', '删除实体及其所有相关边', { visibility: 'restricted' })
|
|
108
|
+
.action(async (_argv, idArg) => {
|
|
109
|
+
const id = String(idArg ?? '').trim();
|
|
110
|
+
if (!id)
|
|
111
|
+
return '请提供 entity id';
|
|
112
|
+
const r = await service.deleteEntity(id);
|
|
113
|
+
return `✓ 已删除 entity ${id}(级联 ${r.deletedEdges} 条边)`;
|
|
114
|
+
});
|
|
115
|
+
cmds.command('relation.cleanup.orphans', '一键清理所有孤立点', { visibility: 'restricted' }).action(async () => {
|
|
116
|
+
const snap = await service.loadAll();
|
|
117
|
+
const { orphanPersons, orphanEvents, orphanEntities } = collectOrphans(snap);
|
|
118
|
+
let deleted = 0;
|
|
119
|
+
for (const p of orphanPersons) {
|
|
120
|
+
await service.deletePerson(p.platform, p.userId);
|
|
121
|
+
deleted++;
|
|
122
|
+
}
|
|
123
|
+
for (const e of orphanEvents) {
|
|
124
|
+
await service.deleteEvent(e.id);
|
|
125
|
+
deleted++;
|
|
126
|
+
}
|
|
127
|
+
for (const e of orphanEntities) {
|
|
128
|
+
await service.deleteEntity(e.id);
|
|
129
|
+
deleted++;
|
|
130
|
+
}
|
|
131
|
+
return `✓ 已清理 ${deleted} 个孤立点(人物 ${orphanPersons.length} / 事件 ${orphanEvents.length} / 实体 ${orphanEntities.length})`;
|
|
132
|
+
});
|
|
133
|
+
// ---- cleanup fake-self ----
|
|
134
|
+
// 专门清理 LLM 误抽出的「伪 person」占位:platform 不在运行时白名单
|
|
135
|
+
// (`getPlatformNames(ctx)`) 中,或者 userId 命中通用占位词 `{self, me, bot, assistant}`。
|
|
136
|
+
// 以往的「aalis:aalis / aalis:self / onebot:aalis」都被该规则覆盖,且同时 persona-agnostic
|
|
137
|
+
// (改 persona 名为 Mia / 任意名字都不需要改代码)。依赖 extractor.isPlaceholderSelfPersonId
|
|
138
|
+
// 保证与写入守卫、consolidate 三处口径一致。
|
|
139
|
+
cmds
|
|
140
|
+
.command('relation.cleanup.fake-self', '清理 LLM 误抽的伪 person(platform 不在运行时白名单或 userId 为 self/me/bot/assistant)', {
|
|
141
|
+
visibility: 'restricted',
|
|
142
|
+
})
|
|
143
|
+
.option('dry-run', '--dry-run', { description: '只列出会被删的节点,不实际删除' })
|
|
144
|
+
.action(async (argv) => {
|
|
145
|
+
const snap = await service.loadAll();
|
|
146
|
+
const knownPlatforms = getKnownPlatformsLower(ctx);
|
|
147
|
+
const fakes = snap.persons.filter(p => isPlaceholderSelfPersonId(p.platform, p.userId, knownPlatforms));
|
|
148
|
+
if (fakes.length === 0)
|
|
149
|
+
return '✓ 未发现伪 person。';
|
|
150
|
+
const dry = argv.options['dry-run'] === true;
|
|
151
|
+
const lines = [
|
|
152
|
+
dry ? `[dry-run] 将删除 ${fakes.length} 个伪 person:` : `已删除 ${fakes.length} 个伪 person:`,
|
|
153
|
+
];
|
|
154
|
+
let edgesTotal = 0;
|
|
155
|
+
for (const p of fakes) {
|
|
156
|
+
if (dry) {
|
|
157
|
+
const incident = snap.edges.filter(ed => (ed.kind === 'person-event' && ed.fromPersonId === p.id) ||
|
|
158
|
+
(ed.kind === 'person-entity' && ed.fromPersonId === p.id) ||
|
|
159
|
+
(ed.kind === 'person-person' && (ed.fromPersonId === p.id || ed.toPersonId === p.id)));
|
|
160
|
+
lines.push(`- ${p.id} ${p.displayName ?? ''} (级联 ${incident.length} 边)`);
|
|
161
|
+
edgesTotal += incident.length;
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
const r = await service.deletePerson(p.platform, p.userId);
|
|
165
|
+
lines.push(`- ${p.id} ${p.displayName ?? ''} (级联删 ${r.deletedEdges} 边)`);
|
|
166
|
+
edgesTotal += r.deletedEdges;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
lines.push(dry ? `[dry-run] 合计会级联删 ${edgesTotal} 边。去掉 --dry-run 实际执行。` : `合计级联删 ${edgesTotal} 边。`);
|
|
170
|
+
return lines.join('\n');
|
|
171
|
+
});
|
|
172
|
+
cmds
|
|
173
|
+
.command('relation.cleanup.all', '⚠ 危险:清空整个关系图(需要 --yes 确认)', {
|
|
174
|
+
visibility: 'restricted',
|
|
175
|
+
})
|
|
176
|
+
.option('yes', '--yes', { description: '确认执行' })
|
|
177
|
+
.action(async (argv) => {
|
|
178
|
+
if (argv.options.yes !== true) {
|
|
179
|
+
return '⚠ 该操作将删除所有人物 / 事件 / 实体 / 边。如确实需要,请追加 --yes。';
|
|
180
|
+
}
|
|
181
|
+
const snap = await service.loadAll();
|
|
182
|
+
let n = 0;
|
|
183
|
+
for (const p of snap.persons) {
|
|
184
|
+
await service.deletePerson(p.platform, p.userId);
|
|
185
|
+
n++;
|
|
186
|
+
}
|
|
187
|
+
for (const e of snap.events) {
|
|
188
|
+
await service.deleteEvent(e.id);
|
|
189
|
+
n++;
|
|
190
|
+
}
|
|
191
|
+
for (const e of snap.entities) {
|
|
192
|
+
await service.deleteEntity(e.id);
|
|
193
|
+
n++;
|
|
194
|
+
}
|
|
195
|
+
return `✓ 已清空关系图(删除 ${n} 个节点)`;
|
|
196
|
+
});
|
|
197
|
+
/**
|
|
198
|
+
* 长任务前的"立即反馈":fire-and-forget 推送一条 ack 给当前会话,
|
|
199
|
+
* 让用户知道命令已被接到、正在跑(consolidate/compress 在大图上可能跑数秒到数十秒)。
|
|
200
|
+
* - 失败静默(CLI 会话没有 platform adapter 会抛错,不影响主流程)
|
|
201
|
+
* - 不 await 完成,纯并发
|
|
202
|
+
*/
|
|
203
|
+
function ackBackground(sessionId, platform, text) {
|
|
204
|
+
// internal 平台(scheduler / workflow 等系统触发)没有真实用户等待,跳过推送
|
|
205
|
+
if (platform === 'internal')
|
|
206
|
+
return;
|
|
207
|
+
void sendPlatformMessage(ctx, sessionId, text).catch(err => {
|
|
208
|
+
ctx.logger?.debug?.(`[user-relation] 立即反馈推送失败(可忽略):${err.message}`);
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* 进程内 per-command mutex:避免用户连按两次 /relation maintain 等长任务命令时
|
|
213
|
+
* 后台叠加两份相同写流程(PageRank / consolidate LLM 都很贵且会改图,并发跑会
|
|
214
|
+
* 互相覆盖统计、白白浪费 token)。第二次调用立即返回 ack 文本,不阻塞 commands
|
|
215
|
+
* 路由。锁的粒度是**命令名**,跨命令仍可并发(与原有行为一致)。
|
|
216
|
+
*/
|
|
217
|
+
const runningCommands = new Map(); // commandName → startedAt epoch ms
|
|
218
|
+
function tryAcquireCommand(name) {
|
|
219
|
+
const startedAt = runningCommands.get(name);
|
|
220
|
+
if (startedAt !== undefined) {
|
|
221
|
+
return { ok: false, elapsedSec: Math.max(1, Math.round((Date.now() - startedAt) / 1000)) };
|
|
222
|
+
}
|
|
223
|
+
runningCommands.set(name, Date.now());
|
|
224
|
+
return { ok: true };
|
|
225
|
+
}
|
|
226
|
+
function releaseCommand(name) {
|
|
227
|
+
runningCommands.delete(name);
|
|
228
|
+
}
|
|
229
|
+
// ---- consolidate(整理:别名候选 / 自动 part-of / 旧账去重) ----
|
|
230
|
+
cmds
|
|
231
|
+
.command('relation.consolidate', '整理关系图:扫描别名候选、自动 part-of、规范化 PersonEventEdge', {
|
|
232
|
+
visibility: 'restricted',
|
|
233
|
+
})
|
|
234
|
+
.option('auto-link', '--auto-link', { description: '将高置信别名候选自动建为 is-alias-of 边' })
|
|
235
|
+
.option('no-llm', '--no-llm', { description: '跳过 consolidationModel 配置的 LLM 增强(A 核验 + B 摘要重写)' })
|
|
236
|
+
.action(async (argv) => {
|
|
237
|
+
const gate = tryAcquireCommand('relation.consolidate');
|
|
238
|
+
if (!gate.ok)
|
|
239
|
+
return `⏳ 上一次 /relation consolidate 还在跑(已累计 ${gate.elapsedSec}s),请稍后再试…`;
|
|
240
|
+
try {
|
|
241
|
+
const autoLink = argv.options['auto-link'] === true;
|
|
242
|
+
const useLlm = argv.options['no-llm'] !== true && !!options?.consolidateLLM;
|
|
243
|
+
ackBackground(argv.session.sessionId, argv.session.platform, `⏳ 正在整理关系图(autoLink=${autoLink ? 'on' : 'off'},LLM=${useLlm ? 'on' : 'off'}),请稍候…`);
|
|
244
|
+
const r = await service.consolidate({
|
|
245
|
+
autoLink,
|
|
246
|
+
triggerSource: 'manual',
|
|
247
|
+
ctx,
|
|
248
|
+
...(options?.consolidateSkipLowScorePairs !== undefined
|
|
249
|
+
? { skipLowScorePairs: options.consolidateSkipLowScorePairs }
|
|
250
|
+
: {}),
|
|
251
|
+
...(options?.consolidateLowScoreThreshold !== undefined
|
|
252
|
+
? { lowScoreThreshold: options.consolidateLowScoreThreshold }
|
|
253
|
+
: {}),
|
|
254
|
+
...(useLlm && options?.consolidateLLM
|
|
255
|
+
? {
|
|
256
|
+
llm: {
|
|
257
|
+
ctx,
|
|
258
|
+
modelRef: options.consolidateLLM.modelRef,
|
|
259
|
+
disableThinking: options.consolidateLLM.disableThinking ?? true,
|
|
260
|
+
},
|
|
261
|
+
}
|
|
262
|
+
: {}),
|
|
263
|
+
});
|
|
264
|
+
const lines = [
|
|
265
|
+
'关系图整理完成:',
|
|
266
|
+
`- 别名候选:${r.aliasCandidates.length} 对(auto-link=${autoLink ? 'on' : 'off'},已建 ${r.aliasEdgesCreated} 条 is-alias-of 边)`,
|
|
267
|
+
`- 自动 part-of:新增 ${r.partOfEdgesCreated} 条 event-entity[part-of] 边`,
|
|
268
|
+
`- EventEntityEdge 去重:${r.eventEdgesNormalized} 组重整`,
|
|
269
|
+
`- 实体层级候选:${r.entityHierarchyCandidates} 对,新增 ${r.entityHierarchyEdgesCreated} 条 entity-entity[part-of] 边`,
|
|
270
|
+
`- 侧向父候选:${r.lateralParentCandidates} 簇,新建父实体 ${r.lateralParentsCreated} 个,新增 ${r.lateralEdgesCreated} 条侧向 part-of 边`,
|
|
271
|
+
];
|
|
272
|
+
if (useLlm) {
|
|
273
|
+
lines.push(`- LLM 核验:通过 ${r.llmVerified ?? 0},否决 ${r.llmRejected ?? 0};摘要重写 ${r.summariesRewritten ?? 0} 条`);
|
|
274
|
+
}
|
|
275
|
+
if (r.aliasCandidates.length > 0) {
|
|
276
|
+
lines.push('', '别名候选(前 10 条):');
|
|
277
|
+
for (const c of r.aliasCandidates.slice(0, 10)) {
|
|
278
|
+
lines.push(` · [${c.aKind}] ${c.aId} ↔ [${c.bKind}] ${c.bId} — ${c.reason}`);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return lines.join('\n');
|
|
282
|
+
}
|
|
283
|
+
finally {
|
|
284
|
+
releaseCommand('relation.consolidate');
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
// ---- rewrite-weights(手动触发 eager 时间衰减回写) ----
|
|
288
|
+
cmds
|
|
289
|
+
.command('relation.rewrite-weights', '关系图:把 event/entity/edge 的 weight 字段物理回写为当前 effectiveWeight(时间衰减落地)', { visibility: 'restricted' })
|
|
290
|
+
.action(async (argv) => {
|
|
291
|
+
const gate = tryAcquireCommand('relation.rewrite-weights');
|
|
292
|
+
if (!gate.ok)
|
|
293
|
+
return `⏳ 上一次 /relation rewrite-weights 还在跑(已累计 ${gate.elapsedSec}s),请稍后再试…`;
|
|
294
|
+
try {
|
|
295
|
+
const ev = options?.eviction;
|
|
296
|
+
const halfLifeDays = ev?.weightDecayHalfLifeDays ?? 180;
|
|
297
|
+
const floor = ev?.weightDecayFloor ?? 0.3;
|
|
298
|
+
if (halfLifeDays <= 0) {
|
|
299
|
+
return `weight 衰减未启用(halfLifeDays=${halfLifeDays}),无需回写。`;
|
|
300
|
+
}
|
|
301
|
+
ackBackground(argv.session.sessionId, argv.session.platform, `⏳ 正在按 halfLifeDays=${halfLifeDays}、floor=${floor} 回写 weight,请稍候…`);
|
|
302
|
+
const r = await service.rewriteWeights({ halfLifeDays, floor });
|
|
303
|
+
if (r.skipped) {
|
|
304
|
+
return 'weight 衰减未启用,已跳过。';
|
|
305
|
+
}
|
|
306
|
+
return [
|
|
307
|
+
'✓ weight 时间衰减回写完成:',
|
|
308
|
+
`- 事件:写回 ${r.events} 条`,
|
|
309
|
+
`- 实体:写回 ${r.entities} 条`,
|
|
310
|
+
`- 边: 写回 ${r.edges} 条`,
|
|
311
|
+
`(参数:halfLifeDays=${halfLifeDays}, floor=${floor})`,
|
|
312
|
+
].join('\n');
|
|
313
|
+
}
|
|
314
|
+
finally {
|
|
315
|
+
releaseCommand('relation.rewrite-weights');
|
|
316
|
+
}
|
|
317
|
+
});
|
|
318
|
+
// ---- event-duplicates(dry-run:列出 event 重复合并候选,不实际合并) ----
|
|
319
|
+
cmds
|
|
320
|
+
.command('relation.event-duplicates', '关系图:扫描事件节点重复合并候选(dry-run,不修改图)。三段式:embedding/jaccard + 结构相似 + LLM 终判', { visibility: 'restricted' })
|
|
321
|
+
.action(async (argv) => {
|
|
322
|
+
const gate = tryAcquireCommand('relation.event-duplicates');
|
|
323
|
+
if (!gate.ok)
|
|
324
|
+
return `⏳ 上一次 /relation event-duplicates 还在跑(已累计 ${gate.elapsedSec}s),请稍后再试…`;
|
|
325
|
+
try {
|
|
326
|
+
ackBackground(argv.session.sessionId, argv.session.platform, '⏳ 正在扫描 event 重复候选(同 sessionScope / 都 global),请稍候…');
|
|
327
|
+
const useLlm = !!options?.consolidateLLM;
|
|
328
|
+
const r = await service.findEventDuplicates({
|
|
329
|
+
...(useLlm && options?.consolidateLLM
|
|
330
|
+
? {
|
|
331
|
+
llm: {
|
|
332
|
+
ctx,
|
|
333
|
+
modelRef: options.consolidateLLM.modelRef,
|
|
334
|
+
disableThinking: options.consolidateLLM.disableThinking ?? true,
|
|
335
|
+
},
|
|
336
|
+
}
|
|
337
|
+
: {}),
|
|
338
|
+
});
|
|
339
|
+
const lines = [];
|
|
340
|
+
lines.push(`✓ event 重复扫描完成(embedding ${r.embeddingAvailable ? '可用' : '不可用,降级 jaccard'})`);
|
|
341
|
+
lines.push(`候选 ${r.candidates.length} 对,LLM 通过 ${r.llmVerified},LLM 否决 ${r.llmRejected},缓存命中 ${r.llmRejectCacheHits}`);
|
|
342
|
+
if (r.candidates.length > 0) {
|
|
343
|
+
lines.push('--- 候选明细(前 20 条)---');
|
|
344
|
+
for (const c of r.candidates.slice(0, 20)) {
|
|
345
|
+
const sims = c.fusedScore !== null
|
|
346
|
+
? `fused=${c.fusedScore.toFixed(2)} (cos=${c.cosineScore?.toFixed(2)}, struct=${c.structuralScore.toFixed(2)})`
|
|
347
|
+
: `jac=${c.jaccardScore.toFixed(2)}, struct=${c.structuralScore.toFixed(2)}`;
|
|
348
|
+
const verdict = c.llmVerdict
|
|
349
|
+
? `[${c.cacheHit ? '缓存' : c.llmVerdict.isSame ? '✓' : '✗'}] ${c.llmVerdict.reason}`
|
|
350
|
+
: '[未判]';
|
|
351
|
+
lines.push(` · [${c.sessionScope}] ${c.aTitle.slice(0, 18)} ↔ ${c.bTitle.slice(0, 18)} ${sims} ${verdict}`);
|
|
352
|
+
}
|
|
353
|
+
if (r.candidates.length > 20) {
|
|
354
|
+
lines.push(` …省略 ${r.candidates.length - 20} 条`);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
return lines.join('\n');
|
|
358
|
+
}
|
|
359
|
+
finally {
|
|
360
|
+
releaseCommand('relation.event-duplicates');
|
|
361
|
+
}
|
|
362
|
+
});
|
|
363
|
+
// ---- compress(仅跳出一次容量淘汰 + 伤亡报告) ----
|
|
364
|
+
cmds
|
|
365
|
+
.command('relation.compress', '关系图压缩:手动触发容量淘汰(PageRank 低分 → 删 events/entities/edges)', {
|
|
366
|
+
visibility: 'restricted',
|
|
367
|
+
})
|
|
368
|
+
.action(async (argv) => {
|
|
369
|
+
const gate = tryAcquireCommand('relation.compress');
|
|
370
|
+
if (!gate.ok)
|
|
371
|
+
return `⏳ 上一次 /relation compress 还在跑(已累计 ${gate.elapsedSec}s),请稍后再试…`;
|
|
372
|
+
try {
|
|
373
|
+
const ev = options?.eviction;
|
|
374
|
+
ackBackground(argv.session.sessionId, argv.session.platform, '⏳ 正在压缩关系图(孤儿清理 + PageRank 计算 + 容量淘汰),请稍候…');
|
|
375
|
+
const before = await service.loadAll();
|
|
376
|
+
let deletedPersons = 0;
|
|
377
|
+
let deletedEvents = 0;
|
|
378
|
+
let deletedEntities = 0;
|
|
379
|
+
let deletedEdges = 0;
|
|
380
|
+
if (ev && (ev.maxPersons > 0 || ev.maxEvents > 0 || ev.maxEntities > 0 || ev.maxEdges > 0)) {
|
|
381
|
+
// evictByQuota 内部已经先做 pruneOrphans,再做配额淘汰;不要在外面重复调
|
|
382
|
+
const r = await service.evictByQuota({
|
|
383
|
+
maxPersons: ev.maxPersons,
|
|
384
|
+
maxEvents: ev.maxEvents,
|
|
385
|
+
maxEntities: ev.maxEntities,
|
|
386
|
+
maxEdges: ev.maxEdges,
|
|
387
|
+
pagerankDamping: ev.pagerankDamping,
|
|
388
|
+
pagerankIterations: ev.pagerankIterations,
|
|
389
|
+
pagerankEpsilon: ev.pagerankEpsilon,
|
|
390
|
+
hysteresisPct: ev.hysteresisPct,
|
|
391
|
+
targetPct: ev.targetPct,
|
|
392
|
+
decay: {
|
|
393
|
+
halfLifeDays: ev.weightDecayHalfLifeDays ?? 180,
|
|
394
|
+
floor: ev.weightDecayFloor ?? 0.3,
|
|
395
|
+
},
|
|
396
|
+
communityAlgorithm: ev.communityAlgorithm,
|
|
397
|
+
});
|
|
398
|
+
deletedPersons = r.deletedPersons;
|
|
399
|
+
deletedEvents = r.deletedEvents;
|
|
400
|
+
deletedEntities = r.deletedEntities;
|
|
401
|
+
deletedEdges = r.deletedEdges;
|
|
402
|
+
}
|
|
403
|
+
else {
|
|
404
|
+
// 没配置配额:只清孤儿
|
|
405
|
+
const orphans = await service.pruneOrphans();
|
|
406
|
+
deletedPersons = orphans.deletedPersons;
|
|
407
|
+
deletedEvents = orphans.deletedEvents;
|
|
408
|
+
deletedEntities = orphans.deletedEntities;
|
|
409
|
+
}
|
|
410
|
+
const eventCap = ev?.maxEvents ?? 0;
|
|
411
|
+
const entityCap = ev?.maxEntities ?? 0;
|
|
412
|
+
const edgeCap = ev?.maxEdges ?? 0;
|
|
413
|
+
return [
|
|
414
|
+
'✓ 关系图压缩完成:',
|
|
415
|
+
`- 人物:${before.persons.length} → ${before.persons.length - deletedPersons}(删 ${deletedPersons} 个孤儿)`,
|
|
416
|
+
`- 事件:${before.events.length} → ${before.events.length - deletedEvents}(删 ${deletedEvents},阈 ${eventCap})`,
|
|
417
|
+
`- 实体:${before.entities.length} → ${before.entities.length - deletedEntities}(删 ${deletedEntities},阈 ${entityCap})`,
|
|
418
|
+
`- 边: ${before.edges.length} → ${before.edges.length - deletedEdges}(删 ${deletedEdges},阈 ${edgeCap})`,
|
|
419
|
+
].join('\n');
|
|
420
|
+
}
|
|
421
|
+
finally {
|
|
422
|
+
releaseCommand('relation.compress');
|
|
423
|
+
}
|
|
424
|
+
});
|
|
425
|
+
// ---- maintain(整理 + 压缩 一步完成) ----
|
|
426
|
+
cmds
|
|
427
|
+
.command('relation.maintain', '关系图体检:先整理(别名 / part-of / 层级 / 侧向父),再压缩(容量淘汰),全过程报告', { visibility: 'restricted' })
|
|
428
|
+
.option('no-llm', '--no-llm', { description: '跳过 consolidate 阶段的 LLM 增强' })
|
|
429
|
+
.option('no-auto-link', '--no-auto-link', { description: '取消 consolidate 阶段的 autoLink' })
|
|
430
|
+
.action(async (argv) => {
|
|
431
|
+
const gate = tryAcquireCommand('relation.maintain');
|
|
432
|
+
if (!gate.ok)
|
|
433
|
+
return `⏳ 上一次 /relation maintain 还在跑(已累计 ${gate.elapsedSec}s),请稍后再试…`;
|
|
434
|
+
try {
|
|
435
|
+
const ev = options?.eviction;
|
|
436
|
+
const useLlm = argv.options['no-llm'] !== true && !!options?.consolidateLLM;
|
|
437
|
+
const autoLink = argv.options['no-auto-link'] !== true && (options?.consolidateAutoLink ?? true);
|
|
438
|
+
ackBackground(argv.session.sessionId, argv.session.platform, `⏳ 正在体检关系图:先整理再压缩(autoLink=${autoLink ? 'on' : 'off'},LLM=${useLlm ? 'on' : 'off'}),请稍候…`);
|
|
439
|
+
// 顺序:先 consolidate(在原图上合并别名/层级/事件去重)→ 再 evict(在去重后的图上
|
|
440
|
+
// 跑 PageRank 淘汰),这样 PageRank 看到的入出度更完整、淘汰决策更稳,且每个阶段的
|
|
441
|
+
// 节点/边减量都可以独立精确计数(s0 → s1 为整理,s1 → s2 为压缩),不会再像之前
|
|
442
|
+
// "实体 87→87 但下一轮变 85→85" 那样把 consolidate 删的 alias 节点漏算到压缩行。
|
|
443
|
+
const s0 = await service.loadAll();
|
|
444
|
+
// step 1: consolidate
|
|
445
|
+
const cr = await service.consolidate({
|
|
446
|
+
autoLink,
|
|
447
|
+
triggerSource: 'manual',
|
|
448
|
+
ctx,
|
|
449
|
+
...(options?.consolidateSkipLowScorePairs !== undefined
|
|
450
|
+
? { skipLowScorePairs: options.consolidateSkipLowScorePairs }
|
|
451
|
+
: {}),
|
|
452
|
+
...(options?.consolidateLowScoreThreshold !== undefined
|
|
453
|
+
? { lowScoreThreshold: options.consolidateLowScoreThreshold }
|
|
454
|
+
: {}),
|
|
455
|
+
...(useLlm && options?.consolidateLLM
|
|
456
|
+
? {
|
|
457
|
+
llm: {
|
|
458
|
+
ctx,
|
|
459
|
+
modelRef: options.consolidateLLM.modelRef,
|
|
460
|
+
disableThinking: options.consolidateLLM.disableThinking ?? true,
|
|
461
|
+
},
|
|
462
|
+
}
|
|
463
|
+
: {}),
|
|
464
|
+
});
|
|
465
|
+
const s1 = await service.loadAll();
|
|
466
|
+
// step 2: compress
|
|
467
|
+
let evictionMode = 'orphans-only';
|
|
468
|
+
if (ev && (ev.maxPersons > 0 || ev.maxEvents > 0 || ev.maxEntities > 0 || ev.maxEdges > 0)) {
|
|
469
|
+
evictionMode = 'quota';
|
|
470
|
+
await service.evictByQuota({
|
|
471
|
+
maxPersons: ev.maxPersons,
|
|
472
|
+
maxEvents: ev.maxEvents,
|
|
473
|
+
maxEntities: ev.maxEntities,
|
|
474
|
+
maxEdges: ev.maxEdges,
|
|
475
|
+
pagerankDamping: ev.pagerankDamping,
|
|
476
|
+
pagerankIterations: ev.pagerankIterations,
|
|
477
|
+
pagerankEpsilon: ev.pagerankEpsilon,
|
|
478
|
+
hysteresisPct: ev.hysteresisPct,
|
|
479
|
+
targetPct: ev.targetPct,
|
|
480
|
+
decay: {
|
|
481
|
+
halfLifeDays: ev.weightDecayHalfLifeDays ?? 180,
|
|
482
|
+
floor: ev.weightDecayFloor ?? 0.3,
|
|
483
|
+
},
|
|
484
|
+
communityAlgorithm: ev.communityAlgorithm,
|
|
485
|
+
});
|
|
486
|
+
}
|
|
487
|
+
else {
|
|
488
|
+
await service.pruneOrphans();
|
|
489
|
+
}
|
|
490
|
+
const s2 = await service.loadAll();
|
|
491
|
+
// 报告:先整理后压缩,每行只反映本阶段的真实减量
|
|
492
|
+
const consolidateLine = `[1/2] 整理:人物 ${s0.persons.length}→${s1.persons.length},事件 ${s0.events.length}→${s1.events.length},` +
|
|
493
|
+
`实体 ${s0.entities.length}→${s1.entities.length},边 ${s0.edges.length}→${s1.edges.length};` +
|
|
494
|
+
`别名 ${cr.aliasCandidates.length} 候选/${cr.aliasEdgesCreated} 边,` +
|
|
495
|
+
`part-of 新增 ${cr.partOfEdgesCreated},事件边重整 ${cr.eventEdgesNormalized},` +
|
|
496
|
+
`层级 ${cr.entityHierarchyCandidates} 候选/${cr.entityHierarchyEdgesCreated} 边,` +
|
|
497
|
+
`侧向父 ${cr.lateralParentCandidates} 簇/新建 ${cr.lateralParentsCreated}/边 ${cr.lateralEdgesCreated}` +
|
|
498
|
+
(useLlm
|
|
499
|
+
? `,LLM 通过 ${cr.llmVerified ?? 0} 否决 ${cr.llmRejected ?? 0} 摘要重写 ${cr.summariesRewritten ?? 0}`
|
|
500
|
+
: '');
|
|
501
|
+
const compressLine = evictionMode === 'quota'
|
|
502
|
+
? `[2/2] 压缩:人物 ${s1.persons.length}→${s2.persons.length},事件 ${s1.events.length}→${s2.events.length},实体 ${s1.entities.length}→${s2.entities.length},边 ${s1.edges.length}→${s2.edges.length}`
|
|
503
|
+
: `[2/2] 压缩:仅清孤儿(未配置淘汰阈值)—人物 ${s1.persons.length}→${s2.persons.length},事件 ${s1.events.length}→${s2.events.length},实体 ${s1.entities.length}→${s2.entities.length},边 ${s1.edges.length}→${s2.edges.length}`;
|
|
504
|
+
return ['✓ 关系图体检完成:', consolidateLine, compressLine].join('\n');
|
|
505
|
+
}
|
|
506
|
+
finally {
|
|
507
|
+
releaseCommand('relation.maintain');
|
|
508
|
+
}
|
|
509
|
+
});
|
|
510
|
+
// ---- consolidation-status(查询最近一次 consolidate 运行情况) ----
|
|
511
|
+
cmds
|
|
512
|
+
.command('relation.consolidation-status', '查看最近一次关系图整理(consolidate)的运行时间、触发源与结果')
|
|
513
|
+
.action(async () => {
|
|
514
|
+
const info = service.getLastConsolidateInfo();
|
|
515
|
+
if (!info.lastRunAt) {
|
|
516
|
+
return ('⚠ 本次运行以来尚未执行过 consolidation。\n' +
|
|
517
|
+
'触发方式:/relation consolidate(手动)、/relation maintain(压缩后连着整理),或容量淘汰后自动触发。');
|
|
518
|
+
}
|
|
519
|
+
const time = new Date(info.lastRunAt).toLocaleString('zh-CN', { hour12: false });
|
|
520
|
+
const triggerLabel = info.trigger === 'manual' ? '手动' : info.trigger === 'eviction' ? '淘汰后自动' : 'API 调用';
|
|
521
|
+
return `✓ 最近一次 consolidation:${time}(触发方式:${triggerLabel})\n${info.summary ?? '(无详情)'}`;
|
|
522
|
+
});
|
|
523
|
+
}
|
|
524
|
+
// ───── helpers ─────
|
|
525
|
+
function collectOrphans(snap) {
|
|
526
|
+
const refPerson = new Set();
|
|
527
|
+
const refEvent = new Set();
|
|
528
|
+
const refEntity = new Set();
|
|
529
|
+
for (const e of snap.edges) {
|
|
530
|
+
if (e.kind === 'person-event') {
|
|
531
|
+
refPerson.add(e.fromPersonId);
|
|
532
|
+
refEvent.add(e.toEventId);
|
|
533
|
+
}
|
|
534
|
+
else if (e.kind === 'person-person') {
|
|
535
|
+
refPerson.add(e.fromPersonId);
|
|
536
|
+
refPerson.add(e.toPersonId);
|
|
537
|
+
}
|
|
538
|
+
else if (e.kind === 'person-entity') {
|
|
539
|
+
refPerson.add(e.fromPersonId);
|
|
540
|
+
refEntity.add(e.toEntityId);
|
|
541
|
+
}
|
|
542
|
+
else if (e.kind === 'event-event') {
|
|
543
|
+
refEvent.add(e.fromEventId);
|
|
544
|
+
refEvent.add(e.toEventId);
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
return {
|
|
548
|
+
orphanPersons: snap.persons.filter(p => !refPerson.has(p.id)),
|
|
549
|
+
orphanEvents: snap.events.filter(e => !refEvent.has(e.id)),
|
|
550
|
+
orphanEntities: snap.entities.filter(e => !refEntity.has(e.id)),
|
|
551
|
+
};
|
|
552
|
+
}
|
|
553
|
+
function formatPerson(p, events, entities, edges) {
|
|
554
|
+
const lines = [`# Person ${p.id}`, `displayName: ${p.displayName ?? '—'}`];
|
|
555
|
+
lines.push(`events (${events.length}):`);
|
|
556
|
+
for (const e of events.slice(0, 20))
|
|
557
|
+
lines.push(` - ${e.id} ${e.title}`);
|
|
558
|
+
lines.push(`entities (${entities.length}):`);
|
|
559
|
+
for (const e of entities.slice(0, 20))
|
|
560
|
+
lines.push(` - ${e.id} [${e.entityKind}] ${e.name}`);
|
|
561
|
+
lines.push(`edges (${edges.length}):`);
|
|
562
|
+
for (const e of edges.slice(0, 20))
|
|
563
|
+
lines.push(` - ${formatEdgeLine(e)}`);
|
|
564
|
+
return lines.join('\n');
|
|
565
|
+
}
|
|
566
|
+
function formatEvent(e, edges) {
|
|
567
|
+
const lines = [`# Event ${e.id}`, `title: ${e.title}`];
|
|
568
|
+
if (e.category)
|
|
569
|
+
lines.push(`category: ${e.category}`);
|
|
570
|
+
if (e.summary)
|
|
571
|
+
lines.push(`summary: ${e.summary}`);
|
|
572
|
+
lines.push(`edges (${edges.length}):`);
|
|
573
|
+
for (const ed of edges.slice(0, 30))
|
|
574
|
+
lines.push(` - ${formatEdgeLine(ed)}`);
|
|
575
|
+
return lines.join('\n');
|
|
576
|
+
}
|
|
577
|
+
function formatEntity(ent, edges) {
|
|
578
|
+
const lines = [`# Entity ${ent.id}`, `name: ${ent.name}`, `kind: ${ent.entityKind}`];
|
|
579
|
+
if (ent.aliases?.length)
|
|
580
|
+
lines.push(`aliases: ${ent.aliases.join(', ')}`);
|
|
581
|
+
if (ent.summary)
|
|
582
|
+
lines.push(`summary: ${ent.summary}`);
|
|
583
|
+
lines.push(`edges (${edges.length}):`);
|
|
584
|
+
for (const ed of edges.slice(0, 30))
|
|
585
|
+
lines.push(` - ${formatEdgeLine(ed)}`);
|
|
586
|
+
return lines.join('\n');
|
|
587
|
+
}
|
|
588
|
+
function formatEdgeLine(e) {
|
|
589
|
+
if (e.kind === 'person-event')
|
|
590
|
+
return `[${e.kind}] ${e.fromPersonId} → ${e.toEventId} (${e.role})`;
|
|
591
|
+
if (e.kind === 'person-person')
|
|
592
|
+
return `[${e.kind}] ${e.fromPersonId} → ${e.toPersonId} (${e.relationType})`;
|
|
593
|
+
if (e.kind === 'person-entity')
|
|
594
|
+
return `[${e.kind}] ${e.fromPersonId} → ${e.toEntityId} (${e.role})`;
|
|
595
|
+
if (e.kind === 'event-event')
|
|
596
|
+
return `[event-event] ${e.fromEventId} → ${e.toEventId} (${e.relationType})`;
|
|
597
|
+
if (e.kind === 'event-entity')
|
|
598
|
+
return `[event-entity] ${e.fromEventId} → ${e.toEntityId} (${e.relationType})`;
|
|
599
|
+
return `[entity-entity] ${e.fromEntityId} → ${e.toEntityId} (${e.relationType})`;
|
|
600
|
+
}
|
|
601
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAInF,MAAM,UAAU,wBAAwB,CACtC,GAAY,EACZ,OAAwB,EACxB,OA0BC;IAED,MAAM,IAAI,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAEpC,iBAAiB;IACjB,IAAI;SACD,OAAO,CAAC,uCAAuC,EAAE,gBAAgB,CAAC;SAClE,OAAO,CAAC,qCAAqC,CAAC;SAC9C,OAAO,CAAC,gCAAgC,CAAC;SACzC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACtC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACjD,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,CAAC,EAAE;YAAE,OAAO,8CAA8C,CAAC;QAC/D,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACrC,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,OAAO,8BAA8B,CAAC;YAC7D,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YAC9C,IAAI,CAAC,CAAC;gBAAE,OAAO,eAAe,EAAE,EAAE,CAAC;YACnC,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;YAC7C,OAAO,YAAY,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7C,IAAI,CAAC,CAAC;gBAAE,OAAO,cAAc,EAAE,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAC7B,EAAE,CAAC,EAAE,CACH,CAAC,EAAE,CAAC,IAAI,KAAK,cAAc,IAAI,EAAE,CAAC,SAAS,KAAK,EAAE,CAAC;gBACnD,CAAC,EAAE,CAAC,IAAI,KAAK,aAAa,IAAI,CAAC,EAAE,CAAC,WAAW,KAAK,EAAE,IAAI,EAAE,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC,CAChF,CAAC;YACF,OAAO,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC/B,CAAC;QACD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YACjD,IAAI,CAAC,GAAG;gBAAE,OAAO,eAAe,EAAE,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,eAAe,IAAI,EAAE,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC;YAC3F,OAAO,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,YAAY,IAAI,8BAA8B,CAAC;IACxD,CAAC,CAAC,CAAC;IAEL,2BAA2B;IAC3B,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,oBAAoB,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;QACvE,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QAC7E,IAAI,aAAa,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,GAAG,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7E,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,KAAK,GAAa,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,UAAU,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;YAC9C,KAAK,MAAM,CAAC,IAAI,aAAa;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC,CAAC;QACjF,CAAC;QACD,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,UAAU,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;YAC7C,KAAK,MAAM,CAAC,IAAI,YAAY;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,UAAU,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;YAC/C,KAAK,MAAM,CAAC,IAAI,cAAc;gBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACvF,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,wCAAwC;IACxC,IAAI;SACD,OAAO,CAAC,mCAAmC,EAAE,aAAa,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;SACzF,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QAC7B,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,8BAA8B,CAAC;QAC7D,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,QAAS,EAAE,MAAO,CAAC,CAAC;QACzD,OAAO,gBAAgB,EAAE,OAAO,CAAC,CAAC,YAAY,MAAM,CAAC;IACvD,CAAC,CAAC,CAAC;IAEL,kCAAkC;IAClC,oCAAoC;IACpC,iDAAiD;IACjD,qCAAqC;IACrC,IAAI;SACD,OAAO,CAAC,oBAAoB,EAAE,kCAAkC,CAAC;SACjE,MAAM,CAAC,KAAK,EAAC,IAAI,EAAC,EAAE;QACnB,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QAC1C,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM;YAAE,OAAO,oCAAoC,CAAC;QACtE,MAAM,EAAE,GAAG,GAAG,QAAQ,IAAI,MAAM,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM;YAAE,OAAO,gBAAgB,EAAE,SAAS,CAAC;QAChD,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACvD,OAAO,aAAa,EAAE,OAAO,CAAC,CAAC,YAAY,+BAA+B,CAAC;IAC7E,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,kCAAkC,EAAE,aAAa,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;SACxF,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QAC7B,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,CAAC,EAAE;YAAE,OAAO,cAAc,CAAC;QAC/B,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACxC,OAAO,eAAe,EAAE,OAAO,CAAC,CAAC,YAAY,MAAM,CAAC;IACtD,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,mCAAmC,EAAE,aAAa,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;SACzF,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QAC7B,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,CAAC,EAAE;YAAE,OAAO,eAAe,CAAC;QAChC,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACzC,OAAO,gBAAgB,EAAE,OAAO,CAAC,CAAC,YAAY,MAAM,CAAC;IACvD,CAAC,CAAC,CAAC;IAEL,IAAI,CAAC,OAAO,CAAC,0BAA0B,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;QACpG,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QAC7E,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;YAC9B,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;YACjD,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;YAC7B,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAChC,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC;YAC/B,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACjC,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,SAAS,OAAO,YAAY,aAAa,CAAC,MAAM,SAAS,YAAY,CAAC,MAAM,SAAS,cAAc,CAAC,MAAM,GAAG,CAAC;IACvH,CAAC,CAAC,CAAC;IAEH,8BAA8B;IAC9B,8CAA8C;IAC9C,8EAA8E;IAC9E,2EAA2E;IAC3E,0EAA0E;IAC1E,8BAA8B;IAC9B,IAAI;SACD,OAAO,CACN,4BAA4B,EAC5B,uEAAuE,EACvE;QACE,UAAU,EAAE,YAAY;KACzB,CACF;SACA,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE,WAAW,EAAE,iBAAiB,EAAE,CAAC;SAClE,MAAM,CAAC,KAAK,EAAC,IAAI,EAAC,EAAE;QACnB,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,cAAc,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,yBAAyB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;QACxG,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,gBAAgB,CAAC;QAChD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC;QAC7C,MAAM,KAAK,GAAa;YACtB,GAAG,CAAC,CAAC,CAAC,iBAAiB,KAAK,CAAC,MAAM,aAAa,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,MAAM,aAAa;SACpF,CAAC;QACF,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,IAAI,GAAG,EAAE,CAAC;gBACR,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAChC,EAAE,CAAC,EAAE,CACH,CAAC,EAAE,CAAC,IAAI,KAAK,cAAc,IAAI,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;oBACxD,CAAC,EAAE,CAAC,IAAI,KAAK,eAAe,IAAI,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;oBACzD,CAAC,EAAE,CAAC,IAAI,KAAK,eAAe,IAAI,CAAC,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CACxF,CAAC;gBACF,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,WAAW,IAAI,EAAE,SAAS,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;gBAC3E,UAAU,IAAI,QAAQ,CAAC,MAAM,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;gBAC3D,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,WAAW,IAAI,EAAE,UAAU,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC;gBAC3E,UAAU,IAAI,CAAC,CAAC,YAAY,CAAC;YAC/B,CAAC;QACH,CAAC;QACD,KAAK,CAAC,IAAI,CACR,GAAG,CAAC,CAAC,CAAC,oBAAoB,UAAU,uBAAuB,CAAC,CAAC,CAAC,SAAS,UAAU,KAAK,CACvF,CAAC;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,sBAAsB,EAAE,2BAA2B,EAAE;QAC5D,UAAU,EAAE,YAAY;KACzB,CAAC;SACD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;SAC/C,MAAM,CAAC,KAAK,EAAC,IAAI,EAAC,EAAE;QACnB,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;YAC9B,OAAO,6CAA6C,CAAC;QACvD,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACrC,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7B,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;YACjD,CAAC,EAAE,CAAC;QACN,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5B,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAChC,CAAC,EAAE,CAAC;QACN,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACjC,CAAC,EAAE,CAAC;QACN,CAAC;QACD,OAAO,eAAe,CAAC,OAAO,CAAC;IACjC,CAAC,CAAC,CAAC;IAEL;;;;;OAKG;IACH,SAAS,aAAa,CAAC,SAAiB,EAAE,QAAgB,EAAE,IAAY;QACtE,uDAAuD;QACvD,IAAI,QAAQ,KAAK,UAAU;YAAE,OAAO;QACpC,KAAK,mBAAmB,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;YACzD,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,iCAAkC,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,mCAAmC;IACtF,SAAS,iBAAiB,CAAC,IAAY;QACrC,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC;QAC7F,CAAC;QACD,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACtC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IACD,SAAS,cAAc,CAAC,IAAY;QAClC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,qDAAqD;IACrD,IAAI;SACD,OAAO,CAAC,sBAAsB,EAAE,6CAA6C,EAAE;QAC9E,UAAU,EAAE,YAAY;KACzB,CAAC;SACD,MAAM,CAAC,WAAW,EAAE,aAAa,EAAE,EAAE,WAAW,EAAE,4BAA4B,EAAE,CAAC;SACjF,MAAM,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,iDAAiD,EAAE,CAAC;SAChG,MAAM,CAAC,KAAK,EAAC,IAAI,EAAC,EAAE;QACnB,MAAM,IAAI,GAAG,iBAAiB,CAAC,sBAAsB,CAAC,CAAC;QACvD,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,uCAAuC,IAAI,CAAC,UAAU,WAAW,CAAC;QACvF,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;YACpD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,OAAO,EAAE,cAAc,CAAC;YAC5E,aAAa,CACX,IAAI,CAAC,OAAO,CAAC,SAAS,EACtB,IAAI,CAAC,OAAO,CAAC,QAAQ,EACrB,sBAAsB,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,CACnF,CAAC;YACF,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC;gBAClC,QAAQ;gBACR,aAAa,EAAE,QAAQ;gBACvB,GAAG;gBACH,GAAG,CAAC,OAAO,EAAE,4BAA4B,KAAK,SAAS;oBACrD,CAAC,CAAC,EAAE,iBAAiB,EAAE,OAAO,CAAC,4BAA4B,EAAE;oBAC7D,CAAC,CAAC,EAAE,CAAC;gBACP,GAAG,CAAC,OAAO,EAAE,4BAA4B,KAAK,SAAS;oBACrD,CAAC,CAAC,EAAE,iBAAiB,EAAE,OAAO,CAAC,4BAA4B,EAAE;oBAC7D,CAAC,CAAC,EAAE,CAAC;gBACP,GAAG,CAAC,MAAM,IAAI,OAAO,EAAE,cAAc;oBACnC,CAAC,CAAC;wBACE,GAAG,EAAE;4BACH,GAAG;4BACH,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,QAAQ;4BACzC,eAAe,EAAE,OAAO,CAAC,cAAc,CAAC,eAAe,IAAI,IAAI;yBAChE;qBACF;oBACH,CAAC,CAAC,EAAE,CAAC;aACR,CAAC,CAAC;YACH,MAAM,KAAK,GAAG;gBACZ,UAAU;gBACV,UAAU,CAAC,CAAC,eAAe,CAAC,MAAM,gBAAgB,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,iBAAiB,mBAAmB;gBACtH,mBAAmB,CAAC,CAAC,kBAAkB,4BAA4B;gBACnE,wBAAwB,CAAC,CAAC,oBAAoB,MAAM;gBACpD,YAAY,CAAC,CAAC,yBAAyB,SAAS,CAAC,CAAC,2BAA2B,6BAA6B;gBAC1G,WAAW,CAAC,CAAC,uBAAuB,YAAY,CAAC,CAAC,qBAAqB,SAAS,CAAC,CAAC,mBAAmB,gBAAgB;aACtH,CAAC;YACF,IAAI,MAAM,EAAE,CAAC;gBACX,KAAK,CAAC,IAAI,CACR,eAAe,CAAC,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,IAAI,CAAC,SAAS,CAAC,CAAC,kBAAkB,IAAI,CAAC,IAAI,CACjG,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACjC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,eAAe,CAAC,CAAC;gBAChC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;oBAC/C,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;gBACpF,CAAC;YACH,CAAC;YACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;gBAAS,CAAC;YACT,cAAc,CAAC,sBAAsB,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,+CAA+C;IAC/C,IAAI;SACD,OAAO,CACN,0BAA0B,EAC1B,oEAAoE,EACpE,EAAE,UAAU,EAAE,YAAY,EAAE,CAC7B;SACA,MAAM,CAAC,KAAK,EAAC,IAAI,EAAC,EAAE;QACnB,MAAM,IAAI,GAAG,iBAAiB,CAAC,0BAA0B,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,2CAA2C,IAAI,CAAC,UAAU,WAAW,CAAC;QAC3F,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,OAAO,EAAE,QAAQ,CAAC;YAC7B,MAAM,YAAY,GAAG,EAAE,EAAE,uBAAuB,IAAI,GAAG,CAAC;YACxD,MAAM,KAAK,GAAG,EAAE,EAAE,gBAAgB,IAAI,GAAG,CAAC;YAC1C,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;gBACtB,OAAO,6BAA6B,YAAY,SAAS,CAAC;YAC5D,CAAC;YACD,aAAa,CACX,IAAI,CAAC,OAAO,CAAC,SAAS,EACtB,IAAI,CAAC,OAAO,CAAC,QAAQ,EACrB,sBAAsB,YAAY,UAAU,KAAK,iBAAiB,CACnE,CAAC;YACF,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;YAChE,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;gBACd,OAAO,mBAAmB,CAAC;YAC7B,CAAC;YACD,OAAO;gBACL,oBAAoB;gBACpB,WAAW,CAAC,CAAC,MAAM,IAAI;gBACvB,WAAW,CAAC,CAAC,QAAQ,IAAI;gBACzB,YAAY,CAAC,CAAC,KAAK,IAAI;gBACvB,oBAAoB,YAAY,WAAW,KAAK,GAAG;aACpD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC;gBAAS,CAAC;YACT,cAAc,CAAC,0BAA0B,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,4DAA4D;IAC5D,IAAI;SACD,OAAO,CACN,2BAA2B,EAC3B,sEAAsE,EACtE,EAAE,UAAU,EAAE,YAAY,EAAE,CAC7B;SACA,MAAM,CAAC,KAAK,EAAC,IAAI,EAAC,EAAE;QACnB,MAAM,IAAI,GAAG,iBAAiB,CAAC,2BAA2B,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,4CAA4C,IAAI,CAAC,UAAU,WAAW,CAAC;QAC5F,IAAI,CAAC;YACH,aAAa,CACX,IAAI,CAAC,OAAO,CAAC,SAAS,EACtB,IAAI,CAAC,OAAO,CAAC,QAAQ,EACrB,mDAAmD,CACpD,CAAC;YACF,MAAM,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,cAAc,CAAC;YACzC,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,mBAAmB,CAAC;gBAC1C,GAAG,CAAC,MAAM,IAAI,OAAO,EAAE,cAAc;oBACnC,CAAC,CAAC;wBACE,GAAG,EAAE;4BACH,GAAG;4BACH,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,QAAQ;4BACzC,eAAe,EAAE,OAAO,CAAC,cAAc,CAAC,eAAe,IAAI,IAAI;yBAChE;qBACF;oBACH,CAAC,CAAC,EAAE,CAAC;aACR,CAAC,CAAC;YACH,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,GAAG,CAAC,CAAC;YAC1F,KAAK,CAAC,IAAI,CACR,MAAM,CAAC,CAAC,UAAU,CAAC,MAAM,aAAa,CAAC,CAAC,WAAW,WAAW,CAAC,CAAC,WAAW,SAAS,CAAC,CAAC,kBAAkB,EAAE,CAC3G,CAAC;YACF,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;gBAClC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;oBAC1C,MAAM,IAAI,GACR,CAAC,CAAC,UAAU,KAAK,IAAI;wBACnB,CAAC,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;wBAC/G,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjF,MAAM,OAAO,GAAG,CAAC,CAAC,UAAU;wBAC1B,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE;wBACnF,CAAC,CAAC,MAAM,CAAC;oBACX,KAAK,CAAC,IAAI,CACR,QAAQ,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,KAAK,OAAO,EAAE,CACnG,CAAC;gBACJ,CAAC;gBACD,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;oBAC7B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,EAAE,IAAI,CAAC,CAAC;gBACpD,CAAC;YACH,CAAC;YACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;gBAAS,CAAC;YACT,cAAc,CAAC,2BAA2B,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,uCAAuC;IACvC,IAAI;SACD,OAAO,CAAC,mBAAmB,EAAE,uDAAuD,EAAE;QACrF,UAAU,EAAE,YAAY;KACzB,CAAC;SACD,MAAM,CAAC,KAAK,EAAC,IAAI,EAAC,EAAE;QACnB,MAAM,IAAI,GAAG,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,oCAAoC,IAAI,CAAC,UAAU,WAAW,CAAC;QACpF,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,OAAO,EAAE,QAAQ,CAAC;YAC7B,aAAa,CACX,IAAI,CAAC,OAAO,CAAC,SAAS,EACtB,IAAI,CAAC,OAAO,CAAC,QAAQ,EACrB,2CAA2C,CAC5C,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YACvC,IAAI,cAAc,GAAG,CAAC,CAAC;YACvB,IAAI,aAAa,GAAG,CAAC,CAAC;YACtB,IAAI,eAAe,GAAG,CAAC,CAAC;YACxB,IAAI,YAAY,GAAG,CAAC,CAAC;YACrB,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,UAAU,GAAG,CAAC,IAAI,EAAE,CAAC,SAAS,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,GAAG,CAAC,IAAI,EAAE,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC;gBAC3F,mDAAmD;gBACnD,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC;oBACnC,UAAU,EAAE,EAAE,CAAC,UAAU;oBACzB,SAAS,EAAE,EAAE,CAAC,SAAS;oBACvB,WAAW,EAAE,EAAE,CAAC,WAAW;oBAC3B,QAAQ,EAAE,EAAE,CAAC,QAAQ;oBACrB,eAAe,EAAE,EAAE,CAAC,eAAe;oBACnC,kBAAkB,EAAE,EAAE,CAAC,kBAAkB;oBACzC,eAAe,EAAE,EAAE,CAAC,eAAe;oBACnC,aAAa,EAAE,EAAE,CAAC,aAAa;oBAC/B,SAAS,EAAE,EAAE,CAAC,SAAS;oBACvB,KAAK,EAAE;wBACL,YAAY,EAAE,EAAE,CAAC,uBAAuB,IAAI,GAAG;wBAC/C,KAAK,EAAE,EAAE,CAAC,gBAAgB,IAAI,GAAG;qBAClC;oBACD,kBAAkB,EAAE,EAAE,CAAC,kBAAkB;iBAC1C,CAAC,CAAC;gBACH,cAAc,GAAG,CAAC,CAAC,cAAc,CAAC;gBAClC,aAAa,GAAG,CAAC,CAAC,aAAa,CAAC;gBAChC,eAAe,GAAG,CAAC,CAAC,eAAe,CAAC;gBACpC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACN,aAAa;gBACb,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC;gBAC7C,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;gBACxC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;gBACtC,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;YAC5C,CAAC;YACD,MAAM,QAAQ,GAAG,EAAE,EAAE,SAAS,IAAI,CAAC,CAAC;YACpC,MAAM,SAAS,GAAG,EAAE,EAAE,WAAW,IAAI,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,EAAE,EAAE,QAAQ,IAAI,CAAC,CAAC;YAClC,OAAO;gBACL,YAAY;gBACZ,QAAQ,MAAM,CAAC,OAAO,CAAC,MAAM,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,cAAc,MAAM,cAAc,OAAO;gBACpG,QAAQ,MAAM,CAAC,MAAM,CAAC,MAAM,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,aAAa,MAAM,aAAa,MAAM,QAAQ,GAAG;gBAC1G,QAAQ,MAAM,CAAC,QAAQ,CAAC,MAAM,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,eAAe,MAAM,eAAe,MAAM,SAAS,GAAG;gBACnH,SAAS,MAAM,CAAC,KAAK,CAAC,MAAM,MAAM,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,YAAY,MAAM,YAAY,MAAM,OAAO,GAAG;aACvG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC;gBAAS,CAAC;YACT,cAAc,CAAC,mBAAmB,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,mCAAmC;IACnC,IAAI;SACD,OAAO,CACN,mBAAmB,EACnB,oDAAoD,EACpD,EAAE,UAAU,EAAE,YAAY,EAAE,CAC7B;SACA,MAAM,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,2BAA2B,EAAE,CAAC;SAC1E,MAAM,CAAC,cAAc,EAAE,gBAAgB,EAAE,EAAE,WAAW,EAAE,6BAA6B,EAAE,CAAC;SACxF,MAAM,CAAC,KAAK,EAAC,IAAI,EAAC,EAAE;QACnB,MAAM,IAAI,GAAG,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,oCAAoC,IAAI,CAAC,UAAU,WAAW,CAAC;QACpF,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,OAAO,EAAE,QAAQ,CAAC;YAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,OAAO,EAAE,cAAc,CAAC;YAC5E,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,mBAAmB,IAAI,IAAI,CAAC,CAAC;YACjG,aAAa,CACX,IAAI,CAAC,OAAO,CAAC,SAAS,EACtB,IAAI,CAAC,OAAO,CAAC,QAAQ,EACrB,6BAA6B,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,CAC1F,CAAC;YAEF,sDAAsD;YACtD,qDAAqD;YACrD,kDAAkD;YAClD,4DAA4D;YAC5D,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YAEnC,sBAAsB;YACtB,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC;gBACnC,QAAQ;gBACR,aAAa,EAAE,QAAQ;gBACvB,GAAG;gBACH,GAAG,CAAC,OAAO,EAAE,4BAA4B,KAAK,SAAS;oBACrD,CAAC,CAAC,EAAE,iBAAiB,EAAE,OAAO,CAAC,4BAA4B,EAAE;oBAC7D,CAAC,CAAC,EAAE,CAAC;gBACP,GAAG,CAAC,OAAO,EAAE,4BAA4B,KAAK,SAAS;oBACrD,CAAC,CAAC,EAAE,iBAAiB,EAAE,OAAO,CAAC,4BAA4B,EAAE;oBAC7D,CAAC,CAAC,EAAE,CAAC;gBACP,GAAG,CAAC,MAAM,IAAI,OAAO,EAAE,cAAc;oBACnC,CAAC,CAAC;wBACE,GAAG,EAAE;4BACH,GAAG;4BACH,QAAQ,EAAE,OAAO,CAAC,cAAc,CAAC,QAAQ;4BACzC,eAAe,EAAE,OAAO,CAAC,cAAc,CAAC,eAAe,IAAI,IAAI;yBAChE;qBACF;oBACH,CAAC,CAAC,EAAE,CAAC;aACR,CAAC,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YAEnC,mBAAmB;YACnB,IAAI,YAAY,GAA6B,cAAc,CAAC;YAC5D,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,UAAU,GAAG,CAAC,IAAI,EAAE,CAAC,SAAS,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,GAAG,CAAC,IAAI,EAAE,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC;gBAC3F,YAAY,GAAG,OAAO,CAAC;gBACvB,MAAM,OAAO,CAAC,YAAY,CAAC;oBACzB,UAAU,EAAE,EAAE,CAAC,UAAU;oBACzB,SAAS,EAAE,EAAE,CAAC,SAAS;oBACvB,WAAW,EAAE,EAAE,CAAC,WAAW;oBAC3B,QAAQ,EAAE,EAAE,CAAC,QAAQ;oBACrB,eAAe,EAAE,EAAE,CAAC,eAAe;oBACnC,kBAAkB,EAAE,EAAE,CAAC,kBAAkB;oBACzC,eAAe,EAAE,EAAE,CAAC,eAAe;oBACnC,aAAa,EAAE,EAAE,CAAC,aAAa;oBAC/B,SAAS,EAAE,EAAE,CAAC,SAAS;oBACvB,KAAK,EAAE;wBACL,YAAY,EAAE,EAAE,CAAC,uBAAuB,IAAI,GAAG;wBAC/C,KAAK,EAAE,EAAE,CAAC,gBAAgB,IAAI,GAAG;qBAClC;oBACD,kBAAkB,EAAE,EAAE,CAAC,kBAAkB;iBAC1C,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC;YAC/B,CAAC;YACD,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YAEnC,0BAA0B;YAC1B,MAAM,eAAe,GACnB,eAAe,EAAE,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,OAAO,EAAE,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG;gBACnG,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,QAAQ,CAAC,MAAM,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG;gBACzF,MAAM,EAAE,CAAC,eAAe,CAAC,MAAM,OAAO,EAAE,CAAC,iBAAiB,KAAK;gBAC/D,cAAc,EAAE,CAAC,kBAAkB,UAAU,EAAE,CAAC,oBAAoB,GAAG;gBACvE,MAAM,EAAE,CAAC,yBAAyB,OAAO,EAAE,CAAC,2BAA2B,KAAK;gBAC5E,OAAO,EAAE,CAAC,uBAAuB,SAAS,EAAE,CAAC,qBAAqB,MAAM,EAAE,CAAC,mBAAmB,EAAE;gBAChG,CAAC,MAAM;oBACL,CAAC,CAAC,WAAW,EAAE,CAAC,WAAW,IAAI,CAAC,OAAO,EAAE,CAAC,WAAW,IAAI,CAAC,SAAS,EAAE,CAAC,kBAAkB,IAAI,CAAC,EAAE;oBAC/F,CAAC,CAAC,EAAE,CAAC,CAAC;YACV,MAAM,YAAY,GAChB,YAAY,KAAK,OAAO;gBACtB,CAAC,CAAC,eAAe,EAAE,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,OAAO,EAAE,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,MAAM,CAAC,MAAM,OAAO,EAAE,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,QAAQ,CAAC,MAAM,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE;gBAC3L,CAAC,CAAC,6BAA6B,EAAE,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,OAAO,EAAE,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,MAAM,CAAC,MAAM,OAAO,EAAE,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,QAAQ,CAAC,MAAM,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAC9M,OAAO,CAAC,YAAY,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClE,CAAC;gBAAS,CAAC;YACT,cAAc,CAAC,mBAAmB,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,0DAA0D;IAC1D,IAAI;SACD,OAAO,CAAC,+BAA+B,EAAE,sCAAsC,CAAC;SAChF,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,IAAI,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC;QAC9C,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO,CACL,gCAAgC;gBAChC,wEAAwE,CACzE,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACjF,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;QACzG,OAAO,wBAAwB,IAAI,SAAS,YAAY,MAAM,IAAI,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC;IAC1F,CAAC,CAAC,CAAC;AACP,CAAC;AAED,sBAAsB;AAEtB,SAAS,cAAc,CAAC,IAKvB;IACC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YAC9B,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;YAC9B,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC5B,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YACtC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;YAC9B,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAC9B,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YACtC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;YAC9B,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAC9B,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACpC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;YAC5B,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,OAAO;QACL,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC7D,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1D,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;KAChE,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,CAAa,EAAE,MAAmB,EAAE,QAAsB,EAAE,KAAqB;IACrG,MAAM,KAAK,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,EAAE,EAAE,gBAAgB,CAAC,CAAC,WAAW,IAAI,GAAG,EAAE,CAAC,CAAC;IAC3E,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IACzC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC3E,KAAK,CAAC,IAAI,CAAC,aAAa,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC;IAC7C,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9F,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC3E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,WAAW,CAAC,CAAY,EAAE,KAAqB;IACtD,MAAM,KAAK,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IACvD,IAAI,CAAC,CAAC,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IACtD,IAAI,CAAC,CAAC,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACnD,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;IACvC,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,cAAc,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,YAAY,CAAC,GAAe,EAAE,KAAqB;IAC1D,MAAM,KAAK,GAAG,CAAC,YAAY,GAAG,CAAC,EAAE,EAAE,EAAE,SAAS,GAAG,CAAC,IAAI,EAAE,EAAE,SAAS,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IACrF,IAAI,GAAG,CAAC,OAAO,EAAE,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1E,IAAI,GAAG,CAAC,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACvD,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;IACvC,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,cAAc,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,cAAc,CAAC,CAAe;IACrC,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc;QAAE,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,YAAY,MAAM,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC;IACnG,IAAI,CAAC,CAAC,IAAI,KAAK,eAAe;QAAE,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,YAAY,MAAM,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,YAAY,GAAG,CAAC;IAC7G,IAAI,CAAC,CAAC,IAAI,KAAK,eAAe;QAAE,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,YAAY,MAAM,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC;IACrG,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa;QAAE,OAAO,iBAAiB,CAAC,CAAC,WAAW,MAAM,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,YAAY,GAAG,CAAC;IAC3G,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc;QAAE,OAAO,kBAAkB,CAAC,CAAC,WAAW,MAAM,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,YAAY,GAAG,CAAC;IAC9G,OAAO,mBAAmB,CAAC,CAAC,YAAY,MAAM,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,YAAY,GAAG,CAAC;AACnF,CAAC"}
|