@marktoflow/gui 2.0.0-alpha.1 → 2.0.0-alpha.3

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 (74) hide show
  1. package/.turbo/turbo-build.log +7 -7
  2. package/README.md +38 -2
  3. package/dist/client/assets/index-C90Y_aBX.js +678 -0
  4. package/dist/client/assets/index-C90Y_aBX.js.map +1 -0
  5. package/dist/client/assets/index-CRWeQ3NN.css +1 -0
  6. package/dist/client/index.html +2 -2
  7. package/dist/server/server/index.js +1 -1
  8. package/dist/server/server/routes/tools.js +406 -0
  9. package/dist/server/server/routes/tools.js.map +1 -1
  10. package/dist/server/server/services/agents/codex-provider.js +270 -0
  11. package/dist/server/server/services/agents/codex-provider.js.map +1 -0
  12. package/dist/server/server/services/agents/prompts.js +27 -0
  13. package/dist/server/server/services/agents/prompts.js.map +1 -1
  14. package/dist/server/server/services/agents/registry.js +20 -0
  15. package/dist/server/server/services/agents/registry.js.map +1 -1
  16. package/package.json +6 -6
  17. package/src/client/components/Canvas/Canvas.tsx +24 -6
  18. package/src/client/components/Canvas/ForEachNode.tsx +128 -0
  19. package/src/client/components/Canvas/IfElseNode.tsx +126 -0
  20. package/src/client/components/Canvas/ParallelNode.tsx +140 -0
  21. package/src/client/components/Canvas/SwitchNode.tsx +164 -0
  22. package/src/client/components/Canvas/TransformNode.tsx +185 -0
  23. package/src/client/components/Canvas/TryCatchNode.tsx +164 -0
  24. package/src/client/components/Canvas/WhileNode.tsx +129 -0
  25. package/src/client/components/Canvas/index.ts +24 -0
  26. package/src/client/utils/serviceIcons.tsx +33 -0
  27. package/src/server/index.ts +1 -1
  28. package/src/server/routes/tools.ts +406 -0
  29. package/src/server/services/agents/codex-provider.ts +398 -0
  30. package/src/server/services/agents/prompts.ts +27 -0
  31. package/src/server/services/agents/registry.ts +21 -0
  32. package/tailwind.config.ts +1 -1
  33. package/tests/integration/api.test.ts +203 -1
  34. package/tests/integration/testApp.ts +1 -1
  35. package/tests/setup.ts +35 -0
  36. package/tests/unit/ForEachNode.test.tsx +218 -0
  37. package/tests/unit/IfElseNode.test.tsx +188 -0
  38. package/tests/unit/ParallelNode.test.tsx +264 -0
  39. package/tests/unit/SwitchNode.test.tsx +252 -0
  40. package/tests/unit/TransformNode.test.tsx +386 -0
  41. package/tests/unit/TryCatchNode.test.tsx +243 -0
  42. package/tests/unit/WhileNode.test.tsx +226 -0
  43. package/tests/unit/codexProvider.test.ts +399 -0
  44. package/tests/unit/serviceIcons.test.ts +197 -0
  45. package/.turbo/turbo-test.log +0 -22
  46. package/dist/client/assets/index-DwTI8opO.js +0 -608
  47. package/dist/client/assets/index-DwTI8opO.js.map +0 -1
  48. package/dist/client/assets/index-RoEdL6gO.css +0 -1
  49. package/dist/server/index.d.ts +0 -3
  50. package/dist/server/index.d.ts.map +0 -1
  51. package/dist/server/index.js +0 -56
  52. package/dist/server/index.js.map +0 -1
  53. package/dist/server/routes/ai.js +0 -50
  54. package/dist/server/routes/ai.js.map +0 -1
  55. package/dist/server/routes/execute.js +0 -62
  56. package/dist/server/routes/execute.js.map +0 -1
  57. package/dist/server/routes/workflows.js +0 -99
  58. package/dist/server/routes/workflows.js.map +0 -1
  59. package/dist/server/services/AIService.d.ts +0 -30
  60. package/dist/server/services/AIService.d.ts.map +0 -1
  61. package/dist/server/services/AIService.js +0 -216
  62. package/dist/server/services/AIService.js.map +0 -1
  63. package/dist/server/services/FileWatcher.d.ts +0 -10
  64. package/dist/server/services/FileWatcher.d.ts.map +0 -1
  65. package/dist/server/services/FileWatcher.js +0 -62
  66. package/dist/server/services/FileWatcher.js.map +0 -1
  67. package/dist/server/services/WorkflowService.d.ts +0 -54
  68. package/dist/server/services/WorkflowService.d.ts.map +0 -1
  69. package/dist/server/services/WorkflowService.js +0 -323
  70. package/dist/server/services/WorkflowService.js.map +0 -1
  71. package/dist/server/websocket/index.d.ts +0 -10
  72. package/dist/server/websocket/index.d.ts.map +0 -1
  73. package/dist/server/websocket/index.js +0 -85
  74. package/dist/server/websocket/index.js.map +0 -1
