@memnexus-ai/mx-agent-cli 0.1.23 → 0.1.24
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 +104 -0
- package/dist/__tests__/init-validation.test.d.ts +2 -0
- package/dist/__tests__/init-validation.test.d.ts.map +1 -0
- package/dist/__tests__/init-validation.test.js +32 -0
- package/dist/__tests__/init-validation.test.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +16 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/lib/project-config.d.ts +7 -0
- package/dist/lib/project-config.d.ts.map +1 -1
- package/dist/lib/project-config.js +3 -2
- package/dist/lib/project-config.js.map +1 -1
- package/package.json +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# @memnexus-ai/mx-agent-cli
|
|
2
|
+
|
|
3
|
+
`mx-agent` lets you run isolated AI agent teams on any git repository. Each team gets its own git worktree, a roleguide that defines its job, and named MemNexus memories that carry state across sessions — so you can run multiple focused agents in parallel without them stepping on each other.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
- **Node 18+**
|
|
8
|
+
- **MemNexus access** — npm scope `@memnexus-ai` requires registry access; contact your MemNexus administrator
|
|
9
|
+
- **`mx` CLI installed** — required by `mx-agent status` and `mx-agent pager`; install from MemNexus
|
|
10
|
+
- **A git repository** — `mx-agent` must be run from inside a git repo
|
|
11
|
+
|
|
12
|
+
## Quick Start
|
|
13
|
+
|
|
14
|
+
**1. Install**
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npm install -g @memnexus-ai/mx-agent-cli
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**2. Initialise your project**
|
|
21
|
+
|
|
22
|
+
Run this once from the root of your git repository:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
mx-agent init
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Creates `mx-agent.config.json` and the `mx-agent-system/` directory structure including agent permissions config and a `CLAUDE.md.template`.
|
|
29
|
+
|
|
30
|
+
**3. Write a roleguide**
|
|
31
|
+
|
|
32
|
+
A roleguide is a markdown file that acts as the agent's job description — what it works on, how it prioritises, and how it reports status. See [docs/adoption-guide.md](../docs/adoption-guide.md) for a full template and explanation.
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
# Example: create your first roleguide
|
|
36
|
+
vim mx-agent-system/roleguides/my-team-leader.md
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
**4. Create a team and start a session**
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
mx-agent create --roleguide mx-agent-system/roleguides/my-team-leader.md --name my-team
|
|
43
|
+
mx-agent start my-team
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Command Reference
|
|
49
|
+
|
|
50
|
+
| Command | Description | Key options |
|
|
51
|
+
|---------|-------------|-------------|
|
|
52
|
+
| `mx-agent init` | Scaffold `mx-agent-system/` for a new project | `--force`, `--base-branch <branch>`, `--worktree-dir <path>`, `--config-source <path>` |
|
|
53
|
+
| `mx-agent create` | Create a new agent team: worktree + memories + catalog entry | `--roleguide <path>` (required), `--name <slug>` |
|
|
54
|
+
| `mx-agent start <name>` | Start an isolated Claude session for a team | — |
|
|
55
|
+
| `mx-agent list` | List all teams and their worktree status | — |
|
|
56
|
+
| `mx-agent status <name>` | Show a team's current `{name}-leader-state` memory | — |
|
|
57
|
+
| `mx-agent usage [name]` | Show token usage and cost from Claude session logs, broken down by team | `--recent <period>` (default: `30d`; e.g. `7d`, `24h`) |
|
|
58
|
+
| `mx-agent pager` | Watch team states and post Slack alerts when operator attention is needed | `--webhook <url>`, `--interval <seconds>` (default: `300`), `--once` |
|
|
59
|
+
| `mx-agent update` | Update `mx-agent` to the latest version from npm | — |
|
|
60
|
+
| `mx-agent config set <key> <value>` | Set a persistent operator config value (e.g. `slack-webhook`) | — |
|
|
61
|
+
| `mx-agent config get <key>` | Get a config value | — |
|
|
62
|
+
| `mx-agent config list` | List all config values | — |
|
|
63
|
+
| `mx-agent config unset <key>` | Remove a config value | — |
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Configuration
|
|
68
|
+
|
|
69
|
+
`mx-agent.config.json` is written to your project root by `mx-agent init`. All fields are optional and fall back to the defaults shown below.
|
|
70
|
+
|
|
71
|
+
| Field | Type | Default | Description |
|
|
72
|
+
|-------|------|---------|-------------|
|
|
73
|
+
| `baseBranch` | `string` | `"main"` | Base branch for git operations. Change to `"develop"` if your default branch isn't `main`. |
|
|
74
|
+
| `worktreeDir` | `string` | `".worktrees"` | Directory under the project root where agent worktrees are stored. |
|
|
75
|
+
| `configSource` | `string` | `"mx-agent-system/agent-config"` | Path to the agent-config directory containing `settings.json`, `CLAUDE.md.template`, and hooks. |
|
|
76
|
+
| `teamsDir` | `string` | `"mx-agent-system/teams"` | Path to the teams catalog directory. |
|
|
77
|
+
| `roleguidesDir` | `string` | `"mx-agent-system/roleguides"` | Path to the roleguides directory. |
|
|
78
|
+
|
|
79
|
+
Values must contain only alphanumeric characters, hyphens, underscores, dots, and forward slashes. Path traversal (`..`) is not permitted.
|
|
80
|
+
|
|
81
|
+
**Example:**
|
|
82
|
+
|
|
83
|
+
```json
|
|
84
|
+
{
|
|
85
|
+
"baseBranch": "develop",
|
|
86
|
+
"worktreeDir": ".worktrees",
|
|
87
|
+
"configSource": "mx-agent-system/agent-config",
|
|
88
|
+
"teamsDir": "mx-agent-system/teams",
|
|
89
|
+
"roleguidesDir": "mx-agent-system/roleguides"
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Further reading
|
|
96
|
+
|
|
97
|
+
See **[docs/adoption-guide.md](../docs/adoption-guide.md)** for:
|
|
98
|
+
|
|
99
|
+
- Core concepts explained
|
|
100
|
+
- Step-by-step setup walkthrough
|
|
101
|
+
- How to customise agent permissions and `CLAUDE.md.template`
|
|
102
|
+
- Operational workflows (monitoring, cost tracking, team status)
|
|
103
|
+
- Troubleshooting common errors
|
|
104
|
+
- Full roleguide template
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-validation.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/init-validation.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { validateProjectConfig } from '../lib/project-config.js';
|
|
3
|
+
/**
|
|
4
|
+
* Tests for the init CLI option validation path (PLAT-032).
|
|
5
|
+
*
|
|
6
|
+
* The mx-agent init command builds a partial ProjectConfig from its CLI opts
|
|
7
|
+
* (--base-branch, --worktree-dir, --config-source) and passes them through
|
|
8
|
+
* validateProjectConfig() before writing mx-agent.config.json.
|
|
9
|
+
*
|
|
10
|
+
* These tests exercise validateProjectConfig() directly with the same values
|
|
11
|
+
* the CLI would pass, confirming that shell metacharacters and path traversal
|
|
12
|
+
* are rejected before any file is written.
|
|
13
|
+
*/
|
|
14
|
+
describe('init CLI option validation (PLAT-032)', () => {
|
|
15
|
+
it('rejects --base-branch value containing a shell metacharacter', () => {
|
|
16
|
+
const configFromOpts = { baseBranch: 'main; rm -rf /' };
|
|
17
|
+
expect(() => validateProjectConfig(configFromOpts)).toThrow(/disallowed characters/);
|
|
18
|
+
});
|
|
19
|
+
it('rejects --config-source value containing path traversal (..)', () => {
|
|
20
|
+
const configFromOpts = { configSource: '../../etc/passwd' };
|
|
21
|
+
expect(() => validateProjectConfig(configFromOpts)).toThrow(/path traversal/);
|
|
22
|
+
});
|
|
23
|
+
it('accepts valid CLI option values without throwing', () => {
|
|
24
|
+
const configFromOpts = {
|
|
25
|
+
baseBranch: 'feature/my-branch',
|
|
26
|
+
worktreeDir: '.worktrees',
|
|
27
|
+
configSource: 'mx-agent-system/agent-config',
|
|
28
|
+
};
|
|
29
|
+
expect(() => validateProjectConfig(configFromOpts)).not.toThrow();
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=init-validation.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-validation.test.js","sourceRoot":"","sources":["../../src/__tests__/init-validation.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE;;;;;;;;;;GAUG;AAEH,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACrD,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,cAAc,GAAG,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC;QACxD,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,cAAc,GAAG,EAAE,YAAY,EAAE,kBAAkB,EAAE,CAAC;QAC5D,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,cAAc,GAAG;YACrB,UAAU,EAAE,mBAAmB;YAC/B,WAAW,EAAE,YAAY;YACzB,YAAY,EAAE,8BAA8B;SAC7C,CAAC;QACF,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACpE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AASH,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA2BD,wBAAsB,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA+FjE"}
|
package/dist/commands/init.js
CHANGED
|
@@ -21,6 +21,7 @@ import { join } from 'path';
|
|
|
21
21
|
import chalk from 'chalk';
|
|
22
22
|
import { findProjectRoot } from '../lib/worktree.js';
|
|
23
23
|
import { SETTINGS_JSON_TEMPLATE, WORKTREE_GUARD_SH_TEMPLATE, CLAUDE_MD_TEMPLATE } from '../lib/templates.js';
|
|
24
|
+
import { validateProjectConfig } from '../lib/project-config.js';
|
|
24
25
|
function logCreated(path) {
|
|
25
26
|
console.log(chalk.green(' ✓ created ') + chalk.dim(path));
|
|
26
27
|
}
|
|
@@ -53,6 +54,21 @@ export async function runInit(options) {
|
|
|
53
54
|
console.error(chalk.red(`Error: ${err instanceof Error ? err.message : String(err)}`));
|
|
54
55
|
process.exit(1);
|
|
55
56
|
}
|
|
57
|
+
// Validate CLI option values before any file writes
|
|
58
|
+
const configFromOpts = {};
|
|
59
|
+
if (options.baseBranch)
|
|
60
|
+
configFromOpts.baseBranch = options.baseBranch;
|
|
61
|
+
if (options.worktreeDir)
|
|
62
|
+
configFromOpts.worktreeDir = options.worktreeDir;
|
|
63
|
+
if (options.configSource)
|
|
64
|
+
configFromOpts.configSource = options.configSource;
|
|
65
|
+
try {
|
|
66
|
+
validateProjectConfig(configFromOpts);
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
console.error(chalk.red(`Error: ${err instanceof Error ? err.message : String(err)}`));
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
56
72
|
// Resolve config values from options (fall back to defaults)
|
|
57
73
|
const baseBranch = options.baseBranch ?? 'main';
|
|
58
74
|
const worktreeDir = options.worktreeDir ?? '.worktrees';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACrE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,13 @@ export interface ProjectConfig {
|
|
|
19
19
|
roleguidesDir?: string;
|
|
20
20
|
}
|
|
21
21
|
export declare const PROJECT_CONFIG_DEFAULTS: Required<ProjectConfig>;
|
|
22
|
+
/**
|
|
23
|
+
* Validate that config field values are safe for use in shell commands and path joins.
|
|
24
|
+
* Throws a descriptive error if any field contains disallowed characters.
|
|
25
|
+
* Called by loadProjectConfig before returning, and by the init command to validate
|
|
26
|
+
* CLI option values before writing the config file.
|
|
27
|
+
*/
|
|
28
|
+
export declare function validateProjectConfig(config: ProjectConfig): ProjectConfig;
|
|
22
29
|
/**
|
|
23
30
|
* Read mx-agent.config.json from projectRoot.
|
|
24
31
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-config.d.ts","sourceRoot":"","sources":["../../src/lib/project-config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,MAAM,WAAW,aAAa;IAC5B,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qFAAqF;IACrF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qGAAqG;IACrG,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+FAA+F;IAC/F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iGAAiG;IACjG,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,aAAa,CAM3D,CAAC;
|
|
1
|
+
{"version":3,"file":"project-config.d.ts","sourceRoot":"","sources":["../../src/lib/project-config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,MAAM,WAAW,aAAa;IAC5B,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qFAAqF;IACrF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qGAAqG;IACrG,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+FAA+F;IAC/F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iGAAiG;IACjG,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,aAAa,CAM3D,CAAC;AAKF;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,CAgB1E;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAoB3E;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,aAAa,GAAG,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,CAQrF"}
|
|
@@ -20,9 +20,10 @@ const SHELL_UNSAFE_RE = /[;|&`$(){}!#\\<>\n\r\x00]/;
|
|
|
20
20
|
/**
|
|
21
21
|
* Validate that config field values are safe for use in shell commands and path joins.
|
|
22
22
|
* Throws a descriptive error if any field contains disallowed characters.
|
|
23
|
-
* Called by loadProjectConfig before returning
|
|
23
|
+
* Called by loadProjectConfig before returning, and by the init command to validate
|
|
24
|
+
* CLI option values before writing the config file.
|
|
24
25
|
*/
|
|
25
|
-
function validateProjectConfig(config) {
|
|
26
|
+
export function validateProjectConfig(config) {
|
|
26
27
|
for (const [key, value] of Object.entries(config)) {
|
|
27
28
|
if (typeof value !== 'string')
|
|
28
29
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-config.js","sourceRoot":"","sources":["../../src/lib/project-config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAe5B,MAAM,CAAC,MAAM,uBAAuB,GAA4B;IAC9D,UAAU,EAAE,MAAM;IAClB,WAAW,EAAE,YAAY;IACzB,YAAY,EAAE,8BAA8B;IAC5C,QAAQ,EAAE,uBAAuB;IACjC,aAAa,EAAE,4BAA4B;CAC5C,CAAC;AAEF,8EAA8E;AAC9E,MAAM,eAAe,GAAG,2BAA2B,CAAC;AAEpD
|
|
1
|
+
{"version":3,"file":"project-config.js","sourceRoot":"","sources":["../../src/lib/project-config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAe5B,MAAM,CAAC,MAAM,uBAAuB,GAA4B;IAC9D,UAAU,EAAE,MAAM;IAClB,WAAW,EAAE,YAAY;IACzB,YAAY,EAAE,8BAA8B;IAC5C,QAAQ,EAAE,uBAAuB;IACjC,aAAa,EAAE,4BAA4B;CAC5C,CAAC;AAEF,8EAA8E;AAC9E,MAAM,eAAe,GAAG,2BAA2B,CAAC;AAEpD;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAqB;IACzD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAoC,EAAE,CAAC;QACrF,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QACxC,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CACb,0BAA0B,GAAG,oCAAoC;gBACjE,8FAA8F,CAC/F,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACb,0BAA0B,GAAG,uDAAuD,CACrF,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,WAAmB;IACnD,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,sBAAsB,CAAC,CAAC;IAC7D,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,IAAI,MAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;QAC1D,MAAM,GAAG,EAAE,CAAC;QACZ,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ;YAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QACjF,IAAI,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ;YAAE,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACpF,IAAI,OAAO,MAAM,CAAC,YAAY,KAAK,QAAQ;YAAE,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QACvF,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ;YAAE,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC3E,IAAI,OAAO,MAAM,CAAC,aAAa,KAAK,QAAQ;YAAE,MAAM,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;IAC5F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,oFAAoF;IACpF,gDAAgD;IAChD,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC9B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,CAAuB;IAC1D,OAAO;QACL,UAAU,EAAE,CAAC,EAAE,UAAU,IAAI,uBAAuB,CAAC,UAAU;QAC/D,WAAW,EAAE,CAAC,EAAE,WAAW,IAAI,uBAAuB,CAAC,WAAW;QAClE,YAAY,EAAE,CAAC,EAAE,YAAY,IAAI,uBAAuB,CAAC,YAAY;QACrE,QAAQ,EAAE,CAAC,EAAE,QAAQ,IAAI,uBAAuB,CAAC,QAAQ;QACzD,aAAa,EAAE,CAAC,EAAE,aAAa,IAAI,uBAAuB,CAAC,aAAa;KACzE,CAAC;AACJ,CAAC"}
|