inai-react-components 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.
@@ -0,0 +1,34 @@
1
+ import { type RegistryComponent } from "./status.js";
2
+ export interface AddResult {
3
+ added: boolean;
4
+ message: string;
5
+ files: string[];
6
+ npmDeps: string[];
7
+ internalDeps: string[];
8
+ }
9
+ /**
10
+ * Parse a component spec like "button", "block/auth-login", or "template/admin-dashboard"
11
+ * into its type prefix and name.
12
+ */
13
+ export declare function parseComponentSpec(spec: string): {
14
+ prefix: string | null;
15
+ name: string;
16
+ };
17
+ /**
18
+ * Find a component in the registry, optionally narrowing by type prefix.
19
+ */
20
+ export declare function findInRegistry(registry: {
21
+ components: RegistryComponent[];
22
+ blocks: RegistryComponent[];
23
+ templates: RegistryComponent[];
24
+ }, name: string, prefix: string | null): RegistryComponent | null;
25
+ /**
26
+ * Determine the target directory for a component based on its type and aliases.
27
+ */
28
+ export declare function getTargetDir(component: RegistryComponent, aliases: {
29
+ components: string;
30
+ blocks: string;
31
+ }): string;
32
+ export declare function runAdd(componentSpec: string, rootDir: string): Promise<AddResult>;
33
+ export declare function addCommand(componentSpec?: string): Promise<void>;
34
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAKA,OAAO,EAGL,KAAK,iBAAiB,EAEvB,MAAM,aAAa,CAAC;AAGrB,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG;IAChD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;CACd,CAQA;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE;IAAE,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAAC,SAAS,EAAE,iBAAiB,EAAE,CAAA;CAAE,EAC1G,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GAAG,IAAI,GACpB,iBAAiB,GAAG,IAAI,CAc1B;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,iBAAiB,EAC5B,OAAO,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC9C,MAAM,CAUR;AAED,wBAAsB,MAAM,CAC1B,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,SAAS,CAAC,CAiHpB;AAuBD,wBAAsB,UAAU,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BtE"}
@@ -0,0 +1,284 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import chalk from "chalk";
4
+ import ora from "ora";
5
+ import prompts from "prompts";
6
+ import { readComponentsJson, readRegistryJson, } from "./status.js";
7
+ import { resolveRegistryDir } from "../utils/registry-resolver.js";
8
+ /**
9
+ * Parse a component spec like "button", "block/auth-login", or "template/admin-dashboard"
10
+ * into its type prefix and name.
11
+ */
12
+ export function parseComponentSpec(spec) {
13
+ if (spec.startsWith("block/")) {
14
+ return { prefix: "block", name: spec.slice(6) };
15
+ }
16
+ if (spec.startsWith("template/")) {
17
+ return { prefix: "template", name: spec.slice(9) };
18
+ }
19
+ return { prefix: null, name: spec };
20
+ }
21
+ /**
22
+ * Find a component in the registry, optionally narrowing by type prefix.
23
+ */
24
+ export function findInRegistry(registry, name, prefix) {
25
+ if (prefix === "block") {
26
+ return registry.blocks.find((c) => c.name === name) ?? null;
27
+ }
28
+ if (prefix === "template") {
29
+ return registry.templates.find((c) => c.name === name) ?? null;
30
+ }
31
+ // No prefix: search components first, then blocks, then templates
32
+ const allItems = [
33
+ ...registry.components,
34
+ ...registry.blocks,
35
+ ...registry.templates,
36
+ ];
37
+ return allItems.find((c) => c.name === name) ?? null;
38
+ }
39
+ /**
40
+ * Determine the target directory for a component based on its type and aliases.
41
+ */
42
+ export function getTargetDir(component, aliases) {
43
+ const type = component.type.toLowerCase();
44
+ if (type === "block") {
45
+ return aliases.blocks.replace(/^@\//, "src/");
46
+ }
47
+ if (type === "template") {
48
+ return aliases.blocks.replace(/^@\//, "src/").replace(/blocks$/, "templates");
49
+ }
50
+ // Components, forms, and other types go to the components directory
51
+ return aliases.components.replace(/^@\//, "src/");
52
+ }
53
+ export async function runAdd(componentSpec, rootDir) {
54
+ const componentsJson = readComponentsJson(rootDir);
55
+ if (!componentsJson) {
56
+ return {
57
+ added: false,
58
+ message: "No components.json found. Run `inai-ui init` first to initialize your project.",
59
+ files: [],
60
+ npmDeps: [],
61
+ internalDeps: [],
62
+ };
63
+ }
64
+ const { prefix, name } = parseComponentSpec(componentSpec);
65
+ const registryDir = resolveRegistryDir(rootDir);
66
+ const registryPath = path.join(registryDir, "registry.json");
67
+ const registry = readRegistryJson(registryPath);
68
+ if (!registry) {
69
+ return {
70
+ added: false,
71
+ message: `Registry not found. Ensure your project is initialized correctly.`,
72
+ files: [],
73
+ npmDeps: [],
74
+ internalDeps: [],
75
+ };
76
+ }
77
+ const component = findInRegistry(registry, name, prefix);
78
+ if (!component) {
79
+ const label = prefix ? `${prefix}/${name}` : name;
80
+ return {
81
+ added: false,
82
+ message: `Component "${label}" not found in registry.`,
83
+ files: [],
84
+ npmDeps: [],
85
+ internalDeps: [],
86
+ };
87
+ }
88
+ // Determine target directory
89
+ const targetDir = getTargetDir(component, componentsJson.aliases);
90
+ const copiedFiles = [];
91
+ // Copy component source files
92
+ for (const filePath of component.files) {
93
+ const registryFilePath = path.join(registryDir, filePath);
94
+ const fileName = path.basename(filePath);
95
+ const localFilePath = path.join(rootDir, targetDir, fileName);
96
+ if (!fs.existsSync(registryFilePath)) {
97
+ continue;
98
+ }
99
+ fs.mkdirSync(path.dirname(localFilePath), { recursive: true });
100
+ const content = fs.readFileSync(registryFilePath, "utf-8");
101
+ fs.writeFileSync(localFilePath, content);
102
+ copiedFiles.push(fileName);
103
+ }
104
+ // Resolve and copy internal dependencies
105
+ const copiedInternalDeps = [];
106
+ for (const dep of component.internalDeps) {
107
+ // dep is like "lib/cn" or "lib/animations"
108
+ const depFileName = dep.split("/").pop() + ".ts";
109
+ const depSourcePath = path.join(registryDir, "packages", "ui", "src", dep + ".ts");
110
+ const depTargetPath = path.join(rootDir, "src", "lib", depFileName);
111
+ if (!fs.existsSync(depSourcePath)) {
112
+ continue;
113
+ }
114
+ // Copy even if it already exists (ensure latest version)
115
+ fs.mkdirSync(path.dirname(depTargetPath), { recursive: true });
116
+ const content = fs.readFileSync(depSourcePath, "utf-8");
117
+ fs.writeFileSync(depTargetPath, content);
118
+ copiedInternalDeps.push(dep);
119
+ }
120
+ // Update components.json with installed component entry
121
+ const registryVersion = registry.version;
122
+ const installed = componentsJson.installedComponents ?? [];
123
+ const existingIdx = installed.findIndex((c) => c.name === name);
124
+ const entry = {
125
+ name,
126
+ version: registryVersion,
127
+ installedAt: new Date().toISOString().split("T")[0],
128
+ };
129
+ if (existingIdx >= 0) {
130
+ installed[existingIdx] = entry;
131
+ }
132
+ else {
133
+ installed.push(entry);
134
+ }
135
+ componentsJson.installedComponents = installed;
136
+ const componentsJsonPath = path.join(rootDir, "components.json");
137
+ fs.writeFileSync(componentsJsonPath, JSON.stringify(componentsJson, null, 2) + "\n");
138
+ return {
139
+ added: true,
140
+ message: `Component "${name}" added successfully.`,
141
+ files: copiedFiles,
142
+ npmDeps: component.npmDeps,
143
+ internalDeps: copiedInternalDeps,
144
+ };
145
+ }
146
+ function printAddResult(result) {
147
+ if (result.files.length > 0) {
148
+ console.log(chalk.green("\nCopied files:"));
149
+ for (const file of result.files) {
150
+ console.log(chalk.dim(` - ${file}`));
151
+ }
152
+ }
153
+ if (result.internalDeps.length > 0) {
154
+ console.log(chalk.green("\nInternal dependencies resolved:"));
155
+ for (const dep of result.internalDeps) {
156
+ console.log(chalk.dim(` - ${dep}`));
157
+ }
158
+ }
159
+ if (result.npmDeps.length > 0) {
160
+ console.log(chalk.yellow("\nRequired npm dependencies:"));
161
+ console.log(chalk.cyan(` pnpm add ${result.npmDeps.join(" ")}`));
162
+ }
163
+ }
164
+ export async function addCommand(componentSpec) {
165
+ // If no component specified, show interactive picker
166
+ if (!componentSpec) {
167
+ await interactiveAdd();
168
+ return;
169
+ }
170
+ const spinner = ora(`Adding "${componentSpec}"...`).start();
171
+ try {
172
+ const rootDir = process.cwd();
173
+ const result = await runAdd(componentSpec, rootDir);
174
+ if (!result.added) {
175
+ spinner.fail(result.message);
176
+ process.exit(1);
177
+ }
178
+ spinner.succeed(result.message);
179
+ printAddResult(result);
180
+ }
181
+ catch (error) {
182
+ spinner.fail("Failed to add component.");
183
+ const message = error instanceof Error ? error.message : String(error);
184
+ console.error(chalk.red(`\nError: ${message}`));
185
+ process.exit(1);
186
+ }
187
+ }
188
+ async function interactiveAdd() {
189
+ const rootDir = process.cwd();
190
+ const componentsJson = readComponentsJson(rootDir);
191
+ if (!componentsJson) {
192
+ console.log(chalk.red("No components.json found. Run `inai-ui init` first to initialize your project."));
193
+ process.exit(1);
194
+ }
195
+ const registryDir = resolveRegistryDir(rootDir);
196
+ const registryPath = path.join(registryDir, "registry.json");
197
+ const registry = readRegistryJson(registryPath);
198
+ if (!registry) {
199
+ console.log(chalk.red("Registry not found. Ensure your project is initialized correctly."));
200
+ process.exit(1);
201
+ }
202
+ const allItems = [
203
+ ...registry.components,
204
+ ...registry.blocks,
205
+ ...registry.templates,
206
+ ];
207
+ const installed = componentsJson.installedComponents ?? [];
208
+ const installedNames = new Set(installed.map((c) => c.name));
209
+ // Build choices with status indicator
210
+ const choices = allItems.map((item) => {
211
+ const isInstalled = installedNames.has(item.name);
212
+ const prefix = item.type === "block" ? "block/" : item.type === "template" ? "template/" : "";
213
+ const label = `${prefix}${item.name}`;
214
+ const status = isInstalled ? chalk.green(" [installed]") : "";
215
+ const desc = item.description.length > 50
216
+ ? item.description.slice(0, 47) + "..."
217
+ : item.description;
218
+ return {
219
+ title: `${label}${status}`,
220
+ description: desc,
221
+ value: item.name,
222
+ selected: false,
223
+ };
224
+ });
225
+ console.log(chalk.bold("\nInAI UI - Component Picker\n"));
226
+ console.log(chalk.dim("Select components to add or update. Already installed components will be updated.\n"));
227
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
228
+ const response = await prompts({
229
+ type: "multiselect",
230
+ name: "components",
231
+ message: "Which components would you like to add?",
232
+ choices,
233
+ instructions: false,
234
+ });
235
+ const selectedComponents = response.components;
236
+ if (!selectedComponents || selectedComponents.length === 0) {
237
+ console.log(chalk.yellow("\nNo components selected."));
238
+ return;
239
+ }
240
+ const selected = selectedComponents;
241
+ const allNpmDeps = new Set();
242
+ let addedCount = 0;
243
+ let updatedCount = 0;
244
+ for (const name of selected) {
245
+ const isInstalled = installedNames.has(name);
246
+ const action = isInstalled ? "Updating" : "Adding";
247
+ const spinner = ora(`${action} "${name}"...`).start();
248
+ try {
249
+ const result = await runAdd(name, rootDir);
250
+ if (!result.added) {
251
+ spinner.fail(result.message);
252
+ continue;
253
+ }
254
+ if (isInstalled) {
255
+ spinner.succeed(`Updated "${name}"`);
256
+ updatedCount++;
257
+ }
258
+ else {
259
+ spinner.succeed(`Added "${name}"`);
260
+ addedCount++;
261
+ }
262
+ for (const dep of result.npmDeps) {
263
+ allNpmDeps.add(dep);
264
+ }
265
+ }
266
+ catch (error) {
267
+ spinner.fail(`Failed to process "${name}"`);
268
+ const message = error instanceof Error ? error.message : String(error);
269
+ console.error(chalk.red(` Error: ${message}`));
270
+ }
271
+ }
272
+ // Summary
273
+ console.log(chalk.bold("\nSummary:"));
274
+ if (addedCount > 0) {
275
+ console.log(chalk.green(` ${addedCount} component${addedCount > 1 ? "s" : ""} added`));
276
+ }
277
+ if (updatedCount > 0) {
278
+ console.log(chalk.blue(` ${updatedCount} component${updatedCount > 1 ? "s" : ""} updated`));
279
+ }
280
+ if (allNpmDeps.size > 0) {
281
+ console.log(chalk.yellow("\nInstall required npm dependencies:"));
282
+ console.log(chalk.cyan(` pnpm add ${[...allNpmDeps].join(" ")}`));
283
+ }
284
+ }
@@ -0,0 +1,6 @@
1
+ import { type RegistryComponent } from "./status.js";
2
+ export declare function computeDiff(localContent: string, registryContent: string): string;
3
+ export declare function findComponentInRegistry(registryPath: string, componentName: string): RegistryComponent | null;
4
+ export declare function runDiff(componentName: string, rootDir: string): Promise<string>;
5
+ export declare function diffCommand(componentName: string): Promise<void>;
6
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,aAAa,CAAC;AAGrB,wBAAgB,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,CA+BjF;AAED,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,GACpB,iBAAiB,GAAG,IAAI,CAW1B;AAED,wBAAsB,OAAO,CAC3B,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAgEjB;AAED,wBAAsB,WAAW,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CActE"}
@@ -0,0 +1,100 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import chalk from "chalk";
4
+ import ora from "ora";
5
+ import { readComponentsJson, readRegistryJson, } from "./status.js";
6
+ import { resolveRegistryDir } from "../utils/registry-resolver.js";
7
+ export function computeDiff(localContent, registryContent) {
8
+ const localLines = localContent.split("\n");
9
+ const registryLines = registryContent.split("\n");
10
+ const output = [];
11
+ const maxLen = Math.max(localLines.length, registryLines.length);
12
+ let hasChanges = false;
13
+ for (let i = 0; i < maxLen; i++) {
14
+ const localLine = localLines[i];
15
+ const registryLine = registryLines[i];
16
+ if (localLine === registryLine) {
17
+ output.push(chalk.dim(` ${localLine ?? ""}`));
18
+ }
19
+ else {
20
+ hasChanges = true;
21
+ if (registryLine !== undefined) {
22
+ output.push(chalk.red(`- ${registryLine}`));
23
+ }
24
+ if (localLine !== undefined) {
25
+ output.push(chalk.green(`+ ${localLine}`));
26
+ }
27
+ }
28
+ }
29
+ if (!hasChanges) {
30
+ return chalk.green("No differences found. Component is up to date.");
31
+ }
32
+ return output.join("\n");
33
+ }
34
+ export function findComponentInRegistry(registryPath, componentName) {
35
+ const registry = readRegistryJson(registryPath);
36
+ if (!registry)
37
+ return null;
38
+ const allItems = [
39
+ ...registry.components,
40
+ ...registry.blocks,
41
+ ...registry.templates,
42
+ ];
43
+ return allItems.find((c) => c.name === componentName) ?? null;
44
+ }
45
+ export async function runDiff(componentName, rootDir) {
46
+ const componentsJson = readComponentsJson(rootDir);
47
+ if (!componentsJson) {
48
+ return chalk.red("No components.json found. Run `inai-ui init` first to initialize your project.");
49
+ }
50
+ const registryDir = resolveRegistryDir(rootDir);
51
+ const registryPath = path.join(registryDir, "registry.json");
52
+ const registryComponent = findComponentInRegistry(registryPath, componentName);
53
+ if (!registryComponent) {
54
+ return chalk.red(`Component "${componentName}" not found in registry.`);
55
+ }
56
+ if (registryComponent.files.length === 0) {
57
+ return chalk.yellow(`Component "${componentName}" has no files in the registry.`);
58
+ }
59
+ const results = [];
60
+ for (const filePath of registryComponent.files) {
61
+ const registryFilePath = path.join(registryDir, filePath);
62
+ const localComponentDir = componentsJson.aliases.components.replace(/^@\//, "src/");
63
+ const fileName = path.basename(filePath);
64
+ const localFilePath = path.join(rootDir, localComponentDir, fileName);
65
+ results.push(chalk.bold(`\nDiff for ${fileName}:`));
66
+ results.push(chalk.dim("─".repeat(60)));
67
+ if (!fs.existsSync(registryFilePath)) {
68
+ results.push(chalk.yellow(`Registry source file not found: ${filePath}`));
69
+ continue;
70
+ }
71
+ const registryContent = fs.readFileSync(registryFilePath, "utf-8");
72
+ if (!fs.existsSync(localFilePath)) {
73
+ results.push(chalk.yellow(`Local file not found at ${localComponentDir}/${fileName}. Component may not be installed.`));
74
+ // Show what registry has as all additions
75
+ const lines = registryContent.split("\n");
76
+ for (const line of lines) {
77
+ results.push(chalk.green(`+ ${line}`));
78
+ }
79
+ continue;
80
+ }
81
+ const localContent = fs.readFileSync(localFilePath, "utf-8");
82
+ results.push(computeDiff(localContent, registryContent));
83
+ }
84
+ return results.join("\n");
85
+ }
86
+ export async function diffCommand(componentName) {
87
+ const spinner = ora(`Comparing "${componentName}" with registry...`).start();
88
+ try {
89
+ const rootDir = process.cwd();
90
+ const output = await runDiff(componentName, rootDir);
91
+ spinner.stop();
92
+ console.log(output);
93
+ }
94
+ catch (error) {
95
+ spinner.fail("Failed to compute diff.");
96
+ const message = error instanceof Error ? error.message : String(error);
97
+ console.error(chalk.red(`\nError: ${message}`));
98
+ process.exit(1);
99
+ }
100
+ }
@@ -0,0 +1,46 @@
1
+ declare const AVAILABLE_THEMES: readonly ["monday", "linear", "notion", "vercel"];
2
+ type Theme = (typeof AVAILABLE_THEMES)[number];
3
+ export interface InitConfig {
4
+ componentPath: string;
5
+ blockPath: string;
6
+ theme: Theme;
7
+ importAlias: string;
8
+ utilsAlias: string;
9
+ tanstackRouter: boolean;
10
+ tanstackQuery: boolean;
11
+ tanstackForm: boolean;
12
+ tanstackTable: boolean;
13
+ }
14
+ export interface ComponentsJson {
15
+ $schema: string;
16
+ registrySource?: string;
17
+ style: string;
18
+ tailwind: {
19
+ config: string;
20
+ css: string;
21
+ };
22
+ aliases: {
23
+ components: string;
24
+ blocks: string;
25
+ utils: string;
26
+ };
27
+ theme: Theme;
28
+ tanstack: {
29
+ router: boolean;
30
+ query: boolean;
31
+ form: boolean;
32
+ table: boolean;
33
+ };
34
+ }
35
+ export declare function promptInitConfig(): Promise<InitConfig | null>;
36
+ export declare function buildComponentsJson(config: InitConfig, repoUrl?: string): ComponentsJson;
37
+ export declare function getCnTemplate(): string;
38
+ export declare function getLocalTailwindCssTemplate(theme: Theme): string;
39
+ export declare function getLegacyTailwindCssTemplate(theme: Theme): string;
40
+ export declare function runInit(config: InitConfig, targetDir: string, repoUrl?: string): Promise<{
41
+ success: boolean;
42
+ filesCreated: string[];
43
+ }>;
44
+ export declare function initCommand(repoUrl?: string): Promise<void>;
45
+ export {};
46
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAOA,QAAA,MAAM,gBAAgB,mDAAoD,CAAC;AAC3E,KAAK,KAAK,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE/C,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE;QACR,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,OAAO,EAAE;QACP,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE;QACR,MAAM,EAAE,OAAO,CAAC;QAChB,KAAK,EAAE,OAAO,CAAC;QACf,IAAI,EAAE,OAAO,CAAC;QACd,KAAK,EAAE,OAAO,CAAC;KAChB,CAAC;CACH;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAuEnE;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,UAAU,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,cAAc,CA6BhB;AAED,wBAAgB,aAAa,IAAI,MAAM,CAQtC;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAOhE;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAOjE;AA2ED,wBAAsB,OAAO,CAC3B,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA4CvD;AAED,wBAAsB,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyDjE"}