@variantree/watcher 0.1.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/dist/__tests__/git-snapshot.test.d.ts +2 -0
- package/dist/__tests__/git-snapshot.test.d.ts.map +1 -0
- package/dist/__tests__/git-snapshot.test.js +437 -0
- package/dist/__tests__/git-snapshot.test.js.map +1 -0
- package/dist/__tests__/integration.test.d.ts +10 -0
- package/dist/__tests__/integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration.test.js +316 -0
- package/dist/__tests__/integration.test.js.map +1 -0
- package/dist/__tests__/watcher.test.d.ts +2 -0
- package/dist/__tests__/watcher.test.d.ts.map +1 -0
- package/dist/__tests__/watcher.test.js +375 -0
- package/dist/__tests__/watcher.test.js.map +1 -0
- package/dist/adapters/aider.d.ts +21 -0
- package/dist/adapters/aider.d.ts.map +1 -0
- package/dist/adapters/aider.js +42 -0
- package/dist/adapters/aider.js.map +1 -0
- package/dist/adapters/base.d.ts +3 -0
- package/dist/adapters/base.d.ts.map +1 -0
- package/dist/adapters/base.js +2 -0
- package/dist/adapters/base.js.map +1 -0
- package/dist/adapters/claude-code.d.ts +17 -0
- package/dist/adapters/claude-code.d.ts.map +1 -0
- package/dist/adapters/claude-code.js +58 -0
- package/dist/adapters/claude-code.js.map +1 -0
- package/dist/adapters/opencode.d.ts +3 -0
- package/dist/adapters/opencode.d.ts.map +1 -0
- package/dist/adapters/opencode.js +3 -0
- package/dist/adapters/opencode.js.map +1 -0
- package/dist/agents-md.d.ts +18 -0
- package/dist/agents-md.d.ts.map +1 -0
- package/dist/agents-md.js +93 -0
- package/dist/agents-md.js.map +1 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +511 -0
- package/dist/cli.js.map +1 -0
- package/dist/differ.d.ts +18 -0
- package/dist/differ.d.ts.map +1 -0
- package/dist/differ.js +23 -0
- package/dist/differ.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/node/blob-store.d.ts +16 -0
- package/dist/node/blob-store.d.ts.map +1 -0
- package/dist/node/blob-store.js +47 -0
- package/dist/node/blob-store.js.map +1 -0
- package/dist/node/fs-adapter.d.ts +17 -0
- package/dist/node/fs-adapter.d.ts.map +1 -0
- package/dist/node/fs-adapter.js +110 -0
- package/dist/node/fs-adapter.js.map +1 -0
- package/dist/node/git-snapshot.d.ts +46 -0
- package/dist/node/git-snapshot.d.ts.map +1 -0
- package/dist/node/git-snapshot.js +282 -0
- package/dist/node/git-snapshot.js.map +1 -0
- package/dist/node/session-launcher.d.ts +14 -0
- package/dist/node/session-launcher.d.ts.map +1 -0
- package/dist/node/session-launcher.js +28 -0
- package/dist/node/session-launcher.js.map +1 -0
- package/dist/node/storage.d.ts +17 -0
- package/dist/node/storage.d.ts.map +1 -0
- package/dist/node/storage.js +56 -0
- package/dist/node/storage.js.map +1 -0
- package/dist/sync.d.ts +16 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +58 -0
- package/dist/sync.js.map +1 -0
- package/dist/tools/base.d.ts +52 -0
- package/dist/tools/base.d.ts.map +1 -0
- package/dist/tools/base.js +10 -0
- package/dist/tools/base.js.map +1 -0
- package/dist/tools/claudecode/adapter.d.ts +26 -0
- package/dist/tools/claudecode/adapter.d.ts.map +1 -0
- package/dist/tools/claudecode/adapter.js +111 -0
- package/dist/tools/claudecode/adapter.js.map +1 -0
- package/dist/tools/claudecode/config.d.ts +8 -0
- package/dist/tools/claudecode/config.d.ts.map +1 -0
- package/dist/tools/claudecode/config.js +34 -0
- package/dist/tools/claudecode/config.js.map +1 -0
- package/dist/tools/claudecode/index.d.ts +9 -0
- package/dist/tools/claudecode/index.d.ts.map +1 -0
- package/dist/tools/claudecode/index.js +16 -0
- package/dist/tools/claudecode/index.js.map +1 -0
- package/dist/tools/claudecode/instructions.d.ts +7 -0
- package/dist/tools/claudecode/instructions.d.ts.map +1 -0
- package/dist/tools/claudecode/instructions.js +21 -0
- package/dist/tools/claudecode/instructions.js.map +1 -0
- package/dist/tools/index.d.ts +24 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +42 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/instructions.d.ts +19 -0
- package/dist/tools/instructions.d.ts.map +1 -0
- package/dist/tools/instructions.js +93 -0
- package/dist/tools/instructions.js.map +1 -0
- package/dist/tools/opencode/adapter.d.ts +46 -0
- package/dist/tools/opencode/adapter.d.ts.map +1 -0
- package/dist/tools/opencode/adapter.js +166 -0
- package/dist/tools/opencode/adapter.js.map +1 -0
- package/dist/tools/opencode/config.d.ts +8 -0
- package/dist/tools/opencode/config.d.ts.map +1 -0
- package/dist/tools/opencode/config.js +37 -0
- package/dist/tools/opencode/config.js.map +1 -0
- package/dist/tools/opencode/index.d.ts +9 -0
- package/dist/tools/opencode/index.d.ts.map +1 -0
- package/dist/tools/opencode/index.js +16 -0
- package/dist/tools/opencode/index.js.map +1 -0
- package/dist/tools/opencode/instructions.d.ts +10 -0
- package/dist/tools/opencode/instructions.d.ts.map +1 -0
- package/dist/tools/opencode/instructions.js +26 -0
- package/dist/tools/opencode/instructions.js.map +1 -0
- package/dist/watcher.d.ts +40 -0
- package/dist/watcher.d.ts.map +1 -0
- package/dist/watcher.js +87 -0
- package/dist/watcher.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @variantree/watcher — AGENTS.md content
|
|
3
|
+
*
|
|
4
|
+
* Standing instructions written to the project root so OpenCode (and
|
|
5
|
+
* compatible tools) know when and how to use Variantree proactively.
|
|
6
|
+
*
|
|
7
|
+
* Shared between `variantree init` (CLI) and the MCP server bootstrap.
|
|
8
|
+
*/
|
|
9
|
+
const MARKER = '<!-- variantree:agents -->';
|
|
10
|
+
export const AGENTS_MD_SECTION = `${MARKER}
|
|
11
|
+
## Variantree — AI Version Control
|
|
12
|
+
|
|
13
|
+
You have access to Variantree MCP tools for managing conversation context and
|
|
14
|
+
code snapshots. Use them **proactively** — don't wait for the user to ask.
|
|
15
|
+
|
|
16
|
+
### On session start
|
|
17
|
+
- If \`.variantree/branch-context.md\` exists, read it immediately for context
|
|
18
|
+
on prior work done on this branch.
|
|
19
|
+
|
|
20
|
+
### When to checkpoint
|
|
21
|
+
- After completing a distinct task or sub-task (e.g. "auth is working",
|
|
22
|
+
"tests pass", "refactor done").
|
|
23
|
+
- When the user says "done", "looks good", "ship it", or "let's move on".
|
|
24
|
+
- Before any branch, switch, or restore — the tools will warn you if you
|
|
25
|
+
forget, but it's better to checkpoint proactively.
|
|
26
|
+
|
|
27
|
+
### When to branch
|
|
28
|
+
- When the user wants to explore an alternative approach ("let's try X
|
|
29
|
+
instead", "what if we used Y").
|
|
30
|
+
- When the user asks to experiment without losing current progress.
|
|
31
|
+
|
|
32
|
+
### When to switch / restore
|
|
33
|
+
- When the user wants to go back to a previous line of work or a known-good
|
|
34
|
+
state ("go back to main", "restore the working version").
|
|
35
|
+
|
|
36
|
+
### Handling unsaved-message warnings
|
|
37
|
+
If a tool returns an unsaved-message warning (e.g. "4 messages will be lost"):
|
|
38
|
+
1. **STOP** — do NOT silently pass \`force: true\`.
|
|
39
|
+
2. Tell the user exactly how many messages will be lost.
|
|
40
|
+
3. Ask: *"Should I checkpoint first to save them, or discard them and
|
|
41
|
+
proceed?"*
|
|
42
|
+
4. Only use \`force: true\` after the user explicitly says to discard /
|
|
43
|
+
proceed without saving.
|
|
44
|
+
|
|
45
|
+
### Presenting results to the user
|
|
46
|
+
**IMPORTANT:** Always relay the COMPLETE tool output to the user. Do not
|
|
47
|
+
summarise or omit details. Specifically:
|
|
48
|
+
|
|
49
|
+
- **checkpoint:** Show messages synced count, snapshot diff (files added,
|
|
50
|
+
modified, deleted), and total file count.
|
|
51
|
+
- **branch / switch / restore:** Show files written and deleted, then show
|
|
52
|
+
the full conversation context summary that was returned.
|
|
53
|
+
- **status:** Show ALL fields: active branch, message count, every branch
|
|
54
|
+
name, and every checkpoint label with snapshot indicator.
|
|
55
|
+
- **tree:** Show the FULL tree output exactly as returned — branches AND
|
|
56
|
+
checkpoints. Do not collapse or summarise it.
|
|
57
|
+
- **log:** Show the full conversation history returned by the tool.
|
|
58
|
+
|
|
59
|
+
### Tool reference
|
|
60
|
+
| Tool | Purpose |
|
|
61
|
+
|-------------|----------------------------------------------|
|
|
62
|
+
| checkpoint | Sync conversation + snapshot code |
|
|
63
|
+
| branch | Create a new branch from a checkpoint |
|
|
64
|
+
| switch | Switch to an existing branch |
|
|
65
|
+
| restore | Restore code to a specific checkpoint |
|
|
66
|
+
| status | Show active branch, checkpoints |
|
|
67
|
+
| tree | ASCII tree of branches and checkpoints |
|
|
68
|
+
| log | Show conversation history for a branch |
|
|
69
|
+
${MARKER}`;
|
|
70
|
+
/**
|
|
71
|
+
* Write or merge the Variantree section into an AGENTS.md file.
|
|
72
|
+
*
|
|
73
|
+
* - If the file doesn't exist, creates it.
|
|
74
|
+
* - If it exists but has no Variantree section, appends.
|
|
75
|
+
* - If it already has the section, replaces it (safe update).
|
|
76
|
+
*/
|
|
77
|
+
export function mergeAgentsMd(existingContent) {
|
|
78
|
+
if (!existingContent) {
|
|
79
|
+
return `# AGENTS\n\n${AGENTS_MD_SECTION}\n`;
|
|
80
|
+
}
|
|
81
|
+
const markerStart = existingContent.indexOf(MARKER);
|
|
82
|
+
if (markerStart === -1) {
|
|
83
|
+
return existingContent.trimEnd() + '\n\n' + AGENTS_MD_SECTION + '\n';
|
|
84
|
+
}
|
|
85
|
+
const markerEnd = existingContent.indexOf(MARKER, markerStart + MARKER.length);
|
|
86
|
+
if (markerEnd === -1) {
|
|
87
|
+
return existingContent.trimEnd() + '\n\n' + AGENTS_MD_SECTION + '\n';
|
|
88
|
+
}
|
|
89
|
+
const before = existingContent.slice(0, markerStart);
|
|
90
|
+
const after = existingContent.slice(markerEnd + MARKER.length);
|
|
91
|
+
return before + AGENTS_MD_SECTION + after;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=agents-md.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents-md.js","sourceRoot":"","sources":["../src/agents-md.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,MAAM,GAAG,4BAA4B,CAAC;AAE5C,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2DxC,MAAM,EAAE,CAAC;AAEX;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,eAA8B;IAC1D,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,eAAe,iBAAiB,IAAI,CAAC;IAC9C,CAAC;IAED,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACpD,IAAI,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC;QACvB,OAAO,eAAe,CAAC,OAAO,EAAE,GAAG,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAAC;IACvE,CAAC;IAED,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/E,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;QACrB,OAAO,eAAe,CAAC,OAAO,EAAE,GAAG,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAAC;IACvE,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/D,OAAO,MAAM,GAAG,iBAAiB,GAAG,KAAK,CAAC;AAC5C,CAAC"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;GAKG"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,511 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @variantree/watcher — CLI
|
|
4
|
+
*
|
|
5
|
+
* On-demand mode: no background watcher needed.
|
|
6
|
+
* Every command reads the conversation from OpenCode's SQLite on demand.
|
|
7
|
+
*/
|
|
8
|
+
import { Command } from 'commander';
|
|
9
|
+
import chalk from 'chalk';
|
|
10
|
+
import path from 'node:path';
|
|
11
|
+
import fsSync from 'node:fs';
|
|
12
|
+
import readline from 'node:readline';
|
|
13
|
+
import { VariantTree } from '@variantree/core';
|
|
14
|
+
import { NodeStorage } from './node/storage.js';
|
|
15
|
+
import { GitSnapshotProvider } from './node/git-snapshot.js';
|
|
16
|
+
import { VariantreeWatcher } from './watcher.js';
|
|
17
|
+
import { launchOpenCodeSession } from './node/session-launcher.js';
|
|
18
|
+
import { ensureProjectInstructions, VARIANTREE_MARKER, ALL_TOOLS } from './tools/index.js';
|
|
19
|
+
import { syncConversation } from './sync.js';
|
|
20
|
+
// ─── Theme ────────────────────────────────────────────────────────────────
|
|
21
|
+
const WORKSPACE_ID = 'default';
|
|
22
|
+
const brand = chalk.hex('#A78BFA'); // purple
|
|
23
|
+
const accent = chalk.hex('#34D399'); // green
|
|
24
|
+
const dim = chalk.dim;
|
|
25
|
+
const warn = chalk.hex('#FBBF24'); // amber
|
|
26
|
+
const err = chalk.hex('#F87171'); // red
|
|
27
|
+
const info = chalk.hex('#60A5FA'); // blue
|
|
28
|
+
const LOGO = brand('◆ variantree');
|
|
29
|
+
const CHECK = accent('✓');
|
|
30
|
+
const CROSS = err('✗');
|
|
31
|
+
const DOT = dim('·');
|
|
32
|
+
const ARROW = dim('→');
|
|
33
|
+
const BRANCH_ICON = brand('⎇');
|
|
34
|
+
const SNAP = dim('◈');
|
|
35
|
+
const TREE_VERT = dim('│');
|
|
36
|
+
const TREE_FORK = dim('├──');
|
|
37
|
+
const TREE_END = dim('└──');
|
|
38
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────
|
|
39
|
+
function header(text) {
|
|
40
|
+
console.log('');
|
|
41
|
+
console.log(` ${LOGO} ${dim('·')} ${text}`);
|
|
42
|
+
console.log('');
|
|
43
|
+
}
|
|
44
|
+
function success(text) {
|
|
45
|
+
console.log(` ${CHECK} ${text}`);
|
|
46
|
+
}
|
|
47
|
+
function detail(label, value) {
|
|
48
|
+
console.log(` ${dim(label.padEnd(14))} ${value}`);
|
|
49
|
+
}
|
|
50
|
+
function errorMsg(text) {
|
|
51
|
+
console.log(` ${CROSS} ${err(text)}`);
|
|
52
|
+
}
|
|
53
|
+
function hint(text) {
|
|
54
|
+
console.log(` ${dim(text)}`);
|
|
55
|
+
}
|
|
56
|
+
function divider() {
|
|
57
|
+
console.log('');
|
|
58
|
+
}
|
|
59
|
+
function nextSteps() {
|
|
60
|
+
console.log(` ${ARROW} ${chalk.white('Next steps:')}`);
|
|
61
|
+
console.log(` 1. Restart OpenCode ${dim('(quit and reopen)')}`);
|
|
62
|
+
console.log(` 2. Tell it: ${info('"Read .variantree/branch-context.md for context"')}`);
|
|
63
|
+
}
|
|
64
|
+
function printBranchNode(branch, allBranches, allCheckpoints, indent, isLast) {
|
|
65
|
+
const connector = indent === '' ? '' : (isLast ? TREE_END : TREE_FORK) + ' ';
|
|
66
|
+
const nameColor = branch.isActive ? accent : chalk.white;
|
|
67
|
+
const activeTag = branch.isActive ? accent(' ●') : '';
|
|
68
|
+
console.log(` ${dim(indent)}${connector}${nameColor.bold(branch.name)} ${dim(`(${branch.messageCount} msgs)`)}${activeTag}`);
|
|
69
|
+
const branchCps = allCheckpoints
|
|
70
|
+
.filter(cp => cp.branchId === branch.id)
|
|
71
|
+
.sort((a, b) => a.createdAt - b.createdAt);
|
|
72
|
+
const childIndent = indent === ''
|
|
73
|
+
? ' '
|
|
74
|
+
: indent + (isLast ? ' ' : '│ ');
|
|
75
|
+
for (let i = 0; i < branchCps.length; i++) {
|
|
76
|
+
const cp = branchCps[i];
|
|
77
|
+
const childBranches = allBranches.filter(b => b.parentCheckpointId === cp.id);
|
|
78
|
+
const cpIsLast = i === branchCps.length - 1 && childBranches.length === 0;
|
|
79
|
+
const cpConnector = cpIsLast ? TREE_END : TREE_FORK;
|
|
80
|
+
const snap = cp.snapshotRef ? ` ${SNAP}` : '';
|
|
81
|
+
const time = dim(formatTime(cp.createdAt));
|
|
82
|
+
console.log(` ${dim(childIndent)}${cpConnector} ${warn(cp.label)}${snap} ${time}`);
|
|
83
|
+
const continuation = cpIsLast ? ' ' : '│ ';
|
|
84
|
+
for (let j = 0; j < childBranches.length; j++) {
|
|
85
|
+
printBranchNode(childBranches[j], allBranches, allCheckpoints, childIndent + continuation, j === childBranches.length - 1);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (branchCps.length === 0) {
|
|
89
|
+
console.log(` ${dim(childIndent)}${TREE_END} ${dim('no checkpoints')}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/** Build a fully-configured engine. */
|
|
93
|
+
function createEngine(cwd) {
|
|
94
|
+
const storage = new NodeStorage(cwd);
|
|
95
|
+
const snapshotProvider = new GitSnapshotProvider(cwd);
|
|
96
|
+
const engine = new VariantTree({
|
|
97
|
+
storage,
|
|
98
|
+
snapshotProvider,
|
|
99
|
+
});
|
|
100
|
+
return { engine, storage, snapshotProvider };
|
|
101
|
+
}
|
|
102
|
+
/** Load or auto-initialise workspace. */
|
|
103
|
+
async function ensureWorkspace(cwd) {
|
|
104
|
+
const { engine, storage } = createEngine(cwd);
|
|
105
|
+
let ws = await engine.loadWorkspace(WORKSPACE_ID);
|
|
106
|
+
if (!ws) {
|
|
107
|
+
ws = await engine.createWorkspace('My Project');
|
|
108
|
+
ws.id = WORKSPACE_ID;
|
|
109
|
+
await storage.save(WORKSPACE_ID, ws);
|
|
110
|
+
await engine.loadWorkspace(WORKSPACE_ID);
|
|
111
|
+
console.log(` ${dim('workspace initialised')}`);
|
|
112
|
+
}
|
|
113
|
+
return { engine, storage };
|
|
114
|
+
}
|
|
115
|
+
/** Generate .variantree/branch-context.md */
|
|
116
|
+
function generateContextFile(cwd, branchName, messages) {
|
|
117
|
+
const contextDir = path.join(cwd, '.variantree');
|
|
118
|
+
if (!fsSync.existsSync(contextDir))
|
|
119
|
+
fsSync.mkdirSync(contextDir, { recursive: true });
|
|
120
|
+
const lines = [
|
|
121
|
+
`# Variantree Branch Context`,
|
|
122
|
+
``,
|
|
123
|
+
`**Branch:** ${branchName}`,
|
|
124
|
+
`**Generated:** ${new Date().toISOString()}`,
|
|
125
|
+
``,
|
|
126
|
+
`> This file was auto-generated by Variantree. It contains the conversation`,
|
|
127
|
+
`> history up to the point where this branch was created. Read this to`,
|
|
128
|
+
`> understand the context of what has been done so far.`,
|
|
129
|
+
``,
|
|
130
|
+
`---`,
|
|
131
|
+
``,
|
|
132
|
+
`## Conversation History`,
|
|
133
|
+
``,
|
|
134
|
+
];
|
|
135
|
+
if (messages.length === 0) {
|
|
136
|
+
lines.push('_No messages recorded at this checkpoint._');
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
for (const msg of messages) {
|
|
140
|
+
const prefix = msg.role === 'user' ? '**User:**' : '**Assistant:**';
|
|
141
|
+
const content = msg.content.length > 500
|
|
142
|
+
? msg.content.slice(0, 500) + '...'
|
|
143
|
+
: msg.content;
|
|
144
|
+
lines.push(`${prefix} ${content}`, '');
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
const filePath = path.join(contextDir, 'branch-context.md');
|
|
148
|
+
fsSync.writeFileSync(filePath, lines.join('\n'), 'utf8');
|
|
149
|
+
return filePath;
|
|
150
|
+
}
|
|
151
|
+
/** Prompt the user with a yes/no question. Defaults to yes (enter = Y). */
|
|
152
|
+
async function promptConfirm(question) {
|
|
153
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
154
|
+
return new Promise((resolve) => {
|
|
155
|
+
rl.question(question, (answer) => {
|
|
156
|
+
rl.close();
|
|
157
|
+
resolve(answer.trim().toLowerCase() !== 'n');
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Count messages on the active branch that have been added since the last checkpoint.
|
|
163
|
+
* These would be lost if the user switches/branches without checkpointing first.
|
|
164
|
+
*/
|
|
165
|
+
function countUnsavedMessages(engine) {
|
|
166
|
+
const branch = engine.getActiveBranch();
|
|
167
|
+
const branchCheckpoints = engine
|
|
168
|
+
.getCheckpointsForBranch(branch.id)
|
|
169
|
+
.sort((a, b) => a.createdAt - b.createdAt);
|
|
170
|
+
if (branchCheckpoints.length === 0)
|
|
171
|
+
return branch.messages.length;
|
|
172
|
+
const lastCp = branchCheckpoints[branchCheckpoints.length - 1];
|
|
173
|
+
return Math.max(0, branch.messages.length - 1 - lastCp.messageIndex);
|
|
174
|
+
}
|
|
175
|
+
function formatTime(ts) {
|
|
176
|
+
const d = new Date(ts);
|
|
177
|
+
const now = new Date();
|
|
178
|
+
const diff = now.getTime() - d.getTime();
|
|
179
|
+
if (diff < 60_000)
|
|
180
|
+
return 'just now';
|
|
181
|
+
if (diff < 3_600_000)
|
|
182
|
+
return `${Math.floor(diff / 60_000)}m ago`;
|
|
183
|
+
if (diff < 86_400_000)
|
|
184
|
+
return `${Math.floor(diff / 3_600_000)}h ago`;
|
|
185
|
+
return d.toLocaleDateString();
|
|
186
|
+
}
|
|
187
|
+
// ─── CLI ──────────────────────────────────────────────────────────────────
|
|
188
|
+
const program = new Command();
|
|
189
|
+
program
|
|
190
|
+
.name('variantree')
|
|
191
|
+
.description(brand('Version control for AI conversations'))
|
|
192
|
+
.version('0.1.0');
|
|
193
|
+
// ── init ──────────────────────────────────────────────────────────────────
|
|
194
|
+
program
|
|
195
|
+
.command('init')
|
|
196
|
+
.description('Initialise a Variantree workspace')
|
|
197
|
+
.option('-d, --dir <path>', 'workspace directory', process.cwd())
|
|
198
|
+
.action(async (opts) => {
|
|
199
|
+
const cwd = path.resolve(opts.dir);
|
|
200
|
+
header('init');
|
|
201
|
+
await ensureWorkspace(cwd);
|
|
202
|
+
success('Workspace ready');
|
|
203
|
+
const opencodePath = path.join(cwd, 'opencode.json');
|
|
204
|
+
try {
|
|
205
|
+
const devServerPath = path.join(cwd, 'packages', 'mcp', 'src', 'server.ts');
|
|
206
|
+
const isDev = fsSync.existsSync(devServerPath);
|
|
207
|
+
const command = isDev
|
|
208
|
+
? ["npx", "tsx", "packages/mcp/src/server.ts"]
|
|
209
|
+
: ["npx", "-y", "@variantree/mcp"];
|
|
210
|
+
const mcpConfig = {
|
|
211
|
+
type: "local",
|
|
212
|
+
command,
|
|
213
|
+
environment: { VARIANTREE_DIR: "." }
|
|
214
|
+
};
|
|
215
|
+
if (fsSync.existsSync(opencodePath)) {
|
|
216
|
+
const existingInfo = JSON.parse(fsSync.readFileSync(opencodePath, 'utf8'));
|
|
217
|
+
if (!existingInfo.mcp)
|
|
218
|
+
existingInfo.mcp = {};
|
|
219
|
+
if (!existingInfo.mcp.variantree) {
|
|
220
|
+
existingInfo.mcp.variantree = mcpConfig;
|
|
221
|
+
fsSync.writeFileSync(opencodePath, JSON.stringify(existingInfo, null, 2), 'utf8');
|
|
222
|
+
success('OpenCode MCP server added to existing opencode.json');
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
hint('OpenCode MCP configuration already exists');
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
const newConfig = {
|
|
230
|
+
"$schema": "https://opencode.ai/config.json",
|
|
231
|
+
mcp: { variantree: mcpConfig }
|
|
232
|
+
};
|
|
233
|
+
fsSync.writeFileSync(opencodePath, JSON.stringify(newConfig, null, 2), 'utf8');
|
|
234
|
+
success('Created opencode.json with Variantree MCP server');
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
catch (err) {
|
|
238
|
+
hint('Could not auto-configure opencode.json. You may need to add the MCP server manually.');
|
|
239
|
+
}
|
|
240
|
+
// Write or merge AGENTS.md with Variantree standing instructions
|
|
241
|
+
try {
|
|
242
|
+
const agentsPath = path.join(cwd, 'AGENTS.md');
|
|
243
|
+
const existing = (() => { try {
|
|
244
|
+
return fsSync.readFileSync(agentsPath, 'utf8');
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
return null;
|
|
248
|
+
} })();
|
|
249
|
+
const alreadyDone = existing?.includes(VARIANTREE_MARKER);
|
|
250
|
+
ensureProjectInstructions(cwd);
|
|
251
|
+
if (alreadyDone) {
|
|
252
|
+
hint('Instruction files already up to date (AGENTS.md, CLAUDE.md)');
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
success('Created instruction files: AGENTS.md, CLAUDE.md');
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
hint('Could not write instruction files.');
|
|
260
|
+
}
|
|
261
|
+
hint(`Run ${chalk.white('variantree checkpoint "label"')} after coding to save your progress`);
|
|
262
|
+
divider();
|
|
263
|
+
});
|
|
264
|
+
// ── checkpoint ────────────────────────────────────────────────────────────
|
|
265
|
+
program
|
|
266
|
+
.command('checkpoint <label>')
|
|
267
|
+
.description('Sync conversation from OpenCode + snapshot code')
|
|
268
|
+
.option('-d, --dir <path>', 'workspace directory', process.cwd())
|
|
269
|
+
.action(async (label, opts) => {
|
|
270
|
+
const cwd = path.resolve(opts.dir);
|
|
271
|
+
header('checkpoint');
|
|
272
|
+
const { engine } = await ensureWorkspace(cwd);
|
|
273
|
+
const synced = await syncConversation(engine, cwd);
|
|
274
|
+
await engine.createCheckpoint(label, { workspacePath: cwd });
|
|
275
|
+
success(`Checkpoint ${chalk.white.bold(`"${label}"`)} created`);
|
|
276
|
+
if (synced > 0) {
|
|
277
|
+
detail('synced', `${synced} message(s) from OpenCode`);
|
|
278
|
+
}
|
|
279
|
+
detail('snapshot', `code saved ${SNAP}`);
|
|
280
|
+
divider();
|
|
281
|
+
});
|
|
282
|
+
// ── branch ────────────────────────────────────────────────────────────────
|
|
283
|
+
program
|
|
284
|
+
.command('branch <name>')
|
|
285
|
+
.description('Create a branch, restore code, and generate context')
|
|
286
|
+
.option('-d, --dir <path>', 'workspace directory', process.cwd())
|
|
287
|
+
.option('-c, --checkpoint <label>', 'branch from a specific checkpoint (default: latest on active branch)')
|
|
288
|
+
.option('--force', 'skip the unsaved-work checkpoint prompt')
|
|
289
|
+
.option('--no-launch', 'skip auto-launching a new OpenCode session')
|
|
290
|
+
.action(async (name, opts) => {
|
|
291
|
+
const cwd = path.resolve(opts.dir);
|
|
292
|
+
header('branch');
|
|
293
|
+
const { engine } = await ensureWorkspace(cwd);
|
|
294
|
+
await syncConversation(engine, cwd);
|
|
295
|
+
// Guard: prompt if there are messages on this branch not yet captured in a checkpoint
|
|
296
|
+
if (!opts.force) {
|
|
297
|
+
const unsaved = countUnsavedMessages(engine);
|
|
298
|
+
if (unsaved > 0) {
|
|
299
|
+
const answer = await promptConfirm(` ${warn(`${unsaved} message(s) are not checkpointed and won't carry to the new branch.`)} Checkpoint now? ${dim('[Y/n]')} `);
|
|
300
|
+
if (answer) {
|
|
301
|
+
const autoLabel = `Auto: before branch "${name}"`;
|
|
302
|
+
await engine.createCheckpoint(autoLabel, { workspacePath: cwd });
|
|
303
|
+
success(`Checkpoint ${chalk.white.bold(`"${autoLabel}"`)} created`);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
// Use checkpoints on the active branch only; fall back to engine auto-create if none exist
|
|
308
|
+
const allCheckpoints = engine.getCheckpoints();
|
|
309
|
+
const activeBranch = engine.getActiveBranch();
|
|
310
|
+
const branchCheckpoints = engine
|
|
311
|
+
.getCheckpointsForBranch(activeBranch.id)
|
|
312
|
+
.sort((a, b) => a.createdAt - b.createdAt);
|
|
313
|
+
let cpId;
|
|
314
|
+
let cpLabel = 'current position';
|
|
315
|
+
if (opts.checkpoint) {
|
|
316
|
+
const cp = allCheckpoints.find((c) => c.label === opts.checkpoint);
|
|
317
|
+
if (!cp) {
|
|
318
|
+
errorMsg(`Checkpoint "${opts.checkpoint}" not found.`);
|
|
319
|
+
process.exit(1);
|
|
320
|
+
}
|
|
321
|
+
cpId = cp.id;
|
|
322
|
+
cpLabel = cp.label;
|
|
323
|
+
}
|
|
324
|
+
else if (branchCheckpoints.length > 0) {
|
|
325
|
+
const lastCp = branchCheckpoints[branchCheckpoints.length - 1];
|
|
326
|
+
cpId = lastCp.id;
|
|
327
|
+
cpLabel = lastCp.label;
|
|
328
|
+
}
|
|
329
|
+
const newBranch = await engine.branch(name, cpId);
|
|
330
|
+
success(`Branch ${brand.bold(`"${name}"`)} created from ${dim(`"${cpLabel}"`)}`);
|
|
331
|
+
if (cpId) {
|
|
332
|
+
const summary = await engine.restoreCheckpoint(cpId, cwd);
|
|
333
|
+
// restoreCheckpoint switches to the checkpoint's parent branch as a side-effect — switch back
|
|
334
|
+
await engine.switchBranch(newBranch.id);
|
|
335
|
+
if (summary) {
|
|
336
|
+
detail('restored', `${summary.written.length} written, ${summary.deleted.length} deleted, ${summary.skipped.length} unchanged`);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
const context = engine.getContext();
|
|
340
|
+
const contextPath = generateContextFile(cwd, name, context);
|
|
341
|
+
detail('context', path.relative(cwd, contextPath));
|
|
342
|
+
if (opts.launch !== false) {
|
|
343
|
+
divider();
|
|
344
|
+
const result = launchOpenCodeSession(cwd);
|
|
345
|
+
if (result.launched) {
|
|
346
|
+
console.log(` ${ARROW} Opening new OpenCode session...`);
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
hint('Could not launch OpenCode automatically.');
|
|
350
|
+
nextSteps();
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
else {
|
|
354
|
+
divider();
|
|
355
|
+
nextSteps();
|
|
356
|
+
}
|
|
357
|
+
divider();
|
|
358
|
+
});
|
|
359
|
+
// ── restore ───────────────────────────────────────────────────────────────
|
|
360
|
+
program
|
|
361
|
+
.command('restore <label>')
|
|
362
|
+
.description('Restore code to a checkpoint + generate context')
|
|
363
|
+
.option('-d, --dir <path>', 'workspace directory', process.cwd())
|
|
364
|
+
.option('--force', 'skip the unsaved-work checkpoint prompt')
|
|
365
|
+
.option('--no-launch', 'skip auto-launching a new OpenCode session')
|
|
366
|
+
.action(async (label, opts) => {
|
|
367
|
+
const cwd = path.resolve(opts.dir);
|
|
368
|
+
header('restore');
|
|
369
|
+
const { engine } = await ensureWorkspace(cwd);
|
|
370
|
+
await syncConversation(engine, cwd);
|
|
371
|
+
// Guard: prompt if there are messages on this branch not yet captured in a checkpoint
|
|
372
|
+
if (!opts.force) {
|
|
373
|
+
const unsaved = countUnsavedMessages(engine);
|
|
374
|
+
if (unsaved > 0) {
|
|
375
|
+
const answer = await promptConfirm(` ${warn(`${unsaved} message(s) are not checkpointed and will be lost after restore.`)} Checkpoint now? ${dim('[Y/n]')} `);
|
|
376
|
+
if (answer) {
|
|
377
|
+
const autoLabel = `Auto: before restore to "${label}"`;
|
|
378
|
+
await engine.createCheckpoint(autoLabel, { workspacePath: cwd });
|
|
379
|
+
success(`Checkpoint ${chalk.white.bold(`"${autoLabel}"`)} created`);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
const checkpoints = engine.getCheckpoints();
|
|
384
|
+
const cp = checkpoints.find((c) => c.label === label);
|
|
385
|
+
if (!cp) {
|
|
386
|
+
errorMsg(`Checkpoint "${label}" not found.`);
|
|
387
|
+
process.exit(1);
|
|
388
|
+
}
|
|
389
|
+
const summary = await engine.restoreCheckpoint(cp.id, cwd);
|
|
390
|
+
if (summary) {
|
|
391
|
+
success(`Restored to ${chalk.white.bold(`"${label}"`)}`);
|
|
392
|
+
detail('written', `${summary.written.length} file(s)`);
|
|
393
|
+
detail('deleted', `${summary.deleted.length} file(s)`);
|
|
394
|
+
detail('unchanged', `${summary.skipped.length} file(s)`);
|
|
395
|
+
}
|
|
396
|
+
else {
|
|
397
|
+
success(`Switched to ${chalk.white.bold(`"${label}"`)} ${dim('(no code snapshot)')}`);
|
|
398
|
+
}
|
|
399
|
+
const context = engine.getContext();
|
|
400
|
+
const branchName = engine.getActiveBranch().name;
|
|
401
|
+
const contextPath = generateContextFile(cwd, branchName, context);
|
|
402
|
+
detail('context', path.relative(cwd, contextPath));
|
|
403
|
+
if (opts.launch !== false) {
|
|
404
|
+
divider();
|
|
405
|
+
const result = launchOpenCodeSession(cwd);
|
|
406
|
+
if (result.launched) {
|
|
407
|
+
console.log(` ${ARROW} Opening new OpenCode session...`);
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
hint('Could not launch OpenCode automatically.');
|
|
411
|
+
nextSteps();
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
else {
|
|
415
|
+
divider();
|
|
416
|
+
nextSteps();
|
|
417
|
+
}
|
|
418
|
+
divider();
|
|
419
|
+
});
|
|
420
|
+
// ── status ────────────────────────────────────────────────────────────────
|
|
421
|
+
program
|
|
422
|
+
.command('status')
|
|
423
|
+
.description('Show active branch, messages, and checkpoints')
|
|
424
|
+
.option('-d, --dir <path>', 'workspace directory', process.cwd())
|
|
425
|
+
.action(async (opts) => {
|
|
426
|
+
const cwd = path.resolve(opts.dir);
|
|
427
|
+
const { engine } = createEngine(cwd);
|
|
428
|
+
const ws = await engine.loadWorkspace(WORKSPACE_ID);
|
|
429
|
+
if (!ws) {
|
|
430
|
+
header('status');
|
|
431
|
+
hint('No workspace found.');
|
|
432
|
+
hint(`Run ${chalk.white('variantree init')} or ${chalk.white('variantree checkpoint "label"')} to get started.`);
|
|
433
|
+
divider();
|
|
434
|
+
return;
|
|
435
|
+
}
|
|
436
|
+
const branch = engine.getActiveBranch();
|
|
437
|
+
const context = engine.getContext();
|
|
438
|
+
const branches = engine.getBranches();
|
|
439
|
+
const checkpoints = engine.getCheckpoints();
|
|
440
|
+
header('status');
|
|
441
|
+
console.log(` ${BRANCH_ICON} ${chalk.white.bold(branch.name)} ${dim(`(${context.length} messages)`)}`);
|
|
442
|
+
divider();
|
|
443
|
+
// Hierarchical tree
|
|
444
|
+
const root = branches.find(b => !b.parentCheckpointId);
|
|
445
|
+
if (root) {
|
|
446
|
+
printBranchNode(root, branches, checkpoints, '', true);
|
|
447
|
+
}
|
|
448
|
+
divider();
|
|
449
|
+
const snapshotCount = checkpoints.filter(cp => cp.snapshotRef).length;
|
|
450
|
+
hint(`${branches.length} branch${branches.length !== 1 ? 'es' : ''} · ${checkpoints.length} checkpoint${checkpoints.length !== 1 ? 's' : ''}${snapshotCount > 0 ? ` (${snapshotCount} with snapshots)` : ''}`);
|
|
451
|
+
divider();
|
|
452
|
+
});
|
|
453
|
+
// ── tree ──────────────────────────────────────────────────────────────────
|
|
454
|
+
program
|
|
455
|
+
.command('tree')
|
|
456
|
+
.description('Visualise the branch tree')
|
|
457
|
+
.option('-d, --dir <path>', 'workspace directory', process.cwd())
|
|
458
|
+
.action(async (opts) => {
|
|
459
|
+
const cwd = path.resolve(opts.dir);
|
|
460
|
+
const { engine } = createEngine(cwd);
|
|
461
|
+
const ws = await engine.loadWorkspace(WORKSPACE_ID);
|
|
462
|
+
if (!ws) {
|
|
463
|
+
header('tree');
|
|
464
|
+
hint('No workspace found.');
|
|
465
|
+
divider();
|
|
466
|
+
return;
|
|
467
|
+
}
|
|
468
|
+
const branches = engine.getBranches();
|
|
469
|
+
const checkpoints = engine.getCheckpoints();
|
|
470
|
+
header('tree');
|
|
471
|
+
const root = branches.find(b => !b.parentCheckpointId);
|
|
472
|
+
if (root) {
|
|
473
|
+
printBranchNode(root, branches, checkpoints, '', true);
|
|
474
|
+
}
|
|
475
|
+
else {
|
|
476
|
+
hint('No branches found.');
|
|
477
|
+
}
|
|
478
|
+
divider();
|
|
479
|
+
});
|
|
480
|
+
// ── watch (optional) ──────────────────────────────────────────────────────
|
|
481
|
+
program
|
|
482
|
+
.command('watch')
|
|
483
|
+
.description('(Optional) Real-time watcher for web UI')
|
|
484
|
+
.option('-d, --dir <path>', 'workspace directory', process.cwd())
|
|
485
|
+
.action(async (opts) => {
|
|
486
|
+
const cwd = path.resolve(opts.dir);
|
|
487
|
+
header('watch');
|
|
488
|
+
const { engine } = await ensureWorkspace(cwd);
|
|
489
|
+
// Use the pinned adapter if one exists, otherwise fall back to the first registered adapter.
|
|
490
|
+
const adapters = ALL_TOOLS.flatMap(t => (t.adapter ? [t.adapter] : []));
|
|
491
|
+
const pinnedAdapter = adapters.find(a => engine.getSessionId(a.name) != null);
|
|
492
|
+
const adapter = pinnedAdapter ?? adapters[0];
|
|
493
|
+
const watcher = new VariantreeWatcher({
|
|
494
|
+
workspacePath: cwd,
|
|
495
|
+
adapter,
|
|
496
|
+
engine,
|
|
497
|
+
onSync: (count) => console.log(` ${CHECK} Synced ${accent(String(count))} message(s)`),
|
|
498
|
+
onError: (e) => console.error(` ${CROSS} ${e.message}`),
|
|
499
|
+
});
|
|
500
|
+
await watcher.start();
|
|
501
|
+
console.log(` ${dim('Watching for changes... Press')} ${chalk.white('Ctrl+C')} ${dim('to stop.')}`);
|
|
502
|
+
divider();
|
|
503
|
+
process.on('SIGINT', async () => {
|
|
504
|
+
await watcher.stop();
|
|
505
|
+
console.log(`\n ${dim('Watcher stopped.')}`);
|
|
506
|
+
divider();
|
|
507
|
+
process.exit(0);
|
|
508
|
+
});
|
|
509
|
+
});
|
|
510
|
+
program.parse();
|
|
511
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,SAAS,CAAC;AAC7B,OAAO,QAAQ,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC3F,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C,6EAA6E;AAE7E,MAAM,YAAY,GAAG,SAAS,CAAC;AAE/B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAO,SAAS;AACnD,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAM,QAAQ;AAClD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;AACtB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAQ,QAAQ;AAClD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAS,MAAM;AAChD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAQ,OAAO;AAEjD,MAAM,IAAI,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC;AACnC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;AAC1B,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;AACvB,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;AACrB,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;AACvB,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;AAC/B,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;AACtB,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;AAC3B,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;AAC7B,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;AAE5B,6EAA6E;AAE7E,SAAS,MAAM,CAAC,IAAY;IAC1B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,MAAM,CAAC,KAAa,EAAE,KAAa;IAC1C,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,IAAI,CAAC,IAAY;IACxB,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,OAAO;IACd,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,4BAA4B,GAAG,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,CAAC,kDAAkD,CAAC,EAAE,CAAC,CAAC;AAC9F,CAAC;AAkBD,SAAS,eAAe,CACtB,MAAkB,EAClB,WAAyB,EACzB,cAAgC,EAChC,MAAc,EACd,MAAe;IAEf,MAAM,SAAS,GAAG,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC;IAC7E,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;IACzD,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEtD,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,GAAG,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,MAAM,CAAC,YAAY,QAAQ,CAAC,GAAG,SAAS,EAAE,CAAC,CAAC;IAE9H,MAAM,SAAS,GAAG,cAAc;SAC7B,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,KAAK,MAAM,CAAC,EAAE,CAAC;SACvC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;IAE7C,MAAM,WAAW,GAAG,MAAM,KAAK,EAAE;QAC/B,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAExC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,kBAAkB,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9E,MAAM,QAAQ,GAAG,CAAC,KAAK,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,CAAC;QAC1E,MAAM,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;QACpD,MAAM,IAAI,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;QAE3C,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,WAAW,CAAC,GAAG,WAAW,IAAI,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC;QAErF,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,eAAe,CACb,aAAa,CAAC,CAAC,CAAC,EAChB,WAAW,EACX,cAAc,EACd,WAAW,GAAG,YAAY,EAC1B,CAAC,KAAK,aAAa,CAAC,MAAM,GAAG,CAAC,CAC/B,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,WAAW,CAAC,GAAG,QAAQ,IAAI,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC;AAED,uCAAuC;AACvC,SAAS,YAAY,CAAC,GAAW;IAC/B,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,gBAAgB,GAAG,IAAI,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC;QAC7B,OAAO;QACP,gBAAgB;KACjB,CAAC,CAAC;IACH,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAC/C,CAAC;AAED,yCAAyC;AACzC,KAAK,UAAU,eAAe,CAAC,GAAW;IACxC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAC9C,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;IAClD,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;QAChD,EAAE,CAAC,EAAE,GAAG,YAAY,CAAC;QACrB,MAAM,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QACrC,MAAM,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC7B,CAAC;AAED,6CAA6C;AAC7C,SAAS,mBAAmB,CAAC,GAAW,EAAE,UAAkB,EAAE,QAAkD;IAC9G,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IACjD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtF,MAAM,KAAK,GAAa;QACtB,6BAA6B;QAC7B,EAAE;QACF,eAAe,UAAU,EAAE;QAC3B,kBAAkB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE;QAC5C,EAAE;QACF,4EAA4E;QAC5E,uEAAuE;QACvE,wDAAwD;QACxD,EAAE;QACF,KAAK;QACL,EAAE;QACF,yBAAyB;QACzB,EAAE;KACH,CAAC;IAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IAC3D,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC;YACpE,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG;gBACtC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK;gBACnC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,mBAAmB,CAAC,CAAC;IAC5D,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;IACzD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,2EAA2E;AAC3E,KAAK,UAAU,aAAa,CAAC,QAAgB;IAC3C,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;YAC/B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,SAAS,oBAAoB,CAAC,MAAmB;IAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;IACxC,MAAM,iBAAiB,GAAG,MAAM;SAC7B,uBAAuB,CAAC,MAAM,CAAC,EAAE,CAAC;SAClC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;IAC7C,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;IAClE,MAAM,MAAM,GAAG,iBAAiB,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/D,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,UAAU,CAAC,EAAU;IAC5B,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;IACvB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IACzC,IAAI,IAAI,GAAG,MAAM;QAAE,OAAO,UAAU,CAAC;IACrC,IAAI,IAAI,GAAG,SAAS;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;IACjE,IAAI,IAAI,GAAG,UAAU;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC;IACrE,OAAO,CAAC,CAAC,kBAAkB,EAAE,CAAC;AAChC,CAAC;AAED,6EAA6E;AAE7E,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAC9B,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;KAC1D,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,6EAA6E;AAC7E,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KAChE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,CAAC,MAAM,CAAC,CAAC;IACf,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC;IAC3B,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAE3B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IACrD,IAAI,CAAC;QACH,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;QAC5E,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,KAAK;YACnB,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,4BAA4B,CAAC;YAC9C,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC;QAErC,MAAM,SAAS,GAAG;YAChB,IAAI,EAAE,OAAO;YACb,OAAO;YACP,WAAW,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE;SACrC,CAAC;QAEF,IAAI,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACpC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;YAC3E,IAAI,CAAC,YAAY,CAAC,GAAG;gBAAE,YAAY,CAAC,GAAG,GAAG,EAAE,CAAC;YAC7C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;gBAChC,YAAY,CAAC,GAAG,CAAC,UAAU,GAAG,SAAS,CAAC;gBACxC,MAAM,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;gBAClF,OAAO,CAAC,qDAAqD,CAAC,CAAC;YAClE,CAAC;iBAAM,CAAC;gBACL,IAAI,CAAC,2CAA2C,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;aAAM,CAAC;YACL,MAAM,SAAS,GAAG;gBACf,SAAS,EAAE,iCAAiC;gBAC5C,GAAG,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE;aAChC,CAAC;YACF,MAAM,CAAC,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YAC/E,OAAO,CAAC,kDAAkD,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,sFAAsF,CAAC,CAAC;IAC/F,CAAC;IAED,iEAAiE;IACjE,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YAAC,OAAO,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,OAAO,IAAI,CAAC;QAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9G,MAAM,WAAW,GAAG,QAAQ,EAAE,QAAQ,CAAC,iBAAiB,CAAC,CAAC;QAC1D,yBAAyB,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,WAAW,EAAE,CAAC;YAChB,IAAI,CAAC,6DAA6D,CAAC,CAAC;QACtE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,iDAAiD,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC,oCAAoC,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,CAAC,OAAO,KAAK,CAAC,KAAK,CAAC,+BAA+B,CAAC,qCAAqC,CAAC,CAAC;IAC/F,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC,CAAC;AAEL,6EAA6E;AAC7E,OAAO;KACJ,OAAO,CAAC,oBAAoB,CAAC;KAC7B,WAAW,CAAC,iDAAiD,CAAC;KAC9D,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KAChE,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,IAAI,EAAE,EAAE;IACpC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,CAAC,YAAY,CAAC,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC;IAE9C,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnD,MAAM,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7D,OAAO,CAAC,cAAc,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC,UAAU,CAAC,CAAC;IAChE,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACf,MAAM,CAAC,QAAQ,EAAE,GAAG,MAAM,2BAA2B,CAAC,CAAC;IACzD,CAAC;IACD,MAAM,CAAC,UAAU,EAAE,cAAc,IAAI,EAAE,CAAC,CAAC;IACzC,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC,CAAC;AAEL,6EAA6E;AAC7E,OAAO;KACJ,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,qDAAqD,CAAC;KAClE,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KAChE,MAAM,CAAC,0BAA0B,EAAE,sEAAsE,CAAC;KAC1G,MAAM,CAAC,SAAS,EAAE,yCAAyC,CAAC;KAC5D,MAAM,CAAC,aAAa,EAAE,4CAA4C,CAAC;KACnE,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAI,EAAE,EAAE;IACnC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEpC,sFAAsF;IACtF,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAChB,MAAM,MAAM,GAAG,MAAM,aAAa,CAChC,KAAK,IAAI,CAAC,GAAG,OAAO,qEAAqE,CAAC,oBAAoB,GAAG,CAAC,OAAO,CAAC,GAAG,CAC9H,CAAC;YACF,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,SAAS,GAAG,wBAAwB,IAAI,GAAG,CAAC;gBAClD,MAAM,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;gBACjE,OAAO,CAAC,cAAc,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,SAAS,GAAG,CAAC,UAAU,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;IACH,CAAC;IAED,2FAA2F;IAC3F,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;IAC/C,MAAM,YAAY,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;IAC9C,MAAM,iBAAiB,GAAG,MAAM;SAC7B,uBAAuB,CAAC,YAAY,CAAC,EAAE,CAAC;SACxC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;IAE7C,IAAI,IAAwB,CAAC;IAC7B,IAAI,OAAO,GAAG,kBAAkB,CAAC;IAEjC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC;QACnE,IAAI,CAAC,EAAE,EAAE,CAAC;YAAC,QAAQ,CAAC,eAAe,IAAI,CAAC,UAAU,cAAc,CAAC,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QACrF,IAAI,GAAG,EAAE,CAAC,EAAE,CAAC;QACb,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC;IACrB,CAAC;SAAM,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,iBAAiB,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC/D,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC;QACjB,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;IACzB,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAClD,OAAO,CAAC,UAAU,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,iBAAiB,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC;IAEjF,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC1D,8FAA8F;QAC9F,MAAM,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACxC,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,UAAU,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,aAAa,OAAO,CAAC,OAAO,CAAC,MAAM,aAAa,OAAO,CAAC,OAAO,CAAC,MAAM,YAAY,CAAC,CAAC;QAClI,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IACpC,MAAM,WAAW,GAAG,mBAAmB,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5D,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;IAEnD,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;QACV,MAAM,MAAM,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,kCAAkC,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,0CAA0C,CAAC,CAAC;YACjD,SAAS,EAAE,CAAC;QACd,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,CAAC;IACd,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC,CAAC;AAEL,6EAA6E;AAC7E,OAAO;KACJ,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,iDAAiD,CAAC;KAC9D,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KAChE,MAAM,CAAC,SAAS,EAAE,yCAAyC,CAAC;KAC5D,MAAM,CAAC,aAAa,EAAE,4CAA4C,CAAC;KACnE,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,IAAI,EAAE,EAAE;IACpC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,CAAC,SAAS,CAAC,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAEpC,sFAAsF;IACtF,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAChB,MAAM,MAAM,GAAG,MAAM,aAAa,CAChC,KAAK,IAAI,CAAC,GAAG,OAAO,kEAAkE,CAAC,oBAAoB,GAAG,CAAC,OAAO,CAAC,GAAG,CAC3H,CAAC;YACF,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,SAAS,GAAG,4BAA4B,KAAK,GAAG,CAAC;gBACvD,MAAM,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;gBACjE,OAAO,CAAC,cAAc,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,SAAS,GAAG,CAAC,UAAU,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;IAC5C,MAAM,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;IACtD,IAAI,CAAC,EAAE,EAAE,CAAC;QAAC,QAAQ,CAAC,eAAe,KAAK,cAAc,CAAC,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;IAE3E,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC3D,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,eAAe,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;QACzD,MAAM,CAAC,SAAS,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,UAAU,CAAC,CAAC;QACvD,MAAM,CAAC,SAAS,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,UAAU,CAAC,CAAC;QACvD,MAAM,CAAC,WAAW,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,UAAU,CAAC,CAAC;IAC3D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,eAAe,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;IACxF,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IACpC,MAAM,UAAU,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC;IACjD,MAAM,WAAW,GAAG,mBAAmB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IAClE,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;IAEnD,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;QACV,MAAM,MAAM,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,kCAAkC,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,0CAA0C,CAAC,CAAC;YACjD,SAAS,EAAE,CAAC;QACd,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,CAAC;IACd,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC,CAAC;AAEL,6EAA6E;AAC7E,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,+CAA+C,CAAC;KAC5D,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KAChE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;IACpD,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,CAAC,QAAQ,CAAC,CAAC;QACjB,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAC5B,IAAI,CAAC,OAAO,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,OAAO,KAAK,CAAC,KAAK,CAAC,+BAA+B,CAAC,kBAAkB,CAAC,CAAC;QACjH,OAAO,EAAE,CAAC;QACV,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;IACxC,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACtC,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;IAE5C,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEjB,OAAO,CAAC,GAAG,CAAC,KAAK,WAAW,KAAK,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,YAAY,CAAC,EAAE,CAAC,CAAC;IAC1G,OAAO,EAAE,CAAC;IAEV,oBAAoB;IACpB,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;IACvD,IAAI,IAAI,EAAE,CAAC;QACT,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,EAAE,CAAC;IACV,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC;IACtE,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,UAAU,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,WAAW,CAAC,MAAM,cAAc,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,aAAa,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/M,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC,CAAC;AAEL,6EAA6E;AAC7E,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,2BAA2B,CAAC;KACxC,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KAChE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;IACpD,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,CAAC,MAAM,CAAC,CAAC;QACf,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAC5B,OAAO,EAAE,CAAC;QACV,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACtC,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;IAE5C,MAAM,CAAC,MAAM,CAAC,CAAC;IAEf,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;IACvD,IAAI,IAAI,EAAE,CAAC;QACT,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IACzD,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC,CAAC;AAEL,6EAA6E;AAC7E,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KAChE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC;IAE9C,6FAA6F;IAC7F,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxE,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;IAC9E,MAAM,OAAO,GAAG,aAAa,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE7C,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC;QACpC,aAAa,EAAE,GAAG;QAClB,OAAO;QACP,MAAM;QACN,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,WAAW,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC;QACvF,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;KACzD,CAAC,CAAC;IAEH,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACtB,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,+BAA+B,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACrG,OAAO,EAAE,CAAC;IAEV,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QAC9B,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;QAC9C,OAAO,EAAE,CAAC;QACV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
|