@tpitre/story-ui 3.6.2 → 3.8.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.
Files changed (47) hide show
  1. package/README.md +36 -32
  2. package/dist/cli/index.js +0 -5
  3. package/dist/cli/setup.js +1 -1
  4. package/dist/mcp-server/routes/generateStory.d.ts.map +1 -1
  5. package/dist/mcp-server/routes/generateStory.js +178 -87
  6. package/dist/mcp-server/routes/generateStoryStream.d.ts.map +1 -1
  7. package/dist/mcp-server/routes/generateStoryStream.js +149 -31
  8. package/dist/story-generator/dynamicPackageDiscovery.d.ts +35 -2
  9. package/dist/story-generator/dynamicPackageDiscovery.d.ts.map +1 -1
  10. package/dist/story-generator/dynamicPackageDiscovery.js +332 -6
  11. package/dist/story-generator/enhancedComponentDiscovery.d.ts.map +1 -1
  12. package/dist/story-generator/enhancedComponentDiscovery.js +149 -2
  13. package/dist/story-generator/framework-adapters/base-adapter.d.ts +1 -0
  14. package/dist/story-generator/framework-adapters/base-adapter.d.ts.map +1 -1
  15. package/dist/story-generator/framework-adapters/base-adapter.js +12 -2
  16. package/dist/story-generator/framework-adapters/react-adapter.d.ts.map +1 -1
  17. package/dist/story-generator/framework-adapters/react-adapter.js +2 -0
  18. package/dist/story-generator/framework-adapters/svelte-adapter.d.ts.map +1 -1
  19. package/dist/story-generator/framework-adapters/svelte-adapter.js +53 -7
  20. package/dist/story-generator/framework-adapters/vue-adapter.d.ts.map +1 -1
  21. package/dist/story-generator/framework-adapters/vue-adapter.js +21 -1
  22. package/dist/story-generator/framework-adapters/web-components-adapter.d.ts.map +1 -1
  23. package/dist/story-generator/framework-adapters/web-components-adapter.js +4 -0
  24. package/dist/story-generator/llm-providers/openai-provider.js +2 -2
  25. package/dist/story-generator/promptGenerator.d.ts.map +1 -1
  26. package/dist/story-generator/promptGenerator.js +179 -26
  27. package/dist/story-generator/runtimeValidator.d.ts +64 -0
  28. package/dist/story-generator/runtimeValidator.d.ts.map +1 -0
  29. package/dist/story-generator/runtimeValidator.js +356 -0
  30. package/dist/story-generator/selfHealingLoop.d.ts +112 -0
  31. package/dist/story-generator/selfHealingLoop.d.ts.map +1 -0
  32. package/dist/story-generator/selfHealingLoop.js +202 -0
  33. package/dist/story-generator/validateStory.d.ts.map +1 -1
  34. package/dist/story-generator/validateStory.js +81 -12
  35. package/dist/story-ui.config.d.ts +2 -0
  36. package/dist/story-ui.config.d.ts.map +1 -1
  37. package/dist/templates/StoryUI/StoryUIPanel.d.ts +0 -5
  38. package/dist/templates/StoryUI/StoryUIPanel.d.ts.map +1 -1
  39. package/dist/templates/StoryUI/StoryUIPanel.js +411 -223
  40. package/package.json +4 -4
  41. package/templates/StoryUI/StoryUIPanel.mdx +84 -0
  42. package/templates/StoryUI/StoryUIPanel.tsx +493 -265
  43. package/dist/templates/StoryUI/StoryUIPanel.stories.d.ts +0 -18
  44. package/dist/templates/StoryUI/StoryUIPanel.stories.d.ts.map +0 -1
  45. package/dist/templates/StoryUI/StoryUIPanel.stories.js +0 -37
  46. package/templates/StoryUI/StoryUIPanel.stories.tsx +0 -44
  47. package/templates/StoryUI/manager.tsx +0 -859
@@ -12,6 +12,7 @@ import * as path from 'path';
12
12
  import { generateStory } from '../../story-generator/generateStory.js';
13
13
  import { EnhancedComponentDiscovery } from '../../story-generator/enhancedComponentDiscovery.js';
