wakz-sdk 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.
- package/README.md +264 -0
- package/dist/client.d.ts +124 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +323 -0
- package/dist/client.js.map +1 -0
- package/dist/crypto.d.ts +26 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +161 -0
- package/dist/crypto.js.map +1 -0
- package/dist/esm/client.js.map +1 -0
- package/dist/esm/client.mjs +319 -0
- package/dist/esm/crypto.js.map +1 -0
- package/dist/esm/crypto.mjs +123 -0
- package/dist/esm/events.js.map +1 -0
- package/dist/esm/events.mjs +100 -0
- package/dist/esm/http.js.map +1 -0
- package/dist/esm/http.mjs +159 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/index.mjs +32 -0
- package/dist/esm/session.js.map +1 -0
- package/dist/esm/session.mjs +186 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/types.mjs +5 -0
- package/dist/esm/utils.js.map +1 -0
- package/dist/esm/utils.mjs +139 -0
- package/dist/esm/websocket.js.map +1 -0
- package/dist/esm/websocket.mjs +363 -0
- package/dist/events.d.ts +38 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +104 -0
- package/dist/events.js.map +1 -0
- package/dist/http.d.ts +37 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +163 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/session.d.ts +75 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +190 -0
- package/dist/session.js.map +1 -0
- package/dist/types.d.ts +149 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +56 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +153 -0
- package/dist/utils.js.map +1 -0
- package/dist/websocket.d.ts +93 -0
- package/dist/websocket.d.ts.map +1 -0
- package/dist/websocket.js +367 -0
- package/dist/websocket.js.map +1 -0
- package/package.json +50 -0
package/README.md
ADDED
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
# @wakz/sdk
|
|
2
|
+
|
|
3
|
+
Official WAKZ AI SDK — Embed intelligent chat assistants in any website or application with WebSocket + HTTP fallback, automatic reconnection, and HMAC-signed authentication.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @wakz/sdk
|
|
9
|
+
# or
|
|
10
|
+
yarn add @wakz/sdk
|
|
11
|
+
# or
|
|
12
|
+
pnpm add @wakz/sdk
|
|
13
|
+
# or
|
|
14
|
+
bun add @wakz/sdk
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Quick Start
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
import { WAKZClient } from '@wakz/sdk';
|
|
21
|
+
|
|
22
|
+
// Initialize the client with your API key
|
|
23
|
+
const client = new WAKZClient({
|
|
24
|
+
apiKey: 'wakz_live_xxxxx',
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
// Connect to the WAKZ API
|
|
28
|
+
await client.connect();
|
|
29
|
+
|
|
30
|
+
// Listen for messages
|
|
31
|
+
client.on('message', (msg) => {
|
|
32
|
+
console.log(`[${msg.role}]: ${msg.content}`);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
// Send a message and get the AI response
|
|
36
|
+
const response = await client.sendMessage('Hello! How can you help me?');
|
|
37
|
+
|
|
38
|
+
if (response.success) {
|
|
39
|
+
console.log('AI Response:', response.message?.content);
|
|
40
|
+
} else {
|
|
41
|
+
console.error('Error:', response.error);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Disconnect when done
|
|
45
|
+
client.disconnect();
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## React Integration
|
|
49
|
+
|
|
50
|
+
```tsx
|
|
51
|
+
import { useEffect, useRef, useState } from 'react';
|
|
52
|
+
import { WAKZClient, type ChatMessage } from '@wakz/sdk';
|
|
53
|
+
|
|
54
|
+
export function WAKZChat() {
|
|
55
|
+
const [messages, setMessages] = useState<ChatMessage[]>([]);
|
|
56
|
+
const [input, setInput] = useState('');
|
|
57
|
+
const clientRef = useRef<WAKZClient | null>(null);
|
|
58
|
+
|
|
59
|
+
useEffect(() => {
|
|
60
|
+
const client = new WAKZClient({
|
|
61
|
+
apiKey: 'wakz_live_xxxxx',
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
client.on('message', (msg) => {
|
|
65
|
+
setMessages((prev) => [...prev, msg]);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
client.connect();
|
|
69
|
+
clientRef.current = client;
|
|
70
|
+
|
|
71
|
+
return () => {
|
|
72
|
+
client.destroy();
|
|
73
|
+
};
|
|
74
|
+
}, []);
|
|
75
|
+
|
|
76
|
+
const handleSend = async () => {
|
|
77
|
+
if (!input.trim() || !clientRef.current) return;
|
|
78
|
+
|
|
79
|
+
setMessages((prev) => [
|
|
80
|
+
...prev,
|
|
81
|
+
{
|
|
82
|
+
id: Date.now().toString(),
|
|
83
|
+
role: 'user',
|
|
84
|
+
content: input,
|
|
85
|
+
timestamp: new Date().toISOString(),
|
|
86
|
+
},
|
|
87
|
+
]);
|
|
88
|
+
|
|
89
|
+
await clientRef.current.sendMessage(input);
|
|
90
|
+
setInput('');
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
return (
|
|
94
|
+
<div>
|
|
95
|
+
{messages.map((msg) => (
|
|
96
|
+
<div key={msg.id}>{msg.content}</div>
|
|
97
|
+
))}
|
|
98
|
+
<input
|
|
99
|
+
value={input}
|
|
100
|
+
onChange={(e) => setInput(e.target.value)}
|
|
101
|
+
onKeyDown={(e) => e.key === 'Enter' && handleSend()}
|
|
102
|
+
/>
|
|
103
|
+
<button onClick={handleSend}>Send</button>
|
|
104
|
+
</div>
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## API Reference
|
|
110
|
+
|
|
111
|
+
### `new WAKZClient(options)`
|
|
112
|
+
|
|
113
|
+
Creates a new WAKZ SDK client instance.
|
|
114
|
+
|
|
115
|
+
#### Options
|
|
116
|
+
|
|
117
|
+
| Option | Type | Default | Description |
|
|
118
|
+
|--------|------|---------|-------------|
|
|
119
|
+
| `apiKey` | `string` | **required** | Your WAKZ API key (starts with `wakz_live_`) |
|
|
120
|
+
| `baseUrl` | `string` | `'https://api.wakz.dev'` | API base URL |
|
|
121
|
+
| `websocketUrl` | `string` | derived from baseUrl | WebSocket server URL |
|
|
122
|
+
| `autoReconnect` | `boolean` | `true` | Enable automatic reconnection |
|
|
123
|
+
| `maxRetries` | `number` | `5` | Max reconnection attempts before HTTP fallback |
|
|
124
|
+
| `initialRetryDelay` | `number` | `1000` | Initial retry delay in ms |
|
|
125
|
+
| `maxRetryDelay` | `number` | `30000` | Maximum retry delay in ms |
|
|
126
|
+
| `visitorId` | `string` | auto-generated | Custom visitor identifier |
|
|
127
|
+
| `metadata` | `object` | `{}` | Visitor metadata (browser, OS, etc.) |
|
|
128
|
+
| `timeout` | `number` | `30000` | Request timeout in ms |
|
|
129
|
+
| `debug` | `boolean` | `false` | Enable debug logging |
|
|
130
|
+
|
|
131
|
+
### Methods
|
|
132
|
+
|
|
133
|
+
#### `client.connect(): Promise<void>`
|
|
134
|
+
|
|
135
|
+
Connect to the WAKZ API. Attempts WebSocket first, falls back to HTTP.
|
|
136
|
+
|
|
137
|
+
#### `client.sendMessage(content: string): Promise<SendMessageResponse>`
|
|
138
|
+
|
|
139
|
+
Send a message and receive the AI response.
|
|
140
|
+
|
|
141
|
+
#### `client.disconnect(): void`
|
|
142
|
+
|
|
143
|
+
Disconnect from the API.
|
|
144
|
+
|
|
145
|
+
#### `client.getSession(): Promise<SessionInfo>`
|
|
146
|
+
|
|
147
|
+
Get the current session information.
|
|
148
|
+
|
|
149
|
+
#### `client.getVisitorId(): string`
|
|
150
|
+
|
|
151
|
+
Get the current visitor ID.
|
|
152
|
+
|
|
153
|
+
#### `client.getStatus(): ConnectionStatus`
|
|
154
|
+
|
|
155
|
+
Get the current connection status (`'disconnected' | 'connecting' | 'connected' | 'reconnecting' | 'failed'`).
|
|
156
|
+
|
|
157
|
+
#### `client.getTransport(): TransportMode`
|
|
158
|
+
|
|
159
|
+
Get the current transport mode (`'websocket' | 'http'`).
|
|
160
|
+
|
|
161
|
+
#### `client.getWidgetConfig(): Promise<WidgetConfig | null>`
|
|
162
|
+
|
|
163
|
+
Fetch widget configuration from the API.
|
|
164
|
+
|
|
165
|
+
#### `client.healthCheck(): Promise<HealthCheckResult>`
|
|
166
|
+
|
|
167
|
+
Perform a health check against the API.
|
|
168
|
+
|
|
169
|
+
#### `client.updateMetadata(metadata: Record<string, string>): void`
|
|
170
|
+
|
|
171
|
+
Update visitor metadata.
|
|
172
|
+
|
|
173
|
+
#### `client.destroy(): void`
|
|
174
|
+
|
|
175
|
+
Disconnect and clean up all resources.
|
|
176
|
+
|
|
177
|
+
### Events
|
|
178
|
+
|
|
179
|
+
| Event | Data | Description |
|
|
180
|
+
|-------|------|-------------|
|
|
181
|
+
| `connected` | `void` | Successfully connected to the API |
|
|
182
|
+
| `disconnected` | `{ code: number, reason: string }` | Disconnected from the API |
|
|
183
|
+
| `reconnecting` | `{ attempt: number, delay: number }` | Attempting to reconnect |
|
|
184
|
+
| `reconnect_failed` | `{ reason: string }` | All reconnection attempts exhausted |
|
|
185
|
+
| `message` | `ChatMessage` | Received a message from the AI |
|
|
186
|
+
| `error` | `Error` | An error occurred |
|
|
187
|
+
| `session_start` | `SessionInfo` | A new session started |
|
|
188
|
+
| `session_end` | `{ sessionId: string }` | The session ended |
|
|
189
|
+
| `transport_change` | `{ from: TransportMode, to: TransportMode }` | Transport mode changed |
|
|
190
|
+
| `health_check` | `{ latency: number, transport: TransportMode }` | Health check completed |
|
|
191
|
+
|
|
192
|
+
### Static Methods
|
|
193
|
+
|
|
194
|
+
#### `WAKZClient.healthCheck(baseUrl?, timeout?): Promise<HealthCheckResult>`
|
|
195
|
+
|
|
196
|
+
Perform a quick connectivity check without creating a client instance.
|
|
197
|
+
|
|
198
|
+
```typescript
|
|
199
|
+
const health = await WAKZClient.healthCheck();
|
|
200
|
+
if (health.healthy) {
|
|
201
|
+
console.log(`WAKZ API is up (${health.latency}ms)`);
|
|
202
|
+
}
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
## Transport Architecture
|
|
206
|
+
|
|
207
|
+
```
|
|
208
|
+
┌─────────────┐ WebSocket ┌──────────────┐
|
|
209
|
+
│ │ ─────────────────► │ │
|
|
210
|
+
│ WAKZ SDK │ │ WAKZ API │
|
|
211
|
+
│ │ ◄───────────────── │ │
|
|
212
|
+
│ │ Real-time │ │
|
|
213
|
+
│ │ │ │
|
|
214
|
+
│ │ HTTP/REST │ │
|
|
215
|
+
│ │ ─────────────────► │ │
|
|
216
|
+
│ │ ◄───────────────── │ │
|
|
217
|
+
└─────────────┘ Fallback └──────────────┘
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
1. **Primary**: WebSocket for real-time, low-latency communication
|
|
221
|
+
2. **Fallback**: HTTP/REST when WebSocket is unavailable or fails
|
|
222
|
+
3. **Auto-switch**: Automatically falls back to HTTP after max retries
|
|
223
|
+
4. **Reconnection**: Exponential backoff with jitter (1s → 2s → 4s → ... → 30s max)
|
|
224
|
+
|
|
225
|
+
## Authentication
|
|
226
|
+
|
|
227
|
+
All requests are authenticated using your API key with HMAC-SHA256 signing:
|
|
228
|
+
|
|
229
|
+
- **`X-API-Key`**: Your raw API key
|
|
230
|
+
- **`X-Timestamp`**: ISO 8601 timestamp
|
|
231
|
+
- **`X-Signature`**: HMAC-SHA256 of `{timestamp}.{payload}` using your API key
|
|
232
|
+
|
|
233
|
+
## TypeScript Support
|
|
234
|
+
|
|
235
|
+
Full TypeScript support with comprehensive type definitions:
|
|
236
|
+
|
|
237
|
+
```typescript
|
|
238
|
+
import type {
|
|
239
|
+
ChatMessage,
|
|
240
|
+
SessionInfo,
|
|
241
|
+
WAKZClientOptions,
|
|
242
|
+
TransportMode,
|
|
243
|
+
ConnectionStatus,
|
|
244
|
+
HealthCheckResult,
|
|
245
|
+
WAKZEventType,
|
|
246
|
+
WAKZEventMap,
|
|
247
|
+
} from '@wakz/sdk';
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
## Browser Support
|
|
251
|
+
|
|
252
|
+
- Chrome 80+
|
|
253
|
+
- Firefox 80+
|
|
254
|
+
- Safari 14+
|
|
255
|
+
- Edge 80+
|
|
256
|
+
|
|
257
|
+
## Node.js Support
|
|
258
|
+
|
|
259
|
+
- Node.js 16+
|
|
260
|
+
- Works with `ws` package for WebSocket support
|
|
261
|
+
|
|
262
|
+
## License
|
|
263
|
+
|
|
264
|
+
MIT License — see [LICENSE](LICENSE) for details.
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import type { WAKZClientOptions, WAKZEventType, WAKZEventMap, WAKZEventCallback, SendMessageResponse, SessionInfo, WidgetConfig, HealthCheckResult, TransportMode, ConnectionStatus } from './types';
|
|
2
|
+
import { WAKZEventEmitter } from './events';
|
|
3
|
+
/**
|
|
4
|
+
* WAKZ SDK Client — The main entry point for integrating WAKZ AI.
|
|
5
|
+
*
|
|
6
|
+
* Features:
|
|
7
|
+
* - Dual transport: WebSocket (primary) with HTTP/REST fallback
|
|
8
|
+
* - Automatic reconnection with exponential backoff
|
|
9
|
+
* - API key authentication with HMAC-SHA256 request signing
|
|
10
|
+
* - Typed event emitter for real-time updates
|
|
11
|
+
* - Session management with visitor fingerprinting
|
|
12
|
+
* - Works in both browser and Node.js environments
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* const client = new WAKZClient({
|
|
17
|
+
* apiKey: 'wakz_live_xxxxx',
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* await client.connect();
|
|
21
|
+
* client.on('message', (msg) => console.log(msg));
|
|
22
|
+
* const response = await client.sendMessage('Hello!');
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export declare class WAKZClient extends WAKZEventEmitter {
|
|
26
|
+
private options;
|
|
27
|
+
private wsTransport;
|
|
28
|
+
private httpTransport;
|
|
29
|
+
private sessionManager;
|
|
30
|
+
private logger;
|
|
31
|
+
private _status;
|
|
32
|
+
private _currentTransport;
|
|
33
|
+
/**
|
|
34
|
+
* Create a new WAKZ SDK client instance.
|
|
35
|
+
*
|
|
36
|
+
* @param options - Client configuration options
|
|
37
|
+
*/
|
|
38
|
+
constructor(options: WAKZClientOptions);
|
|
39
|
+
/**
|
|
40
|
+
* Connect to the WAKZ API.
|
|
41
|
+
*
|
|
42
|
+
* Attempts WebSocket connection first. Falls back to HTTP if:
|
|
43
|
+
* - WebSocket is not available in the environment
|
|
44
|
+
* - WebSocket connection fails after max retries
|
|
45
|
+
*
|
|
46
|
+
* @returns Promise that resolves when connected
|
|
47
|
+
*/
|
|
48
|
+
connect(): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Send a chat message.
|
|
51
|
+
*
|
|
52
|
+
* Uses the current active transport (WebSocket or HTTP).
|
|
53
|
+
*
|
|
54
|
+
* @param content - The message text to send
|
|
55
|
+
* @returns Promise resolving to the assistant's reply
|
|
56
|
+
*/
|
|
57
|
+
sendMessage(content: string): Promise<SendMessageResponse>;
|
|
58
|
+
/**
|
|
59
|
+
* Disconnect from the WAKZ API.
|
|
60
|
+
*/
|
|
61
|
+
disconnect(): void;
|
|
62
|
+
/**
|
|
63
|
+
* Register an event listener.
|
|
64
|
+
*/
|
|
65
|
+
on<K extends WAKZEventType>(event: K, callback: WAKZEventCallback<WAKZEventMap[K]>): this;
|
|
66
|
+
/**
|
|
67
|
+
* Register a one-time event listener.
|
|
68
|
+
*/
|
|
69
|
+
once<K extends WAKZEventType>(event: K, callback: WAKZEventCallback<WAKZEventMap[K]>): this;
|
|
70
|
+
/**
|
|
71
|
+
* Remove an event listener.
|
|
72
|
+
*/
|
|
73
|
+
off<K extends WAKZEventType>(event: K, callback: WAKZEventCallback<WAKZEventMap[K]>): this;
|
|
74
|
+
/**
|
|
75
|
+
* Get the current session information.
|
|
76
|
+
*/
|
|
77
|
+
getSession(): Promise<SessionInfo>;
|
|
78
|
+
/**
|
|
79
|
+
* Get the current visitor ID.
|
|
80
|
+
*/
|
|
81
|
+
getVisitorId(): string;
|
|
82
|
+
/**
|
|
83
|
+
* Get the current connection status.
|
|
84
|
+
*/
|
|
85
|
+
getStatus(): ConnectionStatus;
|
|
86
|
+
/**
|
|
87
|
+
* Get the current transport mode.
|
|
88
|
+
*/
|
|
89
|
+
getTransport(): TransportMode;
|
|
90
|
+
/**
|
|
91
|
+
* Fetch the widget configuration from the API.
|
|
92
|
+
*/
|
|
93
|
+
getWidgetConfig(): Promise<WidgetConfig | null>;
|
|
94
|
+
/**
|
|
95
|
+
* Perform a health check against the WAKZ API.
|
|
96
|
+
*/
|
|
97
|
+
healthCheck(): Promise<HealthCheckResult>;
|
|
98
|
+
/**
|
|
99
|
+
* Update visitor metadata.
|
|
100
|
+
*/
|
|
101
|
+
updateMetadata(metadata: Record<string, string>): void;
|
|
102
|
+
/**
|
|
103
|
+
* Destroy the client — disconnect and clean up all resources.
|
|
104
|
+
*/
|
|
105
|
+
destroy(): void;
|
|
106
|
+
/**
|
|
107
|
+
* ─── Static Methods ──────────────────────────────────────
|
|
108
|
+
*/
|
|
109
|
+
/**
|
|
110
|
+
* Perform a quick health check against a WAKZ API endpoint.
|
|
111
|
+
* Useful for checking connectivity before creating a client instance.
|
|
112
|
+
*
|
|
113
|
+
* @param baseUrl - The API base URL to check
|
|
114
|
+
* @param timeout - Request timeout in ms (default: 10000)
|
|
115
|
+
* @returns Health check result
|
|
116
|
+
*/
|
|
117
|
+
static healthCheck(baseUrl?: string, timeout?: number): Promise<HealthCheckResult>;
|
|
118
|
+
/**
|
|
119
|
+
* Connect via WebSocket transport.
|
|
120
|
+
*/
|
|
121
|
+
private connectWebSocket;
|
|
122
|
+
private warn;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EAEnB,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EACjB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAM5C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,UAAW,SAAQ,gBAAgB;IAC9C,OAAO,CAAC,OAAO,CACuD;IACtE,OAAO,CAAC,WAAW,CAAmC;IACtD,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,MAAM,CAAS;IAEvB,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,iBAAiB,CAAyB;IAElD;;;;OAIG;gBACS,OAAO,EAAE,iBAAiB;IA0CtC;;;;;;;;OAQG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA2B9B;;;;;;;OAOG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA+ChE;;OAEG;IACH,UAAU,IAAI,IAAI;IAOlB;;OAEG;IACM,EAAE,CAAC,CAAC,SAAS,aAAa,EACjC,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAC3C,IAAI;IAKP;;OAEG;IACM,IAAI,CAAC,CAAC,SAAS,aAAa,EACnC,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAC3C,IAAI;IAKP;;OAEG;IACM,GAAG,CAAC,CAAC,SAAS,aAAa,EAClC,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAC3C,IAAI;IAKP;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC;IAIxC;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,SAAS,IAAI,gBAAgB;IAI7B;;OAEG;IACH,YAAY,IAAI,aAAa;IAI7B;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAIrD;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAQ/C;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAItD;;OAEG;IACH,OAAO,IAAI,IAAI;IAQf;;OAEG;IAEH;;;;;;;OAOG;WACU,WAAW,CACtB,OAAO,GAAE,MAA+B,EACxC,OAAO,GAAE,MAAc,GACtB,OAAO,CAAC,iBAAiB,CAAC;IA6B7B;;OAEG;YACW,gBAAgB;IA2D9B,OAAO,CAAC,IAAI;CAGb"}
|