@formo/analytics 1.12.0-alpha.3 → 1.13.0-alpha.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/.env.example +1 -0
- package/CONTRIBUTING.md +93 -0
- package/README.md +4 -163
- package/dist/cjs/src/FormoAnalytics.d.ts +45 -69
- package/dist/cjs/src/FormoAnalytics.d.ts.map +1 -1
- package/dist/cjs/src/FormoAnalytics.js +378 -404
- package/dist/cjs/src/FormoAnalytics.js.map +1 -1
- package/dist/cjs/src/FormoAnalyticsProvider.d.ts +2 -2
- package/dist/cjs/src/FormoAnalyticsProvider.d.ts.map +1 -1
- package/dist/cjs/src/FormoAnalyticsProvider.js +120 -29
- package/dist/cjs/src/FormoAnalyticsProvider.js.map +1 -1
- package/dist/cjs/src/constants/config.d.ts +2 -2
- package/dist/cjs/src/constants/config.d.ts.map +1 -1
- package/dist/cjs/src/constants/config.js +3 -3
- package/dist/cjs/src/constants/config.js.map +1 -1
- package/dist/cjs/src/constants/events.d.ts +3 -1
- package/dist/cjs/src/constants/events.d.ts.map +1 -1
- package/dist/cjs/src/constants/events.js +2 -0
- package/dist/cjs/src/constants/events.js.map +1 -1
- package/dist/cjs/src/types/base.d.ts +10 -2
- package/dist/cjs/src/types/base.d.ts.map +1 -1
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/src/FormoAnalytics.d.ts +45 -69
- package/dist/esm/src/FormoAnalytics.d.ts.map +1 -1
- package/dist/esm/src/FormoAnalytics.js +381 -407
- package/dist/esm/src/FormoAnalytics.js.map +1 -1
- package/dist/esm/src/FormoAnalyticsProvider.d.ts +2 -2
- package/dist/esm/src/FormoAnalyticsProvider.d.ts.map +1 -1
- package/dist/esm/src/FormoAnalyticsProvider.js +120 -29
- package/dist/esm/src/FormoAnalyticsProvider.js.map +1 -1
- package/dist/esm/src/constants/config.d.ts +2 -2
- package/dist/esm/src/constants/config.d.ts.map +1 -1
- package/dist/esm/src/constants/config.js +2 -2
- package/dist/esm/src/constants/config.js.map +1 -1
- package/dist/esm/src/constants/events.d.ts +3 -1
- package/dist/esm/src/constants/events.d.ts.map +1 -1
- package/dist/esm/src/constants/events.js +2 -0
- package/dist/esm/src/constants/events.js.map +1 -1
- package/dist/esm/src/types/base.d.ts +10 -2
- package/dist/esm/src/types/base.d.ts.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/dist/index.umd.min.js +1 -1
- package/dist/index.umd.min.js.map +1 -1
- package/package.json +2 -3
- package/src/FormoAnalytics.ts +293 -448
- package/src/FormoAnalyticsProvider.tsx +60 -30
- package/src/constants/config.ts +2 -2
- package/src/constants/events.ts +2 -0
- package/src/types/base.ts +16 -2
- package/dist/cjs/src/utils/index.d.ts +0 -2
- package/dist/cjs/src/utils/index.d.ts.map +0 -1
- package/dist/cjs/src/utils/index.js +0 -18
- package/dist/cjs/src/utils/index.js.map +0 -1
- package/dist/cjs/src/utils/isNotEmptyObject.d.ts +0 -2
- package/dist/cjs/src/utils/isNotEmptyObject.d.ts.map +0 -1
- package/dist/cjs/src/utils/isNotEmptyObject.js +0 -9
- package/dist/cjs/src/utils/isNotEmptyObject.js.map +0 -1
- package/dist/esm/src/utils/index.d.ts +0 -2
- package/dist/esm/src/utils/index.d.ts.map +0 -1
- package/dist/esm/src/utils/index.js +0 -2
- package/dist/esm/src/utils/index.js.map +0 -1
- package/dist/esm/src/utils/isNotEmptyObject.d.ts +0 -2
- package/dist/esm/src/utils/isNotEmptyObject.d.ts.map +0 -1
- package/dist/esm/src/utils/isNotEmptyObject.js +0 -6
- package/dist/esm/src/utils/isNotEmptyObject.js.map +0 -1
- package/src/utils/index.ts +0 -1
- package/src/utils/isNotEmptyObject.ts +0 -5
package/.env.example
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
REACT_APP_HIGHLIGHT_PROJECT_ID =
|
package/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# Development Guide
|
|
2
|
+
|
|
3
|
+
If you want to contribute or run a local version of the Formo Analytics SDK, follow these steps:
|
|
4
|
+
|
|
5
|
+
### Build the SDK Locally
|
|
6
|
+
|
|
7
|
+
Run the following command to build both CommonJS and ESM versions of the SDK:
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
yarn build-cjs && yarn build-esm && yarn webpack --mode=production
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
or if you're using NPM:
|
|
14
|
+
|
|
15
|
+
```jsx
|
|
16
|
+
npm run build
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### Testing locally
|
|
20
|
+
|
|
21
|
+
1. Link the local package to your project
|
|
22
|
+
|
|
23
|
+
> See [this guide](https://dev.to/one-beyond/different-approaches-to-testing-your-own-packages-locally-npm-link-4hoj) on how to use `npm link` or [this guide](https://classic.yarnpkg.com/lang/en/docs/cli/link/) for `yarn link` to test the package locally.
|
|
24
|
+
|
|
25
|
+
For example, if I want to test the package with a project that is in the same directory:
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
~/
|
|
29
|
+
├── formo-analytics-example-next/
|
|
30
|
+
└── sdk/
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Run the following command:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
# ~/formo-analytics-example-next
|
|
37
|
+
npm link ../sdk
|
|
38
|
+
OR
|
|
39
|
+
yarn link ../sdk
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Any changes you make to your local package will be reflected in the project you linked it to.
|
|
43
|
+
However, you have to run `build` to apply the changes you made to the local package:
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
# ~/sdk
|
|
47
|
+
npm run build
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
The new change will be reflected in the project you linked it to.
|
|
51
|
+
|
|
52
|
+
To unlink the package, run the following command:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
# In ~/formo-analytics-example-next
|
|
56
|
+
npm unlink ../sdk
|
|
57
|
+
OR
|
|
58
|
+
yarn unlink ../sdk
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Troubleshooting
|
|
62
|
+
|
|
63
|
+
- Remove your `node_modules` and `yarn link` and run `yarn link` and `yarn install` again.
|
|
64
|
+
- Try running `yarn build` in the SDK directory to ensure the changes are applied.
|
|
65
|
+
- Try running `yarn unlink` and `yarn link` again.
|
|
66
|
+
|
|
67
|
+
# Publishing
|
|
68
|
+
|
|
69
|
+
1. Authenticate with NPM
|
|
70
|
+
|
|
71
|
+
To publish a new version of the package, log in to your NPM account:
|
|
72
|
+
|
|
73
|
+
```jsx
|
|
74
|
+
npm login
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
or:
|
|
78
|
+
|
|
79
|
+
```jsx
|
|
80
|
+
npm adduser
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
2. Publish the Package
|
|
84
|
+
|
|
85
|
+
Run the following command to publish the package to NPM:
|
|
86
|
+
|
|
87
|
+
```jsx
|
|
88
|
+
// Increment the version number in package.json and create git tag
|
|
89
|
+
npm version
|
|
90
|
+
|
|
91
|
+
// Publish the package to NPM
|
|
92
|
+
npm publish
|
|
93
|
+
```
|
package/README.md
CHANGED
|
@@ -1,167 +1,8 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Formo Analytics SDK
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
The Formo Analytics SDK is a Javascript library that allows you to track and analyze user interactions on your dapp.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## Installation
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Please visit Formo's [Developer Docs](https://docs.formo.so) for detailed guides and installation instructions.
|
|
8
8
|
|
|
9
|
-
```html
|
|
10
|
-
<script>
|
|
11
|
-
const script = document.createElement('script');
|
|
12
|
-
const apiKey = 'YOUR_API_KEY';
|
|
13
|
-
const projectId = 'YOUR_PROJECT_ID';
|
|
14
|
-
|
|
15
|
-
script.src = 'https://unpkg.com/@formo/analytics';
|
|
16
|
-
script.onload = function () {
|
|
17
|
-
FormoAnalytics.init(apiKey, projectId)
|
|
18
|
-
.then((sdkInstance) => {
|
|
19
|
-
window.formo = sdkInstance;
|
|
20
|
-
|
|
21
|
-
// Call the public `page` method to track a page hit
|
|
22
|
-
window.formo.page();
|
|
23
|
-
})
|
|
24
|
-
.catch((error) => {
|
|
25
|
-
console.error('Error initializing FormoAnalytics:', error);
|
|
26
|
-
});
|
|
27
|
-
};
|
|
28
|
-
document.head.appendChild(script);
|
|
29
|
-
</script>
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
## Option 2 - using npm package
|
|
33
|
-
|
|
34
|
-
---
|
|
35
|
-
|
|
36
|
-
### 1. Install the npm package:
|
|
37
|
-
|
|
38
|
-
Install @formo/analytics via yarn or npm:
|
|
39
|
-
|
|
40
|
-
```
|
|
41
|
-
yarn add @formo/analytics
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
or
|
|
45
|
-
|
|
46
|
-
```
|
|
47
|
-
npm install @formo/analytics --save
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
### 2. Set up the `FormoAnalyticsProvider` in your application:
|
|
51
|
-
|
|
52
|
-
```jsx
|
|
53
|
-
// AnalyticsProvider.tsx
|
|
54
|
-
|
|
55
|
-
'use client';
|
|
56
|
-
|
|
57
|
-
import { FormoAnalytics, FormoAnalyticsProvider } from '@formo/analytics';
|
|
58
|
-
import React, { FC, useEffect } from 'react';
|
|
59
|
-
|
|
60
|
-
type FormoAnalyticsProviderProps = {
|
|
61
|
-
apiKey: string,
|
|
62
|
-
projectId: string,
|
|
63
|
-
children: React.ReactNode,
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
// The provider component
|
|
67
|
-
export const AnalyticsProvider: FC<FormoAnalyticsProviderProps> = ({
|
|
68
|
-
apiKey,
|
|
69
|
-
projectId,
|
|
70
|
-
children,
|
|
71
|
-
}) => {
|
|
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
|
-
return (
|
|
99
|
-
<FormoAnalyticsProvider apiKey={apiKey} projectId={projectId}>
|
|
100
|
-
{children}
|
|
101
|
-
</FormoAnalyticsProvider>
|
|
102
|
-
);
|
|
103
|
-
};
|
|
104
|
-
|
|
105
|
-
export default AnalyticsProvider;
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
### 3. Integrating the Provider in Your Root Layout
|
|
109
|
-
|
|
110
|
-
Wrap your application with the newly created `AnalyticsProvider` in your main layout file:
|
|
111
|
-
|
|
112
|
-
```jsx
|
|
113
|
-
import { AnalyticsProvider } from './AnalyticsProvider';
|
|
114
|
-
|
|
115
|
-
export default function RootLayout({
|
|
116
|
-
children,
|
|
117
|
-
}: {
|
|
118
|
-
children: React.ReactNode,
|
|
119
|
-
}) {
|
|
120
|
-
return (
|
|
121
|
-
<html lang='en'>
|
|
122
|
-
<body>
|
|
123
|
-
<AnalyticsProvider apiKey='YOUR_API_KEY' projectId='YOUR_PROJECT_ID'>
|
|
124
|
-
Your Page Content
|
|
125
|
-
</AnalyticsProvider>
|
|
126
|
-
</body>
|
|
127
|
-
</html>
|
|
128
|
-
);
|
|
129
|
-
}
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
### 4. Using the SDK
|
|
133
|
-
|
|
134
|
-
Once the SDK is initialized, you can use its methods to track events and user interactions. Here’s how to do that:
|
|
135
|
-
|
|
136
|
-
```jsx
|
|
137
|
-
import { useFormoAnalytics } from '@formo/analytics';
|
|
138
|
-
import React, { useEffect } from 'react';
|
|
139
|
-
|
|
140
|
-
const YourComponent = () => {
|
|
141
|
-
const analytics = useFormoAnalytics();
|
|
142
|
-
|
|
143
|
-
useEffect(() => {
|
|
144
|
-
const track = async () => {
|
|
145
|
-
try {
|
|
146
|
-
console.log('Tracking page hit...');
|
|
147
|
-
analytics.page(); // Track the page view
|
|
148
|
-
analytics.track('custom_event', { key: 'value' }); // Track a custom event
|
|
149
|
-
} catch (error) {
|
|
150
|
-
console.error('Failed to track page hit', error);
|
|
151
|
-
}
|
|
152
|
-
};
|
|
153
|
-
|
|
154
|
-
track();
|
|
155
|
-
}, [analytics]);
|
|
156
|
-
|
|
157
|
-
return <div>Your Component Content</div>;
|
|
158
|
-
};
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
# Development notes
|
|
162
|
-
|
|
163
|
-
To run a local version of the script:
|
|
164
|
-
|
|
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.
|
|
@@ -1,13 +1,5 @@
|
|
|
1
|
-
import { ChainID, EIP1193Provider } from
|
|
1
|
+
import { ChainID, Address, EIP1193Provider, Options, Config } from "./types";
|
|
2
2
|
interface IFormoAnalytics {
|
|
3
|
-
/**
|
|
4
|
-
* Initializes the FormoAnalytics instance with the provided API key and project ID.
|
|
5
|
-
*/
|
|
6
|
-
init(apiKey: string, projectId: string): Promise<FormoAnalytics>;
|
|
7
|
-
/**
|
|
8
|
-
* Identifies the user with the provided user data.
|
|
9
|
-
*/
|
|
10
|
-
identify(userData: Record<string, any>): void;
|
|
11
3
|
/**
|
|
12
4
|
* Tracks page visit events.
|
|
13
5
|
*/
|
|
@@ -16,85 +8,69 @@ interface IFormoAnalytics {
|
|
|
16
8
|
* Connects to a wallet with the specified chain ID and address.
|
|
17
9
|
*/
|
|
18
10
|
connect(params: {
|
|
19
|
-
account: string;
|
|
20
11
|
chainId: ChainID;
|
|
12
|
+
address: string;
|
|
21
13
|
}): Promise<void>;
|
|
22
14
|
/**
|
|
23
|
-
* Disconnects the current wallet
|
|
15
|
+
* Disconnects the current wallet.
|
|
24
16
|
*/
|
|
25
|
-
disconnect(
|
|
26
|
-
account?: string;
|
|
17
|
+
disconnect(params?: {
|
|
27
18
|
chainId?: ChainID;
|
|
28
|
-
|
|
19
|
+
address?: string;
|
|
20
|
+
}): Promise<void>;
|
|
29
21
|
/**
|
|
30
|
-
*
|
|
22
|
+
* Switches the blockchain chain context and optionally logs additional params.
|
|
31
23
|
*/
|
|
32
|
-
|
|
24
|
+
chain(params: {
|
|
25
|
+
chainId: ChainID;
|
|
26
|
+
address?: string;
|
|
27
|
+
}): Promise<void>;
|
|
33
28
|
/**
|
|
34
|
-
*
|
|
29
|
+
* Tracks a specific event with a name and associated data.
|
|
35
30
|
*/
|
|
36
|
-
|
|
37
|
-
chainId: ChainID;
|
|
38
|
-
account?: string;
|
|
39
|
-
}): void;
|
|
31
|
+
track(eventName: string, eventData: Record<string, any>): Promise<void>;
|
|
40
32
|
}
|
|
41
33
|
export declare class FormoAnalytics implements IFormoAnalytics {
|
|
42
34
|
readonly apiKey: string;
|
|
43
|
-
|
|
35
|
+
options: Options;
|
|
44
36
|
private _provider?;
|
|
45
|
-
private
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
private timezoneToCountry;
|
|
50
|
-
currentChainId?: string | null;
|
|
51
|
-
currentConnectedAccount?: string;
|
|
37
|
+
private _providerListeners;
|
|
38
|
+
config: Config;
|
|
39
|
+
currentChainId?: ChainID;
|
|
40
|
+
currentConnectedAddress?: Address;
|
|
52
41
|
private constructor();
|
|
53
|
-
static init(apiKey: string,
|
|
54
|
-
|
|
55
|
-
private identifyUser;
|
|
56
|
-
private getSessionId;
|
|
57
|
-
private setSessionCookie;
|
|
58
|
-
private generateSessionId;
|
|
59
|
-
private getCookieValue;
|
|
60
|
-
private trackEvent;
|
|
61
|
-
private maskSensitiveData;
|
|
62
|
-
private trackPageHit;
|
|
63
|
-
private trackProvider;
|
|
64
|
-
private registerChainChangedListener;
|
|
65
|
-
private handleAccountDisconnected;
|
|
66
|
-
private onChainChanged;
|
|
67
|
-
private onAccountsChanged;
|
|
68
|
-
private registerAccountsChangedListener;
|
|
69
|
-
private getCurrentChainId;
|
|
70
|
-
private handleAccountConnected;
|
|
71
|
-
private getCurrentWallet;
|
|
72
|
-
/**
|
|
73
|
-
* Stores the wallet address in session storage when connected.
|
|
74
|
-
* @param address - The wallet address to store.
|
|
75
|
-
*/
|
|
76
|
-
private storeWalletAddress;
|
|
77
|
-
/**
|
|
78
|
-
* Clears the wallet address from session storage when disconnected.
|
|
79
|
-
*/
|
|
80
|
-
private clearWalletAddress;
|
|
81
|
-
private buildApiUrl;
|
|
82
|
-
connect({ account, chainId }: {
|
|
83
|
-
account: string;
|
|
42
|
+
static init(apiKey: string, options?: Options): Promise<FormoAnalytics>;
|
|
43
|
+
connect({ chainId, address }: {
|
|
84
44
|
chainId: ChainID;
|
|
45
|
+
address: Address;
|
|
85
46
|
}): Promise<void>;
|
|
86
|
-
disconnect(
|
|
87
|
-
account?: string;
|
|
47
|
+
disconnect(params?: {
|
|
88
48
|
chainId?: ChainID;
|
|
89
|
-
|
|
90
|
-
|
|
49
|
+
address?: Address;
|
|
50
|
+
}): Promise<void>;
|
|
51
|
+
chain({ chainId, address }: {
|
|
91
52
|
chainId: ChainID;
|
|
92
|
-
|
|
53
|
+
address?: Address;
|
|
93
54
|
}): Promise<void>;
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
55
|
+
page(): Promise<void>;
|
|
56
|
+
track(eventName: string, eventData: Record<string, any>): Promise<void>;
|
|
57
|
+
private trackProvider;
|
|
58
|
+
private registerAddressChangedListener;
|
|
59
|
+
private registerChainChangedListener;
|
|
60
|
+
private onAddressChanged;
|
|
61
|
+
private onAddressConnected;
|
|
62
|
+
private handleDisconnect;
|
|
63
|
+
private onAddressDisconnected;
|
|
64
|
+
private onChainChanged;
|
|
65
|
+
private trackPageHit;
|
|
66
|
+
private trackEvent;
|
|
67
|
+
get provider(): EIP1193Provider | undefined;
|
|
68
|
+
private getAddress;
|
|
69
|
+
private getAccounts;
|
|
70
|
+
private getCurrentChainId;
|
|
71
|
+
private getLocation;
|
|
72
|
+
private getLanguage;
|
|
73
|
+
private buildEventPayload;
|
|
98
74
|
}
|
|
99
75
|
export {};
|
|
100
76
|
//# sourceMappingURL=FormoAnalytics.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormoAnalytics.d.ts","sourceRoot":"","sources":["../../../src/FormoAnalytics.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FormoAnalytics.d.ts","sourceRoot":"","sources":["../../../src/FormoAnalytics.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAE7E,UAAU,eAAe;IACvB;;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,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5E;;OAEG;IACH,KAAK,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErE;;OAEG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzE;AAED,qBAAa,cAAe,YAAW,eAAe;aAYlC,MAAM,EAAE,MAAM;IACvB,OAAO,EAAE,OAAO;IAZzB,OAAO,CAAC,SAAS,CAAC,CAAkB;IACpC,OAAO,CAAC,kBAAkB,CAGnB;IAEP,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC,OAAO;WAeM,IAAI,CACf,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC,cAAc,CAAC;IAUpB,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBpF,UAAU,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAM5E,KAAK,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBnF,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrB,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ7E,OAAO,CAAC,aAAa;IA8BrB,OAAO,CAAC,8BAA8B;IAYtC,OAAO,CAAC,4BAA4B;YAOtB,gBAAgB;YAQhB,kBAAkB;YAYlB,gBAAgB;YAUhB,qBAAqB;YAIrB,cAAc;IAsC5B,OAAO,CAAC,YAAY;YAcN,UAAU;IAyCxB,IAAI,QAAQ,IAAI,eAAe,GAAG,SAAS,CAE1C;YAEa,UAAU;YAsBV,WAAW;YAuBX,iBAAiB;IA0B/B,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,WAAW;YAcL,iBAAiB;CAwBhC"}
|