14
14
  import { buildClaudePrompt as buildFlexiblePrompt, buildFrameworkAwarePrompt, detectProjectFramework, } from '../../story-generator/promptGenerator.js';
15
+ import { getAdapter } from '../../story-generator/framework-adapters/index.js';
15
16
  import { loadUserConfig, validateConfig } from '../../story-generator/configLoader.js';
16
17
  import { extractAndValidateCodeBlock, createFallbackStory } from '../../story-generator/validateStory.js';
17
18
  import { isBlacklistedComponent, isBlacklistedIcon, getBlacklistErrorMessage, ICON_CORRECTIONS } from '../../story-generator/componentBlacklist.js';
@@ -19,7 +20,10 @@ import { StoryTracker } from '../../story-generator/storyTracker.js';
19
20
  import { getDocumentation } from '../../story-generator/documentation-sources.js';
20
21
  import { postProcessStory } from '../../story-generator/postProcessStory.js';
21
22
  import { validateStory } from '../../story-generator/storyValidator.js';
23
+ import { validateStoryCode } from '../../story-generator/validateStory.js';
24
+ import { aggregateValidationErrors, shouldContinueRetrying, buildSelfHealingPrompt, hasNoErrors, getTotalErrorCount, createEmptyErrors, formatErrorsForLog, selectBestAttempt, } from '../../story-generator/selfHealingLoop.js';
22
25
  import { StoryHistoryManager } from '../../story-generator/storyHistory.js';
26
+ import { logger } from '../../story-generator/logger.js';
23
27
  import { UrlRedirectService } from '../../story-generator/urlRedirectService.js';
24
28
  import { chatCompletion, generateTitle as llmGenerateTitle, isProviderConfigured, getProviderInfo, chatCompletionWithImages, buildMessageWithImages } from '../../story-generator/llm-providers/story-llm-service.js';
25
29
  import { processImageInputs } from '../../story-generator/imageProcessor.js';
@@ -94,11 +98,30 @@ class StreamWriter {
94
98
  return Date.now() - this.startTime;
95
99
  }
96
100
  }
101
+ // Build suggestion using the user's actual discovered components (design-system agnostic)
102
+ function buildComponentSuggestion(components) {
103
+ if (!components?.length) {
104
+ return 'Check your story-ui.config.js to ensure components are properly configured.';
105
+ }
106
+ // Show a sample of the user's actual available components (up to 5)
107
+ const sampleComponents = components
108
+ .slice(0, 5)
109
+ .map(c => c.name)
110
+ .join(', ');
111
+ const moreCount = components.length > 5
112
+ ? ` and ${components.length - 5} more`
113
+ : '';
114
+ return `Your available components include: ${sampleComponents}${moreCount}. Check story-ui.config.js if expected components are missing.`;
115
+ }
97
116
  // Analyze prompt to determine intent
