@themoltnet/pi-extension 0.2.0 → 0.4.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.
Files changed (43) hide show
  1. package/README.md +1 -1
  2. package/dist/index.d.ts +233 -9
  3. package/dist/index.js +9915 -345
  4. package/package.json +12 -6
  5. package/dist/commands/index.d.ts +0 -5
  6. package/dist/commands/index.d.ts.map +0 -1
  7. package/dist/commands/index.js +0 -4
  8. package/dist/commands/index.js.map +0 -1
  9. package/dist/commands/moltnet-reflect.d.ts +0 -3
  10. package/dist/commands/moltnet-reflect.d.ts.map +0 -1
  11. package/dist/commands/moltnet-reflect.js +0 -32
  12. package/dist/commands/moltnet-reflect.js.map +0 -1
  13. package/dist/commands/resolve-issue.d.ts +0 -3
  14. package/dist/commands/resolve-issue.d.ts.map +0 -1
  15. package/dist/commands/resolve-issue.js +0 -82
  16. package/dist/commands/resolve-issue.js.map +0 -1
  17. package/dist/commands/sandbox.d.ts +0 -3
  18. package/dist/commands/sandbox.d.ts.map +0 -1
  19. package/dist/commands/sandbox.js +0 -20
  20. package/dist/commands/sandbox.js.map +0 -1
  21. package/dist/commands/types.d.ts +0 -33
  22. package/dist/commands/types.d.ts.map +0 -1
  23. package/dist/commands/types.js +0 -2
  24. package/dist/commands/types.js.map +0 -1
  25. package/dist/index.d.ts.map +0 -1
  26. package/dist/index.js.map +0 -1
  27. package/dist/moltnet-tools.d.ts +0 -16
  28. package/dist/moltnet-tools.d.ts.map +0 -1
  29. package/dist/moltnet-tools.js +0 -169
  30. package/dist/moltnet-tools.js.map +0 -1
  31. package/dist/snapshot.d.ts +0 -41
  32. package/dist/snapshot.d.ts.map +0 -1
  33. package/dist/snapshot.js +0 -254
  34. package/dist/snapshot.js.map +0 -1
  35. package/dist/tool-operations.d.ts +0 -13
  36. package/dist/tool-operations.d.ts.map +0 -1
  37. package/dist/tool-operations.js +0 -142
  38. package/dist/tool-operations.js.map +0 -1
  39. package/dist/tsconfig.tsbuildinfo +0 -1
  40. package/dist/vm-manager.d.ts +0 -54
  41. package/dist/vm-manager.d.ts.map +0 -1
  42. package/dist/vm-manager.js +0 -250
  43. package/dist/vm-manager.js.map +0 -1
