create-dev-to 1.0.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.
@@ -0,0 +1,252 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { execSync } from 'node:child_process';
4
+ import { InstallRenderer } from './visualComponents.js';
5
+ import { createParser } from './outputParsers.js';
6
+ export class InstallLogger {
7
+ packageManager;
8
+ parser;
9
+ renderer;
10
+ stats;
11
+ phases;
12
+ renderScheduled = false;
13
+ lastRenderTime = 0;
14
+ RENDER_INTERVAL = 50;
15
+ smoothProgressTimer = null;
16
+ constructor(packageManager) {
17
+ this.packageManager = packageManager;
18
+ this.parser = createParser(packageManager);
19
+ this.renderer = new InstallRenderer();
20
+ this.stats = {
21
+ packagesAdded: 0,
22
+ packagesUpdated: 0,
23
+ packagesRemoved: 0,
24
+ packagesTotal: 0,
25
+ downloadSpeed: 0,
26
+ downloadedBytes: 0,
27
+ nodeModulesSize: 0,
28
+ warnings: [],
29
+ };
30
+ this.phases = [
31
+ { name: 'resolving', progress: 0, active: true },
32
+ { name: 'downloading', progress: 0, active: false },
33
+ { name: 'installing', progress: 0, active: false },
34
+ ];
35
+ }
36
+ start() {
37
+ this.stats.startTime = performance.now();
38
+ this.render();
39
+ this.startSmoothProgress();
40
+ }
41
+ processLine(line, stream) {
42
+ if (!line || line.trim() === '')
43
+ return;
44
+ try {
45
+ const parsed = this.parser.parse(line, stream);
46
+ this.handleParsedOutput(parsed);
47
+ this.scheduleRender();
48
+ }
49
+ catch (error) {
50
+ if (process.env.DEBUG) {
51
+ console.error('Parse error:', error);
52
+ }
53
+ }
54
+ }
55
+ async finish(projectDir) {
56
+ // Stop smooth progress updates
57
+ this.stopSmoothProgress();
58
+ this.stats.endTime = performance.now();
59
+ this.stats.duration = this.stats.endTime - (this.stats.startTime || 0);
60
+ this.updatePhase('installing', 100);
61
+ this.render();
62
+ this.renderer.clear();
63
+ try {
64
+ this.stats.nodeModulesSize = await this.calculateNodeModulesSize(projectDir);
65
+ }
66
+ catch {
67
+ this.stats.nodeModulesSize = 0;
68
+ }
69
+ return this.stats;
70
+ }
71
+ error() {
72
+ this.stopSmoothProgress();
73
+ this.renderer.clear();
74
+ }
75
+ startSmoothProgress() {
76
+ // Update progress smoothly even without output updates
77
+ this.smoothProgressTimer = setInterval(() => {
78
+ const activePhase = this.phases.find(p => p.active);
79
+ if (activePhase && activePhase.progress < 95) {
80
+ // Gradually increase progress with diminishing speed
81
+ const increment = Math.max(0.5, (95 - activePhase.progress) / 20);
82
+ activePhase.progress = Math.min(95, activePhase.progress + increment);
83
+ this.render();
84
+ }
85
+ }, 200);
86
+ }
87
+ stopSmoothProgress() {
88
+ if (this.smoothProgressTimer) {
89
+ clearInterval(this.smoothProgressTimer);
90
+ this.smoothProgressTimer = null;
91
+ }
92
+ }
93
+ handleParsedOutput(parsed) {
94
+ switch (parsed.type) {
95
+ case 'phase_change':
96
+ if (parsed.phase) {
97
+ this.activatePhase(parsed.phase);
98
+ }
99
+ break;
100
+ case 'progress':
101
+ if (parsed.phase && parsed.progress !== undefined) {
102
+ this.updatePhase(parsed.phase, parsed.progress);
103
+ }
104
+ break;
105
+ case 'package_info':
106
+ if (parsed.packageCount !== undefined) {
107
+ this.stats.packagesAdded = parsed.packageCount;
108
+ }
109
+ break;
110
+ case 'warning':
111
+ if (parsed.message) {
112
+ this.stats.warnings = this.stats.warnings || [];
113
+ this.stats.warnings.push(parsed.message);
114
+ }
115
+ break;
116
+ case 'error':
117
+ break;
118
+ case 'ignore':
119
+ break;
120
+ }
121
+ }
122
+ activatePhase(phaseName) {
123
+ const phase = this.phases.find(p => p.name === phaseName);
124
+ if (phase) {
125
+ // Don't reactivate if already completed
126
+ if (phase.progress >= 100) {
127
+ return;
128
+ }
129
+ // Deactivate all phases first
130
+ this.phases.forEach(p => (p.active = false));
131
+ phase.active = true;
132
+ // Set initial progress if starting fresh
133
+ if (phase.progress === 0) {
134
+ phase.progress = 1;
135
+ }
136
+ // When activating a phase, complete previous phases
137
+ const phaseIndex = this.phases.findIndex(p => p.name === phaseName);
138
+ for (let i = 0; i < phaseIndex; i++) {
139
+ const prevPhase = this.phases[i];
140
+ if (prevPhase.progress < 100) {
141
+ prevPhase.progress = 100;
142
+ }
143
+ prevPhase.active = false;
144
+ }
145
+ }
146
+ }
147
+ updatePhase(phaseName, progress) {
148
+ const phase = this.phases.find(p => p.name === phaseName);
149
+ if (phase) {
150
+ phase.progress = Math.max(phase.progress, Math.min(100, progress));
151
+ // When a phase is updated, complete all previous phases
152
+ const phaseIndex = this.phases.findIndex(p => p.name === phaseName);
153
+ for (let i = 0; i < phaseIndex; i++) {
154
+ if (this.phases[i].progress < 100) {
155
+ this.phases[i].progress = 100;
156
+ this.phases[i].active = false;
157
+ }
158
+ }
159
+ // Only mark current phase as active if not already completed
160
+ if (phase.progress < 100) {
161
+ phase.active = true;
162
+ }
163
+ // When a phase reaches 100%, mark it as complete and activate next
164
+ if (progress >= 100) {
165
+ phase.active = false;
166
+ if (phaseIndex < this.phases.length - 1) {
167
+ // Only activate next phase if current one is complete
168
+ const nextPhase = this.phases[phaseIndex + 1];
169
+ if (nextPhase && nextPhase.progress === 0) {
170
+ nextPhase.active = true;
171
+ nextPhase.progress = 1; // Start with small progress
172
+ }
173
+ }
174
+ }
175
+ }
176
+ }
177
+ scheduleRender() {
178
+ if (this.renderScheduled)
179
+ return;
180
+ const now = performance.now();
181
+ const timeSinceLastRender = now - this.lastRenderTime;
182
+ if (timeSinceLastRender >= this.RENDER_INTERVAL) {
183
+ this.render();
184
+ this.lastRenderTime = now;
185
+ }
186
+ else {
187
+ this.renderScheduled = true;
188
+ setTimeout(() => {
189
+ this.render();
190
+ this.renderScheduled = false;
191
+ this.lastRenderTime = performance.now();
192
+ }, this.RENDER_INTERVAL - timeSinceLastRender);
193
+ }
194
+ }
195
+ render() {
196
+ try {
197
+ this.renderer.render(this.phases, this.stats);
198
+ }
199
+ catch (error) {
200
+ if (process.env.DEBUG) {
201
+ console.error('Render error:', error);
202
+ }
203
+ }
204
+ }
205
+ async calculateNodeModulesSize(projectDir) {
206
+ const nodeModulesPath = path.join(projectDir, 'node_modules');
207
+ if (!fs.existsSync(nodeModulesPath)) {
208
+ return 0;
209
+ }
210
+ if (process.platform !== 'win32') {
211
+ try {
212
+ const result = execSync(`du -sk "${nodeModulesPath}"`, {
213
+ encoding: 'utf-8',
214
+ stdio: ['ignore', 'pipe', 'ignore'],
215
+ });
216
+ const sizeKB = parseInt(result.split('\t')[0]);
217
+ return sizeKB * 1024;
218
+ }
219
+ catch {
220
+ // Fall through to recursive method
221
+ }
222
+ }
223
+ return this.getDirectorySize(nodeModulesPath);
224
+ }
225
+ getDirectorySize(dir) {
226
+ let size = 0;
227
+ try {
228
+ const files = fs.readdirSync(dir, { withFileTypes: true });
229
+ for (const file of files) {
230
+ const filePath = path.join(dir, file.name);
231
+ try {
232
+ if (file.isDirectory()) {
233
+ size += this.getDirectorySize(filePath);
234
+ }
235
+ else {
236
+ const stats = fs.statSync(filePath);
237
+ size += stats.size;
238
+ }
239
+ }
240
+ catch {
241
+ // Skip files we can't access
242
+ continue;
243
+ }
244
+ }
245
+ }
246
+ catch {
247
+ // Skip directories we can't access
248
+ }
249
+ return size;
250
+ }
251
+ }
252
+ //# sourceMappingURL=installLogger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installLogger.js","sourceRoot":"","sources":["../src/installLogger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export interface ParsedOutput {
2
+ type: 'phase_change' | 'progress' | 'package_info' | 'warning' | 'error' | 'ignore';
3
+ phase?: string;
4
+ progress?: number;
5
+ packageCount?: number;
6
+ downloadedBytes?: number;
7
+ message?: string;
8
+ }
9
+ export declare abstract class OutputParser {
10
+ abstract parse(line: string, stream: 'stdout' | 'stderr'): ParsedOutput;
11
+ }
12
+ export declare class PnpmParser extends OutputParser {
13
+ private totalPackages;
14
+ private maxResolved;
15
+ private lastPhase;
16
+ parse(line: string, stream: 'stdout' | 'stderr'): ParsedOutput;
17
+ }
18
+ export declare class NpmParser extends OutputParser {
19
+ private isInstalling;
20
+ parse(line: string, stream: 'stdout' | 'stderr'): ParsedOutput;
21
+ }
22
+ export declare class YarnParser extends OutputParser {
23
+ parse(line: string, stream: 'stdout' | 'stderr'): ParsedOutput;
24
+ }
25
+ export declare class BunParser extends OutputParser {
26
+ parse(line: string, stream: 'stdout' | 'stderr'): ParsedOutput;
27
+ }
28
+ export declare function createParser(pm: 'pnpm' | 'npm' | 'yarn' | 'bun'): OutputParser;
29
+ //# sourceMappingURL=outputParsers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outputParsers.d.ts","sourceRoot":"","sources":["../src/outputParsers.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,cAAc,GAAG,UAAU,GAAG,cAAc,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAA;IACnF,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,8BAAsB,YAAY;IAChC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,YAAY;CACxE;AAED,qBAAa,UAAW,SAAQ,YAAY;IAC1C,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,WAAW,CAAY;IAC/B,OAAO,CAAC,SAAS,CAAsB;IAEvC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,YAAY;CAsG/D;AAED,qBAAa,SAAU,SAAQ,YAAY;IACzC,OAAO,CAAC,YAAY,CAAiB;IAErC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,YAAY;CA0D/D;AAED,qBAAa,UAAW,SAAQ,YAAY;IAC1C,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,YAAY;CA2D/D;AAED,qBAAa,SAAU,SAAQ,YAAY;IACzC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,YAAY;CA0C/D;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,YAAY,CAa9E"}
@@ -0,0 +1,259 @@
1
+ export class OutputParser {
2
+ }
3
+ export class PnpmParser extends OutputParser {
4
+ totalPackages = 0;
5
+ maxResolved = 0;
6
+ lastPhase = 'resolving';
7
+ parse(line, stream) {
8
+ // Detect resolving phase start
9
+ if (line.includes('Lockfile is up to date') || line.includes('Already up to date')) {
10
+ return {
11
+ type: 'progress',
12
+ phase: 'installing',
13
+ progress: 100,
14
+ packageCount: 0,
15
+ };
16
+ }
17
+ // Parse progress line: "Progress: resolved 245, reused 180, downloaded 65, added 0"
18
+ const progressMatch = line.match(/Progress: resolved (\d+)(?:, reused (\d+))?(?:, downloaded (\d+))?(?:, added (\d+))?/);
19
+ if (progressMatch) {
20
+ const resolved = parseInt(progressMatch[1]);
21
+ const reused = parseInt(progressMatch[2] || '0');
22
+ const downloaded = parseInt(progressMatch[3] || '0');
23
+ const added = parseInt(progressMatch[4] || '0');
24
+ // Track max resolved as estimated total
25
+ this.maxResolved = Math.max(this.maxResolved, resolved);
26
+ // Determine phase and progress based on the numbers
27
+ // When added === resolved, installation is complete
28
+ if (added > 0 && added >= resolved) {
29
+ this.lastPhase = 'installing';
30
+ return {
31
+ type: 'progress',
32
+ phase: 'installing',
33
+ packageCount: added,
34
+ progress: 100,
35
+ };
36
+ }
37
+ // When we have added > 0 but not all, we're installing
38
+ else if (added > 0) {
39
+ this.lastPhase = 'installing';
40
+ const installProgress = Math.min(99, Math.max(10, (added / resolved) * 100));
41
+ return {
42
+ type: 'progress',
43
+ phase: 'installing',
44
+ progress: installProgress,
45
+ };
46
+ }
47
+ // When downloaded > 0, we're in downloading phase
48
+ else if (downloaded > 0 || reused > 0) {
49
+ const total = downloaded + reused;
50
+ if (this.lastPhase !== 'downloading') {
51
+ this.lastPhase = 'downloading';
52
+ }
53
+ const downloadProgress = Math.min(99, Math.max(10, (total / resolved) * 100));
54
+ return {
55
+ type: 'progress',
56
+ phase: 'downloading',
57
+ progress: downloadProgress,
58
+ };
59
+ }
60
+ // Otherwise, we're still resolving
61
+ else if (resolved > 0) {
62
+ if (this.lastPhase !== 'resolving') {
63
+ this.lastPhase = 'resolving';
64
+ }
65
+ // Use a dynamic progress that gradually increases
66
+ const resolveProgress = Math.min(95, Math.max(10, (resolved / Math.max(this.maxResolved, 200)) * 100));
67
+ return {
68
+ type: 'progress',
69
+ phase: 'resolving',
70
+ progress: resolveProgress,
71
+ };
72
+ }
73
+ }
74
+ // Parse package info from summary: "Packages: +245"
75
+ const packagesMatch = line.match(/Packages:\s*\+(\d+)/);
76
+ if (packagesMatch) {
77
+ const count = parseInt(packagesMatch[1]);
78
+ this.totalPackages = count;
79
+ return {
80
+ type: 'package_info',
81
+ packageCount: count,
82
+ };
83
+ }
84
+ // Detect warnings
85
+ if (line.includes('warn') && stream === 'stderr') {
86
+ return {
87
+ type: 'warning',
88
+ message: line,
89
+ };
90
+ }
91
+ // Detect errors
92
+ if ((line.includes('error') || line.includes('Error')) && stream === 'stderr') {
93
+ return {
94
+ type: 'error',
95
+ message: line,
96
+ };
97
+ }
98
+ return { type: 'ignore' };
99
+ }
100
+ }
101
+ export class NpmParser extends OutputParser {
102
+ isInstalling = false;
103
+ parse(line, stream) {
104
+ // Parse completion line: "added 245 packages, and audited 246 packages in 10s"
105
+ const completionMatch = line.match(/added (\d+) packages?(?:, (?:and|)?(?:audited|updated) (\d+) packages)?/);
106
+ if (completionMatch) {
107
+ this.isInstalling = true;
108
+ return {
109
+ type: 'progress',
110
+ packageCount: parseInt(completionMatch[1]),
111
+ progress: 100,
112
+ phase: 'installing',
113
+ };
114
+ }
115
+ // Parse up to date: "up to date, audited 245 packages in 0.5s"
116
+ if (line.includes('up to date')) {
117
+ this.isInstalling = true;
118
+ return {
119
+ type: 'progress',
120
+ packageCount: 0,
121
+ progress: 100,
122
+ phase: 'installing',
123
+ };
124
+ }
125
+ // Parse npm output with progress (some versions show this)
126
+ const progressMatch = line.match(/\|(.+?)\|/);
127
+ if (progressMatch) {
128
+ const progress = (progressMatch[1].length / 50) * 100;
129
+ return {
130
+ type: 'progress',
131
+ progress: Math.min(95, Math.max(1, progress)),
132
+ phase: 'downloading',
133
+ };
134
+ }
135
+ // Detect vulnerabilities warnings
136
+ if (line.includes('vulnerabilities') || line.includes('vulnerability')) {
137
+ return {
138
+ type: 'warning',
139
+ message: line,
140
+ };
141
+ }
142
+ // Detect errors
143
+ if (line.includes('ERR!')
144
+ || (line.includes('error') && stream === 'stderr')) {
145
+ return {
146
+ type: 'error',
147
+ message: line,
148
+ };
149
+ }
150
+ return { type: 'ignore' };
151
+ }
152
+ }
153
+ export class YarnParser extends OutputParser {
154
+ parse(line, stream) {
155
+ // Parse phase indicators: "[1/4] Resolving packages..."
156
+ const phaseMatch = line.match(/\[(\d+)\/4\]\s+(.+?)\.{3}/);
157
+ if (phaseMatch) {
158
+ const stepNum = parseInt(phaseMatch[1]);
159
+ const phaseNames = [
160
+ 'resolving',
161
+ 'fetching',
162
+ 'linking',
163
+ 'building',
164
+ ];
165
+ const phase = phaseNames[stepNum - 1] || 'resolving';
166
+ // Map fetching to downloading
167
+ const mappedPhase = phase === 'fetching' ? 'downloading' : phase;
168
+ return {
169
+ type: 'phase_change',
170
+ phase: mappedPhase,
171
+ };
172
+ }
173
+ // Parse success line: "Done in 8.50s"
174
+ const successMatch = line.match(/Done in ([\d.]+)s/);
175
+ if (successMatch) {
176
+ return {
177
+ type: 'progress',
178
+ progress: 100,
179
+ phase: 'installing',
180
+ };
181
+ }
182
+ // Parse package added/removed: "Yarn added 245 packages"
183
+ const addedMatch = line.match(/(?:Yarn )?added (\d+) packages?/);
184
+ if (addedMatch) {
185
+ return {
186
+ type: 'package_info',
187
+ packageCount: parseInt(addedMatch[1]),
188
+ };
189
+ }
190
+ // Detect warnings
191
+ if (line.includes('warning') && stream === 'stderr') {
192
+ return {
193
+ type: 'warning',
194
+ message: line,
195
+ };
196
+ }
197
+ // Detect errors
198
+ if (line.includes('error') && stream === 'stderr') {
199
+ return {
200
+ type: 'error',
201
+ message: line,
202
+ };
203
+ }
204
+ return { type: 'ignore' };
205
+ }
206
+ }
207
+ export class BunParser extends OutputParser {
208
+ parse(line, stream) {
209
+ // Parse completion: "+ 245 packages installed [1.23s]"
210
+ const completionMatch = line.match(/^\s*\+\s*(\d+)\s+packages installed\s*\[([\d.]+)s\]/);
211
+ if (completionMatch) {
212
+ return {
213
+ type: 'progress',
214
+ packageCount: parseInt(completionMatch[1]),
215
+ progress: 100,
216
+ phase: 'installing',
217
+ };
218
+ }
219
+ // Parse already installed: "0 packages installed"
220
+ const alreadyMatch = line.match(/^\s*(\d+)\s+packages already installed/);
221
+ if (alreadyMatch) {
222
+ return {
223
+ type: 'progress',
224
+ packageCount: 0,
225
+ progress: 100,
226
+ phase: 'installing',
227
+ };
228
+ }
229
+ // Detect download progress (bun shows detailed output)
230
+ if (line.includes('Downloading') || line.includes('downloading')) {
231
+ return { type: 'phase_change', phase: 'downloading' };
232
+ }
233
+ // Detect errors
234
+ if (line.includes('error')
235
+ || line.includes('Error')
236
+ || (line.includes('failed') && stream === 'stderr')) {
237
+ return {
238
+ type: 'error',
239
+ message: line,
240
+ };
241
+ }
242
+ return { type: 'ignore' };
243
+ }
244
+ }
245
+ export function createParser(pm) {
246
+ switch (pm) {
247
+ case 'pnpm':
248
+ return new PnpmParser();
249
+ case 'npm':
250
+ return new NpmParser();
251
+ case 'yarn':
252
+ return new YarnParser();
253
+ case 'bun':
254
+ return new BunParser();
255
+ default:
256
+ return new NpmParser(); // fallback
257
+ }
258
+ }
259
+ //# sourceMappingURL=outputParsers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outputParsers.js","sourceRoot":"","sources":["../src/outputParsers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ export interface InstallPhase {
2
+ name: 'resolving' | 'downloading' | 'installing' | 'building';
3
+ progress: number;
4
+ current?: number;
5
+ total?: number;
6
+ active: boolean;
7
+ }
8
+ export interface InstallStats {
9
+ startTime: number;
10
+ endTime: number;
11
+ duration: number;
12
+ packagesAdded: number;
13
+ packagesUpdated: number;
14
+ packagesRemoved: number;
15
+ packagesTotal: number;
16
+ downloadSpeed: number;
17
+ downloadedBytes: number;
18
+ nodeModulesSize: number;
19
+ warnings: string[];
20
+ }
21
+ export declare class InstallRenderer {
22
+ private isTTY;
23
+ private supportsColor;
24
+ private lineCount;
25
+ constructor();
26
+ render(phases: InstallPhase[], stats: Partial<InstallStats>): void;
27
+ private buildEnhancedUI;
28
+ private getPhaseLabel;
29
+ private buildStatsLine;
30
+ private updateTerminal;
31
+ private renderSimple;
32
+ clear(): void;
33
+ }
34
+ export declare function displayInstallSummary(stats: InstallStats): void;
35
+ //# sourceMappingURL=visualComponents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visualComponents.d.ts","sourceRoot":"","sources":["../src/visualComponents.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,WAAW,GAAG,aAAa,GAAG,YAAY,GAAG,UAAU,CAAA;IAC7D,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;IACrB,eAAe,EAAE,MAAM,CAAA;IACvB,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,EAAE,MAAM,CAAA;IACrB,aAAa,EAAE,MAAM,CAAA;IACrB,eAAe,EAAE,MAAM,CAAA;IACvB,eAAe,EAAE,MAAM,CAAA;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAsJD,qBAAa,eAAe;IAC1B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,SAAS,CAAY;;IAO7B,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI;IAUlE,OAAO,CAAC,eAAe;IA4CvB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,cAAc;IAyBtB,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,YAAY;IAUpB,KAAK,IAAI,IAAI;CAQd;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAoC/D"}