@xandout/libra-harness 0.1.10 → 0.1.13
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/agent.d.ts.map +1 -1
- package/dist/agent.js +20 -9
- package/dist/agent.js.map +1 -1
- package/dist/extras/extensions/code-tools/extension.d.ts +69 -0
- package/dist/extras/extensions/code-tools/extension.d.ts.map +1 -0
- package/dist/extras/extensions/code-tools/extension.js +83 -0
- package/dist/extras/extensions/code-tools/extension.js.map +1 -0
- package/dist/extras/extensions/code-tools/extension.json +7 -0
- package/dist/extras/extensions/code-tools/extension.test.d.ts +2 -0
- package/dist/extras/extensions/code-tools/extension.test.d.ts.map +1 -0
- package/dist/extras/extensions/code-tools/extension.test.js +656 -0
- package/dist/extras/extensions/code-tools/extension.test.js.map +1 -0
- package/dist/extras/extensions/code-tools/index.d.ts +3 -0
- package/dist/extras/extensions/code-tools/index.d.ts.map +1 -0
- package/dist/extras/extensions/code-tools/index.js +2 -0
- package/dist/extras/extensions/code-tools/index.js.map +1 -0
- package/dist/extras/extensions/code-tools/tools/find.d.ts +3 -0
- package/dist/extras/extensions/code-tools/tools/find.d.ts.map +1 -0
- package/dist/extras/extensions/code-tools/tools/find.js +160 -0
- package/dist/extras/extensions/code-tools/tools/find.js.map +1 -0
- package/dist/extras/extensions/code-tools/tools/grep.d.ts +3 -0
- package/dist/extras/extensions/code-tools/tools/grep.d.ts.map +1 -0
- package/dist/extras/extensions/code-tools/tools/grep.js +306 -0
- package/dist/extras/extensions/code-tools/tools/grep.js.map +1 -0
- package/dist/extras/extensions/code-tools/tools/read.d.ts +3 -0
- package/dist/extras/extensions/code-tools/tools/read.d.ts.map +1 -0
- package/dist/extras/extensions/code-tools/tools/read.js +97 -0
- package/dist/extras/extensions/code-tools/tools/read.js.map +1 -0
- package/dist/extras/extensions/code-tools/tools/shared.d.ts +14 -0
- package/dist/extras/extensions/code-tools/tools/shared.d.ts.map +1 -0
- package/dist/extras/extensions/code-tools/tools/shared.js +53 -0
- package/dist/extras/extensions/code-tools/tools/shared.js.map +1 -0
- package/dist/extras/extensions/code-tools/tools/shell.d.ts +47 -0
- package/dist/extras/extensions/code-tools/tools/shell.d.ts.map +1 -0
- package/dist/extras/extensions/code-tools/tools/shell.js +492 -0
- package/dist/extras/extensions/code-tools/tools/shell.js.map +1 -0
- package/dist/extras/extensions/code-tools/tools/todo.d.ts +24 -0
- package/dist/extras/extensions/code-tools/tools/todo.d.ts.map +1 -0
- package/dist/extras/extensions/code-tools/tools/todo.js +131 -0
- package/dist/extras/extensions/code-tools/tools/todo.js.map +1 -0
- package/dist/extras/extensions/code-tools/tools/write.d.ts +4 -0
- package/dist/extras/extensions/code-tools/tools/write.d.ts.map +1 -0
- package/dist/extras/extensions/code-tools/tools/write.js +179 -0
- package/dist/extras/extensions/code-tools/tools/write.js.map +1 -0
- package/dist/extras/extensions/disk-session/extension.d.ts +5 -0
- package/dist/extras/extensions/disk-session/extension.d.ts.map +1 -1
- package/dist/extras/extensions/disk-session/extension.js +141 -23
- package/dist/extras/extensions/disk-session/extension.js.map +1 -1
- package/package.json +5 -1
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { readFileSync, statSync, existsSync } from 'node:fs';
|
|
2
|
+
import { makeToolName, getReadSet, isTextFile, isImageFile, imageMime } from './shared.js';
|
|
3
|
+
export const readTool = (cfg) => ({
|
|
4
|
+
name: makeToolName(cfg.toolPrefix, 'read'),
|
|
5
|
+
description: 'Read a file from the local filesystem. Returns file contents with line numbers. ' +
|
|
6
|
+
'Text files are returned as text; binary files as base64; images are returned as base64 data URLs. ' +
|
|
7
|
+
'You MUST read a file before editing or overwriting it. ' +
|
|
8
|
+
'Use absolute paths. For large files, use offset (1-based line number) and limit (line count) to read a portion.',
|
|
9
|
+
parameters: {
|
|
10
|
+
type: 'object',
|
|
11
|
+
properties: {
|
|
12
|
+
file_path: {
|
|
13
|
+
type: 'string',
|
|
14
|
+
description: 'The absolute path to the file to read.',
|
|
15
|
+
},
|
|
16
|
+
offset: {
|
|
17
|
+
type: 'integer',
|
|
18
|
+
description: 'The line number to start reading from (1-based). Default: 1.',
|
|
19
|
+
},
|
|
20
|
+
limit: {
|
|
21
|
+
type: 'integer',
|
|
22
|
+
description: 'Maximum number of lines to read. Default: 2000.',
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
required: ['file_path'],
|
|
26
|
+
},
|
|
27
|
+
async execute(args, ctx) {
|
|
28
|
+
const filePath = String(args.file_path ?? '');
|
|
29
|
+
if (!filePath) {
|
|
30
|
+
return { toolCallId: '', content: 'Error: file_path is required' };
|
|
31
|
+
}
|
|
32
|
+
if (!existsSync(filePath)) {
|
|
33
|
+
return { toolCallId: '', content: `File not found: ${filePath}` };
|
|
34
|
+
}
|
|
35
|
+
const stat = statSync(filePath);
|
|
36
|
+
if (stat.isDirectory()) {
|
|
37
|
+
return {
|
|
38
|
+
toolCallId: '',
|
|
39
|
+
content: `Path is a directory, not a file: ${filePath}. Use find_file_by_name or exec with ls to list directory contents.`,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
if (stat.size > cfg.maxReadSize) {
|
|
43
|
+
return {
|
|
44
|
+
toolCallId: '',
|
|
45
|
+
content: `File is too large (${stat.size} bytes, max ${cfg.maxReadSize}). Use offset and limit to read a portion, or use exec with head/tail.`,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
// Track that this file was read — edit and write require it.
|
|
49
|
+
getReadSet(ctx.metadata).add(filePath);
|
|
50
|
+
const buf = readFileSync(filePath);
|
|
51
|
+
// ── Image files: return as base64 data URL ──────────────────────
|
|
52
|
+
if (isImageFile(filePath)) {
|
|
53
|
+
const mime = imageMime(filePath);
|
|
54
|
+
const base64 = buf.toString('base64');
|
|
55
|
+
return {
|
|
56
|
+
toolCallId: '',
|
|
57
|
+
content: `File: ${filePath} (${stat.size}b, ${mime})\ndata:${mime};base64,${base64}`,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
// ── Binary files: return as base64 ──────────────────────────────
|
|
61
|
+
if (!isTextFile(filePath)) {
|
|
62
|
+
const base64 = buf.toString('base64');
|
|
63
|
+
return {
|
|
64
|
+
toolCallId: '',
|
|
65
|
+
content: `File: ${filePath} (${stat.size}b, binary)\nbase64: ${base64}`,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
// ── Text files: return with line numbers ────────────────────────
|
|
69
|
+
const text = buf.toString('utf-8');
|
|
70
|
+
const allLines = text.split('\n');
|
|
71
|
+
// Apply offset (1-based)
|
|
72
|
+
const offset = Math.max(1, Number(args.offset ?? 1));
|
|
73
|
+
const startIdx = offset - 1;
|
|
74
|
+
let lines = allLines.slice(startIdx);
|
|
75
|
+
// Apply limit
|
|
76
|
+
const limit = Math.min(Number(args.limit ?? cfg.maxReadLines), cfg.maxReadLines);
|
|
77
|
+
const truncated = lines.length > limit;
|
|
78
|
+
lines = lines.slice(0, limit);
|
|
79
|
+
// Format with line numbers, truncating long lines
|
|
80
|
+
const formatted = lines.map((line, i) => {
|
|
81
|
+
const lineNum = startIdx + i + 1;
|
|
82
|
+
const truncatedLine = line.length > cfg.maxLineLength
|
|
83
|
+
? line.slice(0, cfg.maxLineLength) + ' [...truncated]'
|
|
84
|
+
: line;
|
|
85
|
+
return `${String(lineNum).padStart(6)}\t${truncatedLine}`;
|
|
86
|
+
}).join('\n');
|
|
87
|
+
const header = `File: ${filePath} (${stat.size}b)`;
|
|
88
|
+
const footer = truncated
|
|
89
|
+
? `\n\n[showing lines ${offset}-${offset + limit - 1} of ${allLines.length} total]`
|
|
90
|
+
: '';
|
|
91
|
+
return {
|
|
92
|
+
toolCallId: '',
|
|
93
|
+
content: `${header}\n${formatted}${footer}`,
|
|
94
|
+
};
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
//# sourceMappingURL=read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.js","sourceRoot":"","sources":["../../../../../src/extras/extensions/code-tools/tools/read.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Tool } from '../../../../tool.js';
|
|
2
|
+
export declare function makeToolName(prefix: string, name: string): string;
|
|
3
|
+
export declare function getReadSet(metadata: Record<string, unknown>): Set<string>;
|
|
4
|
+
export declare function isTextFile(path: string): boolean;
|
|
5
|
+
export declare function isImageFile(path: string): boolean;
|
|
6
|
+
export declare function imageMime(path: string): string;
|
|
7
|
+
export interface ResolvedConfig {
|
|
8
|
+
toolPrefix: string;
|
|
9
|
+
maxReadSize: number;
|
|
10
|
+
maxReadLines: number;
|
|
11
|
+
maxLineLength: number;
|
|
12
|
+
}
|
|
13
|
+
export type ToolFactory = (cfg: ResolvedConfig) => Tool;
|
|
14
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../../src/extras/extensions/code-tools/tools/shared.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAGhD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjE;AAOD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAOzE;AAaD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMhD;AAKD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD;AAWD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAGD,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAGD,MAAM,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,cAAc,KAAK,IAAI,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { extname, basename } from 'node:path';
|
|
2
|
+
// ── Tool naming helper ───────────────────────────────────────────────
|
|
3
|
+
export function makeToolName(prefix, name) {
|
|
4
|
+
return prefix ? `${prefix}_${name}` : name;
|
|
5
|
+
}
|
|
6
|
+
// ── Read tracking ────────────────────────────────────────────────────
|
|
7
|
+
// The edit and write tools require that a file was read first in the
|
|
8
|
+
// current turn. We track read paths per turn via the metadata bag.
|
|
9
|
+
const READ_KEY = '__codeToolsReadPaths';
|
|
10
|
+
export function getReadSet(metadata) {
|
|
11
|
+
let set = metadata[READ_KEY];
|
|
12
|
+
if (!set) {
|
|
13
|
+
set = new Set();
|
|
14
|
+
metadata[READ_KEY] = set;
|
|
15
|
+
}
|
|
16
|
+
return set;
|
|
17
|
+
}
|
|
18
|
+
// ── Text/binary detection ────────────────────────────────────────────
|
|
19
|
+
const TEXT_EXTENSIONS = new Set([
|
|
20
|
+
'.txt', '.csv', '.json', '.xml', '.yaml', '.yml', '.md', '.markdown',
|
|
21
|
+
'.js', '.ts', '.tsx', '.jsx', '.mjs', '.cjs', '.py', '.java', '.c',
|
|
22
|
+
'.cpp', '.h', '.hpp', '.go', '.rs', '.rb', '.php', '.sql', '.html',
|
|
23
|
+
'.htm', '.css', '.scss', '.less', '.sh', '.bash', '.zsh', '.ini',
|
|
24
|
+
'.conf', '.log', '.env', '.toml', '.graphql', '.gql', '.svg', '.srt',
|
|
25
|
+
'.vtt', '.properties', '.dockerfile', '.gitignore', '.editorconfig',
|
|
26
|
+
'.lock', '.map', '.d.ts', '.d.ts.map',
|
|
27
|
+
]);
|
|
28
|
+
export function isTextFile(path) {
|
|
29
|
+
const ext = extname(path).toLowerCase();
|
|
30
|
+
if (TEXT_EXTENSIONS.has(ext))
|
|
31
|
+
return true;
|
|
32
|
+
const name = basename(path).toLowerCase();
|
|
33
|
+
if (['dockerfile', '.gitignore', '.editorconfig', '.env', '.npmrc'].includes(name))
|
|
34
|
+
return true;
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
// ── Image detection ──────────────────────────────────────────────────
|
|
38
|
+
const IMAGE_EXTENSIONS = new Set(['.png', '.jpg', '.jpeg', '.gif', '.webp', '.bmp']);
|
|
39
|
+
export function isImageFile(path) {
|
|
40
|
+
return IMAGE_EXTENSIONS.has(extname(path).toLowerCase());
|
|
41
|
+
}
|
|
42
|
+
const MIME_MAP = {
|
|
43
|
+
'.png': 'image/png',
|
|
44
|
+
'.jpg': 'image/jpeg',
|
|
45
|
+
'.jpeg': 'image/jpeg',
|
|
46
|
+
'.gif': 'image/gif',
|
|
47
|
+
'.webp': 'image/webp',
|
|
48
|
+
'.bmp': 'image/bmp',
|
|
49
|
+
};
|
|
50
|
+
export function imageMime(path) {
|
|
51
|
+
return MIME_MAP[extname(path).toLowerCase()] ?? 'application/octet-stream';
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../../src/extras/extensions/code-tools/tools/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAG9C,wEAAwE;AACxE,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,IAAY;IACvD,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7C,CAAC;AAED,wEAAwE;AACxE,qEAAqE;AACrE,mEAAmE;AACnE,MAAM,QAAQ,GAAG,sBAAsB,CAAC;AAExC,MAAM,UAAU,UAAU,CAAC,QAAiC;IAC1D,IAAI,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAA4B,CAAC;IACxD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;QAChB,QAAQ,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC;IAC3B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,wEAAwE;AACxE,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW;IACpE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI;IAClE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO;IAClE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM;IAChE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IACpE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe;IACnE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW;CACtC,CAAC,CAAC;AAEH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IACxC,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1C,IAAI,CAAC,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAChG,OAAO,KAAK,CAAC;AACf,CAAC;AAED,wEAAwE;AACxE,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAErF,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,QAAQ,GAA2B;IACvC,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;CACpB,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,0BAA0B,CAAC;AAC7E,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { type ChildProcess } from 'node:child_process';
|
|
2
|
+
import type { Tool } from '../../../../tool.js';
|
|
3
|
+
export interface ShellEntry {
|
|
4
|
+
id: string;
|
|
5
|
+
process?: ChildProcess;
|
|
6
|
+
pid: number;
|
|
7
|
+
output: string;
|
|
8
|
+
done: boolean;
|
|
9
|
+
exitCode: number | null;
|
|
10
|
+
startedAt: number;
|
|
11
|
+
command: string;
|
|
12
|
+
cwd: string;
|
|
13
|
+
outputFile?: string;
|
|
14
|
+
detached: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare class ShellRegistry {
|
|
17
|
+
private shells;
|
|
18
|
+
private counter;
|
|
19
|
+
private shellsDir;
|
|
20
|
+
constructor(shellsDir?: string);
|
|
21
|
+
private nextId;
|
|
22
|
+
private metaPath;
|
|
23
|
+
/**
|
|
24
|
+
* Create a foreground shell (pipes connected, parent waits).
|
|
25
|
+
* If background is true, the process is detached and output goes
|
|
26
|
+
* to a file. Metadata is persisted to disk so a future process
|
|
27
|
+
* can reconnect.
|
|
28
|
+
*/
|
|
29
|
+
create(command: string, cwd: string, env: Record<string, string>, background: boolean): ShellEntry;
|
|
30
|
+
/**
|
|
31
|
+
* Get a shell by ID. If it's not in the in-memory map, try to
|
|
32
|
+
* reconnect from persisted metadata on disk.
|
|
33
|
+
*/
|
|
34
|
+
get(id: string): ShellEntry | undefined;
|
|
35
|
+
delete(id: string): boolean;
|
|
36
|
+
/** Kill all in-memory backgrounded shells. Called on extension close. */
|
|
37
|
+
close(): void;
|
|
38
|
+
}
|
|
39
|
+
export type ShellToolFactory = (cfg: {
|
|
40
|
+
toolPrefix: string;
|
|
41
|
+
registry: ShellRegistry;
|
|
42
|
+
}) => Tool;
|
|
43
|
+
export declare const execTool: ShellToolFactory;
|
|
44
|
+
export declare const getOutputTool: ShellToolFactory;
|
|
45
|
+
export declare const killShellTool: ShellToolFactory;
|
|
46
|
+
export declare const writeToProcessTool: ShellToolFactory;
|
|
47
|
+
//# sourceMappingURL=shell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../../../../src/extras/extensions/code-tools/tools/shell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAI9D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAQhD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAYD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,SAAS,CAAS;IAE1B,YAAY,SAAS,CAAC,EAAE,MAAM,EAE7B;IAED,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,QAAQ;IAIhB;;;;;OAKG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,EAAE,OAAO,GAAG,UAAU,CAuHjG;IAED;;;OAGG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CA2DtC;IAED,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAY1B;IAED,yEAAyE;IACzE,KAAK,IAAI,IAAI,CAgBZ;CACF;AAGD,MAAM,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,aAAa,CAAA;CAAE,KAAK,IAAI,CAAC;AAG9F,eAAO,MAAM,QAAQ,EAAE,gBA4FrB,CAAC;AAGH,eAAO,MAAM,aAAa,EAAE,gBAuD1B,CAAC;AAGH,eAAO,MAAM,aAAa,EAAE,gBAoD1B,CAAC;AAGH,eAAO,MAAM,kBAAkB,EAAE,gBAuE/B,CAAC"}
|