98
117
  async function analyzeIntent(prompt, config, conversation, previousCode, options) {
99
- // Determine framework
118
+ // Determine framework - priority: config > explicit option > auto-detect > default
100
119
  let framework = 'react';
101
- if (options.framework) {
120
+ if (config.componentFramework) {
121
+ // First priority: use config.componentFramework if set
122
+ framework = config.componentFramework;
123
+ }
124
+ else if (options.framework) {
102
125
  framework = options.framework;
103
126
  }
104
127
  else if (options.autoDetectFramework) {
@@ -458,25 +481,53 @@ export async function generateStoryFromPromptStream(req, res) {
458
481
  const messages = [
459
482
  { role: 'user', content: initialPrompt }
460
483
  ];
461
- // Step 4: Call LLM
484
+ // Step 4: Call LLM with Self-Healing Loop
462
485
  currentStep++;
463
486
  stream.sendProgress(currentStep, totalSteps, 'llm_thinking', 'AI is generating your story...');
464
- // Validation and retry loop
487
+ // Determine framework for self-healing options
488
+ const detectedFrameworkForHealing = config.componentFramework ||
489
+ framework ||
490
+ intent.framework ||
491
+ 'react';
492
+ // Get available component names for self-healing prompts
493
+ const availableComponentNames = components.map(c => c.name);
494
+ // Self-healing options (design-system agnostic)
495
+ const selfHealingOptions = {
496
+ maxAttempts: 3,
497
+ availableComponents: availableComponentNames,
498
+ framework: detectedFrameworkForHealing,
499
+ importPath: config.importPath,
500
+ };
501
+ // Initialize self-healing state
465
502
  let aiText = '';
466
- let validationErrors = [];
467
- const maxRetries = 3;
503
+ let finalErrors = createEmptyErrors();
504
+ const errorHistory = [];
505
+ const allAttempts = [];
468
506
  let attempts = 0;
469
- while (attempts < maxRetries) {
507
+ let selfHealingUsed = false;
508
+ let lastClaudeResponse = '';
509
+ // Self-Healing Retry Loop
510
+ while (attempts < selfHealingOptions.maxAttempts) {
470
511
  attempts++;
471
512
  stream.trackLLMCall();
472
513
  if (attempts > 1) {
473
- stream.sendRetry(attempts, maxRetries, 'Fixing validation errors', validationErrors.map(e => e.message));
514
+ selfHealingUsed = true;
515
+ const allErrors = [
516
+ ...finalErrors.syntaxErrors,
517
+ ...finalErrors.patternErrors,
518
+ ...finalErrors.importErrors,
519
+ ];
520
+ stream.sendRetry(attempts, selfHealingOptions.maxAttempts, 'AI self-healing: fixing validation errors', allErrors);
521
+ logger.log(`🔄 Self-healing attempt ${attempts}/${selfHealingOptions.maxAttempts}`);
474
522
  }
523
+ // Call LLM
475
524
  const claudeResponse = await callLLM(messages, processedImages.length > 0 ? processedImages : undefined);
525
+ lastClaudeResponse = claudeResponse;
526
+ // Extract code block
476
527
  const extractedCode = extractCodeBlock(claudeResponse);
477
528
  if (!extractedCode) {
478
529
  aiText = claudeResponse;
479
- if (attempts < maxRetries) {
530
+ if (attempts < selfHealingOptions.maxAttempts) {
480
531
  messages.push({ role: 'assistant', content: aiText });
481
532
  messages.push({ role: 'user', content: 'You did not provide a code block. Please provide the complete story in a single `tsx` code block.' });
482
533
  continue;
@@ -488,46 +539,92 @@ export async function generateStoryFromPromptStream(req, res) {
488
539
  else {
489
540
  aiText = extractedCode;
490
541
  }
491
- // Step 5: Validate
542
+ // Step 5: Comprehensive Validation (Pattern + AST + Import)
492
543
  currentStep = 5;
493
544
  stream.sendProgress(currentStep, totalSteps, 'validating', 'Validating generated code...');
494
- validationErrors = validateStory(aiText);
495
- if (validationErrors.length === 0) {
545
+ // 1. Pattern validation
546
+ const patternErrors = validateStory(aiText);
547
+ // 2. AST validation with auto-fix attempt
548
+ let astResult = null;
549
+ let codeToValidate = aiText;
550
+ try {
551
+ astResult = validateStoryCode(aiText, 'story.tsx', config);
552
+ if (astResult.fixedCode) {
553
+ codeToValidate = astResult.fixedCode;
554
+ aiText = codeToValidate;
555
+ logger.log('🔧 Auto-fix applied for syntax issues');
556
+ }
557
+ }
558
+ catch (astError) {
559
+ logger.error('AST validation error:', astError);
560
+ }
561
+ // 3. Import validation
562
+ const importValidation = await preValidateImports(codeToValidate, config, discovery);
563
+ const importErrors = importValidation.isValid ? [] : importValidation.errors;
564
+ // Aggregate all errors
565
+ const currentErrors = aggregateValidationErrors(astResult, patternErrors, importErrors);
566
+ errorHistory.push(currentErrors);
567
+ allAttempts.push({ code: aiText, errors: currentErrors });
568
+ // Check if we have no errors
569
+ if (hasNoErrors(currentErrors)) {
570
+ logger.log('✅ Validation passed on attempt', attempts);
496
571
  stream.sendValidation({
497
572
  isValid: true,
498
573
  errors: [],
499
574
  warnings: [],
500
- autoFixApplied: false
575
+ autoFixApplied: !!astResult?.fixedCode
501
576
  });
577
+ finalErrors = currentErrors;
502
578
  break;
503
579
  }
580
+ // Log validation failures
581
+ logger.log(`⚠️ Attempt ${attempts} validation errors: ${formatErrorsForLog(currentErrors)}`);
504
582
  stream.sendValidation({
505
583
  isValid: false,
506
- errors: validationErrors.map(e => e.message),
584
+ errors: [
585
+ ...currentErrors.syntaxErrors,
586
+ ...currentErrors.patternErrors,
587
+ ...currentErrors.importErrors,
588
+ ],
507
589
  warnings: [],
508
- autoFixApplied: false
590
+ autoFixApplied: !!astResult?.fixedCode
509
591
  });
510
- if (attempts < maxRetries) {
511
- const errorFeedback = validationErrors
512
- .map(err => `- Line ${err.line}: ${err.message}`)
513
- .join('\n');
514
- const retryPrompt = `Your previous attempt failed validation with the following errors:\n${errorFeedback}\n\nPlease correct these issues and provide the full, valid story code.`;
515
- messages.push({ role: 'assistant', content: claudeResponse });
516
- messages.push({ role: 'user', content: retryPrompt });
592
+ finalErrors = currentErrors;
593
+ // Check if we should continue retrying
594
+ const retryDecision = shouldContinueRetrying(attempts, selfHealingOptions.maxAttempts, errorHistory);
595
+ if (!retryDecision.shouldRetry) {
596
+ logger.log(`🛑 Stopping retries: ${retryDecision.reason}`);
597
+ break;
598
+ }
599
+ // Build self-healing prompt and add to messages
600
+ const healingPrompt = buildSelfHealingPrompt(aiText, currentErrors, attempts, selfHealingOptions);
601
+ messages.push({ role: 'assistant', content: claudeResponse });
602
+ messages.push({ role: 'user', content: healingPrompt });
603
+ }
604
+ // Select best attempt if we still have errors
605
+ if (!hasNoErrors(finalErrors) && allAttempts.length > 0) {
606
+ const bestAttempt = selectBestAttempt(allAttempts);
607
+ if (bestAttempt) {
608
+ aiText = bestAttempt.code;
609
+ finalErrors = bestAttempt.errors;
610
+ logger.log(`📌 Selected best attempt with ${getTotalErrorCount(finalErrors)} errors`);
517
611
  }
518
612
  }
519
- // Step 6: Code extraction and validation
613
+ // Log self-healing summary
614
+ if (selfHealingUsed) {
615
+ logger.log(`🔄 Self-healing summary: ${attempts} attempts, final errors: ${formatErrorsForLog(finalErrors)}`);
616
+ }
617
+ // Step 6: Code extraction and final processing
520
618
  currentStep = 6;
521
619
  stream.sendProgress(currentStep, totalSteps, 'code_extracted', 'Processing generated code...');
522
- // Pre-validate imports
523
- const preValidation = await preValidateImports(aiText, config, discovery);
524
- if (!preValidation.isValid) {
620
+ // If we still have import errors after all attempts, report them
621
+ if (finalErrors.importErrors.length > 0) {
525
622
  stream.sendError({
526
623
  code: 'INVALID_IMPORTS',
527
624
  message: 'Generated code contains invalid imports',
528
- details: preValidation.errors.join('; '),
625
+ details: finalErrors.importErrors.join('; '),
529
626
  recoverable: true,
530
- suggestion: 'Try using basic components like Box, Stack, Button'
627
+ suggestion: buildComponentSuggestion(components)
531
628
  });
532
629
  res.end();
533
630
  return;
@@ -569,11 +666,22 @@ export async function generateStoryFromPromptStream(req, res) {
569
666
  // Step 7: Post-processing
570
667
  currentStep++;
571
668
  stream.sendProgress(currentStep, totalSteps, 'post_processing', 'Applying finishing touches...');
572
- // Ensure React import
573
- if (!fileContents.includes("import React from 'react';")) {
669
+ // Detect framework from config or auto-detection
670
+ const detectedFramework = config.componentFramework ||
671
+ framework ||
672
+ intent.framework ||
673
+ 'react';
674
+ // Only add React import for React framework
675
+ if (detectedFramework === 'react' && !fileContents.includes("import React from 'react';")) {
574
676
  fileContents = "import React from 'react';\n" + fileContents;
575
677
  }
576
678
  let fixedFileContents = postProcessStory(fileContents, config.importPath);
679
+ // Apply framework-specific post-processing
680
+ const frameworkAdapter = getAdapter(detectedFramework);
681
+ if (frameworkAdapter) {
682
+ logger.log(`🔧 Applying ${detectedFramework} framework post-processing`);
683
+ fixedFileContents = frameworkAdapter.postProcess(fixedFileContents);
684
+ }
577
685
  // Generate title
578
686
  let aiTitle;
579
687
  if (isActualUpdate && originalTitle) {
@@ -631,6 +739,10 @@ export async function generateStoryFromPromptStream(req, res) {
631
739
  finalFileName = fileName || fileNameFromTitle(aiTitle, hash);
632
740
  storyId = `story-${hash}`;
633
741
  }
742
+ // Ensure file extension is correct
743
+ if (finalFileName && !finalFileName.endsWith('.stories.tsx')) {
744
+ finalFileName = finalFileName + '.stories.tsx';
745
+ }
634
746
  // Step 8: Save story
635
747
  currentStep++;
636
748
  stream.sendProgress(currentStep, totalSteps, 'saving', 'Saving your story...');
@@ -712,7 +824,13 @@ async function buildClaudePromptWithContext(userPrompt, config, conversation, pr
712
824
  const discoveredComponents = components || await discovery.discoverAll();
713
825
  let useFrameworkAware = false;
714
826
  let frameworkOptions;
715
- if (options?.framework) {
827
+ // Priority: config.componentFramework > explicit option > auto-detect
828
+ if (config.componentFramework) {
829
+ // First priority: use config.componentFramework if set
830
+ useFrameworkAware = true;
831
+ frameworkOptions = { framework: config.componentFramework };
832
+ }
833
+ else if (options?.framework) {
716
834
  useFrameworkAware = true;
717
835
  frameworkOptions = { framework: options.framework };
718
836
  }
@@ -10,12 +10,17 @@ export interface PackageExports {
10
10
  packageVersion: string;
11
11
  }
12
12
  /**
13
- * Dynamically discovers what components are actually available in an installed package
13
+ * Dynamically discovers what components are actually available in an installed package.
14
+ *
15
+ * IMPORTANT: This class is FRAMEWORK-aware, not DESIGN-SYSTEM-aware.
16
+ * It uses GENERIC patterns based on the framework type (React, Vue, Angular, Svelte, Web Components)
17
+ * without any knowledge of specific design systems (Mantine, Vuetify, Material, Skeleton, Shoelace, etc.)
14
18
  */
15
19
  export declare class DynamicPackageDiscovery {
16
20
  private packageName;
17
21
  private projectRoot;
18
- constructor(packageName: string, projectRoot?: string);
22
+ private framework;
23
+ constructor(packageName: string, projectRoot?: string, framework?: string);
19
24
  /**
20
25
  * Get the real exports from the installed package
21
26
  */
@@ -63,8 +68,36 @@ export declare class DynamicPackageDiscovery {
63
68
  /**
64
69
  * Alternative discovery method when package imports fail due to CSS
65
70
  * Analyzes package.json exports and TypeScript definitions
71
+ *
72
+ * IMPORTANT: This uses GENERIC framework-based discovery patterns.
73
+ * It has NO knowledge of specific design systems - only framework types.
66
74
  */
67
75
  private discoverFromPackageStructure;
76
+ /**
77
+ * GENERIC Vue Framework Discovery: Parse ES module re-exports
78
+ * Works with Vue component libraries that use: export * from "./ComponentName/index.js" pattern
79
+ * Searches common locations: lib/components/, src/components/, components/
80
+ */
81
+ private discoverVueFrameworkComponents;
82
+ /**
83
+ * GENERIC Web Components Discovery: Parse custom-elements.json manifest
84
+ * Custom Elements Manifest is a standard spec for documenting Web Components
85
+ * Works with any Web Components library that provides a custom-elements.json manifest
86
+ */
87
+ private discoverWebComponentsFromManifest;
88
+ /**
89
+ * GENERIC Angular Framework Discovery: Scan module directories
90
+ * Works with Angular component libraries that use NgModule patterns
91
+ * Discovers modules based on directory structure and file patterns
92
+ */
93
+ private discoverAngularFrameworkComponents;
94
+ /**
95
+ * GENERIC Svelte Framework Discovery: Scan for .svelte component files
96
+ * Works with any Svelte component library that includes .svelte files
97
+ * Searches common locations: dist/, src/, lib/, components/
98
+ * Also detects CSS-only packages that provide no Svelte components
99
+ */
100
+ private discoverSvelteFrameworkComponents;
68
101
  /**
69
102
  * Scan package subdirectories for components (e.g., antd/button, chakra-ui/input)
70
103
  */
@@ -1 +1 @@
1
- {"version":3,"file":"dynamicPackageDiscovery.d.ts","sourceRoot":"","sources":["../../story-generator/dynamicPackageDiscovery.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;IAClD,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,oBAAoB,EAAE,CAAC;IACnC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,EAAE,MAAM,EAAE,WAAW,GAAE,MAAsB;IAKpE;;OAEG;IACG,qBAAqB,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IA0G7D;;OAEG;YACW,cAAc;IAiD5B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA2BzB;;OAEG;IACH,OAAO,CAAC,eAAe;IA4BvB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAyB/B;;OAEG;IACH,OAAO,CAAC,0BAA0B;IASlC;;OAEG;IACH,OAAO,CAAC,aAAa;IA6BrB;;OAEG;IACG,0BAA0B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAYrD;;OAEG;IACG,sBAAsB,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAC9D,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,CAAC;IAyBF;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAkC5B;;;OAGG;IACH,OAAO,CAAC,4BAA4B;IA2CpC;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAiDnC;;OAEG;IACH,OAAO,CAAC,4BAA4B;IAoCpC;;OAEG;IACH,OAAO,CAAC,eAAe;IAcvB;;OAEG;IACH,OAAO,CAAC,6BAA6B;IAyBrC;;OAEG;IACH,OAAO,CAAC,iCAAiC;CA+B1C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,uBAAuB,CAEzG;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAGvG"}
1
+ {"version":3,"file":"dynamicPackageDiscovery.d.ts","sourceRoot":"","sources":["../../story-generator/dynamicPackageDiscovery.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;IAClD,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,oBAAoB,EAAE,CAAC;IACnC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;GAMG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAS;gBAEd,WAAW,EAAE,MAAM,EAAE,WAAW,GAAE,MAAsB,EAAE,SAAS,GAAE,MAAgB;IAMjG;;OAEG;IACG,qBAAqB,IAAI,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IA0H7D;;OAEG;YACW,cAAc;IAiD5B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA2BzB;;OAEG;IACH,OAAO,CAAC,eAAe;IA4BvB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAyB/B;;OAEG;IACH,OAAO,CAAC,0BAA0B;IASlC;;OAEG;IACH,OAAO,CAAC,aAAa;IA6BrB;;OAEG;IACG,0BAA0B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAYrD;;OAEG;IACG,sBAAsB,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAC9D,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,CAAC;IAyBF;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAkC5B;;;;;;OAMG;IACH,OAAO,CAAC,4BAA4B;IAyFpC;;;;OAIG;IACH,OAAO,CAAC,8BAA8B;IAwDtC;;;;OAIG;IACH,OAAO,CAAC,iCAAiC;IAyDzC;;;;OAIG;IACH,OAAO,CAAC,kCAAkC;IA0E1C;;;;;OAKG;IACH,OAAO,CAAC,iCAAiC;IAqFzC;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAiDnC;;OAEG;IACH,OAAO,CAAC,4BAA4B;IAoCpC;;OAEG;IACH,OAAO,CAAC,eAAe;IAcvB;;OAEG;IACH,OAAO,CAAC,6BAA6B;IAyBrC;;OAEG;IACH,OAAO,CAAC,iCAAiC;CA+B1C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,uBAAuB,CAEzG;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAGvG"}