@utopian426/redmine-figma-mcp 1.0.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/.env.example +6 -0
- package/README.md +170 -0
- package/dist/figma-client.d.ts +248 -0
- package/dist/figma-client.d.ts.map +1 -0
- package/dist/figma-client.js +416 -0
- package/dist/figma-client.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +664 -0
- package/dist/index.js.map +1 -0
- package/dist/redmine-client.d.ts +67 -0
- package/dist/redmine-client.d.ts.map +1 -0
- package/dist/redmine-client.js +86 -0
- package/dist/redmine-client.js.map +1 -0
- package/package.json +42 -0
package/.env.example
ADDED
package/README.md
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
# Redmine + Figma MCP Server
|
|
2
|
+
|
|
3
|
+
一个集成了 Redmine 需求管理和 Figma 设计分析的 MCP (Model Context Protocol) Server。
|
|
4
|
+
|
|
5
|
+
## 功能
|
|
6
|
+
|
|
7
|
+
- **redmine_get_issue**: 获取 Redmine 需求的详细信息
|
|
8
|
+
- **figma_get_file**: 获取 Figma 设计文件信息
|
|
9
|
+
- **figma_analyze_design**: 分析 Figma 设计文档结构
|
|
10
|
+
- **redmine_figma_analyze**: 综合分析需求和设计
|
|
11
|
+
- **extract_figma_key**: 从 Figma URL 提取文件 key
|
|
12
|
+
- **generate_figma_design**: 根据需求生成 Figma 设计结构
|
|
13
|
+
- **generate_vue_frontend**: 根据需求生成前端开发提示
|
|
14
|
+
|
|
15
|
+
## 快速开始
|
|
16
|
+
|
|
17
|
+
### 1. 安装依赖
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
cd mcp-server
|
|
21
|
+
npm install
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### 2. 配置环境变量
|
|
25
|
+
|
|
26
|
+
复制 `.env.example` 为 `.env` 并填写你的 API Key:
|
|
27
|
+
|
|
28
|
+
```env
|
|
29
|
+
REDMINE_URL=https://your-redmine.com
|
|
30
|
+
REDMINE_API_KEY=your_redmine_api_key
|
|
31
|
+
FIGMA_API_KEY=your_figma_api_key
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 3. 构建
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
npm run build
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### 4. 配置 MCP 客户端
|
|
41
|
+
|
|
42
|
+
#### Claude Desktop 配置
|
|
43
|
+
|
|
44
|
+
在 `claude_desktop_config.json` 中添加:
|
|
45
|
+
|
|
46
|
+
```json
|
|
47
|
+
{
|
|
48
|
+
"mcpServers": {
|
|
49
|
+
"redmine-figma": {
|
|
50
|
+
"command": "node",
|
|
51
|
+
"args": ["/path/to/mcp-server/dist/index.js"],
|
|
52
|
+
"env": {
|
|
53
|
+
"REDMINE_URL": "https://your-redmine.com",
|
|
54
|
+
"REDMINE_API_KEY": "your_redmine_api_key",
|
|
55
|
+
"FIGMA_API_KEY": "your_figma_api_key"
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
#### Qoder 配置
|
|
63
|
+
|
|
64
|
+
在 `.qoder/mcp.json` 中添加:
|
|
65
|
+
|
|
66
|
+
```json
|
|
67
|
+
{
|
|
68
|
+
"servers": [
|
|
69
|
+
{
|
|
70
|
+
"name": "redmine-figma",
|
|
71
|
+
"command": "node",
|
|
72
|
+
"args": ["/path/to/mcp-server/dist/index.js"],
|
|
73
|
+
"env": {
|
|
74
|
+
"REDMINE_URL": "https://your-redmine.com",
|
|
75
|
+
"REDMINE_API_KEY": "your_redmine_api_key",
|
|
76
|
+
"FIGMA_API_KEY": "your_figma_api_key"
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
]
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## 使用示例
|
|
84
|
+
|
|
85
|
+
### 获取 Redmine 需求
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
请帮我查看 Redmine 需求 #12345
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### 分析 Figma 设计
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
请分析这个 Figma 设计: https://www.figma.com/file/ABC123/FileName
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### 生成前端开发提示
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
帮我查看 Redmine 需求 #12762,生成前端开发提示
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## 分享给他人使用
|
|
104
|
+
|
|
105
|
+
### 方式一:直接分享代码
|
|
106
|
+
|
|
107
|
+
1. 将整个 `mcp-server` 文件夹打包分享
|
|
108
|
+
2. 对方解压后执行:
|
|
109
|
+
```bash
|
|
110
|
+
cd mcp-server
|
|
111
|
+
npm install
|
|
112
|
+
npm run build
|
|
113
|
+
```
|
|
114
|
+
3. 修改 `.env` 文件中的 API Key
|
|
115
|
+
4. 配置到对方的 MCP 客户端
|
|
116
|
+
|
|
117
|
+
### 方式二:Git 仓库分享
|
|
118
|
+
|
|
119
|
+
1. 将代码推送到 Git 仓库
|
|
120
|
+
2. 他人克隆后安装依赖:
|
|
121
|
+
```bash
|
|
122
|
+
git clone <your-repo-url>
|
|
123
|
+
cd mcp-server
|
|
124
|
+
npm install
|
|
125
|
+
npm run build
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### 方式三:npm 包分享(高级)
|
|
129
|
+
|
|
130
|
+
1. 发布到 npm:
|
|
131
|
+
```bash
|
|
132
|
+
npm publish
|
|
133
|
+
```
|
|
134
|
+
2. 他人全局安装:
|
|
135
|
+
```bash
|
|
136
|
+
npm install -g your-mcp-server
|
|
137
|
+
```
|
|
138
|
+
3. 配置时使用命令路径:
|
|
139
|
+
```json
|
|
140
|
+
{
|
|
141
|
+
"command": "your-mcp-server"
|
|
142
|
+
}
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## 开发
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
# 安装依赖
|
|
149
|
+
npm install
|
|
150
|
+
|
|
151
|
+
# 构建
|
|
152
|
+
npm run build
|
|
153
|
+
|
|
154
|
+
# 开发模式
|
|
155
|
+
npm run dev
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## 项目结构
|
|
159
|
+
|
|
160
|
+
```
|
|
161
|
+
mcp-server/
|
|
162
|
+
├── src/
|
|
163
|
+
│ ├── index.ts # MCP Server 入口
|
|
164
|
+
│ ├── redmine-client.ts # Redmine API 客户端
|
|
165
|
+
│ └── figma-client.ts # Figma API 客户端
|
|
166
|
+
├── dist/ # 编译输出
|
|
167
|
+
├── .env # 环境变量
|
|
168
|
+
├── package.json
|
|
169
|
+
└── tsconfig.json
|
|
170
|
+
```
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Figma API Client
|
|
3
|
+
* 用于获取、创建和分析 Figma 设计文档
|
|
4
|
+
*/
|
|
5
|
+
export interface FigmaPluginNode {
|
|
6
|
+
id: string;
|
|
7
|
+
name: string;
|
|
8
|
+
type: 'FRAME' | 'TEXT' | 'RECTANGLE' | 'COMPONENT' | 'INSTANCE' | 'GROUP';
|
|
9
|
+
x?: number;
|
|
10
|
+
y?: number;
|
|
11
|
+
width?: number;
|
|
12
|
+
height?: number;
|
|
13
|
+
fills?: Array<{
|
|
14
|
+
type: 'SOLID' | 'GRADIENT_LINEAR' | 'IMAGE';
|
|
15
|
+
color?: {
|
|
16
|
+
r: number;
|
|
17
|
+
g: number;
|
|
18
|
+
b: number;
|
|
19
|
+
a?: number;
|
|
20
|
+
};
|
|
21
|
+
}>;
|
|
22
|
+
characters?: string;
|
|
23
|
+
fontSize?: number;
|
|
24
|
+
fontName?: {
|
|
25
|
+
family: string;
|
|
26
|
+
style: string;
|
|
27
|
+
};
|
|
28
|
+
children?: FigmaPluginNode[];
|
|
29
|
+
layoutMode?: 'NONE' | 'HORIZONTAL' | 'VERTICAL';
|
|
30
|
+
primaryAxisAlignItems?: 'MIN' | 'CENTER' | 'MAX' | 'SPACE_BETWEEN';
|
|
31
|
+
counterAxisAlignItems?: 'MIN' | 'CENTER' | 'MAX';
|
|
32
|
+
itemSpacing?: number;
|
|
33
|
+
paddingLeft?: number;
|
|
34
|
+
paddingRight?: number;
|
|
35
|
+
paddingTop?: number;
|
|
36
|
+
paddingBottom?: number;
|
|
37
|
+
cornerRadius?: number;
|
|
38
|
+
strokes?: Array<{
|
|
39
|
+
type: 'SOLID';
|
|
40
|
+
color: {
|
|
41
|
+
r: number;
|
|
42
|
+
g: number;
|
|
43
|
+
b: number;
|
|
44
|
+
a?: number;
|
|
45
|
+
};
|
|
46
|
+
}>;
|
|
47
|
+
strokeWeight?: number;
|
|
48
|
+
}
|
|
49
|
+
export interface FigmaFile {
|
|
50
|
+
key: string;
|
|
51
|
+
name: string;
|
|
52
|
+
lastModified: string;
|
|
53
|
+
thumbnailUrl: string;
|
|
54
|
+
version: string;
|
|
55
|
+
document: FigmaNode;
|
|
56
|
+
}
|
|
57
|
+
export interface FigmaNode {
|
|
58
|
+
id: string;
|
|
59
|
+
name: string;
|
|
60
|
+
type: string;
|
|
61
|
+
children?: FigmaNode[];
|
|
62
|
+
fills?: Array<{
|
|
63
|
+
type: string;
|
|
64
|
+
color?: {
|
|
65
|
+
r: number;
|
|
66
|
+
g: number;
|
|
67
|
+
b: number;
|
|
68
|
+
a: number;
|
|
69
|
+
};
|
|
70
|
+
opacity?: number;
|
|
71
|
+
}>;
|
|
72
|
+
strokes?: unknown[];
|
|
73
|
+
strokeWeight?: number;
|
|
74
|
+
strokeAlign?: string;
|
|
75
|
+
cornerRadius?: number;
|
|
76
|
+
characters?: string;
|
|
77
|
+
style?: {
|
|
78
|
+
fontFamily?: string;
|
|
79
|
+
fontPostScriptName?: string;
|
|
80
|
+
fontWeight?: number;
|
|
81
|
+
fontSize?: number;
|
|
82
|
+
textAlignHorizontal?: string;
|
|
83
|
+
textAlignVertical?: string;
|
|
84
|
+
letterSpacing?: number;
|
|
85
|
+
lineHeightPx?: number;
|
|
86
|
+
lineHeightPercent?: number;
|
|
87
|
+
fills?: Array<{
|
|
88
|
+
type: string;
|
|
89
|
+
color?: {
|
|
90
|
+
r: number;
|
|
91
|
+
g: number;
|
|
92
|
+
b: number;
|
|
93
|
+
a: number;
|
|
94
|
+
};
|
|
95
|
+
}>;
|
|
96
|
+
};
|
|
97
|
+
absoluteBoundingBox?: {
|
|
98
|
+
x: number;
|
|
99
|
+
y: number;
|
|
100
|
+
width: number;
|
|
101
|
+
height: number;
|
|
102
|
+
};
|
|
103
|
+
constraints?: {
|
|
104
|
+
vertical: string;
|
|
105
|
+
horizontal: string;
|
|
106
|
+
};
|
|
107
|
+
componentId?: string;
|
|
108
|
+
componentPropertyDefinitions?: Record<string, unknown>;
|
|
109
|
+
}
|
|
110
|
+
export interface FigmaFileResponse {
|
|
111
|
+
document: FigmaNode;
|
|
112
|
+
components: Record<string, {
|
|
113
|
+
key: string;
|
|
114
|
+
name: string;
|
|
115
|
+
description: string;
|
|
116
|
+
}>;
|
|
117
|
+
schemaVersion: number;
|
|
118
|
+
styles: Record<string, {
|
|
119
|
+
key: string;
|
|
120
|
+
name: string;
|
|
121
|
+
styleType: string;
|
|
122
|
+
description: string;
|
|
123
|
+
}>;
|
|
124
|
+
name: string;
|
|
125
|
+
lastModified: string;
|
|
126
|
+
thumbnailUrl: string;
|
|
127
|
+
version: string;
|
|
128
|
+
role: string;
|
|
129
|
+
editorType: string;
|
|
130
|
+
linkAccess: string;
|
|
131
|
+
}
|
|
132
|
+
export interface FigmaComment {
|
|
133
|
+
id: string;
|
|
134
|
+
file_key: string;
|
|
135
|
+
parent_id?: string;
|
|
136
|
+
user: {
|
|
137
|
+
id: string;
|
|
138
|
+
handle: string;
|
|
139
|
+
img_url: string;
|
|
140
|
+
};
|
|
141
|
+
created_at: string;
|
|
142
|
+
resolved_at?: string;
|
|
143
|
+
message: string;
|
|
144
|
+
client_meta?: {
|
|
145
|
+
x: number;
|
|
146
|
+
y: number;
|
|
147
|
+
node_id?: string;
|
|
148
|
+
node_offset?: {
|
|
149
|
+
x: number;
|
|
150
|
+
y: number;
|
|
151
|
+
};
|
|
152
|
+
};
|
|
153
|
+
order_id: number;
|
|
154
|
+
}
|
|
155
|
+
export interface FigmaCommentsResponse {
|
|
156
|
+
comments: FigmaComment[];
|
|
157
|
+
}
|
|
158
|
+
export declare class FigmaClient {
|
|
159
|
+
private apiKey;
|
|
160
|
+
private baseUrl;
|
|
161
|
+
constructor(apiKey: string);
|
|
162
|
+
/**
|
|
163
|
+
* 获取 Figma 文件信息
|
|
164
|
+
* @param fileKey 文件 key(从 Figma URL 中提取)
|
|
165
|
+
* @returns 文件信息
|
|
166
|
+
*/
|
|
167
|
+
getFile(fileKey: string): Promise<FigmaFileResponse>;
|
|
168
|
+
/**
|
|
169
|
+
* 获取 Figma 文件评论
|
|
170
|
+
* @param fileKey 文件 key
|
|
171
|
+
* @returns 评论列表
|
|
172
|
+
*/
|
|
173
|
+
getComments(fileKey: string): Promise<FigmaComment[]>;
|
|
174
|
+
/**
|
|
175
|
+
* 从 Figma URL 中提取文件 key
|
|
176
|
+
* @param url Figma URL,如 https://www.figma.com/file/ABC123/FileName
|
|
177
|
+
* @returns 文件 key
|
|
178
|
+
*/
|
|
179
|
+
extractFileKey(url: string): string | null;
|
|
180
|
+
/**
|
|
181
|
+
* 遍历节点树,收集所有文本内容
|
|
182
|
+
* @param node 节点
|
|
183
|
+
* @param texts 文本数组
|
|
184
|
+
*/
|
|
185
|
+
private collectTextNodes;
|
|
186
|
+
/**
|
|
187
|
+
* 遍历节点树,收集所有组件
|
|
188
|
+
* @param node 节点
|
|
189
|
+
* @param components 组件数组
|
|
190
|
+
*/
|
|
191
|
+
private collectComponents;
|
|
192
|
+
/**
|
|
193
|
+
* 遍历节点树,收集所有 frame/page 信息
|
|
194
|
+
* @param node 节点
|
|
195
|
+
* @param frames frame 数组
|
|
196
|
+
*/
|
|
197
|
+
private collectFrames;
|
|
198
|
+
/**
|
|
199
|
+
* 分析 Figma 文件结构
|
|
200
|
+
* @param file 文件响应
|
|
201
|
+
* @returns 分析结果
|
|
202
|
+
*/
|
|
203
|
+
analyzeFile(file: FigmaFileResponse): {
|
|
204
|
+
summary: string;
|
|
205
|
+
pages: Array<{
|
|
206
|
+
name: string;
|
|
207
|
+
nodeCount: number;
|
|
208
|
+
texts: string[];
|
|
209
|
+
}>;
|
|
210
|
+
components: string[];
|
|
211
|
+
styles: string[];
|
|
212
|
+
allTexts: string[];
|
|
213
|
+
};
|
|
214
|
+
/**
|
|
215
|
+
* 统计节点数量
|
|
216
|
+
* @param node 节点
|
|
217
|
+
* @returns 数量
|
|
218
|
+
*/
|
|
219
|
+
private countNodes;
|
|
220
|
+
/**
|
|
221
|
+
* 格式化文件分析结果为字符串
|
|
222
|
+
* @param analysis 分析结果
|
|
223
|
+
* @returns 格式化字符串
|
|
224
|
+
*/
|
|
225
|
+
formatAnalysisForPrompt(analysis: ReturnType<FigmaClient['analyzeFile']>): string;
|
|
226
|
+
/**
|
|
227
|
+
* 生成 Figma 设计节点结构(用于创建设计稿)
|
|
228
|
+
* @param requirementTitle 需求标题
|
|
229
|
+
* @param requirementDesc 需求描述
|
|
230
|
+
* @returns Figma 节点结构
|
|
231
|
+
*/
|
|
232
|
+
generateDesignFromRequirement(requirementTitle: string, requirementDesc: string): FigmaPluginNode;
|
|
233
|
+
/**
|
|
234
|
+
* 解析需求描述,提取功能点
|
|
235
|
+
*/
|
|
236
|
+
private parseFeatures;
|
|
237
|
+
/**
|
|
238
|
+
* 创建功能点设计框架
|
|
239
|
+
*/
|
|
240
|
+
private createFeatureFrame;
|
|
241
|
+
/**
|
|
242
|
+
* 将设计节点转换为 Vue 组件代码建议
|
|
243
|
+
*/
|
|
244
|
+
generateVueCodeSuggestion(node: FigmaPluginNode): string;
|
|
245
|
+
private generateVueElement;
|
|
246
|
+
private kebabCase;
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=figma-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"figma-client.d.ts","sourceRoot":"","sources":["../src/figma-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,WAAW,GAAG,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC;IAC1E,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,KAAK,CAAC;QACZ,IAAI,EAAE,OAAO,GAAG,iBAAiB,GAAG,OAAO,CAAC;QAC5C,KAAK,CAAC,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KACzD,CAAC,CAAC;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,UAAU,CAAC;IAChD,qBAAqB,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,KAAK,GAAG,eAAe,CAAC;IACnE,qBAAqB,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,OAAO,CAAC;QACd,KAAK,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KACxD,CAAC,CAAC;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC;IAEvB,KAAK,CAAC,EAAE,KAAK,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACvD,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;IACH,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE;QACN,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,KAAK,CAAC,EAAE,KAAK,CAAC;YACZ,IAAI,EAAE,MAAM,CAAC;YACb,KAAK,CAAC,EAAE;gBAAE,CAAC,EAAE,MAAM,CAAC;gBAAC,CAAC,EAAE,MAAM,CAAC;gBAAC,CAAC,EAAE,MAAM,CAAC;gBAAC,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC;SACxD,CAAC,CAAC;KACJ,CAAC;IAEF,mBAAmB,CAAC,EAAE;QACpB,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;QACV,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,WAAW,CAAC,EAAE;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IAEF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4BAA4B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,SAAS,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;QACzB,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;IACH,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;QACrB,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;IACH,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE;QACZ,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;QACV,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KACxC,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAA8B;gBAEjC,MAAM,EAAE,MAAM;IAI1B;;;;OAIG;IACG,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAuB1D;;;;OAIG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAkB3D;;;;OAIG;IACH,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAM1C;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAWzB;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAWrB;;;;OAIG;IACH,WAAW,CAAC,IAAI,EAAE,iBAAiB,GAAG;QACpC,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,EAAE,CAAA;SAAE,CAAC,CAAC;QACnE,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB;IAuCD;;;;OAIG;IACH,OAAO,CAAC,UAAU;IAUlB;;;;OAIG;IACH,uBAAuB,CAAC,QAAQ,EAAE,UAAU,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,GAAG,MAAM;IAsCjF;;;;;OAKG;IACH,6BAA6B,CAC3B,gBAAgB,EAAE,MAAM,EACxB,eAAe,EAAE,MAAM,GACtB,eAAe;IAmDlB;;OAEG;IACH,OAAO,CAAC,aAAa;IAiDrB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA4E1B;;OAEG;IACH,yBAAyB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM;IA0BxD,OAAO,CAAC,kBAAkB;IA2B1B,OAAO,CAAC,SAAS;CAMlB"}
|