@metatell/bot-sdk 0.0.1
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/client.d.ts +127 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +552 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/pcm-utils.d.ts +19 -0
- package/dist/pcm-utils.d.ts.map +1 -0
- package/dist/pcm-utils.js +98 -0
- package/dist/pcm-utils.js.map +1 -0
- package/dist/sdk/AgentClient.d.ts +201 -0
- package/dist/sdk/AgentClient.d.ts.map +1 -0
- package/dist/sdk/AgentClient.js +404 -0
- package/dist/sdk/AgentClient.js.map +1 -0
- package/dist/sdk/errors.d.ts +36 -0
- package/dist/sdk/errors.d.ts.map +1 -0
- package/dist/sdk/errors.js +61 -0
- package/dist/sdk/errors.js.map +1 -0
- package/dist/sdk/logging/LogEventEmitter.d.ts +38 -0
- package/dist/sdk/logging/LogEventEmitter.d.ts.map +1 -0
- package/dist/sdk/logging/LogEventEmitter.js +54 -0
- package/dist/sdk/logging/LogEventEmitter.js.map +1 -0
- package/dist/sdk/logging/index.d.ts +22 -0
- package/dist/sdk/logging/index.d.ts.map +1 -0
- package/dist/sdk/logging/index.js +10 -0
- package/dist/sdk/logging/index.js.map +1 -0
- package/dist/sdk/logging/providers/default.d.ts +21 -0
- package/dist/sdk/logging/providers/default.d.ts.map +1 -0
- package/dist/sdk/logging/providers/default.js +171 -0
- package/dist/sdk/logging/providers/default.js.map +1 -0
- package/dist/sdk/logging/spi.d.ts +35 -0
- package/dist/sdk/logging/spi.d.ts.map +1 -0
- package/dist/sdk/logging/spi.js +30 -0
- package/dist/sdk/logging/spi.js.map +1 -0
- package/dist/sdk/rate.d.ts +36 -0
- package/dist/sdk/rate.d.ts.map +1 -0
- package/dist/sdk/rate.js +81 -0
- package/dist/sdk/rate.js.map +1 -0
- package/dist/types.d.ts +111 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +24 -0
- package/dist/types.js.map +1 -0
- package/package.json +34 -0
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Client - facade for CLI/SDK usage
|
|
3
|
+
*/
|
|
4
|
+
import { EventEmitter } from 'node:events';
|
|
5
|
+
// Realtime types will be defined locally to avoid circular dependencies
|
|
6
|
+
import { AnimationNotFoundError, AnimationPlaybackError, AnimationService, AvatarController, AvatarNotSpawnedError, ConfigurationProvider, ConnectionManager, CoreServiceFactory, MessageService, UserAvatarManager, } from '@metatell/bot-core';
|
|
7
|
+
import { getLogger } from './logging/index.js';
|
|
8
|
+
import { RateLimitedQueue } from './rate.js';
|
|
9
|
+
/**
|
|
10
|
+
* Default implementation using existing services
|
|
11
|
+
*/
|
|
12
|
+
export class DefaultAgentClient extends EventEmitter {
|
|
13
|
+
avatarController;
|
|
14
|
+
messageService;
|
|
15
|
+
userAvatarManager;
|
|
16
|
+
connectionManager;
|
|
17
|
+
animationService;
|
|
18
|
+
// Voice transport functionality moved to consuming packages
|
|
19
|
+
rateLimiter = new RateLimitedQueue();
|
|
20
|
+
logger = getLogger('AgentClient');
|
|
21
|
+
factory;
|
|
22
|
+
voiceMuted = false;
|
|
23
|
+
status = {
|
|
24
|
+
connected: false,
|
|
25
|
+
connecting: false,
|
|
26
|
+
retries: 0,
|
|
27
|
+
};
|
|
28
|
+
lastConnectionOptions;
|
|
29
|
+
configProvider;
|
|
30
|
+
constructor(factory, config = {}) {
|
|
31
|
+
super();
|
|
32
|
+
this.factory = factory;
|
|
33
|
+
// コアサービスインターフェースのみに依存(型推論で取得)
|
|
34
|
+
this.avatarController = factory.getService(AvatarController);
|
|
35
|
+
this.messageService = factory.getService(MessageService);
|
|
36
|
+
this.userAvatarManager = factory.getService(UserAvatarManager);
|
|
37
|
+
this.connectionManager = factory.getService(ConnectionManager);
|
|
38
|
+
this.configProvider = factory.getService(ConfigurationProvider);
|
|
39
|
+
// Optional services
|
|
40
|
+
try {
|
|
41
|
+
this.animationService = factory.getService(AnimationService);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// Animation service is optional
|
|
45
|
+
this.logger.debug('Animation service not available');
|
|
46
|
+
}
|
|
47
|
+
// Voice transport functionality moved to consuming packages
|
|
48
|
+
// Setup event handlers for user join
|
|
49
|
+
this.setupEventHandlers();
|
|
50
|
+
// レート制限の設定
|
|
51
|
+
if (config.rateLimit?.messages) {
|
|
52
|
+
this.rateLimiter.setRate('messages', config.rateLimit.messages);
|
|
53
|
+
}
|
|
54
|
+
if (config.rateLimit?.moves) {
|
|
55
|
+
this.rateLimiter.setRate('moves', config.rateLimit.moves);
|
|
56
|
+
}
|
|
57
|
+
if (config.rateLimit?.looks) {
|
|
58
|
+
this.rateLimiter.setRate('looks', config.rateLimit.looks);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async connect(options) {
|
|
62
|
+
this.logger.info('Connecting to server', options);
|
|
63
|
+
this.status.connecting = true;
|
|
64
|
+
// 接続オプションを保存
|
|
65
|
+
this.lastConnectionOptions = options;
|
|
66
|
+
try {
|
|
67
|
+
let serverUrl;
|
|
68
|
+
let hubId;
|
|
69
|
+
// Use provided values or parse from URL
|
|
70
|
+
if (options.serverUrl && options.hubId) {
|
|
71
|
+
serverUrl = options.serverUrl;
|
|
72
|
+
hubId = options.hubId;
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
// URLを解析してserverUrlとhubIdを取得
|
|
76
|
+
const url = new URL(options.url);
|
|
77
|
+
// HTTPSからWSSに変換
|
|
78
|
+
const protocol = url.protocol === 'https:' ? 'wss:' : 'ws:';
|
|
79
|
+
const port = url.port ? `:${url.port}` : '';
|
|
80
|
+
serverUrl = `${protocol}//${url.hostname}${port}`;
|
|
81
|
+
// hubIdを取得(パスから'/'を除去)
|
|
82
|
+
const pathParts = url.pathname.split('/').filter(Boolean);
|
|
83
|
+
hubId = pathParts[0];
|
|
84
|
+
if (!hubId) {
|
|
85
|
+
throw new Error('Invalid URL: hub ID not found');
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Connect through connection manager directly
|
|
89
|
+
await this.connectionManager.connect({
|
|
90
|
+
serverUrl,
|
|
91
|
+
hubId,
|
|
92
|
+
});
|
|
93
|
+
// セッションIDを取得
|
|
94
|
+
const sessionId = this.connectionManager.getSessionId();
|
|
95
|
+
this.status.sessionId = sessionId || undefined;
|
|
96
|
+
// ハブチャンネルが準備できるまで待機
|
|
97
|
+
let channel = this.connectionManager.getHubChannel();
|
|
98
|
+
let retries = 0;
|
|
99
|
+
while (!channel && retries < 50) {
|
|
100
|
+
// 最大5秒待機
|
|
101
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
102
|
+
channel = this.connectionManager.getHubChannel();
|
|
103
|
+
retries++;
|
|
104
|
+
}
|
|
105
|
+
if (!channel) {
|
|
106
|
+
throw new Error('Failed to get hub channel after connection');
|
|
107
|
+
}
|
|
108
|
+
// Send room entry events
|
|
109
|
+
channel.push('events:entering', {});
|
|
110
|
+
channel.push('events:entered', {
|
|
111
|
+
initialOccupantCount: 0,
|
|
112
|
+
isNewDaily: true,
|
|
113
|
+
isNewMonthly: true,
|
|
114
|
+
isNewDayWindow: true,
|
|
115
|
+
isNewMonthWindow: true,
|
|
116
|
+
entryDisplayType: 'Bot',
|
|
117
|
+
userAgent: 'MetatellBot/1.0',
|
|
118
|
+
});
|
|
119
|
+
// Get avatar configuration and spawn
|
|
120
|
+
const configProvider = this.factory.getService(ConfigurationProvider);
|
|
121
|
+
const config = configProvider.getConfiguration();
|
|
122
|
+
if (config.profile.avatarId) {
|
|
123
|
+
this.logger.debug('Spawning avatar', {
|
|
124
|
+
avatarId: config.profile.avatarId,
|
|
125
|
+
organizationAvatarUrl: config.organizationAvatarUrl,
|
|
126
|
+
});
|
|
127
|
+
await this.avatarController.spawn(config.profile.avatarId, undefined, config.organizationAvatarUrl);
|
|
128
|
+
}
|
|
129
|
+
// Voice connection functionality moved to consuming packages
|
|
130
|
+
this.status.connected = true;
|
|
131
|
+
this.status.connecting = false;
|
|
132
|
+
this.logger.info('Connected successfully', {
|
|
133
|
+
serverUrl,
|
|
134
|
+
hubId,
|
|
135
|
+
sessionId: this.status.sessionId,
|
|
136
|
+
voiceEnabled: false, // Voice functionality moved to consuming packages
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
this.status.connecting = false;
|
|
141
|
+
this.status.retries++;
|
|
142
|
+
this.logger.error('Connection failed', { error });
|
|
143
|
+
throw error;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
async disconnect() {
|
|
147
|
+
this.logger.info('Disconnecting from server');
|
|
148
|
+
// Voice disconnection functionality moved to consuming packages
|
|
149
|
+
await this.connectionManager.disconnect();
|
|
150
|
+
this.status.connected = false;
|
|
151
|
+
this.status.room = undefined;
|
|
152
|
+
this.status.sessionId = undefined;
|
|
153
|
+
}
|
|
154
|
+
async join(room) {
|
|
155
|
+
this.logger.info('Joining room', { room });
|
|
156
|
+
// 既に接続されている場合は、一旦切断してから再接続
|
|
157
|
+
if (this.status.connected) {
|
|
158
|
+
await this.disconnect();
|
|
159
|
+
}
|
|
160
|
+
// 新しいroomに接続
|
|
161
|
+
const config = this.configProvider.getConfiguration();
|
|
162
|
+
const newUrl = config.hubUrl.replace(/\/[^/]+\/$/, `/${room}/`); // URLのroom部分を更新
|
|
163
|
+
if (this.lastConnectionOptions?.url) {
|
|
164
|
+
// URL形式の接続オプションを使用
|
|
165
|
+
await this.connect({
|
|
166
|
+
url: newUrl,
|
|
167
|
+
token: this.lastConnectionOptions.token,
|
|
168
|
+
voice: this.lastConnectionOptions.voice,
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
else if (this.lastConnectionOptions) {
|
|
172
|
+
// 個別パラメータ形式の接続オプションを使用
|
|
173
|
+
await this.connect({
|
|
174
|
+
...this.lastConnectionOptions,
|
|
175
|
+
hubId: room,
|
|
176
|
+
hubUrl: newUrl,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
// 新規接続
|
|
181
|
+
await this.connect({
|
|
182
|
+
url: newUrl,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
this.status.room = room;
|
|
186
|
+
}
|
|
187
|
+
async leave() {
|
|
188
|
+
this.logger.info('Leaving room');
|
|
189
|
+
if (this.status.connected) {
|
|
190
|
+
await this.disconnect();
|
|
191
|
+
}
|
|
192
|
+
this.status.room = undefined;
|
|
193
|
+
}
|
|
194
|
+
getStatus() {
|
|
195
|
+
return { ...this.status };
|
|
196
|
+
}
|
|
197
|
+
async send(message) {
|
|
198
|
+
return this.rateLimiter.execute('messages', async () => {
|
|
199
|
+
await this.messageService.sendMessage(message);
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
// Alias for send
|
|
203
|
+
async say(message) {
|
|
204
|
+
return this.send(message);
|
|
205
|
+
}
|
|
206
|
+
async move(position) {
|
|
207
|
+
return this.rateLimiter.execute('moves', async () => {
|
|
208
|
+
this.logger.debug('Moving avatar', position);
|
|
209
|
+
await this.avatarController.move(position);
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
async look(target) {
|
|
213
|
+
return this.rateLimiter.execute('looks', async () => {
|
|
214
|
+
if ('userId' in target) {
|
|
215
|
+
this.logger.debug('Looking at user', { userId: target.userId });
|
|
216
|
+
const user = this.userAvatarManager.getUser(target.userId);
|
|
217
|
+
if (!user) {
|
|
218
|
+
throw new Error(`User not found: ${target.userId}`);
|
|
219
|
+
}
|
|
220
|
+
await this.lookAtPosition(user.position);
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
this.logger.debug('Looking at position', target);
|
|
224
|
+
await this.lookAtPosition(target);
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
async lookAtNearest() {
|
|
229
|
+
return this.rateLimiter.execute('looks', async () => {
|
|
230
|
+
this.logger.debug('Looking at nearest user');
|
|
231
|
+
const currentState = this.avatarController.getState();
|
|
232
|
+
if (!currentState) {
|
|
233
|
+
throw new Error('Avatar not spawned');
|
|
234
|
+
}
|
|
235
|
+
const nearestUser = this.userAvatarManager.getNearestUser(currentState.position);
|
|
236
|
+
if (!nearestUser) {
|
|
237
|
+
throw new Error('No users found');
|
|
238
|
+
}
|
|
239
|
+
await this.lookAtPosition(nearestUser.position);
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
async lookAtPosition(target) {
|
|
243
|
+
const currentState = this.avatarController.getState();
|
|
244
|
+
if (!currentState) {
|
|
245
|
+
throw new Error('Avatar not spawned');
|
|
246
|
+
}
|
|
247
|
+
// 向く方向を計算(Y軸回転のみ)
|
|
248
|
+
const dx = target.x - currentState.position.x;
|
|
249
|
+
const dz = target.z - currentState.position.z;
|
|
250
|
+
const angle = Math.atan2(dx, dz);
|
|
251
|
+
// クォータニオンに変換(Y軸回転)
|
|
252
|
+
const rotation = {
|
|
253
|
+
x: 0,
|
|
254
|
+
y: Math.sin(angle / 2),
|
|
255
|
+
z: 0,
|
|
256
|
+
w: Math.cos(angle / 2),
|
|
257
|
+
};
|
|
258
|
+
await this.avatarController.rotate(rotation);
|
|
259
|
+
}
|
|
260
|
+
getUsers() {
|
|
261
|
+
return this.userAvatarManager.getUsers();
|
|
262
|
+
}
|
|
263
|
+
getUser(id) {
|
|
264
|
+
return this.userAvatarManager.getUser(id);
|
|
265
|
+
}
|
|
266
|
+
getUsersNearby(radius) {
|
|
267
|
+
const avatarState = this.avatarController.getState();
|
|
268
|
+
if (!avatarState)
|
|
269
|
+
return [];
|
|
270
|
+
return this.userAvatarManager.getUsersInRange(avatarState.position, radius);
|
|
271
|
+
}
|
|
272
|
+
on(event, handler) {
|
|
273
|
+
super.on(event, handler);
|
|
274
|
+
return this;
|
|
275
|
+
}
|
|
276
|
+
off(event, handler) {
|
|
277
|
+
super.off(event, handler);
|
|
278
|
+
return this;
|
|
279
|
+
}
|
|
280
|
+
// Override EventEmitter methods to return this for chaining
|
|
281
|
+
addListener(eventName, listener) {
|
|
282
|
+
super.addListener(eventName, listener);
|
|
283
|
+
return this;
|
|
284
|
+
}
|
|
285
|
+
removeListener(eventName, listener) {
|
|
286
|
+
super.removeListener(eventName, listener);
|
|
287
|
+
return this;
|
|
288
|
+
}
|
|
289
|
+
setRateLimit(key, perSecond) {
|
|
290
|
+
this.rateLimiter.setRate(key, perSecond);
|
|
291
|
+
}
|
|
292
|
+
getRateLimit(key) {
|
|
293
|
+
return this.rateLimiter.getRate(key);
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Play animation on avatar
|
|
297
|
+
*/
|
|
298
|
+
async playAnimation(animationId, options) {
|
|
299
|
+
try {
|
|
300
|
+
const result = await this.avatarController.playAnimation(animationId, options);
|
|
301
|
+
this.logger.info('Animation played', {
|
|
302
|
+
animationId,
|
|
303
|
+
playbackId: result.playbackId,
|
|
304
|
+
});
|
|
305
|
+
return result;
|
|
306
|
+
}
|
|
307
|
+
catch (error) {
|
|
308
|
+
// Convert to specific error types
|
|
309
|
+
if (error instanceof AvatarNotSpawnedError) {
|
|
310
|
+
throw error;
|
|
311
|
+
}
|
|
312
|
+
if (error instanceof AnimationNotFoundError) {
|
|
313
|
+
throw error;
|
|
314
|
+
}
|
|
315
|
+
throw new AnimationPlaybackError(`Failed to play animation: ${error instanceof Error ? error.message : String(error)}`, error instanceof Error ? error : undefined);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Stop current animation
|
|
320
|
+
*/
|
|
321
|
+
async stopAnimation() {
|
|
322
|
+
await this.avatarController.stopAnimation();
|
|
323
|
+
this.logger.debug('Animation stopped');
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Get available animations
|
|
327
|
+
*/
|
|
328
|
+
async getAvailableAnimations() {
|
|
329
|
+
if (!this.animationService) {
|
|
330
|
+
// Return empty array if animation service not available
|
|
331
|
+
this.logger.warn('Animation service not available');
|
|
332
|
+
return [];
|
|
333
|
+
}
|
|
334
|
+
const config = this.factory.getService(ConfigurationProvider);
|
|
335
|
+
const avatarId = config.getConfiguration().profile.avatarId;
|
|
336
|
+
if (!avatarId) {
|
|
337
|
+
this.logger.warn('No avatar ID configured');
|
|
338
|
+
return [];
|
|
339
|
+
}
|
|
340
|
+
try {
|
|
341
|
+
return await this.animationService.getAvailableAnimations(avatarId);
|
|
342
|
+
}
|
|
343
|
+
catch (error) {
|
|
344
|
+
this.logger.error('Failed to get available animations', { error });
|
|
345
|
+
return [];
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Get current animation
|
|
350
|
+
*/
|
|
351
|
+
getCurrentAnimation() {
|
|
352
|
+
return this.avatarController.getCurrentAnimation();
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Send voice frame (stub - implementation moved to consuming packages)
|
|
356
|
+
*/
|
|
357
|
+
async sendVoiceFrame(_pcmData) {
|
|
358
|
+
throw new Error('Voice functionality not available in SDK core - use consuming package implementation');
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Mute/unmute voice (stub - implementation moved to consuming packages)
|
|
362
|
+
*/
|
|
363
|
+
async muteVoice(muted) {
|
|
364
|
+
this.voiceMuted = muted;
|
|
365
|
+
this.logger.debug(`Voice ${muted ? 'muted' : 'unmuted'} - functionality moved to consuming packages`);
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Check if voice is muted
|
|
369
|
+
*/
|
|
370
|
+
isVoiceMuted() {
|
|
371
|
+
return this.voiceMuted;
|
|
372
|
+
}
|
|
373
|
+
// Voice connection functionality moved to consuming packages
|
|
374
|
+
setupEventHandlers() {
|
|
375
|
+
// Listen for user join events to resync avatar
|
|
376
|
+
this.userAvatarManager.on('userJoined', async (user) => {
|
|
377
|
+
// Resync avatar for new users so they can see the bot
|
|
378
|
+
const currentState = this.avatarController.getState();
|
|
379
|
+
if (currentState) {
|
|
380
|
+
try {
|
|
381
|
+
await this.avatarController.resyncAvatar();
|
|
382
|
+
this.logger.debug(`Resynced avatar for new user: ${user.nickname}`);
|
|
383
|
+
}
|
|
384
|
+
catch (error) {
|
|
385
|
+
this.logger.error('Failed to resync avatar:', { error, user: user.nickname });
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Factory function to create agent client
|
|
393
|
+
*/
|
|
394
|
+
export function createAgentClient(config, clientConfig) {
|
|
395
|
+
const factory = new CoreServiceFactory(config);
|
|
396
|
+
return new DefaultAgentClient(factory, clientConfig);
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Factory function to create agent client with existing factory
|
|
400
|
+
*/
|
|
401
|
+
export function createAgentClientWithFactory(factory, clientConfig) {
|
|
402
|
+
return new DefaultAgentClient(factory, clientConfig);
|
|
403
|
+
}
|
|
404
|
+
//# sourceMappingURL=AgentClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentClient.js","sourceRoot":"","sources":["../../src/sdk/AgentClient.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAO1C,wEAAwE;AACxE,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAMlB,cAAc,EACd,iBAAiB,GAClB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AA4H5C;;GAEG;AACH,MAAM,OAAO,kBAAmB,SAAQ,YAAY;IAC1C,gBAAgB,CAAmB;IACnC,cAAc,CAAiB;IAC/B,iBAAiB,CAAoB;IACrC,iBAAiB,CAAoB;IACrC,gBAAgB,CAAoB;IAC5C,4DAA4D;IACpD,WAAW,GAAG,IAAI,gBAAgB,EAAE,CAAA;IACpC,MAAM,GAAG,SAAS,CAAC,aAAa,CAAC,CAAA;IACjC,OAAO,CAAoB;IAC3B,UAAU,GAAG,KAAK,CAAA;IAClB,MAAM,GAAqB;QACjC,SAAS,EAAE,KAAK;QAChB,UAAU,EAAE,KAAK;QACjB,OAAO,EAAE,CAAC;KACX,CAAA;IACO,qBAAqB,CAAoB;IACzC,cAAc,CAAwB;IAE9C,YAAY,OAA2B,EAAE,SAA4B,EAAE;QACrE,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,8BAA8B;QAC9B,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAA;QAC5D,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;QACxD,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAA;QAC9D,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAA;QAC9D,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAA;QAE/D,oBAAoB;QACpB,IAAI,CAAC;YACH,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAA;QAC9D,CAAC;QAAC,MAAM,CAAC;YACP,gCAAgC;YAChC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAA;QACtD,CAAC;QAED,4DAA4D;QAE5D,qCAAqC;QACrC,IAAI,CAAC,kBAAkB,EAAE,CAAA;QAEzB,WAAW;QACX,IAAI,MAAM,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;QACjE,CAAC;QACD,IAAI,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC;YAC5B,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;QAC3D,CAAC;QACD,IAAI,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC;YAC5B,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;QAC3D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAA0B;QACtC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,OAAO,CAAC,CAAA;QACjD,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAA;QAE7B,aAAa;QACb,IAAI,CAAC,qBAAqB,GAAG,OAAO,CAAA;QAEpC,IAAI,CAAC;YACH,IAAI,SAAiB,CAAA;YACrB,IAAI,KAAa,CAAA;YAEjB,wCAAwC;YACxC,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBACvC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAA;gBAC7B,KAAK,GAAG,OAAO,CAAC,KAAK,CAAA;YACvB,CAAC;iBAAM,CAAC;gBACN,6BAA6B;gBAC7B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;gBAEhC,gBAAgB;gBAChB,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAA;gBAC3D,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;gBAC3C,SAAS,GAAG,GAAG,QAAQ,KAAK,GAAG,CAAC,QAAQ,GAAG,IAAI,EAAE,CAAA;gBAEjD,uBAAuB;gBACvB,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;gBACzD,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;gBAEpB,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAA;gBAClD,CAAC;YACH,CAAC;YAED,8CAA8C;YAC9C,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;gBACnC,SAAS;gBACT,KAAK;aACN,CAAC,CAAA;YAEF,aAAa;YACb,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,CAAA;YACvD,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,SAAS,IAAI,SAAS,CAAA;YAE9C,oBAAoB;YACpB,IAAI,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,CAAA;YACpD,IAAI,OAAO,GAAG,CAAC,CAAA;YACf,OAAO,CAAC,OAAO,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;gBAChC,SAAS;gBACT,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;gBACxD,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,CAAA;gBAChD,OAAO,EAAE,CAAA;YACX,CAAC;YAED,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;YAC/D,CAAC;YAED,yBAAyB;YACzB,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAA;YACnC,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE;gBAC7B,oBAAoB,EAAE,CAAC;gBACvB,UAAU,EAAE,IAAI;gBAChB,YAAY,EAAE,IAAI;gBAClB,cAAc,EAAE,IAAI;gBACpB,gBAAgB,EAAE,IAAI;gBACtB,gBAAgB,EAAE,KAAK;gBACvB,SAAS,EAAE,iBAAiB;aAC7B,CAAC,CAAA;YAEF,qCAAqC;YACrC,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAC5C,qBAAqB,CACI,CAAA;YAC3B,MAAM,MAAM,GAAG,cAAc,CAAC,gBAAgB,EAAE,CAAA;YAEhD,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAC5B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE;oBACnC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ;oBACjC,qBAAqB,EAAE,MAAM,CAAC,qBAAqB;iBACpD,CAAC,CAAA;gBACF,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAC/B,MAAM,CAAC,OAAO,CAAC,QAAQ,EACvB,SAAS,EACT,MAAM,CAAC,qBAAqB,CAC7B,CAAA;YACH,CAAC;YAED,6DAA6D;YAE7D,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAA;YAC5B,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,KAAK,CAAA;YAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE;gBACzC,SAAS;gBACT,KAAK;gBACL,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;gBAChC,YAAY,EAAE,KAAK,EAAE,kDAAkD;aACxE,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,KAAK,CAAA;YAC9B,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAA;YACrB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;YACjD,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAA;QAE7C,gEAAgE;QAEhE,MAAM,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,CAAA;QACzC,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,KAAK,CAAA;QAC7B,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,SAAS,CAAA;QAC5B,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,SAAS,CAAA;IACnC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAY;QACrB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;QAE1C,2BAA2B;QAC3B,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YAC1B,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACzB,CAAC;QAED,aAAa;QACb,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,gBAAgB,EAAE,CAAA;QACrD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,IAAI,GAAG,CAAC,CAAA,CAAC,gBAAgB;QAEhF,IAAI,IAAI,CAAC,qBAAqB,EAAE,GAAG,EAAE,CAAC;YACpC,mBAAmB;YACnB,MAAM,IAAI,CAAC,OAAO,CAAC;gBACjB,GAAG,EAAE,MAAM;gBACX,KAAK,EAAE,IAAI,CAAC,qBAAqB,CAAC,KAAK;gBACvC,KAAK,EAAE,IAAI,CAAC,qBAAqB,CAAC,KAAK;aACxC,CAAC,CAAA;QACJ,CAAC;aAAM,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACtC,uBAAuB;YACvB,MAAM,IAAI,CAAC,OAAO,CAAC;gBACjB,GAAG,IAAI,CAAC,qBAAqB;gBAC7B,KAAK,EAAE,IAAI;gBACX,MAAM,EAAE,MAAM;aACf,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,OAAO;YACP,MAAM,IAAI,CAAC,OAAO,CAAC;gBACjB,GAAG,EAAE,MAAM;aACZ,CAAC,CAAA;QACJ,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAA;IACzB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;QAEhC,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YAC1B,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACzB,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,SAAS,CAAA;IAC9B,CAAC;IAED,SAAS;QACP,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAA;IAC3B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAe;QACxB,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QAChD,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,iBAAiB;IACjB,KAAK,CAAC,GAAG,CAAC,OAAe;QACvB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC3B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAA6C;QACtD,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;YAClD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAA;YAC5C,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC5C,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAgE;QACzE,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;YAClD,IAAI,QAAQ,IAAI,MAAM,EAAE,CAAC;gBACvB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;gBAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;gBAC1D,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;gBACrD,CAAC;gBACD,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAC1C,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAA;gBAChD,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA;YACnC,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;YAClD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAA;YAC5C,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAA;YACrD,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAA;YACvC,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA;YAChF,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAA;YACnC,CAAC;YAED,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;QACjD,CAAC,CAAC,CAAA;IACJ,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,MAA2C;QACtE,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAA;QACrD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAA;QACvC,CAAC;QAED,kBAAkB;QAClB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAA;QAC7C,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAA;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QAEhC,mBAAmB;QACnB,MAAM,QAAQ,GAAG;YACf,CAAC,EAAE,CAAC;YACJ,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;YACtB,CAAC,EAAE,CAAC;YACJ,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;SACvB,CAAA;QAED,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC9C,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAA;IAC1C,CAAC;IAED,OAAO,CAAC,EAAU;QAChB,OAAO,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC3C,CAAC;IAED,cAAc,CAAC,MAAc;QAC3B,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAA;QACpD,IAAI,CAAC,WAAW;YAAE,OAAO,EAAE,CAAA;QAC3B,OAAO,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IAC7E,CAAC;IAED,EAAE,CAAoC,KAAQ,EAAE,OAA6B;QAC3E,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,OAAuC,CAAC,CAAA;QACxD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,GAAG,CAAoC,KAAQ,EAAE,OAA6B;QAC5E,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,OAAuC,CAAC,CAAA;QACzD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,4DAA4D;IACnD,WAAW,CAAC,SAA0B,EAAE,QAAsC;QACrF,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;QACtC,OAAO,IAAI,CAAA;IACb,CAAC;IAEQ,cAAc,CACrB,SAA0B,EAC1B,QAAsC;QAEtC,KAAK,CAAC,cAAc,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;QACzC,OAAO,IAAI,CAAA;IACb,CAAC;IAED,YAAY,CAAC,GAAmC,EAAE,SAAiB;QACjE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;IAC1C,CAAC;IAED,YAAY,CAAC,GAAmC;QAC9C,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACtC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CACjB,WAAmB,EACnB,OAA8B;QAE9B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;YAE9E,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE;gBACnC,WAAW;gBACX,UAAU,EAAE,MAAM,CAAC,UAAU;aAC9B,CAAC,CAAA;YAEF,OAAO,MAAM,CAAA;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,kCAAkC;YAClC,IAAI,KAAK,YAAY,qBAAqB,EAAE,CAAC;gBAC3C,MAAM,KAAK,CAAA;YACb,CAAC;YACD,IAAI,KAAK,YAAY,sBAAsB,EAAE,CAAC;gBAC5C,MAAM,KAAK,CAAA;YACb,CAAC;YACD,MAAM,IAAI,sBAAsB,CAC9B,6BAA6B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EACrF,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAC3C,CAAA;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa;QACjB,MAAM,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,CAAA;QAC3C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAA;IACxC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,sBAAsB;QAC1B,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,wDAAwD;YACxD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAA;YACnD,OAAO,EAAE,CAAA;QACX,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,qBAAqB,CAA2B,CAAA;QACvF,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAA;QAE3D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAA;YAC3C,OAAO,EAAE,CAAA;QACX,CAAC;QAED,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAA;QACrE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;YAClE,OAAO,EAAE,CAAA;QACX,CAAC;IACH,CAAC;IAED;;OAEG;IACH,mBAAmB;QACjB,OAAO,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,CAAA;IACpD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,QAAoB;QACvC,MAAM,IAAI,KAAK,CACb,sFAAsF,CACvF,CAAA;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,KAAc;QAC5B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAA;QACvB,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,SAAS,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,8CAA8C,CACnF,CAAA;IACH,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,IAAI,CAAC,UAAU,CAAA;IACxB,CAAC;IAED,6DAA6D;IAErD,kBAAkB;QACxB,+CAA+C;QAC/C,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACrD,sDAAsD;YACtD,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAA;YACrD,IAAI,YAAY,EAAE,CAAC;gBACjB,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,CAAA;oBAC1C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;gBACrE,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;gBAC/E,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAwB,EACxB,YAAgC;IAEhC,MAAM,OAAO,GAAG,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAA;IAC9C,OAAO,IAAI,kBAAkB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAC1C,OAA2B,EAC3B,YAAgC;IAEhC,OAAO,IAAI,kBAAkB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;AACtD,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SDK error definitions
|
|
3
|
+
*/
|
|
4
|
+
export declare abstract class MetatellError extends Error {
|
|
5
|
+
abstract readonly code: string;
|
|
6
|
+
readonly timestamp: Date;
|
|
7
|
+
constructor(message: string);
|
|
8
|
+
}
|
|
9
|
+
export declare class AuthenticationError extends MetatellError {
|
|
10
|
+
readonly status?: number | undefined;
|
|
11
|
+
readonly code = "AUTH_ERROR";
|
|
12
|
+
constructor(message: string, status?: number | undefined);
|
|
13
|
+
}
|
|
14
|
+
export declare class RateLimitedError extends MetatellError {
|
|
15
|
+
readonly retryAfterMs?: number | undefined;
|
|
16
|
+
readonly code = "RATE_LIMITED";
|
|
17
|
+
constructor(message: string, retryAfterMs?: number | undefined);
|
|
18
|
+
}
|
|
19
|
+
export declare class TransportError extends MetatellError {
|
|
20
|
+
readonly reason?: string | undefined;
|
|
21
|
+
readonly code = "TRANSPORT_ERROR";
|
|
22
|
+
constructor(message: string, reason?: string | undefined);
|
|
23
|
+
}
|
|
24
|
+
export declare class ProtocolError extends MetatellError {
|
|
25
|
+
readonly data?: unknown | undefined;
|
|
26
|
+
readonly code = "PROTOCOL_ERROR";
|
|
27
|
+
constructor(message: string, data?: unknown | undefined);
|
|
28
|
+
}
|
|
29
|
+
export declare class TimeoutError extends MetatellError {
|
|
30
|
+
readonly timeoutMs: number;
|
|
31
|
+
readonly code = "TIMEOUT_ERROR";
|
|
32
|
+
constructor(message: string, timeoutMs: number);
|
|
33
|
+
}
|
|
34
|
+
export declare function isMetatellError(error: unknown): error is MetatellError;
|
|
35
|
+
export declare function isRetryableError(error: unknown): boolean;
|
|
36
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/sdk/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,8BAAsB,aAAc,SAAQ,KAAK;IAC/C,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,SAAS,OAAa;gBAEnB,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,mBAAoB,SAAQ,aAAa;aAKlC,MAAM,CAAC,EAAE,MAAM;IAJjC,QAAQ,CAAC,IAAI,gBAAe;gBAG1B,OAAO,EAAE,MAAM,EACC,MAAM,CAAC,EAAE,MAAM,YAAA;CAIlC;AAED,qBAAa,gBAAiB,SAAQ,aAAa;aAK/B,YAAY,CAAC,EAAE,MAAM;IAJvC,QAAQ,CAAC,IAAI,kBAAiB;gBAG5B,OAAO,EAAE,MAAM,EACC,YAAY,CAAC,EAAE,MAAM,YAAA;CAIxC;AAED,qBAAa,cAAe,SAAQ,aAAa;aAK7B,MAAM,CAAC,EAAE,MAAM;IAJjC,QAAQ,CAAC,IAAI,qBAAoB;gBAG/B,OAAO,EAAE,MAAM,EACC,MAAM,CAAC,EAAE,MAAM,YAAA;CAIlC;AAED,qBAAa,aAAc,SAAQ,aAAa;aAK5B,IAAI,CAAC,EAAE,OAAO;IAJhC,QAAQ,CAAC,IAAI,oBAAmB;gBAG9B,OAAO,EAAE,MAAM,EACC,IAAI,CAAC,EAAE,OAAO,YAAA;CAIjC;AAED,qBAAa,YAAa,SAAQ,aAAa;aAK3B,SAAS,EAAE,MAAM;IAJnC,QAAQ,CAAC,IAAI,mBAAkB;gBAG7B,OAAO,EAAE,MAAM,EACC,SAAS,EAAE,MAAM;CAIpC;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAEtE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAQxD"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SDK error definitions
|
|
3
|
+
*/
|
|
4
|
+
export class MetatellError extends Error {
|
|
5
|
+
timestamp = new Date();
|
|
6
|
+
constructor(message) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.name = this.constructor.name;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export class AuthenticationError extends MetatellError {
|
|
12
|
+
status;
|
|
13
|
+
code = 'AUTH_ERROR';
|
|
14
|
+
constructor(message, status) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.status = status;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export class RateLimitedError extends MetatellError {
|
|
20
|
+
retryAfterMs;
|
|
21
|
+
code = 'RATE_LIMITED';
|
|
22
|
+
constructor(message, retryAfterMs) {
|
|
23
|
+
super(message);
|
|
24
|
+
this.retryAfterMs = retryAfterMs;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export class TransportError extends MetatellError {
|
|
28
|
+
reason;
|
|
29
|
+
code = 'TRANSPORT_ERROR';
|
|
30
|
+
constructor(message, reason) {
|
|
31
|
+
super(message);
|
|
32
|
+
this.reason = reason;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export class ProtocolError extends MetatellError {
|
|
36
|
+
data;
|
|
37
|
+
code = 'PROTOCOL_ERROR';
|
|
38
|
+
constructor(message, data) {
|
|
39
|
+
super(message);
|
|
40
|
+
this.data = data;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export class TimeoutError extends MetatellError {
|
|
44
|
+
timeoutMs;
|
|
45
|
+
code = 'TIMEOUT_ERROR';
|
|
46
|
+
constructor(message, timeoutMs) {
|
|
47
|
+
super(message);
|
|
48
|
+
this.timeoutMs = timeoutMs;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export function isMetatellError(error) {
|
|
52
|
+
return error instanceof MetatellError;
|
|
53
|
+
}
|
|
54
|
+
export function isRetryableError(error) {
|
|
55
|
+
if (!isMetatellError(error))
|
|
56
|
+
return false;
|
|
57
|
+
return (error instanceof TransportError ||
|
|
58
|
+
error instanceof TimeoutError ||
|
|
59
|
+
(error instanceof RateLimitedError && error.retryAfterMs !== undefined));
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/sdk/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,OAAgB,aAAc,SAAQ,KAAK;IAEtC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAA;IAE/B,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAA;IACnC,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,aAAa;IAKlC;IAJT,IAAI,GAAG,YAAY,CAAA;IAE5B,YACE,OAAe,EACC,MAAe;QAE/B,KAAK,CAAC,OAAO,CAAC,CAAA;QAFE,WAAM,GAAN,MAAM,CAAS;IAGjC,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,aAAa;IAK/B;IAJT,IAAI,GAAG,cAAc,CAAA;IAE9B,YACE,OAAe,EACC,YAAqB;QAErC,KAAK,CAAC,OAAO,CAAC,CAAA;QAFE,iBAAY,GAAZ,YAAY,CAAS;IAGvC,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,aAAa;IAK7B;IAJT,IAAI,GAAG,iBAAiB,CAAA;IAEjC,YACE,OAAe,EACC,MAAe;QAE/B,KAAK,CAAC,OAAO,CAAC,CAAA;QAFE,WAAM,GAAN,MAAM,CAAS;IAGjC,CAAC;CACF;AAED,MAAM,OAAO,aAAc,SAAQ,aAAa;IAK5B;IAJT,IAAI,GAAG,gBAAgB,CAAA;IAEhC,YACE,OAAe,EACC,IAAc;QAE9B,KAAK,CAAC,OAAO,CAAC,CAAA;QAFE,SAAI,GAAJ,IAAI,CAAU;IAGhC,CAAC;CACF;AAED,MAAM,OAAO,YAAa,SAAQ,aAAa;IAK3B;IAJT,IAAI,GAAG,eAAe,CAAA;IAE/B,YACE,OAAe,EACC,SAAiB;QAEjC,KAAK,CAAC,OAAO,CAAC,CAAA;QAFE,cAAS,GAAT,SAAS,CAAQ;IAGnC,CAAC;CACF;AAED,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,OAAO,KAAK,YAAY,aAAa,CAAA;AACvC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IAEzC,OAAO,CACL,KAAK,YAAY,cAAc;QAC/B,KAAK,YAAY,YAAY;QAC7B,CAAC,KAAK,YAAY,gBAAgB,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,CAAC,CACxE,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event emitter for log-related events
|
|
3
|
+
* Provides reactive log updates to consumers
|
|
4
|
+
*/
|
|
5
|
+
import type { CoreLogRecord } from './index.js';
|
|
6
|
+
export type LogEventHandler = (records: CoreLogRecord[]) => void;
|
|
7
|
+
export interface ILogEventEmitter {
|
|
8
|
+
/**
|
|
9
|
+
* Subscribe to new log events
|
|
10
|
+
*/
|
|
11
|
+
onNewLogs(handler: LogEventHandler): () => void;
|
|
12
|
+
/**
|
|
13
|
+
* Emit new log records
|
|
14
|
+
*/
|
|
15
|
+
emitNewLogs(records: CoreLogRecord[]): void;
|
|
16
|
+
/**
|
|
17
|
+
* Remove all log event listeners
|
|
18
|
+
*/
|
|
19
|
+
removeAllListeners(): void;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Implementation of log event emitter
|
|
23
|
+
*/
|
|
24
|
+
export declare class LogEventEmitter implements ILogEventEmitter {
|
|
25
|
+
private handlers;
|
|
26
|
+
onNewLogs(handler: LogEventHandler): () => void;
|
|
27
|
+
emitNewLogs(records: CoreLogRecord[]): void;
|
|
28
|
+
removeAllListeners(): void;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get the global log event emitter
|
|
32
|
+
*/
|
|
33
|
+
export declare function getLogEventEmitter(): ILogEventEmitter;
|
|
34
|
+
/**
|
|
35
|
+
* Reset the log event emitter (mainly for testing)
|
|
36
|
+
*/
|
|
37
|
+
export declare function resetLogEventEmitter(): void;
|
|
38
|
+
//# sourceMappingURL=LogEventEmitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LogEventEmitter.d.ts","sourceRoot":"","sources":["../../../src/sdk/logging/LogEventEmitter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/C,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,KAAK,IAAI,CAAA;AAEhE,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,IAAI,CAAA;IAE/C;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,IAAI,CAAA;IAE3C;;OAEG;IACH,kBAAkB,IAAI,IAAI,CAAA;CAC3B;AAED;;GAEG;AACH,qBAAa,eAAgB,YAAW,gBAAgB;IACtD,OAAO,CAAC,QAAQ,CAAkC;IAElD,SAAS,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,IAAI;IAS/C,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,IAAI;IAa3C,kBAAkB,IAAI,IAAI;CAG3B;AAKD;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,gBAAgB,CAKrD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAK3C"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event emitter for log-related events
|
|
3
|
+
* Provides reactive log updates to consumers
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Implementation of log event emitter
|
|
7
|
+
*/
|
|
8
|
+
export class LogEventEmitter {
|
|
9
|
+
handlers = new Set();
|
|
10
|
+
onNewLogs(handler) {
|
|
11
|
+
this.handlers.add(handler);
|
|
12
|
+
// Return unsubscribe function
|
|
13
|
+
return () => {
|
|
14
|
+
this.handlers.delete(handler);
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
emitNewLogs(records) {
|
|
18
|
+
if (records.length === 0)
|
|
19
|
+
return;
|
|
20
|
+
// Notify all handlers
|
|
21
|
+
for (const handler of this.handlers) {
|
|
22
|
+
try {
|
|
23
|
+
handler(records);
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
console.error('Error in log event handler:', error);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
removeAllListeners() {
|
|
31
|
+
this.handlers.clear();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// Global singleton instance
|
|
35
|
+
let globalLogEventEmitter = null;
|
|
36
|
+
/**
|
|
37
|
+
* Get the global log event emitter
|
|
38
|
+
*/
|
|
39
|
+
export function getLogEventEmitter() {
|
|
40
|
+
if (!globalLogEventEmitter) {
|
|
41
|
+
globalLogEventEmitter = new LogEventEmitter();
|
|
42
|
+
}
|
|
43
|
+
return globalLogEventEmitter;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Reset the log event emitter (mainly for testing)
|
|
47
|
+
*/
|
|
48
|
+
export function resetLogEventEmitter() {
|
|
49
|
+
if (globalLogEventEmitter) {
|
|
50
|
+
globalLogEventEmitter.removeAllListeners();
|
|
51
|
+
}
|
|
52
|
+
globalLogEventEmitter = null;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=LogEventEmitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LogEventEmitter.js","sourceRoot":"","sources":["../../../src/sdk/logging/LogEventEmitter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAuBH;;GAEG;AACH,MAAM,OAAO,eAAe;IAClB,QAAQ,GAAyB,IAAI,GAAG,EAAE,CAAA;IAElD,SAAS,CAAC,OAAwB;QAChC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAE1B,8BAA8B;QAC9B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAC/B,CAAC,CAAA;IACH,CAAC;IAED,WAAW,CAAC,OAAwB;QAClC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QAEhC,sBAAsB;QACtB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,IAAI,CAAC;gBACH,OAAO,CAAC,OAAO,CAAC,CAAA;YAClB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAA;YACrD,CAAC;QACH,CAAC;IACH,CAAC;IAED,kBAAkB;QAChB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;IACvB,CAAC;CACF;AAED,4BAA4B;AAC5B,IAAI,qBAAqB,GAA4B,IAAI,CAAA;AAEzD;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC3B,qBAAqB,GAAG,IAAI,eAAe,EAAE,CAAA;IAC/C,CAAC;IACD,OAAO,qBAAqB,CAAA;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,IAAI,qBAAqB,EAAE,CAAC;QAC1B,qBAAqB,CAAC,kBAAkB,EAAE,CAAA;IAC5C,CAAC;IACD,qBAAqB,GAAG,IAAI,CAAA;AAC9B,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SDK Logging module - SPI and default implementation
|
|
3
|
+
*/
|
|
4
|
+
export { getLogEventEmitter, type ILogEventEmitter, type LogEventHandler, resetLogEventEmitter, } from './LogEventEmitter.js';
|
|
5
|
+
export { DefaultLoggerProvider, getRingBuffer } from './providers/default.js';
|
|
6
|
+
export * from './spi.js';
|
|
7
|
+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
8
|
+
export interface LogRecord {
|
|
9
|
+
ts: number;
|
|
10
|
+
level: LogLevel;
|
|
11
|
+
module: string;
|
|
12
|
+
msg: string;
|
|
13
|
+
meta?: unknown;
|
|
14
|
+
}
|
|
15
|
+
export interface RingBufferLike {
|
|
16
|
+
drain(): LogRecord[];
|
|
17
|
+
drainNew?(): LogRecord[];
|
|
18
|
+
clear(): void;
|
|
19
|
+
size(): number;
|
|
20
|
+
}
|
|
21
|
+
export type { LogRecord as CoreLogRecord };
|
|
22
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/sdk/logging/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,kBAAkB,EAClB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,oBAAoB,GACrB,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAE7E,cAAc,UAAU,CAAA;AAGxB,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;AAE1D,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,QAAQ,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAGD,MAAM,WAAW,cAAc;IAC7B,KAAK,IAAI,SAAS,EAAE,CAAA;IACpB,QAAQ,CAAC,IAAI,SAAS,EAAE,CAAA;IACxB,KAAK,IAAI,IAAI,CAAA;IACb,IAAI,IAAI,MAAM,CAAA;CACf;AAGD,YAAY,EAAE,SAAS,IAAI,aAAa,EAAE,CAAA"}
|