@@ -1,54 +0,0 @@
1
- import type { VM } from '@earendil-works/gondolin';
2
- import type { SandboxConfig } from './snapshot.js';
3
- export interface VmConfig {
4
- /** Absolute path to the qcow2 checkpoint. */
5
- checkpointPath: string;
6
- /** MoltNet agent name (used to resolve credentials). */
7
- agentName: string;
8
- /** Host directory to mount at /workspace in the VM. */
9
- mountPath: string;
10
- /** Additional hosts to allow in egress policy. */
11
- extraAllowedHosts?: string[];
12
- /** Full sandbox config (vfs shadows, env overrides). */
13
- sandboxConfig?: SandboxConfig;
14
- }
15
- export interface VmCredentials {
16
- moltnetJson: string;
17
- agentEnvRaw: string;
18
- piAuthJson: string;
19
- agentEnv: Record<string, string | undefined>;
20
- gitconfig: string | null;
21
- sshPrivateKey: string | null;
22
- sshPublicKey: string | null;
23
- allowedSigners: string | null;
24
- }
25
- export interface ManagedVm {
26
- vm: VM;
27
- credentials: VmCredentials;
28
- mountPath: string;
29
- guestWorkspace: string;
30
- agentDir: string;
31
- }
32
- /**
33
- * Resolve the main worktree root (where .moltnet/ lives — it's untracked,
34
- * only exists in the main worktree, not in git worktrees).
35
- */
36
- export declare function findMainWorktree(): string;
37
- export declare function loadCredentials(agentDir: string): VmCredentials;
38
- /**
39
- * Apply agent env vars to the host process, mirroring `moltnet start`.
40
- * Resolves relative paths (e.g. GIT_CONFIG_GLOBAL) against the repo root.
41
- */
42
- export declare function activateAgentEnv(agentEnv: Record<string, string | undefined>, repoRoot: string): void;
43
- /**
44
- * Resume a VM from a checkpoint, inject credentials, configure egress +
45
- * TLS. Returns the managed VM handle.
46
- */
47
- export declare function resumeVm(config: VmConfig): Promise<ManagedVm>;
48
- /**
49
- * Ensure `[worktree] useRelativePaths = true` is set in the given
50
- * gitconfig text. If the section exists, rewrite the key; otherwise
51
- * append a new section.
52
- */
53
- export declare function ensureRelativeWorktreePaths(gitconfig: string): string;
54
- //# sourceMappingURL=vm-manager.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"vm-manager.d.ts","sourceRoot":"","sources":["../src/vm-manager.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAWnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,WAAW,QAAQ;IACvB,6CAA6C;IAC7C,cAAc,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,wDAAwD;IACxD,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAC7C,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,EAAE,CAAC;IACP,WAAW,EAAE,aAAa,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAWzC;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CA4C/D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAC5C,QAAQ,EAAE,MAAM,GACf,IAAI,CAYN;AAoBD;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,CA0JnE;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAerE"}
@@ -1,250 +0,0 @@
1
- /**
2
- * VM lifecycle manager: resume checkpoint, inject credentials, configure
3
- * egress, fix TLS, and provide clean shutdown.
4
- */
5
- import { execFileSync } from 'node:child_process';
6
- import { existsSync, readFileSync } from 'node:fs';
7
- import path from 'node:path';
8
- import { parseEnv } from 'node:util';
9
- import { createHttpHooks, createShadowPathPredicate, RealFSProvider, ShadowProvider, VmCheckpoint, } from '@earendil-works/gondolin';
10
- const GUEST_WORKSPACE = '/workspace';
11
- /**
12
- * Resolve the main worktree root (where .moltnet/ lives — it's untracked,
13
- * only exists in the main worktree, not in git worktrees).
14
- */
15
- export function findMainWorktree() {
16
- const output = execFileSync('git', ['worktree', 'list', '--porcelain'], {
17
- encoding: 'utf8',
18
- });
19
- for (const block of output.split('\n\n')) {
20
- const lines = block.split('\n');
21
- const wt = lines.find((l) => l.startsWith('worktree '));
22
- if (wt && !lines.some((l) => l === 'bare'))
23
- return wt.replace('worktree ', '');
24
- }
25
- throw new Error('Could not find main git worktree');
26
- }
27
- export function loadCredentials(agentDir) {
28
- const moltnetJson = readFileSync(path.join(agentDir, 'moltnet.json'), 'utf8');
29
- const agentEnvRaw = readFileSync(path.join(agentDir, 'env'), 'utf8');
30
- const piAuthPath = path.join(process.env.HOME ?? '', '.pi', 'agent', 'auth.json');
31
- if (!existsSync(piAuthPath)) {
32
- throw new Error(`Pi OAuth credentials not found at ${piAuthPath}. Run: pi login`);
33
- }
34
- const piAuthJson = readFileSync(piAuthPath, 'utf8');
35
- // Read gitconfig + SSH keys for VM-side git signing
36
- const gitconfigPath = path.join(agentDir, 'gitconfig');
37
- const gitconfig = existsSync(gitconfigPath)
38
- ? readFileSync(gitconfigPath, 'utf8')
39
- : null;
40
- const sshDir = path.join(agentDir, 'ssh');
41
- const sshPrivateKey = existsSync(path.join(sshDir, 'id_ed25519'))
42
- ? readFileSync(path.join(sshDir, 'id_ed25519'), 'utf8')
43
- : null;
44
- const sshPublicKey = existsSync(path.join(sshDir, 'id_ed25519.pub'))
45
- ? readFileSync(path.join(sshDir, 'id_ed25519.pub'), 'utf8')
46
- : null;
47
- const allowedSigners = existsSync(path.join(sshDir, 'allowed_signers'))
48
- ? readFileSync(path.join(sshDir, 'allowed_signers'), 'utf8')
49
- : null;
50
- return {
51
- moltnetJson,
52
- agentEnvRaw,
53
- piAuthJson,
54
- agentEnv: parseEnv(agentEnvRaw),
55
- gitconfig,
56
- sshPrivateKey,
57
- sshPublicKey,
58
- allowedSigners,
59
- };
60
- }
61
- /**
62
- * Apply agent env vars to the host process, mirroring `moltnet start`.
63
- * Resolves relative paths (e.g. GIT_CONFIG_GLOBAL) against the repo root.
64
- */
65
- export function activateAgentEnv(agentEnv, repoRoot) {
66
- for (const [k, v] of Object.entries(agentEnv)) {
67
- if (v === undefined || v === null || v === '')
68
- continue;
69
- let resolved = v;
70
- // Resolve relative GIT_CONFIG_GLOBAL against repo root (same as Go CLI)
71
- if (k === 'GIT_CONFIG_GLOBAL' && !path.isAbsolute(v)) {
72
- resolved = path.join(repoRoot, v);
73
- }
74
- process.env[k] = resolved;
75
- }
76
- }
77
- const BASE_ALLOWED_HOSTS = [
78
- 'api.openai.com',
79
- '*.openai.com',
80
- 'chat.openai.com',
81
- 'chatgpt.com',
82
- '*.chatgpt.com',
83
- 'registry.npmjs.org',
84
- 'github.com',
85
- '*.github.com',
86
- '*.githubusercontent.com',
87
- // Go module proxy + storage backend
88
- 'proxy.golang.org',
89
- 'sum.golang.org',
90
- 'golang.org',
91
- 'storage.googleapis.com',
92
- '*.googlesource.com',
93
- ];
94
- /**
95
- * Resume a VM from a checkpoint, inject credentials, configure egress +
96
- * TLS. Returns the managed VM handle.
97
- */
98
- export async function resumeVm(config) {
99
- const mainRepo = findMainWorktree();
100
- const agentDir = path.join(mainRepo, '.moltnet', config.agentName);
101
- if (!existsSync(agentDir)) {
102
- throw new Error(`Agent directory not found: ${agentDir}. Run: moltnet register --name ${config.agentName}`);
103
- }
104
- const creds = loadCredentials(agentDir);
105
- const moltnetConfig = JSON.parse(creds.moltnetJson);
106
- const apiHost = new URL(moltnetConfig.endpoints.api).hostname;
107
- const allowedHosts = [
108
- ...BASE_ALLOWED_HOSTS,
109
- apiHost,
110
- ...(config.extraAllowedHosts ?? []),
111
- ];
112
- const { httpHooks, env: secretEnv } = createHttpHooks({ allowedHosts });
113
- // Build VM-side agent env vars from credentials.
114
- // GIT_CONFIG_GLOBAL must point to the VM-side path, not host-side.
115
- const vmAgentEnv = {};
116
- for (const [k, v] of Object.entries(creds.agentEnv)) {
117
- if (v === undefined || v === '')
118
- continue;
119
- if (k === 'GIT_CONFIG_GLOBAL') {
120
- // Remap to VM-side credentials path
121
- vmAgentEnv[k] = `/home/agent/.moltnet/${config.agentName}/gitconfig`;
122
- }
123
- else if (k.endsWith('_PRIVATE_KEY_PATH')) {
124
- // Remap key paths to VM-side
125
- vmAgentEnv[k] =
126
- `/home/agent/.moltnet/${config.agentName}/${path.basename(v)}`;
127
- }
128
- else {
129
- vmAgentEnv[k] = v;
130
- }
131
- }
132
- // Build workspace VFS provider (with optional shadows)
133
- const vfsConfig = config.sandboxConfig?.vfs;
134
- let workspaceProvider = new RealFSProvider(config.mountPath);
135
- if (vfsConfig?.shadow?.length) {
136
- const predicate = createShadowPathPredicate(vfsConfig.shadow);
137
- workspaceProvider = new ShadowProvider(workspaceProvider, {
138
- shouldShadow: predicate,
139
- writeMode: vfsConfig.shadowMode ?? 'tmpfs',
140
- });
141
- }
142
- // Merge env: defaults < sandbox config overrides
143
- const envOverrides = config.sandboxConfig?.env ?? {};
144
- const vmEnv = {
145
- ...secretEnv,
146
- ...vmAgentEnv,
147
- PATH: '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/go/bin',
148
- HOME: '/home/agent',
149
- NODE_NO_WARNINGS: '1',
150
- NODE_EXTRA_CA_CERTS: '/etc/ssl/certs/ca-certificates.crt',
151
- ...envOverrides,
152
- };
153
- const resources = config.sandboxConfig?.resources;
154
- const cp = VmCheckpoint.load(config.checkpointPath);
155
- const vm = await cp.resume({
156
- httpHooks,
157
- env: vmEnv,
158
- ...(resources?.memory && { memory: resources.memory }),
159
- ...(resources?.cpus && { cpus: resources.cpus }),
160
- vfs: {
161
- mounts: {
162
- [GUEST_WORKSPACE]: workspaceProvider,
163
- },
164
- },
165
- });
166
- // Fix TLS: append Gondolin MITM CA to system trust store.
167
- // Unofficial-builds Node ships its own OpenSSL which can't load
168
- // NODE_EXTRA_CA_CERTS from /etc/gondolin/mitm/ca.crt (error 8000000D).
169
- await vm.exec(`sh -c '
170
- cp /etc/gondolin/mitm/ca.crt /usr/local/share/ca-certificates/gondolin-mitm.crt
171
- update-ca-certificates 2>/dev/null
172
- cat /etc/gondolin/mitm/ca.crt >> /etc/ssl/certs/ca-certificates.crt
173
- '`);
174
- // Fix DNS: ensure working resolvers (VM gateway DNS may not forward correctly)
175
- await vm.exec(`sh -c 'echo "nameserver 8.8.8.8
176
- nameserver 1.1.1.1" > /etc/resolv.conf'`);
177
- // Inject credentials into VM-side agent directory structure:
178
- // /home/agent/.moltnet/<agentName>/{moltnet.json,env,gitconfig,ssh/}
179
- // Mirrors host layout so legreffier skill and CLI work identically.
180
- const vmAgentDir = `/home/agent/.moltnet/${config.agentName}`;
181
- const vmSshDir = `${vmAgentDir}/ssh`;
182
- await vm.exec(`mkdir -p ${vmAgentDir}/ssh /home/agent/.pi/agent`);
183
- await vm.fs.writeFile('/home/agent/.pi/agent/auth.json', creds.piAuthJson, {
184
- mode: 0o600,
185
- });
186
- await vm.fs.writeFile(`${vmAgentDir}/moltnet.json`, creds.moltnetJson, {
187
- mode: 0o600,
188
- });
189
- await vm.fs.writeFile(`${vmAgentDir}/env`, creds.agentEnvRaw, {
190
- mode: 0o600,
191
- });
192
- // Inject gitconfig with VM-side signing key path and relative worktree
193
- // paths. `worktree.useRelativePaths = true` (git >= 2.48) makes
194
- // `git worktree add` write relative pointers — the only form that is
195
- // simultaneously valid inside the VM (where the mount appears at
196
- // `/workspace`) and on the host (where it appears at the real mount
197
- // path). Without it the guest writes `/workspace/...` absolute paths
198
- // that get persisted via RealFSProvider and leave corrupt worktree
199
- // metadata on the host.
200
- if (creds.gitconfig) {
201
- const vmSigningKey = `${vmSshDir}/id_ed25519`;
202
- let vmGitconfig = creds.gitconfig.replace(/signingKey\s*=\s*.+/g, `signingKey = ${vmSigningKey}`);
203
- vmGitconfig = ensureRelativeWorktreePaths(vmGitconfig);
204
- await vm.fs.writeFile(`${vmAgentDir}/gitconfig`, vmGitconfig, {
205
- mode: 0o644,
206
- });
207
- }
208
- // Inject SSH keys for commit signing
209
- if (creds.sshPrivateKey) {
210
- await vm.fs.writeFile(`${vmSshDir}/id_ed25519`, creds.sshPrivateKey, {
211
- mode: 0o600,
212
- });
213
- }
214
- if (creds.sshPublicKey) {
215
- await vm.fs.writeFile(`${vmSshDir}/id_ed25519.pub`, creds.sshPublicKey, {
216
- mode: 0o644,
217
- });
218
- }
219
- if (creds.allowedSigners) {
220
- await vm.fs.writeFile(`${vmSshDir}/allowed_signers`, creds.allowedSigners, {
221
- mode: 0o644,
222
- });
223
- }
224
- await vm.exec('chown -R agent:agent /home/agent/.pi /home/agent/.moltnet');
225
- return {
226
- vm,
227
- credentials: creds,
228
- mountPath: config.mountPath,
229
- guestWorkspace: GUEST_WORKSPACE,
230
- agentDir,
231
- };
232
- }
233
- /**
234
- * Ensure `[worktree] useRelativePaths = true` is set in the given
235
- * gitconfig text. If the section exists, rewrite the key; otherwise
236
- * append a new section.
237
- */
238
- export function ensureRelativeWorktreePaths(gitconfig) {
239
- const sectionRe = /^\[worktree\]\s*$/m;
240
- const keyRe = /^(\[worktree\][\s\S]*?^)\s*useRelativePaths\s*=\s*\S+\s*$/m;
241
- if (keyRe.test(gitconfig)) {
242
- return gitconfig.replace(/^(\s*useRelativePaths\s*=\s*)\S+\s*$/m, '$1true');
243
- }
244
- if (sectionRe.test(gitconfig)) {
245
- return gitconfig.replace(sectionRe, '[worktree]\n\tuseRelativePaths = true');
246
- }
247
- const sep = gitconfig.endsWith('\n') ? '' : '\n';
248
- return `${gitconfig}${sep}[worktree]\n\tuseRelativePaths = true\n`;
249
- }
250
- //# sourceMappingURL=vm-manager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"vm-manager.js","sourceRoot":"","sources":["../src/vm-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGrC,OAAO,EACL,eAAe,EACf,yBAAyB,EACzB,cAAc,EACd,cAAc,EACd,YAAY,GACb,MAAM,0BAA0B,CAAC;AAElC,MAAM,eAAe,GAAG,YAAY,CAAC;AAoCrC;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE;QACtE,QAAQ,EAAE,MAAM;KACjB,CAAC,CAAC;IACH,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;QACxD,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC;YACxC,OAAO,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACvC,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC;IAC9E,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;IAErE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAC1B,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EACtB,KAAK,EACL,OAAO,EACP,WAAW,CACZ,CAAC;IACF,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,qCAAqC,UAAU,iBAAiB,CACjE,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAEpD,oDAAoD;IACpD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,UAAU,CAAC,aAAa,CAAC;QACzC,CAAC,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC;QACrC,CAAC,CAAC,IAAI,CAAC;IAET,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC1C,MAAM,aAAa,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QAC/D,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC;QACvD,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;QAClE,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC3D,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,cAAc,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;QACrE,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC5D,CAAC,CAAC,IAAI,CAAC;IAET,OAAO;QACL,WAAW;QACX,WAAW;QACX,UAAU;QACV,QAAQ,EAAE,QAAQ,CAAC,WAAW,CAAC;QAC/B,SAAS;QACT,aAAa;QACb,YAAY;QACZ,cAAc;KACf,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAA4C,EAC5C,QAAgB;IAEhB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9C,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE;YAAE,SAAS;QAExD,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,wEAAwE;QACxE,IAAI,CAAC,KAAK,mBAAmB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACpC,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,MAAM,kBAAkB,GAAG;IACzB,gBAAgB;IAChB,cAAc;IACd,iBAAiB;IACjB,aAAa;IACb,eAAe;IACf,oBAAoB;IACpB,YAAY;IACZ,cAAc;IACd,yBAAyB;IACzB,oCAAoC;IACpC,kBAAkB;IAClB,gBAAgB;IAChB,YAAY;IACZ,wBAAwB;IACxB,oBAAoB;CACrB,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAgB;IAC7C,MAAM,QAAQ,GAAG,gBAAgB,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAEnE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,8BAA8B,QAAQ,kCAAkC,MAAM,CAAC,SAAS,EAAE,CAC3F,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;IAE9D,MAAM,YAAY,GAAG;QACnB,GAAG,kBAAkB;QACrB,OAAO;QACP,GAAG,CAAC,MAAM,CAAC,iBAAiB,IAAI,EAAE,CAAC;KACpC,CAAC;IAEF,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,eAAe,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC;IAExE,iDAAiD;IACjD,mEAAmE;IACnE,MAAM,UAAU,GAA2B,EAAE,CAAC;IAC9C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,EAAE;YAAE,SAAS;QAC1C,IAAI,CAAC,KAAK,mBAAmB,EAAE,CAAC;YAC9B,oCAAoC;YACpC,UAAU,CAAC,CAAC,CAAC,GAAG,wBAAwB,MAAM,CAAC,SAAS,YAAY,CAAC;QACvE,CAAC;aAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAC3C,6BAA6B;YAC7B,UAAU,CAAC,CAAC,CAAC;gBACX,wBAAwB,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,uDAAuD;IACvD,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,EAAE,GAAG,CAAC;IAC5C,IAAI,iBAAiB,GAAoC,IAAI,cAAc,CACzE,MAAM,CAAC,SAAS,CACjB,CAAC;IACF,IAAI,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,yBAAyB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC9D,iBAAiB,GAAG,IAAI,cAAc,CAAC,iBAAiB,EAAE;YACxD,YAAY,EAAE,SAAS;YACvB,SAAS,EAAE,SAAS,CAAC,UAAU,IAAI,OAAO;SAC3C,CAAC,CAAC;IACL,CAAC;IAED,iDAAiD;IACjD,MAAM,YAAY,GAAG,MAAM,CAAC,aAAa,EAAE,GAAG,IAAI,EAAE,CAAC;IACrD,MAAM,KAAK,GAAG;QACZ,GAAG,SAAS;QACZ,GAAG,UAAU;QACb,IAAI,EAAE,8EAA8E;QACpF,IAAI,EAAE,aAAa;QACnB,gBAAgB,EAAE,GAAG;QACrB,mBAAmB,EAAE,oCAAoC;QACzD,GAAG,YAAY;KAChB,CAAC;IAEF,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,EAAE,SAAS,CAAC;IAClD,MAAM,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IACpD,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC;QACzB,SAAS;QACT,GAAG,EAAE,KAAK;QACV,GAAG,CAAC,SAAS,EAAE,MAAM,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC;QACtD,GAAG,CAAC,SAAS,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC;QAChD,GAAG,EAAE;YACH,MAAM,EAAE;gBACN,CAAC,eAAe,CAAC,EAAE,iBAAiB;aACrC;SACF;KACF,CAAC,CAAC;IAEH,0DAA0D;IAC1D,gEAAgE;IAChE,uEAAuE;IACvE,MAAM,EAAE,CAAC,IAAI,CAAC;;;;IAIZ,CAAC,CAAC;IAEJ,+EAA+E;IAC/E,MAAM,EAAE,CAAC,IAAI,CAAC;wCACwB,CAAC,CAAC;IAExC,6DAA6D;IAC7D,uEAAuE;IACvE,oEAAoE;IACpE,MAAM,UAAU,GAAG,wBAAwB,MAAM,CAAC,SAAS,EAAE,CAAC;IAC9D,MAAM,QAAQ,GAAG,GAAG,UAAU,MAAM,CAAC;IACrC,MAAM,EAAE,CAAC,IAAI,CAAC,YAAY,UAAU,4BAA4B,CAAC,CAAC;IAElE,MAAM,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,iCAAiC,EAAE,KAAK,CAAC,UAAU,EAAE;QACzE,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;IACH,MAAM,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,UAAU,eAAe,EAAE,KAAK,CAAC,WAAW,EAAE;QACrE,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;IACH,MAAM,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,UAAU,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE;QAC5D,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;IAEH,uEAAuE;IACvE,gEAAgE;IAChE,qEAAqE;IACrE,iEAAiE;IACjE,oEAAoE;IACpE,qEAAqE;IACrE,mEAAmE;IACnE,wBAAwB;IACxB,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,MAAM,YAAY,GAAG,GAAG,QAAQ,aAAa,CAAC;QAC9C,IAAI,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,CACvC,sBAAsB,EACtB,gBAAgB,YAAY,EAAE,CAC/B,CAAC;QACF,WAAW,GAAG,2BAA2B,CAAC,WAAW,CAAC,CAAC;QACvD,MAAM,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,UAAU,YAAY,EAAE,WAAW,EAAE;YAC5D,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;IACL,CAAC;IAED,qCAAqC;IACrC,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;QACxB,MAAM,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,QAAQ,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE;YACnE,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;IACL,CAAC;IACD,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,MAAM,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,QAAQ,iBAAiB,EAAE,KAAK,CAAC,YAAY,EAAE;YACtE,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;IACL,CAAC;IACD,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB,MAAM,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,QAAQ,kBAAkB,EAAE,KAAK,CAAC,cAAc,EAAE;YACzE,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;IACL,CAAC;IAED,MAAM,EAAE,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;IAE3E,OAAO;QACL,EAAE;QACF,WAAW,EAAE,KAAK;QAClB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,cAAc,EAAE,eAAe;QAC/B,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,2BAA2B,CAAC,SAAiB;IAC3D,MAAM,SAAS,GAAG,oBAAoB,CAAC;IACvC,MAAM,KAAK,GAAG,4DAA4D,CAAC;IAE3E,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC,OAAO,CAAC,uCAAuC,EAAE,QAAQ,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC,OAAO,CACtB,SAAS,EACT,uCAAuC,CACxC,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACjD,OAAO,GAAG,SAAS,GAAG,GAAG,yCAAyC,CAAC;AACrE,CAAC"}