@blockspark/chat-widget 1.0.0 → 1.0.2

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/styles.css CHANGED
@@ -7,7 +7,7 @@
7
7
  position: fixed;
8
8
  bottom: 20px;
9
9
  right: 90px;
10
- background: linear-gradient(135deg, #2d7a4f 0%, #1f5937 100%);
10
+ background: linear-gradient(135deg, #091e3e 0%, #091e3e 100%);
11
11
  color: white;
12
12
  padding: 20px;
13
13
  border-radius: 12px;
@@ -90,7 +90,7 @@
90
90
  width: 60px;
91
91
  height: 60px;
92
92
  border-radius: 50%;
93
- background: linear-gradient(135deg, #2d7a4f 0%, #1f5937 100%);
93
+ background: linear-gradient(135deg, #091e3e 0%, #091e3e 100%);
94
94
  color: white;
95
95
  border: none;
96
96
  cursor: pointer;
@@ -142,7 +142,7 @@
142
142
 
143
143
  /* Chat Header */
144
144
  .custom-chat-header {
145
- background: linear-gradient(135deg, #2d7a4f 0%, #1f5937 100%);
145
+ background: #091E3E;
146
146
  color: white;
147
147
  padding: 20px;
148
148
  display: flex;
@@ -165,6 +165,40 @@
165
165
  font-size: 12px;
166
166
  opacity: 0.9;
167
167
  }
168
+
169
+ .custom-mode-indicator {
170
+ font-size: 11px;
171
+ margin-left: 4px;
172
+ opacity: 0.85;
173
+ }
174
+
175
+ .custom-mode-badge {
176
+ font-size: 10px;
177
+ margin-top: 6px;
178
+ padding: 4px 8px;
179
+ background: rgba(255, 255, 255, 0.15);
180
+ border-radius: 12px;
181
+ display: inline-block;
182
+ font-weight: 500;
183
+ letter-spacing: 0.5px;
184
+ }
185
+
186
+ .custom-agent-info {
187
+ font-size: 11px;
188
+ margin-top: 4px;
189
+ opacity: 0.9;
190
+ display: flex;
191
+ align-items: center;
192
+ gap: 4px;
193
+ }
194
+
195
+ .custom-agent-label {
196
+ opacity: 0.8;
197
+ }
198
+
199
+ .custom-agent-name {
200
+ font-weight: 500;
201
+ }
168
202
 
169
203
  .custom-chat-close-btn {
170
204
  background: none;
@@ -264,6 +298,10 @@
264
298
  align-self: flex-start;
265
299
  }
266
300
 
301
+ .custom-message-agent {
302
+ align-self: flex-start;
303
+ }
304
+
267
305
  .custom-message-content {
268
306
  padding: 12px 16px;
269
307
  border-radius: 16px;
@@ -273,7 +311,7 @@
273
311
  }
274
312
 
275
313
  .custom-message-user .custom-message-content {
276
- background: linear-gradient(135deg, #2d7a4f 0%, #1f5937 100%);
314
+ background: #091E3E;
277
315
  color: white;
278
316
  border-bottom-right-radius: 4px;
279
317
  }
@@ -285,6 +323,13 @@
285
323
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
286
324
  }
287
325
 
326
+ .custom-message-agent .custom-message-content {
327
+ background: white;
328
+ color: #333;
329
+ border-bottom-left-radius: 4px;
330
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
331
+ }
332
+
288
333
  .custom-message-time {
289
334
  font-size: 10px;
290
335
  color: #999;
@@ -308,8 +353,8 @@
308
353
 
309
354
  .custom-chip-button {
310
355
  background: white;
311
- border: 1.5px solid #2d7a4f;
312
- color: #2d7a4f;
356
+ border: 1.5px solid #091e3e;
357
+ color: #091e3e;
313
358
  padding: 8px 16px;
314
359
  border-radius: 20px;
315
360
  font-size: 13px;
@@ -321,7 +366,7 @@
321
366
  }
322
367
 
323
368
  .custom-chip-button:hover {
324
- background: linear-gradient(135deg, #2d7a4f 0%, #1f5937 100%);
369
+ background: linear-gradient(135deg, #091e3e 0%, #091e3e 100%);
325
370
  color: white;
326
371
  transform: translateY(-1px);
327
372
  box-shadow: 0 2px 6px rgba(45, 122, 79, 0.3);
@@ -372,6 +417,44 @@
372
417
  opacity: 1;
373
418
  }
374
419
  }
420
+
421
+ /* Agent Typing Indicator */
422
+ .custom-agent-typing-indicator {
423
+ display: flex;
424
+ align-items: center;
425
+ gap: 8px;
426
+ padding: 8px 16px;
427
+ margin: 4px 0;
428
+ color: #666;
429
+ font-size: 14px;
430
+ font-style: italic;
431
+ }
432
+
433
+ .custom-typing-dots {
434
+ display: inline-flex;
435
+ gap: 2px;
436
+ }
437
+
438
+ .custom-typing-dots span {
439
+ display: inline-block;
440
+ width: 4px;
441
+ height: 4px;
442
+ border-radius: 50%;
443
+ background-color: #666;
444
+ animation: customTypingBounce 1.4s infinite ease-in-out;
445
+ }
446
+
447
+ .custom-typing-dots span:nth-child(2) {
448
+ animation-delay: -0.16s;
449
+ }
450
+
451
+ .custom-typing-dots span:nth-child(3) {
452
+ animation-delay: -0.32s;
453
+ }
454
+
455
+ .custom-typing-text {
456
+ color: #666;
457
+ }
375
458
 
376
459
  /* Chat Input Form */
377
460
  .custom-chat-input-form {
@@ -382,6 +465,47 @@
382
465
  gap: 8px;
383
466
  flex-shrink: 0;
384
467
  }
468
+
469
+ /* Resolved (terminal) banner */
470
+ .custom-chat-resolved-banner {
471
+ display: flex;
472
+ align-items: center;
473
+ justify-content: space-between;
474
+ gap: 12px;
475
+ padding: 12px 16px;
476
+ border-top: 1px solid #e0e0e0;
477
+ background: #f6f8ff;
478
+ color: #1f2a44;
479
+ flex-shrink: 0;
480
+ }
481
+
482
+ .custom-chat-resolved-text {
483
+ flex: 1;
484
+ font-size: 13px;
485
+ line-height: 1.35;
486
+ }
487
+
488
+ .custom-chat-resolved-btn {
489
+ background: #091e3e;
490
+ color: white;
491
+ border: none;
492
+ border-radius: 10px;
493
+ padding: 10px 12px;
494
+ font-size: 12px;
495
+ font-weight: 600;
496
+ cursor: pointer;
497
+ transition: transform 0.15s, opacity 0.15s;
498
+ flex-shrink: 0;
499
+ }
500
+
501
+ .custom-chat-resolved-btn:hover:not(:disabled) {
502
+ transform: scale(1.02);
503
+ }
504
+
505
+ .custom-chat-resolved-btn:disabled {
506
+ opacity: 0.6;
507
+ cursor: not-allowed;
508
+ }
385
509
 
386
510
  .custom-chat-input {
387
511
  flex: 1;
@@ -395,7 +519,7 @@
395
519
  }
396
520
 
397
521
  .custom-chat-input:focus {
398
- border-color: #2d7a4f;
522
+ border-color: #091e3e;
399
523
  }
400
524
 
401
525
  .custom-chat-input:disabled {
@@ -407,7 +531,7 @@
407
531
  width: 44px;
408
532
  height: 44px;
409
533
  border-radius: 50%;
410
- background: linear-gradient(135deg, #2d7a4f 0%, #1f5937 100%);
534
+ background: #091e3e;
411
535
  color: white;
412
536
  border: none;
413
537
  cursor: pointer;
package/dist/types.d.ts CHANGED
@@ -1,3 +1,5 @@
1
1
  export type { DialogflowConfig, SessionResponse, ChatResponse, } from './services/dialogflowClient';
2
+ export type { SupportChatSession, SupportMessage, ChatInfo, WebSocketMessage, ChatServiceConfig, } from './services/chatService';
2
3
  export type { ChatWidgetProps } from './components/ChatWidget';
4
+ export type { ChatMode, UseChatModeReturn } from './hooks/useChatMode';
3
5
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,YAAY,GACb,MAAM,6BAA6B,CAAC;AAGrC,YAAY,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,YAAY,GACb,MAAM,6BAA6B,CAAC;AAErC,YAAY,EACV,kBAAkB,EAClB,cAAc,EACd,QAAQ,EACR,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,wBAAwB,CAAC;AAGhC,YAAY,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG/D,YAAY,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,31 @@
1
+ export interface DialogflowResponse {
2
+ queryResult?: {
3
+ responseMessages?: any[];
4
+ fulfillmentText?: string;
5
+ parameters?: {
6
+ fields?: {
7
+ [key: string]: any;
8
+ };
9
+ };
10
+ intent?: {
11
+ displayName?: string;
12
+ };
13
+ };
14
+ [key: string]: any;
15
+ }
16
+ export interface ProcessedDialogflowResponse {
17
+ response: string;
18
+ richContent?: any;
19
+ handoff: boolean;
20
+ timestamp: string;
21
+ }
22
+ /**
23
+ * Check if Dialogflow response contains handoff trigger
24
+ * Handoff is triggered when response contains {"handoff": true}
25
+ */
26
+ export declare function checkForHandoff(response: DialogflowResponse): boolean;
27
+ /**
28
+ * Process Dialogflow response and extract relevant information
29
+ */
30
+ export declare function processDialogflowResponse(response: DialogflowResponse): ProcessedDialogflowResponse;
31
+ //# sourceMappingURL=dialogflowHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialogflowHandler.d.ts","sourceRoot":"","sources":["../../src/utils/dialogflowHandler.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,EAAE;QACZ,gBAAgB,CAAC,EAAE,GAAG,EAAE,CAAC;QACzB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,UAAU,CAAC,EAAE;YACX,MAAM,CAAC,EAAE;gBACP,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;aACpB,CAAC;SACH,CAAC;QACF,MAAM,CAAC,EAAE;YACP,WAAW,CAAC,EAAE,MAAM,CAAC;SACtB,CAAC;KACH,CAAC;IACF,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,kBAAkB,GAAG,OAAO,CAqCrE;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,kBAAkB,GAC3B,2BAA2B,CA4B7B"}
@@ -0,0 +1,182 @@
1
+ /**
2
+ * Vue 3 wrapper for the BlockSpark React ChatWidget.
3
+ * Mounts and unmounts the React component and forwards all props.
4
+ */
5
+ export declare const BlockSparkChatWidgetVue: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
6
+ title: {
7
+ type: StringConstructor;
8
+ default: string;
9
+ };
10
+ subtitle: {
11
+ type: StringConstructor;
12
+ default: string;
13
+ };
14
+ welcomeTitle: {
15
+ type: StringConstructor;
16
+ default: string;
17
+ };
18
+ welcomeMessage: {
19
+ type: StringConstructor;
20
+ default: string;
21
+ };
22
+ welcomeCta: {
23
+ type: StringConstructor;
24
+ default: string;
25
+ };
26
+ showWelcomePopup: {
27
+ type: BooleanConstructor;
28
+ default: boolean;
29
+ };
30
+ welcomePopupDelay: {
31
+ type: NumberConstructor;
32
+ default: number;
33
+ };
34
+ fallbackWelcomeMessage: {
35
+ type: StringConstructor;
36
+ default: string;
37
+ };
38
+ inputPlaceholder: {
39
+ type: StringConstructor;
40
+ default: string;
41
+ };
42
+ emptyStateMessage: {
43
+ type: StringConstructor;
44
+ default: string;
45
+ };
46
+ debug: {
47
+ type: BooleanConstructor;
48
+ default: boolean;
49
+ };
50
+ dfProjectId: {
51
+ type: StringConstructor;
52
+ default: undefined;
53
+ };
54
+ dfLocation: {
55
+ type: StringConstructor;
56
+ default: string;
57
+ };
58
+ dfAgentId: {
59
+ type: StringConstructor;
60
+ default: undefined;
61
+ };
62
+ serviceAccountKey: {
63
+ type: ObjectConstructor;
64
+ default: undefined;
65
+ };
66
+ accessToken: {
67
+ type: StringConstructor;
68
+ default: undefined;
69
+ };
70
+ languageCode: {
71
+ type: StringConstructor;
72
+ default: string;
73
+ };
74
+ backendBaseUrl: {
75
+ type: StringConstructor;
76
+ default: undefined;
77
+ };
78
+ backendWsUrl: {
79
+ type: StringConstructor;
80
+ default: undefined;
81
+ };
82
+ }>, {
83
+ containerRef: import("vue").Ref<HTMLElement | null, HTMLElement | null>;
84
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
85
+ title: {
86
+ type: StringConstructor;
87
+ default: string;
88
+ };
89
+ subtitle: {
90
+ type: StringConstructor;
91
+ default: string;
92
+ };
93
+ welcomeTitle: {
94
+ type: StringConstructor;
95
+ default: string;
96
+ };
97
+ welcomeMessage: {
98
+ type: StringConstructor;
99
+ default: string;
100
+ };
101
+ welcomeCta: {
102
+ type: StringConstructor;
103
+ default: string;
104
+ };
105
+ showWelcomePopup: {
106
+ type: BooleanConstructor;
107
+ default: boolean;
108
+ };
109
+ welcomePopupDelay: {
110
+ type: NumberConstructor;
111
+ default: number;
112
+ };
113
+ fallbackWelcomeMessage: {
114
+ type: StringConstructor;
115
+ default: string;
116
+ };
117
+ inputPlaceholder: {
118
+ type: StringConstructor;
119
+ default: string;
120
+ };
121
+ emptyStateMessage: {
122
+ type: StringConstructor;
123
+ default: string;
124
+ };
125
+ debug: {
126
+ type: BooleanConstructor;
127
+ default: boolean;
128
+ };
129
+ dfProjectId: {
130
+ type: StringConstructor;
131
+ default: undefined;
132
+ };
133
+ dfLocation: {
134
+ type: StringConstructor;
135
+ default: string;
136
+ };
137
+ dfAgentId: {
138
+ type: StringConstructor;
139
+ default: undefined;
140
+ };
141
+ serviceAccountKey: {
142
+ type: ObjectConstructor;
143
+ default: undefined;
144
+ };
145
+ accessToken: {
146
+ type: StringConstructor;
147
+ default: undefined;
148
+ };
149
+ languageCode: {
150
+ type: StringConstructor;
151
+ default: string;
152
+ };
153
+ backendBaseUrl: {
154
+ type: StringConstructor;
155
+ default: undefined;
156
+ };
157
+ backendWsUrl: {
158
+ type: StringConstructor;
159
+ default: undefined;
160
+ };
161
+ }>> & Readonly<{}>, {
162
+ title: string;
163
+ subtitle: string;
164
+ welcomeTitle: string;
165
+ welcomeMessage: string;
166
+ welcomeCta: string;
167
+ showWelcomePopup: boolean;
168
+ welcomePopupDelay: number;
169
+ fallbackWelcomeMessage: string;
170
+ inputPlaceholder: string;
171
+ emptyStateMessage: string;
172
+ debug: boolean;
173
+ dfProjectId: string;
174
+ dfLocation: string;
175
+ dfAgentId: string;
176
+ serviceAccountKey: Record<string, any>;
177
+ accessToken: string;
178
+ languageCode: string;
179
+ backendBaseUrl: string;
180
+ backendWsUrl: string;
181
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
182
+ //# sourceMappingURL=ChatWidgetWrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatWidgetWrapper.d.ts","sourceRoot":"","sources":["../../src/vue/ChatWidgetWrapper.ts"],"names":[],"mappings":"AAcA;;;GAGG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4EAyFlC,CAAC"}
@@ -0,0 +1,191 @@
1
+ import type { App } from 'vue';
2
+ import { BlockSparkChatWidgetVue } from './ChatWidgetWrapper';
3
+ export { BlockSparkChatWidgetVue };
4
+ /**
5
+ * Vue 3 plugin. Use in main.js: app.use(BlockSparkChatWidget)
6
+ */
7
+ export declare function install(app: App, options?: {
8
+ name?: string;
9
+ }): void;
10
+ declare const _default: {
11
+ install: typeof install;
12
+ component: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
13
+ title: {
14
+ type: StringConstructor;
15
+ default: string;
16
+ };
17
+ subtitle: {
18
+ type: StringConstructor;
19
+ default: string;
20
+ };
21
+ welcomeTitle: {
22
+ type: StringConstructor;
23
+ default: string;
24
+ };
25
+ welcomeMessage: {
26
+ type: StringConstructor;
27
+ default: string;
28
+ };
29
+ welcomeCta: {
30
+ type: StringConstructor;
31
+ default: string;
32
+ };
33
+ showWelcomePopup: {
34
+ type: BooleanConstructor;
35
+ default: boolean;
36
+ };
37
+ welcomePopupDelay: {
38
+ type: NumberConstructor;
39
+ default: number;
40
+ };
41
+ fallbackWelcomeMessage: {
42
+ type: StringConstructor;
43
+ default: string;
44
+ };
45
+ inputPlaceholder: {
46
+ type: StringConstructor;
47
+ default: string;
48
+ };
49
+ emptyStateMessage: {
50
+ type: StringConstructor;
51
+ default: string;
52
+ };
53
+ debug: {
54
+ type: BooleanConstructor;
55
+ default: boolean;
56
+ };
57
+ dfProjectId: {
58
+ type: StringConstructor;
59
+ default: undefined;
60
+ };
61
+ dfLocation: {
62
+ type: StringConstructor;
63
+ default: string;
64
+ };
65
+ dfAgentId: {
66
+ type: StringConstructor;
67
+ default: undefined;
68
+ };
69
+ serviceAccountKey: {
70
+ type: ObjectConstructor;
71
+ default: undefined;
72
+ };
73
+ accessToken: {
74
+ type: StringConstructor;
75
+ default: undefined;
76
+ };
77
+ languageCode: {
78
+ type: StringConstructor;
79
+ default: string;
80
+ };
81
+ backendBaseUrl: {
82
+ type: StringConstructor;
83
+ default: undefined;
84
+ };
85
+ backendWsUrl: {
86
+ type: StringConstructor;
87
+ default: undefined;
88
+ };
89
+ }>, {
90
+ containerRef: import("vue").Ref<HTMLElement | null, HTMLElement | null>;
91
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
92
+ title: {
93
+ type: StringConstructor;
94
+ default: string;
95
+ };
96
+ subtitle: {
97
+ type: StringConstructor;
98
+ default: string;
99
+ };
100
+ welcomeTitle: {
101
+ type: StringConstructor;
102
+ default: string;
103
+ };
104
+ welcomeMessage: {
105
+ type: StringConstructor;
106
+ default: string;
107
+ };
108
+ welcomeCta: {
109
+ type: StringConstructor;
110
+ default: string;
111
+ };
112
+ showWelcomePopup: {
113
+ type: BooleanConstructor;
114
+ default: boolean;
115
+ };
116
+ welcomePopupDelay: {
117
+ type: NumberConstructor;
118
+ default: number;
119
+ };
120
+ fallbackWelcomeMessage: {
121
+ type: StringConstructor;
122
+ default: string;
123
+ };
124
+ inputPlaceholder: {
125
+ type: StringConstructor;
126
+ default: string;
127
+ };
128
+ emptyStateMessage: {
129
+ type: StringConstructor;
130
+ default: string;
131
+ };
132
+ debug: {
133
+ type: BooleanConstructor;
134
+ default: boolean;
135
+ };
136
+ dfProjectId: {
137
+ type: StringConstructor;
138
+ default: undefined;
139
+ };
140
+ dfLocation: {
141
+ type: StringConstructor;
142
+ default: string;
143
+ };
144
+ dfAgentId: {
145
+ type: StringConstructor;
146
+ default: undefined;
147
+ };
148
+ serviceAccountKey: {
149
+ type: ObjectConstructor;
150
+ default: undefined;
151
+ };
152
+ accessToken: {
153
+ type: StringConstructor;
154
+ default: undefined;
155
+ };
156
+ languageCode: {
157
+ type: StringConstructor;
158
+ default: string;
159
+ };
160
+ backendBaseUrl: {
161
+ type: StringConstructor;
162
+ default: undefined;
163
+ };
164
+ backendWsUrl: {
165
+ type: StringConstructor;
166
+ default: undefined;
167
+ };
168
+ }>> & Readonly<{}>, {
169
+ title: string;
170
+ subtitle: string;
171
+ welcomeTitle: string;
172
+ welcomeMessage: string;
173
+ welcomeCta: string;
174
+ showWelcomePopup: boolean;
175
+ welcomePopupDelay: number;
176
+ fallbackWelcomeMessage: string;
177
+ inputPlaceholder: string;
178
+ emptyStateMessage: string;
179
+ debug: boolean;
180
+ dfProjectId: string;
181
+ dfLocation: string;
182
+ dfAgentId: string;
183
+ serviceAccountKey: Record<string, any>;
184
+ accessToken: string;
185
+ languageCode: string;
186
+ backendBaseUrl: string;
187
+ backendWsUrl: string;
188
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
189
+ };
190
+ export default _default;
191
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vue/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC/B,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,OAAO,EAAE,uBAAuB,EAAE,CAAC;AAEnC;;GAEG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,QAG5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAED,wBAGE"}