@formo/analytics 1.11.5-alpha.4 → 1.11.6-alpha.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.
Files changed (93) hide show
  1. package/README.md +135 -47
  2. package/dist/cjs/src/FormoAnalytics.d.ts +73 -10
  3. package/dist/cjs/src/FormoAnalytics.d.ts.map +1 -1
  4. package/dist/cjs/src/FormoAnalytics.js +296 -103
  5. package/dist/cjs/src/FormoAnalytics.js.map +1 -1
  6. package/dist/cjs/src/FormoAnalyticsProvider.d.ts +1 -1
  7. package/dist/cjs/src/FormoAnalyticsProvider.d.ts.map +1 -1
  8. package/dist/cjs/src/FormoAnalyticsProvider.js +3 -3
  9. package/dist/cjs/src/FormoAnalyticsProvider.js.map +1 -1
  10. package/dist/cjs/src/constants/config.d.ts +1 -1
  11. package/dist/cjs/src/constants/config.d.ts.map +1 -1
  12. package/dist/cjs/src/constants/config.js +2 -2
  13. package/dist/cjs/src/constants/config.js.map +1 -1
  14. package/dist/cjs/src/constants/events.d.ts +8 -0
  15. package/dist/cjs/src/constants/events.d.ts.map +1 -0
  16. package/dist/cjs/src/constants/events.js +12 -0
  17. package/dist/cjs/src/constants/events.js.map +1 -0
  18. package/dist/cjs/src/constants/index.d.ts +1 -0
  19. package/dist/cjs/src/constants/index.d.ts.map +1 -1
  20. package/dist/cjs/src/constants/index.js +1 -0
  21. package/dist/cjs/src/constants/index.js.map +1 -1
  22. package/dist/cjs/src/types/base.d.ts +6 -1
  23. package/dist/cjs/src/types/base.d.ts.map +1 -1
  24. package/dist/cjs/src/types/index.d.ts +1 -0
  25. package/dist/cjs/src/types/index.d.ts.map +1 -1
  26. package/dist/cjs/src/types/index.js +1 -0
  27. package/dist/cjs/src/types/index.js.map +1 -1
  28. package/dist/cjs/src/types/wallet.d.ts +11 -0
  29. package/dist/cjs/src/types/wallet.d.ts.map +1 -0
  30. package/dist/cjs/src/types/wallet.js +3 -0
  31. package/dist/cjs/src/types/wallet.js.map +1 -0
  32. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  33. package/dist/esm/src/FormoAnalytics.d.ts +73 -10
  34. package/dist/esm/src/FormoAnalytics.d.ts.map +1 -1
  35. package/dist/esm/src/FormoAnalytics.js +297 -104
  36. package/dist/esm/src/FormoAnalytics.js.map +1 -1
  37. package/dist/esm/src/FormoAnalyticsProvider.d.ts +1 -1
  38. package/dist/esm/src/FormoAnalyticsProvider.d.ts.map +1 -1
  39. package/dist/esm/src/FormoAnalyticsProvider.js +3 -3
  40. package/dist/esm/src/FormoAnalyticsProvider.js.map +1 -1
  41. package/dist/esm/src/constants/config.d.ts +1 -1
  42. package/dist/esm/src/constants/config.d.ts.map +1 -1
  43. package/dist/esm/src/constants/config.js +1 -1
  44. package/dist/esm/src/constants/config.js.map +1 -1
  45. package/dist/esm/src/constants/events.d.ts +8 -0
  46. package/dist/esm/src/constants/events.d.ts.map +1 -0
  47. package/dist/esm/src/constants/events.js +9 -0
  48. package/dist/esm/src/constants/events.js.map +1 -0
  49. package/dist/esm/src/constants/index.d.ts +1 -0
  50. package/dist/esm/src/constants/index.d.ts.map +1 -1
  51. package/dist/esm/src/constants/index.js +1 -0
  52. package/dist/esm/src/constants/index.js.map +1 -1
  53. package/dist/esm/src/types/base.d.ts +6 -1
  54. package/dist/esm/src/types/base.d.ts.map +1 -1
  55. package/dist/esm/src/types/index.d.ts +1 -0
  56. package/dist/esm/src/types/index.d.ts.map +1 -1
  57. package/dist/esm/src/types/index.js +1 -0
  58. package/dist/esm/src/types/index.js.map +1 -1
  59. package/dist/esm/src/types/wallet.d.ts +11 -0
  60. package/dist/esm/src/types/wallet.d.ts.map +1 -0
  61. package/dist/esm/src/types/wallet.js +2 -0
  62. package/dist/esm/src/types/wallet.js.map +1 -0
  63. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  64. package/dist/index.umd.min.js +1 -1
  65. package/dist/index.umd.min.js.map +1 -1
  66. package/package.json +1 -1
  67. package/src/FormoAnalytics.ts +338 -114
  68. package/src/FormoAnalyticsProvider.tsx +3 -6
  69. package/src/constants/config.ts +1 -1
  70. package/src/constants/events.ts +7 -0
  71. package/src/constants/index.ts +1 -0
  72. package/src/global.d.ts +4 -0
  73. package/src/types/base.ts +9 -1
  74. package/src/types/index.ts +1 -0
  75. package/src/types/wallet.ts +12 -0
  76. package/dist/cjs/src/utils/index.d.ts +0 -2
  77. package/dist/cjs/src/utils/index.d.ts.map +0 -1
  78. package/dist/cjs/src/utils/index.js +0 -18
  79. package/dist/cjs/src/utils/index.js.map +0 -1
  80. package/dist/cjs/src/utils/isNotEmptyObject.d.ts +0 -2
  81. package/dist/cjs/src/utils/isNotEmptyObject.d.ts.map +0 -1
  82. package/dist/cjs/src/utils/isNotEmptyObject.js +0 -9
  83. package/dist/cjs/src/utils/isNotEmptyObject.js.map +0 -1
  84. package/dist/esm/src/utils/index.d.ts +0 -2
  85. package/dist/esm/src/utils/index.d.ts.map +0 -1
  86. package/dist/esm/src/utils/index.js +0 -2
  87. package/dist/esm/src/utils/index.js.map +0 -1
  88. package/dist/esm/src/utils/isNotEmptyObject.d.ts +0 -2
  89. package/dist/esm/src/utils/isNotEmptyObject.d.ts.map +0 -1
  90. package/dist/esm/src/utils/isNotEmptyObject.js +0 -6
  91. package/dist/esm/src/utils/isNotEmptyObject.js.map +0 -1
  92. package/src/utils/index.ts +0 -1
  93. package/src/utils/isNotEmptyObject.ts +0 -5
