impact-ui 4.0.1-alpha.21 → 4.0.1-alpha.23

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.
Files changed (71) hide show
  1. package/dist/_virtual/index15.js +2 -2
  2. package/dist/_virtual/index16.js +2 -2
  3. package/dist/components/Table/index.js +1 -1
  4. package/dist/components/TableChat/components/TableChatRightSection/ChatEditedMessageType/ChatEditedMessageType.d.ts.map +1 -0
  5. package/dist/components/TableChat/components/TableChatRightSection/ChatMessages/ChatMessage.js +1 -1
  6. package/dist/components/TableOld/index.js +1 -1
  7. package/dist/components/TableV36/AdvanceSearchModalItem.d.ts +27 -0
  8. package/dist/components/TableV36/AdvanceSearchModalItem.d.ts.map +1 -0
  9. package/dist/components/TableV36/AdvanceSortModal.d.ts +8 -0
  10. package/dist/components/TableV36/AdvanceSortModal.d.ts.map +1 -0
  11. package/dist/components/TableV36/AdvanceSortModal.js +297 -0
  12. package/dist/components/TableV36/AgGridHeader.d.ts +16 -0
  13. package/dist/components/TableV36/AgGridHeader.d.ts.map +1 -0
  14. package/dist/components/TableV36/AgGridHeader.js +799 -0
  15. package/dist/components/TableV36/CommentsPortal.d.ts +31 -0
  16. package/dist/components/TableV36/CommentsPortal.d.ts.map +1 -0
  17. package/dist/components/TableV36/CommentsPortal.js +362 -0
  18. package/dist/components/TableV36/NewAdvanceSearchModal/NewAdvanceSearchModal.d.ts +13 -0
  19. package/dist/components/TableV36/NewAdvanceSearchModal/NewAdvanceSearchModal.d.ts.map +1 -0
  20. package/dist/components/TableV36/NewAdvanceSearchModal/NewAdvanceSearchModal.js +282 -0
  21. package/dist/components/TableV36/NewAdvanceSearchModal/NewAdvanceSearchModalItem.d.ts +16 -0
  22. package/dist/components/TableV36/NewAdvanceSearchModal/NewAdvanceSearchModalItem.d.ts.map +1 -0
  23. package/dist/components/TableV36/NewAdvanceSearchModal/NewAdvanceSearchModalItem.js +302 -0
  24. package/dist/components/TableV36/NoComments.d.ts +16 -0
  25. package/dist/components/TableV36/NoComments.d.ts.map +1 -0
  26. package/dist/components/TableV36/NoComments.js +237 -0
  27. package/dist/components/TableV36/Table.types.d.ts +89 -0
  28. package/dist/components/TableV36/Table.types.d.ts.map +1 -0
  29. package/dist/components/TableV36/actionBar.d.ts +7 -0
  30. package/dist/components/TableV36/actionBar.d.ts.map +1 -0
  31. package/dist/components/TableV36/actionBar.js +31 -0
  32. package/dist/components/TableV36/advanceSearchModal.d.ts +20 -0
  33. package/dist/components/TableV36/advanceSearchModal.d.ts.map +1 -0
  34. package/dist/components/TableV36/filterUtils.d.ts +133 -0
  35. package/dist/components/TableV36/filterUtils.d.ts.map +1 -0
  36. package/dist/components/TableV36/filterUtils.js +478 -0
  37. package/dist/components/TableV36/index.d.ts +3 -0
  38. package/dist/components/TableV36/index.d.ts.map +1 -0
  39. package/dist/components/TableV36/index.js +1603 -0
  40. package/dist/components/TableV36/mockData.d.ts +39 -0
  41. package/dist/components/TableV36/mockData.d.ts.map +1 -0
  42. package/dist/components/TableV36/tableFunctions.d.ts +63 -0
  43. package/dist/components/TableV36/tableFunctions.d.ts.map +1 -0
  44. package/dist/components/TableV36/tableFunctions.js +1796 -0
  45. package/dist/components/TableV36/tableHeader.d.ts +80 -0
  46. package/dist/components/TableV36/tableHeader.d.ts.map +1 -0
  47. package/dist/components/TableV36/tableHeader.js +396 -0
  48. package/dist/components/TableV36/tableIcons.d.ts +3 -0
  49. package/dist/components/TableV36/tableIcons.d.ts.map +1 -0
  50. package/dist/components/TableV36/tableMoreOptions.d.ts +52 -0
  51. package/dist/components/TableV36/tableMoreOptions.d.ts.map +1 -0
  52. package/dist/components/TableV36/tableMoreOptions.js +324 -0
  53. package/dist/components/TableV36/tablePagination.d.ts +7 -0
  54. package/dist/components/TableV36/tablePagination.d.ts.map +1 -0
  55. package/dist/components/TableV36/tablePagination.js +67 -0
  56. package/dist/components/TableV36/tableSettings.d.ts +41 -0
  57. package/dist/components/TableV36/tableSettings.d.ts.map +1 -0
  58. package/dist/components/TableV36/tableSettings.js +317 -0
  59. package/dist/components/TableV36/withCommentIcon.d.ts +7 -0
  60. package/dist/components/TableV36/withCommentIcon.d.ts.map +1 -0
  61. package/dist/components/TableV36/withCommentIcon.js +108 -0
  62. package/dist/components/index.d.ts +1 -0
  63. package/dist/components/index.d.ts.map +1 -1
  64. package/dist/components/index.js +2 -0
  65. package/dist/mcp-component-registry.json +1 -1
  66. package/dist/node_modules/hoist-non-react-statics/node_modules/react-is/index.js +1 -1
  67. package/dist/node_modules/is-symbol/index.js +1 -1
  68. package/package.json +5 -5
  69. package/dist/components/TableChat/components/TableChatRightSection/ChatEditedMessageType /ChatEditedMessageType.d.ts.map +0 -1
  70. /package/dist/components/TableChat/components/TableChatRightSection/{ChatEditedMessageType → ChatEditedMessageType}/ChatEditedMessageType.d.ts +0 -0
  71. /package/dist/components/TableChat/components/TableChatRightSection/{ChatEditedMessageType → ChatEditedMessageType}/ChatEditedMessageType.js +0 -0
