@wix/astro 0.2.13 → 0.2.15
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/components/TailwindEditor/EditorPanel.d.ts +11 -0
- package/dist/components/TailwindEditor/EditorPanel.js +86 -0
- package/dist/components/TailwindEditor/dev-toolbar-app.d.ts +14 -0
- package/dist/components/TailwindEditor/dev-toolbar-app.js +39 -0
- package/dist/components/TailwindEditor/dev-toolbar.d.ts +13 -0
- package/dist/components/TailwindEditor/dev-toolbar.js +547 -0
- package/dist/components/TailwindEditor/index.d.ts +5 -0
- package/dist/components/TailwindEditor/index.js +155 -0
- package/dist/components/TailwindEditor/integration.d.ts +3 -0
- package/dist/components/TailwindEditor/integration.js +18 -0
- package/dist/components/TailwindEditor/types.d.ts +35 -0
- package/dist/components/TailwindEditor/types.js +2 -0
- package/dist/components/TailwindEditor/utils.d.ts +22 -0
- package/dist/components/TailwindEditor/utils.js +234 -0
- package/dist/components/login-helpers/bi-header-generator.d.ts +11 -0
- package/dist/components/login-helpers/bi-header-generator.js +18 -0
- package/dist/components/login-helpers/iframeUtils.d.ts +4 -0
- package/dist/components/login-helpers/iframeUtils.js +44 -0
- package/dist/components/login-helpers/login-helpers.d.ts +39 -0
- package/dist/components/login-helpers/login-helpers.js +117 -0
- package/dist/dev-toolbar/Editor/EditorPanel.d.ts +14 -0
- package/dist/dev-toolbar/Editor/EditorPanel.js +1273 -0
- package/dist/dev-toolbar/Editor/classes.d.ts +12 -0
- package/dist/dev-toolbar/Editor/classes.js +271 -0
- package/dist/dev-toolbar/Editor/dnd.d.ts +34 -0
- package/dist/dev-toolbar/Editor/dnd.js +1161 -0
- package/dist/dev-toolbar/Editor/index.d.ts +5 -0
- package/dist/dev-toolbar/Editor/index.js +136 -0
- package/dist/dev-toolbar/Editor/types.d.ts +42 -0
- package/dist/dev-toolbar/Editor/types.js +2 -0
- package/dist/dev-toolbar/agent-chat.d.ts +14 -0
- package/dist/dev-toolbar/agent-chat.js +362 -0
- package/dist/dev-toolbar/ai-agent-server.d.ts +1 -0
- package/dist/dev-toolbar/ai-agent-server.js +174 -0
- package/dist/dev-toolbar/ai-agent.d.ts +2 -0
- package/dist/dev-toolbar/ai-agent.js +171 -0
- package/dist/dev-toolbar/api-key-form.d.ts +7 -0
- package/dist/dev-toolbar/api-key-form.js +138 -0
- package/dist/dev-toolbar/astro-toolbar.d.ts +1156 -0
- package/dist/dev-toolbar/astro-toolbar.js +29 -0
- package/dist/dev-toolbar/editor.d.ts +2 -0
- package/dist/dev-toolbar/editor.js +19 -0
- package/dist/integration.d.ts +3 -1
- package/dist/integration.js +41 -10
- package/dist/routes/auth/callback.js +1 -1
- package/dist/src/auth-context.d.ts +5 -0
- package/dist/src/auth-context.js +3 -0
- package/dist/src/client.d.ts +15 -0
- package/dist/src/client.js +17 -0
- package/dist/src/entrypoints/server.d.ts +13 -0
- package/dist/src/entrypoints/server.js +37 -0
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.js +5 -0
- package/dist/src/integration.d.ts +8 -0
- package/dist/src/integration.js +229 -0
- package/dist/src/loaders/blog.d.ts +2 -0
- package/dist/src/loaders/blog.js +49 -0
- package/dist/src/loaders/index.d.ts +2 -0
- package/dist/src/loaders/index.js +3 -0
- package/dist/src/middleware.d.ts +2 -0
- package/dist/src/middleware.js +90 -0
- package/dist/src/routes/auth/callback.d.ts +3 -0
- package/dist/src/routes/auth/callback.js +53 -0
- package/dist/src/routes/auth/constants.d.ts +5 -0
- package/dist/src/routes/auth/constants.js +6 -0
- package/dist/src/routes/auth/login.d.ts +3 -0
- package/dist/src/routes/auth/login.js +27 -0
- package/dist/src/routes/auth/logout-callback.d.ts +3 -0
- package/dist/src/routes/auth/logout-callback.js +10 -0
- package/dist/src/routes/auth/logout.d.ts +3 -0
- package/dist/src/routes/auth/logout.js +11 -0
- package/dist/src/routes/auth/runtime.d.ts +5 -0
- package/dist/src/routes/auth/runtime.js +8 -0
- package/dist/src/runtime.d.ts +2 -0
- package/dist/src/runtime.js +9 -0
- package/dist/src/vite-plugins/sdk-context.d.ts +4 -0
- package/dist/src/vite-plugins/sdk-context.js +68 -0
- package/dist/vite-plugins/sdk-context.d.ts +3 -1
- package/dist/vite-plugins/sdk-context.js +51 -70
- package/package.json +6 -3
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { loadEnv } from 'vite';
|
|
4
|
+
import { Anthropic } from '@anthropic-ai/sdk';
|
|
5
|
+
// Check if Anthropic API key exists in environment variables
|
|
6
|
+
function checkAnthropicApiKey() {
|
|
7
|
+
const env = loadEnv(process.env["NODE_ENV"] ?? "development", process.cwd(), "");
|
|
8
|
+
return env["ANTHROPIC_API_KEY"] || null;
|
|
9
|
+
}
|
|
10
|
+
// Save API key to .env.local file
|
|
11
|
+
async function saveApiKey(apiKey) {
|
|
12
|
+
try {
|
|
13
|
+
const envFilePath = path.join(process.cwd(), '.env.local');
|
|
14
|
+
// Check if file exists and read its contents
|
|
15
|
+
let contents = '';
|
|
16
|
+
try {
|
|
17
|
+
contents = await fs.promises.readFile(envFilePath, 'utf-8');
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
// File doesn't exist, create a new one
|
|
21
|
+
contents = '';
|
|
22
|
+
}
|
|
23
|
+
// Check if ANTHROPIC_API_KEY already exists in the file
|
|
24
|
+
const keyRegex = /^ANTHROPIC_API_KEY=.*/m;
|
|
25
|
+
if (keyRegex.test(contents)) {
|
|
26
|
+
// Replace existing key
|
|
27
|
+
contents = contents.replace(keyRegex, `ANTHROPIC_API_KEY=${apiKey}`);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
// Add new key
|
|
31
|
+
contents += `\nANTHROPIC_API_KEY=${apiKey}\n`;
|
|
32
|
+
}
|
|
33
|
+
// Write to file
|
|
34
|
+
await fs.promises.writeFile(envFilePath, contents);
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
console.error('Error saving API key:', error);
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Send message to Anthropic using the SDK
|
|
43
|
+
async function sendMessageToAnthropic(apiKey, messages, maxTokens = 1024) {
|
|
44
|
+
try {
|
|
45
|
+
// Initialize the Anthropic client with the API key
|
|
46
|
+
const anthropic = new Anthropic({
|
|
47
|
+
apiKey: apiKey,
|
|
48
|
+
});
|
|
49
|
+
// Convert our messages to Anthropic's format properly typed for the SDK
|
|
50
|
+
const anthropicMessages = messages
|
|
51
|
+
.filter(msg => msg.role === 'user' || msg.role === 'assistant')
|
|
52
|
+
.map(msg => ({
|
|
53
|
+
role: msg.role === 'user' ? 'user' : 'assistant',
|
|
54
|
+
content: msg.content
|
|
55
|
+
}));
|
|
56
|
+
// Send the message to Anthropic API using the SDK
|
|
57
|
+
const message = await anthropic.messages.create({
|
|
58
|
+
model: 'claude-3-7-sonnet-latest',
|
|
59
|
+
messages: anthropicMessages,
|
|
60
|
+
max_tokens: maxTokens,
|
|
61
|
+
});
|
|
62
|
+
// Extract the text content from the response
|
|
63
|
+
let responseText = 'I received your message but can only respond with text at the moment.';
|
|
64
|
+
// Safely access content if it exists
|
|
65
|
+
if (message.content && message.content.length > 0) {
|
|
66
|
+
const firstContent = message.content[0];
|
|
67
|
+
if (firstContent && firstContent.type === 'text' && 'text' in firstContent) {
|
|
68
|
+
responseText = firstContent.text;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Return in our Message format
|
|
72
|
+
return {
|
|
73
|
+
role: 'assistant',
|
|
74
|
+
content: responseText
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
console.error('Error communicating with Anthropic API:', error);
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Function to setup server-side handlers for the AI agent
|
|
83
|
+
export function setupAIAgentServer(toolbar) {
|
|
84
|
+
console.log('Setting up AI Agent server');
|
|
85
|
+
// Store conversation history
|
|
86
|
+
const conversationHistory = [];
|
|
87
|
+
// Listen for the client initialization request and check API key
|
|
88
|
+
toolbar.on('wix-ai-agent:initialized', () => {
|
|
89
|
+
console.log('Checking for Anthropic API key...');
|
|
90
|
+
const apiKey = checkAnthropicApiKey();
|
|
91
|
+
if (apiKey) {
|
|
92
|
+
console.log('API key found, sending initial messages');
|
|
93
|
+
toolbar.send('wix-ai-agent:api-key-status', { exists: true });
|
|
94
|
+
// Add welcome message to history
|
|
95
|
+
const welcomeMessage = {
|
|
96
|
+
role: 'assistant',
|
|
97
|
+
content: 'Hello! I am the Wix AI Assistant. How can I help you with your Astro site today?'
|
|
98
|
+
};
|
|
99
|
+
conversationHistory.push(welcomeMessage);
|
|
100
|
+
// Send the welcome message to the client
|
|
101
|
+
toolbar.send('wix-ai-agent:response', { message: welcomeMessage });
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
console.log('API key not found, requesting from user');
|
|
105
|
+
toolbar.send('wix-ai-agent:api-key-status', { exists: false });
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
// Handle API key submission
|
|
109
|
+
toolbar.on('wix-ai-agent:save-api-key', async (data) => {
|
|
110
|
+
console.log('Received API key from user');
|
|
111
|
+
const success = await saveApiKey(data.apiKey);
|
|
112
|
+
if (success) {
|
|
113
|
+
console.log('API key saved successfully');
|
|
114
|
+
toolbar.send('wix-ai-agent:api-key-saved', { success: true });
|
|
115
|
+
// Add welcome message to history
|
|
116
|
+
const welcomeMessage = {
|
|
117
|
+
role: 'assistant',
|
|
118
|
+
content: 'Thank you! Your API key has been saved. How can I help you with your Astro site today?'
|
|
119
|
+
};
|
|
120
|
+
conversationHistory.push(welcomeMessage);
|
|
121
|
+
// Send the welcome message to the client
|
|
122
|
+
toolbar.send('wix-ai-agent:response', { message: welcomeMessage });
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
console.log('Failed to save API key');
|
|
126
|
+
toolbar.send('wix-ai-agent:api-key-saved', { success: false, error: 'Failed to save API key' });
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
// Handle user messages
|
|
130
|
+
toolbar.on('wix-ai-agent:user-message', async (data) => {
|
|
131
|
+
console.log('Received message from user:', data.message);
|
|
132
|
+
// Add user message to conversation history
|
|
133
|
+
const userMessage = {
|
|
134
|
+
role: 'user',
|
|
135
|
+
content: data.message
|
|
136
|
+
};
|
|
137
|
+
conversationHistory.push(userMessage);
|
|
138
|
+
// Send a "thinking" status to the client
|
|
139
|
+
toolbar.send('wix-ai-agent:thinking', { isThinking: true });
|
|
140
|
+
try {
|
|
141
|
+
// Get API key
|
|
142
|
+
const apiKey = checkAnthropicApiKey();
|
|
143
|
+
if (!apiKey) {
|
|
144
|
+
throw new Error('API key not found');
|
|
145
|
+
}
|
|
146
|
+
// Send message to Anthropic API
|
|
147
|
+
const aiResponse = await sendMessageToAnthropic(apiKey, conversationHistory);
|
|
148
|
+
if (aiResponse) {
|
|
149
|
+
// Add AI response to conversation history
|
|
150
|
+
conversationHistory.push(aiResponse);
|
|
151
|
+
// Send response back to client
|
|
152
|
+
toolbar.send('wix-ai-agent:response', { message: aiResponse });
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
throw new Error('Failed to get response from Anthropic API');
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
console.error('Error processing message:', error);
|
|
160
|
+
// Send error message to client
|
|
161
|
+
const errorMessage = {
|
|
162
|
+
role: 'assistant',
|
|
163
|
+
content: `Sorry, I encountered an error: ${error instanceof Error ? error.message : 'Unknown error'}`
|
|
164
|
+
};
|
|
165
|
+
conversationHistory.push(errorMessage);
|
|
166
|
+
toolbar.send('wix-ai-agent:response', { message: errorMessage });
|
|
167
|
+
}
|
|
168
|
+
finally {
|
|
169
|
+
// End thinking status
|
|
170
|
+
toolbar.send('wix-ai-agent:thinking', { isThinking: false });
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktYWdlbnQtc2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Rldi10b29sYmFyL2FpLWFnZW50LXNlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekIsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTlDLDZEQUE2RDtBQUM3RCxTQUFTLG9CQUFvQjtJQUMzQixNQUFNLEdBQUcsR0FBRyxPQUFPLENBQ2pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksYUFBYSxFQUN4QyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQ2IsRUFBRSxDQUNILENBQUM7SUFFRixPQUFPLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLElBQUksQ0FBQztBQUMxQyxDQUFDO0FBRUQsa0NBQWtDO0FBQ2xDLEtBQUssVUFBVSxVQUFVLENBQUMsTUFBYztJQUN0QyxJQUFJLENBQUM7UUFDSCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUUzRCw2Q0FBNkM7UUFDN0MsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQztZQUNILFFBQVEsR0FBRyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLHVDQUF1QztZQUN2QyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLENBQUM7UUFFRCx3REFBd0Q7UUFDeEQsTUFBTSxRQUFRLEdBQUcsd0JBQXdCLENBQUM7UUFDMUMsSUFB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
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { defineToolbarApp } from "astro/toolbar";
|
|
2
|
+
import React, { useState, useEffect } from "react";
|
|
3
|
+
import { createRoot } from "react-dom/client";
|
|
4
|
+
import { AgentChat } from "./agent-chat.js";
|
|
5
|
+
import { AstroIcon } from "./astro-toolbar.js";
|
|
6
|
+
import { ApiKeyForm } from "./api-key-form.js";
|
|
7
|
+
// Agent component that manages the state and UI
|
|
8
|
+
function Agent({ server }) {
|
|
9
|
+
const [messages, setMessages] = useState([]);
|
|
10
|
+
const [isSavingApiKey, setIsSavingApiKey] = useState(false);
|
|
11
|
+
const [apiKey, setApiKey] = useState(null);
|
|
12
|
+
const [error, setError] = useState('');
|
|
13
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
14
|
+
const [isTyping, setIsTyping] = useState(false);
|
|
15
|
+
const [isInitialized, setIsInitialized] = useState(false);
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
if (!isInitialized) {
|
|
18
|
+
// Tell the server the AI agent has been initialized
|
|
19
|
+
server.send('wix-ai-agent:initialized', {});
|
|
20
|
+
// Listen for API key status
|
|
21
|
+
const handleApiKeyStatus = (data) => {
|
|
22
|
+
if (data.exists) {
|
|
23
|
+
setApiKey(data.apiKey || 'placeholder-for-ui');
|
|
24
|
+
}
|
|
25
|
+
setIsLoading(false);
|
|
26
|
+
setIsInitialized(true);
|
|
27
|
+
};
|
|
28
|
+
// Listen for API key save response
|
|
29
|
+
const handleApiKeySaved = (data) => {
|
|
30
|
+
setIsSavingApiKey(false);
|
|
31
|
+
if (data.success) {
|
|
32
|
+
setApiKey('placeholder-for-ui');
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
console.error('Failed to save API key:', data.error);
|
|
36
|
+
setError(data.error || 'Failed to save API key');
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
// Listen for responses to messages
|
|
40
|
+
const handleResponse = (data) => {
|
|
41
|
+
setIsTyping(false);
|
|
42
|
+
setMessages(prevMessages => [...prevMessages, data.message]);
|
|
43
|
+
};
|
|
44
|
+
// Listen for thinking status
|
|
45
|
+
const handleThinking = (data) => {
|
|
46
|
+
setIsTyping(data.isThinking);
|
|
47
|
+
};
|
|
48
|
+
server.on('wix-ai-agent:api-key-status', handleApiKeyStatus);
|
|
49
|
+
server.on('wix-ai-agent:api-key-saved', handleApiKeySaved);
|
|
50
|
+
server.on('wix-ai-agent:response', handleResponse);
|
|
51
|
+
server.on('wix-ai-agent:thinking', handleThinking);
|
|
52
|
+
}
|
|
53
|
+
}, []);
|
|
54
|
+
const handleApiKeySubmit = (newApiKey) => {
|
|
55
|
+
setIsSavingApiKey(true);
|
|
56
|
+
setError('');
|
|
57
|
+
// Send API key to server
|
|
58
|
+
server.send('wix-ai-agent:save-api-key', { apiKey: newApiKey });
|
|
59
|
+
};
|
|
60
|
+
const handleSendMessage = (userMessage) => {
|
|
61
|
+
// Add user message to the chat
|
|
62
|
+
const updatedMessages = [...messages, { role: "user", content: userMessage }];
|
|
63
|
+
setMessages(updatedMessages);
|
|
64
|
+
// Show typing indicator
|
|
65
|
+
setIsTyping(true);
|
|
66
|
+
// Send message to server
|
|
67
|
+
server.send('wix-ai-agent:user-message', { message: userMessage });
|
|
68
|
+
};
|
|
69
|
+
console.log('isLoading', isLoading);
|
|
70
|
+
if (isLoading) {
|
|
71
|
+
return (React.createElement("div", { style: { padding: '24px', textAlign: 'center' } },
|
|
72
|
+
React.createElement("div", { style: { marginBottom: '16px' } },
|
|
73
|
+
React.createElement(AstroIcon, { icon: "astro:logo" })),
|
|
74
|
+
React.createElement("p", null, "Loading...")));
|
|
75
|
+
}
|
|
76
|
+
if (!apiKey) {
|
|
77
|
+
return (React.createElement(ApiKeyForm, { onSubmit: handleApiKeySubmit, isSaving: isSavingApiKey, error: error, setError: setError }));
|
|
78
|
+
}
|
|
79
|
+
return (React.createElement(AgentChat, { messages: messages, isTyping: isTyping, onSendMessage: handleSendMessage }));
|
|
80
|
+
}
|
|
81
|
+
export default defineToolbarApp({
|
|
82
|
+
init(canvas, _app, server) {
|
|
83
|
+
// Add keyframes for animations and global styles
|
|
84
|
+
const styleEl = document.createElement('style');
|
|
85
|
+
styleEl.textContent = `
|
|
86
|
+
@keyframes pulseDot {
|
|
87
|
+
0%, 100% { opacity: 0.4; transform: scale(0.8); }
|
|
88
|
+
50% { opacity: 1; transform: scale(1); }
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/* Define font smoothing for better rendering */
|
|
92
|
+
* {
|
|
93
|
+
-webkit-font-smoothing: antialiased;
|
|
94
|
+
-moz-osx-font-smoothing: grayscale;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/* Markdown styles */
|
|
98
|
+
.markdown-content {
|
|
99
|
+
line-height: 1.5;
|
|
100
|
+
}
|
|
101
|
+
.markdown-content p {
|
|
102
|
+
margin: 0 0 8px 0;
|
|
103
|
+
}
|
|
104
|
+
.markdown-content p:last-child {
|
|
105
|
+
margin-bottom: 0;
|
|
106
|
+
}
|
|
107
|
+
.markdown-content h1, .markdown-content h2, .markdown-content h3,
|
|
108
|
+
.markdown-content h4, .markdown-content h5, .markdown-content h6 {
|
|
109
|
+
margin-top: 12px;
|
|
110
|
+
margin-bottom: 8px;
|
|
111
|
+
font-weight: 600;
|
|
112
|
+
}
|
|
113
|
+
.markdown-content h1 { font-size: 1.5em; }
|
|
114
|
+
.markdown-content h2 { font-size: 1.3em; }
|
|
115
|
+
.markdown-content h3 { font-size: 1.1em; }
|
|
116
|
+
.markdown-content pre {
|
|
117
|
+
background-color: #f3f4f6;
|
|
118
|
+
padding: 8px;
|
|
119
|
+
border-radius: 4px;
|
|
120
|
+
overflow-x: auto;
|
|
121
|
+
margin: 8px 0;
|
|
122
|
+
}
|
|
123
|
+
.markdown-content code {
|
|
124
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
|
|
125
|
+
font-size: 0.9em;
|
|
126
|
+
background-color: #f3f4f6;
|
|
127
|
+
padding: 2px 4px;
|
|
128
|
+
border-radius: 3px;
|
|
129
|
+
}
|
|
130
|
+
.markdown-content pre code {
|
|
131
|
+
background-color: transparent;
|
|
132
|
+
padding: 0;
|
|
133
|
+
}
|
|
134
|
+
.markdown-content ul, .markdown-content ol {
|
|
135
|
+
margin: 8px 0;
|
|
136
|
+
padding-left: 20px;
|
|
137
|
+
}
|
|
138
|
+
.markdown-content blockquote {
|
|
139
|
+
margin: 8px 0;
|
|
140
|
+
padding-left: 12px;
|
|
141
|
+
border-left: 3px solid #d1d5db;
|
|
142
|
+
color: #4b5563;
|
|
143
|
+
}
|
|
144
|
+
.markdown-content a {
|
|
145
|
+
color: #2563eb;
|
|
146
|
+
text-decoration: none;
|
|
147
|
+
}
|
|
148
|
+
.markdown-content a:hover {
|
|
149
|
+
text-decoration: underline;
|
|
150
|
+
}
|
|
151
|
+
.markdown-content table {
|
|
152
|
+
border-collapse: collapse;
|
|
153
|
+
margin: 8px 0;
|
|
154
|
+
overflow-x: auto;
|
|
155
|
+
display: block;
|
|
156
|
+
}
|
|
157
|
+
.markdown-content th, .markdown-content td {
|
|
158
|
+
border: 1px solid #d1d5db;
|
|
159
|
+
padding: 6px 10px;
|
|
160
|
+
}
|
|
161
|
+
.markdown-content th {
|
|
162
|
+
background-color: #f9fafb;
|
|
163
|
+
}
|
|
164
|
+
`;
|
|
165
|
+
canvas.appendChild(styleEl);
|
|
166
|
+
// Initialize React root for rendering
|
|
167
|
+
const root = createRoot(canvas);
|
|
168
|
+
root.render(React.createElement(Agent, { server: server }));
|
|
169
|
+
},
|
|
170
|
+
});
|
|
171
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktYWdlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGV2LXRvb2xiYXIvYWktYWdlbnQudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDbkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxTQUFTLEVBQXdCLE1BQU0saUJBQWlCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUvQyxnREFBZ0Q7QUFDaEQsU0FBUyxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQW1CO0lBQ3hDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLEdBQUcsUUFBUSxDQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELE1BQU0sQ0FBQyxjQUFjLEVBQUUsaUJBQWlCLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUQsTUFBTSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsR0FBRyxRQUFRLENBQWdCLElBQUksQ0FBQyxDQUFDO0lBQzFELE1BQU0sQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEdBQUcsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pELE1BQU0sQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hELE1BQU0sQ0FBQyxhQUFhLEVBQUUsZ0JBQWdCLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFMUQsU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUNiLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNuQixvREFBb0Q7WUFDcEQsTUFBTSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUU1Qyw0QkFBNEI7WUFDNUIsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLElBQTBDLEVBQUUsRUFBRTtnQkFDeEUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ2hCLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLG9CQUFvQixDQUFDLENBQUM7Z0JBQ2pELENBQUM7Z0JBQ0QsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNwQixnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QixDQUFDLENBQUM7WUFFRixtQ0FBbUM7WUFDbkMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLElBQTBDLEVBQUUsRUFBRTtnQkFDdkUsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRXpCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNqQixTQUFTLENBQUMsb0JBQW9CLENBQUMsQ0FBQztnQkFDbEMsQ0FBQztxQkFBTSxDQUFDO29CQUNOLE9BQU8sQ0FBQyxLQUFLLENBQUMseUJBQXlCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNyRCxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSx3QkFBd0IsQ0FBQyxDQUFDO2dCQUNuRCxDQUFDO1lBQ0gsQ0FBQyxDQUFDO1lBRUYsbUNBQW1DO1lBQ25DLE1BQU0sY0FBYyxHQUFHLENBQUMsSUFBMEIsRUFBRSxFQUFFO2dCQUNwRCxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ25CLFdBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxZQUFZLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDL0QsQ0FBQyxDQUFDO1lBRUYsNkJBQTZCO1lBQzdCLE1BQU0sY0FBYyxHQUFHLENBQUMsSUFBNkIsRUFBRSxFQUFFO2dCQUN2RCxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQy9CLENBQUMsQ0FBQztZQUVGLE1BQU0sQ0FBQyxFQUFFLENBQUMsNkJBQTZCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztZQUM3RCxNQUFNLENBQUMsRUFBRSxDQUFDLDRCQUE0QixFQUFFLGlCQUFpQixDQUFDLENBQUM7WUFDM0QsTUFBTSxDQUFDLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSxjQUFjLENBQUMsQ0FBQztZQUNuRCxNQUFNLENBQUMsRUFBRSxDQUFDLHVCQUF1QixFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ3JELENBQUM7SUFDSCxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFUCxNQUFNLGtCQUFrQixHQUFHLENBQUMsU0FBaUIsRUFBRSxFQUFFO1FBQy9DLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hCLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUViLHlCQUF5QjtRQUN6QixNQUFNLENBQUMsSUFBSSxDQUFDLDJCQUEyQixFQUFFLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDbEUsQ0FBQyxDQUFDO0lBRUYsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLFdBQW1CLEVBQUUsRUFBRTtRQUNoRCwrQkFBK0I7UUFDL0IsTUFBTSxlQUFlLEdBQUcsQ0FBQyxHQUFHLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFxQixFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQzdGLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUU3Qix3QkFBd0I7UUFDeEIsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWxCLHlCQUF5QjtRQUN6QixNQUFNLENBQUMsSUFBSSxDQUFDLDJCQUEyQixFQUFFLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDckUsQ0FBQyxDQUFDO0lBRUYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFcEMsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUNkLE9BQU8sQ0FDTCw2QkFBSyxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUU7WUFDbEQsNkJBQUssS0FBSyxFQUFFLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRTtnQkFDbEMsb0JBQUMsU0FBUyxJQUFDLElBQUksRUFBQyxZQUFZLEdBQWEsQ0FDckM7WUFDTiw0Q0FBaUIsQ0FDYixDQUNQLENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osT0FBTyxDQUNMLG9CQUFDLFVBQVUsSUFDVCxRQUFRLEVBQUUsa0JBQWtCLEVBQzVCLFFBQVEsRUFBRSxjQUFjLEVBQ3hCLEtBQUssRUFBRSxLQUFLLEVBQ1osUUFBUSxFQUFFLFFBQVEsR0FDbEIsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU8sQ0FDTCxvQkFBQyxTQUFTLElBQ1IsUUFBUSxFQUFFLFFBQVEsRUFDbEIsUUFBUSxFQUFFLFFBQVEsRUFDbEIsYUFBYSxFQUFFLGlCQUFpQixHQUNoQyxDQUNILENBQUM7QUFDSixDQUFDO0FBRUQsZUFBZSxnQkFBZ0IsQ0FBQztJQUM5QixJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNO1FBQ3ZCLGlEQUFpRDtRQUNqRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELE9BQU8sQ0FBQyxXQUFXLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0ErRXJCLENBQUM7UUFDRixNQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTVCLHNDQUFzQztRQUN0QyxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxvQkFBQyxLQUFLLElBQUMsTUFBTSxFQUFFLE1BQU0sR0FBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztDQUNGLENBQUMsQ0FBQyJ9
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export declare function ApiKeyForm({ onSubmit, isSaving, error, setError }: {
|
|
3
|
+
onSubmit: (apiKey: string) => void;
|
|
4
|
+
isSaving: boolean;
|
|
5
|
+
error: string;
|
|
6
|
+
setError: (error: string) => void;
|
|
7
|
+
}): React.DOMElement<React.DOMAttributes<Element>, Element>;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import { AstroButton, AstroCard, AstroIcon } from "./astro-toolbar.js";
|
|
3
|
+
// API Key Form component using Astro toolbar custom elements with React 19
|
|
4
|
+
export function ApiKeyForm({ onSubmit, isSaving, error, setError }) {
|
|
5
|
+
const [apiKey, setApiKey] = useState('');
|
|
6
|
+
const handleSubmit = (e) => {
|
|
7
|
+
e.preventDefault();
|
|
8
|
+
if (!apiKey.trim()) {
|
|
9
|
+
setError('API key is required');
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
// Basic format validation for Anthropic API keys
|
|
13
|
+
if (!apiKey.trim().startsWith('sk-ant-')) {
|
|
14
|
+
setError('Invalid API key format. Anthropic API keys should start with "sk-ant-"');
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
onSubmit(apiKey);
|
|
18
|
+
};
|
|
19
|
+
return (React.createElement('astro-dev-toolbar-window', null, React.createElement("div", { className: "api-key-container" },
|
|
20
|
+
React.createElement("div", { className: "header" },
|
|
21
|
+
React.createElement(AstroIcon, { icon: "gear", style: { width: '16px', height: '16px' } }),
|
|
22
|
+
React.createElement("h2", null, "Anthropic API Key Required")),
|
|
23
|
+
React.createElement("p", { className: "description" },
|
|
24
|
+
"To use the AI Assistant, you need to provide your Anthropic API key. This key will be saved in your project's ",
|
|
25
|
+
React.createElement("code", null, ".env.local"),
|
|
26
|
+
" file."),
|
|
27
|
+
React.createElement("div", { className: "note-container" },
|
|
28
|
+
React.createElement(AstroCard, { cardStyle: "purple", icon: "info" }, "Note: Your API key is stored locally and is only used to communicate with Anthropic's API.")),
|
|
29
|
+
error && (React.createElement("div", { className: "error-message" },
|
|
30
|
+
React.createElement("span", { role: "img", "aria-label": "Warning" }, "\u26A0\uFE0F"),
|
|
31
|
+
error)),
|
|
32
|
+
React.createElement("form", { onSubmit: handleSubmit },
|
|
33
|
+
React.createElement("div", { className: "form-group" },
|
|
34
|
+
React.createElement("label", { htmlFor: "api-key-input" }, "Anthropic API Key"),
|
|
35
|
+
React.createElement("input", { id: "api-key-input", type: "text", value: apiKey, onChange: (e) => {
|
|
36
|
+
setApiKey(e.target.value);
|
|
37
|
+
if (error)
|
|
38
|
+
setError('');
|
|
39
|
+
}, placeholder: "sk-ant-..." }),
|
|
40
|
+
React.createElement("div", { className: "input-help" },
|
|
41
|
+
React.createElement("span", null,
|
|
42
|
+
"Format: ",
|
|
43
|
+
React.createElement("code", null, "sk-ant-...")),
|
|
44
|
+
React.createElement("a", { href: "https://console.anthropic.com/", target: "_blank", rel: "noopener noreferrer" }, "Get an API key"))),
|
|
45
|
+
React.createElement("div", { className: "button-container" },
|
|
46
|
+
React.createElement(AstroButton, { buttonStyle: "purple", disabled: isSaving, onClick: handleSubmit }, isSaving ? 'Saving...' : 'Save API Key'))),
|
|
47
|
+
React.createElement("style", null, `
|
|
48
|
+
.api-key-container {
|
|
49
|
+
padding: 20px;
|
|
50
|
+
max-width: 100%;
|
|
51
|
+
box-sizing: border-box;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.header {
|
|
55
|
+
display: flex;
|
|
56
|
+
align-items: center;
|
|
57
|
+
gap: 8px;
|
|
58
|
+
margin-bottom: 16px;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.header h2 {
|
|
62
|
+
font-size: 16px;
|
|
63
|
+
font-weight: 600;
|
|
64
|
+
margin: 0;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.description {
|
|
68
|
+
font-size: 14px;
|
|
69
|
+
margin-bottom: 16px;
|
|
70
|
+
line-height: 1.5;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.note-container {
|
|
74
|
+
margin-bottom: 20px;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.error-message {
|
|
78
|
+
background-color: rgba(220, 38, 38, 0.2);
|
|
79
|
+
padding: 10px;
|
|
80
|
+
border-radius: 4px;
|
|
81
|
+
margin-bottom: 16px;
|
|
82
|
+
font-size: 14px;
|
|
83
|
+
color: #f87171;
|
|
84
|
+
display: flex;
|
|
85
|
+
align-items: center;
|
|
86
|
+
gap: 8px;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.form-group {
|
|
90
|
+
margin-bottom: 16px;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.form-group label {
|
|
94
|
+
display: block;
|
|
95
|
+
font-size: 14px;
|
|
96
|
+
font-weight: 500;
|
|
97
|
+
margin-bottom: 6px;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.form-group input {
|
|
101
|
+
width: 100%;
|
|
102
|
+
padding: 8px 10px;
|
|
103
|
+
font-size: 14px;
|
|
104
|
+
border-radius: 4px;
|
|
105
|
+
border: 1px solid var(--astro-toolbar-color-gray-6, #4b5563);
|
|
106
|
+
background-color: var(--astro-toolbar-color-gray-8, #1e1e1e);
|
|
107
|
+
color: var(--astro-toolbar-color-gray-1, #ffffff);
|
|
108
|
+
box-sizing: border-box;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.input-help {
|
|
112
|
+
display: flex;
|
|
113
|
+
justify-content: space-between;
|
|
114
|
+
margin-top: 6px;
|
|
115
|
+
font-size: 12px;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.input-help a {
|
|
119
|
+
color: var(--astro-toolbar-accent-color, #818cf8);
|
|
120
|
+
text-decoration: none;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.input-help a:hover {
|
|
124
|
+
text-decoration: underline;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.button-container {
|
|
128
|
+
display: flex;
|
|
129
|
+
justify-content: flex-end;
|
|
130
|
+
margin-bottom: 16px;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
.card-container {
|
|
134
|
+
margin-top: 16px;
|
|
135
|
+
}
|
|
136
|
+
`))));
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWtleS1mb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Rldi10b29sYmFyL2FwaS1rZXktZm9ybS50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDeEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFdkUsMkVBQTJFO0FBQzNFLE1BQU0sVUFBVSxVQUFVLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBSy9EO0lBQ0MsTUFBTSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsR0FBRyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFekMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxDQUFrQixFQUFFLEVBQUU7UUFDMUMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRW5CLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNuQixRQUFRLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUNoQyxPQUFPO1FBQ1QsQ0FBQztRQUVELGlEQUFpRDtRQUNqRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3pDLFFBQVEsQ0FBQyx3RUFBd0UsQ0FBQyxDQUFDO1lBQ25GLE9BQU87UUFDVCxDQUFDO1FBRUQsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25CLENBQUMsQ0FBQztJQUVGLE9BQU8sQ0FDTCxLQUFLLENBQUMsYUFBYSxDQUFDLDBCQUEwQixFQUFFLElBQUksRUFDbEQsNkJBQUssU0FBUyxFQUFDLG1CQUFtQjtRQUNoQyw2QkFBSyxTQUFTLEVBQUMsUUFBUTtZQUNyQixvQkFBQyxTQUFTLElBQUMsSUFBSSxFQUFDLE1BQU0sRUFBQyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBSTtZQUNuRSw2REFBbUMsQ0FDL0I7UUFFTiwyQkFBRyxTQUFTLEVBQUMsYUFBYTs7WUFFaUIsK0NBQXVCO3FCQUM5RDtRQUVKLDZCQUFLLFNBQVMsRUFBQyxnQkFBZ0I7WUFDN0Isb0JBQUMsU0FBUyxJQUFDLFNBQVMsRUFBQyxRQUFRLEVBQUMsSUFBSSxFQUFDLE1BQU0saUdBRTdCLENBQ1I7UUFFTCxLQUFLLElBQUksQ0FDUiw2QkFBSyxTQUFTLEVBQUMsZUFBZTtZQUM1Qiw4QkFBTSxJQUFJLEVBQUMsS0FBSyxnQkFBWSxTQUFTLG1CQUFVO1lBQzlDLEtBQUssQ0FDRixDQUNQO1FBRUQsOEJBQU0sUUFBUSxFQUFFLFlBQVk7WUFDMUIsNkJBQUssU0FBUyxFQUFDLFlBQVk7Z0JBQ3pCLCtCQUFPLE9BQU8sRUFBQyxlQUFlLHdCQUV0QjtnQkFDUiwrQkFDRSxFQUFFLEVBQUMsZUFBZSxFQUNsQixJQUFJLEVBQUMsTUFBTSxFQUNYLEtBQUssRUFBRSxNQUFNLEVBQ2IsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7d0JBQ2QsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQzFCLElBQUksS0FBSzs0QkFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQzFCLENBQUMsRUFDRCxXQUFXLEVBQUMsWUFBWSxHQUN4QjtnQkFDRiw2QkFBSyxTQUFTLEVBQUMsWUFBWTtvQkFDekI7O3dCQUFjLCtDQUF1QixDQUFPO29CQUM1QywyQkFDRSxJQUFJLEVBQUMsZ0NBQWdDLEVBQ3JDLE1BQU0sRUFBQyxRQUFRLEVBQ2YsR0FBRyxFQUFDLHFCQUFxQixxQkFHdkIsQ0FDQSxDQUNGO1lBRU4sNkJBQUssU0FBUyxFQUFDLGtCQUFrQjtnQkFDL0Isb0JBQUMsV0FBVyxJQUNWLFdBQVcsRUFBQyxRQUFRLEVBQ3BCLFFBQVEsRUFBRSxRQUFRLEVBQ2xCLE9BQU8sRUFBRSxZQUFZLElBRXBCLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQzVCLENBQ1YsQ0FDRDtRQUVQLG1DQUFROzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztTQXlGUCxDQUFTLENBQ04sQ0FDUCxDQUNGLENBQUM7QUFDSixDQUFDIn0=
|