@@ -1,216 +0,0 @@
1
- import Anthropic from '@anthropic-ai/sdk';
2
- import { stringify as yamlStringify, parse as yamlParse } from 'yaml';
3
- const SYSTEM_PROMPT = `You are an expert workflow automation assistant for Marktoflow, a markdown-based workflow automation framework.
4
-
5
- Your role is to help users modify their workflows based on natural language requests. You should:
6
-
7
- 1. Understand the current workflow structure (YAML frontmatter with steps, inputs, tools)
8
- 2. Make precise modifications based on user requests
9
- 3. Explain what changes you made and why
10
-
11
- When modifying workflows, follow these conventions:
12
- - Each step has: id, name (optional), action (service.method), inputs, output_variable
13
- - Actions use format: service.method (e.g., slack.chat.postMessage, github.pulls.get)
14
- - Template variables use: {{ variable_name }} syntax
15
- - Error handling can specify: action (stop/continue/retry), max_retries
16
- - Conditions use JavaScript-like expressions
17
-
18
- Available services: slack, github, jira, gmail, outlook, linear, notion, discord, airtable, confluence, http, claude, opencode, ollama
19
-
20
- Respond with:
21
- 1. A brief explanation of the changes
22
- 2. The complete modified workflow in valid YAML format
23
-
24
- Be concise and precise. Only make the requested changes.`;
25
- export class AIService {
26
- history = [];
27
- anthropic = null;
28
- constructor() {
29
- const apiKey = process.env.ANTHROPIC_API_KEY;
30
- if (apiKey) {
31
- this.anthropic = new Anthropic({ apiKey });
32
- }
33
- }
34
- async processPrompt(prompt, workflow) {
35
- if (!this.anthropic) {
36
- // Demo mode: simulate AI response
37
- return this.simulateResponse(prompt, workflow);
38
- }
39
- try {
40
- // Convert workflow to YAML for better readability
41
- const workflowYaml = yamlStringify(workflow, { indent: 2, lineWidth: 0 });
42
- const response = await this.anthropic.messages.create({
43
- model: 'claude-sonnet-4-20250514',
44
- max_tokens: 4096,
45
- system: SYSTEM_PROMPT,
46
- messages: [
47
- {
48
- role: 'user',
49
- content: `Current workflow:\n\`\`\`yaml\n${workflowYaml}\n\`\`\`\n\nUser request: ${prompt}`,
50
- },
51
- ],
52
- });
53
- // Parse the response
54
- const responseText = response.content
55
- .filter((block) => block.type === 'text')
56
- .map((block) => block.text)
57
- .join('');
58
- // Extract explanation and workflow from response
59
- const result = this.parseAIResponse(responseText, workflow);
60
- this.history.unshift({
61
- prompt,
62
- response: result.explanation,
63
- timestamp: new Date(),
64
- success: true,
65
- });
66
- return result;
67
- }
68
- catch (error) {
69
- this.history.unshift({
70
- prompt,
71
- response: error instanceof Error ? error.message : 'Unknown error',
72
- timestamp: new Date(),
73
- success: false,
74
- });
75
- throw error;
76
- }
77
- }
78
- parseAIResponse(responseText, originalWorkflow) {
79
- // Try to extract YAML from the response
80
- const yamlMatch = responseText.match(/```yaml\n([\s\S]*?)\n```/);
81
- let modifiedWorkflow;
82
- let explanation = responseText;
83
- if (yamlMatch) {
84
- try {
85
- const parsedYaml = yamlParse(yamlMatch[1]);
86
- // Validate that it has the expected workflow structure
87
- if (parsedYaml && (parsedYaml.steps || parsedYaml.metadata)) {
88
- modifiedWorkflow = parsedYaml;
89
- // Extract explanation (text before the YAML block)
90
- const explanationMatch = responseText.match(/^([\s\S]*?)```yaml/);
91
- if (explanationMatch) {
92
- explanation = explanationMatch[1].trim();
93
- }
94
- }
95
- }
96
- catch {
97
- // Failed to parse YAML, return just the explanation
98
- }
99
- }
100
- // Generate diff if we have a modified workflow
101
- let diff;
102
- if (modifiedWorkflow) {
103
- diff = this.generateDiff(originalWorkflow, modifiedWorkflow);
104
- }
105
- return {
106
- explanation,
107
- workflow: modifiedWorkflow,
108
- diff,
109
- };
110
- }
111
- generateDiff(original, modified) {
112
- const originalStepIds = new Set(original.steps?.map((s) => s.id) || []);
113
- const modifiedStepIds = new Set(modified.steps?.map((s) => s.id) || []);
114
- const added = modified.steps?.filter((s) => !originalStepIds.has(s.id)) || [];
115
- const removed = original.steps?.filter((s) => !modifiedStepIds.has(s.id)) || [];
116
- let diff = '';
117
- if (added.length > 0) {
118
- diff += `+ Added ${added.length} step(s): ${added.map((s) => s.name || s.id).join(', ')}\n`;
119
- }
120
- if (removed.length > 0) {
121
- diff += `- Removed ${removed.length} step(s): ${removed.map((s) => s.name || s.id).join(', ')}\n`;
122
- }
123
- return diff || 'No structural changes detected';
124
- }
125
- async getHistory() {
126
- return this.history.slice(0, 20);
127
- }
128
- async getSuggestions(workflow, selectedStepId) {
129
- const suggestions = [];
130
- if (!workflow || !workflow.steps) {
131
- return [
132
- 'Add your first step',
133
- 'Import a template workflow',
134
- 'Connect to a service',
135
- ];
136
- }
137
- // Generic suggestions
138
- suggestions.push('Add error handling to all steps', 'Add a notification step at the end', 'Convert steps to a sub-workflow');
139
- // Step-specific suggestions
140
- if (selectedStepId) {
141
- const step = workflow.steps.find((s) => s.id === selectedStepId);
142
- if (step) {
143
- if (!step.errorHandling) {
144
- suggestions.push(`Add retry logic to "${step.name || step.id}"`);
145
- }
146
- suggestions.push(`Add a condition to "${step.name || step.id}"`, `Duplicate "${step.name || step.id}"`);
147
- }
148
- }
149
- return suggestions.slice(0, 5);
150
- }
151
- simulateResponse(prompt, workflow) {
152
- const promptLower = prompt.toLowerCase();
153
- let explanation = '';
154
- let modifiedWorkflow = { ...workflow, steps: [...(workflow.steps || [])] };
155
- // Simple pattern matching for demo purposes
156
- if (promptLower.includes('add') && promptLower.includes('slack')) {
157
- const newStep = {
158
- id: `slack-${Date.now()}`,
159
- name: 'Send Slack Notification',
160
- action: 'slack.chat.postMessage',
161
- inputs: {
162
- channel: '#general',
163
- text: 'Workflow completed successfully!',
164
- },
165
- outputVariable: 'slack_result',
166
- };
167
- modifiedWorkflow.steps.push(newStep);
168
- explanation = 'Added a new Slack notification step at the end of the workflow. The message will be sent to #general channel.';
169
- }
170
- else if (promptLower.includes('add') && promptLower.includes('error')) {
171
- modifiedWorkflow.steps = modifiedWorkflow.steps.map((step) => ({
172
- ...step,
173
- errorHandling: {
174
- action: 'retry',
175
- maxRetries: 3,
176
- },
177
- }));
178
- explanation = 'Added error handling with 3 retries to all steps in the workflow.';
179
- }
180
- else if (promptLower.includes('add') && promptLower.includes('condition')) {
181
- if (modifiedWorkflow.steps.length > 0) {
182
- modifiedWorkflow.steps[modifiedWorkflow.steps.length - 1] = {
183
- ...modifiedWorkflow.steps[modifiedWorkflow.steps.length - 1],
184
- conditions: ['{{ previous_step.success === true }}'],
185
- };
186
- explanation = 'Added a condition to the last step to only run if the previous step succeeded.';
187
- }
188
- else {
189
- explanation = 'No steps to add conditions to. Please add some steps first.';
190
- }
191
- }
192
- else if (promptLower.includes('remove') || promptLower.includes('delete')) {
193
- if (modifiedWorkflow.steps.length > 0) {
194
- const removed = modifiedWorkflow.steps.pop();
195
- explanation = `Removed the last step "${removed?.name || removed?.id}" from the workflow.`;
196
- }
197
- else {
198
- explanation = 'No steps to remove.';
199
- }
200
- }
201
- else {
202
- explanation = `I understood your request: "${prompt}". In a full implementation, I would analyze the workflow and make the appropriate modifications. For now, this is running in demo mode without an API key.`;
203
- }
204
- this.history.unshift({
205
- prompt,
206
- response: explanation,
207
- timestamp: new Date(),
208
- success: true,
209
- });
210
- return {
211
- explanation,
212
- workflow: modifiedWorkflow,
213
- };
214
- }
215
- }
216
- //# sourceMappingURL=AIService.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AIService.js","sourceRoot":"","sources":["../../../src/server/services/AIService.ts"],"names":[],"mappings":"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"}
@@ -1,10 +0,0 @@
1
- import type { Server as SocketIOServer } from 'socket.io';
2
- export declare class FileWatcher {
3
- private watcher;
4
- private io;
5
- private baseDir;
6
- constructor(baseDir: string, io: SocketIOServer);
7
- private setupListeners;
8
- stop(): void;
9
- }
10
- //# sourceMappingURL=FileWatcher.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"FileWatcher.d.ts","sourceRoot":"","sources":["../../../src/server/services/FileWatcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,IAAI,cAAc,EAAE,MAAM,WAAW,CAAC;AAG1D,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,EAAE,CAAiB;IAC3B,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,cAAc;IAyB/C,OAAO,CAAC,cAAc;IAiCtB,IAAI;CAIL"}
@@ -1,62 +0,0 @@
1
- import { watch } from 'chokidar';
2
- export class FileWatcher {
3
- watcher;
4
- io;
5
- baseDir;
6
- constructor(baseDir, io) {
7
- this.baseDir = baseDir;
8
- this.io = io;
9
- // Watch for workflow files
10
- this.watcher = watch(['**/*.md', '**/*.yaml', '**/*.yml'], {
11
- cwd: baseDir,
12
- ignored: [
13
- '**/node_modules/**',
14
- '**/dist/**',
15
- '**/.git/**',
16
- '**/.*',
17
- ],
18
- persistent: true,
19
- ignoreInitial: true,
20
- awaitWriteFinish: {
21
- stabilityThreshold: 300,
22
- pollInterval: 100,
23
- },
24
- });
25
- this.setupListeners();
26
- console.log(`File watcher started for: ${baseDir}`);
27
- }
28
- setupListeners() {
29
- this.watcher.on('change', (path) => {
30
- console.log(`File changed: ${path}`);
31
- this.io.emit('workflow:updated', {
32
- path,
33
- event: 'change',
34
- timestamp: new Date().toISOString(),
35
- });
36
- });
37
- this.watcher.on('add', (path) => {
38
- console.log(`File added: ${path}`);
39
- this.io.emit('workflow:updated', {
40
- path,
41
- event: 'add',
42
- timestamp: new Date().toISOString(),
43
- });
44
- });
45
- this.watcher.on('unlink', (path) => {
46
- console.log(`File removed: ${path}`);
47
- this.io.emit('workflow:updated', {
48
- path,
49
- event: 'remove',
50
- timestamp: new Date().toISOString(),
51
- });
52
- });
53
- this.watcher.on('error', (error) => {
54
- console.error('File watcher error:', error);
55
- });
56
- }
57
- stop() {
58
- this.watcher.close();
59
- console.log('File watcher stopped');
60
- }
61
- }
62
- //# sourceMappingURL=FileWatcher.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"FileWatcher.js","sourceRoot":"","sources":["../../../src/server/services/FileWatcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAkB,MAAM,UAAU,CAAC;AAIjD,MAAM,OAAO,WAAW;IACd,OAAO,CAAY;IACnB,EAAE,CAAiB;IACnB,OAAO,CAAS;IAExB,YAAY,OAAe,EAAE,EAAkB;QAC7C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QAEb,2BAA2B;QAC3B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE;YACzD,GAAG,EAAE,OAAO;YACZ,OAAO,EAAE;gBACP,oBAAoB;gBACpB,YAAY;gBACZ,YAAY;gBACZ,OAAO;aACR;YACD,UAAU,EAAE,IAAI;YAChB,aAAa,EAAE,IAAI;YACnB,gBAAgB,EAAE;gBAChB,kBAAkB,EAAE,GAAG;gBACvB,YAAY,EAAE,GAAG;aAClB;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,6BAA6B,OAAO,EAAE,CAAC,CAAC;IACtD,CAAC;IAEO,cAAc;QACpB,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;YACjC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;YACrC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE;gBAC/B,IAAI;gBACJ,KAAK,EAAE,QAAQ;gBACf,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE;YAC9B,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC;YACnC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE;gBAC/B,IAAI;gBACJ,KAAK,EAAE,KAAK;gBACZ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;YACjC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;YACrC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE;gBAC/B,IAAI;gBACJ,KAAK,EAAE,QAAQ;gBACf,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjC,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI;QACF,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACtC,CAAC;CACF"}
@@ -1,54 +0,0 @@
1
- interface WorkflowListItem {
2
- path: string;
3
- name: string;
4
- description?: string;
5
- version?: string;
6
- }
7
- interface WorkflowMetadata {
8
- id: string;
9
- name: string;
10
- version?: string;
11
- description?: string;
12
- author?: string;
13
- tags?: string[];
14
- }
15
- interface WorkflowStep {
16
- id: string;
17
- name?: string;
18
- action?: string;
19
- workflow?: string;
20
- inputs: Record<string, unknown>;
21
- outputVariable?: string;
22
- conditions?: string[];
23
- errorHandling?: {
24
- action: 'stop' | 'continue' | 'retry';
25
- maxRetries?: number;
26
- retryDelay?: number;
27
- fallbackStep?: string;
28
- };
29
- timeout?: number;
30
- }
31
- interface Workflow {
32
- metadata: WorkflowMetadata;
33
- steps: WorkflowStep[];
34
- tools?: Record<string, unknown>;
35
- inputs?: Record<string, unknown>;
36
- triggers?: unknown[];
37
- }
38
- export declare class WorkflowService {
39
- private workflowDir;
40
- constructor(workflowDir?: string);
41
- listWorkflows(): Promise<WorkflowListItem[]>;
42
- getWorkflow(workflowPath: string): Promise<Workflow | null>;
43
- createWorkflow(name: string, template?: string): Promise<WorkflowListItem>;
44
- updateWorkflow(workflowPath: string, workflow: Workflow): Promise<Workflow>;
45
- deleteWorkflow(workflowPath: string): Promise<void>;
46
- getExecutionHistory(workflowPath: string): Promise<unknown[]>;
47
- private resolvePath;
48
- private parseWorkflow;
49
- private parseStep;
50
- private serializeWorkflow;
51
- private generateWorkflowTemplate;
52
- }
53
- export {};
54
- //# sourceMappingURL=WorkflowService.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"WorkflowService.d.ts","sourceRoot":"","sources":["../../../src/server/services/WorkflowService.ts"],"names":[],"mappings":"AASA,UAAU,gBAAgB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,gBAAgB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,UAAU,YAAY;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,CAAC,EAAE;QACd,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC;QACtC,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,QAAQ;IAChB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;CACtB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,CAAC,EAAE,MAAM;IAI1B,aAAa,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IA+C5C,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAgB3D,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAiB1E,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAkB3E,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOnD,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAMnE,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,aAAa;IA0ErB,OAAO,CAAC,SAAS;IA8CjB,OAAO,CAAC,iBAAiB;IAyDzB,OAAO,CAAC,wBAAwB;CAmCjC"}