@qilin-agent/sdk-minimal 3.1.5 → 3.1.6
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/README.i18n.yaml +16 -16
- package/README.md +9 -7
- package/README.zh.md +9 -7
- package/cordis.patch.yml +25 -0
- package/package.json +35 -29
package/README.i18n.yaml
CHANGED
|
@@ -3,23 +3,23 @@
|
|
|
3
3
|
# After editing either side, bring the other along and re-record with:
|
|
4
4
|
# pnpm run verify-translation-pairing --write packages/bundle/sdk-minimal/README.md
|
|
5
5
|
/:
|
|
6
|
-
en:
|
|
7
|
-
zh:
|
|
6
|
+
en: 055d820e7d59a8d2
|
|
7
|
+
zh: a1c6acf5ff5d1d7f
|
|
8
8
|
/qilin-agent-sdk-minimal:
|
|
9
9
|
en: 981f63056421cbc4
|
|
10
10
|
zh: 02bab870cd4c4c4f
|
|
11
11
|
/qilin-agent-sdk-minimal/summary:
|
|
12
|
-
en:
|
|
13
|
-
zh:
|
|
12
|
+
en: 06a00fcc3c05dc1b
|
|
13
|
+
zh: 5031c8db42056d5b
|
|
14
14
|
/qilin-agent-sdk-minimal/table-of-contents:
|
|
15
15
|
en: d152484eb41ac6b4
|
|
16
16
|
zh: 09388d293f9be9cb
|
|
17
17
|
/qilin-agent-sdk-minimal/use-this-package:
|
|
18
|
-
en:
|
|
19
|
-
zh:
|
|
18
|
+
en: 6ec662542bf81f28
|
|
19
|
+
zh: 0c6f794511fa14b0
|
|
20
20
|
/qilin-agent-sdk-minimal/understand-the-implementation:
|
|
21
|
-
en:
|
|
22
|
-
zh:
|
|
21
|
+
en: e635a512796dccea
|
|
22
|
+
zh: 9e07915a8b89a535
|
|
23
23
|
/qilin-agent-sdk-minimal/understand-the-implementation/source-map:
|
|
24
24
|
en: 3784c554e96ab004
|
|
25
25
|
zh: 0a05d4fe1e26b3b1
|
|
@@ -33,17 +33,17 @@
|
|
|
33
33
|
en: bd87e16b0c6e0506
|
|
34
34
|
zh: c8ee5e3b4578754e
|
|
35
35
|
/qilin-agent-sdk-minimal/model-experience/minimal-coding-agent-composition/what-the-model-sees:
|
|
36
|
-
en:
|
|
37
|
-
zh:
|
|
36
|
+
en: ca5812b676fca755
|
|
37
|
+
zh: d598d6adba1fb509
|
|
38
38
|
/qilin-agent-sdk-minimal/model-experience/minimal-coding-agent-composition/token-effect:
|
|
39
|
-
en:
|
|
40
|
-
zh:
|
|
39
|
+
en: d9214b2e1d3b505b
|
|
40
|
+
zh: f2fe93fb1328045a
|
|
41
41
|
/qilin-agent-sdk-minimal/model-experience/minimal-coding-agent-composition/kv-cache-effect:
|
|
42
|
-
en:
|
|
43
|
-
zh:
|
|
42
|
+
en: dd887b6519f40ab3
|
|
43
|
+
zh: 80d64fe177a8a011
|
|
44
44
|
/qilin-agent-sdk-minimal/known-limitations-and-deferred-work:
|
|
45
|
-
en:
|
|
46
|
-
zh:
|
|
45
|
+
en: 8a864ddd73ac6857
|
|
46
|
+
zh: 80064ba462c5d7df
|
|
47
47
|
/qilin-agent-sdk-minimal/known-limitations-and-deferred-work/dev-note:
|
|
48
48
|
en: e67f633dc6fe7773
|
|
49
49
|
zh: e88aeb617ffb74ea
|
package/README.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: "Standalone SDK profile with
|
|
2
|
+
description: "Standalone SDK profile with a persistent shell, image reading, and automatic context compaction for users who need a minimal cross-platform coding agent without the shared base bundle."
|
|
3
3
|
kind: "package-bundle"
|
|
4
4
|
---
|
|
5
5
|
|
|
@@ -9,7 +9,7 @@ English | [中文](README.zh.md)
|
|
|
9
9
|
|
|
10
10
|
## Summary
|
|
11
11
|
|
|
12
|
-
Use `qilin --profile sdk-minimal` when an SDK client needs a small, explicit coding-agent runtime. By default, the profile advertises
|
|
12
|
+
Use `qilin --profile sdk-minimal` when an SDK client needs a small, explicit coding-agent runtime. By default, the profile advertises a platform-selected persistent shell and `read_image`, automatically summarizes older context when it reaches the configured pressure, persists sessions as uncompressed JSONL, and selects the model from the SDK initialization request. It supplies a complete Cordis tree and deliberately excludes `qilin-base`, Web, settings, managed credentials, telemetry, text file tools, workspace instructions, skills, jobs, and subagents. Its danger-full-access policy lets the shell modify any path available to the process, so use it only with an isolated workspace.
|
|
13
13
|
|
|
14
14
|
## Table of Contents
|
|
15
15
|
|
|
@@ -38,7 +38,7 @@ Use `qilin plugin --profile sdk-minimal` to manage persistent external dependenc
|
|
|
38
38
|
|
|
39
39
|
The profile mounts exactly one persistent shell stack: Bash on Linux and macOS, or PowerShell on Windows. Both stacks use a 300-second timeout and one owner-scoped terminal; the other platform's rows remain disabled.
|
|
40
40
|
|
|
41
|
-
Like every shipped profile, it mounts [MCP resources](../../mcp/mcp-resources/README.md) once. Configure only [MCP client entries](../../mcp/mcp-client/README.md) to add servers. Clients mounted by another provider also count as configured. With no server configured in the caller's scope, MCP contributes no prompt text or tools and the default remains one shell tool
|
|
41
|
+
Like every shipped profile, it mounts [MCP resources](../../mcp/mcp-resources/README.md) once. Configure only [MCP client entries](../../mcp/mcp-client/README.md) to add servers. Clients mounted by another provider also count as configured. With no server configured in the caller's scope, MCP contributes no prompt text or tools and the default remains one shell tool and `read_image`.
|
|
42
42
|
|
|
43
43
|
-----
|
|
44
44
|
|
|
@@ -48,7 +48,7 @@ Like every shipped profile, it mounts [MCP resources](../../mcp/mcp-resources/RE
|
|
|
48
48
|
<details>
|
|
49
49
|
<summary>Implementation internals — click to expand</summary>
|
|
50
50
|
|
|
51
|
-
The bundle's single insert is the complete application tree: SDK stdio startup and JSON-RPC serving, one environment-configured DeepSeek adapter, the explicit agent core, conditional MCP resource tools, local subprocess execution, a platform-selected persistent shell PTY, and uncompressed JSONL persistence under `$QILIN_HOME/sessions`. It does not inherit another bundle, so every extra row is an explicit profile change.
|
|
51
|
+
The bundle's single insert is the complete application tree: SDK stdio startup and JSON-RPC serving, one environment-configured DeepSeek adapter, the explicit agent core, conditional MCP resource tools, local filesystem and image attachments, automatic context compaction with image offload, local subprocess execution, a platform-selected persistent shell PTY, and uncompressed JSONL persistence under `$QILIN_HOME/sessions`. `tool-fs` runs with `read`, `write`, and `edit` off, so only `read_image` joins the shell tool. It does not inherit another bundle, so every extra row is an explicit profile change.
|
|
52
52
|
|
|
53
53
|
### Source map
|
|
54
54
|
|
|
@@ -78,21 +78,23 @@ The bundle's single insert is the complete application tree: SDK stdio startup a
|
|
|
78
78
|
|
|
79
79
|
#### What the model sees
|
|
80
80
|
|
|
81
|
-
The system prompt is `QILIN_SYSTEM_PROMPT` or `You are a helpful software engineer assistant.`. With no MCP server configured, the
|
|
81
|
+
The system prompt is `QILIN_SYSTEM_PROMPT` or `You are a helpful software engineer assistant.`. With no MCP server configured, the advertised tools are owner-scoped persistent `bash` on Linux/macOS or `pwsh` on Windows and `read_image`; runtime context, text file tools, workspace instructions, skills, jobs controls, and Harness identity are absent.
|
|
82
82
|
|
|
83
83
|
#### Token effect
|
|
84
84
|
|
|
85
|
-
By default, one stable persona plus
|
|
85
|
+
By default, one stable persona plus two tool schemas. Configured MCP servers add their tools, shared resource tools, and available server instructions. Images consume model input tokens. When images exceed the route budget, [image offload](../../compaction/compaction-image-offload/README.md) permanently replaces older image occurrences with attachment/path placeholders and retries the request or compaction summary. Automatic compaction sends an additional summarization request when context pressure reaches the configured threshold and replaces older model-visible history with its summary; the durable JSONL log retains those events.
|
|
86
86
|
|
|
87
87
|
#### KV Cache effect
|
|
88
88
|
|
|
89
|
-
Stable for a fixed persona, platform, provider, model, and bundle patch stack. Profile changes take effect on the next process.
|
|
89
|
+
Stable for a fixed persona, platform, provider, model, and bundle patch stack. Compaction replaces part of the request history and can reduce cache reuse. Image offload also ends cache reuse at the first changed image. Profile changes take effect on the next process.
|
|
90
90
|
|
|
91
91
|
## Known Limitations and Deferred Work
|
|
92
92
|
|
|
93
93
|
<a id="known-limitations-and-deferred-work"></a>
|
|
94
94
|
|
|
95
95
|
- **The composition intentionally omits shared product services** — select `qilin --profile sdk` when settings, managed credentials, policy presets, telemetry, Web tools, or the full default tool roster are required.
|
|
96
|
+
- **Image reading requires an image-capable model** — select a route whose adapter declares image input; text-only routes return a tool error. Images are stored under `$QILIN_HOME/attachments/v1`.
|
|
97
|
+
- **Compaction is automatic** — configure [compaction-basic](../../compaction/compaction-basic/README.md) through profile patches. SDK prompt text does not execute `/compact` or other slash commands.
|
|
96
98
|
- **User patches can expand the tree and corrupt stdout** — profile customization is trusted application composition; a plugin that writes ordinary text to stdout can break JSON-RPC framing.
|
|
97
99
|
|
|
98
100
|
<a id="dev-note"></a>
|
package/README.zh.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: "供需要不含共享 base bundle 的极简跨平台 coding agent(编程智能体)的用户使用的独立 SDK profile
|
|
2
|
+
description: "供需要不含共享 base bundle 的极简跨平台 coding agent(编程智能体)的用户使用的独立 SDK profile,提供持久 shell、图像读取与自动上下文压缩。"
|
|
3
3
|
kind: "package-bundle"
|
|
4
4
|
---
|
|
5
5
|
|
|
@@ -9,7 +9,7 @@ kind: "package-bundle"
|
|
|
9
9
|
|
|
10
10
|
## 概述
|
|
11
11
|
|
|
12
|
-
当 SDK 客户端需要小型、显式的 coding agent 运行时时,请使用 `qilin --profile sdk-minimal`。该 profile
|
|
12
|
+
当 SDK 客户端需要小型、显式的 coding agent 运行时时,请使用 `qilin --profile sdk-minimal`。该 profile 默认公布按平台选择的持久 shell 与 `read_image`,在上下文压力达到阈值时自动总结较早历史,把会话持久化为未压缩 JSONL,并从 SDK 初始化请求选择模型。它提供完整 Cordis 配置树,并刻意排除 `qilin-base`、Web、settings、托管凭据、遥测、文本文件工具、workspace 指令、skill(技能)、jobs 与 subagent。其 danger-full-access 策略允许 shell 修改进程可访问的任何路径,因此只能配合隔离 workspace 使用。
|
|
13
13
|
|
|
14
14
|
## 目录
|
|
15
15
|
|
|
@@ -38,7 +38,7 @@ qilin --profile sdk-minimal
|
|
|
38
38
|
|
|
39
39
|
该 profile 只挂载一套持久 shell:Linux 和 macOS 使用 Bash,Windows 使用 PowerShell。两套配置都使用 300 秒超时与一个 agent 自有终端;另一平台的配置项保持禁用。
|
|
40
40
|
|
|
41
|
-
与其他随附 profile 一样,它统一挂载 [MCP 资源](../../mcp/mcp-resources/README.zh.md)一次。只需配置 [MCP 客户端条目](../../mcp/mcp-client/README.zh.md)即可添加服务器。其他提供方挂载的客户端也属于已配置状态。调用方作用域中未配置服务器时,MCP 不贡献提示词文本或工具,默认仍只有一个 shell
|
|
41
|
+
与其他随附 profile 一样,它统一挂载 [MCP 资源](../../mcp/mcp-resources/README.zh.md)一次。只需配置 [MCP 客户端条目](../../mcp/mcp-client/README.zh.md)即可添加服务器。其他提供方挂载的客户端也属于已配置状态。调用方作用域中未配置服务器时,MCP 不贡献提示词文本或工具,默认仍只有一个 shell 工具与 `read_image`。
|
|
42
42
|
|
|
43
43
|
-----
|
|
44
44
|
|
|
@@ -48,7 +48,7 @@ qilin --profile sdk-minimal
|
|
|
48
48
|
<details>
|
|
49
49
|
<summary>实现细节——点击展开</summary>
|
|
50
50
|
|
|
51
|
-
该 bundle 的单个 insert 就是完整应用配置树:SDK stdio 启动与 JSON-RPC 服务、一个由环境配置的 DeepSeek 适配器、显式 agent 核心、按配置启用的 MCP
|
|
51
|
+
该 bundle 的单个 insert 就是完整应用配置树:SDK stdio 启动与 JSON-RPC 服务、一个由环境配置的 DeepSeek 适配器、显式 agent 核心、按配置启用的 MCP 资源工具、本地文件系统与图像附件、带图像 offload 的自动上下文压缩(compaction)、本地子进程执行、按平台选择的持久 shell PTY,以及位于 `$QILIN_HOME/sessions` 的未压缩 JSONL 持久化。`tool-fs` 关闭 `read`、`write` 与 `edit`,因此只有 `read_image` 与 shell 工具一并提供。它不继承其他 bundle,因此每个额外配置项都是显式 profile 变更。
|
|
52
52
|
|
|
53
53
|
### 源码地图
|
|
54
54
|
|
|
@@ -78,21 +78,23 @@ qilin --profile sdk-minimal
|
|
|
78
78
|
|
|
79
79
|
#### 模型看到的内容
|
|
80
80
|
|
|
81
|
-
系统提示词取 `QILIN_SYSTEM_PROMPT`,未设置时使用 `You are a helpful software engineer assistant.`。未配置 MCP
|
|
81
|
+
系统提示词取 `QILIN_SYSTEM_PROMPT`,未设置时使用 `You are a helpful software engineer assistant.`。未配置 MCP 服务器时,对外公布的工具是 Linux/macOS 上 agent 所有的持久 `bash` 或 Windows 上的 `pwsh`,以及 `read_image`;运行时上下文、文本文件工具、workspace 指令、skill、jobs 控制与 Harness 身份均不存在。
|
|
82
82
|
|
|
83
83
|
#### Token 影响
|
|
84
84
|
|
|
85
|
-
默认是一个稳定 persona
|
|
85
|
+
默认是一个稳定 persona 加两个工具 schema。已配置 MCP 服务器会添加自己的工具、共享资源工具及可用的服务器指令。图像消耗模型输入 token。图像超出路由预算时,[图像 offload](../../compaction/compaction-image-offload/README.zh.md) 会把较早的图像永久替换为附件/路径占位符,并重试该请求或压缩总结。自动压缩在上下文压力达到配置阈值时额外发送一次总结请求,并用总结替换较早的模型可见历史;持久 JSONL 日志仍保留这些事件。
|
|
86
86
|
|
|
87
87
|
#### KV Cache 影响
|
|
88
88
|
|
|
89
|
-
当 persona、平台、提供方、模型与 bundle patch
|
|
89
|
+
当 persona、平台、提供方、模型与 bundle patch 栈固定时保持稳定。压缩会替换部分请求历史,可能降低缓存复用率。图像 offload 在首个变化的图像处结束缓存复用。Profile 变更在下一个进程生效。
|
|
90
90
|
|
|
91
91
|
## 已知限制与延期工作
|
|
92
92
|
|
|
93
93
|
<a id="known-limitations-and-deferred-work"></a>
|
|
94
94
|
|
|
95
95
|
- **该组合刻意省略共享产品服务** — 需要 settings、托管凭据、策略预设、遥测、Web 工具或完整默认工具清单时,请选择 `qilin --profile sdk`。
|
|
96
|
+
- **图像读取需要支持图像的模型** — 请选择适配器声明了图像输入的路由;纯文本路由会返回工具错误。图像保存在 `$QILIN_HOME/attachments/v1` 下。
|
|
97
|
+
- **压缩是自动的** — 可通过 profile patch 配置 [compaction-basic](../../compaction/compaction-basic/README.zh.md)。SDK 提示词文本不会执行 `/compact` 或其他斜杠命令。
|
|
96
98
|
- **用户 patch 可以扩展配置树并破坏 stdout** — profile 自定义属于受信任的应用组合;向 stdout 写入普通文本的插件会破坏 JSON-RPC 分帧。
|
|
97
99
|
|
|
98
100
|
<a id="dev-note"></a>
|
package/cordis.patch.yml
CHANGED
|
@@ -33,11 +33,36 @@
|
|
|
33
33
|
- id: sandbox
|
|
34
34
|
name: '@qilin-agent/sandbox-local'
|
|
35
35
|
|
|
36
|
+
- id: filesystem
|
|
37
|
+
name: '@qilin-agent/fs-local'
|
|
38
|
+
|
|
39
|
+
- id: attachment-local
|
|
40
|
+
name: '@qilin-agent/attachment-local'
|
|
41
|
+
|
|
42
|
+
# Image reading without the text tools: the minimal profile keeps its one
|
|
43
|
+
# shell tool and adds only `read_image`.
|
|
44
|
+
- id: tool-fs
|
|
45
|
+
name: '@qilin-agent/tool-fs'
|
|
46
|
+
config:
|
|
47
|
+
read: false
|
|
48
|
+
readImage: true
|
|
49
|
+
write: false
|
|
50
|
+
edit: false
|
|
51
|
+
|
|
36
52
|
# Shared projection registry: sandbox-policy and terminal-bash fold
|
|
37
53
|
# sandbox-mode state through its units and require it as a hard injection.
|
|
38
54
|
- id: session-projection
|
|
39
55
|
name: '@qilin-agent/session-projection'
|
|
40
56
|
|
|
57
|
+
- id: token-meter
|
|
58
|
+
name: '@qilin-agent/token-meter'
|
|
59
|
+
|
|
60
|
+
- id: compaction-basic
|
|
61
|
+
name: '@qilin-agent/compaction-basic'
|
|
62
|
+
|
|
63
|
+
- id: image-offload
|
|
64
|
+
name: '@qilin-agent/compaction-image-offload'
|
|
65
|
+
|
|
41
66
|
- id: sandbox-policy
|
|
42
67
|
name: '@qilin-agent/sandbox-policy'
|
|
43
68
|
config:
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@qilin-agent/sdk-minimal",
|
|
3
3
|
"description": "The standalone minimal SDK profile bundle: JSON-RPC, one DeepSeek adapter, persistent shell, and JSONL sessions",
|
|
4
|
-
"version": "3.1.
|
|
4
|
+
"version": "3.1.6",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
@@ -37,37 +37,43 @@
|
|
|
37
37
|
}
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@qilin-agent/kylin-plugin-timer": "~1.1.
|
|
41
|
-
"@qilin-agent/agent": "3.1.
|
|
42
|
-
"@qilin-agent/agent-loop": "3.1.
|
|
43
|
-
"@qilin-agent/
|
|
44
|
-
"@qilin-agent/
|
|
45
|
-
"@qilin-agent/
|
|
46
|
-
"@qilin-agent/llm-
|
|
47
|
-
"@qilin-agent/
|
|
48
|
-
"@qilin-agent/llm
|
|
49
|
-
"@qilin-agent/
|
|
50
|
-
"@qilin-agent/
|
|
51
|
-
"@qilin-agent/
|
|
52
|
-
"@qilin-agent/
|
|
53
|
-
"@qilin-agent/
|
|
54
|
-
"@qilin-agent/
|
|
55
|
-
"@qilin-agent/
|
|
56
|
-
"@qilin-agent/
|
|
57
|
-
"@qilin-agent/session-
|
|
58
|
-
"@qilin-agent/
|
|
59
|
-
"@qilin-agent/
|
|
60
|
-
"@qilin-agent/session-projection": "3.1.
|
|
61
|
-
"@qilin-agent/
|
|
62
|
-
"@qilin-agent/
|
|
63
|
-
"@qilin-agent/
|
|
64
|
-
"@qilin-agent/
|
|
65
|
-
"@qilin-agent/
|
|
40
|
+
"@qilin-agent/kylin-plugin-timer": "~1.1.7",
|
|
41
|
+
"@qilin-agent/agent": "3.1.6",
|
|
42
|
+
"@qilin-agent/agent-loop": "3.1.6",
|
|
43
|
+
"@qilin-agent/compaction-image-offload": "3.1.6",
|
|
44
|
+
"@qilin-agent/compaction-basic": "3.1.6",
|
|
45
|
+
"@qilin-agent/attachment-local": "3.1.6",
|
|
46
|
+
"@qilin-agent/deepseek-llm-api-extensions": "3.1.6",
|
|
47
|
+
"@qilin-agent/jobs-local": "3.1.6",
|
|
48
|
+
"@qilin-agent/llm": "3.1.6",
|
|
49
|
+
"@qilin-agent/llm-retry": "3.1.6",
|
|
50
|
+
"@qilin-agent/fs-local": "3.1.6",
|
|
51
|
+
"@qilin-agent/llm-deepseek-api-key": "3.1.6",
|
|
52
|
+
"@qilin-agent/sandbox-local": "3.1.6",
|
|
53
|
+
"@qilin-agent/plugin-package-inventory-deepseek": "3.1.6",
|
|
54
|
+
"@qilin-agent/sandbox-policy": "3.1.6",
|
|
55
|
+
"@qilin-agent/mcp-resources": "3.1.6",
|
|
56
|
+
"@qilin-agent/session": "3.1.6",
|
|
57
|
+
"@qilin-agent/session-log-deepseek": "3.1.6",
|
|
58
|
+
"@qilin-agent/sdk-app": "3.1.6",
|
|
59
|
+
"@qilin-agent/session-persistence-jsonl": "3.1.6",
|
|
60
|
+
"@qilin-agent/session-projection": "3.1.6",
|
|
61
|
+
"@qilin-agent/session-title": "3.1.6",
|
|
62
|
+
"@qilin-agent/sdk-jsonrpc-server": "3.1.6",
|
|
63
|
+
"@qilin-agent/subprocess-local": "3.1.6",
|
|
64
|
+
"@qilin-agent/terminal-bash": "3.1.6",
|
|
65
|
+
"@qilin-agent/tool-bash-persistent": "3.1.6",
|
|
66
|
+
"@qilin-agent/token-meter": "3.1.6",
|
|
67
|
+
"@qilin-agent/tool-fs": "3.1.6",
|
|
68
|
+
"@qilin-agent/tools": "3.1.6",
|
|
69
|
+
"@qilin-agent/tool-pwsh-persistent": "3.1.6",
|
|
70
|
+
"@qilin-agent/terminal": "3.1.6",
|
|
71
|
+
"@qilin-agent/system-prompt": "3.1.6"
|
|
66
72
|
},
|
|
67
73
|
"peerDependencies": {
|
|
68
|
-
"@qilin-agent/kylin": "~4.0.
|
|
74
|
+
"@qilin-agent/kylin": "~4.0.5"
|
|
69
75
|
},
|
|
70
76
|
"devDependencies": {
|
|
71
|
-
"@qilin-agent/kylin": "~4.0.
|
|
77
|
+
"@qilin-agent/kylin": "~4.0.5"
|
|
72
78
|
}
|
|
73
79
|
}
|