package/README.md CHANGED
@@ -4,17 +4,16 @@
4
4
 
5
5
  ---
6
6
 
7
- Add the following to your `index.html`:
7
+ Add the following to your page:
8
8
 
9
9
  ```html
10
10
  <script>
11
11
  const script = document.createElement('script');
12
12
  const apiKey = 'YOUR_API_KEY';
13
- const projectId = 'YOUR_PROJECT_ID';
14
13
 
15
14
  script.src = 'https://unpkg.com/@formo/analytics';
16
15
  script.onload = function () {
17
- FormoAnalytics.init(apiKey, projectId)
16
+ FormoAnalytics.init(apiKey)
18
17
  .then((sdkInstance) => {
19
18
  window.formo = sdkInstance;
20
19
 
@@ -33,21 +32,96 @@ Add the following to your `index.html`:
33
32
 
34
33
  ---
35
34
 
36
- ### 1. Install the npm package:
35
+ ### React Application
37
36
 
38
- Install @formo/analytics via yarn or npm:
37
+ **1. Install the SDK**
38
+ Install the Formo Analytics SDK using Yarn or NPM:
39
39
 
40
- ```
40
+ ```jsx
41
41
  yarn add @formo/analytics
42
42
  ```
43
43
 
44
44
  or
45
45
 
46
+ ```jsx
47
+ npm install @formo/analytics --save
48
+ ```
49
+
50
+ **2. Set up FormoAnalyticsProvider in Your Application**
51
+
52
+ Wrap your entire React application in the `FormoAnalyticsProvider` provided by the SDK.
53
+
54
+ ```jsx
55
+ //App.tsx (or App.js)
56
+ import React from 'react';
57
+ import ReactDOM from 'react-dom/client';
58
+ import { FormoAnalyticsProvider } from '@formo/analytics';
59
+ import App from './App';
60
+
61
+ const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement);
62
+
63
+ root.render(
64
+ <React.StrictMode>
65
+ <FormoAnalyticsProvider apiKey="YOUR_API_KEY">
66
+ <App />
67
+ </FormoAnalyticsProvider>
68
+ </React.StrictMode>
69
+ );
46
70
  ```
