create-fhevm-example 1.0.1

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/index.js ADDED
@@ -0,0 +1,483 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * create-fhevm-example - CLI for creating FHEVM example projects
4
+ *
5
+ * Usage:
6
+ * npx create-fhevm-example
7
+ * npx create-fhevm-example --example fhe-counter
8
+ * npx create-fhevm-example --category basic
9
+ */
10
+ import * as p from "@clack/prompts";
11
+ import pc from "picocolors";
12
+ import * as fs from "fs";
13
+ import * as path from "path";
14
+ import * as os from "os";
15
+ import { EXAMPLES, CATEGORIES } from "./config.js";
16
+ import { cloneTemplate, initSubmodule, copyDirectoryRecursive, getContractName, downloadFileFromGitHub, runCommand, extractTestResults, generateExampleReadme, generateCategoryReadme, generateDeployScript, } from "./utils.js";
17
+ // =============================================================================
18
+ // Create Single Example
19
+ // =============================================================================
20
+ async function createSingleExample(exampleName, outputDir, tempRepoPath) {
21
+ const example = EXAMPLES[exampleName];
22
+ if (!example) {
23
+ throw new Error(`Unknown example: ${exampleName}`);
24
+ }
25
+ const templateDir = path.join(tempRepoPath, "fhevm-hardhat-template");
26
+ // Copy template
27
+ copyDirectoryRecursive(templateDir, outputDir);
28
+ // Get contract name
29
+ const contractName = getContractName(example.contract);
30
+ if (!contractName) {
31
+ throw new Error("Could not extract contract name");
32
+ }
33
+ // Remove template contract
34
+ const templateContract = path.join(outputDir, "contracts", "FHECounter.sol");
35
+ if (fs.existsSync(templateContract)) {
36
+ fs.unlinkSync(templateContract);
37
+ }
38
+ // Download contract and test from GitHub
39
+ await downloadFileFromGitHub(example.contract, path.join(outputDir, "contracts", `${contractName}.sol`));
40
+ // Remove .gitkeep from contracts
41
+ const contractsGitkeep = path.join(outputDir, "contracts", ".gitkeep");
42
+ if (fs.existsSync(contractsGitkeep)) {
43
+ fs.unlinkSync(contractsGitkeep);
44
+ }
45
+ // Clear test directory
46
+ const testDir = path.join(outputDir, "test");
47
+ fs.readdirSync(testDir).forEach((file) => {
48
+ if (file.endsWith(".ts") || file === ".gitkeep") {
49
+ fs.unlinkSync(path.join(testDir, file));
50
+ }
51
+ });
52
+ // Download test file
53
+ await downloadFileFromGitHub(example.test, path.join(outputDir, "test", path.basename(example.test)));
54
+ // Update deploy script
55
+ fs.writeFileSync(path.join(outputDir, "deploy", "deploy.ts"), generateDeployScript(contractName));
56
+ // Update package.json
57
+ const packageJsonPath = path.join(outputDir, "package.json");
58
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
59
+ packageJson.name = `fhevm-example-${exampleName}`;
60
+ packageJson.description = example.description;
61
+ fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
62
+ // Update hardhat.config.ts - remove FHECounter task import
63
+ const configPath = path.join(outputDir, "hardhat.config.ts");
64
+ let configContent = fs.readFileSync(configPath, "utf-8");
65
+ configContent = configContent.replace(/import "\.\/tasks\/FHECounter";\n?/g, "");
66
+ fs.writeFileSync(configPath, configContent);
67
+ // Remove FHECounter task
68
+ const oldTaskFile = path.join(outputDir, "tasks", "FHECounter.ts");
69
+ if (fs.existsSync(oldTaskFile)) {
70
+ fs.unlinkSync(oldTaskFile);
71
+ }
72
+ // Generate README
73
+ fs.writeFileSync(path.join(outputDir, "README.md"), generateExampleReadme(exampleName, example.description, contractName));
74
+ }
75
+ // =============================================================================
76
+ // Create Category Project
77
+ // =============================================================================
78
+ async function createCategoryProject(categoryName, outputDir, tempRepoPath) {
79
+ const category = CATEGORIES[categoryName];
80
+ if (!category) {
81
+ throw new Error(`Unknown category: ${categoryName}`);
82
+ }
83
+ const templateDir = path.join(tempRepoPath, "fhevm-hardhat-template");
84
+ // Copy template
85
+ copyDirectoryRecursive(templateDir, outputDir);
86
+ // Clear template files
87
+ const templateContract = path.join(outputDir, "contracts", "FHECounter.sol");
88
+ if (fs.existsSync(templateContract))
89
+ fs.unlinkSync(templateContract);
90
+ // Remove .gitkeep from contracts
91
+ const contractsGitkeep = path.join(outputDir, "contracts", ".gitkeep");
92
+ if (fs.existsSync(contractsGitkeep))
93
+ fs.unlinkSync(contractsGitkeep);
94
+ // Clear test directory
95
+ const testDir = path.join(outputDir, "test");
96
+ fs.readdirSync(testDir).forEach((file) => {
97
+ if (file.endsWith(".ts") || file === ".gitkeep") {
98
+ fs.unlinkSync(path.join(testDir, file));
99
+ }
100
+ });
101
+ // Download contracts and tests
102
+ const contractNames = [];
103
+ for (const item of category.contracts) {
104
+ const contractName = getContractName(item.sol);
105
+ if (contractName) {
106
+ contractNames.push(contractName);
107
+ await downloadFileFromGitHub(item.sol, path.join(outputDir, "contracts", `${contractName}.sol`));
108
+ }
109
+ if (item.test) {
110
+ await downloadFileFromGitHub(item.test, path.join(outputDir, "test", path.basename(item.test)));
111
+ }
112
+ }
113
+ // Update hardhat.config.ts - remove FHECounter task import
114
+ const configPath = path.join(outputDir, "hardhat.config.ts");
115
+ let configContent = fs.readFileSync(configPath, "utf-8");
116
+ configContent = configContent.replace(/import "\.\/tasks\/FHECounter";\n?/g, "");
117
+ fs.writeFileSync(configPath, configContent);
118
+ // Remove FHECounter task
119
+ const oldTaskFile = path.join(outputDir, "tasks", "FHECounter.ts");
120
+ if (fs.existsSync(oldTaskFile)) {
121
+ fs.unlinkSync(oldTaskFile);
122
+ }
123
+ // Update package.json
124
+ const packageJsonPath = path.join(outputDir, "package.json");
125
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
126
+ packageJson.name = `fhevm-examples-${categoryName}`;
127
+ packageJson.description = category.description;
128
+ fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
129
+ // Generate README
130
+ fs.writeFileSync(path.join(outputDir, "README.md"), generateCategoryReadme(category.name, category.description, contractNames));
131
+ }
132
+ // =============================================================================
133
+ // Install and Test
134
+ // =============================================================================
135
+ async function runInstallAndTest(projectPath) {
136
+ const steps = [
137
+ {
138
+ name: "Installing dependencies",
139
+ cmd: "npm",
140
+ args: ["install"],
141
+ showOutput: false,
142
+ },
143
+ {
144
+ name: "Compiling contracts",
145
+ cmd: "npm",
146
+ args: ["run", "compile"],
147
+ showOutput: false,
148
+ },
149
+ {
150
+ name: "Running tests",
151
+ cmd: "npm",
152
+ args: ["run", "test"],
153
+ showOutput: true,
154
+ },
155
+ ];
156
+ for (const step of steps) {
157
+ const s = p.spinner();
158
+ s.start(step.name + "...");
159
+ try {
160
+ const output = await runCommand(step.cmd, step.args, projectPath);
161
+ if (step.showOutput) {
162
+ const testResults = extractTestResults(output);
163
+ if (testResults) {
164
+ s.stop(pc.green(`✓ ${step.name} - ${testResults}`));
165
+ }
166
+ else {
167
+ s.stop(pc.green(`✓ ${step.name} completed`));
168
+ }
169
+ }
170
+ else {
171
+ s.stop(pc.green(`✓ ${step.name} completed`));
172
+ }
173
+ }
174
+ catch (error) {
175
+ s.stop(pc.red(`✗ ${step.name} failed`));
176
+ if (error instanceof Error) {
177
+ p.log.error(error.message);
178
+ }
179
+ throw new Error(`${step.name} failed`);
180
+ }
181
+ }
182
+ p.log.success(pc.green("All steps completed successfully!"));
183
+ }
184
+ function showQuickStart(relativePath) {
185
+ p.note(`${pc.dim("$")} cd ${relativePath}\n${pc.dim("$")} npm install\n${pc.dim("$")} npm run compile\n${pc.dim("$")} npm run test`, "🚀 Quick Start");
186
+ }
187
+ async function askInstallAndTest(resolvedOutput, relativePath) {
188
+ const shouldInstall = await p.confirm({
189
+ message: "Install dependencies and run tests?",
190
+ initialValue: false,
191
+ });
192
+ if (p.isCancel(shouldInstall)) {
193
+ showQuickStart(relativePath);
194
+ return;
195
+ }
196
+ if (shouldInstall) {
197
+ p.log.message("");
198
+ await runInstallAndTest(resolvedOutput);
199
+ }
200
+ else {
201
+ showQuickStart(relativePath);
202
+ }
203
+ }
204
+ // =============================================================================
205
+ // Interactive Mode
206
+ // =============================================================================
207
+ async function runInteractiveMode() {
208
+ console.clear();
209
+ p.intro(pc.bgCyan(pc.black(" 🔐 Create FHEVM Example ")));
210
+ const mode = await p.select({
211
+ message: "What would you like to create?",
212
+ options: [
213
+ {
214
+ value: "single",
215
+ label: "Single example",
216
+ hint: "One example contract with tests",
217
+ },
218
+ {
219
+ value: "category",
220
+ label: "Category project",
221
+ hint: "Multiple examples by category",
222
+ },
223
+ ],
224
+ });
225
+ if (p.isCancel(mode)) {
226
+ p.cancel("Operation cancelled.");
227
+ process.exit(0);
228
+ }
229
+ let exampleName = "";
230
+ let categoryName = "";
231
+ let projectName = "";
232
+ if (mode === "single") {
233
+ // Group examples by category
234
+ const grouped = {};
235
+ for (const [key, config] of Object.entries(EXAMPLES)) {
236
+ if (!grouped[config.category]) {
237
+ grouped[config.category] = [];
238
+ }
239
+ grouped[config.category].push({
240
+ value: key,
241
+ label: key,
242
+ hint: config.description.slice(0, 50) +
243
+ (config.description.length > 50 ? "..." : ""),
244
+ });
245
+ }
246
+ // Flatten to options
247
+ const options = [];
248
+ for (const [, items] of Object.entries(grouped)) {
249
+ options.push(...items);
250
+ }
251
+ exampleName = await p.select({
252
+ message: "Select an example:",
253
+ options,
254
+ });
255
+ if (p.isCancel(exampleName)) {
256
+ p.cancel("Operation cancelled.");
257
+ process.exit(0);
258
+ }
259
+ projectName = await p.text({
260
+ message: "Project name:",
261
+ placeholder: `my-${exampleName}-project`,
262
+ defaultValue: `my-${exampleName}-project`,
263
+ });
264
+ }
265
+ else {
266
+ categoryName = await p.select({
267
+ message: "Select a category:",
268
+ options: Object.entries(CATEGORIES).map(([key, config]) => ({
269
+ value: key,
270
+ label: config.name,
271
+ hint: `${config.contracts.length} contracts`,
272
+ })),
273
+ });
274
+ if (p.isCancel(categoryName)) {
275
+ p.cancel("Operation cancelled.");
276
+ process.exit(0);
277
+ }
278
+ projectName = await p.text({
279
+ message: "Project name:",
280
+ placeholder: `my-${categoryName}-project`,
281
+ defaultValue: `my-${categoryName}-project`,
282
+ });
283
+ }
284
+ if (p.isCancel(projectName)) {
285
+ p.cancel("Operation cancelled.");
286
+ process.exit(0);
287
+ }
288
+ const outputDir = await p.text({
289
+ message: "Output directory:",
290
+ placeholder: `./${projectName}`,
291
+ defaultValue: `./${projectName}`,
292
+ });
293
+ if (p.isCancel(outputDir)) {
294
+ p.cancel("Operation cancelled.");
295
+ process.exit(0);
296
+ }
297
+ const resolvedOutput = path.resolve(process.cwd(), outputDir);
298
+ if (fs.existsSync(resolvedOutput)) {
299
+ p.log.error(`Directory already exists: ${resolvedOutput}`);
300
+ process.exit(1);
301
+ }
302
+ // Clone repository to temp directory
303
+ const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "fhevm-"));
304
+ const s = p.spinner();
305
+ try {
306
+ s.start("Downloading template...");
307
+ const tempRepoPath = await cloneTemplate(tempDir);
308
+ s.message("Initializing submodules...");
309
+ await initSubmodule(tempRepoPath);
310
+ s.message("Creating project...");
311
+ if (mode === "single") {
312
+ await createSingleExample(exampleName, resolvedOutput, tempRepoPath);
313
+ }
314
+ else {
315
+ await createCategoryProject(categoryName, resolvedOutput, tempRepoPath);
316
+ }
317
+ s.stop("Project created successfully!");
318
+ const relativePath = path.relative(process.cwd(), resolvedOutput);
319
+ p.log.success(`📁 Created: ${pc.cyan(relativePath)}`);
320
+ if (mode === "single") {
321
+ const exampleConfig = EXAMPLES[exampleName];
322
+ p.log.info(`📝 Example: ${pc.yellow(exampleConfig?.title || exampleName)}`);
323
+ }
324
+ else {
325
+ const categoryConfig = CATEGORIES[categoryName];
326
+ p.log.info(`📦 Category: ${pc.yellow(categoryConfig?.name || categoryName)}`);
327
+ p.log.info(`📄 Contracts: ${pc.green(String(categoryConfig?.contracts.length || 0))}`);
328
+ }
329
+ await askInstallAndTest(resolvedOutput, relativePath);
330
+ }
331
+ catch (error) {
332
+ s.stop("Failed to create project");
333
+ p.log.error(error instanceof Error ? error.message : String(error));
334
+ process.exit(1);
335
+ }
336
+ finally {
337
+ // Cleanup temp directory
338
+ if (fs.existsSync(tempDir)) {
339
+ fs.rmSync(tempDir, { recursive: true, force: true });
340
+ }
341
+ }
342
+ p.outro(pc.green("🎉 Happy coding with FHEVM!"));
343
+ }
344
+ // =============================================================================
345
+ // Direct Mode (CLI Arguments)
346
+ // =============================================================================
347
+ function showHelp() {
348
+ console.log(`
349
+ ${pc.cyan("create-fhevm-example")}
350
+
351
+ ${pc.yellow("Usage:")}
352
+ npx create-fhevm-example ${pc.dim("# Interactive mode")}
353
+ npx create-fhevm-example --example <name> ${pc.dim("# Create single example")}
354
+ npx create-fhevm-example --category <name> ${pc.dim("# Create category project")}
355
+
356
+ ${pc.yellow("Options:")}
357
+ --example <name> Create a single example project
358
+ --category <name> Create a category project
359
+ --output <dir> Output directory (default: ./<project-name>)
360
+ --install Auto-install dependencies
361
+ --test Auto-run tests (requires --install)
362
+ --help, -h Show this help message
363
+
364
+ ${pc.yellow("Examples:")}
365
+ ${pc.green("npx create-fhevm-example --example fhe-counter")}
366
+ ${pc.green("npx create-fhevm-example --category basic --output ./my-project")}
367
+ ${pc.green("npx create-fhevm-example --example fhe-counter --install --test")}
368
+
369
+ ${pc.yellow("Available examples:")}
370
+ ${Object.keys(EXAMPLES).join(", ")}
371
+
372
+ ${pc.yellow("Available categories:")}
373
+ ${Object.keys(CATEGORIES).join(", ")}
374
+ `);
375
+ }
376
+ async function runDirectMode(args) {
377
+ const parsedArgs = {};
378
+ for (let i = 0; i < args.length; i++) {
379
+ const arg = args[i];
380
+ if (arg.startsWith("--")) {
381
+ const key = arg.slice(2);
382
+ const nextArg = args[i + 1];
383
+ if (nextArg && !nextArg.startsWith("--")) {
384
+ parsedArgs[key] = nextArg;
385
+ i++;
386
+ }
387
+ else {
388
+ parsedArgs[key] = true;
389
+ }
390
+ }
391
+ else if (arg === "-h") {
392
+ parsedArgs["help"] = true;
393
+ }
394
+ }
395
+ if (parsedArgs["help"]) {
396
+ showHelp();
397
+ return;
398
+ }
399
+ const exampleName = parsedArgs["example"];
400
+ const categoryName = parsedArgs["category"];
401
+ const outputDir = parsedArgs["output"];
402
+ const shouldInstall = parsedArgs["install"] === true;
403
+ const shouldTest = parsedArgs["test"] === true;
404
+ if (!exampleName && !categoryName) {
405
+ console.error(pc.red("Error: Either --example or --category is required"));
406
+ showHelp();
407
+ process.exit(1);
408
+ }
409
+ if (exampleName && categoryName) {
410
+ console.error(pc.red("Error: Cannot use both --example and --category"));
411
+ process.exit(1);
412
+ }
413
+ const mode = exampleName ? "example" : "category";
414
+ const name = (exampleName || categoryName);
415
+ if (mode === "example" && !EXAMPLES[name]) {
416
+ console.error(pc.red(`Error: Unknown example "${name}"`));
417
+ console.log("Available:", Object.keys(EXAMPLES).join(", "));
418
+ process.exit(1);
419
+ }
420
+ if (mode === "category" && !CATEGORIES[name]) {
421
+ console.error(pc.red(`Error: Unknown category "${name}"`));
422
+ console.log("Available:", Object.keys(CATEGORIES).join(", "));
423
+ process.exit(1);
424
+ }
425
+ const defaultOutput = mode === "example" ? `./my-${name}-project` : `./my-${name}-examples`;
426
+ const output = outputDir || defaultOutput;
427
+ const resolved = path.resolve(process.cwd(), output);
428
+ if (fs.existsSync(resolved)) {
429
+ console.error(pc.red(`Error: Directory already exists: ${resolved}`));
430
+ process.exit(1);
431
+ }
432
+ // Clone repository to temp directory
433
+ const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "fhevm-"));
434
+ try {
435
+ console.log(pc.cyan(`Creating ${mode}: ${name}`));
436
+ console.log(pc.dim("Downloading template..."));
437
+ const tempRepoPath = await cloneTemplate(tempDir);
438
+ console.log(pc.dim("Initializing submodules..."));
439
+ await initSubmodule(tempRepoPath);
440
+ console.log(pc.dim("Creating project..."));
441
+ if (mode === "example") {
442
+ await createSingleExample(name, resolved, tempRepoPath);
443
+ }
444
+ else {
445
+ await createCategoryProject(name, resolved, tempRepoPath);
446
+ }
447
+ console.log(pc.green(`✓ Created: ${output}`));
448
+ if (shouldInstall) {
449
+ console.log(pc.dim("\nInstalling dependencies..."));
450
+ await runInstallAndTest(resolved);
451
+ }
452
+ else {
453
+ console.log(pc.dim(`\nNext: cd ${output} && npm install && npm run compile && npm run test`));
454
+ }
455
+ }
456
+ catch (error) {
457
+ console.error(pc.red("Error:"), error instanceof Error ? error.message : String(error));
458
+ process.exit(1);
459
+ }
460
+ finally {
461
+ // Cleanup temp directory
462
+ if (fs.existsSync(tempDir)) {
463
+ fs.rmSync(tempDir, { recursive: true, force: true });
464
+ }
465
+ }
466
+ }
467
+ // =============================================================================
468
+ // Main
469
+ // =============================================================================
470
+ async function main() {
471
+ const args = process.argv.slice(2);
472
+ if (args.length > 0) {
473
+ await runDirectMode(args);
474
+ }
475
+ else {
476
+ await runInteractiveMode();
477
+ }
478
+ }
479
+ main().catch((error) => {
480
+ console.error(pc.red("Fatal error:"), error);
481
+ process.exit(1);
482
+ });
483
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG;AAEH,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EACL,aAAa,EACb,aAAa,EACb,sBAAsB,EACtB,eAAe,EACf,sBAAsB,EACtB,UAAU,EACV,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAEpB,gFAAgF;AAChF,wBAAwB;AACxB,gFAAgF;AAEhF,KAAK,UAAU,mBAAmB,CAChC,WAAmB,EACnB,SAAiB,EACjB,YAAoB;IAEpB,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;IAEtC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,oBAAoB,WAAW,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,wBAAwB,CAAC,CAAC;IAEtE,gBAAgB;IAChB,sBAAsB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAE/C,oBAAoB;IACpB,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IAED,2BAA2B;IAC3B,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAC;IAC7E,IAAI,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACpC,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAClC,CAAC;IAED,yCAAyC;IACzC,MAAM,sBAAsB,CAC1B,OAAO,CAAC,QAAQ,EAChB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,YAAY,MAAM,CAAC,CACzD,CAAC;IAEF,iCAAiC;IACjC,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IACvE,IAAI,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACpC,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAClC,CAAC;IAED,uBAAuB;IACvB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC7C,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACvC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YAChD,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,qBAAqB;IACrB,MAAM,sBAAsB,CAC1B,OAAO,CAAC,IAAI,EACZ,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAC1D,CAAC;IAEF,uBAAuB;IACvB,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,WAAW,CAAC,EAC3C,oBAAoB,CAAC,YAAY,CAAC,CACnC,CAAC;IAEF,sBAAsB;IACtB,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1E,WAAW,CAAC,IAAI,GAAG,iBAAiB,WAAW,EAAE,CAAC;IAClD,WAAW,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAC9C,EAAE,CAAC,aAAa,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAExE,2DAA2D;IAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IAC7D,IAAI,aAAa,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACzD,aAAa,GAAG,aAAa,CAAC,OAAO,CACnC,qCAAqC,EACrC,EAAE,CACH,CAAC;IACF,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAE5C,yBAAyB;IACzB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;IACnE,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAC7B,CAAC;IAED,kBAAkB;IAClB,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EACjC,qBAAqB,CAAC,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,YAAY,CAAC,CACtE,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,0BAA0B;AAC1B,gFAAgF;AAEhF,KAAK,UAAU,qBAAqB,CAClC,YAAoB,EACpB,SAAiB,EACjB,YAAoB;IAEpB,MAAM,QAAQ,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IAE1C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,qBAAqB,YAAY,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,wBAAwB,CAAC,CAAC;IAEtE,gBAAgB;IAChB,sBAAsB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAE/C,uBAAuB;IACvB,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,gBAAgB,CAAC,CAAC;IAC7E,IAAI,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAAE,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAErE,iCAAiC;IACjC,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IACvE,IAAI,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAAE,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAErE,uBAAuB;IACvB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC7C,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACvC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YAChD,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,+BAA+B;IAC/B,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;QACtC,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,IAAI,YAAY,EAAE,CAAC;YACjB,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACjC,MAAM,sBAAsB,CAC1B,IAAI,CAAC,GAAG,EACR,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,YAAY,MAAM,CAAC,CACzD,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,sBAAsB,CAC1B,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CACvD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,2DAA2D;IAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IAC7D,IAAI,aAAa,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACzD,aAAa,GAAG,aAAa,CAAC,OAAO,CACnC,qCAAqC,EACrC,EAAE,CACH,CAAC;IACF,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAE5C,yBAAyB;IACzB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;IACnE,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAC7B,CAAC;IAED,sBAAsB;IACtB,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1E,WAAW,CAAC,IAAI,GAAG,kBAAkB,YAAY,EAAE,CAAC;IACpD,WAAW,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;IAC/C,EAAE,CAAC,aAAa,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAExE,kBAAkB;IAClB,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EACjC,sBAAsB,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,CAC3E,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,mBAAmB;AACnB,gFAAgF;AAEhF,KAAK,UAAU,iBAAiB,CAAC,WAAmB;IAClD,MAAM,KAAK,GAAG;QACZ;YACE,IAAI,EAAE,yBAAyB;YAC/B,GAAG,EAAE,KAAK;YACV,IAAI,EAAE,CAAC,SAAS,CAAC;YACjB,UAAU,EAAE,KAAK;SAClB;QACD;YACE,IAAI,EAAE,qBAAqB;YAC3B,GAAG,EAAE,KAAK;YACV,IAAI,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC;YACxB,UAAU,EAAE,KAAK;SAClB;QACD;YACE,IAAI,EAAE,eAAe;YACrB,GAAG,EAAE,KAAK;YACV,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;YACrB,UAAU,EAAE,IAAI;SACjB;KACF,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;QACtB,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;QAE3B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAElE,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;gBAC/C,IAAI,WAAW,EAAE,CAAC;oBAChB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,IAAI,MAAM,WAAW,EAAE,CAAC,CAAC,CAAC;gBACtD,CAAC;qBAAM,CAAC;oBACN,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC;gBAC/C,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC;YACxC,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;gBAC3B,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,SAAS,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,cAAc,CAAC,YAAoB;IAC1C,CAAC,CAAC,IAAI,CACJ,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,YAAY,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,GAAG,CACtE,GAAG,CACJ,qBAAqB,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,EAChD,gBAAgB,CACjB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,cAAsB,EACtB,YAAoB;IAEpB,MAAM,aAAa,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC;QACpC,OAAO,EAAE,qCAAqC;QAC9C,YAAY,EAAE,KAAK;KACpB,CAAC,CAAC;IAEH,IAAI,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9B,cAAc,CAAC,YAAY,CAAC,CAAC;QAC7B,OAAO;IACT,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAClB,MAAM,iBAAiB,CAAC,cAAc,CAAC,CAAC;IAC1C,CAAC;SAAM,CAAC;QACN,cAAc,CAAC,YAAY,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,mBAAmB;AACnB,gFAAgF;AAEhF,KAAK,UAAU,kBAAkB;IAC/B,OAAO,CAAC,KAAK,EAAE,CAAC;IAEhB,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC,CAAC;IAE1D,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC;QAC1B,OAAO,EAAE,gCAAgC;QACzC,OAAO,EAAE;YACP;gBACE,KAAK,EAAE,QAAQ;gBACf,KAAK,EAAE,gBAAgB;gBACvB,IAAI,EAAE,iCAAiC;aACxC;YACD;gBACE,KAAK,EAAE,UAAU;gBACjB,KAAK,EAAE,kBAAkB;gBACzB,IAAI,EAAE,+BAA+B;aACtC;SACF;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,CAAC,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,WAAW,GAAoB,EAAE,CAAC;IACtC,IAAI,YAAY,GAAoB,EAAE,CAAC;IACvC,IAAI,WAAW,GAAoB,EAAE,CAAC;IAEtC,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,6BAA6B;QAC7B,MAAM,OAAO,GAGT,EAAE,CAAC;QACP,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;YAChC,CAAC;YACD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;gBAC5B,KAAK,EAAE,GAAG;gBACV,KAAK,EAAE,GAAG;gBACV,IAAI,EACF,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;oBAC/B,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;aAChD,CAAC,CAAC;QACL,CAAC;QAED,qBAAqB;QACrB,MAAM,OAAO,GAA2D,EAAE,CAAC;QAC3E,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;QACzB,CAAC;QAED,WAAW,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC;YAC3B,OAAO,EAAE,oBAAoB;YAC7B,OAAO;SACR,CAAC,CAAC;QAEH,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5B,CAAC,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;YACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,WAAW,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;YACzB,OAAO,EAAE,eAAe;YACxB,WAAW,EAAE,MAAM,WAAW,UAAU;YACxC,YAAY,EAAE,MAAM,WAAW,UAAU;SAC1C,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,YAAY,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC;YAC5B,OAAO,EAAE,oBAAoB;YAC7B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC1D,KAAK,EAAE,GAAG;gBACV,KAAK,EAAE,MAAM,CAAC,IAAI;gBAClB,IAAI,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,YAAY;aAC7C,CAAC,CAAC;SACJ,CAAC,CAAC;QAEH,IAAI,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7B,CAAC,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;YACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,WAAW,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;YACzB,OAAO,EAAE,eAAe;YACxB,WAAW,EAAE,MAAM,YAAY,UAAU;YACzC,YAAY,EAAE,MAAM,YAAY,UAAU;SAC3C,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,CAAC,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;QAC7B,OAAO,EAAE,mBAAmB;QAC5B,WAAW,EAAE,KAAK,WAAW,EAAE;QAC/B,YAAY,EAAE,KAAK,WAAW,EAAE;KACjC,CAAC,CAAC;IAEH,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,CAAC,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAmB,CAAC,CAAC;IAExE,IAAI,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAClC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,6BAA6B,cAAc,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,qCAAqC;IACrC,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;IACjE,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IAEtB,IAAI,CAAC;QACH,CAAC,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACnC,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;QAElD,CAAC,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;QACxC,MAAM,aAAa,CAAC,YAAY,CAAC,CAAC;QAElC,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QACjC,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,MAAM,mBAAmB,CACvB,WAAqB,EACrB,cAAc,EACd,YAAY,CACb,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,qBAAqB,CACzB,YAAsB,EACtB,cAAc,EACd,YAAY,CACb,CAAC;QACJ,CAAC;QAED,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAExC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;QAElE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAEtD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,MAAM,aAAa,GAAG,QAAQ,CAAC,WAAqB,CAAC,CAAC;YACtD,CAAC,CAAC,GAAG,CAAC,IAAI,CACR,eAAe,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,IAAI,WAAW,CAAC,EAAE,CAChE,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,cAAc,GAAG,UAAU,CAAC,YAAsB,CAAC,CAAC;YAC1D,CAAC,CAAC,GAAG,CAAC,IAAI,CACR,gBAAgB,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,IAAI,YAAY,CAAC,EAAE,CAClE,CAAC;YACF,CAAC,CAAC,GAAG,CAAC,IAAI,CACR,iBAAiB,EAAE,CAAC,KAAK,CACvB,MAAM,CAAC,cAAc,EAAE,SAAS,CAAC,MAAM,IAAI,CAAC,CAAC,CAC9C,EAAE,CACJ,CAAC;QACJ,CAAC;QAED,MAAM,iBAAiB,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACnC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,yBAAyB;QACzB,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,gFAAgF;AAChF,8BAA8B;AAC9B,gFAAgF;AAEhF,SAAS,QAAQ;IACf,OAAO,CAAC,GAAG,CAAC;EACZ,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC;;EAE/B,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC;iDAC4B,EAAE,CAAC,GAAG,CAAC,oBAAoB,CAAC;iDAC5B,EAAE,CAAC,GAAG,CACnD,yBAAyB,CAC1B;iDAC8C,EAAE,CAAC,GAAG,CACnD,2BAA2B,CAC5B;;EAED,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC;;;;;;;;EAQrB,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC;IACpB,EAAE,CAAC,KAAK,CAAC,gDAAgD,CAAC;IAC1D,EAAE,CAAC,KAAK,CAAC,iEAAiE,CAAC;IAC3E,EAAE,CAAC,KAAK,CAAC,iEAAiE,CAAC;;EAE7E,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC;IAC9B,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;EAElC,EAAE,CAAC,MAAM,CAAC,uBAAuB,CAAC;IAChC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;CACrC,CAAC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAAc;IACzC,MAAM,UAAU,GAAqC,EAAE,CAAC;IAExD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAE5B,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzC,UAAU,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;gBAC1B,CAAC,EAAE,CAAC;YACN,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YACzB,CAAC;QACH,CAAC;aAAM,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACxB,UAAU,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,QAAQ,EAAE,CAAC;QACX,OAAO;IACT,CAAC;IAED,MAAM,WAAW,GAAG,UAAU,CAAC,SAAS,CAAW,CAAC;IACpD,MAAM,YAAY,GAAG,UAAU,CAAC,UAAU,CAAW,CAAC;IACtD,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAW,CAAC;IACjD,MAAM,aAAa,GAAG,UAAU,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC;IACrD,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;IAE/C,IAAI,CAAC,WAAW,IAAI,CAAC,YAAY,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC,CAAC;QAC3E,QAAQ,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,WAAW,IAAI,YAAY,EAAE,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;IAClD,MAAM,IAAI,GAAG,CAAC,WAAW,IAAI,YAAY,CAAW,CAAC;IAErD,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,2BAA2B,IAAI,GAAG,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,4BAA4B,IAAI,GAAG,CAAC,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,aAAa,GACjB,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,IAAI,UAAU,CAAC,CAAC,CAAC,QAAQ,IAAI,WAAW,CAAC;IACxE,MAAM,MAAM,GAAG,SAAS,IAAI,aAAa,CAAC;IAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;IAErD,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,oCAAoC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,qCAAqC;IACrC,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEjE,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC;QAE/C,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;QAElD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;QAClD,MAAM,aAAa,CAAC,YAAY,CAAC,CAAC;QAElC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAC3C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,mBAAmB,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,MAAM,qBAAqB,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,MAAM,EAAE,CAAC,CAAC,CAAC;QAE9C,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAC;YACpD,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CACT,EAAE,CAAC,GAAG,CACJ,cAAc,MAAM,oDAAoD,CACzE,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,EAChB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,yBAAyB;QACzB,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,OAAO;AACP,gFAAgF;AAEhF,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEnC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;SAAM,CAAC;QACN,MAAM,kBAAkB,EAAE,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC,CAAC;IAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Utility functions for creating FHEVM example projects
3
+ */
4
+ /**
5
+ * Get contract name from file path
6
+ */
7
+ export declare function getContractName(contractPath: string): string | null;
8
+ /**
9
+ * Recursively copy directory
10
+ */
11
+ export declare function copyDirectoryRecursive(src: string, dest: string): void;
12
+ /**
13
+ * Download file from GitHub repository
14
+ */
15
+ export declare function downloadFileFromGitHub(filePath: string, outputPath: string): Promise<void>;
16
+ /**
17
+ * Clone template repository to temporary directory
18
+ */
19
+ export declare function cloneTemplate(tempDir: string): Promise<string>;
20
+ /**
21
+ * Initialize git submodule for template
22
+ */
23
+ export declare function initSubmodule(repoPath: string): Promise<void>;
24
+ /**
25
+ * Run a shell command
26
+ */
27
+ export declare function runCommand(cmd: string, args: string[], cwd: string): Promise<string>;
28
+ /**
29
+ * Extract test results from npm test output
30
+ */
31
+ export declare function extractTestResults(output: string): string | null;
32
+ /**
33
+ * Generate README for single example project
34
+ */
35
+ export declare function generateExampleReadme(exampleName: string, description: string, contractName: string): string;
36
+ /**
37
+ * Generate README for category project
38
+ */
39
+ export declare function generateCategoryReadme(categoryName: string, description: string, contractNames: string[]): string;
40
+ /**
41
+ * Generate deploy script
42
+ */
43
+ export declare function generateDeployScript(contractName: string): string;
44
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH;;GAEG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGnE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAqBtE;AAMD;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmCpE;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BnE;AAMD;;GAEG;AACH,wBAAgB,UAAU,CACxB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,CA+BjB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAchE;AAMD;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,MAAM,CAqDR;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EAAE,GACtB,MAAM,CA2DR;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAqBjE"}