sovads-sdk 1.0.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.
- package/README.md +134 -0
- package/dist/index.d.ts +110 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +903 -0
- package/dist/index.js.map +1 -0
- package/package.json +42 -0
package/README.md
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# @sovads/sdk
|
|
2
|
+
|
|
3
|
+
SovAds SDK for publisher integration - A modular ad network SDK with banner, popup, and sidebar components.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @sovads/sdk
|
|
9
|
+
# or
|
|
10
|
+
pnpm add @sovads/sdk
|
|
11
|
+
# or
|
|
12
|
+
yarn add @sovads/sdk
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
### Basic Setup
|
|
18
|
+
|
|
19
|
+
```javascript
|
|
20
|
+
import { SovAds, Banner, Popup, Sidebar } from '@sovads/sdk'
|
|
21
|
+
|
|
22
|
+
// Initialize SDK
|
|
23
|
+
const sovads = new SovAds({
|
|
24
|
+
apiUrl: 'https://ads.sovseas.xyz', // Optional, defaults to production URL
|
|
25
|
+
debug: false, // Enable debug logging
|
|
26
|
+
siteId: 'your-site-id', // Optional, will auto-detect if not provided
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
// Banner Ad
|
|
30
|
+
const banner = new Banner(sovads, 'banner-container')
|
|
31
|
+
await banner.render()
|
|
32
|
+
|
|
33
|
+
// Popup Ad
|
|
34
|
+
const popup = new Popup(sovads)
|
|
35
|
+
await popup.show() // Shows after 3 seconds by default
|
|
36
|
+
|
|
37
|
+
// Sidebar Ad
|
|
38
|
+
const sidebar = new Sidebar(sovads, 'sidebar-container')
|
|
39
|
+
await sidebar.render()
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### HTML Example
|
|
43
|
+
|
|
44
|
+
```html
|
|
45
|
+
<!DOCTYPE html>
|
|
46
|
+
<html>
|
|
47
|
+
<head>
|
|
48
|
+
<title>My Site with SovAds</title>
|
|
49
|
+
</head>
|
|
50
|
+
<body>
|
|
51
|
+
<h1>Welcome to My Site</h1>
|
|
52
|
+
|
|
53
|
+
<!-- Banner Ad Container -->
|
|
54
|
+
<div id="banner-container"></div>
|
|
55
|
+
|
|
56
|
+
<!-- Sidebar Ad Container -->
|
|
57
|
+
<div id="sidebar-container"></div>
|
|
58
|
+
|
|
59
|
+
<script type="module">
|
|
60
|
+
import { SovAds, Banner, Sidebar } from '@sovads/sdk'
|
|
61
|
+
|
|
62
|
+
const sovads = new SovAds({ debug: true })
|
|
63
|
+
const banner = new Banner(sovads, 'banner-container')
|
|
64
|
+
const sidebar = new Sidebar(sovads, 'sidebar-container')
|
|
65
|
+
|
|
66
|
+
banner.render()
|
|
67
|
+
sidebar.render()
|
|
68
|
+
</script>
|
|
69
|
+
</body>
|
|
70
|
+
</html>
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## API Reference
|
|
74
|
+
|
|
75
|
+
### SovAds
|
|
76
|
+
|
|
77
|
+
Main SDK class for initialization and configuration.
|
|
78
|
+
|
|
79
|
+
#### Constructor
|
|
80
|
+
|
|
81
|
+
```typescript
|
|
82
|
+
new SovAds(config?: SovAdsConfig)
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
#### Config Options
|
|
86
|
+
|
|
87
|
+
- `apiUrl?: string` - API endpoint URL (default: `https://ads.sovseas.xyz`)
|
|
88
|
+
- `debug?: boolean` - Enable debug logging (default: `false`)
|
|
89
|
+
- `siteId?: string` - Site ID (optional, will auto-detect)
|
|
90
|
+
- `consumerId?: string` - Consumer ID for targeting specific advertisers
|
|
91
|
+
|
|
92
|
+
### Banner
|
|
93
|
+
|
|
94
|
+
Banner ad component.
|
|
95
|
+
|
|
96
|
+
```typescript
|
|
97
|
+
const banner = new Banner(sovads: SovAds, containerId: string)
|
|
98
|
+
await banner.render(consumerId?: string)
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Popup
|
|
102
|
+
|
|
103
|
+
Popup ad component.
|
|
104
|
+
|
|
105
|
+
```typescript
|
|
106
|
+
const popup = new Popup(sovads: SovAds)
|
|
107
|
+
await popup.show(consumerId?: string, delay?: number)
|
|
108
|
+
popup.hide()
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Sidebar
|
|
112
|
+
|
|
113
|
+
Sidebar ad component.
|
|
114
|
+
|
|
115
|
+
```typescript
|
|
116
|
+
const sidebar = new Sidebar(sovads: SovAds, containerId: string)
|
|
117
|
+
await sidebar.render(consumerId?: string)
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## Features
|
|
121
|
+
|
|
122
|
+
- ✅ Automatic site detection
|
|
123
|
+
- ✅ Impression and click tracking
|
|
124
|
+
- ✅ Render verification with IntersectionObserver
|
|
125
|
+
- ✅ Image load error handling
|
|
126
|
+
- ✅ Network retry logic
|
|
127
|
+
- ✅ CORS support
|
|
128
|
+
- ✅ TypeScript support
|
|
129
|
+
- ✅ Debug logging
|
|
130
|
+
|
|
131
|
+
## License
|
|
132
|
+
|
|
133
|
+
MIT
|
|
134
|
+
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
export interface SovAdsConfig {
|
|
2
|
+
siteId?: string;
|
|
3
|
+
apiUrl?: string;
|
|
4
|
+
debug?: boolean;
|
|
5
|
+
consumerId?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface AdComponent {
|
|
8
|
+
id: string;
|
|
9
|
+
campaignId: string;
|
|
10
|
+
bannerUrl: string;
|
|
11
|
+
targetUrl: string;
|
|
12
|
+
description: string;
|
|
13
|
+
consumerId?: string;
|
|
14
|
+
}
|
|
15
|
+
declare class SovAds {
|
|
16
|
+
protected config: SovAdsConfig;
|
|
17
|
+
private fingerprint;
|
|
18
|
+
private components;
|
|
19
|
+
private siteId;
|
|
20
|
+
private renderObservers;
|
|
21
|
+
private debugLoggingEnabled;
|
|
22
|
+
constructor(config?: SovAdsConfig);
|
|
23
|
+
private generateFingerprint;
|
|
24
|
+
private detectSiteId;
|
|
25
|
+
/**
|
|
26
|
+
* Setup IntersectionObserver to verify ad is actually rendered and visible
|
|
27
|
+
* This helps with fraud prevention and accurate impression tracking
|
|
28
|
+
* Falls back to manual visibility check for older browsers
|
|
29
|
+
*/
|
|
30
|
+
setupRenderObserver(element: HTMLElement, adId: string, callback: (isVisible: boolean) => void): void;
|
|
31
|
+
/**
|
|
32
|
+
* Get client metadata for tracking
|
|
33
|
+
*/
|
|
34
|
+
private getClientMetadata;
|
|
35
|
+
/**
|
|
36
|
+
* Validate URL format
|
|
37
|
+
*/
|
|
38
|
+
private isValidUrl;
|
|
39
|
+
/**
|
|
40
|
+
* Fetch with retry logic
|
|
41
|
+
*/
|
|
42
|
+
private fetchWithRetry;
|
|
43
|
+
loadAd(consumerId?: string): Promise<AdComponent | null>;
|
|
44
|
+
/**
|
|
45
|
+
* Track event with retry logic (internal helper)
|
|
46
|
+
*/
|
|
47
|
+
private trackEventWithRetry;
|
|
48
|
+
/**
|
|
49
|
+
* Track event with enhanced metadata using Beacon API
|
|
50
|
+
* Includes render verification, IP (collected server-side), and site ID validation
|
|
51
|
+
*/
|
|
52
|
+
private trackEvent;
|
|
53
|
+
addComponent(componentId: string, component: any): void;
|
|
54
|
+
getComponent(componentId: string): any;
|
|
55
|
+
removeComponent(componentId: string): void;
|
|
56
|
+
_trackEvent(type: 'IMPRESSION' | 'CLICK', adId: string, campaignId: string, renderInfo?: {
|
|
57
|
+
rendered: boolean;
|
|
58
|
+
viewportVisible: boolean;
|
|
59
|
+
renderTime: number;
|
|
60
|
+
}): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* Get config (for components to access debug mode)
|
|
63
|
+
*/
|
|
64
|
+
getConfig(): SovAdsConfig;
|
|
65
|
+
/**
|
|
66
|
+
* Log interaction (public method for components)
|
|
67
|
+
*/
|
|
68
|
+
logInteraction(type: string, data: any): Promise<void>;
|
|
69
|
+
/**
|
|
70
|
+
* Log debug event to server
|
|
71
|
+
*/
|
|
72
|
+
private logDebug;
|
|
73
|
+
/**
|
|
74
|
+
* Clean up observers when SDK is destroyed
|
|
75
|
+
*/
|
|
76
|
+
destroy(): void;
|
|
77
|
+
}
|
|
78
|
+
export declare class Banner {
|
|
79
|
+
private sovads;
|
|
80
|
+
private containerId;
|
|
81
|
+
private currentAd;
|
|
82
|
+
private renderStartTime;
|
|
83
|
+
private hasTrackedImpression;
|
|
84
|
+
private isRendering;
|
|
85
|
+
constructor(sovads: SovAds, containerId: string);
|
|
86
|
+
render(consumerId?: string): Promise<void>;
|
|
87
|
+
}
|
|
88
|
+
export declare class Popup {
|
|
89
|
+
private sovads;
|
|
90
|
+
private currentAd;
|
|
91
|
+
private popupElement;
|
|
92
|
+
private isShowing;
|
|
93
|
+
constructor(sovads: SovAds);
|
|
94
|
+
show(consumerId?: string, delay?: number): Promise<void>;
|
|
95
|
+
private renderPopup;
|
|
96
|
+
hide(): void;
|
|
97
|
+
}
|
|
98
|
+
export declare class Sidebar {
|
|
99
|
+
private sovads;
|
|
100
|
+
private containerId;
|
|
101
|
+
private currentAd;
|
|
102
|
+
private renderStartTime;
|
|
103
|
+
private hasTrackedImpression;
|
|
104
|
+
private isRendering;
|
|
105
|
+
constructor(sovads: SovAds, containerId: string);
|
|
106
|
+
render(consumerId?: string): Promise<void>;
|
|
107
|
+
}
|
|
108
|
+
export { SovAds };
|
|
109
|
+
export default SovAds;
|
|
110
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,903 @@
|
|
|
1
|
+
// SovAds SDK - Modular Ad Network Integration
|
|
2
|
+
// Usage: import { SovAds, Banner, Popup, Sidebar } from '@sovads/sdk'
|
|
3
|
+
class SovAds {
|
|
4
|
+
constructor(config = {}) {
|
|
5
|
+
this.components = new Map();
|
|
6
|
+
this.siteId = null;
|
|
7
|
+
this.renderObservers = new Map();
|
|
8
|
+
this.debugLoggingEnabled = true;
|
|
9
|
+
this.config = {
|
|
10
|
+
apiUrl: typeof window !== 'undefined' && window.location.hostname === 'localhost'
|
|
11
|
+
? 'http://localhost:3000'
|
|
12
|
+
: 'https://ads.sovseas.xyz',
|
|
13
|
+
debug: false,
|
|
14
|
+
...config
|
|
15
|
+
};
|
|
16
|
+
this.fingerprint = this.generateFingerprint();
|
|
17
|
+
if (this.config.debug) {
|
|
18
|
+
console.log('SovAds SDK initialized:', this.config);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
generateFingerprint() {
|
|
22
|
+
const canvas = document.createElement('canvas');
|
|
23
|
+
const ctx = canvas.getContext('2d');
|
|
24
|
+
ctx?.fillText('SovAds fingerprint', 10, 10);
|
|
25
|
+
const fingerprint = [
|
|
26
|
+
navigator.userAgent,
|
|
27
|
+
navigator.language,
|
|
28
|
+
screen.width + 'x' + screen.height,
|
|
29
|
+
new Date().getTimezoneOffset(),
|
|
30
|
+
canvas.toDataURL()
|
|
31
|
+
].join('|');
|
|
32
|
+
return btoa(fingerprint).substring(0, 16);
|
|
33
|
+
}
|
|
34
|
+
async detectSiteId() {
|
|
35
|
+
if (this.siteId) {
|
|
36
|
+
return this.siteId;
|
|
37
|
+
}
|
|
38
|
+
if (this.config.siteId) {
|
|
39
|
+
this.siteId = this.config.siteId;
|
|
40
|
+
if (this.config.debug) {
|
|
41
|
+
console.log('Using configured site ID:', this.siteId);
|
|
42
|
+
}
|
|
43
|
+
return this.siteId;
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
// Send beacon to detect site ID based on domain
|
|
47
|
+
const domain = window.location.hostname;
|
|
48
|
+
const payload = {
|
|
49
|
+
domain,
|
|
50
|
+
fingerprint: this.fingerprint,
|
|
51
|
+
userAgent: navigator.userAgent,
|
|
52
|
+
pageUrl: window.location.href,
|
|
53
|
+
timestamp: Date.now()
|
|
54
|
+
};
|
|
55
|
+
const startTime = Date.now();
|
|
56
|
+
const endpoint = `${this.config.apiUrl}/api/sites/detect`;
|
|
57
|
+
// Send detection request using fetch (beacon doesn't support response)
|
|
58
|
+
const response = await this.fetchWithRetry(endpoint, {
|
|
59
|
+
method: 'POST',
|
|
60
|
+
headers: {
|
|
61
|
+
'Content-Type': 'application/json'
|
|
62
|
+
},
|
|
63
|
+
body: JSON.stringify(payload)
|
|
64
|
+
});
|
|
65
|
+
const duration = Date.now() - startTime;
|
|
66
|
+
// Log SDK request
|
|
67
|
+
await this.logDebug('SDK_REQUEST', {
|
|
68
|
+
type: 'SITE_DETECT',
|
|
69
|
+
endpoint: '/api/sites/detect',
|
|
70
|
+
method: 'POST',
|
|
71
|
+
domain,
|
|
72
|
+
pageUrl: window.location.href,
|
|
73
|
+
userAgent: navigator.userAgent,
|
|
74
|
+
fingerprint: this.fingerprint,
|
|
75
|
+
requestBody: payload,
|
|
76
|
+
responseStatus: response.status,
|
|
77
|
+
duration,
|
|
78
|
+
});
|
|
79
|
+
if (response.ok) {
|
|
80
|
+
const data = await response.json();
|
|
81
|
+
if (data.siteId) {
|
|
82
|
+
this.siteId = String(data.siteId);
|
|
83
|
+
if (this.config.debug) {
|
|
84
|
+
console.log('Site ID detected from API:', this.siteId, data);
|
|
85
|
+
}
|
|
86
|
+
return this.siteId;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// Fallback: generate site ID from domain (for development only)
|
|
90
|
+
// In production, this should trigger registration flow
|
|
91
|
+
const isLocalhost = window.location.hostname === 'localhost' || window.location.hostname === '127.0.0.1';
|
|
92
|
+
if (isLocalhost) {
|
|
93
|
+
this.siteId = `site_${btoa(domain).substring(0, 8)}`;
|
|
94
|
+
if (this.config.debug) {
|
|
95
|
+
console.log('Generated fallback site ID (dev mode):', this.siteId);
|
|
96
|
+
}
|
|
97
|
+
return this.siteId;
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
// In production, use temp_ prefix to indicate unregistered site
|
|
101
|
+
this.siteId = `temp_${btoa(domain).substring(0, 8)}_${Date.now()}`;
|
|
102
|
+
if (this.config.debug) {
|
|
103
|
+
console.warn('Unregistered site detected, using temp site ID:', this.siteId);
|
|
104
|
+
}
|
|
105
|
+
return this.siteId;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
if (this.config.debug) {
|
|
110
|
+
console.error('Error detecting site ID:', error);
|
|
111
|
+
}
|
|
112
|
+
// Fallback: generate site ID from domain
|
|
113
|
+
const hostname = window.location.hostname;
|
|
114
|
+
const isLocalhost = hostname === 'localhost' || hostname === '127.0.0.1';
|
|
115
|
+
if (isLocalhost) {
|
|
116
|
+
this.siteId = `site_${btoa(hostname).substring(0, 8)}`;
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
this.siteId = `temp_${btoa(hostname).substring(0, 8)}_${Date.now()}`;
|
|
120
|
+
}
|
|
121
|
+
return this.siteId;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Setup IntersectionObserver to verify ad is actually rendered and visible
|
|
126
|
+
* This helps with fraud prevention and accurate impression tracking
|
|
127
|
+
* Falls back to manual visibility check for older browsers
|
|
128
|
+
*/
|
|
129
|
+
setupRenderObserver(element, adId, callback) {
|
|
130
|
+
// Clean up existing observer if any
|
|
131
|
+
const existingObserver = this.renderObservers.get(adId);
|
|
132
|
+
if (existingObserver) {
|
|
133
|
+
existingObserver.disconnect();
|
|
134
|
+
}
|
|
135
|
+
// Check if IntersectionObserver is supported
|
|
136
|
+
if (typeof IntersectionObserver !== 'undefined') {
|
|
137
|
+
const observer = new IntersectionObserver((entries) => {
|
|
138
|
+
entries.forEach((entry) => {
|
|
139
|
+
const isVisible = entry.isIntersecting && entry.intersectionRatio > 0.5;
|
|
140
|
+
callback(isVisible);
|
|
141
|
+
if (this.config.debug) {
|
|
142
|
+
console.log(`Ad ${adId} visibility:`, {
|
|
143
|
+
isIntersecting: entry.isIntersecting,
|
|
144
|
+
intersectionRatio: entry.intersectionRatio,
|
|
145
|
+
isVisible
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
}, {
|
|
150
|
+
threshold: [0.5], // At least 50% visible
|
|
151
|
+
rootMargin: '0px'
|
|
152
|
+
});
|
|
153
|
+
observer.observe(element);
|
|
154
|
+
this.renderObservers.set(adId, observer);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
// Fallback for older browsers: manual visibility check
|
|
158
|
+
if (this.config.debug) {
|
|
159
|
+
console.warn(`IntersectionObserver not supported, using fallback for ad ${adId}`);
|
|
160
|
+
}
|
|
161
|
+
const checkVisibility = () => {
|
|
162
|
+
const rect = element.getBoundingClientRect();
|
|
163
|
+
const windowHeight = window.innerHeight || document.documentElement.clientHeight;
|
|
164
|
+
const windowWidth = window.innerWidth || document.documentElement.clientWidth;
|
|
165
|
+
// Check if element is in viewport and at least 50% visible
|
|
166
|
+
const isInViewport = (rect.top < windowHeight &&
|
|
167
|
+
rect.bottom > 0 &&
|
|
168
|
+
rect.left < windowWidth &&
|
|
169
|
+
rect.right > 0);
|
|
170
|
+
if (isInViewport) {
|
|
171
|
+
const visibleHeight = Math.min(rect.bottom, windowHeight) - Math.max(rect.top, 0);
|
|
172
|
+
const visibleWidth = Math.min(rect.right, windowWidth) - Math.max(rect.left, 0);
|
|
173
|
+
const visibleArea = visibleHeight * visibleWidth;
|
|
174
|
+
const totalArea = rect.height * rect.width;
|
|
175
|
+
const intersectionRatio = totalArea > 0 ? visibleArea / totalArea : 0;
|
|
176
|
+
const isVisible = intersectionRatio >= 0.5;
|
|
177
|
+
callback(isVisible);
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
callback(false);
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
// Check immediately and on scroll/resize
|
|
184
|
+
checkVisibility();
|
|
185
|
+
const scrollHandler = () => checkVisibility();
|
|
186
|
+
const resizeHandler = () => checkVisibility();
|
|
187
|
+
window.addEventListener('scroll', scrollHandler, { passive: true });
|
|
188
|
+
window.addEventListener('resize', resizeHandler, { passive: true });
|
|
189
|
+
// Store cleanup function
|
|
190
|
+
this.renderObservers.set(adId, {
|
|
191
|
+
disconnect: () => {
|
|
192
|
+
window.removeEventListener('scroll', scrollHandler);
|
|
193
|
+
window.removeEventListener('resize', resizeHandler);
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Get client metadata for tracking
|
|
200
|
+
*/
|
|
201
|
+
getClientMetadata() {
|
|
202
|
+
return {
|
|
203
|
+
pageUrl: window.location.href,
|
|
204
|
+
userAgent: navigator.userAgent,
|
|
205
|
+
language: navigator.language,
|
|
206
|
+
screenWidth: screen.width,
|
|
207
|
+
screenHeight: screen.height,
|
|
208
|
+
viewportWidth: window.innerWidth,
|
|
209
|
+
viewportHeight: window.innerHeight,
|
|
210
|
+
timezoneOffset: new Date().getTimezoneOffset(),
|
|
211
|
+
referrer: document.referrer || '',
|
|
212
|
+
timestamp: Date.now()
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Validate URL format
|
|
217
|
+
*/
|
|
218
|
+
isValidUrl(url) {
|
|
219
|
+
try {
|
|
220
|
+
const parsed = new URL(url);
|
|
221
|
+
return parsed.protocol === 'http:' || parsed.protocol === 'https:';
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
return false;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Fetch with retry logic
|
|
229
|
+
*/
|
|
230
|
+
async fetchWithRetry(url, options = {}, maxAttempts = 3) {
|
|
231
|
+
let lastError = null;
|
|
232
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
233
|
+
try {
|
|
234
|
+
const response = await fetch(url, options);
|
|
235
|
+
if (response.ok || attempt === maxAttempts) {
|
|
236
|
+
return response;
|
|
237
|
+
}
|
|
238
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
242
|
+
if (attempt < maxAttempts) {
|
|
243
|
+
const delay = Math.pow(2, attempt - 1) * 100; // Exponential backoff
|
|
244
|
+
if (this.config.debug) {
|
|
245
|
+
console.warn(`Fetch attempt ${attempt} failed, retrying in ${delay}ms...`);
|
|
246
|
+
}
|
|
247
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
throw lastError || new Error('Fetch failed after retries');
|
|
252
|
+
}
|
|
253
|
+
async loadAd(consumerId) {
|
|
254
|
+
const startTime = Date.now();
|
|
255
|
+
try {
|
|
256
|
+
const siteId = await this.detectSiteId();
|
|
257
|
+
const params = new URLSearchParams({
|
|
258
|
+
siteId,
|
|
259
|
+
...(consumerId && { consumerId })
|
|
260
|
+
});
|
|
261
|
+
const endpoint = `${this.config.apiUrl}/api/ads?${params}`;
|
|
262
|
+
const response = await this.fetchWithRetry(endpoint);
|
|
263
|
+
const duration = Date.now() - startTime;
|
|
264
|
+
// Log SDK request
|
|
265
|
+
await this.logDebug('SDK_REQUEST', {
|
|
266
|
+
type: 'AD_REQUEST',
|
|
267
|
+
endpoint: '/api/ads',
|
|
268
|
+
method: 'GET',
|
|
269
|
+
siteId,
|
|
270
|
+
domain: window.location.hostname,
|
|
271
|
+
pageUrl: window.location.href,
|
|
272
|
+
userAgent: navigator.userAgent,
|
|
273
|
+
fingerprint: this.fingerprint,
|
|
274
|
+
requestBody: { siteId, consumerId },
|
|
275
|
+
responseStatus: response.status,
|
|
276
|
+
duration,
|
|
277
|
+
});
|
|
278
|
+
if (!response.ok) {
|
|
279
|
+
throw new Error(`Failed to load ad: ${response.statusText}`);
|
|
280
|
+
}
|
|
281
|
+
const ad = await response.json();
|
|
282
|
+
// Validate ad data
|
|
283
|
+
if (!ad || !ad.bannerUrl || !ad.targetUrl) {
|
|
284
|
+
if (this.config.debug) {
|
|
285
|
+
console.error('Invalid ad data received:', ad);
|
|
286
|
+
}
|
|
287
|
+
return null;
|
|
288
|
+
}
|
|
289
|
+
// Validate URLs
|
|
290
|
+
if (!this.isValidUrl(ad.bannerUrl)) {
|
|
291
|
+
if (this.config.debug) {
|
|
292
|
+
console.error('Invalid bannerUrl:', ad.bannerUrl);
|
|
293
|
+
}
|
|
294
|
+
return null;
|
|
295
|
+
}
|
|
296
|
+
if (!this.isValidUrl(ad.targetUrl)) {
|
|
297
|
+
if (this.config.debug) {
|
|
298
|
+
console.error('Invalid targetUrl:', ad.targetUrl);
|
|
299
|
+
}
|
|
300
|
+
return null;
|
|
301
|
+
}
|
|
302
|
+
if (this.config.debug) {
|
|
303
|
+
console.log('Ad loaded:', ad);
|
|
304
|
+
}
|
|
305
|
+
// Log interaction
|
|
306
|
+
await this.logDebug('SDK_INTERACTION', {
|
|
307
|
+
type: 'AD_LOADED',
|
|
308
|
+
adId: ad.id,
|
|
309
|
+
campaignId: ad.campaignId,
|
|
310
|
+
siteId,
|
|
311
|
+
pageUrl: window.location.href,
|
|
312
|
+
});
|
|
313
|
+
return ad;
|
|
314
|
+
}
|
|
315
|
+
catch (error) {
|
|
316
|
+
const duration = Date.now() - startTime;
|
|
317
|
+
await this.logDebug('SDK_REQUEST', {
|
|
318
|
+
type: 'AD_REQUEST',
|
|
319
|
+
endpoint: '/api/ads',
|
|
320
|
+
method: 'GET',
|
|
321
|
+
siteId: this.siteId,
|
|
322
|
+
domain: window.location.hostname,
|
|
323
|
+
pageUrl: window.location.href,
|
|
324
|
+
userAgent: navigator.userAgent,
|
|
325
|
+
fingerprint: this.fingerprint,
|
|
326
|
+
error: error instanceof Error ? error.message : String(error),
|
|
327
|
+
duration,
|
|
328
|
+
});
|
|
329
|
+
if (this.config.debug) {
|
|
330
|
+
console.error('Error loading ad:', error);
|
|
331
|
+
}
|
|
332
|
+
return null;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Track event with retry logic (internal helper)
|
|
337
|
+
*/
|
|
338
|
+
async trackEventWithRetry(type, adId, campaignId, renderInfo, attempt, maxAttempts = 3) {
|
|
339
|
+
try {
|
|
340
|
+
const siteId = await this.detectSiteId();
|
|
341
|
+
const metadata = this.getClientMetadata();
|
|
342
|
+
const payload = {
|
|
343
|
+
type,
|
|
344
|
+
campaignId,
|
|
345
|
+
adId,
|
|
346
|
+
siteId,
|
|
347
|
+
fingerprint: this.fingerprint,
|
|
348
|
+
consumerId: this.config.consumerId,
|
|
349
|
+
rendered: renderInfo?.rendered ?? true,
|
|
350
|
+
viewportVisible: renderInfo?.viewportVisible ?? false,
|
|
351
|
+
renderTime: renderInfo?.renderTime ?? Date.now(),
|
|
352
|
+
timestamp: metadata.timestamp,
|
|
353
|
+
pageUrl: metadata.pageUrl,
|
|
354
|
+
userAgent: metadata.userAgent
|
|
355
|
+
};
|
|
356
|
+
const webhookUrl = `${this.config.apiUrl}/api/webhook/beacon`;
|
|
357
|
+
const response = await fetch(webhookUrl, {
|
|
358
|
+
method: 'POST',
|
|
359
|
+
headers: {
|
|
360
|
+
'Content-Type': 'application/json'
|
|
361
|
+
},
|
|
362
|
+
body: JSON.stringify(payload),
|
|
363
|
+
keepalive: true // Similar behavior to beacon
|
|
364
|
+
});
|
|
365
|
+
if (response.ok) {
|
|
366
|
+
if (this.config.debug) {
|
|
367
|
+
console.log(`SovAds: Tracked ${type} event via fetch (attempt ${attempt})`, payload);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
else {
|
|
371
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
catch (error) {
|
|
375
|
+
if (attempt < maxAttempts) {
|
|
376
|
+
// Exponential backoff: 100ms, 200ms, 400ms
|
|
377
|
+
const delay = Math.pow(2, attempt - 1) * 100;
|
|
378
|
+
if (this.config.debug) {
|
|
379
|
+
console.warn(`SovAds: Retrying ${type} event (attempt ${attempt + 1}/${maxAttempts}) after ${delay}ms`);
|
|
380
|
+
}
|
|
381
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
382
|
+
return this.trackEventWithRetry(type, adId, campaignId, renderInfo, attempt + 1, maxAttempts);
|
|
383
|
+
}
|
|
384
|
+
else {
|
|
385
|
+
if (this.config.debug) {
|
|
386
|
+
console.error(`SovAds: Failed to track ${type} event after ${maxAttempts} attempts:`, error);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Track event with enhanced metadata using Beacon API
|
|
393
|
+
* Includes render verification, IP (collected server-side), and site ID validation
|
|
394
|
+
*/
|
|
395
|
+
async trackEvent(type, adId, campaignId, renderInfo) {
|
|
396
|
+
try {
|
|
397
|
+
const siteId = await this.detectSiteId();
|
|
398
|
+
const metadata = this.getClientMetadata();
|
|
399
|
+
const payload = {
|
|
400
|
+
type,
|
|
401
|
+
campaignId,
|
|
402
|
+
adId,
|
|
403
|
+
siteId,
|
|
404
|
+
fingerprint: this.fingerprint,
|
|
405
|
+
consumerId: this.config.consumerId,
|
|
406
|
+
rendered: renderInfo?.rendered ?? true,
|
|
407
|
+
viewportVisible: renderInfo?.viewportVisible ?? false,
|
|
408
|
+
renderTime: renderInfo?.renderTime ?? Date.now(),
|
|
409
|
+
timestamp: metadata.timestamp,
|
|
410
|
+
pageUrl: metadata.pageUrl,
|
|
411
|
+
userAgent: metadata.userAgent
|
|
412
|
+
};
|
|
413
|
+
// Use sendBeacon for reliable delivery (better for tracking impressions)
|
|
414
|
+
// Beacon API ensures events are sent even if user navigates away
|
|
415
|
+
if (navigator.sendBeacon) {
|
|
416
|
+
const blob = new Blob([JSON.stringify(payload)], {
|
|
417
|
+
type: 'application/json'
|
|
418
|
+
});
|
|
419
|
+
// Send to dedicated webhook endpoint for beamer interactions
|
|
420
|
+
const webhookUrl = `${this.config.apiUrl}/api/webhook/beacon`;
|
|
421
|
+
const sent = navigator.sendBeacon(webhookUrl, blob);
|
|
422
|
+
if (!sent) {
|
|
423
|
+
// Beacon failed, fallback to fetch with retry
|
|
424
|
+
if (this.config.debug) {
|
|
425
|
+
console.warn(`SovAds: Beacon failed for ${type}, falling back to fetch`);
|
|
426
|
+
}
|
|
427
|
+
await this.trackEventWithRetry(type, adId, campaignId, renderInfo, 1);
|
|
428
|
+
}
|
|
429
|
+
else if (this.config.debug) {
|
|
430
|
+
console.log(`SovAds: Tracked ${type} event via beacon`, {
|
|
431
|
+
sent,
|
|
432
|
+
payload: { ...payload, fingerprint: payload.fingerprint.substring(0, 8) + '...' }
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
else {
|
|
437
|
+
// Fallback to fetch for older browsers
|
|
438
|
+
await this.trackEventWithRetry(type, adId, campaignId, renderInfo, 1);
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
catch (error) {
|
|
442
|
+
if (this.config.debug) {
|
|
443
|
+
console.error('Error tracking event:', error);
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
// Component management
|
|
448
|
+
addComponent(componentId, component) {
|
|
449
|
+
this.components.set(componentId, component);
|
|
450
|
+
}
|
|
451
|
+
getComponent(componentId) {
|
|
452
|
+
return this.components.get(componentId);
|
|
453
|
+
}
|
|
454
|
+
removeComponent(componentId) {
|
|
455
|
+
this.components.delete(componentId);
|
|
456
|
+
}
|
|
457
|
+
// Expose trackEvent for components (internal use only)
|
|
458
|
+
// Note: This is a workaround to access private method from components
|
|
459
|
+
// In production, consider making trackEvent protected or using a different pattern
|
|
460
|
+
_trackEvent(type, adId, campaignId, renderInfo) {
|
|
461
|
+
return this.trackEvent(type, adId, campaignId, renderInfo);
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Get config (for components to access debug mode)
|
|
465
|
+
*/
|
|
466
|
+
getConfig() {
|
|
467
|
+
return this.config;
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Log interaction (public method for components)
|
|
471
|
+
*/
|
|
472
|
+
async logInteraction(type, data) {
|
|
473
|
+
await this.logDebug('SDK_INTERACTION', {
|
|
474
|
+
type,
|
|
475
|
+
...data,
|
|
476
|
+
siteId: this.siteId,
|
|
477
|
+
pageUrl: window.location.href,
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* Log debug event to server
|
|
482
|
+
*/
|
|
483
|
+
async logDebug(type, data) {
|
|
484
|
+
if (!this.debugLoggingEnabled)
|
|
485
|
+
return;
|
|
486
|
+
try {
|
|
487
|
+
const logUrl = `${this.config.apiUrl}/api/debug/log`;
|
|
488
|
+
const payload = { type, data };
|
|
489
|
+
// Use sendBeacon for non-blocking logging
|
|
490
|
+
if (navigator.sendBeacon) {
|
|
491
|
+
const blob = new Blob([JSON.stringify(payload)], { type: 'application/json' });
|
|
492
|
+
navigator.sendBeacon(logUrl, blob);
|
|
493
|
+
}
|
|
494
|
+
else {
|
|
495
|
+
// Fallback to fetch (fire and forget)
|
|
496
|
+
fetch(logUrl, {
|
|
497
|
+
method: 'POST',
|
|
498
|
+
headers: { 'Content-Type': 'application/json' },
|
|
499
|
+
body: JSON.stringify(payload),
|
|
500
|
+
keepalive: true,
|
|
501
|
+
}).catch(() => {
|
|
502
|
+
// Silently fail - debug logging shouldn't break the app
|
|
503
|
+
});
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
catch (error) {
|
|
507
|
+
// Silently fail - debug logging shouldn't break the app
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Clean up observers when SDK is destroyed
|
|
512
|
+
*/
|
|
513
|
+
destroy() {
|
|
514
|
+
this.renderObservers.forEach((observer) => observer.disconnect());
|
|
515
|
+
this.renderObservers.clear();
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
// Banner Component
|
|
519
|
+
export class Banner {
|
|
520
|
+
constructor(sovads, containerId) {
|
|
521
|
+
this.currentAd = null;
|
|
522
|
+
this.renderStartTime = 0;
|
|
523
|
+
this.hasTrackedImpression = false;
|
|
524
|
+
this.isRendering = false;
|
|
525
|
+
this.sovads = sovads;
|
|
526
|
+
this.containerId = containerId;
|
|
527
|
+
}
|
|
528
|
+
async render(consumerId) {
|
|
529
|
+
// Prevent concurrent renders
|
|
530
|
+
if (this.isRendering) {
|
|
531
|
+
if (this.sovads.getConfig().debug) {
|
|
532
|
+
console.warn(`Banner render already in progress for ${this.containerId}`);
|
|
533
|
+
}
|
|
534
|
+
return;
|
|
535
|
+
}
|
|
536
|
+
this.isRendering = true;
|
|
537
|
+
try {
|
|
538
|
+
const container = document.getElementById(this.containerId);
|
|
539
|
+
if (!container) {
|
|
540
|
+
console.error(`Container with id "${this.containerId}" not found`);
|
|
541
|
+
this.isRendering = false;
|
|
542
|
+
return;
|
|
543
|
+
}
|
|
544
|
+
this.renderStartTime = Date.now();
|
|
545
|
+
this.currentAd = await this.sovads.loadAd(consumerId);
|
|
546
|
+
if (!this.currentAd) {
|
|
547
|
+
container.innerHTML = '<div class="sovads-no-ad">No ads available</div>';
|
|
548
|
+
this.isRendering = false;
|
|
549
|
+
return;
|
|
550
|
+
}
|
|
551
|
+
const adElement = document.createElement('div');
|
|
552
|
+
adElement.className = 'sovads-banner';
|
|
553
|
+
adElement.setAttribute('data-ad-id', this.currentAd.id);
|
|
554
|
+
adElement.style.cssText = `
|
|
555
|
+
border: 1px solid #333;
|
|
556
|
+
border-radius: 8px;
|
|
557
|
+
overflow: hidden;
|
|
558
|
+
cursor: pointer;
|
|
559
|
+
transition: transform 0.2s ease;
|
|
560
|
+
`;
|
|
561
|
+
const img = document.createElement('img');
|
|
562
|
+
img.src = this.currentAd.bannerUrl;
|
|
563
|
+
img.alt = this.currentAd.description;
|
|
564
|
+
img.style.cssText = 'width: 100%; height: auto; display: block;';
|
|
565
|
+
// Track when image loads (render verification)
|
|
566
|
+
img.onload = () => {
|
|
567
|
+
const renderTime = Date.now() - this.renderStartTime;
|
|
568
|
+
const renderInfo = {
|
|
569
|
+
rendered: true,
|
|
570
|
+
viewportVisible: false,
|
|
571
|
+
renderTime
|
|
572
|
+
};
|
|
573
|
+
// Setup IntersectionObserver to verify ad is visible
|
|
574
|
+
this.sovads.setupRenderObserver(adElement, this.currentAd.id, (isVisible) => {
|
|
575
|
+
renderInfo.viewportVisible = isVisible;
|
|
576
|
+
// Track impression only once when ad becomes visible
|
|
577
|
+
if (isVisible && !this.hasTrackedImpression) {
|
|
578
|
+
this.hasTrackedImpression = true;
|
|
579
|
+
this.sovads._trackEvent('IMPRESSION', this.currentAd.id, this.currentAd.campaignId, renderInfo);
|
|
580
|
+
}
|
|
581
|
+
});
|
|
582
|
+
};
|
|
583
|
+
// Handle image load errors - still track impression if element is visible
|
|
584
|
+
img.onerror = () => {
|
|
585
|
+
if (this.sovads.getConfig().debug) {
|
|
586
|
+
console.warn(`Failed to load ad image: ${this.currentAd.bannerUrl}`);
|
|
587
|
+
}
|
|
588
|
+
// Still set up observer in case element becomes visible (for broken image tracking)
|
|
589
|
+
const renderInfo = {
|
|
590
|
+
rendered: false,
|
|
591
|
+
viewportVisible: false,
|
|
592
|
+
renderTime: Date.now() - this.renderStartTime
|
|
593
|
+
};
|
|
594
|
+
this.sovads.setupRenderObserver(adElement, this.currentAd.id, (isVisible) => {
|
|
595
|
+
renderInfo.viewportVisible = isVisible;
|
|
596
|
+
// Track impression even with broken image if visible
|
|
597
|
+
if (isVisible && !this.hasTrackedImpression) {
|
|
598
|
+
this.hasTrackedImpression = true;
|
|
599
|
+
this.sovads._trackEvent('IMPRESSION', this.currentAd.id, this.currentAd.campaignId, renderInfo);
|
|
600
|
+
}
|
|
601
|
+
});
|
|
602
|
+
};
|
|
603
|
+
// Add click handler
|
|
604
|
+
adElement.addEventListener('click', () => {
|
|
605
|
+
this.sovads._trackEvent('CLICK', this.currentAd.id, this.currentAd.campaignId, {
|
|
606
|
+
rendered: true,
|
|
607
|
+
viewportVisible: true,
|
|
608
|
+
renderTime: Date.now() - this.renderStartTime
|
|
609
|
+
});
|
|
610
|
+
// Log interaction
|
|
611
|
+
this.sovads.logInteraction('CLICK', {
|
|
612
|
+
adId: this.currentAd.id,
|
|
613
|
+
campaignId: this.currentAd.campaignId,
|
|
614
|
+
elementType: 'BANNER',
|
|
615
|
+
metadata: { renderTime: Date.now() - this.renderStartTime },
|
|
616
|
+
});
|
|
617
|
+
window.open(this.currentAd.targetUrl, '_blank', 'noopener,noreferrer');
|
|
618
|
+
});
|
|
619
|
+
// Add hover effect
|
|
620
|
+
adElement.addEventListener('mouseenter', () => {
|
|
621
|
+
adElement.style.transform = 'scale(1.02)';
|
|
622
|
+
});
|
|
623
|
+
adElement.addEventListener('mouseleave', () => {
|
|
624
|
+
adElement.style.transform = 'scale(1)';
|
|
625
|
+
});
|
|
626
|
+
adElement.appendChild(img);
|
|
627
|
+
container.appendChild(adElement);
|
|
628
|
+
}
|
|
629
|
+
finally {
|
|
630
|
+
this.isRendering = false;
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
// Popup Component
|
|
635
|
+
export class Popup {
|
|
636
|
+
constructor(sovads) {
|
|
637
|
+
this.currentAd = null;
|
|
638
|
+
this.popupElement = null;
|
|
639
|
+
this.isShowing = false;
|
|
640
|
+
this.sovads = sovads;
|
|
641
|
+
}
|
|
642
|
+
async show(consumerId, delay = 3000) {
|
|
643
|
+
// Prevent concurrent shows
|
|
644
|
+
if (this.isShowing) {
|
|
645
|
+
if (this.sovads.getConfig().debug) {
|
|
646
|
+
console.warn('Popup show already in progress');
|
|
647
|
+
}
|
|
648
|
+
return;
|
|
649
|
+
}
|
|
650
|
+
this.isShowing = true;
|
|
651
|
+
this.currentAd = await this.sovads.loadAd(consumerId);
|
|
652
|
+
if (!this.currentAd) {
|
|
653
|
+
console.log('No popup ad available');
|
|
654
|
+
this.isShowing = false;
|
|
655
|
+
return;
|
|
656
|
+
}
|
|
657
|
+
// Show popup after delay
|
|
658
|
+
setTimeout(() => {
|
|
659
|
+
this.renderPopup();
|
|
660
|
+
this.isShowing = false;
|
|
661
|
+
}, delay);
|
|
662
|
+
}
|
|
663
|
+
renderPopup() {
|
|
664
|
+
if (!this.currentAd)
|
|
665
|
+
return;
|
|
666
|
+
// Track impression immediately when popup is rendered (not waiting for image load)
|
|
667
|
+
// This ensures impression is tracked even if user closes popup quickly
|
|
668
|
+
const renderStartTime = Date.now();
|
|
669
|
+
this.sovads._trackEvent('IMPRESSION', this.currentAd.id, this.currentAd.campaignId, {
|
|
670
|
+
rendered: true,
|
|
671
|
+
viewportVisible: true,
|
|
672
|
+
renderTime: 0 // Will be updated when image loads
|
|
673
|
+
});
|
|
674
|
+
// Log interaction
|
|
675
|
+
this.sovads.logInteraction('IMPRESSION', {
|
|
676
|
+
adId: this.currentAd.id,
|
|
677
|
+
campaignId: this.currentAd.campaignId,
|
|
678
|
+
elementType: 'POPUP',
|
|
679
|
+
metadata: { renderTime: 0 },
|
|
680
|
+
});
|
|
681
|
+
// Create overlay
|
|
682
|
+
const overlay = document.createElement('div');
|
|
683
|
+
overlay.className = 'sovads-popup-overlay';
|
|
684
|
+
overlay.style.cssText = `
|
|
685
|
+
position: fixed;
|
|
686
|
+
top: 0;
|
|
687
|
+
left: 0;
|
|
688
|
+
width: 100%;
|
|
689
|
+
height: 100%;
|
|
690
|
+
background: rgba(0, 0, 0, 0.5);
|
|
691
|
+
z-index: 10000;
|
|
692
|
+
display: flex;
|
|
693
|
+
align-items: center;
|
|
694
|
+
justify-content: center;
|
|
695
|
+
`;
|
|
696
|
+
// Create popup
|
|
697
|
+
this.popupElement = document.createElement('div');
|
|
698
|
+
this.popupElement.style.cssText = `
|
|
699
|
+
background: white;
|
|
700
|
+
border-radius: 12px;
|
|
701
|
+
padding: 20px;
|
|
702
|
+
max-width: 400px;
|
|
703
|
+
position: relative;
|
|
704
|
+
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.3);
|
|
705
|
+
`;
|
|
706
|
+
// Close button
|
|
707
|
+
const closeBtn = document.createElement('button');
|
|
708
|
+
closeBtn.innerHTML = '×';
|
|
709
|
+
closeBtn.style.cssText = `
|
|
710
|
+
position: absolute;
|
|
711
|
+
top: 10px;
|
|
712
|
+
right: 15px;
|
|
713
|
+
background: none;
|
|
714
|
+
border: none;
|
|
715
|
+
font-size: 24px;
|
|
716
|
+
cursor: pointer;
|
|
717
|
+
color: #666;
|
|
718
|
+
`;
|
|
719
|
+
closeBtn.addEventListener('click', () => {
|
|
720
|
+
this.hide();
|
|
721
|
+
});
|
|
722
|
+
// Ad image
|
|
723
|
+
const img = document.createElement('img');
|
|
724
|
+
img.src = this.currentAd.bannerUrl;
|
|
725
|
+
img.alt = this.currentAd.description;
|
|
726
|
+
img.style.cssText = 'width: 100%; height: auto; border-radius: 8px; cursor: pointer;';
|
|
727
|
+
// Image load tracking (impression already tracked above)
|
|
728
|
+
img.onload = () => {
|
|
729
|
+
const renderTime = Date.now() - renderStartTime;
|
|
730
|
+
if (this.sovads.getConfig().debug) {
|
|
731
|
+
console.log(`Popup ad image loaded in ${renderTime}ms`);
|
|
732
|
+
}
|
|
733
|
+
};
|
|
734
|
+
// Handle image load errors - still track impression for popup
|
|
735
|
+
img.onerror = () => {
|
|
736
|
+
if (this.sovads.getConfig().debug) {
|
|
737
|
+
console.warn(`Failed to load popup ad image: ${this.currentAd.bannerUrl}`);
|
|
738
|
+
}
|
|
739
|
+
// Popup is visible even if image fails, so track impression
|
|
740
|
+
const renderTime = Date.now() - renderStartTime;
|
|
741
|
+
this.sovads._trackEvent('IMPRESSION', this.currentAd.id, this.currentAd.campaignId, {
|
|
742
|
+
rendered: false,
|
|
743
|
+
viewportVisible: true,
|
|
744
|
+
renderTime
|
|
745
|
+
});
|
|
746
|
+
};
|
|
747
|
+
img.addEventListener('click', () => {
|
|
748
|
+
this.sovads._trackEvent('CLICK', this.currentAd.id, this.currentAd.campaignId, {
|
|
749
|
+
rendered: true,
|
|
750
|
+
viewportVisible: true,
|
|
751
|
+
renderTime: Date.now() - renderStartTime
|
|
752
|
+
});
|
|
753
|
+
// Log interaction
|
|
754
|
+
this.sovads.logInteraction('CLICK', {
|
|
755
|
+
adId: this.currentAd.id,
|
|
756
|
+
campaignId: this.currentAd.campaignId,
|
|
757
|
+
elementType: 'POPUP',
|
|
758
|
+
metadata: { renderTime: Date.now() - renderStartTime },
|
|
759
|
+
});
|
|
760
|
+
window.open(this.currentAd.targetUrl, '_blank', 'noopener,noreferrer');
|
|
761
|
+
this.hide();
|
|
762
|
+
});
|
|
763
|
+
this.popupElement.appendChild(closeBtn);
|
|
764
|
+
this.popupElement.appendChild(img);
|
|
765
|
+
overlay.appendChild(this.popupElement);
|
|
766
|
+
document.body.appendChild(overlay);
|
|
767
|
+
// Auto close after 10 seconds
|
|
768
|
+
setTimeout(() => {
|
|
769
|
+
this.hide();
|
|
770
|
+
}, 10000);
|
|
771
|
+
}
|
|
772
|
+
hide() {
|
|
773
|
+
const overlay = document.querySelector('.sovads-popup-overlay');
|
|
774
|
+
if (overlay) {
|
|
775
|
+
overlay.remove();
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
}
|
|
779
|
+
// Sidebar Component
|
|
780
|
+
export class Sidebar {
|
|
781
|
+
constructor(sovads, containerId) {
|
|
782
|
+
this.currentAd = null;
|
|
783
|
+
this.renderStartTime = 0;
|
|
784
|
+
this.hasTrackedImpression = false;
|
|
785
|
+
this.isRendering = false;
|
|
786
|
+
this.sovads = sovads;
|
|
787
|
+
this.containerId = containerId;
|
|
788
|
+
}
|
|
789
|
+
async render(consumerId) {
|
|
790
|
+
// Prevent concurrent renders
|
|
791
|
+
if (this.isRendering) {
|
|
792
|
+
if (this.sovads.getConfig().debug) {
|
|
793
|
+
console.warn(`Sidebar render already in progress for ${this.containerId}`);
|
|
794
|
+
}
|
|
795
|
+
return;
|
|
796
|
+
}
|
|
797
|
+
this.isRendering = true;
|
|
798
|
+
try {
|
|
799
|
+
const container = document.getElementById(this.containerId);
|
|
800
|
+
if (!container) {
|
|
801
|
+
console.error(`Container with id "${this.containerId}" not found`);
|
|
802
|
+
this.isRendering = false;
|
|
803
|
+
return;
|
|
804
|
+
}
|
|
805
|
+
this.renderStartTime = Date.now();
|
|
806
|
+
this.currentAd = await this.sovads.loadAd(consumerId);
|
|
807
|
+
if (!this.currentAd) {
|
|
808
|
+
container.innerHTML = '<div class="sovads-no-ad">No ads available</div>';
|
|
809
|
+
this.isRendering = false;
|
|
810
|
+
return;
|
|
811
|
+
}
|
|
812
|
+
const adElement = document.createElement('div');
|
|
813
|
+
adElement.className = 'sovads-sidebar';
|
|
814
|
+
adElement.setAttribute('data-ad-id', this.currentAd.id);
|
|
815
|
+
adElement.style.cssText = `
|
|
816
|
+
background: #f8f9fa;
|
|
817
|
+
border: 1px solid #e9ecef;
|
|
818
|
+
border-radius: 8px;
|
|
819
|
+
padding: 15px;
|
|
820
|
+
margin-bottom: 15px;
|
|
821
|
+
cursor: pointer;
|
|
822
|
+
transition: all 0.2s ease;
|
|
823
|
+
`;
|
|
824
|
+
const img = document.createElement('img');
|
|
825
|
+
img.src = this.currentAd.bannerUrl;
|
|
826
|
+
img.alt = this.currentAd.description;
|
|
827
|
+
img.style.cssText = 'width: 100%; height: auto; display: block; border-radius: 4px;';
|
|
828
|
+
// Track when image loads (render verification)
|
|
829
|
+
img.onload = () => {
|
|
830
|
+
const renderTime = Date.now() - this.renderStartTime;
|
|
831
|
+
const renderInfo = {
|
|
832
|
+
rendered: true,
|
|
833
|
+
viewportVisible: false,
|
|
834
|
+
renderTime
|
|
835
|
+
};
|
|
836
|
+
// Setup IntersectionObserver to verify ad is visible
|
|
837
|
+
this.sovads.setupRenderObserver(adElement, this.currentAd.id, (isVisible) => {
|
|
838
|
+
renderInfo.viewportVisible = isVisible;
|
|
839
|
+
// Track impression only once when ad becomes visible
|
|
840
|
+
if (isVisible && !this.hasTrackedImpression) {
|
|
841
|
+
this.hasTrackedImpression = true;
|
|
842
|
+
this.sovads._trackEvent('IMPRESSION', this.currentAd.id, this.currentAd.campaignId, renderInfo);
|
|
843
|
+
}
|
|
844
|
+
});
|
|
845
|
+
};
|
|
846
|
+
// Handle image load errors - still track impression if element is visible
|
|
847
|
+
img.onerror = () => {
|
|
848
|
+
if (this.sovads.getConfig().debug) {
|
|
849
|
+
console.warn(`Failed to load sidebar ad image: ${this.currentAd.bannerUrl}`);
|
|
850
|
+
}
|
|
851
|
+
// Still set up observer in case element becomes visible (for broken image tracking)
|
|
852
|
+
const renderInfo = {
|
|
853
|
+
rendered: false,
|
|
854
|
+
viewportVisible: false,
|
|
855
|
+
renderTime: Date.now() - this.renderStartTime
|
|
856
|
+
};
|
|
857
|
+
this.sovads.setupRenderObserver(adElement, this.currentAd.id, (isVisible) => {
|
|
858
|
+
renderInfo.viewportVisible = isVisible;
|
|
859
|
+
// Track impression even with broken image if visible
|
|
860
|
+
if (isVisible && !this.hasTrackedImpression) {
|
|
861
|
+
this.hasTrackedImpression = true;
|
|
862
|
+
this.sovads._trackEvent('IMPRESSION', this.currentAd.id, this.currentAd.campaignId, renderInfo);
|
|
863
|
+
}
|
|
864
|
+
});
|
|
865
|
+
};
|
|
866
|
+
// Add click handler
|
|
867
|
+
adElement.addEventListener('click', () => {
|
|
868
|
+
this.sovads._trackEvent('CLICK', this.currentAd.id, this.currentAd.campaignId, {
|
|
869
|
+
rendered: true,
|
|
870
|
+
viewportVisible: true,
|
|
871
|
+
renderTime: Date.now() - this.renderStartTime
|
|
872
|
+
});
|
|
873
|
+
// Log interaction
|
|
874
|
+
this.sovads.logInteraction('CLICK', {
|
|
875
|
+
adId: this.currentAd.id,
|
|
876
|
+
campaignId: this.currentAd.campaignId,
|
|
877
|
+
elementType: 'SIDEBAR',
|
|
878
|
+
metadata: { renderTime: Date.now() - this.renderStartTime },
|
|
879
|
+
});
|
|
880
|
+
window.open(this.currentAd.targetUrl, '_blank', 'noopener,noreferrer');
|
|
881
|
+
});
|
|
882
|
+
// Add hover effect
|
|
883
|
+
adElement.addEventListener('mouseenter', () => {
|
|
884
|
+
adElement.style.background = '#e9ecef';
|
|
885
|
+
adElement.style.transform = 'translateY(-2px)';
|
|
886
|
+
});
|
|
887
|
+
adElement.addEventListener('mouseleave', () => {
|
|
888
|
+
adElement.style.background = '#f8f9fa';
|
|
889
|
+
adElement.style.transform = 'translateY(0)';
|
|
890
|
+
});
|
|
891
|
+
adElement.appendChild(img);
|
|
892
|
+
container.appendChild(adElement);
|
|
893
|
+
}
|
|
894
|
+
finally {
|
|
895
|
+
this.isRendering = false;
|
|
896
|
+
}
|
|
897
|
+
}
|
|
898
|
+
}
|
|
899
|
+
// Export main SovAds class
|
|
900
|
+
export { SovAds };
|
|
901
|
+
// Default export for easy importing
|
|
902
|
+
export default SovAds;
|
|
903
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,sEAAsE;AAiCtE,MAAM,MAAM;IAQV,YAAY,SAAuB,EAAE;QAL7B,eAAU,GAAqB,IAAI,GAAG,EAAE,CAAA;QACxC,WAAM,GAAkB,IAAI,CAAA;QAC5B,oBAAe,GAAsC,IAAI,GAAG,EAAE,CAAA;QAC9D,wBAAmB,GAAY,IAAI,CAAA;QAGzC,IAAI,CAAC,MAAM,GAAG;YACZ,MAAM,EAAE,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,KAAK,WAAW;gBAC/E,CAAC,CAAC,uBAAuB;gBACzB,CAAC,CAAC,yBAAyB;YAC7B,KAAK,EAAE,KAAK;YACZ,GAAG,MAAM;SACV,CAAA;QAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAA;QAE7C,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QACrD,CAAC;IACH,CAAC;IAEO,mBAAmB;QACzB,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;QAC/C,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QACnC,GAAG,EAAE,QAAQ,CAAC,oBAAoB,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QAE3C,MAAM,WAAW,GAAG;YAClB,SAAS,CAAC,SAAS;YACnB,SAAS,CAAC,QAAQ;YAClB,MAAM,CAAC,KAAK,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM;YAClC,IAAI,IAAI,EAAE,CAAC,iBAAiB,EAAE;YAC9B,MAAM,CAAC,SAAS,EAAE;SACnB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAEX,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAC3C,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC,MAAM,CAAA;QACpB,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;YAChC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;YACvD,CAAC;YACD,OAAO,IAAI,CAAC,MAAM,CAAA;QACpB,CAAC;QAED,IAAI,CAAC;YACH,gDAAgD;YAChD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAA;YACvC,MAAM,OAAO,GAAG;gBACd,MAAM;gBACN,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,SAAS,EAAE,SAAS,CAAC,SAAS;gBAC9B,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;gBAC7B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAA;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YAC5B,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,mBAAmB,CAAA;YACzD,uEAAuE;YACvE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE;gBACnD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;aAC9B,CAAC,CAAA;YACF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAA;YAEvC,kBAAkB;YAClB,MAAM,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE;gBACjC,IAAI,EAAE,aAAa;gBACnB,QAAQ,EAAE,mBAAmB;gBAC7B,MAAM,EAAE,MAAM;gBACd,MAAM;gBACN,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;gBAC7B,SAAS,EAAE,SAAS,CAAC,SAAS;gBAC9B,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,WAAW,EAAE,OAAO;gBACpB,cAAc,EAAE,QAAQ,CAAC,MAAM;gBAC/B,QAAQ;aACT,CAAC,CAAA;YAEF,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAChB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;gBAClC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;oBAChB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;oBAEjC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;wBACtB,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;oBAC9D,CAAC;oBAED,OAAO,IAAI,CAAC,MAAM,CAAA;gBACpB,CAAC;YACH,CAAC;YAED,gEAAgE;YAChE,uDAAuD;YACvD,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,KAAK,WAAW,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,KAAK,WAAW,CAAA;YACxG,IAAI,WAAW,EAAE,CAAC;gBAChB,IAAI,CAAC,MAAM,GAAG,QAAQ,IAAI,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAA;gBACpD,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;oBACtB,OAAO,CAAC,GAAG,CAAC,wCAAwC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;gBACpE,CAAC;gBACD,OAAO,IAAI,CAAC,MAAM,CAAA;YACpB,CAAC;iBAAM,CAAC;gBACN,gEAAgE;gBAChE,IAAI,CAAC,MAAM,GAAG,QAAQ,IAAI,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAA;gBAClE,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;oBACtB,OAAO,CAAC,IAAI,CAAC,iDAAiD,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;gBAC9E,CAAC;gBACD,OAAO,IAAI,CAAC,MAAM,CAAA;YACpB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBACtB,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAA;YAClD,CAAC;YAED,yCAAyC;YACzC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAA;YACzC,MAAM,WAAW,GAAG,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,WAAW,CAAA;YACxE,IAAI,WAAW,EAAE,CAAC;gBAChB,IAAI,CAAC,MAAM,GAAG,QAAQ,IAAI,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAA;YACxD,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,GAAG,QAAQ,IAAI,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAA;YACtE,CAAC;YACD,OAAO,IAAI,CAAC,MAAM,CAAA;QACpB,CAAC;IACH,CAAC;IAED;;;;OAIG;IACI,mBAAmB,CAAC,OAAoB,EAAE,IAAY,EAAE,QAAsC;QACnG,oCAAoC;QACpC,MAAM,gBAAgB,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACvD,IAAI,gBAAgB,EAAE,CAAC;YACrB,gBAAgB,CAAC,UAAU,EAAE,CAAA;QAC/B,CAAC;QAED,6CAA6C;QAC7C,IAAI,OAAO,oBAAoB,KAAK,WAAW,EAAE,CAAC;YAChD,MAAM,QAAQ,GAAG,IAAI,oBAAoB,CACvC,CAAC,OAAO,EAAE,EAAE;gBACV,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;oBACxB,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,iBAAiB,GAAG,GAAG,CAAA;oBACvE,QAAQ,CAAC,SAAS,CAAC,CAAA;oBAEnB,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;wBACtB,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,cAAc,EAAE;4BACpC,cAAc,EAAE,KAAK,CAAC,cAAc;4BACpC,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;4BAC1C,SAAS;yBACV,CAAC,CAAA;oBACJ,CAAC;gBACH,CAAC,CAAC,CAAA;YACJ,CAAC,EACD;gBACE,SAAS,EAAE,CAAC,GAAG,CAAC,EAAE,uBAAuB;gBACzC,UAAU,EAAE,KAAK;aAClB,CACF,CAAA;YAED,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;YACzB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;QAC1C,CAAC;aAAM,CAAC;YACN,uDAAuD;YACvD,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBACtB,OAAO,CAAC,IAAI,CAAC,6DAA6D,IAAI,EAAE,CAAC,CAAA;YACnF,CAAC;YAED,MAAM,eAAe,GAAG,GAAG,EAAE;gBAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAA;gBAC5C,MAAM,YAAY,GAAG,MAAM,CAAC,WAAW,IAAI,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAA;gBAChF,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,IAAI,QAAQ,CAAC,eAAe,CAAC,WAAW,CAAA;gBAE7E,2DAA2D;gBAC3D,MAAM,YAAY,GAAG,CACnB,IAAI,CAAC,GAAG,GAAG,YAAY;oBACvB,IAAI,CAAC,MAAM,GAAG,CAAC;oBACf,IAAI,CAAC,IAAI,GAAG,WAAW;oBACvB,IAAI,CAAC,KAAK,GAAG,CAAC,CACf,CAAA;gBAED,IAAI,YAAY,EAAE,CAAC;oBACjB,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;oBACjF,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;oBAC/E,MAAM,WAAW,GAAG,aAAa,GAAG,YAAY,CAAA;oBAChD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAA;oBAC1C,MAAM,iBAAiB,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;oBACrE,MAAM,SAAS,GAAG,iBAAiB,IAAI,GAAG,CAAA;oBAE1C,QAAQ,CAAC,SAAS,CAAC,CAAA;gBACrB,CAAC;qBAAM,CAAC;oBACN,QAAQ,CAAC,KAAK,CAAC,CAAA;gBACjB,CAAC;YACH,CAAC,CAAA;YAED,yCAAyC;YACzC,eAAe,EAAE,CAAA;YACjB,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,eAAe,EAAE,CAAA;YAC7C,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,eAAe,EAAE,CAAA;YAE7C,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;YACnE,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;YAEnE,yBAAyB;YACzB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE;gBAC7B,UAAU,EAAE,GAAG,EAAE;oBACf,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAA;oBACnD,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAA;gBACrD,CAAC;aACK,CAAC,CAAA;QACX,CAAC;IACH,CAAC;IAED;;OAEG;IACK,iBAAiB;QACvB,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;YAC7B,SAAS,EAAE,SAAS,CAAC,SAAS;YAC9B,QAAQ,EAAE,SAAS,CAAC,QAAQ;YAC5B,WAAW,EAAE,MAAM,CAAC,KAAK;YACzB,YAAY,EAAE,MAAM,CAAC,MAAM;YAC3B,aAAa,EAAE,MAAM,CAAC,UAAU;YAChC,cAAc,EAAE,MAAM,CAAC,WAAW;YAClC,cAAc,EAAE,IAAI,IAAI,EAAE,CAAC,iBAAiB,EAAE;YAC9C,QAAQ,EAAE,QAAQ,CAAC,QAAQ,IAAI,EAAE;YACjC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAA;IACH,CAAC;IAED;;OAEG;IACK,UAAU,CAAC,GAAW;QAC5B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;YAC3B,OAAO,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAA;QACpE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,cAAc,CAC1B,GAAW,EACX,UAAuB,EAAE,EACzB,cAAsB,CAAC;QAEvB,IAAI,SAAS,GAAiB,IAAI,CAAA;QAElC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;YACxD,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;gBAC1C,IAAI,QAAQ,CAAC,EAAE,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;oBAC3C,OAAO,QAAQ,CAAA;gBACjB,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAA;YACpE,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,SAAS,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;gBACrE,IAAI,OAAO,GAAG,WAAW,EAAE,CAAC;oBAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,GAAG,GAAG,CAAA,CAAC,sBAAsB;oBACnE,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;wBACtB,OAAO,CAAC,IAAI,CAAC,iBAAiB,OAAO,wBAAwB,KAAK,OAAO,CAAC,CAAA;oBAC5E,CAAC;oBACD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAA;gBAC1D,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,SAAS,IAAI,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAA;IAC5D,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,UAAmB;QAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAC5B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAA;YAExC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;gBACjC,MAAM;gBACN,GAAG,CAAC,UAAU,IAAI,EAAE,UAAU,EAAE,CAAC;aAClC,CAAC,CAAA;YAEF,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,YAAY,MAAM,EAAE,CAAA;YAC1D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAA;YACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAA;YAEvC,kBAAkB;YAClB,MAAM,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE;gBACjC,IAAI,EAAE,YAAY;gBAClB,QAAQ,EAAE,UAAU;gBACpB,MAAM,EAAE,KAAK;gBACb,MAAM;gBACN,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ;gBAChC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;gBAC7B,SAAS,EAAE,SAAS,CAAC,SAAS;gBAC9B,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,WAAW,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE;gBACnC,cAAc,EAAE,QAAQ,CAAC,MAAM;gBAC/B,QAAQ;aACT,CAAC,CAAA;YAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,sBAAsB,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAA;YAC9D,CAAC;YAED,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;YAEhC,mBAAmB;YACnB,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC;gBAC1C,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;oBACtB,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAA;gBAChD,CAAC;gBACD,OAAO,IAAI,CAAA;YACb,CAAC;YAED,gBAAgB;YAChB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC;gBACnC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;oBACtB,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,EAAE,CAAC,SAAS,CAAC,CAAA;gBACnD,CAAC;gBACD,OAAO,IAAI,CAAA;YACb,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC;gBACnC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;oBACtB,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,EAAE,CAAC,SAAS,CAAC,CAAA;gBACnD,CAAC;gBACD,OAAO,IAAI,CAAA;YACb,CAAC;YAED,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC,CAAA;YAC/B,CAAC;YAED,kBAAkB;YAClB,MAAM,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE;gBACrC,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,EAAE,CAAC,EAAE;gBACX,UAAU,EAAE,EAAE,CAAC,UAAU;gBACzB,MAAM;gBACN,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;aAC9B,CAAC,CAAA;YAEF,OAAO,EAAE,CAAA;QACX,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAA;YACvC,MAAM,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE;gBACjC,IAAI,EAAE,YAAY;gBAClB,QAAQ,EAAE,UAAU;gBACpB,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ;gBAChC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;gBAC7B,SAAS,EAAE,SAAS,CAAC,SAAS;gBAC9B,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC7D,QAAQ;aACT,CAAC,CAAA;YAEF,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBACtB,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAA;YAC3C,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,mBAAmB,CAC/B,IAA4B,EAC5B,IAAY,EACZ,UAAkB,EAClB,UAA2F,EAC3F,OAAe,EACf,cAAsB,CAAC;QAEvB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAA;YACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAA;YAEzC,MAAM,OAAO,GAAoB;gBAC/B,IAAI;gBACJ,UAAU;gBACV,IAAI;gBACJ,MAAM;gBACN,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;gBAClC,QAAQ,EAAE,UAAU,EAAE,QAAQ,IAAI,IAAI;gBACtC,eAAe,EAAE,UAAU,EAAE,eAAe,IAAI,KAAK;gBACrD,UAAU,EAAE,UAAU,EAAE,UAAU,IAAI,IAAI,CAAC,GAAG,EAAE;gBAChD,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,SAAS,EAAE,QAAQ,CAAC,SAAS;aAC9B,CAAA;YAED,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,qBAAqB,CAAA;YAC7D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE;gBACvC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;gBAC7B,SAAS,EAAE,IAAI,CAAC,6BAA6B;aAC9C,CAAC,CAAA;YAEF,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAChB,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;oBACtB,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,6BAA6B,OAAO,GAAG,EAAE,OAAO,CAAC,CAAA;gBACtF,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAA;YACpE,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,OAAO,GAAG,WAAW,EAAE,CAAC;gBAC1B,2CAA2C;gBAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,GAAG,GAAG,CAAA;gBAC5C,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;oBACtB,OAAO,CAAC,IAAI,CAAC,oBAAoB,IAAI,mBAAmB,OAAO,GAAG,CAAC,IAAI,WAAW,WAAW,KAAK,IAAI,CAAC,CAAA;gBACzG,CAAC;gBACD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAA;gBACxD,OAAO,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,GAAG,CAAC,EAAE,WAAW,CAAC,CAAA;YAC/F,CAAC;iBAAM,CAAC;gBACN,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;oBACtB,OAAO,CAAC,KAAK,CAAC,2BAA2B,IAAI,gBAAgB,WAAW,YAAY,EAAE,KAAK,CAAC,CAAA;gBAC9F,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,UAAU,CACtB,IAA4B,EAC5B,IAAY,EACZ,UAAkB,EAClB,UAAgF;QAEhF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAA;YACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAA;YAEzC,MAAM,OAAO,GAAoB;gBAC/B,IAAI;gBACJ,UAAU;gBACV,IAAI;gBACJ,MAAM;gBACN,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;gBAClC,QAAQ,EAAE,UAAU,EAAE,QAAQ,IAAI,IAAI;gBACtC,eAAe,EAAE,UAAU,EAAE,eAAe,IAAI,KAAK;gBACrD,UAAU,EAAE,UAAU,EAAE,UAAU,IAAI,IAAI,CAAC,GAAG,EAAE;gBAChD,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,SAAS,EAAE,QAAQ,CAAC,SAAS;aAC9B,CAAA;YAED,yEAAyE;YACzE,iEAAiE;YACjE,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;gBACzB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE;oBAC/C,IAAI,EAAE,kBAAkB;iBACzB,CAAC,CAAA;gBAEF,6DAA6D;gBAC7D,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,qBAAqB,CAAA;gBAC7D,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;gBAEnD,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,8CAA8C;oBAC9C,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;wBACtB,OAAO,CAAC,IAAI,CAAC,6BAA6B,IAAI,yBAAyB,CAAC,CAAA;oBAC1E,CAAC;oBACD,MAAM,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC,CAAA;gBACvE,CAAC;qBAAM,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;oBAC7B,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,mBAAmB,EAAE;wBACtD,IAAI;wBACJ,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,EAAE;qBAClF,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,uCAAuC;gBACvC,MAAM,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC,CAAA;YACvE,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBACtB,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAA;YAC/C,CAAC;QACH,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,YAAY,CAAC,WAAmB,EAAE,SAAc;QAC9C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,CAAA;IAC7C,CAAC;IAED,YAAY,CAAC,WAAmB;QAC9B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IACzC,CAAC;IAED,eAAe,CAAC,WAAmB;QACjC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;IACrC,CAAC;IAED,uDAAuD;IACvD,sEAAsE;IACtE,mFAAmF;IAC5E,WAAW,CAChB,IAA4B,EAC5B,IAAY,EACZ,UAAkB,EAClB,UAAgF;QAEhF,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;IAC5D,CAAC;IAED;;OAEG;IACI,SAAS;QACd,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,cAAc,CAAC,IAAY,EAAE,IAAS;QACjD,MAAM,IAAI,CAAC,QAAQ,CAAC,iBAAiB,EAAE;YACrC,IAAI;YACJ,GAAG,IAAI;YACP,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;SAC9B,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,QAAQ,CAAC,IAAuC,EAAE,IAAS;QACvE,IAAI,CAAC,IAAI,CAAC,mBAAmB;YAAE,OAAM;QAErC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,gBAAgB,CAAA;YACpD,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;YAE9B,0CAA0C;YAC1C,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;gBACzB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAA;gBAC9E,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YACpC,CAAC;iBAAM,CAAC;gBACN,sCAAsC;gBACtC,KAAK,CAAC,MAAM,EAAE;oBACZ,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;oBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;oBAC7B,SAAS,EAAE,IAAI;iBAChB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;oBACZ,wDAAwD;gBAC1D,CAAC,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,wDAAwD;QAC1D,CAAC;IACH,CAAC;IAED;;OAEG;IACI,OAAO;QACZ,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAA;QACjE,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAA;IAC9B,CAAC;CACF;AAED,mBAAmB;AACnB,MAAM,OAAO,MAAM;IAQjB,YAAY,MAAc,EAAE,WAAmB;QALvC,cAAS,GAAuB,IAAI,CAAA;QACpC,oBAAe,GAAW,CAAC,CAAA;QAC3B,yBAAoB,GAAY,KAAK,CAAA;QACrC,gBAAW,GAAY,KAAK,CAAA;QAGlC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;IAChC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,UAAmB;QAC9B,6BAA6B;QAC7B,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC;gBAClC,OAAO,CAAC,IAAI,CAAC,yCAAyC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;YAC3E,CAAC;YACD,OAAM;QACR,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;QACvB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YAC3D,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,sBAAsB,IAAI,CAAC,WAAW,aAAa,CAAC,CAAA;gBAClE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAA;gBACxB,OAAM;YACR,CAAC;YAED,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YACjC,IAAI,CAAC,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;YAErD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACpB,SAAS,CAAC,SAAS,GAAG,kDAAkD,CAAA;gBACxE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAA;gBACxB,OAAM;YACR,CAAC;YAED,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;YAC/C,SAAS,CAAC,SAAS,GAAG,eAAe,CAAA;YACvC,SAAS,CAAC,YAAY,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;YACvD,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;KAMzB,CAAA;YAEC,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;YACzC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAA;YAClC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAA;YACpC,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,4CAA4C,CAAA;YAEhE,+CAA+C;YAC/C,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE;gBAChB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe,CAAA;gBACpD,MAAM,UAAU,GAAG;oBACjB,QAAQ,EAAE,IAAI;oBACd,eAAe,EAAE,KAAK;oBACtB,UAAU;iBACX,CAAA;gBAED,qDAAqD;gBACrD,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAU,CAAC,EAAE,EAAE,CAAC,SAAS,EAAE,EAAE;oBAC3E,UAAU,CAAC,eAAe,GAAG,SAAS,CAAA;oBAEtC,qDAAqD;oBACrD,IAAI,SAAS,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;wBAC5C,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAA;wBAChC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,IAAI,CAAC,SAAU,CAAC,EAAE,EAAE,IAAI,CAAC,SAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;oBACnG,CAAC;gBACH,CAAC,CAAC,CAAA;YACJ,CAAC,CAAA;YAED,0EAA0E;YAC1E,GAAG,CAAC,OAAO,GAAG,GAAG,EAAE;gBACjB,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC;oBAClC,OAAO,CAAC,IAAI,CAAC,4BAA4B,IAAI,CAAC,SAAU,CAAC,SAAS,EAAE,CAAC,CAAA;gBACvE,CAAC;gBACD,oFAAoF;gBACpF,MAAM,UAAU,GAAG;oBACjB,QAAQ,EAAE,KAAK;oBACf,eAAe,EAAE,KAAK;oBACtB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe;iBAC9C,CAAA;gBACD,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAU,CAAC,EAAE,EAAE,CAAC,SAAS,EAAE,EAAE;oBAC3E,UAAU,CAAC,eAAe,GAAG,SAAS,CAAA;oBACtC,qDAAqD;oBACrD,IAAI,SAAS,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;wBAC5C,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAA;wBAChC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,IAAI,CAAC,SAAU,CAAC,EAAE,EAAE,IAAI,CAAC,SAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;oBACnG,CAAC;gBACH,CAAC,CAAC,CAAA;YACJ,CAAC,CAAA;YAED,oBAAoB;YACpB,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;gBACvC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,SAAU,CAAC,EAAE,EAAE,IAAI,CAAC,SAAU,CAAC,UAAU,EAAE;oBAC/E,QAAQ,EAAE,IAAI;oBACd,eAAe,EAAE,IAAI;oBACrB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe;iBAC9C,CAAC,CAAA;gBAEF,kBAAkB;gBAClB,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE;oBAClC,IAAI,EAAE,IAAI,CAAC,SAAU,CAAC,EAAE;oBACxB,UAAU,EAAE,IAAI,CAAC,SAAU,CAAC,UAAU;oBACtC,WAAW,EAAE,QAAQ;oBACrB,QAAQ,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE;iBAC5D,CAAC,CAAA;gBAEF,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAU,CAAC,SAAS,EAAE,QAAQ,EAAE,qBAAqB,CAAC,CAAA;YACzE,CAAC,CAAC,CAAA;YAEF,mBAAmB;YACnB,SAAS,CAAC,gBAAgB,CAAC,YAAY,EAAE,GAAG,EAAE;gBAC5C,SAAS,CAAC,KAAK,CAAC,SAAS,GAAG,aAAa,CAAA;YAC3C,CAAC,CAAC,CAAA;YAEF,SAAS,CAAC,gBAAgB,CAAC,YAAY,EAAE,GAAG,EAAE;gBAC5C,SAAS,CAAC,KAAK,CAAC,SAAS,GAAG,UAAU,CAAA;YACxC,CAAC,CAAC,CAAA;YAEF,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;YAC1B,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA;QAClC,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,WAAW,GAAG,KAAK,CAAA;QAC1B,CAAC;IACH,CAAC;CACF;AAED,kBAAkB;AAClB,MAAM,OAAO,KAAK;IAMhB,YAAY,MAAc;QAJlB,cAAS,GAAuB,IAAI,CAAA;QACpC,iBAAY,GAAuB,IAAI,CAAA;QACvC,cAAS,GAAY,KAAK,CAAA;QAGhC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,UAAmB,EAAE,QAAgB,IAAI;QAClD,2BAA2B;QAC3B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC;gBAClC,OAAO,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAA;YAChD,CAAC;YACD,OAAM;QACR,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;QACrB,IAAI,CAAC,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;QAErD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAA;YACpC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;YACtB,OAAM;QACR,CAAC;QAED,yBAAyB;QACzB,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,WAAW,EAAE,CAAA;YAClB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;QACxB,CAAC,EAAE,KAAK,CAAC,CAAA;IACX,CAAC;IAEO,WAAW;QACjB,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAM;QAE3B,mFAAmF;QACnF,uEAAuE;QACvE,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAClC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE;YAClF,QAAQ,EAAE,IAAI;YACd,eAAe,EAAE,IAAI;YACrB,UAAU,EAAE,CAAC,CAAC,mCAAmC;SAClD,CAAC,CAAA;QAEF,kBAAkB;QAClB,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,YAAY,EAAE;YACvC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE;YACvB,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU;YACrC,WAAW,EAAE,OAAO;YACpB,QAAQ,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE;SAC5B,CAAC,CAAA;QAEF,iBAAiB;QACjB,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;QAC7C,OAAO,CAAC,SAAS,GAAG,sBAAsB,CAAA;QAC1C,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;;;;;;KAWvB,CAAA;QAED,eAAe;QACf,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;QACjD,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;;KAOjC,CAAA;QAED,eAAe;QACf,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;QACjD,QAAQ,CAAC,SAAS,GAAG,GAAG,CAAA;QACxB,QAAQ,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;;;;KASxB,CAAA;QAED,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YACtC,IAAI,CAAC,IAAI,EAAE,CAAA;QACb,CAAC,CAAC,CAAA;QAEF,WAAW;QACX,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;QACzC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAA;QAClC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAA;QACpC,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,iEAAiE,CAAA;QAErF,yDAAyD;QACzD,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE;YAChB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,CAAA;YAC/C,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC;gBAClC,OAAO,CAAC,GAAG,CAAC,4BAA4B,UAAU,IAAI,CAAC,CAAA;YACzD,CAAC;QACH,CAAC,CAAA;QAED,8DAA8D;QAC9D,GAAG,CAAC,OAAO,GAAG,GAAG,EAAE;YACjB,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC;gBAClC,OAAO,CAAC,IAAI,CAAC,kCAAkC,IAAI,CAAC,SAAU,CAAC,SAAS,EAAE,CAAC,CAAA;YAC7E,CAAC;YACD,4DAA4D;YAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,CAAA;YAC/C,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,IAAI,CAAC,SAAU,CAAC,EAAE,EAAE,IAAI,CAAC,SAAU,CAAC,UAAU,EAAE;gBACpF,QAAQ,EAAE,KAAK;gBACf,eAAe,EAAE,IAAI;gBACrB,UAAU;aACX,CAAC,CAAA;QACJ,CAAC,CAAA;QAED,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YACjC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,SAAU,CAAC,EAAE,EAAE,IAAI,CAAC,SAAU,CAAC,UAAU,EAAE;gBAC/E,QAAQ,EAAE,IAAI;gBACd,eAAe,EAAE,IAAI;gBACrB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe;aACzC,CAAC,CAAA;YAEF,kBAAkB;YAClB,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE;gBAClC,IAAI,EAAE,IAAI,CAAC,SAAU,CAAC,EAAE;gBACxB,UAAU,EAAE,IAAI,CAAC,SAAU,CAAC,UAAU;gBACtC,WAAW,EAAE,OAAO;gBACpB,QAAQ,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,EAAE;aACvD,CAAC,CAAA;YAEF,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAU,CAAC,SAAS,EAAE,QAAQ,EAAE,qBAAqB,CAAC,CAAA;YACvE,IAAI,CAAC,IAAI,EAAE,CAAA;QACb,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;QACvC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;QAClC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QACtC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QAElC,8BAA8B;QAC9B,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,IAAI,EAAE,CAAA;QACb,CAAC,EAAE,KAAK,CAAC,CAAA;IACX,CAAC;IAED,IAAI;QACF,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,uBAAuB,CAAC,CAAA;QAC/D,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,MAAM,EAAE,CAAA;QAClB,CAAC;IACH,CAAC;CACF;AAED,oBAAoB;AACpB,MAAM,OAAO,OAAO;IAQlB,YAAY,MAAc,EAAE,WAAmB;QALvC,cAAS,GAAuB,IAAI,CAAA;QACpC,oBAAe,GAAW,CAAC,CAAA;QAC3B,yBAAoB,GAAY,KAAK,CAAA;QACrC,gBAAW,GAAY,KAAK,CAAA;QAGlC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;IAChC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,UAAmB;QAC9B,6BAA6B;QAC7B,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC;gBAClC,OAAO,CAAC,IAAI,CAAC,0CAA0C,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;YAC5E,CAAC;YACD,OAAM;QACR,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;QACvB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;YAC3D,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,sBAAsB,IAAI,CAAC,WAAW,aAAa,CAAC,CAAA;gBAClE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAA;gBACxB,OAAM;YACR,CAAC;YAED,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YACjC,IAAI,CAAC,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;YAErD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACpB,SAAS,CAAC,SAAS,GAAG,kDAAkD,CAAA;gBACxE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAA;gBACxB,OAAM;YACR,CAAC;YAED,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;YAC/C,SAAS,CAAC,SAAS,GAAG,gBAAgB,CAAA;YACxC,SAAS,CAAC,YAAY,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;YACvD,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG;;;;;;;;KAQzB,CAAA;YAEC,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;YACzC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAA;YAClC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAA;YACpC,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,gEAAgE,CAAA;YAEpF,+CAA+C;YAC/C,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE;gBAChB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe,CAAA;gBACpD,MAAM,UAAU,GAAG;oBACjB,QAAQ,EAAE,IAAI;oBACd,eAAe,EAAE,KAAK;oBACtB,UAAU;iBACX,CAAA;gBAED,qDAAqD;gBACrD,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAU,CAAC,EAAE,EAAE,CAAC,SAAS,EAAE,EAAE;oBAC3E,UAAU,CAAC,eAAe,GAAG,SAAS,CAAA;oBAEtC,qDAAqD;oBACrD,IAAI,SAAS,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;wBAC5C,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAA;wBAChC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,IAAI,CAAC,SAAU,CAAC,EAAE,EAAE,IAAI,CAAC,SAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;oBACnG,CAAC;gBACH,CAAC,CAAC,CAAA;YACJ,CAAC,CAAA;YAED,0EAA0E;YAC1E,GAAG,CAAC,OAAO,GAAG,GAAG,EAAE;gBACjB,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC;oBAClC,OAAO,CAAC,IAAI,CAAC,oCAAoC,IAAI,CAAC,SAAU,CAAC,SAAS,EAAE,CAAC,CAAA;gBAC/E,CAAC;gBACD,oFAAoF;gBACpF,MAAM,UAAU,GAAG;oBACjB,QAAQ,EAAE,KAAK;oBACf,eAAe,EAAE,KAAK;oBACtB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe;iBAC9C,CAAA;gBACD,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAU,CAAC,EAAE,EAAE,CAAC,SAAS,EAAE,EAAE;oBAC3E,UAAU,CAAC,eAAe,GAAG,SAAS,CAAA;oBACtC,qDAAqD;oBACrD,IAAI,SAAS,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;wBAC5C,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAA;wBAChC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,IAAI,CAAC,SAAU,CAAC,EAAE,EAAE,IAAI,CAAC,SAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;oBACnG,CAAC;gBACH,CAAC,CAAC,CAAA;YACJ,CAAC,CAAA;YAED,oBAAoB;YACpB,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;gBACvC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,SAAU,CAAC,EAAE,EAAE,IAAI,CAAC,SAAU,CAAC,UAAU,EAAE;oBAC/E,QAAQ,EAAE,IAAI;oBACd,eAAe,EAAE,IAAI;oBACrB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe;iBAC9C,CAAC,CAAA;gBAEF,kBAAkB;gBAClB,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE;oBAClC,IAAI,EAAE,IAAI,CAAC,SAAU,CAAC,EAAE;oBACxB,UAAU,EAAE,IAAI,CAAC,SAAU,CAAC,UAAU;oBACtC,WAAW,EAAE,SAAS;oBACtB,QAAQ,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE;iBAC5D,CAAC,CAAA;gBAEF,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAU,CAAC,SAAS,EAAE,QAAQ,EAAE,qBAAqB,CAAC,CAAA;YACzE,CAAC,CAAC,CAAA;YAEF,mBAAmB;YACnB,SAAS,CAAC,gBAAgB,CAAC,YAAY,EAAE,GAAG,EAAE;gBAC5C,SAAS,CAAC,KAAK,CAAC,UAAU,GAAG,SAAS,CAAA;gBACtC,SAAS,CAAC,KAAK,CAAC,SAAS,GAAG,kBAAkB,CAAA;YAChD,CAAC,CAAC,CAAA;YAEF,SAAS,CAAC,gBAAgB,CAAC,YAAY,EAAE,GAAG,EAAE;gBAC5C,SAAS,CAAC,KAAK,CAAC,UAAU,GAAG,SAAS,CAAA;gBACtC,SAAS,CAAC,KAAK,CAAC,SAAS,GAAG,eAAe,CAAA;YAC7C,CAAC,CAAC,CAAA;YAEF,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;YAC1B,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA;QAClC,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,WAAW,GAAG,KAAK,CAAA;QAC1B,CAAC;IACH,CAAC;CACF;AAED,2BAA2B;AAC3B,OAAO,EAAE,MAAM,EAAE,CAAA;AAEjB,oCAAoC;AACpC,eAAe,MAAM,CAAA"}
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "sovads-sdk",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "SovAds SDK for publisher integration - Modular ad network SDK with banner, popup, and sidebar components",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"module": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist",
|
|
10
|
+
"README.md"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "tsc",
|
|
14
|
+
"dev": "tsc --watch",
|
|
15
|
+
"prepublishOnly": "npm run build"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"sovads",
|
|
19
|
+
"advertising",
|
|
20
|
+
"sdk",
|
|
21
|
+
"crypto",
|
|
22
|
+
"ads",
|
|
23
|
+
"ad-network",
|
|
24
|
+
"publisher",
|
|
25
|
+
"banner",
|
|
26
|
+
"popup"
|
|
27
|
+
],
|
|
28
|
+
"author": "SovAds Team",
|
|
29
|
+
"license": "MIT",
|
|
30
|
+
"repository": {
|
|
31
|
+
"type": "git",
|
|
32
|
+
"url": "https://github.com/sovseas/sovads.git",
|
|
33
|
+
"directory": "sdk"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"typescript": "^5.0.0",
|
|
37
|
+
"@types/node": "^20.0.0"
|
|
38
|
+
},
|
|
39
|
+
"publishConfig": {
|
|
40
|
+
"access": "public"
|
|
41
|
+
}
|
|
42
|
+
}
|