@dayinxisheng/novel-tools 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +37 -0
- package/README.md +88 -15
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +0 -47
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/event.d.ts.map +1 -1
- package/dist/commands/event.js +12 -1
- package/dist/commands/event.js.map +1 -1
- package/dist/core/types.d.ts +26 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/services/chapter-plan.service.d.ts +27 -0
- package/dist/services/chapter-plan.service.d.ts.map +1 -0
- package/dist/services/chapter-plan.service.js +246 -0
- package/dist/services/chapter-plan.service.js.map +1 -0
- package/dist/services/event-command.service.d.ts +9 -1
- package/dist/services/event-command.service.d.ts.map +1 -1
- package/dist/services/event-command.service.js +150 -5
- package/dist/services/event-command.service.js.map +1 -1
- package/dist/services/index.d.ts +1 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +1 -0
- package/dist/services/index.js.map +1 -1
- package/dist/services/init.service.d.ts.map +1 -1
- package/dist/services/init.service.js +12 -13
- package/dist/services/init.service.js.map +1 -1
- package/dist/services/validate.service.d.ts +8 -16
- package/dist/services/validate.service.d.ts.map +1 -1
- package/dist/services/validate.service.js +26 -173
- package/dist/services/validate.service.js.map +1 -1
- package/package.json +1 -1
|
@@ -4,33 +4,25 @@ import { ValidationResult } from '../core/types.js';
|
|
|
4
4
|
*/
|
|
5
5
|
export declare class ValidateService {
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
7
|
+
* 查找章纲文件(递归搜索所有卷目录)
|
|
8
8
|
*/
|
|
9
|
-
|
|
9
|
+
private findChapterPlan;
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
11
|
+
* 查找草稿文件(递归搜索所有卷目录)
|
|
12
12
|
*/
|
|
13
|
-
|
|
13
|
+
private findChapterDraft;
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
15
|
+
* 验证大纲完整性
|
|
16
16
|
*/
|
|
17
|
-
|
|
17
|
+
validateOutline(projectPath: string): Promise<ValidationResult>;
|
|
18
18
|
/**
|
|
19
|
-
*
|
|
19
|
+
* 验证章节
|
|
20
20
|
*/
|
|
21
|
-
|
|
21
|
+
validateChapter(projectPath: string, chapter: number): Promise<ValidationResult>;
|
|
22
22
|
/**
|
|
23
23
|
* 检查大纲文件
|
|
24
24
|
*/
|
|
25
25
|
private checkOutlineFile;
|
|
26
|
-
/**
|
|
27
|
-
* 检查卷级大纲文件
|
|
28
|
-
*/
|
|
29
|
-
private checkVolumeFiles;
|
|
30
|
-
/**
|
|
31
|
-
* 检查弧列表
|
|
32
|
-
*/
|
|
33
|
-
private checkArcList;
|
|
34
26
|
/**
|
|
35
27
|
* 检查章节规划
|
|
36
28
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.service.d.ts","sourceRoot":"","sources":["../../src/services/validate.service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validate.service.d.ts","sourceRoot":"","sources":["../../src/services/validate.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAe,MAAM,kBAAkB,CAAC;AAGjE;;GAEG;AACH,qBAAa,eAAe;IAC1B;;OAEG;YACW,eAAe;IAM7B;;OAEG;YACW,gBAAgB;IAK9B;;OAEG;IACG,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAarE;;OAEG;IACG,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAmCtF;;OAEG;YACW,gBAAgB;IAyB9B;;OAEG;YACW,gBAAgB;IAwB9B;;OAEG;YACW,iBAAiB;CAuBhC"}
|
|
@@ -1,10 +1,25 @@
|
|
|
1
1
|
import { FileUtils } from '../core/file.js';
|
|
2
|
-
import { YamlUtils } from '../core/yaml.js';
|
|
3
2
|
import * as path from 'path';
|
|
4
3
|
/**
|
|
5
4
|
* 验证服务类
|
|
6
5
|
*/
|
|
7
6
|
export class ValidateService {
|
|
7
|
+
/**
|
|
8
|
+
* 查找章纲文件(递归搜索所有卷目录)
|
|
9
|
+
*/
|
|
10
|
+
async findChapterPlan(projectPath, chapter) {
|
|
11
|
+
const pattern = `**/ch${String(chapter).padStart(3, '0')}.md`;
|
|
12
|
+
const files = await FileUtils.globFiles(path.join(projectPath, 'chapter_plans'), pattern);
|
|
13
|
+
return files.length > 0 ? files[0] : null;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 查找草稿文件(递归搜索所有卷目录)
|
|
17
|
+
*/
|
|
18
|
+
async findChapterDraft(projectPath, chapter) {
|
|
19
|
+
const pattern = `**/ch${String(chapter).padStart(3, '0')}.md`;
|
|
20
|
+
const files = await FileUtils.globFiles(path.join(projectPath, 'drafts'), pattern);
|
|
21
|
+
return files.length > 0 ? files[0] : null;
|
|
22
|
+
}
|
|
8
23
|
/**
|
|
9
24
|
* 验证大纲完整性
|
|
10
25
|
*/
|
|
@@ -14,11 +29,6 @@ export class ValidateService {
|
|
|
14
29
|
// 检查主大纲
|
|
15
30
|
const mainOutline = path.join(outlineDir, 'main_outline.md');
|
|
16
31
|
result.checks.push(await this.checkOutlineFile(mainOutline, '主大纲'));
|
|
17
|
-
// 检查卷级大纲
|
|
18
|
-
result.checks.push(await this.checkVolumeFiles(outlineDir));
|
|
19
|
-
// 检查弧列表
|
|
20
|
-
const arcPath = path.join(outlineDir, 'arc_list.yaml');
|
|
21
|
-
result.checks.push(await this.checkArcList(arcPath));
|
|
22
32
|
result.passed = result.checks.every(c => c.passed);
|
|
23
33
|
return result;
|
|
24
34
|
}
|
|
@@ -27,11 +37,11 @@ export class ValidateService {
|
|
|
27
37
|
*/
|
|
28
38
|
async validateChapter(projectPath, chapter) {
|
|
29
39
|
const result = { passed: true, checks: [] };
|
|
30
|
-
//
|
|
31
|
-
const planPath =
|
|
40
|
+
// 查找并检查章纲
|
|
41
|
+
const planPath = await this.findChapterPlan(projectPath, chapter);
|
|
32
42
|
result.checks.push(await this.checkChapterPlan(planPath, chapter));
|
|
33
|
-
//
|
|
34
|
-
const draftPath =
|
|
43
|
+
// 查找并检查草稿
|
|
44
|
+
const draftPath = await this.findChapterDraft(projectPath, chapter);
|
|
35
45
|
result.checks.push(await this.checkChapterDraft(draftPath, chapter));
|
|
36
46
|
// 检查事件记录
|
|
37
47
|
const { EventService } = await import('./event.service.js');
|
|
@@ -54,116 +64,6 @@ export class ValidateService {
|
|
|
54
64
|
result.passed = result.checks.every(c => c.passed);
|
|
55
65
|
return result;
|
|
56
66
|
}
|
|
57
|
-
/**
|
|
58
|
-
* 验证剧情弧
|
|
59
|
-
*/
|
|
60
|
-
async validateArc(projectPath, arcName) {
|
|
61
|
-
const result = { passed: true, checks: [] };
|
|
62
|
-
// 检查弧大纲
|
|
63
|
-
const arcOutlinePath = path.join(projectPath, 'outline', `arc_${arcName}.md`);
|
|
64
|
-
if (!FileUtils.exists(arcOutlinePath)) {
|
|
65
|
-
result.checks.push({
|
|
66
|
-
name: '弧大纲',
|
|
67
|
-
passed: false,
|
|
68
|
-
issues: [`未找到弧大纲: ${arcOutlinePath}`]
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
else {
|
|
72
|
-
result.checks.push({
|
|
73
|
-
name: '弧大纲',
|
|
74
|
-
passed: true,
|
|
75
|
-
issues: []
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
// 检查弧内的章节
|
|
79
|
-
const arcConfigPath = path.join(projectPath, 'outline', 'arc_list.yaml');
|
|
80
|
-
const arcConfig = await YamlUtils.parseFile(arcConfigPath);
|
|
81
|
-
if (arcConfig && arcConfig.arcs) {
|
|
82
|
-
const arc = arcConfig.arcs.find((a) => a.name === arcName);
|
|
83
|
-
if (arc) {
|
|
84
|
-
const { startChapter, endChapter } = arc;
|
|
85
|
-
const missingChapters = [];
|
|
86
|
-
for (let ch = startChapter; ch <= endChapter; ch++) {
|
|
87
|
-
const planPath = path.join(projectPath, 'chapter_plans', `chapter_${ch}.md`);
|
|
88
|
-
if (!FileUtils.exists(planPath)) {
|
|
89
|
-
missingChapters.push(ch);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
if (missingChapters.length > 0) {
|
|
93
|
-
result.checks.push({
|
|
94
|
-
name: '章节完整性',
|
|
95
|
-
passed: false,
|
|
96
|
-
issues: [`缺少章纲: ${missingChapters.join(', ')}`]
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
else {
|
|
100
|
-
result.checks.push({
|
|
101
|
-
name: '章节完整性',
|
|
102
|
-
passed: true,
|
|
103
|
-
issues: []
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
result.passed = result.checks.every(c => c.passed);
|
|
109
|
-
return result;
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* 验证卷
|
|
113
|
-
*/
|
|
114
|
-
async validateVolume(projectPath, volume) {
|
|
115
|
-
const result = { passed: true, checks: [] };
|
|
116
|
-
// 检查卷大纲
|
|
117
|
-
const volumeOutlinePath = path.join(projectPath, 'outline', `vol${volume}.md`);
|
|
118
|
-
if (!FileUtils.exists(volumeOutlinePath)) {
|
|
119
|
-
result.checks.push({
|
|
120
|
-
name: '卷大纲',
|
|
121
|
-
passed: false,
|
|
122
|
-
issues: [`未找到卷大纲: ${volumeOutlinePath}`]
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
result.checks.push({
|
|
127
|
-
name: '卷大纲',
|
|
128
|
-
passed: true,
|
|
129
|
-
issues: []
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
// 检查卷快照
|
|
133
|
-
const snapshotPath = path.join(projectPath, 'settings', 'state', `vol${volume}_snapshot.yaml`);
|
|
134
|
-
if (!FileUtils.exists(snapshotPath)) {
|
|
135
|
-
result.checks.push({
|
|
136
|
-
name: '卷快照',
|
|
137
|
-
passed: false,
|
|
138
|
-
issues: [`未找到第 ${volume} 卷的状态快照`]
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
else {
|
|
142
|
-
result.checks.push({
|
|
143
|
-
name: '卷快照',
|
|
144
|
-
passed: true,
|
|
145
|
-
issues: []
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
// 检查卷事件归档
|
|
149
|
-
const volEventsPath = path.join(projectPath, 'settings', 'events', `vol${volume}`, 'events.json');
|
|
150
|
-
if (!FileUtils.exists(volEventsPath)) {
|
|
151
|
-
result.checks.push({
|
|
152
|
-
name: '卷事件归档',
|
|
153
|
-
passed: false,
|
|
154
|
-
issues: [`未找到第 ${volume} 卷的事件归档`]
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
else {
|
|
158
|
-
result.checks.push({
|
|
159
|
-
name: '卷事件归档',
|
|
160
|
-
passed: true,
|
|
161
|
-
issues: []
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
result.passed = result.checks.every(c => c.passed);
|
|
165
|
-
return result;
|
|
166
|
-
}
|
|
167
67
|
/**
|
|
168
68
|
* 检查大纲文件
|
|
169
69
|
*/
|
|
@@ -186,64 +86,14 @@ export class ValidateService {
|
|
|
186
86
|
}
|
|
187
87
|
return { name, passed: issues.length === 0, issues };
|
|
188
88
|
}
|
|
189
|
-
/**
|
|
190
|
-
* 检查卷级大纲文件
|
|
191
|
-
*/
|
|
192
|
-
async checkVolumeFiles(outlineDir) {
|
|
193
|
-
const issues = [];
|
|
194
|
-
const volumeFiles = await FileUtils.globFiles(outlineDir, 'vol*.md');
|
|
195
|
-
volumeFiles.push(...await FileUtils.globFiles(outlineDir, '第*卷*.md'));
|
|
196
|
-
if (volumeFiles.length === 0) {
|
|
197
|
-
return { name: '卷级大纲', passed: false, issues: ['未找到卷级大纲文件'] };
|
|
198
|
-
}
|
|
199
|
-
for (const volFile of volumeFiles) {
|
|
200
|
-
const content = await FileUtils.readText(volFile);
|
|
201
|
-
if (!content.includes('主题') && !content.includes('本卷定位')) {
|
|
202
|
-
issues.push(`${path.basename(volFile)}: 缺少主题说明`);
|
|
203
|
-
}
|
|
204
|
-
if (!content.includes('弧') && !content.includes('章节')) {
|
|
205
|
-
issues.push(`${path.basename(volFile)}: 缺少剧情弧或章节划分`);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
return { name: '卷级大纲', passed: issues.length === 0, issues };
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* 检查弧列表
|
|
212
|
-
*/
|
|
213
|
-
async checkArcList(arcPath) {
|
|
214
|
-
const issues = [];
|
|
215
|
-
if (!FileUtils.exists(arcPath)) {
|
|
216
|
-
return { name: '弧列表', passed: false, issues: [`弧列表文件不存在: ${arcPath}`] };
|
|
217
|
-
}
|
|
218
|
-
const arcData = await YamlUtils.parseFile(arcPath);
|
|
219
|
-
if (!arcData || !arcData.arcs || !Array.isArray(arcData.arcs)) {
|
|
220
|
-
issues.push('弧列表格式不正确,缺少 arcs 数组');
|
|
221
|
-
}
|
|
222
|
-
else if (arcData.arcs.length === 0) {
|
|
223
|
-
issues.push('弧列表为空');
|
|
224
|
-
}
|
|
225
|
-
else {
|
|
226
|
-
// 检查每个弧的结构
|
|
227
|
-
for (let i = 0; i < arcData.arcs.length; i++) {
|
|
228
|
-
const arc = arcData.arcs[i];
|
|
229
|
-
if (!arc.name) {
|
|
230
|
-
issues.push(`弧 #${i + 1}: 缺少名称`);
|
|
231
|
-
}
|
|
232
|
-
if (arc.startChapter === undefined || arc.endChapter === undefined) {
|
|
233
|
-
issues.push(`弧 #${i + 1}: 缺少章节范围`);
|
|
234
|
-
}
|
|
235
|
-
if (arc.startChapter > arc.endChapter) {
|
|
236
|
-
issues.push(`弧 #${i + 1}: 起始章节大于结束章节`);
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
return { name: '弧列表', passed: issues.length === 0, issues };
|
|
241
|
-
}
|
|
242
89
|
/**
|
|
243
90
|
* 检查章节规划
|
|
244
91
|
*/
|
|
245
92
|
async checkChapterPlan(planPath, chapter) {
|
|
246
93
|
const issues = [];
|
|
94
|
+
if (!planPath) {
|
|
95
|
+
return { name: '章纲', passed: false, issues: [`第 ${chapter} 章章纲不存在`] };
|
|
96
|
+
}
|
|
247
97
|
if (!FileUtils.exists(planPath)) {
|
|
248
98
|
return { name: '章纲', passed: false, issues: [`第 ${chapter} 章章纲不存在: ${planPath}`] };
|
|
249
99
|
}
|
|
@@ -261,6 +111,9 @@ export class ValidateService {
|
|
|
261
111
|
*/
|
|
262
112
|
async checkChapterDraft(draftPath, chapter) {
|
|
263
113
|
const issues = [];
|
|
114
|
+
if (!draftPath) {
|
|
115
|
+
return { name: '草稿', passed: false, issues: [`第 ${chapter} 章草稿不存在`] };
|
|
116
|
+
}
|
|
264
117
|
if (!FileUtils.exists(draftPath)) {
|
|
265
118
|
return {
|
|
266
119
|
name: '草稿',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.service.js","sourceRoot":"","sources":["../../src/services/validate.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"validate.service.js","sourceRoot":"","sources":["../../src/services/validate.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B;;GAEG;AACH,MAAM,OAAO,eAAe;IAC1B;;OAEG;IACK,KAAK,CAAC,eAAe,CAAC,WAAmB,EAAE,OAAe;QAChE,MAAM,OAAO,GAAG,QAAQ,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC;QAC9D,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,EAAE,OAAO,CAAC,CAAC;QAC1F,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5C,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB,CAAC,WAAmB,EAAE,OAAe;QACjE,MAAM,OAAO,GAAG,QAAQ,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC;QAC9D,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;QACnF,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5C,CAAC;IACD;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,WAAmB;QACvC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QACrD,MAAM,MAAM,GAAqB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAE9D,QAAQ;QACR,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;QAC7D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;QAEpE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAEnD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,WAAmB,EAAE,OAAe;QACxD,MAAM,MAAM,GAAqB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAE9D,UAAU;QACV,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAClE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QAEnE,UAAU;QACV,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACpE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;QAErE,SAAS;QACT,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC5D,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,oBAAoB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAE7E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;gBACjB,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,CAAC,KAAK,OAAO,UAAU,CAAC;aACjC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;gBACjB,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,IAAI;gBACZ,MAAM,EAAE,EAAE;aACX,CAAC,CAAC;QACL,CAAC;QAED,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAEnD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB,CAAC,WAAmB,EAAE,IAAY;QAC9D,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;YACnC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,YAAY,WAAW,EAAE,CAAC,EAAE,CAAC;QACtE,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAEtD,MAAM,gBAAgB,GAA4B;YAChD,CAAC,QAAQ,EAAE,IAAI,CAAC;YAChB,CAAC,WAAW,EAAE,MAAM,CAAC;YACrB,CAAC,SAAS,EAAE,MAAM,CAAC;YACnB,CAAC,QAAQ,EAAE,MAAM,CAAC;SACnB,CAAC;QAEF,KAAK,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,gBAAgB,EAAE,CAAC;YACtD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,MAAM,CAAC,IAAI,CAAC,WAAW,WAAW,EAAE,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACvD,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB,CAAC,QAAuB,EAAE,OAAe;QACrE,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,KAAK,OAAO,SAAS,CAAC,EAAE,CAAC;QACxE,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,KAAK,OAAO,YAAY,QAAQ,EAAE,CAAC,EAAE,CAAC;QACrF,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEnD,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxB,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAClF,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC7B,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7D,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,iBAAiB,CAAC,SAAwB,EAAE,OAAe;QACvE,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,KAAK,OAAO,SAAS,CAAC,EAAE,CAAC;QACxE,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YACjC,OAAO;gBACL,IAAI,EAAE,IAAI;gBACV,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,CAAC,KAAK,OAAO,YAAY,SAAS,EAAE,CAAC;aAC9C,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAEpD,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAClC,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7D,CAAC;CACF"}
|