@tayo-dev/rtl 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.
Files changed (150) hide show
  1. package/README.md +250 -0
  2. package/dist/analyzer/mocks/detector.d.ts +59 -0
  3. package/dist/analyzer/mocks/detector.d.ts.map +1 -0
  4. package/dist/analyzer/mocks/detector.js +264 -0
  5. package/dist/analyzer/mocks/detector.js.map +1 -0
  6. package/dist/analyzer/mocks/target-analyzer.d.ts +92 -0
  7. package/dist/analyzer/mocks/target-analyzer.d.ts.map +1 -0
  8. package/dist/analyzer/mocks/target-analyzer.js +305 -0
  9. package/dist/analyzer/mocks/target-analyzer.js.map +1 -0
  10. package/dist/analyzer/visual/element-analyzer.d.ts +44 -0
  11. package/dist/analyzer/visual/element-analyzer.d.ts.map +1 -0
  12. package/dist/analyzer/visual/element-analyzer.js +176 -0
  13. package/dist/analyzer/visual/element-analyzer.js.map +1 -0
  14. package/dist/analyzer/visual/inspector.d.ts +49 -0
  15. package/dist/analyzer/visual/inspector.d.ts.map +1 -0
  16. package/dist/analyzer/visual/inspector.js +109 -0
  17. package/dist/analyzer/visual/inspector.js.map +1 -0
  18. package/dist/cli/commands/generate.d.ts +13 -0
  19. package/dist/cli/commands/generate.d.ts.map +1 -0
  20. package/dist/cli/commands/generate.js +417 -0
  21. package/dist/cli/commands/generate.js.map +1 -0
  22. package/dist/core/generator.d.ts +32 -0
  23. package/dist/core/generator.d.ts.map +1 -0
  24. package/dist/core/generator.js +173 -0
  25. package/dist/core/generator.js.map +1 -0
  26. package/dist/core/js-parser.d.ts +48 -0
  27. package/dist/core/js-parser.d.ts.map +1 -0
  28. package/dist/core/js-parser.js +244 -0
  29. package/dist/core/js-parser.js.map +1 -0
  30. package/dist/core/mock-intelligence.d.ts +14 -0
  31. package/dist/core/mock-intelligence.d.ts.map +1 -0
  32. package/dist/core/mock-intelligence.js +140 -0
  33. package/dist/core/mock-intelligence.js.map +1 -0
  34. package/dist/core/orchestrator.d.ts +49 -0
  35. package/dist/core/orchestrator.d.ts.map +1 -0
  36. package/dist/core/orchestrator.js +315 -0
  37. package/dist/core/orchestrator.js.map +1 -0
  38. package/dist/core/parser.d.ts +9 -0
  39. package/dist/core/parser.d.ts.map +1 -0
  40. package/dist/core/parser.js +120 -0
  41. package/dist/core/parser.js.map +1 -0
  42. package/dist/core/recording-intelligence.d.ts +15 -0
  43. package/dist/core/recording-intelligence.d.ts.map +1 -0
  44. package/dist/core/recording-intelligence.js +178 -0
  45. package/dist/core/recording-intelligence.js.map +1 -0
  46. package/dist/core/resolver.d.ts +58 -0
  47. package/dist/core/resolver.d.ts.map +1 -0
  48. package/dist/core/resolver.js +291 -0
  49. package/dist/core/resolver.js.map +1 -0
  50. package/dist/core/scanner.d.ts +51 -0
  51. package/dist/core/scanner.d.ts.map +1 -0
  52. package/dist/core/scanner.js +310 -0
  53. package/dist/core/scanner.js.map +1 -0
  54. package/dist/core/scorer.d.ts +8 -0
  55. package/dist/core/scorer.d.ts.map +1 -0
  56. package/dist/core/scorer.js +76 -0
  57. package/dist/core/scorer.js.map +1 -0
  58. package/dist/core/validator.d.ts +134 -0
  59. package/dist/core/validator.d.ts.map +1 -0
  60. package/dist/core/validator.js +44 -0
  61. package/dist/core/validator.js.map +1 -0
  62. package/dist/core/verifier.d.ts +10 -0
  63. package/dist/core/verifier.d.ts.map +1 -0
  64. package/dist/core/verifier.js +30 -0
  65. package/dist/core/verifier.js.map +1 -0
  66. package/dist/core/writer.d.ts +15 -0
  67. package/dist/core/writer.d.ts.map +1 -0
  68. package/dist/core/writer.js +43 -0
  69. package/dist/core/writer.js.map +1 -0
  70. package/dist/generator/mocks/builder.d.ts +47 -0
  71. package/dist/generator/mocks/builder.d.ts.map +1 -0
  72. package/dist/generator/mocks/builder.js +335 -0
  73. package/dist/generator/mocks/builder.js.map +1 -0
  74. package/dist/generator/transforms/dialog-transform.d.ts +35 -0
  75. package/dist/generator/transforms/dialog-transform.d.ts.map +1 -0
  76. package/dist/generator/transforms/dialog-transform.js +293 -0
  77. package/dist/generator/transforms/dialog-transform.js.map +1 -0
  78. package/dist/index.d.ts +7 -0
  79. package/dist/index.d.ts.map +1 -0
  80. package/dist/index.js +18 -0
  81. package/dist/index.js.map +1 -0
  82. package/dist/learner/analyzer.d.ts +13 -0
  83. package/dist/learner/analyzer.d.ts.map +1 -0
  84. package/dist/learner/analyzer.js +484 -0
  85. package/dist/learner/analyzer.js.map +1 -0
  86. package/dist/learner/index.d.ts +66 -0
  87. package/dist/learner/index.d.ts.map +1 -0
  88. package/dist/learner/index.js +247 -0
  89. package/dist/learner/index.js.map +1 -0
  90. package/dist/learner/storage.d.ts +68 -0
  91. package/dist/learner/storage.d.ts.map +1 -0
  92. package/dist/learner/storage.js +201 -0
  93. package/dist/learner/storage.js.map +1 -0
  94. package/dist/learner/types.d.ts +41 -0
  95. package/dist/learner/types.d.ts.map +1 -0
  96. package/dist/learner/types.js +31 -0
  97. package/dist/learner/types.js.map +1 -0
  98. package/dist/parser/recorder-parser.d.ts +40 -0
  99. package/dist/parser/recorder-parser.d.ts.map +1 -0
  100. package/dist/parser/recorder-parser.js +139 -0
  101. package/dist/parser/recorder-parser.js.map +1 -0
  102. package/dist/parser/steps/deduplicator.d.ts +19 -0
  103. package/dist/parser/steps/deduplicator.d.ts.map +1 -0
  104. package/dist/parser/steps/deduplicator.js +75 -0
  105. package/dist/parser/steps/deduplicator.js.map +1 -0
  106. package/dist/parser/steps/dialog-detector.d.ts +38 -0
  107. package/dist/parser/steps/dialog-detector.d.ts.map +1 -0
  108. package/dist/parser/steps/dialog-detector.js +290 -0
  109. package/dist/parser/steps/dialog-detector.js.map +1 -0
  110. package/dist/parser/steps/noise-filter.d.ts +21 -0
  111. package/dist/parser/steps/noise-filter.d.ts.map +1 -0
  112. package/dist/parser/steps/noise-filter.js +138 -0
  113. package/dist/parser/steps/noise-filter.js.map +1 -0
  114. package/dist/scorer/index.d.ts +43 -0
  115. package/dist/scorer/index.d.ts.map +1 -0
  116. package/dist/scorer/index.js +82 -0
  117. package/dist/scorer/index.js.map +1 -0
  118. package/dist/scorer/post-verify.d.ts +17 -0
  119. package/dist/scorer/post-verify.d.ts.map +1 -0
  120. package/dist/scorer/post-verify.js +163 -0
  121. package/dist/scorer/post-verify.js.map +1 -0
  122. package/dist/scorer/pre-audit.d.ts +32 -0
  123. package/dist/scorer/pre-audit.d.ts.map +1 -0
  124. package/dist/scorer/pre-audit.js +99 -0
  125. package/dist/scorer/pre-audit.js.map +1 -0
  126. package/dist/scorer/quality-gates.d.ts +17 -0
  127. package/dist/scorer/quality-gates.d.ts.map +1 -0
  128. package/dist/scorer/quality-gates.js +304 -0
  129. package/dist/scorer/quality-gates.js.map +1 -0
  130. package/dist/scorer/types.d.ts +27 -0
  131. package/dist/scorer/types.d.ts.map +1 -0
  132. package/dist/scorer/types.js +5 -0
  133. package/dist/scorer/types.js.map +1 -0
  134. package/dist/templates/test-template.d.ts +21 -0
  135. package/dist/templates/test-template.d.ts.map +1 -0
  136. package/dist/templates/test-template.js +92 -0
  137. package/dist/templates/test-template.js.map +1 -0
  138. package/dist/types/conventions.d.ts +49 -0
  139. package/dist/types/conventions.d.ts.map +1 -0
  140. package/dist/types/conventions.js +13 -0
  141. package/dist/types/conventions.js.map +1 -0
  142. package/dist/types/recording.d.ts +143 -0
  143. package/dist/types/recording.d.ts.map +1 -0
  144. package/dist/types/recording.js +5 -0
  145. package/dist/types/recording.js.map +1 -0
  146. package/dist/types/score.d.ts +18 -0
  147. package/dist/types/score.d.ts.map +1 -0
  148. package/dist/types/score.js +2 -0
  149. package/dist/types/score.js.map +1 -0
  150. package/package.json +51 -0
