Major Changes: - Add StreamingService with OpenAI Compatible format - Upgrade Chat component V2 with Ant Design X integration - Implement AIA module with 12 intelligent agents - Update API routes to unified /api/v1 prefix - Update system documentation Backend (~1300 lines): - common/streaming: OpenAI Compatible adapter - modules/aia: 12 agents, conversation service, streaming integration - Update route versions (RVW, PKB to v1) Frontend (~3500 lines): - modules/aia: AgentHub + ChatWorkspace (100% prototype restoration) - shared/Chat: AIStreamChat, ThinkingBlock, useAIStream Hook - Update API endpoints to v1 Documentation: - AIA module status guide - Universal capabilities catalog - System overview updates - All module documentation sync Tested: Stream response verified, authentication working Status: AIA V2.0 core completed (85%)
408 lines
7.8 KiB
Markdown
408 lines
7.8 KiB
Markdown
# 2025-12-07 <20>𡒊垢 API 摰峕㟲撖寞𦻖摰峕<E691B0>
|
||
|
||
> **<2A>滚之<E6BB9A>𣬚<EFBFBD>蝣?*嚗関ool C <20>滚<EFBFBD>蝡?API 摰峕㟲撖寞𦻖嚗<F0A6BB96>虾隞亦垢<E4BAA6>啁垢瘚贝<E7989A>嚗?
|
||
|
||
---
|
||
|
||
## <20><> 隞餃𦛚璁<F0A69B9A>膩
|
||
|
||
**<EFBFBD>𤑳緵**嚗𡁜<E59A97>蝡?API <20>?Day 1-3 撌脩<E6928C>摰峕㟲撘<E39FB2><E69298>𡢅<EFBFBD>雿<EFBFBD><E99BBF>蝡?API 頝臬<E9A09D>銝滚龪<E6BB9A>?
|
||
|
||
**靽桀<E99DBD>**嚗帋耨甇<E880A8><E79487>蝡?API 靚<>鍂頝臬<E9A09D>嚗<EFBFBD><E59A97><EFBFBD>𣂼<EFBFBD><F0A382BC>𡒊垢撖寞𦻖
|
||
|
||
---
|
||
|
||
## <20>?<3F>𡒊垢 API 皜<><E79A9C>嚗<EFBFBD>歇摰峕<E691B0>嚗?
|
||
|
||
### 1. **Session 蝞∠<E89D9E>** <20>?Day 2 摰峕<E691B0>
|
||
|
||
| API | <20>寞<EFBFBD> | 頝臬<E9A09D> | <20>蠘<EFBFBD> |
|
||
|-----|------|------|------|
|
||
| 銝𠹺<E98A9D><F0A0B9BA><EFBFBD>辣 | POST | `/api/v1/dc/tool-c/sessions/upload` | <20>𥕦遣 Session |
|
||
| <20>瑕<EFBFBD> Session | GET | `/api/v1/dc/tool-c/sessions/:id` | <20>瑕<EFBFBD><E79195><EFBFBD>㺭<EFBFBD>?|
|
||
| <20>瑕<EFBFBD>憸<EFBFBD><E686B8> | GET | `/api/v1/dc/tool-c/sessions/:id/preview` | <20>?00銵峕㺭<E5B395>?|
|
||
| <20>瑕<EFBFBD>摰峕㟲<E5B395>唳旿 | GET | `/api/v1/dc/tool-c/sessions/:id/full` | <20>券<EFBFBD><E588B8>唳旿 |
|
||
| <20>湔鰵敹<E9B0B5>歲 | POST | `/api/v1/dc/tool-c/sessions/:id/heartbeat` | 撱園鵭餈<E9B5AD><E9A488><EFBFBD>園𡢿 |
|
||
| <20>𣳇膄 Session | DELETE | `/api/v1/dc/tool-c/sessions/:id` | <20>𣳇膄 Session |
|
||
|
||
### 2. **AI <20>蠘<EFBFBD>** <20>?Day 3 摰峕<E691B0>
|
||
|
||
| API | <20>寞<EFBFBD> | 頝臬<E9A09D> | <20>蠘<EFBFBD> |
|
||
|-----|------|------|------|
|
||
| <20><><EFBFBD>隞<EFBFBD><E99A9E> | POST | `/api/v1/dc/tool-c/ai/generate` | <20><><EFBFBD> Pandas 隞<><E99A9E> |
|
||
| <20>扯<EFBFBD>隞<EFBFBD><E99A9E> | POST | `/api/v1/dc/tool-c/ai/execute` | <20>扯<EFBFBD>隞<EFBFBD><E99A9E> |
|
||
| **銝<>甇亙<E79487>雿?* | POST | `/api/v1/dc/tool-c/ai/process` | <20><><EFBFBD>+<2B>扯<EFBFBD>+<2B>滩<EFBFBD> 潃?|
|
||
| <20>瑕<EFBFBD><E79195><EFBFBD>蟮 | GET | `/api/v1/dc/tool-c/ai/history/:sessionId` | 撖寡<E69296><E5AFA1><EFBFBD>蟮 |
|
||
|
||
---
|
||
|
||
## <20>圲 隞𦠜𠯫靽桀<E99DBD>
|
||
|
||
### 1. 靽格迤<E6A0BC>滨垢 API 頝臬<E9A09D>
|
||
|
||
**<EFBFBD>桅<EFBFBD>**嚗𡁜<E59A97>蝡航<E89DA1><E888AA>刻楝敺<E6A59D><E695BA><EFBFBD>寥<EFBFBD>
|
||
|
||
```typescript
|
||
// <20>?<3F>躰秤嚗<E7A7A4><E59A97><EFBFBD>㵪<EFBFBD>
|
||
fetch('/api/dc/tool-c/process')
|
||
fetch('/api/dc/tool-c/execute')
|
||
|
||
// <20>?甇<>&嚗<EFBC86>耨憭滚<E686AD>嚗?
|
||
fetch('/api/v1/dc/tool-c/ai/process')
|
||
fetch('/api/v1/dc/tool-c/ai/execute')
|
||
```
|
||
|
||
**靽桀<E99DBD><E6A180><EFBFBD>辣**嚗?
|
||
- <20>?`frontend-v2/src/modules/dc/pages/tool-c/components/Sidebar.tsx`
|
||
|
||
### 2. 靽格迤<E6A0BC>滚<EFBFBD><E6BB9A>唳旿<E594B3>澆<EFBFBD>
|
||
|
||
**<EFBFBD>桅<EFBFBD>**嚗𡁜<E59A97>蝡航<E89DA1><E888AA>?`previewData`嚗<EFBFBD><EFBFBD>蝡舀<EFBFBD><EFBFBD>?`rows`
|
||
|
||
**靽桀<E99DBD>**嚗?
|
||
```typescript
|
||
// <20>?<3F>滨垢<E6BBA8>澆捆銝斤<E98A9D><E696A4>澆<EFBFBD>
|
||
data: preview.data.previewData || preview.data.rows || []
|
||
```
|
||
|
||
**靽桀<E99DBD><E6A180><EFBFBD>辣**嚗?
|
||
- <20>?`frontend-v2/src/modules/dc/pages/tool-c/index.tsx`
|
||
- <20>?`frontend-v2/src/modules/dc/api/toolC.ts`嚗<EFBFBD>掩<EFBFBD>见<EFBFBD>銋㚁<EFBFBD>
|
||
|
||
### 3. 靽格迤 AI 憭<><E686AD><EFBFBD>滚<EFBFBD><E6BB9A>澆<EFBFBD>頧祆揢
|
||
|
||
**<EFBFBD>桅<EFBFBD>**嚗𡁜<E59A97>蝡臬<E89DA1>摨娍聢撘誯<E69298>閬<EFBFBD>蓮<EFBFBD>V蛹<EFBCB6>滨垢 ChatContainer <20><><EFBFBD><EFBFBD><EFBFBD>聢撘?
|
||
|
||
**靽桀<E99DBD>**嚗?
|
||
```typescript
|
||
// <20>?頧祆揢<E7A586>𡒊垢<F0A1928A>滚<EFBFBD>
|
||
return {
|
||
messageId: result.data?.messageId,
|
||
explanation: result.data?.explanation,
|
||
code: result.data?.code,
|
||
success: result.data?.executeResult?.success,
|
||
metadata: {
|
||
newDataPreview: result.data?.executeResult?.newDataPreview,
|
||
},
|
||
};
|
||
```
|
||
|
||
**靽桀<E99DBD><E6A180><EFBFBD>辣**嚗?
|
||
- <20>?`frontend-v2/src/modules/dc/pages/tool-c/components/Sidebar.tsx`
|
||
|
||
---
|
||
|
||
## <20><> API <20>滚<EFBFBD><E6BB9A>澆<EFBFBD>
|
||
|
||
### 1. <20><>辣銝𠹺<E98A9D><F0A0B9BA>滚<EFBFBD>
|
||
|
||
```json
|
||
POST /api/v1/dc/tool-c/sessions/upload
|
||
|
||
Response (201):
|
||
{
|
||
"success": true,
|
||
"message": "Session<6F>𥕦遣<F0A595A6>𣂼<EFBFBD>",
|
||
"data": {
|
||
"sessionId": "xxx",
|
||
"fileName": "data.csv",
|
||
"fileSize": "1.2 MB",
|
||
"totalRows": 1000,
|
||
"totalCols": 10,
|
||
"columns": ["id", "name", "age", ...],
|
||
"expiresAt": "2025-12-07T12:00:00Z",
|
||
"createdAt": "2025-12-07T11:00:00Z"
|
||
}
|
||
}
|
||
```
|
||
|
||
### 2. <20>瑕<EFBFBD>憸<EFBFBD><E686B8><EFBFBD>唳旿<E594B3>滚<EFBFBD>
|
||
|
||
```json
|
||
GET /api/v1/dc/tool-c/sessions/:id/preview
|
||
|
||
Response (200):
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"sessionId": "xxx",
|
||
"fileName": "data.csv",
|
||
"totalRows": 1000,
|
||
"totalCols": 10,
|
||
"columns": ["id", "name", "age", ...],
|
||
"previewRows": 100,
|
||
"previewData": [
|
||
{ "id": 1, "name": "撘牐<E69298>", "age": 25 },
|
||
{ "id": 2, "name": "<22>𤾸<EFBFBD>", "age": 30 },
|
||
...
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
### 3. AI 憭<><E686AD><EFBFBD>滚<EFBFBD>
|
||
|
||
```json
|
||
POST /api/v1/dc/tool-c/ai/process
|
||
|
||
Request:
|
||
{
|
||
"sessionId": "xxx",
|
||
"message": "<22>𨉖ge<67>㛖<EFBFBD>蝻箏仃<E7AE8F>澆‵銵乩蛹撟喳<E6929F><E596B3>?,
|
||
"maxRetries": 3
|
||
}
|
||
|
||
Response (200):
|
||
{
|
||
"success": true,
|
||
"message": "憭<EFBFBD><EFBFBD><EFBFBD>𣂼<EFBFBD>",
|
||
"data": {
|
||
"messageId": "msg-123",
|
||
"explanation": "憟賜<EFBFBD>嚗峕<EFBFBD>撠<EFBFBD>葬<EFBFBD>典<EFBFBD>age<EFBFBD>㛖<EFBFBD>蝻箏仃<EFBFBD>澆‵銵乩蛹撟喳<EFBFBD><EFBFBD>潦<EFBFBD>?,
|
||
"code": "df['age'].fillna(df['age'].mean(), inplace=True)",
|
||
"executeResult": {
|
||
"success": true,
|
||
"result": "<22>𣂼<EFBFBD>憛怨‘ 15 銝芰撩憭勗<E686AD>?,
|
||
"newDataPreview": [
|
||
{ "id": 1, "name": "撘牐<EFBFBD>", "age": 25 },
|
||
{ "id": 2, "name": "<EFBFBD>𤾸<EFBFBD>", "age": 27.5 },
|
||
...
|
||
]
|
||
},
|
||
"retryCount": 0
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## <20>㴓 蝡臬<E89DA1>蝡舀<E89DA1>蝔?
|
||
|
||
### 摰峕㟲<E5B395>冽<EFBFBD>瘚<EFBFBD><E7989A>
|
||
|
||
```
|
||
1. <20>冽<EFBFBD>銝𠹺<E98A9D><F0A0B9BA><EFBFBD>辣
|
||
<20>?
|
||
POST /api/v1/dc/tool-c/sessions/upload
|
||
<20>?
|
||
餈𥪜<E9A488> sessionId
|
||
|
||
2. <20>芸𢆡<E88AB8>瑕<EFBFBD>憸<EFBFBD><E686B8><EFBFBD>唳旿
|
||
<20>?
|
||
GET /api/v1/dc/tool-c/sessions/:id/preview
|
||
<20>?
|
||
<20>曄內<E69B84>唳旿銵冽聢 + <20><>揢<EFBFBD>?AI 撖寡<E69296><E5AFA1>屸𢒰
|
||
|
||
3. <20>冽<EFBFBD>颲枏<E9A2B2> AI <20><>誘
|
||
<20>?
|
||
POST /api/v1/dc/tool-c/ai/process
|
||
<20>?
|
||
餈𥪜<E9A488>隞<EFBFBD><E99A9E> + <20>扯<EFBFBD>蝏𤘪<E89D8F>
|
||
|
||
4. <20>芸𢆡<E88AB8>湔鰵銵冽聢<E586BD>唳旿
|
||
<20>?
|
||
<20>曄內<E69B84>啁<EFBFBD><E59581>唳旿憸<E697BF><E686B8>
|
||
```
|
||
|
||
---
|
||
|
||
## <20><> 瘚贝<E7989A><E8B49D><EFBFBD><EFBFBD>
|
||
|
||
### 1. <20>臬𢆡<E887AC>滚𦛚
|
||
|
||
```bash
|
||
# <20>𡒊垢
|
||
cd AIclinicalresearch/backend
|
||
npm run dev
|
||
|
||
# <20>滨垢
|
||
cd AIclinicalresearch/frontend-v2
|
||
npm run dev
|
||
|
||
# Python 敺格<E695BA><E6A0BC>?
|
||
cd AIclinicalresearch/extraction_service
|
||
python main.py
|
||
```
|
||
|
||
### 2. 瘚贝<E7989A>甇仿炊
|
||
|
||
1. <20>?**霈輸䔮憿菟𢒰**
|
||
- URL: http://localhost:5173/data-cleaning/tool-c
|
||
- 摨磰砲<E7A3B0>见<EFBFBD>"銝𠹺<E98A9D><F0A0B9BA>唳旿<E594B3><E697BF>辣"<22>箏<EFBFBD>
|
||
|
||
2. <20>?**銝𠹺<E98A9D><F0A0B9BA><EFBFBD>辣**
|
||
- <20>孵稬"<22>㗇𥋘<E39787><F0A58B98>辣"
|
||
- 銝𠹺<E98A9D> CSV <20>?Excel <20><>辣嚗?10MB嚗?
|
||
- 摨磰砲<E7A3B0>芸𢆡<E88AB8><F0A286A1>揢<EFBFBD>?AI 撖寡<E69296><E5AFA1>屸𢒰
|
||
|
||
3. <20>?**AI 撖寡<E69296>**
|
||
- <20>刻<EFBFBD><E588BB>交<EFBFBD>颲枏<E9A2B2><E69E8F><EFBFBD>誘嚗䔶<E59A97>憒<EFBFBD><E68692>
|
||
- "<22>曄內<E69B84>?0銵峕㺭<E5B395>?
|
||
- "<22>𨉖ge<67>㛖<EFBFBD>蝻箏仃<E7AE8F>澆‵銵乩蛹撟喳<E6929F><E596B3>?
|
||
- "<22>𣳇膄<F0A3B387>滚<EFBFBD>銵?
|
||
- 摨磰砲<E7A3B0>见<EFBFBD> AI <20><><EFBFBD>隞<EFBFBD><E99A9E>撟嗉䌊<E59789>冽<EFBFBD>銵?
|
||
|
||
4. <20>?**撉諹<E69289><E8ABB9>唳旿<E594B3>湔鰵**
|
||
- 撌虫儒銵冽聢摨磰砲<E7A3B0>芸𢆡<E88AB8>湔鰵
|
||
- <20>曄內憭<E585A7><E686AD><EFBFBD>𡒊<EFBFBD><F0A1928A>唳旿
|
||
|
||
### 3. 瘚贝<E7989A><E8B49D>唳旿
|
||
|
||
<EFBFBD>刻<EFBFBD>雿輻鍂嚗?
|
||
- `AIclinicalresearch/test_data/cqol-demo.csv`嚗<EFBFBD>龫摮行㺭<EFBFBD>殷<EFBFBD>
|
||
- <20>碶遙雿?CSV/Excel <20><>辣嚗?10MB嚗?
|
||
|
||
---
|
||
|
||
## <20><> 靽格㺿皜<E3BABF><E79A9C>
|
||
|
||
| <20><>辣 | 銵<>噡 | 靽格㺿<E6A0BC><E3BABF>捆 | <20>嗆<EFBFBD>?|
|
||
|------|------|----------|------|
|
||
| `Sidebar.tsx` | 43 | 靽格迤<E6A0BC>扯<EFBFBD>隞<EFBFBD><E99A9E> API 頝臬<E9A09D> | <20>?|
|
||
| `Sidebar.tsx` | 122-136 | 靽格迤 AI 憭<><E686AD> API 頝臬<E9A09D><E887AC><EFBFBD><EFBFBD>摨磰蓮<E7A3B0>?| <20>?|
|
||
| `index.tsx` | 82 | <20>澆捆 `previewData` <20>?`rows` | <20>?|
|
||
| `toolC.ts` | 47 | <20>湔鰵 `PreviewData` 蝐餃<E89D90>摰帋<E691B0> | <20>?|
|
||
|
||
---
|
||
|
||
## <20>?撉諹<E69289>蝏𤘪<E89D8F>
|
||
|
||
### Linter 璉<><E79289>?
|
||
|
||
- <20>?**<2A>躰秤<E8BAB0>?*嚗?
|
||
- <20>𩤃<EFBFBD> **霅血<E99C85><E8A180>?*嚗?嚗<>𧊋雿輻鍂<E8BCBB>?`handleSendMessage`嚗<EFBFBD>虾敹賜裦嚗?
|
||
|
||
### <20>蠘<EFBFBD>撉諹<E69289>
|
||
|
||
| <20>蠘<EFBFBD> | <20>嗆<EFBFBD>?| 憭<>釣 |
|
||
|------|------|------|
|
||
| 憿菟𢒰<E88F9F>㰘蝸 | <20>?| <20>䭾𥁒<E4ADBE>?|
|
||
| <20><>辣銝𠹺<E98A9D> UI | <20>?| 甇<>虜<EFBFBD>曄內 |
|
||
| API 頝臬<E9A09D> | <20>?| <20>寥<EFBFBD><E5AFA5>𡒊垢 |
|
||
| 蝐餃<E89D90>摰帋<E691B0> | <20>?| 摰峕㟲 |
|
||
| 蝡臬<E89DA1>蝡舀<E89DA1>蝔?| <20>?| 敺<><E695BA>霂?|
|
||
|
||
---
|
||
|
||
## <20><> <20>𣬚<EFBFBD>蝣?
|
||
|
||
**<EFBFBD>?Tool C <20>滚<EFBFBD>蝡?API 摰峕㟲撖寞𦻖摰峕<E691B0>嚗?*
|
||
|
||
### <20>詨<EFBFBD><E8A9A8>𣂼停
|
||
|
||
1. <20>?**<2A>𡒊垢 API 撌脣<E6928C><E884A3>?*
|
||
- Day 1: Python 敺格<E695BA><E6A0BC>∴<EFBFBD>隞<EFBFBD><E99A9E><EFBFBD>扯<EFBFBD>嚗?
|
||
- Day 2: Session 蝞∠<E89D9E>嚗<EFBFBD><E59A97>隞嗡<E99A9E>隡𨬭<E99AA1><F0A8ACAD>㺭<EFBFBD>桀<EFBFBD><E6A180>剁<EFBFBD>
|
||
- Day 3: AI 隞<><E99A9E><EFBFBD><EFBFBD><EFBFBD>嚗㇄eepSeek-V3 <20><><EFBFBD>嚗?
|
||
|
||
2. <20>?**<2A>滨垢 API 靚<>鍂撌脖耨甇?*
|
||
- 頝臬<E9A09D><E887AC>寥<EFBFBD>
|
||
- <20>唳旿<E594B3>澆<EFBFBD><E6BE86>澆捆
|
||
- <20>滚<EFBFBD>頧祆揢甇<E68FA2>&
|
||
|
||
3. <20>?**<2A>臭誑餈𥡝<E9A488>蝡臬<E89DA1>蝡舀<E89DA1>霂?*
|
||
- 銝𠹺<E98A9D><F0A0B9BA><EFBFBD>辣 <20>?<3F>曄內<E69B84>唳旿 <20>?AI 撖寡<E69296> <20>?<3F>扯<EFBFBD>隞<EFBFBD><E99A9E> <20>?<3F>湔鰵銵冽聢
|
||
|
||
---
|
||
|
||
## <20><> 銝衤<E98A9D>甇?
|
||
|
||
### 蝡见朖<E8A781>臬<EFBFBD>
|
||
|
||
1. <20>?**<2A>瑟鰵瘚讛<E7989A><E8AE9B>?*
|
||
2. <20>?**銝𠹺<E98A9D>瘚贝<E7989A><E8B49D><EFBFBD>辣**
|
||
3. <20>?**瘚贝<E7989A> AI 撖寡<E69296><E5AFA1>蠘<EFBFBD>**
|
||
|
||
### 敺<><E695BA><EFBFBD>吔<EFBFBD><E59094>鮋獈憛痹<E6869B>
|
||
|
||
1. <20>?隡睃<E99AA1><E79D83>躰秤<E8BAB0>鞟內
|
||
2. <20>?瘛餃<E7989B><E9A483>㰘蝸<E3B098>嗆<EFBFBD><E59786>𢆡<EFBFBD>?
|
||
3. <20>?憓𧼮撩隞<E692A9><E99A9E>擃䀝漁
|
||
4. <20>?<3F>舀<EFBFBD><E88880>日<EFBFBD>/<2F>滚<EFBFBD>
|
||
5. <20>?撖澆枂<E6BE86>唳旿<E594B3>蠘<EFBFBD>
|
||
|
||
---
|
||
|
||
## <20><> 隞<><E99A9E>蝏蠘恣
|
||
|
||
| 蝏<>辣 | 隞<><E99A9E>銵峕㺭 | <20>嗆<EFBFBD>?|
|
||
|------|---------|------|
|
||
| Python 敺格<E695BA><E6A0BC>?| ~430 銵?| <20>?Day 1 |
|
||
| Node.js <20>𡒊垢 | ~2650 銵?| <20>?Day 2-3 |
|
||
| <20>滨垢 React | ~1100 銵?| <20>?Day 4-5 |
|
||
| <20>𡁶鍂 Chat 蝏<>辣 | ~968 銵?| <20>?Day 5 |
|
||
| **<EFBFBD>餉恣** | **~5148 銵?* | **<EFBFBD>?摰峕<E691B0>** |
|
||
|
||
---
|
||
|
||
## <20><> <20>餌<EFBFBD>
|
||
|
||
**Tool C MVP 撘<><E69298>穃<EFBFBD><E7A983>琜<EFBFBD>**
|
||
|
||
- <20>?<3F>滚<EFBFBD>蝡?API 摰峕㟲撖寞𦻖
|
||
- <20>?<3F>臭誑餈𥡝<E9A488>蝡臬<E89DA1>蝡舀<E89DA1>霂?
|
||
- <20>?AI 撖寡<E69296> + <20>唳旿憭<E697BF><E686AD><EFBFBD>蠘<EFBFBD>撠梁貌
|
||
- <20>?<3F>箔<EFBFBD> Ant Design X <20><>緵隞<E7B7B5><E99A9E> UI
|
||
|
||
**<EFBFBD>啣銁<EFBFBD>臭誑撘<EFBFBD>憪𧢲<EFBFBD>霂訫<EFBFBD><EFBFBD>游<EFBFBD><EFBFBD>賭<EFBFBD>嚗?* <20><>
|
||
|
||
---
|
||
|
||
**撘<><E69298>𤏸<EFBFBD>?*嚗鋫I Assistant
|
||
**<EFBFBD>交<EFBFBD>**嚗?025-12-07
|
||
**<EFBFBD><EFBFBD>𧋦**嚗鐝VP v1.0
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|