getu-attribution-v2-sdk 0.3.1 → 0.3.3
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/README.md +68 -10
- package/dist/core/AttributionSDK.d.ts +130 -0
- package/dist/core/AttributionSDK.d.ts.map +1 -0
- package/dist/core/AttributionSDK.js +1045 -0
- package/dist/getuai-attribution.min.js +1 -0
- package/dist/index.d.ts +155 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.esm.js +2806 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +2966 -0
- package/dist/queue/index.d.ts +75 -0
- package/dist/queue/index.d.ts.map +1 -0
- package/dist/queue/index.js +339 -0
- package/dist/storage/index.d.ts +72 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +592 -0
- package/dist/types/index.d.ts +137 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +51 -0
- package/dist/utils/index.d.ts +36 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +297 -0
- package/dist/version.d.ts +7 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +6 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -253,6 +253,7 @@ enum EventType {
|
|
|
253
253
|
// Pre-conversion signals
|
|
254
254
|
PAGE_VIEW = "page_view",
|
|
255
255
|
PAGE_CLICK = "page_click",
|
|
256
|
+
BUTTON_CLICK = "button_click",
|
|
256
257
|
VIDEO_PLAY = "video_play",
|
|
257
258
|
|
|
258
259
|
// Registration funnel
|
|
@@ -272,6 +273,9 @@ enum EventType {
|
|
|
272
273
|
|
|
273
274
|
// Post-conversion / back-office conversion
|
|
274
275
|
AUDIT_APPROVED = "audit_approved",
|
|
276
|
+
|
|
277
|
+
// User-defined custom events
|
|
278
|
+
CUSTOM = "custom",
|
|
275
279
|
}
|
|
276
280
|
```
|
|
277
281
|
|
|
@@ -317,6 +321,28 @@ await trackPageClick("user_123", {
|
|
|
317
321
|
});
|
|
318
322
|
```
|
|
319
323
|
|
|
324
|
+
### Track Button Click
|
|
325
|
+
|
|
326
|
+
```javascript
|
|
327
|
+
// Basic - button name only
|
|
328
|
+
await trackButtonClick("Sign Up");
|
|
329
|
+
|
|
330
|
+
// With user ID
|
|
331
|
+
await trackButtonClick("Buy Now", "user_123");
|
|
332
|
+
|
|
333
|
+
// With extra data
|
|
334
|
+
await trackButtonClick("Download Report", "user_123", {
|
|
335
|
+
section: "hero",
|
|
336
|
+
page: "/pricing",
|
|
337
|
+
variant: "primary",
|
|
338
|
+
});
|
|
339
|
+
|
|
340
|
+
// Without button name (anonymous click)
|
|
341
|
+
await trackButtonClick();
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
The event will be sent with `event_data.button_name` set to the provided name.
|
|
345
|
+
|
|
320
346
|
### Track Purchase
|
|
321
347
|
|
|
322
348
|
**Method 1: Traditional format (user_id required)**
|
|
@@ -541,21 +567,32 @@ await trackAddToCart("user_123", {
|
|
|
541
567
|
|
|
542
568
|
### Track Custom Event
|
|
543
569
|
|
|
570
|
+
Use `trackCustomEvent` to track any user-defined event with a custom name. The event name is required and must be non-empty.
|
|
571
|
+
|
|
544
572
|
```javascript
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
573
|
+
// Basic - event name only
|
|
574
|
+
await trackCustomEvent("webinar_registered");
|
|
575
|
+
|
|
576
|
+
// With custom data
|
|
577
|
+
await trackCustomEvent("webinar_registered", {
|
|
578
|
+
webinar_id: "webinar_123",
|
|
579
|
+
webinar_title: "Advanced Analytics",
|
|
580
|
+
});
|
|
581
|
+
|
|
582
|
+
// With user ID and revenue
|
|
583
|
+
await trackCustomEvent(
|
|
584
|
+
"subscription_upgraded",
|
|
585
|
+
{ plan: "pro", billing_cycle: "annual" },
|
|
553
586
|
"user_123", // tracking_user_id (optional)
|
|
554
|
-
|
|
555
|
-
Currency.USD // currency (optional)
|
|
587
|
+
299.00, // revenue (optional)
|
|
588
|
+
Currency.USD // currency (optional, default: USD)
|
|
556
589
|
);
|
|
557
590
|
```
|
|
558
591
|
|
|
592
|
+
Custom events are **batched** (not sent immediately). Use `flush()` to force-send pending events.
|
|
593
|
+
|
|
594
|
+
**Validation**: An empty or whitespace-only event name will be rejected client-side with a console error.
|
|
595
|
+
|
|
559
596
|
---
|
|
560
597
|
|
|
561
598
|
## Auto-Tracking
|
|
@@ -887,6 +924,27 @@ await trackAddToCart("user_123", {
|
|
|
887
924
|
});
|
|
888
925
|
```
|
|
889
926
|
|
|
927
|
+
#### `trackCustomEvent(customEventName, eventData?, tracking_user_id?, revenue?, currency?): Promise<void>`
|
|
928
|
+
|
|
929
|
+
Track a user-defined custom event. The `customEventName` is required and must be a non-empty string.
|
|
930
|
+
|
|
931
|
+
| Parameter | Type | Required | Description |
|
|
932
|
+
|-----------|------|----------|-------------|
|
|
933
|
+
| `customEventName` | string | **Yes** | Event name (e.g. `"webinar_registered"`) |
|
|
934
|
+
| `eventData` | object | No | Arbitrary key-value payload |
|
|
935
|
+
| `tracking_user_id` | string | No | User identifier; falls back to stored user ID |
|
|
936
|
+
| `revenue` | number | No | Revenue amount |
|
|
937
|
+
| `currency` | Currency | No | Currency code (default: `Currency.USD`) |
|
|
938
|
+
|
|
939
|
+
```javascript
|
|
940
|
+
await trackCustomEvent("feature_used", {
|
|
941
|
+
feature: "export_csv",
|
|
942
|
+
records_count: 500,
|
|
943
|
+
});
|
|
944
|
+
```
|
|
945
|
+
|
|
946
|
+
Custom events are **batched**. Call `flush()` to force immediate delivery.
|
|
947
|
+
|
|
890
948
|
### Attribution Functions
|
|
891
949
|
|
|
892
950
|
#### `getAttributionData(): AttributionData | null`
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { SDKConfig, EventType, AttributionData, Currency, UserSession, UserTraits } from "../types";
|
|
2
|
+
export declare class AttributionSDK {
|
|
3
|
+
private config;
|
|
4
|
+
private logger;
|
|
5
|
+
private storage;
|
|
6
|
+
private httpClient;
|
|
7
|
+
private queue;
|
|
8
|
+
private session;
|
|
9
|
+
private initialized;
|
|
10
|
+
private autoTrackEnabled;
|
|
11
|
+
private pageViewTrackTimes;
|
|
12
|
+
private cachedPublicIP;
|
|
13
|
+
private publicIPFetchPromise;
|
|
14
|
+
private initialPageViewTriggered;
|
|
15
|
+
private spaTrackingEnabled;
|
|
16
|
+
private lastTrackedPath;
|
|
17
|
+
private originalPushState;
|
|
18
|
+
private originalReplaceState;
|
|
19
|
+
private popstateHandler;
|
|
20
|
+
constructor(config: SDKConfig);
|
|
21
|
+
init(): Promise<void>;
|
|
22
|
+
trackEvent(eventType: EventType, eventData?: Record<string, any>, tracking_user_id?: string, revenue?: number, currency?: Currency, custom_event_name?: string): Promise<void>;
|
|
23
|
+
trackCustomEvent(customEventName: string, eventData?: Record<string, any>, tracking_user_id?: string, revenue?: number, currency?: Currency): Promise<void>;
|
|
24
|
+
trackPageView(pageData?: Record<string, any>, tracking_user_id?: string): Promise<void>;
|
|
25
|
+
private cleanupPageViewTrackTimes;
|
|
26
|
+
private ensurePublicIPFetched;
|
|
27
|
+
private fetchPublicIP;
|
|
28
|
+
trackPurchase(tracking_user_id: string, revenue: number, currency?: Currency, purchaseData?: Record<string, any>): Promise<void>;
|
|
29
|
+
trackLogin(tracking_user_id: string, loginData?: Record<string, any>): Promise<void>;
|
|
30
|
+
trackSignup(tracking_user_id: string, signupData?: Record<string, any>): Promise<void>;
|
|
31
|
+
trackFormSubmit(tracking_user_id?: string, formData?: Record<string, any>): Promise<void>;
|
|
32
|
+
trackVideoPlay(tracking_user_id?: string, videoData?: Record<string, any>): Promise<void>;
|
|
33
|
+
trackEmailVerification(tracking_user_id: string, verificationData?: Record<string, any>): Promise<void>;
|
|
34
|
+
trackAuditApproved(tracking_user_id: string, auditData?: Record<string, any>): Promise<void>;
|
|
35
|
+
trackPurchaseAuto(options: {
|
|
36
|
+
revenue: number;
|
|
37
|
+
currency?: Currency;
|
|
38
|
+
purchaseData?: Record<string, any>;
|
|
39
|
+
tracking_user_id?: string;
|
|
40
|
+
}): Promise<void>;
|
|
41
|
+
trackLoginAuto(options: {
|
|
42
|
+
loginData?: Record<string, any>;
|
|
43
|
+
tracking_user_id?: string;
|
|
44
|
+
}): Promise<void>;
|
|
45
|
+
trackSignupAuto(options: {
|
|
46
|
+
signupData?: Record<string, any>;
|
|
47
|
+
tracking_user_id?: string;
|
|
48
|
+
}): Promise<void>;
|
|
49
|
+
trackEmailVerificationAuto(options: {
|
|
50
|
+
verificationData?: Record<string, any>;
|
|
51
|
+
tracking_user_id?: string;
|
|
52
|
+
}): Promise<void>;
|
|
53
|
+
trackProductView(tracking_user_id?: string, productData?: Record<string, any>): Promise<void>;
|
|
54
|
+
trackAddToCart(tracking_user_id?: string, cartData?: Record<string, any>): Promise<void>;
|
|
55
|
+
trackPageClick(tracking_user_id?: string, clickData?: Record<string, any>): Promise<void>;
|
|
56
|
+
trackButtonClick(buttonName?: string, tracking_user_id?: string, clickData?: Record<string, any>): Promise<void>;
|
|
57
|
+
getAttributionData(): AttributionData | null;
|
|
58
|
+
addUTMToURL(url: string): string;
|
|
59
|
+
getCurrentUTMParams(): Record<string, string>;
|
|
60
|
+
private getUTMParams;
|
|
61
|
+
private initializeUserId;
|
|
62
|
+
setUserId(userId: string): void;
|
|
63
|
+
getUserId(): string | null;
|
|
64
|
+
removeUserId(): void;
|
|
65
|
+
/**
|
|
66
|
+
* Identify user and set user attributes
|
|
67
|
+
* Used to explicitly set user information, e.g., after login
|
|
68
|
+
*
|
|
69
|
+
* @param userId User unique identifier
|
|
70
|
+
* @param traits User attributes
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* sdk.identify('user-123', {
|
|
74
|
+
* email: 'user@example.com',
|
|
75
|
+
* name: 'John Doe',
|
|
76
|
+
* company_name: 'Acme Inc'
|
|
77
|
+
* });
|
|
78
|
+
*/
|
|
79
|
+
identify(userId: string, traits?: UserTraits): Promise<void>;
|
|
80
|
+
/**
|
|
81
|
+
* Get current user traits
|
|
82
|
+
*/
|
|
83
|
+
getUserTraits(): UserTraits | null;
|
|
84
|
+
/**
|
|
85
|
+
* Get current session ID
|
|
86
|
+
*/
|
|
87
|
+
getSessionId(): string | null;
|
|
88
|
+
private initializeSession;
|
|
89
|
+
private extractAndStoreUTMData;
|
|
90
|
+
private setupAutoTracking;
|
|
91
|
+
private setupFormTracking;
|
|
92
|
+
private serializeFormFields;
|
|
93
|
+
private getFormFieldKey;
|
|
94
|
+
private normalizeFormFieldKey;
|
|
95
|
+
private serializeFormValue;
|
|
96
|
+
/**
|
|
97
|
+
* Extract standardized lead fields from form data
|
|
98
|
+
* @param formData Serialized form data
|
|
99
|
+
* @returns Extracted user traits
|
|
100
|
+
*/
|
|
101
|
+
private extractLeadFields;
|
|
102
|
+
private setupLinkTracking;
|
|
103
|
+
private handleCrossDomainUTM;
|
|
104
|
+
private setupNetworkHandlers;
|
|
105
|
+
private setupVisibilityHandlers;
|
|
106
|
+
private setupBeforeUnloadHandler;
|
|
107
|
+
private flushOnUnload;
|
|
108
|
+
private retryPendingEvents;
|
|
109
|
+
private getCurrentPath;
|
|
110
|
+
private setupSPATracking;
|
|
111
|
+
private cleanupSPATracking;
|
|
112
|
+
private updateSessionActivity;
|
|
113
|
+
flush(): Promise<void>;
|
|
114
|
+
getStatus(): {
|
|
115
|
+
initialized: boolean;
|
|
116
|
+
session: UserSession | null;
|
|
117
|
+
queueSize: number;
|
|
118
|
+
online: boolean;
|
|
119
|
+
crossDomainUTM: {
|
|
120
|
+
enabled: boolean;
|
|
121
|
+
currentParams: Record<string, string>;
|
|
122
|
+
};
|
|
123
|
+
spaTracking: {
|
|
124
|
+
enabled: boolean;
|
|
125
|
+
currentPath: string;
|
|
126
|
+
};
|
|
127
|
+
};
|
|
128
|
+
destroy(): void;
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=AttributionSDK.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AttributionSDK.d.ts","sourceRoot":"","sources":["../../src/core/AttributionSDK.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EAET,SAAS,EACT,eAAe,EAEf,QAAQ,EACR,WAAW,EAGX,UAAU,EAEX,MAAM,UAAU,CAAC;AAuBlB,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,gBAAgB,CAAkB;IAC1C,OAAO,CAAC,kBAAkB,CAAkC;IAC5D,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,oBAAoB,CAAuC;IACnE,OAAO,CAAC,wBAAwB,CAAkB;IAElD,OAAO,CAAC,kBAAkB,CAAkB;IAC5C,OAAO,CAAC,eAAe,CAAc;IACrC,OAAO,CAAC,iBAAiB,CAAyC;IAClE,OAAO,CAAC,oBAAoB,CAA4C;IACxE,OAAO,CAAC,eAAe,CAAiD;gBAE5D,MAAM,EAAE,SAAS;IA+CvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAqFrB,UAAU,CACd,SAAS,EAAE,SAAS,EACpB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC/B,gBAAgB,CAAC,EAAE,MAAM,EACzB,OAAO,CAAC,EAAE,MAAM,EAChB,QAAQ,GAAE,QAAuB,EACjC,iBAAiB,CAAC,EAAE,MAAM,GACzB,OAAO,CAAC,IAAI,CAAC;IAwDV,gBAAgB,CACpB,eAAe,EAAE,MAAM,EACvB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC/B,gBAAgB,CAAC,EAAE,MAAM,EACzB,OAAO,CAAC,EAAE,MAAM,EAChB,QAAQ,GAAE,QAAuB,GAChC,OAAO,CAAC,IAAI,CAAC;IAgBV,aAAa,CACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC9B,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,IAAI,CAAC;IAoChB,OAAO,CAAC,yBAAyB;IASjC,OAAO,CAAC,qBAAqB;YAmBf,aAAa;IAsBrB,aAAa,CACjB,gBAAgB,EAAE,MAAM,EACxB,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,QAAuB,EACjC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC;IAWV,UAAU,CACd,gBAAgB,EAAE,MAAM,EACxB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC9B,OAAO,CAAC,IAAI,CAAC;IAKV,WAAW,CACf,gBAAgB,EAAE,MAAM,EACxB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC/B,OAAO,CAAC,IAAI,CAAC;IAKV,eAAe,CACnB,gBAAgB,CAAC,EAAE,MAAM,EACzB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC;IAKV,cAAc,CAClB,gBAAgB,CAAC,EAAE,MAAM,EACzB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC9B,OAAO,CAAC,IAAI,CAAC;IAKV,sBAAsB,CAC1B,gBAAgB,EAAE,MAAM,EACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACrC,OAAO,CAAC,IAAI,CAAC;IASV,kBAAkB,CACtB,gBAAgB,EAAE,MAAM,EACxB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC9B,OAAO,CAAC,IAAI,CAAC;IASV,iBAAiB,CAAC,OAAO,EAAE;QAC/B,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACnC,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBX,cAAc,CAAC,OAAO,EAAE;QAC5B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,GAAG,OAAO,CAAC,IAAI,CAAC;IAYX,eAAe,CAAC,OAAO,EAAE;QAC7B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,GAAG,OAAO,CAAC,IAAI,CAAC;IAYX,0BAA0B,CAAC,OAAO,EAAE;QACxC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACvC,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBX,gBAAgB,CACpB,gBAAgB,CAAC,EAAE,MAAM,EACzB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAChC,OAAO,CAAC,IAAI,CAAC;IASV,cAAc,CAClB,gBAAgB,CAAC,EAAE,MAAM,EACzB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC;IAKV,cAAc,CAClB,gBAAgB,CAAC,EAAE,MAAM,EACzB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC9B,OAAO,CAAC,IAAI,CAAC;IAKV,gBAAgB,CACpB,UAAU,CAAC,EAAE,MAAM,EACnB,gBAAgB,CAAC,EAAE,MAAM,EACzB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC9B,OAAO,CAAC,IAAI,CAAC;IAShB,kBAAkB,IAAI,eAAe,GAAG,IAAI;IAK5C,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAmBhC,mBAAmB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAa7C,OAAO,CAAC,YAAY;IAgDpB,OAAO,CAAC,gBAAgB;IAqBxB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAW/B,SAAS,IAAI,MAAM,GAAG,IAAI;IAK1B,YAAY,IAAI,IAAI;IAKpB;;;;;;;;;;;;;OAaG;IACG,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAgClE;;OAEG;IACH,aAAa,IAAI,UAAU,GAAG,IAAI;IAIlC;;OAEG;IACH,YAAY,IAAI,MAAM,GAAG,IAAI;IAK7B,OAAO,CAAC,iBAAiB;IA4BzB,OAAO,CAAC,sBAAsB;IAgD9B,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,iBAAiB;IAkCzB,OAAO,CAAC,mBAAmB;IAiK3B,OAAO,CAAC,eAAe;IA6BvB,OAAO,CAAC,qBAAqB;IAU7B,OAAO,CAAC,kBAAkB;IAW1B;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAwCzB,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,oBAAoB;IAqD5B,OAAO,CAAC,oBAAoB;IAY5B,OAAO,CAAC,uBAAuB;IAa/B,OAAO,CAAC,wBAAwB;IAWhC,OAAO,CAAC,aAAa;YAwCP,kBAAkB;IAiBhC,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,gBAAgB;IAmFxB,OAAO,CAAC,kBAAkB;IAwB1B,OAAO,CAAC,qBAAqB;IAQvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B,SAAS,IAAI;QACX,WAAW,EAAE,OAAO,CAAC;QACrB,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;QAC5B,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,OAAO,CAAC;QAChB,cAAc,EAAE;YACd,OAAO,EAAE,OAAO,CAAC;YACjB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;SACvC,CAAC;QACF,WAAW,EAAE;YACX,OAAO,EAAE,OAAO,CAAC;YACjB,WAAW,EAAE,MAAM,CAAC;SACrB,CAAC;KACH;IAkBD,OAAO,IAAI,IAAI;CAOhB"}
|