opencode-copilot-multi-fix 1.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/LICENSE +21 -0
- package/README.md +172 -0
- package/bin/cli.js +26 -0
- package/dist/commands/multi-copilot.d.ts +18 -0
- package/dist/commands/multi-copilot.d.ts.map +1 -0
- package/dist/commands/multi-copilot.js +403 -0
- package/dist/commands/multi-copilot.js.map +1 -0
- package/dist/config/writer.d.ts +22 -0
- package/dist/config/writer.d.ts.map +1 -0
- package/dist/config/writer.js +143 -0
- package/dist/config/writer.js.map +1 -0
- package/dist/discovery/accounts.d.ts +24 -0
- package/dist/discovery/accounts.d.ts.map +1 -0
- package/dist/discovery/accounts.js +128 -0
- package/dist/discovery/accounts.js.map +1 -0
- package/dist/discovery/models.d.ts +32 -0
- package/dist/discovery/models.d.ts.map +1 -0
- package/dist/discovery/models.js +124 -0
- package/dist/discovery/models.js.map +1 -0
- package/dist/discovery/username.d.ts +8 -0
- package/dist/discovery/username.d.ts.map +1 -0
- package/dist/discovery/username.js +47 -0
- package/dist/discovery/username.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +82 -0
- package/dist/index.js.map +1 -0
- package/dist/provider.d.ts +16 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +174 -0
- package/dist/provider.js.map +1 -0
- package/dist/storage/auth.d.ts +21 -0
- package/dist/storage/auth.d.ts.map +1 -0
- package/dist/storage/auth.js +130 -0
- package/dist/storage/auth.js.map +1 -0
- package/dist/storage/pool.d.ts +29 -0
- package/dist/storage/pool.d.ts.map +1 -0
- package/dist/storage/pool.js +152 -0
- package/dist/storage/pool.js.map +1 -0
- package/dist/types.d.ts +108 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +32 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/errors.d.ts +28 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +52 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/jsonc.d.ts +20 -0
- package/dist/utils/jsonc.d.ts.map +1 -0
- package/dist/utils/jsonc.js +91 -0
- package/dist/utils/jsonc.js.map +1 -0
- package/dist/utils/logger.d.ts +11 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +53 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +71 -0
- package/scripts/postinstall.js +86 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Valerio Fantozzi
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
# opencode-copilot-multi
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/opencode-copilot-multi)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
[](https://nodejs.org/)
|
|
6
|
+
|
|
7
|
+
OpenCode plugin for seamless switching between **multiple GitHub Copilot accounts** in a single session.
|
|
8
|
+
|
|
9
|
+
## ✨ Features
|
|
10
|
+
|
|
11
|
+
- 🔄 **Multi-account support** - Use 2+ GitHub Copilot accounts simultaneously
|
|
12
|
+
- 🎯 **Per-model labeling** - Models appear as `username:model-name`
|
|
13
|
+
- 🔒 **Secure** - OAuth tokens stored locally with 0600 permissions
|
|
14
|
+
- ⚡ **Non-blocking** - Lazy loads, zero impact on OpenCode startup
|
|
15
|
+
- 🔄 **Auto token refresh** - 5-minute buffer before expiry
|
|
16
|
+
- 📱 **Cross-platform** - macOS, Linux, Windows
|
|
17
|
+
|
|
18
|
+
## 📋 Supported Models
|
|
19
|
+
|
|
20
|
+
**Claude**: Opus/Sonnet/Haiku (all versions)
|
|
21
|
+
**OpenAI**: GPT-5, GPT-4o, o1, o3-mini
|
|
22
|
+
**Google**: Gemini 2.5 Pro, Gemini 3
|
|
23
|
+
|
|
24
|
+
**15+ models** total. New models auto-detected when you authenticate.
|
|
25
|
+
|
|
26
|
+
## 🔧 Installation
|
|
27
|
+
|
|
28
|
+
### Option 1: Global (Recommended)
|
|
29
|
+
```bash
|
|
30
|
+
npm install -g opencode-copilot-multi
|
|
31
|
+
# Restart OpenCode
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### Option 2: Via NPX
|
|
35
|
+
```bash
|
|
36
|
+
npx opencode-copilot-multi@latest add
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Option 3: Manual
|
|
40
|
+
Edit `~/.config/opencode/opencode.json`:
|
|
41
|
+
```json
|
|
42
|
+
{
|
|
43
|
+
"plugin": ["opencode-copilot-multi"]
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## 🎯 Quick Start
|
|
48
|
+
|
|
49
|
+
1. **Add account**
|
|
50
|
+
```bash
|
|
51
|
+
opencode-copilot-multi add
|
|
52
|
+
```
|
|
53
|
+
- Launches OpenCode auth
|
|
54
|
+
- Select "GitHub Copilot"
|
|
55
|
+
- Complete OAuth
|
|
56
|
+
|
|
57
|
+
2. **Restart OpenCode** - models now appear
|
|
58
|
+
|
|
59
|
+
3. **Select model** - e.g., `john:claude-sonnet-4`
|
|
60
|
+
|
|
61
|
+
4. **Add more accounts** - Run `add` again
|
|
62
|
+
|
|
63
|
+
## 🛠️ CLI Commands
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
opencode-copilot-multi list # Show all accounts
|
|
67
|
+
opencode-copilot-multi add # Add GitHub Copilot account
|
|
68
|
+
opencode-copilot-multi remove <username> # Remove account
|
|
69
|
+
opencode-copilot-multi clear [--force] # Remove all accounts
|
|
70
|
+
opencode-copilot-multi install # Register plugin (auto-run)
|
|
71
|
+
opencode-copilot-multi --help # Show help
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## ⚙️ System Requirements
|
|
75
|
+
|
|
76
|
+
- **Node.js**: ≥ 18.0.0
|
|
77
|
+
- **OpenCode**: Latest version
|
|
78
|
+
- **GitHub Copilot**: Active subscription
|
|
79
|
+
|
|
80
|
+
## 🐛 Troubleshooting
|
|
81
|
+
|
|
82
|
+
### No models appearing
|
|
83
|
+
1. Run: `opencode-copilot-multi list`
|
|
84
|
+
2. If empty, run: `opencode-copilot-multi add`
|
|
85
|
+
3. Restart OpenCode
|
|
86
|
+
4. Check logs: `tail ~/.local/share/opencode/log/copilot-multi.log`
|
|
87
|
+
|
|
88
|
+
### Token refresh errors
|
|
89
|
+
Re-authenticate:
|
|
90
|
+
```bash
|
|
91
|
+
opencode-copilot-multi remove <username>
|
|
92
|
+
opencode-copilot-multi add
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Plugin not loading
|
|
96
|
+
```bash
|
|
97
|
+
opencode-copilot-multi install
|
|
98
|
+
# Restart OpenCode
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## 📚 Documentation
|
|
102
|
+
|
|
103
|
+
- **[ARCHITECTURE.md](ARCHITECTURE.md)** - System design, diagrams, patterns
|
|
104
|
+
- **[CONTRIBUTING.md](CONTRIBUTING.md)** - How to contribute
|
|
105
|
+
- **[SECURITY.md](SECURITY.md)** - Token security, vulnerability process
|
|
106
|
+
- **[CHANGELOG.md](CHANGELOG.md)** - Version history
|
|
107
|
+
|
|
108
|
+
## 🏗️ How It Works
|
|
109
|
+
|
|
110
|
+
When you select `john:claude-sonnet-4`:
|
|
111
|
+
|
|
112
|
+
1. **Parser** extracts username + model
|
|
113
|
+
2. **Pool lookup** finds account by username
|
|
114
|
+
3. **Token check** refreshes if expiring
|
|
115
|
+
4. **API call** routes to GitHub Copilot with account's token
|
|
116
|
+
5. **Response** returned to OpenCode
|
|
117
|
+
|
|
118
|
+
See [ARCHITECTURE.md](ARCHITECTURE.md) for detailed flow diagrams.
|
|
119
|
+
|
|
120
|
+
## 🔐 Security
|
|
121
|
+
|
|
122
|
+
- **Storage**: `~/.local/share/opencode/copilot-multi-accounts.json` (0600)
|
|
123
|
+
- **Tokens**: OAuth only, no passwords
|
|
124
|
+
- **Refresh**: Auto 5 minutes before expiry
|
|
125
|
+
- **No telemetry**: Offline by design
|
|
126
|
+
|
|
127
|
+
See [SECURITY.md](SECURITY.md) for complete details.
|
|
128
|
+
|
|
129
|
+
## 🧪 Development
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
npm install
|
|
133
|
+
npm run build # Compile TypeScript
|
|
134
|
+
npm run watch # Watch & rebuild
|
|
135
|
+
npm link # Link globally for testing
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
**Project structure**:
|
|
139
|
+
```
|
|
140
|
+
src/
|
|
141
|
+
├── index.ts # Plugin entry
|
|
142
|
+
├── provider.ts # Custom fetch handler
|
|
143
|
+
├── storage/ # Account pool & auth
|
|
144
|
+
├── discovery/ # Account detection
|
|
145
|
+
├── config/ # Config management
|
|
146
|
+
├── commands/ # CLI commands
|
|
147
|
+
└── utils/ # Helpers
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md) for development workflow.
|
|
151
|
+
|
|
152
|
+
## 📄 License
|
|
153
|
+
|
|
154
|
+
MIT © 2025 Valerio Fantozzi
|
|
155
|
+
|
|
156
|
+
## 🤝 Contributing
|
|
157
|
+
|
|
158
|
+
Contributions welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for:
|
|
159
|
+
- Code style guidelines
|
|
160
|
+
- Development setup
|
|
161
|
+
- PR process
|
|
162
|
+
- Areas for contribution
|
|
163
|
+
|
|
164
|
+
## 🆘 Support
|
|
165
|
+
|
|
166
|
+
- **Issues**: [GitHub Issues](https://github.com/iamvaleriofantozzi/opencode-copilot-multi/issues)
|
|
167
|
+
- **Discussions**: [GitHub Discussions](https://github.com/iamvaleriofantozzi/opencode-copilot-multi/discussions)
|
|
168
|
+
- **Security**: See [SECURITY.md](SECURITY.md)
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
**Made with ❤️ by Valerio Fantozzi**
|
package/bin/cli.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* CLI for managing OpenCode Copilot Multi-Account plugin
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* opencode-copilot-multi list
|
|
7
|
+
* opencode-copilot-multi add # runs opencode auth login (select GitHub Copilot)
|
|
8
|
+
* opencode-copilot-multi remove <username>
|
|
9
|
+
* opencode-copilot-multi clear [--force]
|
|
10
|
+
*/
|
|
11
|
+
import { executeMultiCopilotCommand } from '../dist/commands/multi-copilot.js';
|
|
12
|
+
async function main() {
|
|
13
|
+
const args = process.argv.slice(2);
|
|
14
|
+
const command = args.join(' ').trim() || 'help';
|
|
15
|
+
try {
|
|
16
|
+
const result = await executeMultiCopilotCommand(command);
|
|
17
|
+
console.log(result.output);
|
|
18
|
+
process.exit(result.success ? 0 : 1);
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
console.error('Error:', error instanceof Error ? error.message : String(error));
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
main();
|
|
26
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-copilot command handler
|
|
3
|
+
*
|
|
4
|
+
* Subcommands:
|
|
5
|
+
* - list: Show all accounts in the pool
|
|
6
|
+
* - add: Run GitHub Copilot login and sync
|
|
7
|
+
* - remove <username>: Remove a specific account
|
|
8
|
+
* - clear: Remove all accounts
|
|
9
|
+
*/
|
|
10
|
+
export interface CommandResult {
|
|
11
|
+
output: string;
|
|
12
|
+
success: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Parse and execute multi-copilot command
|
|
16
|
+
*/
|
|
17
|
+
export declare function executeMultiCopilotCommand(args: string): Promise<CommandResult>;
|
|
18
|
+
//# sourceMappingURL=multi-copilot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-copilot.d.ts","sourceRoot":"","sources":["../../src/commands/multi-copilot.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAUH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAyBD;;GAEG;AACH,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAqCrF"}
|
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-copilot command handler
|
|
3
|
+
*
|
|
4
|
+
* Subcommands:
|
|
5
|
+
* - list: Show all accounts in the pool
|
|
6
|
+
* - add: Run GitHub Copilot login and sync
|
|
7
|
+
* - remove <username>: Remove a specific account
|
|
8
|
+
* - clear: Remove all accounts
|
|
9
|
+
*/
|
|
10
|
+
import { spawn } from 'child_process';
|
|
11
|
+
import readline from 'readline';
|
|
12
|
+
import { getAccountPool, saveAccountPool } from '../storage/pool.js';
|
|
13
|
+
import { writeModelsToConfig, ensurePluginInstalled } from '../config/writer.js';
|
|
14
|
+
import { logger } from '../utils/logger.js';
|
|
15
|
+
import { getGitHubCopilotAuth, generateAccountId, registerProviderInAuthJson } from '../storage/auth.js';
|
|
16
|
+
import { syncAccounts } from '../discovery/accounts.js';
|
|
17
|
+
// ANSI Color codes
|
|
18
|
+
const colors = {
|
|
19
|
+
reset: '\x1b[0m',
|
|
20
|
+
bold: '\x1b[1m',
|
|
21
|
+
dim: '\x1b[2m',
|
|
22
|
+
// Colors
|
|
23
|
+
cyan: '\x1b[36m',
|
|
24
|
+
blue: '\x1b[34m',
|
|
25
|
+
green: '\x1b[32m',
|
|
26
|
+
yellow: '\x1b[33m',
|
|
27
|
+
red: '\x1b[31m',
|
|
28
|
+
magenta: '\x1b[35m',
|
|
29
|
+
gray: '\x1b[90m',
|
|
30
|
+
// Bright colors
|
|
31
|
+
brightCyan: '\x1b[96m',
|
|
32
|
+
brightGreen: '\x1b[92m',
|
|
33
|
+
brightYellow: '\x1b[93m',
|
|
34
|
+
};
|
|
35
|
+
const c = colors; // Shorthand
|
|
36
|
+
/**
|
|
37
|
+
* Parse and execute multi-copilot command
|
|
38
|
+
*/
|
|
39
|
+
export async function executeMultiCopilotCommand(args) {
|
|
40
|
+
const parts = args.trim().split(/\s+/);
|
|
41
|
+
const subcommand = parts[0]?.toLowerCase() || 'help';
|
|
42
|
+
const subargs = parts.slice(1);
|
|
43
|
+
switch (subcommand) {
|
|
44
|
+
case 'install':
|
|
45
|
+
return await installPlugin();
|
|
46
|
+
case 'list':
|
|
47
|
+
case 'ls':
|
|
48
|
+
return await listAccounts();
|
|
49
|
+
case 'add':
|
|
50
|
+
return await addAccount();
|
|
51
|
+
case 'remove':
|
|
52
|
+
case 'rm':
|
|
53
|
+
if (!subargs[0]) {
|
|
54
|
+
return {
|
|
55
|
+
output: `\n${c.red}✗${c.reset} ${c.bold}Usage:${c.reset} opencode-copilot-multi remove ${c.dim}<username>${c.reset}\n`,
|
|
56
|
+
success: false
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
return await removeAccount(subargs[0]);
|
|
60
|
+
case 'clear':
|
|
61
|
+
// Check for --force or -f flag
|
|
62
|
+
const force = subargs.includes('--force') || subargs.includes('-f');
|
|
63
|
+
return await clearAccounts(force);
|
|
64
|
+
case 'help':
|
|
65
|
+
case '--help':
|
|
66
|
+
case '-h':
|
|
67
|
+
default:
|
|
68
|
+
return showHelp();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async function installPlugin() {
|
|
72
|
+
try {
|
|
73
|
+
// Step 1: Register plugin in opencode.json(c)
|
|
74
|
+
const wasInstalled = await ensurePluginInstalled();
|
|
75
|
+
// Step 2: Register provider in auth.json (always do this, even if already installed)
|
|
76
|
+
const authRegistered = await registerProviderInAuthJson();
|
|
77
|
+
if (!authRegistered) {
|
|
78
|
+
logger.warn('Failed to register provider in auth.json, but continuing...');
|
|
79
|
+
}
|
|
80
|
+
if (wasInstalled) {
|
|
81
|
+
const output = [
|
|
82
|
+
'',
|
|
83
|
+
`${c.green}✓${c.reset} ${c.bold}Plugin installed in OpenCode${c.reset}`,
|
|
84
|
+
'',
|
|
85
|
+
`${c.dim}✓ Added to opencode.json(c)${c.reset}`,
|
|
86
|
+
`${c.dim}✓ Registered in auth.json${c.reset}`,
|
|
87
|
+
'',
|
|
88
|
+
`${c.dim}Restart OpenCode to load the plugin${c.reset}`,
|
|
89
|
+
''
|
|
90
|
+
].join('\n');
|
|
91
|
+
return { output, success: true };
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
const output = [
|
|
95
|
+
'',
|
|
96
|
+
`${c.yellow}ℹ${c.reset} ${c.bold}Plugin already installed${c.reset}`,
|
|
97
|
+
'',
|
|
98
|
+
`${c.dim}The plugin is already configured in opencode.json(c)${c.reset}`,
|
|
99
|
+
`${c.dim}✓ Verified auth.json registration${c.reset}`,
|
|
100
|
+
''
|
|
101
|
+
].join('\n');
|
|
102
|
+
return { output, success: true };
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
logger.error('Failed to install plugin', {
|
|
107
|
+
error: error instanceof Error ? error.message : String(error)
|
|
108
|
+
});
|
|
109
|
+
const output = [
|
|
110
|
+
'',
|
|
111
|
+
`${c.red}✗${c.reset} Failed to install plugin`,
|
|
112
|
+
'',
|
|
113
|
+
`${c.dim}Error: ${error instanceof Error ? error.message : String(error)}${c.reset}`,
|
|
114
|
+
''
|
|
115
|
+
].join('\n');
|
|
116
|
+
return { output, success: false };
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async function listAccounts() {
|
|
120
|
+
const pool = await getAccountPool();
|
|
121
|
+
if (pool.accounts.length === 0) {
|
|
122
|
+
const output = [
|
|
123
|
+
'',
|
|
124
|
+
`${c.yellow}📭 No GitHub Copilot accounts configured${c.reset}`,
|
|
125
|
+
'',
|
|
126
|
+
`${c.dim}To add an account:${c.reset}`,
|
|
127
|
+
` ${c.cyan}1.${c.reset} Run: ${c.brightCyan}opencode-copilot-multi add${c.reset}`,
|
|
128
|
+
` ${c.cyan}2.${c.reset} Select ${c.bold}"GitHub Copilot"${c.reset}`,
|
|
129
|
+
` ${c.cyan}3.${c.reset} Complete authentication`,
|
|
130
|
+
` ${c.cyan}4.${c.reset} Restart OpenCode`,
|
|
131
|
+
''
|
|
132
|
+
].join('\n');
|
|
133
|
+
return { output, success: true };
|
|
134
|
+
}
|
|
135
|
+
const lines = [
|
|
136
|
+
'',
|
|
137
|
+
`${c.bold}${c.cyan}👥 GitHub Copilot Accounts${c.reset} ${c.dim}(${pool.accounts.length})${c.reset}`,
|
|
138
|
+
'',
|
|
139
|
+
`${c.gray}┌─────┬────────────────────┬─────────┬───────────────┐${c.reset}`,
|
|
140
|
+
`${c.gray}│${c.reset} ${c.bold}#${c.reset} ${c.gray}│${c.reset} ${c.bold}Username${c.reset} ${c.gray}│${c.reset} ${c.bold}Models${c.reset} ${c.gray}│${c.reset} ${c.bold}Added${c.reset} ${c.gray}│${c.reset}`,
|
|
141
|
+
`${c.gray}├─────┼────────────────────┼─────────┼───────────────┤${c.reset}`,
|
|
142
|
+
];
|
|
143
|
+
pool.accounts.forEach((account, index) => {
|
|
144
|
+
const addedDate = new Date(account.addedAt).toLocaleDateString('en-US', {
|
|
145
|
+
month: 'short',
|
|
146
|
+
day: 'numeric',
|
|
147
|
+
year: 'numeric'
|
|
148
|
+
});
|
|
149
|
+
const username = account.username.padEnd(18).substring(0, 18);
|
|
150
|
+
const models = String(account.models.length).padStart(7);
|
|
151
|
+
const num = String(index + 1).padStart(3);
|
|
152
|
+
lines.push(`${c.gray}│${c.reset} ${c.cyan}${num}${c.reset} ${c.gray}│${c.reset} ${c.green}${username}${c.reset} ${c.gray}│${c.reset}${models} ${c.gray}│${c.reset} ${c.dim}${addedDate.padEnd(13)}${c.reset} ${c.gray}│${c.reset}`);
|
|
153
|
+
});
|
|
154
|
+
lines.push(`${c.gray}└─────┴────────────────────┴─────────┴───────────────┘${c.reset}`);
|
|
155
|
+
lines.push('');
|
|
156
|
+
return { output: lines.join('\n'), success: true };
|
|
157
|
+
}
|
|
158
|
+
async function runOpencodeLogin() {
|
|
159
|
+
return new Promise((resolve) => {
|
|
160
|
+
const command = process.platform === 'win32' ? 'opencode.exe' : 'opencode';
|
|
161
|
+
const login = spawn(command, ['auth', 'login'], { stdio: 'inherit' });
|
|
162
|
+
login.on('error', (error) => {
|
|
163
|
+
logger.error('Failed to start opencode auth login', {
|
|
164
|
+
error: error instanceof Error ? error.message : String(error)
|
|
165
|
+
});
|
|
166
|
+
resolve(false);
|
|
167
|
+
});
|
|
168
|
+
login.on('exit', (code) => {
|
|
169
|
+
resolve(code === 0);
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
async function addAccount() {
|
|
174
|
+
try {
|
|
175
|
+
const poolBefore = await getAccountPool();
|
|
176
|
+
const existingIds = new Set(poolBefore.accounts.map(account => account.id));
|
|
177
|
+
const loginSuccess = await runOpencodeLogin();
|
|
178
|
+
if (!loginSuccess) {
|
|
179
|
+
return {
|
|
180
|
+
output: `\n${c.red}✗${c.reset} GitHub Copilot login cancelled or failed\n`,
|
|
181
|
+
success: false
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
await syncAccounts();
|
|
185
|
+
const auth = await getGitHubCopilotAuth();
|
|
186
|
+
if (!auth) {
|
|
187
|
+
const output = [
|
|
188
|
+
'',
|
|
189
|
+
`${c.red}✗${c.reset} ${c.bold}No GitHub Copilot auth found after login${c.reset}`,
|
|
190
|
+
'',
|
|
191
|
+
`${c.dim}Make sure you selected:${c.reset} ${c.brightCyan}GitHub Copilot${c.reset}`,
|
|
192
|
+
''
|
|
193
|
+
].join('\n');
|
|
194
|
+
return { output, success: false };
|
|
195
|
+
}
|
|
196
|
+
const accountId = generateAccountId(auth.refresh);
|
|
197
|
+
const poolAfter = await getAccountPool();
|
|
198
|
+
const account = poolAfter.accounts.find(a => a.id === accountId);
|
|
199
|
+
if (!account) {
|
|
200
|
+
const output = [
|
|
201
|
+
'',
|
|
202
|
+
`${c.red}✗${c.reset} ${c.bold}Account not found in pool after login${c.reset}`,
|
|
203
|
+
'',
|
|
204
|
+
`${c.dim}Try restarting OpenCode and running:${c.reset} ${c.brightCyan}opencode-copilot-multi list${c.reset}`,
|
|
205
|
+
''
|
|
206
|
+
].join('\n');
|
|
207
|
+
return { output, success: false };
|
|
208
|
+
}
|
|
209
|
+
const alreadyExists = existingIds.has(accountId);
|
|
210
|
+
const statusLine = alreadyExists
|
|
211
|
+
? `${c.yellow}ℹ${c.reset} ${c.bold}Account already in pool${c.reset} ${c.dim}(tokens updated)${c.reset}`
|
|
212
|
+
: `${c.green}✓${c.reset} ${c.bold}Account added to pool${c.reset}`;
|
|
213
|
+
const output = [
|
|
214
|
+
'',
|
|
215
|
+
statusLine,
|
|
216
|
+
'',
|
|
217
|
+
` Username: ${c.green}${account.username}${c.reset}`,
|
|
218
|
+
` Models: ${c.cyan}${account.models.length}${c.reset}`,
|
|
219
|
+
'',
|
|
220
|
+
`${c.dim}Restart OpenCode to load updated models${c.reset}`,
|
|
221
|
+
''
|
|
222
|
+
].join('\n');
|
|
223
|
+
return { output, success: true };
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
logger.error('Failed to add account', {
|
|
227
|
+
error: error instanceof Error ? error.message : String(error)
|
|
228
|
+
});
|
|
229
|
+
const output = [
|
|
230
|
+
'',
|
|
231
|
+
`${c.red}✗${c.reset} Failed to add account`,
|
|
232
|
+
'',
|
|
233
|
+
`${c.dim}Error: ${error instanceof Error ? error.message : String(error)}${c.reset}`,
|
|
234
|
+
''
|
|
235
|
+
].join('\n');
|
|
236
|
+
return { output, success: false };
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
async function removeAccount(username) {
|
|
240
|
+
const pool = await getAccountPool();
|
|
241
|
+
const accountIndex = pool.accounts.findIndex(a => a.username.toLowerCase() === username.toLowerCase());
|
|
242
|
+
if (accountIndex === -1) {
|
|
243
|
+
const available = pool.accounts.map(a => ` ${c.cyan}•${c.reset} ${c.green}${a.username}${c.reset}`).join('\n');
|
|
244
|
+
const output = [
|
|
245
|
+
'',
|
|
246
|
+
`${c.red}✗${c.reset} Account ${c.bold}"${username}"${c.reset} not found`,
|
|
247
|
+
'',
|
|
248
|
+
available ? `${c.dim}Available accounts:${c.reset}\n${available}` : `${c.yellow}No accounts configured${c.reset}`,
|
|
249
|
+
''
|
|
250
|
+
].join('\n');
|
|
251
|
+
return { output, success: false };
|
|
252
|
+
}
|
|
253
|
+
const removed = pool.accounts.splice(accountIndex, 1)[0];
|
|
254
|
+
pool.lastUpdated = Date.now();
|
|
255
|
+
await saveAccountPool(pool);
|
|
256
|
+
await writeModelsToConfig(pool.accounts);
|
|
257
|
+
logger.info(`Account removed: ${removed.username}`);
|
|
258
|
+
const output = [
|
|
259
|
+
'',
|
|
260
|
+
`${c.green}✓${c.reset} Account ${c.bold}${c.green}"${removed.username}"${c.reset} removed successfully`,
|
|
261
|
+
'',
|
|
262
|
+
`${c.dim}${pool.accounts.length} account(s) remaining${c.reset}`,
|
|
263
|
+
''
|
|
264
|
+
].join('\n');
|
|
265
|
+
return { output, success: true };
|
|
266
|
+
}
|
|
267
|
+
async function clearAccounts(force = false) {
|
|
268
|
+
const pool = await getAccountPool();
|
|
269
|
+
const count = pool.accounts.length;
|
|
270
|
+
if (count === 0) {
|
|
271
|
+
return {
|
|
272
|
+
output: `\n${c.yellow}📭 No accounts to clear${c.reset}\n`,
|
|
273
|
+
success: true
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
// List accounts that will be removed
|
|
277
|
+
const accountList = pool.accounts.map(a => ` ${c.red}×${c.reset} ${c.dim}${a.username}${c.reset}`).join('\n');
|
|
278
|
+
// If --force flag, skip confirmation
|
|
279
|
+
if (force) {
|
|
280
|
+
pool.accounts = [];
|
|
281
|
+
pool.lastUpdated = Date.now();
|
|
282
|
+
await saveAccountPool(pool);
|
|
283
|
+
await writeModelsToConfig([]);
|
|
284
|
+
logger.info(`All accounts cleared (${count} removed) - forced`);
|
|
285
|
+
const output = [
|
|
286
|
+
'',
|
|
287
|
+
`${c.green}✓${c.reset} Cleared ${c.bold}${count}${c.reset} account(s)`,
|
|
288
|
+
'',
|
|
289
|
+
`${c.dim}To add accounts, use: ${c.cyan}opencode auth login${c.reset}`,
|
|
290
|
+
''
|
|
291
|
+
].join('\n');
|
|
292
|
+
return { output, success: true };
|
|
293
|
+
}
|
|
294
|
+
// Show confirmation prompt
|
|
295
|
+
const confirmOutput = [
|
|
296
|
+
'',
|
|
297
|
+
`${c.yellow}⚠️ Warning${c.reset}`,
|
|
298
|
+
'',
|
|
299
|
+
`This will remove ${c.bold}${count}${c.reset} account(s):`,
|
|
300
|
+
'',
|
|
301
|
+
accountList,
|
|
302
|
+
'',
|
|
303
|
+
`${c.dim}All models will be removed from OpenCode.${c.reset}`,
|
|
304
|
+
'',
|
|
305
|
+
`${c.bold}Are you sure?${c.reset} ${c.dim}[y/N]${c.reset} `,
|
|
306
|
+
].join('\n');
|
|
307
|
+
// Print confirmation and wait for input
|
|
308
|
+
process.stdout.write(confirmOutput);
|
|
309
|
+
// Read user input
|
|
310
|
+
const rl = readline.createInterface({
|
|
311
|
+
input: process.stdin,
|
|
312
|
+
output: process.stdout,
|
|
313
|
+
terminal: false
|
|
314
|
+
});
|
|
315
|
+
return new Promise((resolve) => {
|
|
316
|
+
rl.question('', async (answer) => {
|
|
317
|
+
rl.close();
|
|
318
|
+
const confirmed = answer.trim().toLowerCase() === 'y' || answer.trim().toLowerCase() === 'yes';
|
|
319
|
+
if (!confirmed) {
|
|
320
|
+
const output = [
|
|
321
|
+
'',
|
|
322
|
+
`${c.dim}Cancelled. No accounts were removed.${c.reset}`,
|
|
323
|
+
''
|
|
324
|
+
].join('\n');
|
|
325
|
+
resolve({ output, success: false });
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
// User confirmed - proceed with clear
|
|
329
|
+
pool.accounts = [];
|
|
330
|
+
pool.lastUpdated = Date.now();
|
|
331
|
+
await saveAccountPool(pool);
|
|
332
|
+
await writeModelsToConfig([]);
|
|
333
|
+
logger.info(`All accounts cleared (${count} removed)`);
|
|
334
|
+
const output = [
|
|
335
|
+
'',
|
|
336
|
+
`${c.green}✓${c.reset} Cleared ${c.bold}${count}${c.reset} account(s)`,
|
|
337
|
+
'',
|
|
338
|
+
`${c.dim}To add accounts, use: ${c.cyan}opencode auth login${c.reset}`,
|
|
339
|
+
''
|
|
340
|
+
].join('\n');
|
|
341
|
+
resolve({ output, success: true });
|
|
342
|
+
});
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
function showHelp() {
|
|
346
|
+
const help = `
|
|
347
|
+
${c.bold}${c.cyan}opencode-copilot-multi${c.reset} ${c.dim}v1.0.0${c.reset}
|
|
348
|
+
${c.dim}Manage multiple GitHub Copilot accounts in OpenCode${c.reset}
|
|
349
|
+
|
|
350
|
+
${c.bold}${c.yellow}USAGE${c.reset}
|
|
351
|
+
${c.brightCyan}opencode-copilot-multi${c.reset} ${c.dim}<command> [options]${c.reset}
|
|
352
|
+
|
|
353
|
+
${c.bold}${c.yellow}COMMANDS${c.reset}
|
|
354
|
+
${c.green}install${c.reset} Install plugin in OpenCode config
|
|
355
|
+
${c.green}list${c.reset} List all configured accounts
|
|
356
|
+
${c.green}add${c.reset} Login GitHub Copilot and sync account
|
|
357
|
+
${c.green}remove${c.reset} ${c.dim}<user>${c.reset} Remove a specific account
|
|
358
|
+
${c.green}clear${c.reset} Remove all accounts ${c.dim}(asks for confirmation)${c.reset}
|
|
359
|
+
${c.green}help${c.reset} Show this help message
|
|
360
|
+
|
|
361
|
+
${c.bold}${c.yellow}OPTIONS${c.reset}
|
|
362
|
+
${c.cyan}--force${c.reset}, ${c.cyan}-f${c.reset} Skip confirmation prompt for ${c.green}clear${c.reset} command
|
|
363
|
+
|
|
364
|
+
${c.bold}${c.yellow}ALIASES${c.reset}
|
|
365
|
+
${c.cyan}ls${c.reset} ${c.dim}→${c.reset} list
|
|
366
|
+
${c.cyan}rm${c.reset} ${c.dim}→${c.reset} remove
|
|
367
|
+
|
|
368
|
+
${c.bold}${c.yellow}EXAMPLES${c.reset}
|
|
369
|
+
${c.dim}# Install plugin in OpenCode${c.reset}
|
|
370
|
+
${c.brightCyan}$${c.reset} opencode-copilot-multi install
|
|
371
|
+
|
|
372
|
+
${c.dim}# List all accounts${c.reset}
|
|
373
|
+
${c.brightCyan}$${c.reset} opencode-copilot-multi list
|
|
374
|
+
|
|
375
|
+
${c.dim}# Login and add an account${c.reset}
|
|
376
|
+
${c.brightCyan}$${c.reset} opencode-copilot-multi add
|
|
377
|
+
|
|
378
|
+
${c.dim}# Remove a specific account${c.reset}
|
|
379
|
+
${c.brightCyan}$${c.reset} opencode-copilot-multi remove ${c.dim}github-username${c.reset}
|
|
380
|
+
|
|
381
|
+
${c.dim}# Clear all accounts (with confirmation)${c.reset}
|
|
382
|
+
${c.brightCyan}$${c.reset} opencode-copilot-multi clear
|
|
383
|
+
|
|
384
|
+
${c.dim}# Clear all accounts (skip confirmation)${c.reset}
|
|
385
|
+
${c.brightCyan}$${c.reset} opencode-copilot-multi clear --force
|
|
386
|
+
|
|
387
|
+
${c.bold}${c.yellow}INSTALLATION${c.reset}
|
|
388
|
+
${c.cyan}1.${c.reset} Run: ${c.brightCyan}opencode-copilot-multi install${c.reset}
|
|
389
|
+
${c.cyan}2.${c.reset} Restart OpenCode
|
|
390
|
+
|
|
391
|
+
${c.bold}${c.yellow}ADDING ACCOUNTS${c.reset}
|
|
392
|
+
${c.cyan}1.${c.reset} Run: ${c.brightCyan}opencode-copilot-multi add${c.reset}
|
|
393
|
+
${c.cyan}2.${c.reset} Select ${c.bold}"GitHub Copilot"${c.reset}
|
|
394
|
+
${c.cyan}3.${c.reset} Complete authentication
|
|
395
|
+
${c.cyan}4.${c.reset} Restart OpenCode
|
|
396
|
+
|
|
397
|
+
${c.dim}This command runs:${c.reset} ${c.brightCyan}opencode auth login${c.reset}
|
|
398
|
+
|
|
399
|
+
${c.dim}More info: ${c.blue}https://github.com/valeriofantozzi/opencode-copilot-multi${c.reset}
|
|
400
|
+
`;
|
|
401
|
+
return { output: help, success: true };
|
|
402
|
+
}
|
|
403
|
+
//# sourceMappingURL=multi-copilot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-copilot.js","sourceRoot":"","sources":["../../src/commands/multi-copilot.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AACzG,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAOxD,mBAAmB;AACnB,MAAM,MAAM,GAAG;IACb,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,SAAS;IACf,GAAG,EAAE,SAAS;IAEd,SAAS;IACT,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,UAAU;IACjB,MAAM,EAAE,UAAU;IAClB,GAAG,EAAE,UAAU;IACf,OAAO,EAAE,UAAU;IACnB,IAAI,EAAE,UAAU;IAEhB,gBAAgB;IAChB,UAAU,EAAE,UAAU;IACtB,WAAW,EAAE,UAAU;IACvB,YAAY,EAAE,UAAU;CACzB,CAAC;AAEF,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,YAAY;AAE9B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,IAAY;IAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,MAAM,CAAC;IACrD,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE/B,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,SAAS;YACZ,OAAO,MAAM,aAAa,EAAE,CAAC;QAE/B,KAAK,MAAM,CAAC;QACZ,KAAK,IAAI;YACP,OAAO,MAAM,YAAY,EAAE,CAAC;QAE9B,KAAK,KAAK;YACR,OAAO,MAAM,UAAU,EAAE,CAAC;QAE5B,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI;YACP,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChB,OAAO;oBACL,MAAM,EAAE,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,KAAK,kCAAkC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,KAAK,IAAI;oBACtH,OAAO,EAAE,KAAK;iBACf,CAAC;YACJ,CAAC;YACD,OAAO,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAEzC,KAAK,OAAO;YACV,+BAA+B;YAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACpE,OAAO,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC;QAEpC,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI,CAAC;QACV;YACE,OAAO,QAAQ,EAAE,CAAC;IACtB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa;IAC1B,IAAI,CAAC;QACH,8CAA8C;QAC9C,MAAM,YAAY,GAAG,MAAM,qBAAqB,EAAE,CAAC;QAEnD,qFAAqF;QACrF,MAAM,cAAc,GAAG,MAAM,0BAA0B,EAAE,CAAC;QAE1D,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;QAC7E,CAAC;QAED,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,MAAM,GAAG;gBACb,EAAE;gBACF,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,+BAA+B,CAAC,CAAC,KAAK,EAAE;gBACvE,EAAE;gBACF,GAAG,CAAC,CAAC,GAAG,8BAA8B,CAAC,CAAC,KAAK,EAAE;gBAC/C,GAAG,CAAC,CAAC,GAAG,4BAA4B,CAAC,CAAC,KAAK,EAAE;gBAC7C,EAAE;gBACF,GAAG,CAAC,CAAC,GAAG,sCAAsC,CAAC,CAAC,KAAK,EAAE;gBACvD,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEb,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG;gBACb,EAAE;gBACF,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,2BAA2B,CAAC,CAAC,KAAK,EAAE;gBACpE,EAAE;gBACF,GAAG,CAAC,CAAC,GAAG,uDAAuD,CAAC,CAAC,KAAK,EAAE;gBACxE,GAAG,CAAC,CAAC,GAAG,oCAAoC,CAAC,CAAC,KAAK,EAAE;gBACrD,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEb,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACnC,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE;YACvC,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG;YACb,EAAE;YACF,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,2BAA2B;YAC9C,EAAE;YACF,GAAG,CAAC,CAAC,GAAG,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE;YACpF,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACpC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY;IACzB,MAAM,IAAI,GAAG,MAAM,cAAc,EAAE,CAAC;IAEpC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG;YACb,EAAE;YACF,GAAG,CAAC,CAAC,MAAM,2CAA2C,CAAC,CAAC,KAAK,EAAE;YAC/D,EAAE;YACF,GAAG,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,KAAK,EAAE;YACtC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,UAAU,6BAA6B,CAAC,CAAC,KAAK,EAAE;YAClF,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,IAAI,mBAAmB,CAAC,CAAC,KAAK,EAAE;YACpE,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,0BAA0B;YACjD,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,mBAAmB;YAC1C,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACnC,CAAC;IAED,MAAM,KAAK,GAAG;QACZ,EAAE;QACF,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,6BAA6B,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,EAAE;QACpG,EAAE;QACF,GAAG,CAAC,CAAC,IAAI,yDAAyD,CAAC,CAAC,KAAK,EAAE;QAC3E,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,KAAK,cAAc,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE;QACnO,GAAG,CAAC,CAAC,IAAI,yDAAyD,CAAC,CAAC,KAAK,EAAE;KAC5E,CAAC;IAEF,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;QACvC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE;YACtE,KAAK,EAAE,OAAO;YACd,GAAG,EAAE,SAAS;YACd,IAAI,EAAE,SAAS;SAChB,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAE1C,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,GAAG,QAAQ,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,GAAG,MAAM,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IACtO,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,yDAAyD,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IACxF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACrD,CAAC;AAED,KAAK,UAAU,gBAAgB;IAC7B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC;QAC3E,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAEtE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,MAAM,CAAC,KAAK,CAAC,qCAAqC,EAAE;gBAClD,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;YACH,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,UAAU;IACvB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,cAAc,EAAE,CAAC;QAC1C,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QAE5E,MAAM,YAAY,GAAG,MAAM,gBAAgB,EAAE,CAAC;QAC9C,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO;gBACL,MAAM,EAAE,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,6CAA6C;gBAC1E,OAAO,EAAE,KAAK;aACf,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,EAAE,CAAC;QAErB,MAAM,IAAI,GAAG,MAAM,oBAAoB,EAAE,CAAC;QAC1C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,MAAM,GAAG;gBACb,EAAE;gBACF,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,2CAA2C,CAAC,CAAC,KAAK,EAAE;gBACjF,EAAE;gBACF,GAAG,CAAC,CAAC,GAAG,0BAA0B,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,UAAU,iBAAiB,CAAC,CAAC,KAAK,EAAE;gBACnF,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEb,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACpC,CAAC;QAED,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,MAAM,cAAc,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;QAEjE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,MAAM,GAAG;gBACb,EAAE;gBACF,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,wCAAwC,CAAC,CAAC,KAAK,EAAE;gBAC9E,EAAE;gBACF,GAAG,CAAC,CAAC,GAAG,uCAAuC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,UAAU,8BAA8B,CAAC,CAAC,KAAK,EAAE;gBAC7G,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEb,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACpC,CAAC;QAED,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,aAAa;YAC9B,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,0BAA0B,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,mBAAmB,CAAC,CAAC,KAAK,EAAE;YACxG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,wBAAwB,CAAC,CAAC,KAAK,EAAE,CAAC;QAErE,MAAM,MAAM,GAAG;YACb,EAAE;YACF,UAAU;YACV,EAAE;YACF,eAAe,CAAC,CAAC,KAAK,GAAG,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC,KAAK,EAAE;YACrD,aAAa,CAAC,CAAC,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE;YACvD,EAAE;YACF,GAAG,CAAC,CAAC,GAAG,0CAA0C,CAAC,CAAC,KAAK,EAAE;YAC3D,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAEnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE;YACpC,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG;YACb,EAAE;YACF,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,wBAAwB;YAC3C,EAAE;YACF,GAAG,CAAC,CAAC,GAAG,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE;YACpF,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACpC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,QAAgB;IAC3C,MAAM,IAAI,GAAG,MAAM,cAAc,EAAE,CAAC;IAEpC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAC1C,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,WAAW,EAAE,CACzD,CAAC;IAEF,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChH,MAAM,MAAM,GAAG;YACb,EAAE;YACF,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC,IAAI,IAAI,QAAQ,IAAI,CAAC,CAAC,KAAK,YAAY;YACxE,EAAE;YACF,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,sBAAsB,CAAC,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,yBAAyB,CAAC,CAAC,KAAK,EAAE;YACjH,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACpC,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE9B,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEzC,MAAM,CAAC,IAAI,CAAC,oBAAoB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAEpD,MAAM,MAAM,GAAG;QACb,EAAE;QACF,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,IAAI,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,uBAAuB;QACvG,EAAE;QACF,GAAG,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,wBAAwB,CAAC,CAAC,KAAK,EAAE;QAChE,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACnC,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,QAAiB,KAAK;IACjD,MAAM,IAAI,GAAG,MAAM,cAAc,EAAE,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IAEnC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,OAAO;YACL,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM,0BAA0B,CAAC,CAAC,KAAK,IAAI;YAC1D,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,qCAAqC;IACrC,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE/G,qCAAqC;IACrC,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE9B,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,mBAAmB,CAAC,EAAE,CAAC,CAAC;QAE9B,MAAM,CAAC,IAAI,CAAC,yBAAyB,KAAK,oBAAoB,CAAC,CAAC;QAEhE,MAAM,MAAM,GAAG;YACb,EAAE;YACF,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,KAAK,aAAa;YACtE,EAAE;YACF,GAAG,CAAC,CAAC,GAAG,yBAAyB,CAAC,CAAC,IAAI,sBAAsB,CAAC,CAAC,KAAK,EAAE;YACtE,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACnC,CAAC;IAED,2BAA2B;IAC3B,MAAM,aAAa,GAAG;QACpB,EAAE;QACF,GAAG,CAAC,CAAC,MAAM,cAAc,CAAC,CAAC,KAAK,EAAE;QAClC,EAAE;QACF,oBAAoB,CAAC,CAAC,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,KAAK,cAAc;QAC1D,EAAE;QACF,WAAW;QACX,EAAE;QACF,GAAG,CAAC,CAAC,GAAG,4CAA4C,CAAC,CAAC,KAAK,EAAE;QAC7D,EAAE;QACF,GAAG,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,KAAK,GAAG;KAC5D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,wCAAwC;IACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAEpC,kBAAkB;IAClB,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,MAAc,EAAE,EAAE;YACvC,EAAE,CAAC,KAAK,EAAE,CAAC;YAEX,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC;YAE/F,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,MAAM,GAAG;oBACb,EAAE;oBACF,GAAG,CAAC,CAAC,GAAG,uCAAuC,CAAC,CAAC,KAAK,EAAE;oBACxD,EAAE;iBACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEb,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;gBACpC,OAAO;YACT,CAAC;YAED,sCAAsC;YACtC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;YACnB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAE9B,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;YAC5B,MAAM,mBAAmB,CAAC,EAAE,CAAC,CAAC;YAE9B,MAAM,CAAC,IAAI,CAAC,yBAAyB,KAAK,WAAW,CAAC,CAAC;YAEvD,MAAM,MAAM,GAAG;gBACb,EAAE;gBACF,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,KAAK,aAAa;gBACtE,EAAE;gBACF,GAAG,CAAC,CAAC,GAAG,yBAAyB,CAAC,CAAC,IAAI,sBAAsB,CAAC,CAAC,KAAK,EAAE;gBACtE,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEb,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,QAAQ;IACf,MAAM,IAAI,GAAG;EACb,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,yBAAyB,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,KAAK;EACxE,CAAC,CAAC,GAAG,sDAAsD,CAAC,CAAC,KAAK;;EAElE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,QAAQ,CAAC,CAAC,KAAK;IAC9B,CAAC,CAAC,UAAU,yBAAyB,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,sBAAsB,CAAC,CAAC,KAAK;;EAEpF,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,WAAW,CAAC,CAAC,KAAK;IACjC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,KAAK;IACxB,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,KAAK;IACrB,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,KAAK;IACpB,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,KAAK;IAChD,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,KAAK,oCAAoC,CAAC,CAAC,GAAG,0BAA0B,CAAC,CAAC,KAAK;IAChG,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,KAAK;;EAEvB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,UAAU,CAAC,CAAC,KAAK;IAChC,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,uCAAuC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,KAAK;;EAE7G,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,UAAU,CAAC,CAAC,KAAK;IAChC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK;IACxC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK;;EAE1C,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,WAAW,CAAC,CAAC,KAAK;IACjC,CAAC,CAAC,GAAG,+BAA+B,CAAC,CAAC,KAAK;IAC3C,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,KAAK;;IAEvB,CAAC,CAAC,GAAG,sBAAsB,CAAC,CAAC,KAAK;IAClC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,KAAK;;IAEvB,CAAC,CAAC,GAAG,6BAA6B,CAAC,CAAC,KAAK;IACzC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,KAAK;;IAEvB,CAAC,CAAC,GAAG,8BAA8B,CAAC,CAAC,KAAK;IAC1C,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,KAAK,kCAAkC,CAAC,CAAC,GAAG,kBAAkB,CAAC,CAAC,KAAK;;IAEvF,CAAC,CAAC,GAAG,2CAA2C,CAAC,CAAC,KAAK;IACvD,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,KAAK;;IAEvB,CAAC,CAAC,GAAG,2CAA2C,CAAC,CAAC,KAAK;IACvD,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,KAAK;;EAEzB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,eAAe,CAAC,CAAC,KAAK;IACrC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,UAAU,iCAAiC,CAAC,CAAC,KAAK;IAC/E,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK;;EAEpB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,MAAM,kBAAkB,CAAC,CAAC,KAAK;IACxC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,UAAU,6BAA6B,CAAC,CAAC,KAAK;IAC3E,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,IAAI,mBAAmB,CAAC,CAAC,KAAK;IAC7D,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK;IAClB,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK;;EAEpB,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,UAAU,sBAAsB,CAAC,CAAC,KAAK;;EAE9E,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,IAAI,4DAA4D,CAAC,CAAC,KAAK;CAC7F,CAAC;IAEA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACzC,CAAC"}
|