apex-memory 0.2.0 → 0.3.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/README.md +44 -10
- package/build/config.d.ts +10 -0
- package/build/config.d.ts.map +1 -0
- package/build/config.js +29 -0
- package/build/config.js.map +1 -0
- package/build/index.js +13 -2
- package/build/index.js.map +1 -1
- package/build/sync-client.d.ts +18 -0
- package/build/sync-client.d.ts.map +1 -0
- package/build/sync-client.js +125 -0
- package/build/sync-client.js.map +1 -0
- package/build/tools.d.ts +1 -1
- package/build/tools.d.ts.map +1 -1
- package/build/tools.js +215 -2
- package/build/tools.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -9,9 +9,12 @@
|
|
|
9
9
|
Give your AI coding agent memory that survives across sessions. apex-memory is an [MCP](https://modelcontextprotocol.io) server that lets agents save decisions, patterns, bugs, and context — then recall them exactly when needed.
|
|
10
10
|
|
|
11
11
|
- **One install, works everywhere** — MCP-native, works with Claude Code, Cursor, Windsurf, and any MCP-compatible editor
|
|
12
|
+
- **Ultra-lightweight** — 46 kB package, starts in milliseconds, no ML models or vector databases
|
|
12
13
|
- **Zero infrastructure** — local SQLite database, no servers, no accounts
|
|
13
14
|
- **Built for coding agents** — categories like `decision`, `architecture`, `bug`, `pattern` designed for real development workflows
|
|
15
|
+
- **Smart memory management** — importance scoring (1-5), access tracking, and auto-decay keep your memory store relevant
|
|
14
16
|
- **Full-text search** — find any memory instantly with FTS5-powered search
|
|
17
|
+
- **Cloud sync (coming soon)** — sync memories across machines with the Pro tier
|
|
15
18
|
|
|
16
19
|
## Quick Start
|
|
17
20
|
|
|
@@ -57,6 +60,25 @@ Open `~/.codeium/windsurf/mcp_config.json` (via `Cmd+Shift+P` → "Windsurf: Ope
|
|
|
57
60
|
|
|
58
61
|
See the [Windsurf setup guide](docs/guides/windsurf.md) for full details and troubleshooting.
|
|
59
62
|
|
|
63
|
+
### Cline
|
|
64
|
+
|
|
65
|
+
Open the MCP Servers panel in Cline's sidebar → **Edit MCP Settings**, then add:
|
|
66
|
+
|
|
67
|
+
```json
|
|
68
|
+
{
|
|
69
|
+
"mcpServers": {
|
|
70
|
+
"apex-memory": {
|
|
71
|
+
"command": "npx",
|
|
72
|
+
"args": ["apex-memory"],
|
|
73
|
+
"disabled": false,
|
|
74
|
+
"autoApprove": []
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
See the [Cline setup guide](docs/guides/cline.md) for full details and troubleshooting.
|
|
81
|
+
|
|
60
82
|
### Other MCP Clients
|
|
61
83
|
|
|
62
84
|
apex-memory works with any MCP-compatible client. Point it at:
|
|
@@ -139,25 +161,37 @@ All data is stored locally in `~/.apex-memory/memory.db` — a SQLite database w
|
|
|
139
161
|
|
|
140
162
|
## Pricing
|
|
141
163
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
| **Pro** | Cloud sync across machines, search API, up to 1GB | $9/workspace/month |
|
|
146
|
-
| **Team** | Shared multi-agent memory, analytics, unlimited storage | $29/workspace/month |
|
|
164
|
+
**Free and open source.** The core MCP server is MIT-licensed and fully functional — local storage, unlimited memories, unlimited sessions, no restrictions.
|
|
165
|
+
|
|
166
|
+
**Cloud sync coming soon.** Sync memories across machines with usage-based pricing. [Join the waitlist](https://github.com/JJerryChoi/apex-memory/issues) to get early access.
|
|
147
167
|
|
|
148
|
-
|
|
168
|
+
**Support the project.** If apex-memory is useful to you, consider [sponsoring on GitHub](https://github.com/sponsors/JJerryChoi).
|
|
149
169
|
|
|
150
170
|
## Why apex-memory?
|
|
151
171
|
|
|
172
|
+
### vs. MCP memory servers
|
|
173
|
+
|
|
174
|
+
| | apex-memory | shieldcortex | cortex-mcp | kiro-memory | claude-recall |
|
|
175
|
+
|---|---|---|---|---|---|
|
|
176
|
+
| **Package size** | **46 kB** | 75.9 MB | 1.1 MB | 3.6 MB | 862 kB |
|
|
177
|
+
| **Install time** | Instant | Slow (ML deps) | Fast | Fast | Fast |
|
|
178
|
+
| **Cloud sync** | Coming soon | No | No | No | No |
|
|
179
|
+
| **Importance scoring** | Built-in | No | No | No | No |
|
|
180
|
+
| **Auto-decay** | Built-in | Yes | No | No | No |
|
|
181
|
+
| **Session tracking** | Built-in | No | No | No | No |
|
|
182
|
+
| **Works with any MCP client** | Yes | Yes | Yes | Yes | Claude-only |
|
|
183
|
+
| **License** | MIT | MIT | MIT | AGPL-3.0 | ISC |
|
|
184
|
+
| **Dependencies** | 3 | 8 (incl. HuggingFace) | 3 | 16 | 5 |
|
|
185
|
+
|
|
186
|
+
**apex-memory is 18x smaller than the next smallest competitor** and starts in milliseconds. No ML models, no vector databases, no bloat — just fast, reliable memory backed by SQLite FTS5.
|
|
187
|
+
|
|
188
|
+
### vs. general-purpose memory
|
|
189
|
+
|
|
152
190
|
| | apex-memory | Mem0 | Letta | OneContext |
|
|
153
191
|
|---|---|---|---|---|
|
|
154
192
|
| **Built for coding agents** | Yes | General purpose | General purpose | General purpose |
|
|
155
193
|
| **MCP-native** | Yes | No | No | No |
|
|
156
194
|
| **Zero infrastructure** | Yes (SQLite) | Requires server | Requires server | Cloud-only |
|
|
157
|
-
| **Install time** | 30 seconds | Minutes | Minutes | Minutes |
|
|
158
|
-
| **Works with Claude Code** | Yes | Manual integration | Manual integration | No |
|
|
159
|
-
| **Session tracking** | Built-in | No | No | No |
|
|
160
|
-
| **Full-text search** | FTS5 | Vector search | Vector search | Vector search |
|
|
161
195
|
| **Open source** | MIT | Partial | Yes | No |
|
|
162
196
|
|
|
163
197
|
apex-memory is purpose-built for the coding agent workflow. It's not a general-purpose memory layer — it's the memory system your AI coding agent should have had from day one.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
interface AutoCaptureConfig {
|
|
2
|
+
enabled: boolean;
|
|
3
|
+
}
|
|
4
|
+
export interface ApexConfig {
|
|
5
|
+
auto_capture: AutoCaptureConfig;
|
|
6
|
+
}
|
|
7
|
+
export declare function getConfig(configDir?: string): ApexConfig;
|
|
8
|
+
export declare function isAutoCaptureEnabled(configDir?: string): boolean;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,UAAU,iBAAiB;IACzB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,iBAAiB,CAAC;CACjC;AAMD,wBAAgB,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,UAAU,CAgBxD;AAED,wBAAgB,oBAAoB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAEhE"}
|
package/build/config.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
const DEFAULT_CONFIG = {
|
|
5
|
+
auto_capture: { enabled: true },
|
|
6
|
+
};
|
|
7
|
+
export function getConfig(configDir) {
|
|
8
|
+
const dir = configDir ?? join(homedir(), ".apex-memory");
|
|
9
|
+
const configPath = join(dir, "config.json");
|
|
10
|
+
if (!existsSync(configPath))
|
|
11
|
+
return DEFAULT_CONFIG;
|
|
12
|
+
try {
|
|
13
|
+
const raw = readFileSync(configPath, "utf8");
|
|
14
|
+
const parsed = JSON.parse(raw);
|
|
15
|
+
const ac = parsed["auto_capture"];
|
|
16
|
+
return {
|
|
17
|
+
auto_capture: {
|
|
18
|
+
enabled: ac?.enabled ?? DEFAULT_CONFIG.auto_capture.enabled,
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return DEFAULT_CONFIG;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export function isAutoCaptureEnabled(configDir) {
|
|
27
|
+
return getConfig(configDir).auto_capture.enabled;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAUlC,MAAM,cAAc,GAAe;IACjC,YAAY,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;CAChC,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,SAAkB;IAC1C,MAAM,GAAG,GAAG,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC,CAAC;IACzD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IAC5C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,cAAc,CAAC;IACnD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAqC,CAAC;QACnE,MAAM,EAAE,GAAG,MAAM,CAAC,cAAc,CAA2C,CAAC;QAC5E,OAAO;YACL,YAAY,EAAE;gBACZ,OAAO,EAAE,EAAE,EAAE,OAAO,IAAI,cAAc,CAAC,YAAY,CAAC,OAAO;aAC5D;SACF,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,cAAc,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,SAAkB;IACrD,OAAO,SAAS,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC;AACnD,CAAC"}
|
package/build/index.js
CHANGED
|
@@ -3,16 +3,27 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
|
3
3
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
4
|
import { createDatabase } from "./database.js";
|
|
5
5
|
import { registerTools } from "./tools.js";
|
|
6
|
+
import { syncIfConfigured } from "./sync-client.js";
|
|
6
7
|
const server = new McpServer({
|
|
7
8
|
name: "apex-memory",
|
|
8
|
-
version: "0.
|
|
9
|
+
version: "0.3.0",
|
|
9
10
|
});
|
|
10
11
|
const db = createDatabase();
|
|
11
12
|
registerTools(server, db);
|
|
12
13
|
async function main() {
|
|
13
14
|
const transport = new StdioServerTransport();
|
|
14
15
|
await server.connect(transport);
|
|
15
|
-
console.error("apex-memory v0.
|
|
16
|
+
console.error("apex-memory v0.3.0 running on stdio");
|
|
17
|
+
// Background sync — non-blocking, fire-and-forget
|
|
18
|
+
syncIfConfigured(db)
|
|
19
|
+
.then((stats) => {
|
|
20
|
+
if (stats) {
|
|
21
|
+
console.error(`[sync] pushed=${stats.pushed} pulled=${stats.pulled}`);
|
|
22
|
+
}
|
|
23
|
+
})
|
|
24
|
+
.catch((err) => {
|
|
25
|
+
console.error("[sync] background sync failed:", err instanceof Error ? err.message : err);
|
|
26
|
+
});
|
|
16
27
|
}
|
|
17
28
|
main().catch((error) => {
|
|
18
29
|
console.error("Fatal error:", error);
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,aAAa;IACnB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,MAAM,EAAE,GAAG,cAAc,EAAE,CAAC;AAC5B,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAE1B,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;IAErD,kDAAkD;IAClD,gBAAgB,CAAC,EAAE,CAAC;SACjB,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;QACd,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CAAC,iBAAiB,KAAK,CAAC,MAAM,WAAW,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACxE,CAAC;IACH,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACb,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;AACP,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type Database from "better-sqlite3";
|
|
2
|
+
export interface SyncStats {
|
|
3
|
+
pushed: number;
|
|
4
|
+
pulled: number;
|
|
5
|
+
server_time: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function syncIfConfigured(db: Database.Database): Promise<SyncStats | null>;
|
|
8
|
+
export declare function registerWorkspaceWithServer(db: Database.Database, serverUrl: string): Promise<{
|
|
9
|
+
workspace_id: string;
|
|
10
|
+
api_key: string;
|
|
11
|
+
}>;
|
|
12
|
+
export declare function getCheckoutUrl(db: Database.Database, email?: string): Promise<string>;
|
|
13
|
+
export declare function getSubscriptionStatus(db: Database.Database): Promise<{
|
|
14
|
+
is_pro: boolean;
|
|
15
|
+
tier: string;
|
|
16
|
+
workspace_id?: string;
|
|
17
|
+
}>;
|
|
18
|
+
//# sourceMappingURL=sync-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-client.d.ts","sourceRoot":"","sources":["../src/sync-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAiC3C,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAoDD,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAmCvF;AAED,wBAAsB,2BAA2B,CAC/C,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBpD;AAED,wBAAsB,cAAc,CAClC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAwBjB;AAED,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GACpB,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAWnE"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { getSyncState, setSyncState } from "./database.js";
|
|
2
|
+
function getLocalMemoriesSince(db, since) {
|
|
3
|
+
return db
|
|
4
|
+
.prepare(`SELECT * FROM memories WHERE updated_at > ? ORDER BY updated_at ASC`)
|
|
5
|
+
.all(since);
|
|
6
|
+
}
|
|
7
|
+
function getLocalSessionsSince(db, since) {
|
|
8
|
+
// Sessions have no updated_at locally; use started_at as proxy
|
|
9
|
+
return db
|
|
10
|
+
.prepare(`SELECT *, COALESCE(ended_at, started_at) as updated_at
|
|
11
|
+
FROM sessions WHERE started_at > ? ORDER BY started_at ASC`)
|
|
12
|
+
.all(since);
|
|
13
|
+
}
|
|
14
|
+
function applyServerMemory(db, m) {
|
|
15
|
+
db.prepare(`
|
|
16
|
+
INSERT INTO memories
|
|
17
|
+
(id, content, category, tags, project, session_id, importance,
|
|
18
|
+
access_count, last_accessed_at, created_at, updated_at, deleted_at)
|
|
19
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
20
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
21
|
+
content = CASE WHEN excluded.updated_at > memories.updated_at THEN excluded.content ELSE memories.content END,
|
|
22
|
+
category = CASE WHEN excluded.updated_at > memories.updated_at THEN excluded.category ELSE memories.category END,
|
|
23
|
+
tags = CASE WHEN excluded.updated_at > memories.updated_at THEN excluded.tags ELSE memories.tags END,
|
|
24
|
+
project = CASE WHEN excluded.updated_at > memories.updated_at THEN excluded.project ELSE memories.project END,
|
|
25
|
+
session_id = CASE WHEN excluded.updated_at > memories.updated_at THEN excluded.session_id ELSE memories.session_id END,
|
|
26
|
+
importance = CASE WHEN excluded.updated_at > memories.updated_at THEN excluded.importance ELSE memories.importance END,
|
|
27
|
+
access_count = CASE WHEN excluded.updated_at > memories.updated_at THEN excluded.access_count ELSE memories.access_count END,
|
|
28
|
+
last_accessed_at = CASE WHEN excluded.updated_at > memories.updated_at THEN excluded.last_accessed_at ELSE memories.last_accessed_at END,
|
|
29
|
+
deleted_at = CASE WHEN excluded.updated_at > memories.updated_at THEN excluded.deleted_at ELSE memories.deleted_at END,
|
|
30
|
+
updated_at = CASE WHEN excluded.updated_at > memories.updated_at THEN excluded.updated_at ELSE memories.updated_at END
|
|
31
|
+
`).run(m.id, m.content, m.category, m.tags, m.project, m.session_id, m.importance, m.access_count, m.last_accessed_at, m.created_at, m.updated_at, m.deleted_at);
|
|
32
|
+
}
|
|
33
|
+
function applyServerSession(db, s) {
|
|
34
|
+
db.prepare(`
|
|
35
|
+
INSERT INTO sessions (id, project, summary, started_at, ended_at)
|
|
36
|
+
VALUES (?, ?, ?, ?, ?)
|
|
37
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
38
|
+
summary = COALESCE(excluded.summary, sessions.summary),
|
|
39
|
+
ended_at = COALESCE(excluded.ended_at, sessions.ended_at)
|
|
40
|
+
`).run(s.id, s.project, s.summary, s.started_at, s.ended_at);
|
|
41
|
+
}
|
|
42
|
+
export async function syncIfConfigured(db) {
|
|
43
|
+
const apiKey = getSyncState(db, "api_key");
|
|
44
|
+
const serverUrl = getSyncState(db, "server_url");
|
|
45
|
+
if (!apiKey || !serverUrl)
|
|
46
|
+
return null;
|
|
47
|
+
const lastSyncedAt = getSyncState(db, "last_synced_at") ?? "1970-01-01T00:00:00.000Z";
|
|
48
|
+
const localMemories = getLocalMemoriesSince(db, lastSyncedAt);
|
|
49
|
+
const localSessions = getLocalSessionsSince(db, lastSyncedAt);
|
|
50
|
+
const response = await fetch(`${serverUrl}/sync`, {
|
|
51
|
+
method: "POST",
|
|
52
|
+
headers: {
|
|
53
|
+
Authorization: `Bearer ${apiKey}`,
|
|
54
|
+
"Content-Type": "application/json",
|
|
55
|
+
},
|
|
56
|
+
body: JSON.stringify({ since: lastSyncedAt, memories: localMemories, sessions: localSessions }),
|
|
57
|
+
});
|
|
58
|
+
if (!response.ok) {
|
|
59
|
+
if (response.status === 402)
|
|
60
|
+
return null; // free tier, skip silently
|
|
61
|
+
throw new Error(`Sync failed with status ${response.status}`);
|
|
62
|
+
}
|
|
63
|
+
const result = (await response.json());
|
|
64
|
+
for (const m of result.memories)
|
|
65
|
+
applyServerMemory(db, m);
|
|
66
|
+
for (const s of result.sessions)
|
|
67
|
+
applyServerSession(db, s);
|
|
68
|
+
setSyncState(db, "last_synced_at", result.server_time);
|
|
69
|
+
return {
|
|
70
|
+
pushed: localMemories.length,
|
|
71
|
+
pulled: result.memories.length,
|
|
72
|
+
server_time: result.server_time,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
export async function registerWorkspaceWithServer(db, serverUrl) {
|
|
76
|
+
const response = await fetch(`${serverUrl}/auth/workspace`, {
|
|
77
|
+
method: "POST",
|
|
78
|
+
headers: { "Content-Type": "application/json" },
|
|
79
|
+
});
|
|
80
|
+
if (!response.ok) {
|
|
81
|
+
throw new Error(`Registration failed with status ${response.status}`);
|
|
82
|
+
}
|
|
83
|
+
const result = (await response.json());
|
|
84
|
+
setSyncState(db, "workspace_id", result.workspace_id);
|
|
85
|
+
setSyncState(db, "api_key", result.api_key);
|
|
86
|
+
setSyncState(db, "server_url", serverUrl);
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
export async function getCheckoutUrl(db, email) {
|
|
90
|
+
const apiKey = getSyncState(db, "api_key");
|
|
91
|
+
const serverUrl = getSyncState(db, "server_url");
|
|
92
|
+
if (!apiKey || !serverUrl) {
|
|
93
|
+
throw new Error("Not registered. Run apex_memory_login first.");
|
|
94
|
+
}
|
|
95
|
+
const response = await fetch(`${serverUrl}/billing/checkout`, {
|
|
96
|
+
method: "POST",
|
|
97
|
+
headers: {
|
|
98
|
+
Authorization: `Bearer ${apiKey}`,
|
|
99
|
+
"Content-Type": "application/json",
|
|
100
|
+
},
|
|
101
|
+
body: JSON.stringify(email ? { email } : {}),
|
|
102
|
+
});
|
|
103
|
+
if (!response.ok) {
|
|
104
|
+
throw new Error(`Checkout request failed with status ${response.status}`);
|
|
105
|
+
}
|
|
106
|
+
const data = (await response.json());
|
|
107
|
+
if (data.message)
|
|
108
|
+
return data.message;
|
|
109
|
+
if (!data.checkout_url)
|
|
110
|
+
throw new Error("No checkout URL returned");
|
|
111
|
+
return data.checkout_url;
|
|
112
|
+
}
|
|
113
|
+
export async function getSubscriptionStatus(db) {
|
|
114
|
+
const apiKey = getSyncState(db, "api_key");
|
|
115
|
+
const serverUrl = getSyncState(db, "server_url");
|
|
116
|
+
if (!apiKey || !serverUrl)
|
|
117
|
+
return { is_pro: false, tier: "local" };
|
|
118
|
+
const response = await fetch(`${serverUrl}/subscription/status`, {
|
|
119
|
+
headers: { Authorization: `Bearer ${apiKey}` },
|
|
120
|
+
});
|
|
121
|
+
if (!response.ok)
|
|
122
|
+
return { is_pro: false, tier: "unknown" };
|
|
123
|
+
return (await response.json());
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=sync-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-client.js","sourceRoot":"","sources":["../src/sync-client.ts"],"names":[],"mappings":"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"}
|
package/build/tools.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import type Database from "better-sqlite3";
|
|
3
|
-
export declare function registerTools(server: McpServer, db: Database.Database): void;
|
|
3
|
+
export declare function registerTools(server: McpServer, db: Database.Database, configDir?: string): void;
|
|
4
4
|
//# sourceMappingURL=tools.d.ts.map
|
package/build/tools.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAsB3C,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAqfhG"}
|
package/build/tools.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { saveMemory, searchMemories, recallMemories, deleteMemory, decayMemories, startSession, endSession, listSessions, getStats, } from "./database.js";
|
|
3
|
-
|
|
2
|
+
import { saveMemory, searchMemories, recallMemories, deleteMemory, decayMemories, startSession, endSession, listSessions, getStats, getSyncState, } from "./database.js";
|
|
3
|
+
import { syncIfConfigured, registerWorkspaceWithServer, getCheckoutUrl, getSubscriptionStatus, } from "./sync-client.js";
|
|
4
|
+
import { isAutoCaptureEnabled } from "./config.js";
|
|
5
|
+
export function registerTools(server, db, configDir) {
|
|
4
6
|
server.tool("save_memory", "Save a piece of knowledge, decision, pattern, or context for future recall. Use categories like: decision, pattern, bug, architecture, preference, learning, context.", {
|
|
5
7
|
content: z.string().describe("The memory content to save"),
|
|
6
8
|
category: z
|
|
@@ -189,5 +191,216 @@ export function registerTools(server, db) {
|
|
|
189
191
|
],
|
|
190
192
|
};
|
|
191
193
|
});
|
|
194
|
+
server.tool("apex_memory_sync", "Manually trigger a cloud sync — push local changes to the server and pull remote changes. Requires a Pro subscription and prior login via apex_memory_login.", {}, async () => {
|
|
195
|
+
try {
|
|
196
|
+
const stats = await syncIfConfigured(db);
|
|
197
|
+
if (!stats) {
|
|
198
|
+
return {
|
|
199
|
+
content: [
|
|
200
|
+
{
|
|
201
|
+
type: "text",
|
|
202
|
+
text: "Sync skipped: not configured or no Pro subscription. Use apex_memory_login to set up cloud sync.",
|
|
203
|
+
},
|
|
204
|
+
],
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
return {
|
|
208
|
+
content: [
|
|
209
|
+
{
|
|
210
|
+
type: "text",
|
|
211
|
+
text: `Sync complete.\nPushed: ${stats.pushed} changes\nPulled: ${stats.pulled} changes\nServer time: ${stats.server_time}`,
|
|
212
|
+
},
|
|
213
|
+
],
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
catch (err) {
|
|
217
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
218
|
+
return {
|
|
219
|
+
content: [{ type: "text", text: `Sync failed: ${msg}` }],
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
server.tool("apex_memory_login", "Register this machine with the apex-memory cloud and get a Pro upgrade link. Provide server_url pointing to your deployed apex-memory-sync Worker.", {
|
|
224
|
+
server_url: z
|
|
225
|
+
.string()
|
|
226
|
+
.describe("URL of the apex-memory-sync Worker (e.g. https://apex-memory-sync.your-account.workers.dev)"),
|
|
227
|
+
email: z
|
|
228
|
+
.string()
|
|
229
|
+
.optional()
|
|
230
|
+
.describe("Email address to pre-fill in the checkout form (optional)"),
|
|
231
|
+
}, async ({ server_url, email }) => {
|
|
232
|
+
try {
|
|
233
|
+
const { workspace_id, api_key } = await registerWorkspaceWithServer(db, server_url);
|
|
234
|
+
const checkoutUrl = await getCheckoutUrl(db, email);
|
|
235
|
+
return {
|
|
236
|
+
content: [
|
|
237
|
+
{
|
|
238
|
+
type: "text",
|
|
239
|
+
text: [
|
|
240
|
+
`Registered workspace: ${workspace_id}`,
|
|
241
|
+
`API key stored locally.`,
|
|
242
|
+
``,
|
|
243
|
+
`To activate Pro ($9/month), open this URL in your browser:`,
|
|
244
|
+
checkoutUrl,
|
|
245
|
+
].join("\n"),
|
|
246
|
+
},
|
|
247
|
+
],
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
catch (err) {
|
|
251
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
252
|
+
return {
|
|
253
|
+
content: [{ type: "text", text: `Login failed: ${msg}` }],
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
server.tool("apex_memory_status", "Show cloud sync status: workspace ID, Pro subscription tier, and last sync timestamp.", {}, async () => {
|
|
258
|
+
const workspaceId = getSyncState(db, "workspace_id");
|
|
259
|
+
const serverUrl = getSyncState(db, "server_url");
|
|
260
|
+
const lastSyncedAt = getSyncState(db, "last_synced_at");
|
|
261
|
+
if (!workspaceId || !serverUrl) {
|
|
262
|
+
return {
|
|
263
|
+
content: [
|
|
264
|
+
{
|
|
265
|
+
type: "text",
|
|
266
|
+
text: "Cloud sync not configured. Use apex_memory_login to set up.",
|
|
267
|
+
},
|
|
268
|
+
],
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
try {
|
|
272
|
+
const sub = await getSubscriptionStatus(db);
|
|
273
|
+
return {
|
|
274
|
+
content: [
|
|
275
|
+
{
|
|
276
|
+
type: "text",
|
|
277
|
+
text: [
|
|
278
|
+
`Workspace: ${workspaceId}`,
|
|
279
|
+
`Server: ${serverUrl}`,
|
|
280
|
+
`Tier: ${sub.tier}${sub.is_pro ? " ✓" : " (use apex_memory_login to upgrade)"}`,
|
|
281
|
+
`Last synced: ${lastSyncedAt ?? "never"}`,
|
|
282
|
+
].join("\n"),
|
|
283
|
+
},
|
|
284
|
+
],
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
catch (err) {
|
|
288
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
289
|
+
return {
|
|
290
|
+
content: [{ type: "text", text: `Status check failed: ${msg}` }],
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
});
|
|
294
|
+
server.tool("apex_memory_auto_capture", "Automatically capture session context at the end of a coding session. Saves key decisions, file paths, errors, and solutions as searchable memories. Opt-in: configure auto_capture.enabled in ~/.apex-memory/config.json (enabled by default). Works with any MCP-compatible editor.", {
|
|
295
|
+
project: z.string().describe("Project name for this session"),
|
|
296
|
+
summary: z.string().describe("Overall summary of what was accomplished this session"),
|
|
297
|
+
session_id: z.string().optional().describe("Session ID to close (if using session tracking)"),
|
|
298
|
+
decisions: z
|
|
299
|
+
.array(z.string())
|
|
300
|
+
.default([])
|
|
301
|
+
.describe("Key architectural or code decisions made during the session"),
|
|
302
|
+
files_worked_on: z
|
|
303
|
+
.array(z.string())
|
|
304
|
+
.default([])
|
|
305
|
+
.describe("File paths created or modified"),
|
|
306
|
+
errors_encountered: z
|
|
307
|
+
.array(z.string())
|
|
308
|
+
.default([])
|
|
309
|
+
.describe("Errors or bugs encountered during the session"),
|
|
310
|
+
solutions_found: z
|
|
311
|
+
.array(z.string())
|
|
312
|
+
.default([])
|
|
313
|
+
.describe("Solutions or fixes applied (paired with errors_encountered by index when possible)"),
|
|
314
|
+
}, async ({ project, summary, session_id, decisions, files_worked_on, errors_encountered, solutions_found }) => {
|
|
315
|
+
if (!isAutoCaptureEnabled(configDir)) {
|
|
316
|
+
return {
|
|
317
|
+
content: [
|
|
318
|
+
{
|
|
319
|
+
type: "text",
|
|
320
|
+
text: "Auto-capture is disabled. Set auto_capture.enabled = true in ~/.apex-memory/config.json to enable.",
|
|
321
|
+
},
|
|
322
|
+
],
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
const captured = [];
|
|
326
|
+
if (session_id) {
|
|
327
|
+
endSession(db, session_id, summary);
|
|
328
|
+
}
|
|
329
|
+
// Session summary memory
|
|
330
|
+
saveMemory(db, summary, "context", ["session-summary"], project, session_id, 3);
|
|
331
|
+
captured.push(`context: session summary`);
|
|
332
|
+
// Key decisions (importance 4 — above default, below critical)
|
|
333
|
+
for (const decision of decisions) {
|
|
334
|
+
saveMemory(db, decision, "decision", ["auto-capture"], project, session_id, 4);
|
|
335
|
+
captured.push(`decision: ${decision.length > 60 ? decision.slice(0, 60) + "…" : decision}`);
|
|
336
|
+
}
|
|
337
|
+
// Error/solution pairs
|
|
338
|
+
const pairCount = Math.max(errors_encountered.length, solutions_found.length);
|
|
339
|
+
for (let i = 0; i < pairCount; i++) {
|
|
340
|
+
const error = errors_encountered[i];
|
|
341
|
+
const solution = solutions_found[i];
|
|
342
|
+
if (error && solution) {
|
|
343
|
+
saveMemory(db, `Error: ${error}\nSolution: ${solution}`, "bug", ["auto-capture", "error-solution"], project, session_id, 3);
|
|
344
|
+
captured.push(`bug fix: ${error.length > 50 ? error.slice(0, 50) + "…" : error}`);
|
|
345
|
+
}
|
|
346
|
+
else if (error) {
|
|
347
|
+
saveMemory(db, `Error encountered: ${error}`, "bug", ["auto-capture", "error"], project, session_id, 2);
|
|
348
|
+
captured.push(`error: ${error.length > 60 ? error.slice(0, 60) + "…" : error}`);
|
|
349
|
+
}
|
|
350
|
+
else if (solution) {
|
|
351
|
+
saveMemory(db, `Solution applied: ${solution}`, "pattern", ["auto-capture", "solution"], project, session_id, 3);
|
|
352
|
+
captured.push(`solution: ${solution.length > 60 ? solution.slice(0, 60) + "…" : solution}`);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
// Files worked on (single memory, low importance — ephemeral path context)
|
|
356
|
+
if (files_worked_on.length > 0) {
|
|
357
|
+
const content = `Files worked on:\n${files_worked_on.map((f) => `- ${f}`).join("\n")}`;
|
|
358
|
+
saveMemory(db, content, "context", ["auto-capture", "files"], project, session_id, 2);
|
|
359
|
+
captured.push(`files: ${files_worked_on.length} file(s)`);
|
|
360
|
+
}
|
|
361
|
+
return {
|
|
362
|
+
content: [
|
|
363
|
+
{
|
|
364
|
+
type: "text",
|
|
365
|
+
text: `Auto-capture complete. Saved ${captured.length} memories for project "${project}":\n${captured.map((s) => ` • ${s}`).join("\n")}`,
|
|
366
|
+
},
|
|
367
|
+
],
|
|
368
|
+
};
|
|
369
|
+
});
|
|
370
|
+
server.tool("session_summary", "Review all memories captured in a session. Shows what was saved via apex_memory_auto_capture or save_memory during the session. Use at the start of a new session to recall prior context.", {
|
|
371
|
+
session_id: z.string().describe("The session ID to summarize"),
|
|
372
|
+
}, async ({ session_id }) => {
|
|
373
|
+
const session = db.prepare(`SELECT * FROM sessions WHERE id = ?`).get(session_id);
|
|
374
|
+
if (!session) {
|
|
375
|
+
return {
|
|
376
|
+
content: [{ type: "text", text: `Session ${session_id} not found.` }],
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
const memories = db
|
|
380
|
+
.prepare(`SELECT * FROM memories WHERE session_id = ? AND deleted_at IS NULL ORDER BY created_at ASC`)
|
|
381
|
+
.all(session_id);
|
|
382
|
+
const lines = [
|
|
383
|
+
`Session: ${session.id}`,
|
|
384
|
+
`Project: ${session.project}`,
|
|
385
|
+
`Duration: ${session.started_at} → ${session.ended_at ?? "active"}`,
|
|
386
|
+
];
|
|
387
|
+
if (session.summary) {
|
|
388
|
+
lines.push(`Summary: ${session.summary}`);
|
|
389
|
+
}
|
|
390
|
+
if (memories.length === 0) {
|
|
391
|
+
lines.push(`\nNo memories captured in this session.`);
|
|
392
|
+
lines.push(`Tip: Call apex_memory_auto_capture at session end to save context automatically.`);
|
|
393
|
+
}
|
|
394
|
+
else {
|
|
395
|
+
lines.push(`\nCaptured ${memories.length} memories:`);
|
|
396
|
+
for (const m of memories) {
|
|
397
|
+
const preview = m.content.length > 100 ? `${m.content.slice(0, 100)}…` : m.content;
|
|
398
|
+
lines.push(` [${m.category}] [importance:${m.importance}] ${preview}`);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
return {
|
|
402
|
+
content: [{ type: "text", text: lines.join("\n") }],
|
|
403
|
+
};
|
|
404
|
+
});
|
|
192
405
|
}
|
|
193
406
|
//# sourceMappingURL=tools.js.map
|
package/build/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,UAAU,EACV,cAAc,EACd,cAAc,EACd,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,YAAY,GACb,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,gBAAgB,EAChB,2BAA2B,EAC3B,cAAc,EACd,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,UAAU,aAAa,CAAC,MAAiB,EAAE,EAAqB,EAAE,SAAkB;IACxF,MAAM,CAAC,IAAI,CACT,aAAa,EACb,uKAAuK,EACvK;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QAC1D,QAAQ,EAAE,CAAC;aACR,MAAM,EAAE;aACR,OAAO,CAAC,SAAS,CAAC;aAClB,QAAQ,CAAC,wFAAwF,CAAC;QACrG,IAAI,EAAE,CAAC;aACJ,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;aACjB,OAAO,CAAC,EAAE,CAAC;aACX,QAAQ,CAAC,qCAAqC,CAAC;QAClD,OAAO,EAAE,CAAC;aACP,MAAM,EAAE;aACR,OAAO,CAAC,EAAE,CAAC;aACX,QAAQ,CAAC,qCAAqC,CAAC;QAClD,UAAU,EAAE,CAAC;aACV,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,wDAAwD,CAAC;QACrE,UAAU,EAAE,CAAC;aACV,MAAM,EAAE;aACR,GAAG,EAAE;aACL,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,CAAC,CAAC;aACN,OAAO,CAAC,CAAC,CAAC;aACV,QAAQ,CAAC,wEAAwE,CAAC;KACtF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,EAAE;QACrE,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;QACxF,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,gBAAgB,MAAM,CAAC,EAAE,eAAe,MAAM,CAAC,QAAQ,cAAc,MAAM,CAAC,OAAO,IAAI,UAAU,WAAW,MAAM,CAAC,IAAI,IAAI,QAAQ,iBAAiB,MAAM,CAAC,UAAU,IAAI;iBAChL;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,iFAAiF,EACjF;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4DAA4D,CAAC;QACxF,OAAO,EAAE,CAAC;aACP,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,8BAA8B,CAAC;QAC3C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;KAChE,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE;QAClC,MAAM,QAAQ,GAAG,cAAc,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAC3D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,wCAAwC,EAAE,CAAC;aACrF,CAAC;QACJ,CAAC;QACD,MAAM,SAAS,GAAG,QAAQ;aACvB,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,QAAQ,iBAAiB,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAClK;aACA,IAAI,CAAC,SAAS,CAAC,CAAC;QACnB,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,SAAS,QAAQ,CAAC,MAAM,iBAAiB,SAAS,EAAE,EAAE,CAAC;SACjG,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,QAAQ,EACR,oHAAoH,EACpH;QACE,OAAO,EAAE,CAAC;aACP,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,8BAA8B,CAAC;QAC3C,QAAQ,EAAE,CAAC;aACR,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,oBAAoB,CAAC;QACjC,IAAI,EAAE,CAAC;aACJ,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;aACjB,QAAQ,EAAE;aACV,QAAQ,CAAC,iCAAiC,CAAC;QAC9C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;KAChE,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;QAC3C,MAAM,QAAQ,GAAG,cAAc,CAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QACpE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,2CAA2C,EAAE,CAAC;aACxF,CAAC;QACJ,CAAC;QACD,MAAM,SAAS,GAAG,QAAQ;aACvB,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,QAAQ,iBAAiB,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAClK;aACA,IAAI,CAAC,SAAS,CAAC,CAAC;QACnB,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,YAAY,QAAQ,CAAC,MAAM,iBAAiB,SAAS,EAAE,EAAE,CAAC;SACpG,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,eAAe,EACf,iCAAiC,EACjC;QACE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;KACnD,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;QACf,MAAM,OAAO,GAAG,YAAY,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACrC,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,YAAY;iBAClE;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,2KAA2K,EAC3K;QACE,aAAa,EAAE,CAAC;aACb,MAAM,EAAE;aACR,GAAG,EAAE;aACL,GAAG,CAAC,CAAC,CAAC;aACN,OAAO,CAAC,EAAE,CAAC;aACX,QAAQ,CAAC,wDAAwD,CAAC;QACrE,cAAc,EAAE,CAAC;aACd,MAAM,EAAE;aACR,GAAG,EAAE;aACL,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,CAAC,CAAC;aACN,OAAO,CAAC,CAAC,CAAC;aACV,QAAQ,CAAC,4FAA4F,CAAC;KAC1G,EACD,KAAK,EAAE,EAAE,aAAa,EAAE,cAAc,EAAE,EAAE,EAAE;QAC1C,MAAM,OAAO,GAAG,aAAa,CAAC,EAAE,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC;QACjE,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EACF,OAAO,KAAK,CAAC;wBACX,CAAC,CAAC,0EAA0E,aAAa,QAAQ;wBACjG,CAAC,CAAC,WAAW,OAAO,2BAA2B,cAAc,gCAAgC,aAAa,SAAS;iBACxH;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,eAAe,EACf,2FAA2F,EAC3F;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;KAC9D,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QACpB,MAAM,OAAO,GAAG,YAAY,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAC1C,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,mBAAmB,OAAO,CAAC,EAAE,cAAc,OAAO,CAAC,OAAO,cAAc,OAAO,CAAC,UAAU,EAAE;iBACnG;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,aAAa,EACb,+DAA+D,EAC/D;QACE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QACxD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;KACjF,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE;QAChC,MAAM,OAAO,GAAG,UAAU,CAAC,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,WAAW,UAAU,YAAY,EAAE,CAAC;aAC9E,CAAC;QACJ,CAAC;QACD,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,iBAAiB,OAAO,CAAC,EAAE,cAAc,OAAO,CAAC,OAAO,eAAe,OAAO,CAAC,UAAU,MAAM,OAAO,CAAC,QAAQ,cAAc,OAAO,CAAC,OAAO,EAAE;iBACrJ;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,eAAe,EACf,4DAA4D,EAC5D;QACE,OAAO,EAAE,CAAC;aACP,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,8BAA8B,CAAC;QAC3C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;KAChE,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE;QAC3B,MAAM,QAAQ,GAAG,YAAY,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAClD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;aACjE,CAAC;QACJ,CAAC;QACD,MAAM,SAAS,GAAG,QAAQ;aACvB,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,UAAU,MAAM,CAAC,CAAC,QAAQ,IAAI,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAC/G;aACA,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,gBAAgB,SAAS,EAAE,EAAE,CAAC;SACxE,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,cAAc,EACd,oDAAoD,EACpD,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC3B,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,aAAa,KAAK,CAAC,QAAQ,eAAe,KAAK,CAAC,QAAQ,eAAe,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;iBAChJ;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,8JAA8J,EAC9J,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,EAAE,CAAC,CAAC;YACzC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,kGAAkG;yBACzG;qBACF;iBACF,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,2BAA2B,KAAK,CAAC,MAAM,qBAAqB,KAAK,CAAC,MAAM,0BAA0B,KAAK,CAAC,WAAW,EAAE;qBAC5H;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,gBAAgB,GAAG,EAAE,EAAE,CAAC;aAClE,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,oJAAoJ,EACpJ;QACE,UAAU,EAAE,CAAC;aACV,MAAM,EAAE;aACR,QAAQ,CAAC,6FAA6F,CAAC;QAC1G,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,2DAA2D,CAAC;KACzE,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE;QAC9B,IAAI,CAAC;YACH,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,MAAM,2BAA2B,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YACpF,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YACpD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE;4BACJ,yBAAyB,YAAY,EAAE;4BACvC,yBAAyB;4BACzB,EAAE;4BACF,4DAA4D;4BAC5D,WAAW;yBACZ,CAAC,IAAI,CAAC,IAAI,CAAC;qBACb;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,iBAAiB,GAAG,EAAE,EAAE,CAAC;aACnE,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,uFAAuF,EACvF,EAAE,EACF,KAAK,IAAI,EAAE;QACT,MAAM,WAAW,GAAG,YAAY,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;QACrD,MAAM,SAAS,GAAG,YAAY,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;QACjD,MAAM,YAAY,GAAG,YAAY,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;QAExD,IAAI,CAAC,WAAW,IAAI,CAAC,SAAS,EAAE,CAAC;YAC/B,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,6DAA6D;qBACpE;iBACF;aACF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,qBAAqB,CAAC,EAAE,CAAC,CAAC;YAC5C,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE;4BACJ,cAAc,WAAW,EAAE;4BAC3B,WAAW,SAAS,EAAE;4BACtB,SAAS,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,qCAAqC,EAAE;4BAC/E,gBAAgB,YAAY,IAAI,OAAO,EAAE;yBAC1C,CAAC,IAAI,CAAC,IAAI,CAAC;qBACb;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,wBAAwB,GAAG,EAAE,EAAE,CAAC;aAC1E,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,0BAA0B,EAC1B,uRAAuR,EACvR;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;QAC7D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;QACrF,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iDAAiD,CAAC;QAC7F,SAAS,EAAE,CAAC;aACT,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;aACjB,OAAO,CAAC,EAAE,CAAC;aACX,QAAQ,CAAC,6DAA6D,CAAC;QAC1E,eAAe,EAAE,CAAC;aACf,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;aACjB,OAAO,CAAC,EAAE,CAAC;aACX,QAAQ,CAAC,gCAAgC,CAAC;QAC7C,kBAAkB,EAAE,CAAC;aAClB,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;aACjB,OAAO,CAAC,EAAE,CAAC;aACX,QAAQ,CAAC,+CAA+C,CAAC;QAC5D,eAAe,EAAE,CAAC;aACf,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;aACjB,OAAO,CAAC,EAAE,CAAC;aACX,QAAQ,CAAC,oFAAoF,CAAC;KAClG,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,kBAAkB,EAAE,eAAe,EAAE,EAAE,EAAE;QAC1G,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,EAAE,CAAC;YACrC,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,oGAAoG;qBAC3G;iBACF;aACF,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAa,EAAE,CAAC;QAE9B,IAAI,UAAU,EAAE,CAAC;YACf,UAAU,CAAC,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;QACtC,CAAC;QAED,yBAAyB;QACzB,UAAU,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;QAChF,QAAQ,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QAE1C,+DAA+D;QAC/D,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;YAC/E,QAAQ,CAAC,IAAI,CAAC,aAAa,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC9F,CAAC;QAED,uBAAuB;QACvB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;QAC9E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;YACpC,IAAI,KAAK,IAAI,QAAQ,EAAE,CAAC;gBACtB,UAAU,CAAC,EAAE,EAAE,UAAU,KAAK,eAAe,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,cAAc,EAAE,gBAAgB,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;gBAC5H,QAAQ,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACpF,CAAC;iBAAM,IAAI,KAAK,EAAE,CAAC;gBACjB,UAAU,CAAC,EAAE,EAAE,sBAAsB,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,cAAc,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;gBACxG,QAAQ,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YAClF,CAAC;iBAAM,IAAI,QAAQ,EAAE,CAAC;gBACpB,UAAU,CAAC,EAAE,EAAE,qBAAqB,QAAQ,EAAE,EAAE,SAAS,EAAE,CAAC,cAAc,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;gBACjH,QAAQ,CAAC,IAAI,CAAC,aAAa,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC9F,CAAC;QACH,CAAC;QAED,2EAA2E;QAC3E,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,qBAAqB,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACvF,UAAU,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,cAAc,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;YACtF,QAAQ,CAAC,IAAI,CAAC,UAAU,eAAe,CAAC,MAAM,UAAU,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,gCAAgC,QAAQ,CAAC,MAAM,0BAA0B,OAAO,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;iBAC1I;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,4LAA4L,EAC5L;QACE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;KAC/D,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;QACvB,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAwB,CAAC;QACzG,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,WAAW,UAAU,aAAa,EAAE,CAAC;aAC/E,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,EAAE;aAChB,OAAO,CAAC,4FAA4F,CAAC;aACrG,GAAG,CAAC,UAAU,CAAa,CAAC;QAE/B,MAAM,KAAK,GAAa;YACtB,YAAY,OAAO,CAAC,EAAE,EAAE;YACxB,YAAY,OAAO,CAAC,OAAO,EAAE;YAC7B,aAAa,OAAO,CAAC,UAAU,MAAM,OAAO,CAAC,QAAQ,IAAI,QAAQ,EAAE;SACpE,CAAC;QAEF,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;YACtD,KAAK,CAAC,IAAI,CAAC,kFAAkF,CAAC,CAAC;QACjG,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,cAAc,QAAQ,CAAC,MAAM,YAAY,CAAC,CAAC;YACtD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;gBACnF,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,iBAAiB,CAAC,CAAC,UAAU,KAAK,OAAO,EAAE,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;QAED,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;SAC7D,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|