@@ -0,0 +1,293 @@
1
+ /**
2
+ * Dialog transform - converts dialog flows into optimized test code
3
+ *
4
+ * This module transforms detected DialogFlow objects into cleaner,
5
+ * more maintainable test code with helper functions.
6
+ *
7
+ * Output:
8
+ * - openDialog() helper function
9
+ * - Test steps that call helper + fill fields
10
+ * - Optional close verification
11
+ */
12
+ /**
13
+ * Generate selector query code from a recording step
14
+ */
15
+ function generateSelectorQuery(step) {
16
+ const selector = step.selector || step.target || '';
17
+ if (!selector) {
18
+ return 'screen.getByRole("button")';
19
+ }
20
+ // Handle different selector types
21
+ if (selector.startsWith('#')) {
22
+ // ID selector
23
+ const id = selector.slice(1);
24
+ return `screen.getByRole("button", { name: /${id}/i })`;
25
+ }
26
+ if (selector.startsWith('.')) {
27
+ // Class selector - use getByTestId or find by text
28
+ const className = selector.slice(1).replace(/\./g, ' ');
29
+ return `screen.getByText(/${className}/i)`;
30
+ }
31
+ if (selector.includes('[data-testid=')) {
32
+ // data-testid selector
33
+ const match = selector.match(/\[data-testid=["']([^"']+)["']\]/);
34
+ if (match) {
35
+ return `screen.getByTestId("${match[1]}")`;
36
+ }
37
+ }
38
+ if (selector.includes('[')) {
39
+ // Attribute selector
40
+ const match = selector.match(/\[([^=]+)=["']([^"']+)["']\]/);
41
+ if (match) {
42
+ const attr = match[1];
43
+ const value = match[2];
44
+ return `screen.getByRole("button", { name: /${value}/i })`;
45
+ }
46
+ }
47
+ // Default: try to find by text content
48
+ const readableName = selector.split(/[#.\s]/).pop() || 'button';
49
+ return `screen.getByRole("button", { name: /${readableName}/i })`;
50
+ }
51
+ /**
52
+ * Generate the openDialog helper function
53
+ */
54
+ function generateOpenDialogHelper(flow) {
55
+ const triggerSelector = flow.triggerStep.selector || flow.triggerStep.target || '';
56
+ const triggerName = triggerSelector.split(/[#.\s]/).pop() || 'open';
57
+ // Build selector query
58
+ let triggerQuery = '';
59
+ if (triggerSelector.startsWith('#')) {
60
+ const id = triggerSelector.slice(1);
61
+ triggerQuery = `screen.getByRole('button', { name: /${id}/i })`;
62
+ }
63
+ else if (triggerSelector.includes('[data-testid=')) {
64
+ const match = triggerSelector.match(/\[data-testid=["']([^"']+)["']\]/);
65
+ if (match) {
66
+ triggerQuery = `screen.getByTestId("${match[1]}")`;
67
+ }
68
+ }
69
+ else {
70
+ triggerQuery = `screen.getByRole('button', { name: /${triggerName}/i })`;
71
+ }
72
+ // Determine dialog wait condition based on type
73
+ let waitCondition = '';
74
+ switch (flow.type) {
75
+ case 'modal':
76
+ waitCondition = `await waitFor(() => expect(screen.getByRole('dialog')).toBeInTheDocument())`;
77
+ break;
78
+ case 'drawer':
79
+ waitCondition = `await waitFor(() => expect(screen.getByTestId('drawer')).toBeInTheDocument())`;
80
+ break;
81
+ case 'popover':
82
+ waitCondition = `await waitFor(() => expect(screen.getByRole('tooltip')).toBeInTheDocument())`;
83
+ break;
84
+ case 'confirm':
85
+ waitCondition = `await waitFor(() => expect(screen.getByRole('alertdialog')).toBeInTheDocument())`;
86
+ break;
87
+ default:
88
+ waitCondition = `await waitFor(() => expect(screen.getByRole('dialog')).toBeInTheDocument())`;
89
+ }
90
+ return `const openDialog = async () => {
91
+ await userEvent.click(${triggerQuery});
92
+ ${waitCondition}
93
+ };`;
94
+ }
95
+ /**
96
+ * Generate field fill code from fill/select steps
97
+ */
98
+ function generateFillCode(step) {
99
+ const selector = step.selector || step.target || '';
100
+ const value = step.value || '';
101
+ // Build query for the field
102
+ let fieldQuery = '';
103
+ if (selector.includes('[data-testid=')) {
104
+ const match = selector.match(/\[data-testid=["']([^"']+)["']\]/);
105
+ if (match) {
106
+ fieldQuery = `screen.getByTestId("${match[1]}")`;
107
+ }
108
+ }
109
+ else if (selector.includes('[aria-label=')) {
110
+ const match = selector.match(/\[aria-label=["']([^"']+)["']\]/);
111
+ if (match) {
112
+ fieldQuery = `screen.getByLabelText(/${match[1]}/i)`;
113
+ }
114
+ }
115
+ else if (selector.includes('[name=')) {
116
+ const match = selector.match(/\[name=["']([^"']+)["']\]/);
117
+ if (match) {
118
+ fieldQuery = `screen.getByRole('textbox', { name: /${match[1]}/i })`;
119
+ }
120
+ }
121
+ else {
122
+ // Try to find by label
123
+ const labelMatch = selector.match(/label:(.+)/);
124
+ if (labelMatch) {
125
+ fieldQuery = `screen.getByLabelText(/${labelMatch[1]}/i)`;
126
+ }
127
+ else {
128
+ fieldQuery = `screen.getByRole('textbox')`;
129
+ }
130
+ }
131
+ if (step.type === 'fill') {
132
+ return `await userEvent.type(${fieldQuery}, '${value}');`;
133
+ }
134
+ if (step.type === 'select') {
135
+ return `await userEvent.selectOptions(${fieldQuery}, '${value}');`;
136
+ }
137
+ return '';
138
+ }
139
+ /**
140
+ * Generate submit button click code
141
+ */
142
+ function generateSubmitCode(step) {
143
+ const selector = step.selector || step.target || '';
144
+ let submitQuery = '';
145
+ if (selector.includes('[data-testid=')) {
146
+ const match = selector.match(/\[data-testid=["']([^"']+)["']\]/);
147
+ if (match) {
148
+ submitQuery = `screen.getByTestId("${match[1]}")`;
149
+ }
150
+ }
151
+ else {
152
+ // Try to find submit button
153
+ const submitPatterns = ['submit', 'save', 'confirm', 'apply'];
154
+ const pattern = submitPatterns.find(p => selector.toLowerCase().includes(p)) || 'submit';
155
+ submitQuery = `screen.getByRole('button', { name: /${pattern}/i })`;
156
+ }
157
+ return `await userEvent.click(${submitQuery});`;
158
+ }
159
+ /**
160
+ * Generate close dialog code
161
+ */
162
+ function generateCloseCode(step) {
163
+ // Try to find close button
164
+ const closePatterns = ['close', 'cancel', 'dismiss', 'esc'];
165
+ return `await userEvent.keyboard('{Escape}');`;
166
+ }
167
+ /**
168
+ * Generate assertion code
169
+ */
170
+ function generateAssertionCode(step) {
171
+ const selector = step.selector || step.target || '';
172
+ // Build query for assertion target
173
+ let assertQuery = '';
174
+ if (selector.includes('[data-testid=')) {
175
+ const match = selector.match(/\[data-testid=["']([^"']+)["']\]/);
176
+ if (match) {
177
+ assertQuery = `screen.getByTestId("${match[1]}")`;
178
+ }
179
+ }
180
+ else if (selector.includes('[role=')) {
181
+ const match = selector.match(/\[role=["']([^"']+)["']\]/);
182
+ if (match) {
183
+ assertQuery = `screen.getByRole('${match[1]}')`;
184
+ }
185
+ }
186
+ else {
187
+ // Default to finding visible element
188
+ assertQuery = `screen.getByText(/.+/)`;
189
+ }
190
+ if (step.type === 'assert') {
191
+ return `await waitFor(() => expect(${assertQuery}).toBeInTheDocument());`;
192
+ }
193
+ if (step.type === 'waitForSelector') {
194
+ return `await waitFor(() => expect(${assertQuery}).toBeInTheDocument());`;
195
+ }
196
+ return '';
197
+ }
198
+ /**
199
+ * Transform a single dialog flow into test code
200
+ */
201
+ function transformSingleFlow(flow) {
202
+ const helpers = [];
203
+ const testSteps = [];
204
+ const cleanup = [];
205
+ // Generate openDialog helper
206
+ helpers.push({
207
+ type: 'helper',
208
+ code: generateOpenDialogHelper(flow),
209
+ description: `Helper to open ${flow.type} dialog`,
210
+ });
211
+ // Generate test steps
212
+ // 1. Call openDialog helper
213
+ testSteps.push({
214
+ type: 'action',
215
+ code: 'await openDialog();',
216
+ description: 'Open the dialog',
217
+ });
218
+ // 2. Fill form fields in order
219
+ for (const fillStep of flow.contentSteps) {
220
+ const fillCode = generateFillCode(fillStep);
221
+ if (fillCode) {
222
+ testSteps.push({
223
+ type: 'action',
224
+ code: fillCode,
225
+ description: `Fill ${fillStep.type} field`,
226
+ });
227
+ }
228
+ }
229
+ // 3. Submit (if there's a click after filling)
230
+ const lastContentStep = flow.contentSteps[flow.contentSteps.length - 1];
231
+ if (lastContentStep && lastContentStep.type === 'fill') {
232
+ // Generate a submit button click
233
+ testSteps.push({
234
+ type: 'action',
235
+ code: "await userEvent.click(screen.getByRole('button', { name: /submit/i }));",
236
+ description: 'Submit the dialog',
237
+ });
238
+ }
239
+ // 4. Close dialog (if not already closed by submit)
240
+ if (flow.closeStep) {
241
+ cleanup.push({
242
+ type: 'action',
243
+ code: generateCloseCode(flow.closeStep),
244
+ description: 'Close the dialog',
245
+ });
246
+ }
247
+ // 5. Assertion (if present)
248
+ if (flow.assertionStep) {
249
+ testSteps.push({
250
+ type: 'assertion',
251
+ code: generateAssertionCode(flow.assertionStep),
252
+ description: 'Verify dialog state',
253
+ });
254
+ }
255
+ return { helpers, testSteps, cleanup };
256
+ }
257
+ /**
258
+ * Transform dialog flows into optimized test code
259
+ *
260
+ * @param flows - Array of detected dialog flows
261
+ * @returns Transformed steps ready for code generation
262
+ */
263
+ export function transformDialogFlows(flows) {
264
+ if (!flows || flows.length === 0) {
265
+ return [];
266
+ }
267
+ return flows.map(transformSingleFlow);
268
+ }
269
+ /**
270
+ * Generate complete test code from a dialog template
271
+ */
272
+ export function generateDialogTestCode(template) {
273
+ const lines = [];
274
+ // Add helpers
275
+ for (const helper of template.helpers) {
276
+ lines.push(helper.code);
277
+ lines.push('');
278
+ }
279
+ // Add test steps
280
+ for (const step of template.testSteps) {
281
+ lines.push(step.code);
282
+ }
283
+ // Add cleanup
284
+ if (template.cleanup && template.cleanup.length > 0) {
285
+ lines.push('');
286
+ for (const step of template.cleanup) {
287
+ lines.push(step.code);
288
+ }
289
+ }
290
+ return lines.join('\n');
291
+ }
292
+ export default transformDialogFlows;
293
+ //# sourceMappingURL=dialog-transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialog-transform.js","sourceRoot":"","sources":["../../../src/generator/transforms/dialog-transform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Taro CLI entry point
4
+ * Generates React Testing Library tests from Chrome Recorder exports.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
package/dist/index.js ADDED
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Taro CLI entry point
4
+ * Generates React Testing Library tests from Chrome Recorder exports.
5
+ */
6
+ import { Command } from 'commander';
7
+ import pc from 'picocolors';
8
+ import { createGenerateCommand } from './cli/commands/generate.js';
9
+ const program = new Command();
10
+ program
11
+ .name('taro')
12
+ .description(pc.bold('Taro') +
13
+ ' — Generate React Testing Library tests from Chrome Recorder exports')
14
+ .version('1.0.0', '-v, --version', 'Output the current version')
15
+ .helpOption('-h, --help', 'Display help for command');
16
+ program.addCommand(createGenerateCommand());
17
+ program.parse(process.argv);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,MAAM,YAAY,CAAA;AAC3B,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAElE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,MAAM,CAAC;KACZ,WAAW,CACV,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;IACb,sEAAsE,CACzE;KACA,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,4BAA4B,CAAC;KAC/D,UAAU,CAAC,YAAY,EAAE,0BAA0B,CAAC,CAAA;AAEvD,OAAO,CAAC,UAAU,CAAC,qBAAqB,EAAE,CAAC,CAAA;AAE3C,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Convention analyzer - extracts patterns from test files using AST analysis
3
+ */
4
+ import { TestConvention } from './types.js';
5
+ /**
6
+ * Analyze a single test file and extract conventions
7
+ */
8
+ export declare function analyzeTestFile(filePath: string): Partial<TestConvention>;
9
+ /**
10
+ * Extract conventions from all test files in a directory
11
+ */
12
+ export declare function extractConventions(testDir: string): TestConvention;
13
+ //# sourceMappingURL=analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../src/learner/analyzer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EACL,cAAc,EAQf,MAAM,YAAY,CAAC;AAsBpB;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CA8BzE;AAmXD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAgBlE"}