@@ -0,0 +1,31 @@
1
+ import { default as React } from 'react';
2
+
3
+ declare const CommentsPortal: ({ isOpen, onClose, comments, onAddComment, cellId, position, author, onMouseEnter, onMouseLeave, openedBy, onMenuClick, onMarkAsReadClick, onMarkAsResolvedClick, editCommentText, isLoading, error, onClearError, currentAuthor, editingComment, onUpdateComment, setEditingComment, loadParticipantsAvatar, resolvedComments, messageId, configuration, }: {
4
+ isOpen: any;
5
+ onClose: any;
6
+ comments: any;
7
+ onAddComment: any;
8
+ cellId: any;
9
+ position: any;
10
+ author?: string | undefined;
11
+ onMouseEnter: any;
12
+ onMouseLeave: any;
13
+ openedBy: any;
14
+ onMenuClick: any;
15
+ onMarkAsReadClick: any;
16
+ onMarkAsResolvedClick: any;
17
+ editCommentText?: string | undefined;
18
+ isLoading?: boolean | undefined;
19
+ error?: null | undefined;
20
+ onClearError: any;
21
+ currentAuthor: any;
22
+ editingComment?: null | undefined;
23
+ onUpdateComment?: null | undefined;
24
+ setEditingComment: any;
25
+ loadParticipantsAvatar: any;
26
+ resolvedComments?: never[] | undefined;
27
+ messageId?: null | undefined;
28
+ configuration: any;
29
+ }) => React.ReactPortal | null;
30
+ export default CommentsPortal;
31
+ //# sourceMappingURL=CommentsPortal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommentsPortal.d.ts","sourceRoot":"","sources":["../../../src/components/TableV36/CommentsPortal.tsx"],"names":[],"mappings":"AACA,OAAO,KAA+C,MAAM,OAAO,CAAC;AAkBpE,QAAA,MAAM,cAAc,GAAI;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BvB,6BA4WA,CAAC;AAEF,eAAe,cAAc,CAAC"}
@@ -0,0 +1,362 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { useState, useRef, useEffect } from "react";
3
+ import moment from "moment";
4
+ import { createPortal } from "react-dom";
5
+ import { getAssetUrl } from "../../utils/assetBase.js";
6
+ import { Avatar } from "../Avatar/index.js";
7
+ import { Button } from "../Button/index.js";
8
+ import NoComments from "./NoComments.js";
9
+ import { getUserAvatarColor } from "../../utils/avatarColor.js";
10
+ import { toInnerHTML } from "../../utils/html.js";
11
+ const CloseIcon = (props) => /* @__PURE__ */ jsx("img", { alt: "", src: getAssetUrl("icons/close.svg"), ...props });
12
+ const MenuIcon = (props) => /* @__PURE__ */ jsx("img", { alt: "", src: getAssetUrl("icons/MoreHorizontal.svg"), ...props });
13
+ const SuccessIcon = (props) => /* @__PURE__ */ jsx("img", { alt: "", src: getAssetUrl("icons/success-gray.svg"), ...props });
14
+ const SuccessFillIcon = (props) => /* @__PURE__ */ jsx("img", { alt: "", src: getAssetUrl("icons/success-fill.svg"), ...props });
15
+ const CommentsPortal = ({
16
+ isOpen,
17
+ onClose,
18
+ comments,
19
+ onAddComment,
20
+ cellId,
21
+ position,
22
+ author = "Current User",
23
+ onMouseEnter,
24
+ onMouseLeave,
25
+ openedBy,
26
+ onMenuClick,
27
+ onMarkAsReadClick,
28
+ onMarkAsResolvedClick,
29
+ editCommentText = "",
30
+ isLoading = false,
31
+ error = null,
32
+ onClearError,
33
+ currentAuthor,
34
+ editingComment = null,
35
+ // Add editing comment prop
36
+ onUpdateComment = null,
37
+ // Add update comment handler
38
+ setEditingComment,
39
+ loadParticipantsAvatar,
40
+ resolvedComments = [],
41
+ messageId = null,
42
+ configuration
43
+ }) => {
44
+ if (!isOpen) return null;
45
+ const [openFullReplies, setOpenFullReplies] = useState(openedBy == "click");
46
+ const [adjustedPosition, setAdjustedPosition] = useState(position);
47
+ const [editingText, setEditingText] = useState("");
48
+ const listRef = useRef(null);
49
+ useEffect(() => {
50
+ if (editingComment) {
51
+ setEditingText(editingComment.text || "");
52
+ }
53
+ }, [editingComment]);
54
+ useEffect(() => {
55
+ var _a;
56
+ if (openFullReplies && comments && comments.length > 0) {
57
+ const safePad = 8;
58
+ if (comments.length === 1) {
59
+ const headerHeight = 50;
60
+ const inputSectionHeight = 60;
61
+ const metaHeight = 40;
62
+ const lineHeight = 20;
63
+ const charsPerLine = 45;
64
+ const textLen = (((_a = comments[0]) == null ? void 0 : _a.text) || "").length;
65
+ const lines = Math.max(1, Math.ceil(textLen / charsPerLine));
66
+ const textHeight = Math.min(lines * lineHeight, 300);
67
+ const desiredHeight = Math.min(
68
+ headerHeight + metaHeight + textHeight + inputSectionHeight,
69
+ 500
70
+ );
71
+ const viewportHeight = window.innerHeight || document.documentElement.clientHeight;
72
+ const baseTop = (position == null ? void 0 : position.top) ?? 0;
73
+ const fitsBelow = baseTop + desiredHeight <= viewportHeight - safePad;
74
+ const keepTop = Math.max(safePad, baseTop);
75
+ const clampTop = Math.max(safePad, viewportHeight - desiredHeight - safePad);
76
+ const newTop = fitsBelow ? keepTop : clampTop;
77
+ setAdjustedPosition({
78
+ top: newTop,
79
+ left: (position == null ? void 0 : position.left) ?? 0
80
+ });
81
+ } else {
82
+ const desiredHeight = 500;
83
+ const viewportHeight = window.innerHeight || document.documentElement.clientHeight;
84
+ const maxTop = Math.max(safePad, viewportHeight - desiredHeight - safePad);
85
+ const newTop = Math.min(Math.max(safePad, (position == null ? void 0 : position.top) || 0), maxTop);
86
+ setAdjustedPosition({ top: newTop, left: (position == null ? void 0 : position.left) || 0 });
87
+ }
88
+ } else {
89
+ setAdjustedPosition(position);
90
+ }
91
+ }, [openFullReplies, comments, position]);
92
+ useEffect(() => {
93
+ var _a;
94
+ if (!isOpen) return;
95
+ const el = listRef.current;
96
+ if (!el) return;
97
+ requestAnimationFrame(() => {
98
+ try {
99
+ if (messageId) {
100
+ const messageElement = el.querySelector(`[data-message-id="${messageId}"]`);
101
+ if (messageElement) {
102
+ messageElement.scrollIntoView({
103
+ behavior: "smooth",
104
+ block: "center"
105
+ });
106
+ messageElement.style.backgroundColor = "#eceefd";
107
+ messageElement.style.transition = "background-color 0.3s ease";
108
+ setTimeout(() => {
109
+ messageElement.style.backgroundColor = "";
110
+ }, (configuration == null ? void 0 : configuration.messageIdHighlightTimer) || 3e3);
111
+ } else {
112
+ if (el.scrollHeight > el.clientHeight) {
113
+ el.scrollTo({ top: el.scrollHeight, behavior: "smooth" });
114
+ }
115
+ }
116
+ } else {
117
+ if (el.scrollHeight > el.clientHeight) {
118
+ el.scrollTo({ top: el.scrollHeight, behavior: "smooth" });
119
+ }
120
+ }
121
+ } catch (e) {
122
+ }
123
+ });
124
+ if (onMarkAsReadClick && !((_a = comments[0]) == null ? void 0 : _a.read)) onMarkAsReadClick(cellId);
125
+ }, [isOpen, openFullReplies, comments == null ? void 0 : comments.length, messageId]);
126
+ useEffect(() => {
127
+ if (!isOpen) return;
128
+ const isNoCommentsOutsidePortal = !(comments && comments.length > 0);
129
+ if (!isNoCommentsOutsidePortal) return;
130
+ const onKeyDown = (e) => {
131
+ if (e.key === "Escape" || e.key === "Esc") {
132
+ if (typeof onClose === "function") {
133
+ onClose();
134
+ }
135
+ }
136
+ };
137
+ document.addEventListener("keydown", onKeyDown);
138
+ return () => {
139
+ document.removeEventListener("keydown", onKeyDown);
140
+ };
141
+ }, [isOpen, comments, onClose]);
142
+ const formatTimestamp = (timestamp) => {
143
+ if (!timestamp) return "";
144
+ if (moment(timestamp).isValid()) {
145
+ return moment.utc(timestamp).local().format("hh:mm A, MM-DD-YYYY");
146
+ }
147
+ return timestamp;
148
+ };
149
+ const isResolved = Array.isArray(resolvedComments) && resolvedComments.find((comment) => comment === cellId);
150
+ return createPortal(
151
+ /* @__PURE__ */ jsx(
152
+ "div",
153
+ {
154
+ style: {
155
+ position: "fixed",
156
+ top: (adjustedPosition == null ? void 0 : adjustedPosition.top) || 0,
157
+ left: (adjustedPosition == null ? void 0 : adjustedPosition.left) || 0,
158
+ zIndex: 9999
159
+ },
160
+ onClick: onClose,
161
+ onMouseEnter,
162
+ onMouseLeave: !openFullReplies ? onMouseLeave : () => {
163
+ },
164
+ children: comments && (comments == null ? void 0 : comments.length) > 0 ? /* @__PURE__ */ jsxs(
165
+ "div",
166
+ {
167
+ style: {
168
+ maxHeight: "500px",
169
+ paddingBottom: openFullReplies && isResolved ? "16px" : "0px"
170
+ },
171
+ className: `comments-portal-container ${!openFullReplies ? "clickable" : ""} ${(position == null ? void 0 : position.side) == "left" ? "left" : ""}`,
172
+ onClick: (e) => {
173
+ e.stopPropagation();
174
+ if (!openFullReplies) {
175
+ setOpenFullReplies(true);
176
+ }
177
+ },
178
+ children: [
179
+ openFullReplies && /* @__PURE__ */ jsx("div", { className: `comments-portal-header ${(position == null ? void 0 : position.side) == "left" ? "left" : ""}`, children: /* @__PURE__ */ jsxs("div", { className: "comments-portal-header-inner", children: [
180
+ /* @__PURE__ */ jsx("h3", { children: "Comments" }),
181
+ /* @__PURE__ */ jsxs("div", { className: "comments-portal-header-buttons", children: [
182
+ (comments == null ? void 0 : comments.length) >= 1 && !isResolved && !((configuration == null ? void 0 : configuration.disableMarkAsRead) && (configuration == null ? void 0 : configuration.disableDeleteThread)) && /* @__PURE__ */ jsx(
183
+ Button,
184
+ {
185
+ className: "",
186
+ disabled: false,
187
+ icon: /* @__PURE__ */ jsx(MenuIcon, { fontSize: "small" }),
188
+ iconPlacement: "left",
189
+ size: "small",
190
+ style: {
191
+ backgroundColor: "transparent",
192
+ maxHeight: "32px"
193
+ },
194
+ type: "default",
195
+ variant: "text",
196
+ onClick: (e) => {
197
+ onMenuClick(e, cellId, "topMenu");
198
+ }
199
+ }
200
+ ),
201
+ !(configuration == null ? void 0 : configuration.disableMarkAsResolved) && (isResolved ? /* @__PURE__ */ jsx(SuccessFillIcon, { fontSize: "small" }) : /* @__PURE__ */ jsx(
202
+ "div",
203
+ {
204
+ style: { cursor: "pointer" },
205
+ onClick: (e) => {
206
+ e.stopPropagation();
207
+ if (onMarkAsResolvedClick) onMarkAsResolvedClick(cellId, comments);
208
+ },
209
+ children: /* @__PURE__ */ jsx(SuccessIcon, { fontSize: "small" })
210
+ }
211
+ )),
212
+ /* @__PURE__ */ jsx(
213
+ Button,
214
+ {
215
+ className: "comment-close",
216
+ disabled: false,
217
+ icon: /* @__PURE__ */ jsx(CloseIcon, { fontSize: "large" }),
218
+ iconPlacement: "left",
219
+ size: "small",
220
+ style: {
221
+ backgroundColor: "transparent",
222
+ padding: "4px 0px"
223
+ },
224
+ type: "default",
225
+ variant: "text",
226
+ onClick: onClose
227
+ }
228
+ )
229
+ ] })
230
+ ] }) }),
231
+ /* @__PURE__ */ jsx("div", { ref: listRef, className: "comments-portal-list", children: comments.map((comment, index) => {
232
+ const isCurrentAuthor = comment.author === currentAuthor;
233
+ if (!openFullReplies && index > 0) {
234
+ return null;
235
+ }
236
+ return /* @__PURE__ */ jsxs("div", { "data-message-id": comment.id, children: [
237
+ /* @__PURE__ */ jsxs("div", { className: "comment-item-row-1", children: [
238
+ /* @__PURE__ */ jsxs("div", { className: "comment-item-author-section", children: [
239
+ /* @__PURE__ */ jsx(
240
+ Avatar,
241
+ {
242
+ className: "comment-item-avatar",
243
+ label: comment.author,
244
+ size: "small",
245
+ style: {
246
+ width: "6px",
247
+ height: "26px",
248
+ borderRadius: "6px",
249
+ padding: "3px 13px",
250
+ backgroundColor: getUserAvatarColor(comment.author)
251
+ },
252
+ type: "withoutPicture"
253
+ }
254
+ ),
255
+ /* @__PURE__ */ jsx("div", { className: "comment-item-author-name", children: comment.author }),
256
+ /* @__PURE__ */ jsxs("div", { className: "comment-item-timestamp", children: [
257
+ formatTimestamp(comment.timestamp),
258
+ comment.isEdited && /* @__PURE__ */ jsx("span", { children: "(edited)" })
259
+ ] })
260
+ ] }),
261
+ openFullReplies && isCurrentAuthor && (!(configuration == null ? void 0 : configuration.disableEditComment) || !(configuration == null ? void 0 : configuration.disableDeleteComment)) && /* @__PURE__ */ jsx(
262
+ Button,
263
+ {
264
+ className: "",
265
+ disabled: false,
266
+ icon: /* @__PURE__ */ jsx(MenuIcon, { fontSize: "small" }),
267
+ iconPlacement: "left",
268
+ size: "small",
269
+ style: { backgroundColor: "transparent" },
270
+ type: "default",
271
+ variant: "text",
272
+ onClick: (e) => {
273
+ onMenuClick(e, comment);
274
+ }
275
+ }
276
+ )
277
+ ] }),
278
+ /* @__PURE__ */ jsx("div", { className: "comment-item-row-2", children: editingComment && editingComment.id === comment.id ? (
279
+ /* Show input field when editing this comment */
280
+ /* @__PURE__ */ jsx("div", { className: "comment-edit-input-wrapper", children: /* @__PURE__ */ jsx(
281
+ NoComments,
282
+ {
283
+ cellId: comment.id,
284
+ editCommentText: editingText,
285
+ error,
286
+ isEditFlow: true,
287
+ isInsidePortal: true,
288
+ isLoading,
289
+ loadParticipantsAvatar,
290
+ position,
291
+ setEditingComment,
292
+ onAddComment: onUpdateComment,
293
+ onClearError,
294
+ onUpdateComment: (text) => onUpdateComment(comment.id, text)
295
+ }
296
+ ) })
297
+ ) : (
298
+ /* Show normal comment text */
299
+ /* @__PURE__ */ jsx(
300
+ "div",
301
+ {
302
+ className: `comment-item-text`,
303
+ dangerouslySetInnerHTML: toInnerHTML(comment.text)
304
+ }
305
+ )
306
+ ) })
307
+ ] }, comment.id);
308
+ }) }),
309
+ openFullReplies && !isResolved && /* @__PURE__ */ jsxs("div", { className: "add-comment-section", children: [
310
+ /* @__PURE__ */ jsx(
311
+ Avatar,
312
+ {
313
+ className: "comment-item-avatar",
314
+ label: currentAuthor,
315
+ size: "small",
316
+ style: {
317
+ width: "6px",
318
+ height: "26px",
319
+ borderRadius: "6px",
320
+ padding: "3px 13px",
321
+ backgroundColor: getUserAvatarColor(currentAuthor)
322
+ },
323
+ type: "withoutPicture"
324
+ }
325
+ ),
326
+ /* @__PURE__ */ jsx(
327
+ NoComments,
328
+ {
329
+ cellId,
330
+ error,
331
+ isInsidePortal: true,
332
+ isLoading,
333
+ loadParticipantsAvatar,
334
+ position,
335
+ onAddComment,
336
+ onClearError
337
+ }
338
+ )
339
+ ] })
340
+ ]
341
+ }
342
+ ) : /* @__PURE__ */ jsx(
343
+ NoComments,
344
+ {
345
+ cellId,
346
+ editCommentText,
347
+ error,
348
+ isLoading,
349
+ loadParticipantsAvatar,
350
+ position,
351
+ onAddComment,
352
+ onClearError
353
+ }
354
+ )
355
+ }
356
+ ),
357
+ document.body
358
+ );
359
+ };
360
+ export {
361
+ CommentsPortal as default
362
+ };
@@ -0,0 +1,13 @@
1
+ declare const NewAdvanceSearchModal: ({ isAdvanceSearch, actualRef, onSearchApplyClick, toggleAdvanceSearch, initialFilters, setInitialFilters, colDefs, currentColumnId, ...args }: {
2
+ [x: string]: any;
3
+ isAdvanceSearch: any;
4
+ actualRef: any;
5
+ onSearchApplyClick: any;
6
+ toggleAdvanceSearch: any;
7
+ initialFilters: any;
8
+ setInitialFilters: any;
9
+ colDefs?: never[] | undefined;
10
+ currentColumnId: any;
11
+ }) => import("react/jsx-runtime").JSX.Element;
12
+ export default NewAdvanceSearchModal;
13
+ //# sourceMappingURL=NewAdvanceSearchModal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NewAdvanceSearchModal.d.ts","sourceRoot":"","sources":["../../../../src/components/TableV36/NewAdvanceSearchModal/NewAdvanceSearchModal.tsx"],"names":[],"mappings":"AAgBA,QAAA,MAAM,qBAAqB,GAAI;;;;;;;;;;CAU9B,4CAoRA,CAAC;AAEF,eAAe,qBAAqB,CAAC"}