@semboja/opencode-claude 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js ADDED
@@ -0,0 +1,145 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * CLI utility for viewing Claude usage statistics
4
+ *
5
+ * Usage:
6
+ * npx opencode-plugin-claude-tracker report
7
+ * npx opencode-plugin-claude-tracker sessions [limit]
8
+ * npx opencode-plugin-claude-tracker export [format]
9
+ */
10
+ import { FileStorage } from './storage.js';
11
+ const args = process.argv.slice(2);
12
+ const command = args[0] ?? 'report';
13
+ const storagePath = process.env.CLAUDE_TRACKER_PATH;
14
+ async function main() {
15
+ const storage = new FileStorage(storagePath);
16
+ switch (command) {
17
+ case 'report':
18
+ await showReport(storage);
19
+ break;
20
+ case 'sessions':
21
+ await showSessions(storage, parseInt(args[1] ?? '10', 10));
22
+ break;
23
+ case 'export':
24
+ await exportData(storage, args[1] ?? 'json');
25
+ break;
26
+ case 'help':
27
+ default:
28
+ showHelp();
29
+ }
30
+ }
31
+ async function showReport(storage) {
32
+ const stats = await storage.getUsageStats();
33
+ console.log('\n=== Claude Usage Report ===\n');
34
+ console.log(`Total Sessions: ${stats.totalSessions}`);
35
+ console.log(`Total API Requests: ${stats.totalApiRequests}`);
36
+ console.log(`Total Cost: $${stats.totalCostUsd.toFixed(4)}`);
37
+ console.log('\nToken Usage:');
38
+ console.log(` Input: ${stats.totalTokens.input.toLocaleString().padStart(12)}`);
39
+ console.log(` Output: ${stats.totalTokens.output.toLocaleString().padStart(12)}`);
40
+ console.log(` Cache Read: ${stats.totalTokens.cacheRead.toLocaleString().padStart(12)}`);
41
+ console.log(` Cache Creation: ${stats.totalTokens.cacheCreation.toLocaleString().padStart(12)}`);
42
+ console.log(` Total: ${stats.totalTokens.total.toLocaleString().padStart(12)}`);
43
+ if (stats.byModel.size > 0) {
44
+ console.log('\nUsage by Model:');
45
+ console.log(' Model'.padEnd(40) + 'Requests'.padStart(10) + 'Tokens'.padStart(15) + 'Cost'.padStart(12));
46
+ console.log(' ' + '-'.repeat(73));
47
+ for (const [model, data] of stats.byModel) {
48
+ console.log(` ${model.padEnd(38)}${data.requests.toString().padStart(10)}${data.tokens.total.toLocaleString().padStart(15)}$${data.costUsd.toFixed(4).padStart(11)}`);
49
+ }
50
+ }
51
+ if (stats.byDay.size > 0) {
52
+ console.log('\nUsage by Day (last 7 days):');
53
+ console.log(' Date'.padEnd(15) + 'Requests'.padStart(10) + 'Tokens'.padStart(15) + 'Cost'.padStart(12));
54
+ console.log(' ' + '-'.repeat(48));
55
+ const days = Array.from(stats.byDay.entries())
56
+ .sort((a, b) => b[0].localeCompare(a[0]))
57
+ .slice(0, 7);
58
+ for (const [day, data] of days) {
59
+ console.log(` ${day.padEnd(13)}${data.requests.toString().padStart(10)}${data.tokens.total.toLocaleString().padStart(15)}$${data.costUsd.toFixed(4).padStart(11)}`);
60
+ }
61
+ }
62
+ if (stats.topTools.length > 0) {
63
+ console.log('\nTop Tools:');
64
+ console.log(' Tool'.padEnd(25) + 'Calls'.padStart(8) + 'Success'.padStart(10) + 'Avg Time'.padStart(12));
65
+ console.log(' ' + '-'.repeat(51));
66
+ for (const tool of stats.topTools) {
67
+ const successRate = tool.invocations > 0
68
+ ? ((tool.successCount / tool.invocations) * 100).toFixed(1) + '%'
69
+ : 'N/A';
70
+ console.log(` ${tool.name.padEnd(23)}${tool.invocations.toString().padStart(8)}${successRate.padStart(10)}${tool.avgDurationMs.toFixed(0).padStart(9)}ms`);
71
+ }
72
+ }
73
+ console.log('\n===========================\n');
74
+ }
75
+ async function showSessions(storage, limit) {
76
+ const sessions = await storage.getAllSessions(limit);
77
+ console.log(`\n=== Recent Sessions (${sessions.length}) ===\n`);
78
+ if (sessions.length === 0) {
79
+ console.log('No sessions found.');
80
+ return;
81
+ }
82
+ console.log('Session ID'.padEnd(40) + 'Start Time'.padEnd(22) + 'Tokens'.padStart(12) + 'Cost'.padStart(10));
83
+ console.log('-'.repeat(84));
84
+ for (const session of sessions) {
85
+ const startTime = session.startTime.replace('T', ' ').substring(0, 19);
86
+ console.log(`${session.sessionId.substring(0, 38).padEnd(40)}${startTime.padEnd(22)}${session.tokens.total.toLocaleString().padStart(12)}$${session.totalCostUsd.toFixed(4).padStart(9)}`);
87
+ }
88
+ console.log('\n');
89
+ }
90
+ async function exportData(storage, format) {
91
+ const stats = await storage.getUsageStats();
92
+ const sessions = await storage.getAllSessions(1000);
93
+ const data = {
94
+ exportDate: new Date().toISOString(),
95
+ stats: {
96
+ ...stats,
97
+ byModel: Object.fromEntries(stats.byModel),
98
+ byDay: Object.fromEntries(stats.byDay),
99
+ },
100
+ sessions: sessions.map(s => ({
101
+ ...s,
102
+ toolCalls: Object.fromEntries(s.toolCalls),
103
+ models: Object.fromEntries(s.models),
104
+ })),
105
+ };
106
+ if (format === 'csv') {
107
+ // Export summary as CSV
108
+ console.log('date,sessions,requests,input_tokens,output_tokens,cache_read_tokens,cache_creation_tokens,total_tokens,cost_usd');
109
+ for (const [day, dayData] of stats.byDay) {
110
+ console.log(`${day},${stats.totalSessions},${dayData.requests},${dayData.tokens.input},${dayData.tokens.output},${dayData.tokens.cacheRead},${dayData.tokens.cacheCreation},${dayData.tokens.total},${dayData.costUsd}`);
111
+ }
112
+ }
113
+ else {
114
+ // Default to JSON
115
+ console.log(JSON.stringify(data, null, 2));
116
+ }
117
+ }
118
+ function showHelp() {
119
+ console.log(`
120
+ Claude Usage Tracker CLI
121
+
122
+ Usage:
123
+ claude-tracker <command> [options]
124
+
125
+ Commands:
126
+ report Show usage summary report (default)
127
+ sessions [limit] List recent sessions (default: 10)
128
+ export [format] Export data as JSON (default) or CSV
129
+ help Show this help message
130
+
131
+ Environment:
132
+ CLAUDE_TRACKER_PATH Custom storage path (default: ~/.opencode/claude-usage)
133
+
134
+ Examples:
135
+ claude-tracker report
136
+ claude-tracker sessions 20
137
+ claude-tracker export json > usage.json
138
+ claude-tracker export csv > usage.csv
139
+ `);
140
+ }
141
+ main().catch(err => {
142
+ console.error('Error:', err.message);
143
+ process.exit(1);
144
+ });
145
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { Plugin } from '@opencode-ai/plugin';
2
+ import type { UsageStats } from './types.js';
3
+ export type { ClaudeTrackerConfig, UsageStats, SessionUsage, TokenUsage, ApiRequestMetrics, ToolMetrics } from './types.js';
4
+ export { FileStorage, MemoryStorage } from './storage.js';
5
+ export { ClaudeUsageProcessor } from './processor.js';
6
+ export { PrometheusRegistry, ClaudeMetrics, PrometheusServer, PushgatewayClient } from './prometheus.js';
7
+ /**
8
+ * Claude Usage Tracker Plugin for OpenCode
9
+ *
10
+ * Tracks Claude API usage including:
11
+ * - Token usage (input, output, cache read, cache creation)
12
+ * - Costs in USD
13
+ * - API request latency
14
+ * - Tool invocations and success rates
15
+ * - Per-model and per-day aggregations
16
+ *
17
+ * Configuration via environment variables:
18
+ * - CLAUDE_TRACKER_STORAGE: 'file' (default) or 'memory'
19
+ * - CLAUDE_TRACKER_PATH: Storage path (default: ~/.opencode/claude-usage)
20
+ * - CLAUDE_TRACKER_VERBOSE: '1' to enable verbose logging
21
+ * - CLAUDE_TRACKER_FLUSH_INTERVAL: Flush interval in ms (default: 30000)
22
+ *
23
+ * Prometheus configuration:
24
+ * - CLAUDE_TRACKER_PROMETHEUS: '1' to enable Prometheus metrics
25
+ * - CLAUDE_TRACKER_PROMETHEUS_PORT: Port for /metrics endpoint (default: 9464)
26
+ * - CLAUDE_TRACKER_PUSHGATEWAY_URL: Pushgateway URL for pushing metrics
27
+ * - CLAUDE_TRACKER_PUSHGATEWAY_JOB: Job name for Pushgateway (default: 'claude_tracker')
28
+ * - CLAUDE_TRACKER_PUSHGATEWAY_INTERVAL: Push interval in ms (default: 15000)
29
+ */
30
+ export declare const ClaudeTrackerPlugin: Plugin;
31
+ export default ClaudeTrackerPlugin;
32
+ /**
33
+ * Utility function to get usage statistics
34
+ * Can be used outside the plugin context
35
+ */
36
+ export declare function getUsageStats(storagePath?: string): Promise<UsageStats>;
37
+ /**
38
+ * Utility function to print a usage report to console
39
+ */
40
+ export declare function printUsageReport(storagePath?: string): Promise<void>;
41
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAKlD,OAAO,KAAK,EAAuC,UAAU,EAAE,MAAM,YAAY,CAAC;AAElF,YAAY,EAAE,mBAAmB,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC5H,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzG;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAyHjC,CAAC;AAGF,eAAe,mBAAmB,CAAC;AAEnC;;;GAGG;AACH,wBAAsB,aAAa,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAG7E;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgC1E"}
package/dist/index.js ADDED
@@ -0,0 +1,182 @@
1
+ import { NodeSDK } from '@opentelemetry/sdk-node';
2
+ import { ClaudeUsageProcessor } from './processor.js';
3
+ import { FileStorage, MemoryStorage } from './storage.js';
4
+ import { PrometheusRegistry, ClaudeMetrics, PrometheusServer, PushgatewayClient } from './prometheus.js';
5
+ export { FileStorage, MemoryStorage } from './storage.js';
6
+ export { ClaudeUsageProcessor } from './processor.js';
7
+ export { PrometheusRegistry, ClaudeMetrics, PrometheusServer, PushgatewayClient } from './prometheus.js';
8
+ /**
9
+ * Claude Usage Tracker Plugin for OpenCode
10
+ *
11
+ * Tracks Claude API usage including:
12
+ * - Token usage (input, output, cache read, cache creation)
13
+ * - Costs in USD
14
+ * - API request latency
15
+ * - Tool invocations and success rates
16
+ * - Per-model and per-day aggregations
17
+ *
18
+ * Configuration via environment variables:
19
+ * - CLAUDE_TRACKER_STORAGE: 'file' (default) or 'memory'
20
+ * - CLAUDE_TRACKER_PATH: Storage path (default: ~/.opencode/claude-usage)
21
+ * - CLAUDE_TRACKER_VERBOSE: '1' to enable verbose logging
22
+ * - CLAUDE_TRACKER_FLUSH_INTERVAL: Flush interval in ms (default: 30000)
23
+ *
24
+ * Prometheus configuration:
25
+ * - CLAUDE_TRACKER_PROMETHEUS: '1' to enable Prometheus metrics
26
+ * - CLAUDE_TRACKER_PROMETHEUS_PORT: Port for /metrics endpoint (default: 9464)
27
+ * - CLAUDE_TRACKER_PUSHGATEWAY_URL: Pushgateway URL for pushing metrics
28
+ * - CLAUDE_TRACKER_PUSHGATEWAY_JOB: Job name for Pushgateway (default: 'claude_tracker')
29
+ * - CLAUDE_TRACKER_PUSHGATEWAY_INTERVAL: Push interval in ms (default: 15000)
30
+ */
31
+ export const ClaudeTrackerPlugin = async ({ client }) => {
32
+ // Read configuration from environment
33
+ const storageType = (process.env.CLAUDE_TRACKER_STORAGE ?? 'file');
34
+ const storagePath = process.env.CLAUDE_TRACKER_PATH;
35
+ const verbose = process.env.CLAUDE_TRACKER_VERBOSE === '1';
36
+ const flushIntervalMs = parseInt(process.env.CLAUDE_TRACKER_FLUSH_INTERVAL ?? '30000', 10);
37
+ // Prometheus configuration
38
+ const prometheusEnabled = process.env.CLAUDE_TRACKER_PROMETHEUS === '1';
39
+ const prometheusPort = parseInt(process.env.CLAUDE_TRACKER_PROMETHEUS_PORT ?? '9464', 10);
40
+ const pushgatewayUrl = process.env.CLAUDE_TRACKER_PUSHGATEWAY_URL;
41
+ const pushgatewayJob = process.env.CLAUDE_TRACKER_PUSHGATEWAY_JOB ?? 'claude_tracker';
42
+ const pushgatewayInterval = parseInt(process.env.CLAUDE_TRACKER_PUSHGATEWAY_INTERVAL ?? '15000', 10);
43
+ const log = (level, message) => {
44
+ client.app.log({
45
+ body: { service: 'claude-tracker', level, message },
46
+ });
47
+ };
48
+ // Initialize storage backend
49
+ let storage;
50
+ if (storageType === 'memory') {
51
+ storage = new MemoryStorage();
52
+ log('info', 'Using in-memory storage (data will not persist)');
53
+ }
54
+ else {
55
+ storage = new FileStorage(storagePath);
56
+ log('info', `Using file storage at ${storagePath ?? '~/.opencode/claude-usage'}`);
57
+ }
58
+ // Initialize Prometheus if enabled
59
+ let prometheusMetrics;
60
+ let prometheusServer;
61
+ let pushgatewayClient;
62
+ let pushInterval;
63
+ if (prometheusEnabled || pushgatewayUrl) {
64
+ const registry = new PrometheusRegistry();
65
+ prometheusMetrics = new ClaudeMetrics(registry);
66
+ if (prometheusEnabled) {
67
+ prometheusServer = new PrometheusServer(registry, prometheusPort);
68
+ try {
69
+ await prometheusServer.start();
70
+ log('info', `Prometheus metrics server started on port ${prometheusPort}`);
71
+ }
72
+ catch (err) {
73
+ log('error', `Failed to start Prometheus server: ${err}`);
74
+ }
75
+ }
76
+ if (pushgatewayUrl) {
77
+ pushgatewayClient = new PushgatewayClient(registry, pushgatewayUrl, pushgatewayJob);
78
+ pushInterval = setInterval(async () => {
79
+ try {
80
+ await pushgatewayClient.push({ instance: process.env.HOSTNAME ?? 'unknown' });
81
+ if (verbose) {
82
+ log('info', 'Pushed metrics to Pushgateway');
83
+ }
84
+ }
85
+ catch (err) {
86
+ log('error', `Failed to push to Pushgateway: ${err}`);
87
+ }
88
+ }, pushgatewayInterval);
89
+ log('info', `Pushgateway client configured for ${pushgatewayUrl}`);
90
+ }
91
+ }
92
+ // Create the processor
93
+ const processor = new ClaudeUsageProcessor(storage, log, {
94
+ verbose,
95
+ flushIntervalMs,
96
+ trackModels: true,
97
+ trackTools: true,
98
+ prometheusMetrics,
99
+ });
100
+ // Initialize OpenTelemetry SDK with our processor
101
+ const sdk = new NodeSDK({
102
+ spanProcessors: [processor],
103
+ });
104
+ sdk.start();
105
+ log('info', 'Claude usage tracking initialized');
106
+ return {
107
+ config: async (config) => {
108
+ if (!config.experimental?.openTelemetry) {
109
+ log('warn', 'OpenTelemetry experimental feature is disabled in OpenCode config - tracking may be limited');
110
+ }
111
+ },
112
+ event: async ({ event }) => {
113
+ // Flush on idle to ensure data is saved
114
+ if (event.type === 'session.idle') {
115
+ log('info', 'Flushing usage data before idle');
116
+ await processor.forceFlush();
117
+ // Push to Pushgateway on idle
118
+ if (pushgatewayClient) {
119
+ try {
120
+ await pushgatewayClient.push({ instance: process.env.HOSTNAME ?? 'unknown' });
121
+ }
122
+ catch (err) {
123
+ log('error', `Failed to push to Pushgateway: ${err}`);
124
+ }
125
+ }
126
+ }
127
+ // Clean shutdown
128
+ if (event.type === 'server.instance.disposed') {
129
+ if (pushInterval) {
130
+ clearInterval(pushInterval);
131
+ }
132
+ if (prometheusServer) {
133
+ await prometheusServer.stop();
134
+ }
135
+ await sdk.shutdown();
136
+ }
137
+ },
138
+ };
139
+ };
140
+ // Default export for easy importing
141
+ export default ClaudeTrackerPlugin;
142
+ /**
143
+ * Utility function to get usage statistics
144
+ * Can be used outside the plugin context
145
+ */
146
+ export async function getUsageStats(storagePath) {
147
+ const storage = new FileStorage(storagePath);
148
+ return storage.getUsageStats();
149
+ }
150
+ /**
151
+ * Utility function to print a usage report to console
152
+ */
153
+ export async function printUsageReport(storagePath) {
154
+ const stats = await getUsageStats(storagePath);
155
+ console.log('\n=== Claude Usage Report ===\n');
156
+ console.log(`Total Sessions: ${stats.totalSessions}`);
157
+ console.log(`Total API Requests: ${stats.totalApiRequests}`);
158
+ console.log(`Total Cost: $${stats.totalCostUsd.toFixed(4)}`);
159
+ console.log('\nToken Usage:');
160
+ console.log(` Input: ${stats.totalTokens.input.toLocaleString()}`);
161
+ console.log(` Output: ${stats.totalTokens.output.toLocaleString()}`);
162
+ console.log(` Cache Read: ${stats.totalTokens.cacheRead.toLocaleString()}`);
163
+ console.log(` Cache Creation: ${stats.totalTokens.cacheCreation.toLocaleString()}`);
164
+ console.log(` Total: ${stats.totalTokens.total.toLocaleString()}`);
165
+ if (stats.byModel.size > 0) {
166
+ console.log('\nBy Model:');
167
+ for (const [model, data] of stats.byModel) {
168
+ console.log(` ${model}: ${data.requests} requests, ${data.tokens.total.toLocaleString()} tokens, $${data.costUsd.toFixed(4)}`);
169
+ }
170
+ }
171
+ if (stats.topTools.length > 0) {
172
+ console.log('\nTop Tools:');
173
+ for (const tool of stats.topTools) {
174
+ const successRate = tool.invocations > 0
175
+ ? ((tool.successCount / tool.invocations) * 100).toFixed(1)
176
+ : '0';
177
+ console.log(` ${tool.name}: ${tool.invocations} calls, ${successRate}% success, avg ${tool.avgDurationMs.toFixed(0)}ms`);
178
+ }
179
+ }
180
+ console.log('\n===========================\n');
181
+ }
182
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { Context } from '@opentelemetry/api';
2
+ import type { SpanProcessor, ReadableSpan, Span } from '@opentelemetry/sdk-trace-base';
3
+ import type { StorageBackend } from './types.js';
4
+ import type { ClaudeMetrics } from './prometheus.js';
5
+ type LogFn = (level: 'info' | 'warn' | 'error', message: string) => void;
6
+ /**
7
+ * Custom span processor for tracking Claude API usage
8
+ */
9
+ export declare class ClaudeUsageProcessor implements SpanProcessor {
10
+ private storage;
11
+ private log;
12
+ private verbose;
13
+ private trackModels;
14
+ private trackTools;
15
+ private currentSession;
16
+ private flushInterval;
17
+ private pendingRequests;
18
+ private prometheusMetrics;
19
+ constructor(storage: StorageBackend, log: LogFn, options?: {
20
+ verbose?: boolean;
21
+ flushIntervalMs?: number;
22
+ trackModels?: boolean;
23
+ trackTools?: boolean;
24
+ prometheusMetrics?: ClaudeMetrics;
25
+ });
26
+ onStart(_span: Span, _parentContext: Context): void;
27
+ onEnd(span: ReadableSpan): void;
28
+ private initSession;
29
+ private processApiRequest;
30
+ private processApiError;
31
+ private processToolResult;
32
+ private processLlmSpan;
33
+ forceFlush(): Promise<void>;
34
+ private flush;
35
+ shutdown(): Promise<void>;
36
+ }
37
+ export {};
38
+ //# sourceMappingURL=processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processor.d.ts","sourceRoot":"","sources":["../src/processor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,+BAA+B,CAAC;AACvF,OAAO,KAAK,EACV,cAAc,EAKf,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,KAAK,KAAK,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AASzE;;GAEG;AACH,qBAAa,oBAAqB,YAAW,aAAa;IACxD,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,GAAG,CAAQ;IACnB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,eAAe,CAA2B;IAClD,OAAO,CAAC,iBAAiB,CAA8B;gBAGrD,OAAO,EAAE,cAAc,EACvB,GAAG,EAAE,KAAK,EACV,OAAO,GAAE;QACP,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,iBAAiB,CAAC,EAAE,aAAa,CAAC;KAC9B;IAkBR,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,GAAG,IAAI;IAInD,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IA6B/B,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,iBAAiB;IAwEzB,OAAO,CAAC,eAAe;IA2BvB,OAAO,CAAC,iBAAiB;IAoCzB,OAAO,CAAC,cAAc;IAoBhB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAInB,KAAK;IAsBb,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAYhC"}