71
+
72
+ **3. Tracking Events**
73
+
74
+ You can use the `useFormoAnalytics` hook from the SDK to track user interactions.
75
+
76
+ Example: Tracking a Custom Event
77
+
78
+ ```jsx
79
+ import React, { useEffect } from 'react';
80
+ import { useFormoAnalytics } from '@formo/analytics';
81
+
82
+ const HomePage = () => {
83
+ const analytics = useFormoAnalytics();
84
+
85
+ useEffect(() => {
86
+ // Track a custom event
87
+ analytics.track('custom_event', { key: 'value' });
88
+ }, [analytics]);
89
+
90
+ return <div>Welcome to the Home Page!</div>;
91
+ };
92
+
93
+ export default HomePage;
94
+ ```
95
+
96
+ **4. Folder Structure Example**
97
+
98
+ ```
99
+ /src
100
+ ├── /components
101
+ │ └── HomePage.tsx
102
+ ├── /App.tsx
103
+ └── /index.tsx (or index.js)
104
+ ```
105
+
106
+ ---
107
+
108
+ ### Next.js Application
109
+
110
+ **1. Install the npm package:**
111
+
112
+ Install `@formo/analytics` via yarn or npm:
113
+
114
+ ```jsx
115
+ yarn add @formo/analytics
116
+ ```
117
+
118
+ or
119
+
120
+ ```jsx
47
121
  npm install @formo/analytics --save
48
122
  ```
49
123
 
50
- ### 2. Set up the `FormoAnalyticsProvider` in your application:
124
+ **2. Set up the `FormoAnalyticsProvider` in your application:**
51
125
 
52
126
  ```jsx
53
127
  // AnalyticsProvider.tsx
@@ -59,44 +133,16 @@ import React, { FC, useEffect } from 'react';
59
133
 
60
134
  type FormoAnalyticsProviderProps = {
61
135
  apiKey: string,
62
- projectId: string,
63
136
  children: React.ReactNode,
64
137
  };
65
138
 
66
139
  // The provider component
67
140
  export const AnalyticsProvider: FC<FormoAnalyticsProviderProps> = ({
68
141
  apiKey,
69
- projectId,
70
142
  children,
71
143
  }) => {
72
- // Initialize the FormoAnalytics SDK inside useEffect
73
- const [isInitialized, setIsInitialized] = useState(false);
74
-
75
- useEffect(() => {
76
- const initialize = async () => {
77
- try {
78
- await FormoAnalytics.init(apiKey, projectId);
79
- console.log('FormoAnalytics SDK initialized');
80
- setIsInitialized(true);
81
- } catch (error) {
82
- console.error('Failed to initialize FormoAnalytics SDK', error);
83
- }
84
- };
85
-
86
- initialize();
87
- }, [apiKey, projectId]);
88
-
89
- // To prevent app crashes, render a loading state during initialization
90
- if (!isInitialized) {
91
- return (
92
- <FormoAnalyticsProvider apiKey={apiKey} projectId={projectId}>
93
- Loading Content
94
- </FormoAnalyticsProvider>
95
- );
96
- }
97
-
98
144
  return (
99
- <FormoAnalyticsProvider apiKey={apiKey} projectId={projectId}>
145
+ <FormoAnalyticsProvider apiKey={apiKey}>
100
146
  {children}
101
147
  </FormoAnalyticsProvider>
102
148
  );
@@ -105,7 +151,7 @@ export const AnalyticsProvider: FC<FormoAnalyticsProviderProps> = ({
105
151
  export default AnalyticsProvider;
106
152
  ```
107
153
 
108
- ### 3. Integrating the Provider in Your Root Layout
154
+ **3. Integrating the Provider in Your Root Layout**
109
155
 
110
156
  Wrap your application with the newly created `AnalyticsProvider` in your main layout file:
111
157
 
