@builderbot/manager 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.
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @builderbot/manager
3
+ * Multi-tenant bot manager for BuilderBot
4
+ */
5
+ export { BotManager } from './bot-manager';
6
+ export { BotManagerApi } from './api';
7
+ export { FlowRegistry, type FlowDefinition } from './flow-registry';
8
+ export { RateLimiter, type RateLimiterConfig } from './rate-limiter';
9
+ export { PersistenceManager, getDefaultPersistence, resetDefaultPersistence } from './persistence';
10
+ export { createBotSchema, updateBotSchema, sendMessageSchema, restartBotSchema, createFlowSchema, updateFlowSchema, validate } from './schemas';
11
+ export type { TenantConfig, BotInstance, BotManagerConfig, BotStatus, BotManagerEvent, BotManagerEventHandler, Flow, ProviderClass, DatabaseClass, ProviderFactory, DatabaseFactory, ReconnectState } from './types';
12
+ export type { CreateBotInput, UpdateBotInput, SendMessageInput, RestartBotInput, CreateFlowInput, UpdateFlowInput, FlowStep, ValidationResult } from './schemas';
13
+ export type { SerializableBotConfig, PersistenceConfig } from './persistence';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAA;AACnE,OAAO,EAAE,WAAW,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AACpE,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,uBAAuB,EACxB,MAAM,eAAe,CAAA;AAGtB,OAAO,EACL,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,QAAQ,EACT,MAAM,WAAW,CAAA;AAGlB,YAAY,EACV,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,SAAS,EACT,eAAe,EACf,sBAAsB,EACtB,IAAI,EACJ,aAAa,EACb,aAAa,EACb,eAAe,EACf,eAAe,EACf,cAAc,EACf,MAAM,SAAS,CAAA;AAGhB,YAAY,EACV,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,eAAe,EACf,QAAQ,EACR,gBAAgB,EACjB,MAAM,WAAW,CAAA;AAGlB,YAAY,EACV,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,eAAe,CAAA"}
@@ -0,0 +1,90 @@
1
+ import type { TenantConfig } from './types';
2
+ /**
3
+ * Serializable bot configuration (without Flow objects)
4
+ */
5
+ export interface SerializableBotConfig {
6
+ tenantId: string;
7
+ name?: string;
8
+ flowIds: string[];
9
+ port?: number;
10
+ providerOptions?: Record<string, any>;
11
+ databaseOptions?: Record<string, any>;
12
+ providerClassName?: string;
13
+ databaseClassName?: string;
14
+ createdAt: string;
15
+ }
16
+ /**
17
+ * Persistence configuration
18
+ */
19
+ export interface PersistenceConfig {
20
+ /** Directory to store persistence files */
21
+ persistenceDir?: string;
22
+ /** File name for the persistence file */
23
+ fileName?: string;
24
+ /** Whether to auto-save on changes */
25
+ autoSave?: boolean;
26
+ }
27
+ /**
28
+ * Persistence manager for saving/loading bot configurations
29
+ */
30
+ export declare class PersistenceManager {
31
+ private config;
32
+ private filePath;
33
+ private data;
34
+ constructor(config?: PersistenceConfig);
35
+ /**
36
+ * Save a bot configuration
37
+ */
38
+ save(tenantId: string, config: Omit<TenantConfig, 'flows'> & {
39
+ flowIds: string[];
40
+ }, providerClassName?: string, databaseClassName?: string): void;
41
+ /**
42
+ * Remove a bot configuration
43
+ */
44
+ remove(tenantId: string): boolean;
45
+ /**
46
+ * Get a bot configuration
47
+ */
48
+ get(tenantId: string): SerializableBotConfig | undefined;
49
+ /**
50
+ * Get all bot configurations
51
+ */
52
+ getAll(): SerializableBotConfig[];
53
+ /**
54
+ * Check if a bot configuration exists
55
+ */
56
+ has(tenantId: string): boolean;
57
+ /**
58
+ * Clear all configurations
59
+ */
60
+ clear(): void;
61
+ /**
62
+ * Get count of stored configurations
63
+ */
64
+ count(): number;
65
+ /**
66
+ * Persist data to file
67
+ */
68
+ persist(): void;
69
+ /**
70
+ * Load data from file
71
+ */
72
+ load(): void;
73
+ /**
74
+ * Delete the persistence file
75
+ */
76
+ deleteFile(): void;
77
+ /**
78
+ * Get the file path
79
+ */
80
+ getFilePath(): string;
81
+ }
82
+ /**
83
+ * Get or create the default persistence manager
84
+ */
85
+ export declare function getDefaultPersistence(config?: PersistenceConfig): PersistenceManager;
86
+ /**
87
+ * Reset the default persistence manager (useful for testing)
88
+ */
89
+ export declare function resetDefaultPersistence(): void;
90
+ //# sourceMappingURL=persistence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../src/persistence.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAQ,MAAM,SAAS,CAAA;AAEjD;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACrC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACrC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,2CAA2C;IAC3C,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,IAAI,CAAgD;gBAEhD,MAAM,GAAE,iBAAsB;IAU1C;;OAEG;IACH,IAAI,CACF,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,GAAG;QAAE,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,EAC3D,iBAAiB,CAAC,EAAE,MAAM,EAC1B,iBAAiB,CAAC,EAAE,MAAM,GACzB,IAAI;IAoBP;;OAEG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAUjC;;OAEG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS;IAIxD;;OAEG;IACH,MAAM,IAAI,qBAAqB,EAAE;IAIjC;;OAEG;IACH,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAI9B;;OAEG;IACH,KAAK,IAAI,IAAI;IAQb;;OAEG;IACH,KAAK,IAAI,MAAM;IAIf;;OAEG;IACH,OAAO,IAAI,IAAI;IAmBf;;OAEG;IACH,IAAI,IAAI,IAAI;IAkBZ;;OAEG;IACH,UAAU,IAAI,IAAI;IAWlB;;OAEG;IACH,WAAW,IAAI,MAAM;CAGtB;AAOD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,CAAC,EAAE,iBAAiB,GAAG,kBAAkB,CAKpF;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C"}
@@ -0,0 +1,65 @@
1
+ import type { IncomingMessage, ServerResponse } from 'http';
2
+ /**
3
+ * Rate limiter configuration
4
+ */
5
+ export interface RateLimiterConfig {
6
+ /** Maximum number of requests per window */
7
+ maxRequests?: number;
8
+ /** Window size in milliseconds */
9
+ windowMs?: number;
10
+ /** Message to return when rate limited */
11
+ message?: string;
12
+ /** Skip rate limiting for certain paths */
13
+ skipPaths?: string[];
14
+ /** Custom key extractor (default: IP address) */
15
+ keyExtractor?: (req: IncomingMessage) => string;
16
+ }
17
+ /**
18
+ * Simple in-memory rate limiter
19
+ */
20
+ export declare class RateLimiter {
21
+ private config;
22
+ private store;
23
+ private cleanupInterval;
24
+ constructor(config?: RateLimiterConfig);
25
+ /**
26
+ * Default key extractor - uses IP address
27
+ */
28
+ private defaultKeyExtractor;
29
+ /**
30
+ * Check if request should be rate limited
31
+ */
32
+ isRateLimited(req: IncomingMessage): {
33
+ limited: boolean;
34
+ remaining: number;
35
+ resetTime: number;
36
+ };
37
+ /**
38
+ * Create middleware function
39
+ */
40
+ middleware(): (req: IncomingMessage, res: ServerResponse, next: () => void) => void;
41
+ /**
42
+ * Reset rate limit for a specific key
43
+ */
44
+ reset(key: string): void;
45
+ /**
46
+ * Clear all rate limit data
47
+ */
48
+ clear(): void;
49
+ /**
50
+ * Cleanup expired entries
51
+ */
52
+ private cleanup;
53
+ /**
54
+ * Stop the cleanup interval
55
+ */
56
+ destroy(): void;
57
+ /**
58
+ * Get current stats
59
+ */
60
+ getStats(): {
61
+ activeKeys: number;
62
+ config: RateLimiterConfig;
63
+ };
64
+ }
65
+ //# sourceMappingURL=rate-limiter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../src/rate-limiter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAA;AAE3D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,0CAA0C;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,iDAAiD;IACjD,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,MAAM,CAAA;CAChD;AAUD;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,KAAK,CAAyC;IACtD,OAAO,CAAC,eAAe,CAA8C;gBAEzD,MAAM,GAAE,iBAAsB;IAa1C;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAS3B;;OAEG;IACH,aAAa,CAAC,GAAG,EAAE,eAAe,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IA8C/F;;OAEG;IACH,UAAU,KACA,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,MAAM,IAAI;IAsBrE;;OAEG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIxB;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,OAAO,CAAC,OAAO;IASf;;OAEG;IACH,OAAO,IAAI,IAAI;IAQf;;OAEG;IACH,QAAQ,IAAI;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,iBAAiB,CAAA;KAAE;CAM9D"}
@@ -0,0 +1,213 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Schema for creating a new bot
4
+ */
5
+ export declare const createBotSchema: z.ZodObject<{
6
+ tenantId: z.ZodEffects<z.ZodString, string, string>;
7
+ name: z.ZodOptional<z.ZodString>;
8
+ flowIds: z.ZodArray<z.ZodString, "many">;
9
+ port: z.ZodOptional<z.ZodNumber>;
10
+ providerOptions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
11
+ }, "strip", z.ZodTypeAny, {
12
+ tenantId?: string;
13
+ name?: string;
14
+ flowIds?: string[];
15
+ port?: number;
16
+ providerOptions?: Record<string, any>;
17
+ }, {
18
+ tenantId?: string;
19
+ name?: string;
20
+ flowIds?: string[];
21
+ port?: number;
22
+ providerOptions?: Record<string, any>;
23
+ }>;
24
+ /**
25
+ * Schema for updating a bot
26
+ */
27
+ export declare const updateBotSchema: z.ZodObject<{
28
+ name: z.ZodOptional<z.ZodString>;
29
+ }, "strip", z.ZodTypeAny, {
30
+ name?: string;
31
+ }, {
32
+ name?: string;
33
+ }>;
34
+ /**
35
+ * Schema for sending a message
36
+ */
37
+ export declare const sendMessageSchema: z.ZodObject<{
38
+ number: z.ZodString;
39
+ message: z.ZodString;
40
+ media: z.ZodOptional<z.ZodString>;
41
+ }, "strip", z.ZodTypeAny, {
42
+ number?: string;
43
+ message?: string;
44
+ media?: string;
45
+ }, {
46
+ number?: string;
47
+ message?: string;
48
+ media?: string;
49
+ }>;
50
+ /**
51
+ * Schema for restarting a bot
52
+ */
53
+ export declare const restartBotSchema: z.ZodObject<{
54
+ flowIds: z.ZodArray<z.ZodString, "many">;
55
+ port: z.ZodOptional<z.ZodNumber>;
56
+ name: z.ZodOptional<z.ZodString>;
57
+ }, "strip", z.ZodTypeAny, {
58
+ name?: string;
59
+ flowIds?: string[];
60
+ port?: number;
61
+ }, {
62
+ name?: string;
63
+ flowIds?: string[];
64
+ port?: number;
65
+ }>;
66
+ /**
67
+ * Flow step schema - defines a single step in the flow
68
+ */
69
+ declare const flowStepSchema: z.ZodObject<{
70
+ /** The message to send */
71
+ answer: z.ZodString;
72
+ /** Optional delay before sending (ms) */
73
+ delay: z.ZodOptional<z.ZodNumber>;
74
+ /** Optional media URL to attach */
75
+ media: z.ZodOptional<z.ZodString>;
76
+ /** Whether to capture user response */
77
+ capture: z.ZodOptional<z.ZodBoolean>;
78
+ }, "strip", z.ZodTypeAny, {
79
+ media?: string;
80
+ answer?: string;
81
+ delay?: number;
82
+ capture?: boolean;
83
+ }, {
84
+ media?: string;
85
+ answer?: string;
86
+ delay?: number;
87
+ capture?: boolean;
88
+ }>;
89
+ /**
90
+ * Schema for creating a dynamic flow
91
+ */
92
+ export declare const createFlowSchema: z.ZodObject<{
93
+ /** Unique flow identifier */
94
+ id: z.ZodEffects<z.ZodString, string, string>;
95
+ /** Display name for the flow */
96
+ name: z.ZodString;
97
+ /** Keywords that trigger this flow */
98
+ keyword: z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodString, "many">]>;
99
+ /** Steps/answers in the flow */
100
+ steps: z.ZodArray<z.ZodObject<{
101
+ /** The message to send */
102
+ answer: z.ZodString;
103
+ /** Optional delay before sending (ms) */
104
+ delay: z.ZodOptional<z.ZodNumber>;
105
+ /** Optional media URL to attach */
106
+ media: z.ZodOptional<z.ZodString>;
107
+ /** Whether to capture user response */
108
+ capture: z.ZodOptional<z.ZodBoolean>;
109
+ }, "strip", z.ZodTypeAny, {
110
+ media?: string;
111
+ answer?: string;
112
+ delay?: number;
113
+ capture?: boolean;
114
+ }, {
115
+ media?: string;
116
+ answer?: string;
117
+ delay?: number;
118
+ capture?: boolean;
119
+ }>, "many">;
120
+ }, "strip", z.ZodTypeAny, {
121
+ name?: string;
122
+ id?: string;
123
+ keyword?: string | string[];
124
+ steps?: {
125
+ media?: string;
126
+ answer?: string;
127
+ delay?: number;
128
+ capture?: boolean;
129
+ }[];
130
+ }, {
131
+ name?: string;
132
+ id?: string;
133
+ keyword?: string | string[];
134
+ steps?: {
135
+ media?: string;
136
+ answer?: string;
137
+ delay?: number;
138
+ capture?: boolean;
139
+ }[];
140
+ }>;
141
+ /**
142
+ * Schema for updating a flow
143
+ */
144
+ export declare const updateFlowSchema: z.ZodObject<{
145
+ name: z.ZodOptional<z.ZodString>;
146
+ keyword: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodString, "many">]>>;
147
+ steps: z.ZodOptional<z.ZodArray<z.ZodObject<{
148
+ /** The message to send */
149
+ answer: z.ZodString;
150
+ /** Optional delay before sending (ms) */
151
+ delay: z.ZodOptional<z.ZodNumber>;
152
+ /** Optional media URL to attach */
153
+ media: z.ZodOptional<z.ZodString>;
154
+ /** Whether to capture user response */
155
+ capture: z.ZodOptional<z.ZodBoolean>;
156
+ }, "strip", z.ZodTypeAny, {
157
+ media?: string;
158
+ answer?: string;
159
+ delay?: number;
160
+ capture?: boolean;
161
+ }, {
162
+ media?: string;
163
+ answer?: string;
164
+ delay?: number;
165
+ capture?: boolean;
166
+ }>, "many">>;
167
+ }, "strip", z.ZodTypeAny, {
168
+ name?: string;
169
+ keyword?: string | string[];
170
+ steps?: {
171
+ media?: string;
172
+ answer?: string;
173
+ delay?: number;
174
+ capture?: boolean;
175
+ }[];
176
+ }, {
177
+ name?: string;
178
+ keyword?: string | string[];
179
+ steps?: {
180
+ media?: string;
181
+ answer?: string;
182
+ delay?: number;
183
+ capture?: boolean;
184
+ }[];
185
+ }>;
186
+ /**
187
+ * Type exports inferred from schemas
188
+ */
189
+ export type CreateBotInput = z.infer<typeof createBotSchema>;
190
+ export type UpdateBotInput = z.infer<typeof updateBotSchema>;
191
+ export type SendMessageInput = z.infer<typeof sendMessageSchema>;
192
+ export type RestartBotInput = z.infer<typeof restartBotSchema>;
193
+ export type CreateFlowInput = z.infer<typeof createFlowSchema>;
194
+ export type UpdateFlowInput = z.infer<typeof updateFlowSchema>;
195
+ export type FlowStep = z.infer<typeof flowStepSchema>;
196
+ /**
197
+ * Validation result type
198
+ */
199
+ export interface ValidationResult<T> {
200
+ success: boolean;
201
+ data?: T;
202
+ error?: string;
203
+ errors?: Array<{
204
+ field: string;
205
+ message: string;
206
+ }>;
207
+ }
208
+ /**
209
+ * Validate data against a Zod schema
210
+ */
211
+ export declare function validate<T>(schema: z.ZodSchema<T>, data: unknown): ValidationResult<T>;
212
+ export {};
213
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAoBvB;;GAEG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;EAiB1B,CAAA;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe;;;;;;EAM1B,CAAA;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;EAc5B,CAAA;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;EAe3B,CAAA;AAOF;;GAEG;AACH,QAAA,MAAM,cAAc;IAClB,0BAA0B;;IAE1B,yCAAyC;;IAEzC,mCAAmC;;IAEnC,uCAAuC;;;;;;;;;;;;EAEvC,CAAA;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB;IAC3B,6BAA6B;;IAU7B,gCAAgC;;IAEhC,sCAAsC;;IAKtC,gCAAgC;;QA/BhC,0BAA0B;;QAE1B,yCAAyC;;QAEzC,mCAAmC;;QAEnC,uCAAuC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BvC,CAAA;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;;QAtC3B,0BAA0B;;QAE1B,yCAAyC;;QAEzC,mCAAmC;;QAEnC,uCAAuC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuCvC,CAAA;AAEF;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAA;AAC5D,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAA;AAC5D,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAChE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAC9D,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAC9D,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAC9D,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA;AAErD;;GAEG;AACH,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,CAAC,CAAA;IACR,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACnD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAoBtF"}