@@ -120,7 +166,7 @@ export default function RootLayout({
120
166
  return (
121
167
  <html lang='en'>
122
168
  <body>
123
- <AnalyticsProvider apiKey='YOUR_API_KEY' projectId='YOUR_PROJECT_ID'>
169
+ <AnalyticsProvider apiKey='YOUR_API_KEY'>
124
170
  Your Page Content
125
171
  </AnalyticsProvider>
126
172
  </body>
@@ -129,7 +175,7 @@ export default function RootLayout({
129
175
  }
130
176
  ```
131
177
 
132
- ### 4. Using the SDK
178
+ **4. Using the SDK**
133
179
 
134
180
  Once the SDK is initialized, you can use its methods to track events and user interactions. Here’s how to do that:
135
181
 
@@ -143,11 +189,9 @@ const YourComponent = () => {
143
189
  useEffect(() => {
144
190
  const track = async () => {
145
191
  try {
146
- console.log('Tracking page hit...');
147
- analytics.page(); // Track the page view
148
192
  analytics.track('custom_event', { key: 'value' }); // Track a custom event
149
193
  } catch (error) {
150
- console.error('Failed to track page hit', error);
194
+ console.error('Failed to track event', error);
151
195
  }
152
196
  };
153
197
 
@@ -158,10 +202,54 @@ const YourComponent = () => {
158
202
  };
159
203
  ```
160
204
 
161
- # Development notes
205
+ # Development Notes
206
+
207
+ If you want to contribute or run a local version of the Formo Analytics SDK, follow these steps:
208
+
209
+ 1. Build the SDK Locally
210
+
211
+ Run the following command to build both CommonJS and ESM versions of the SDK:
212
+
213
+ ```jsx
214
+ yarn build-cjs && yarn build-esm && yarn webpack --mode=production
215
+ ```
216
+
217
+ or if you're using NPM:
218
+
219
+ ```jsx
220
+ npm run build
221
+ ```
222
+
223
+ 2. Authenticate with NPM
224
+
225
+ To publish a new version of the package, log in to your NPM account:
226
+
227
+ ```jsx
228
+ npm login
229
+ ```
230
+
231
+ or:
232
+
233
+ ```jsx
234
+ npm adduser
235
+ ```
236
+
237
+ 3. Publish the Package
238
+
239
+ Run the following command to publish the package to NPM:
240
+
241
+ ```jsx
242
+ yarn publish
243
+ ```
244
+
245
+ or:
246
+
247
+ ```jsx
248
+ npm run publish
249
+ ```
162
250
 
163
- To run a local version of the script:
251
+ # Troubleshooting
164
252
 
165
- 1. Run `yarn build-cjs && yarn build-esm && yarn webpack --mode=production` or `npm run build` at the root level to build the script.
166
- 2. To authorize device, login into npmjs using `npm login` or `npm adduser`
167
- 3. Run `yarn publish` or `npm run publish` to publish new versions of the package.
253
+ **API Key Not Provided:** Ensure you pass a valid apiKey when initializing the SDK.
254
+ **SDK Not Initialized:** If you encounter issues with initialization, check the console logs for errors and ensure the project ID and API key are correct.
255
+ **Network Errors:** Verify that the analytics service URL is accessible from your network.
@@ -1,28 +1,91 @@
1
+ import { ChainID, EIP1193Provider, Options } from './types';
1
2
  interface IFormoAnalytics {
2
- init(apiKey: string, projectId: string): Promise<FormoAnalytics>;
3
- identify(userData: any): void;
3
+ /**
4
+ * Initializes the FormoAnalytics instance with the provided API key and project ID.
5
+ */
6
+ init(apiKey: string, options: Options): Promise<FormoAnalytics>;
7
+ /**
8
+ * Tracks page visit events.
9
+ */
4
10
  page(): void;
5
- track(eventName: string, eventData: any): void;
11
+ /**
12
+ * Connects to a wallet with the specified chain ID and address.
13
+ */
14
+ connect(params: {
15
+ chainId: ChainID;
16
+ address: string;
17
+ }): Promise<void>;
18
+ /**
19
+ * Disconnects the current wallet and clears the session information.
20
+ */
21
+ disconnect(params?: {
22
+ chainId?: ChainID;
23
+ address?: string;
24
+ }): void;
25
+ /**
26
+ * Switches the blockchain chain context and optionally logs additional params.
27
+ */
28
+ chain(params: {
29
+ chainId: ChainID;
30
+ address?: string;
31
+ }): void;
32
+ /**
33
+ * Tracks a specific event with a name and associated data.
34
+ */
35
+ track(eventName: string, eventData: Record<string, any>): void;
6
36
  }
7
37
  export declare class FormoAnalytics implements IFormoAnalytics {
8
38
  readonly apiKey: string;
9
- projectId: string;
39
+ options: Options;
40
+ private _provider?;
41
+ private _registeredProviderListeners;
42
+ private walletAddressSessionKey;
10
43
  private config;
11
44
  private sessionIdKey;
12
45
  private timezoneToCountry;
46
+ currentChainId?: string | null;
47
+ currentConnectedAddress?: string;
13
48
  private constructor();
14
- static init(apiKey: string, projectId: string): Promise<FormoAnalytics>;
15
- private identifyUser;
49
+ static init(apiKey: string, options: Options): Promise<FormoAnalytics>;
50
+ get provider(): EIP1193Provider | undefined;
16
51
  private getSessionId;
52
+ private getOrigin;
17
53
  private setSessionCookie;
18
54
  private generateSessionId;
19
55
  private getCookieValue;
20
56
  private trackEvent;
21
- private maskSensitiveData;
22
57
  private trackPageHit;
23
- private buildApiUrl;
24
- init(apiKey: string, projectId: string): Promise<FormoAnalytics>;
25
- identify(userData: any): void;
58
+ private trackProvider;
59
+ private getCurrentWallet;
60
+ private getCurrentChainId;
61
+ private registerAddressChangedListener;
62
+ private registerChainChangedListener;
63
+ private onAddressChanged;
64
+ private onAddressConnected;
65
+ private onAddressDisconnected;
66
+ private onChainChanged;
67
+ /**
68
+ * Stores the wallet address in session storage when connected.
69
+ * @param address - The wallet address to store.
70
+ */
71
+ private storeWalletAddress;
72
+ /**
73
+ * Clears the wallet address from session storage when disconnected.
74
+ */
75
+ private clearWalletAddress;
76
+ init(apiKey: string, options: Options): Promise<FormoAnalytics>;
77
+ connect({ chainId, address }: {
78
+ chainId: ChainID;
79
+ address: string;
80
+ }): Promise<void>;
81
+ disconnect(params?: {
82
+ chainId?: ChainID;
83
+ address?: string;
84
+ }): Promise<void> | undefined;
85
+ chain({ chainId, address }: {
86
+ chainId: ChainID;
87
+ address?: string;
88
+ }): Promise<void>;
26
89
  page(): void;
27
90
  track(eventName: string, eventData: any): void;
28
91
  }
@@ -1 +1 @@
1
- {"version":3,"file":"FormoAnalytics.d.ts","sourceRoot":"","sources":["../../../src/FormoAnalytics.ts"],"names":[],"mappings":"AAKA,UAAU,eAAe;IACvB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACjE,QAAQ,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI,CAAC;IAC9B,IAAI,IAAI,IAAI,CAAC;IACb,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,GAAG,IAAI,CAAC;CAChD;AACD,qBAAa,cAAe,YAAW,eAAe;aAMlC,MAAM,EAAE,MAAM;IACvB,SAAS,EAAE,MAAM;IAN1B,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,iBAAiB,CAAwC;IAEjE,OAAO;WASM,IAAI,CACf,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,CAAC;IAU1B,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,cAAc;YAUR,UAAU;IAyDxB,OAAO,CAAC,iBAAiB;IAkEzB,OAAO,CAAC,YAAY;IAoCpB,OAAO,CAAC,WAAW;IAiBnB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAMhE,QAAQ,CAAC,QAAQ,EAAE,GAAG;IAItB,IAAI;IAIJ,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG;CAGxC"}
1
+ {"version":3,"file":"FormoAnalytics.d.ts","sourceRoot":"","sources":["../../../src/FormoAnalytics.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAE5D,UAAU,eAAe;IACvB;;OAEG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAEhE;;OAEG;IACH,IAAI,IAAI,IAAI,CAAC;IAEb;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtE;;OAEG;IACH,UAAU,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAEnE;;OAEG;IACH,KAAK,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAE5D;;OAEG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;CAChE;AAID,qBAAa,cAAe,YAAW,eAAe;aAgBlC,MAAM,EAAE,MAAM;IACvB,OAAO,EAAE,OAAO;IAhBzB,OAAO,CAAC,SAAS,CAAC,CAAkB;IACpC,OAAO,CAAC,4BAA4B,CAG7B;IAEP,OAAO,CAAC,uBAAuB,CAAmB;IAClD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,iBAAiB,CAAwC;IAEjE,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAEjC,OAAO;WAeM,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC;IAU5E,IAAI,QAAQ,IAAI,eAAe,GAAG,SAAS,CAE1C;IAED,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,cAAc;YAUR,UAAU;IA+DxB,OAAO,CAAC,YAAY;IAoCpB,OAAO,CAAC,aAAa;YA0BP,gBAAgB;YAwBhB,iBAAiB;IAiB/B,OAAO,CAAC,8BAA8B;IAYtC,OAAO,CAAC,4BAA4B;YAOtB,gBAAgB;YAWhB,kBAAkB;IAchC,OAAO,CAAC,qBAAqB;YAgBf,cAAc;IA4C5B;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAiB1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAI1B,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC;IAK/D,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAiBnE,UAAU,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAkB3D,KAAK,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAuBlE,IAAI;IAIJ,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG;CAGxC"}