@grainql/analytics-web 3.1.1 → 3.2.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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/attention-quality.ts", "../src/text-utils.ts", "../src/heatmap-tracking.ts", "../src/interaction-tracking.ts", "../src/section-tracking.ts", "../src/debug-agent.ts", "../src/index.ts", "../src/consent.ts", "../src/cookies.ts", "../src/activity.ts", "../src/heartbeat.ts", "../src/attribution.ts", "../src/countries.ts", "../src/page-tracking.ts", "../src/id-manager.ts"],
4
- "sourcesContent": ["/**\n * Attention Quality Manager for Grain Analytics\n * Enforces policies to ensure tracked data represents genuine user attention\n * \n * Policies:\n * 1. Page Visibility: Stop tracking when tab is hidden/backgrounded\n * 2. User Activity: Stop tracking when user is idle (no mouse/keyboard/touch)\n * 3. Section Duration Cap: Max attention per section before requiring transition\n * 4. Scroll Distance: Minimum scroll distance to count as meaningful engagement\n * \n * See: ATTENTION_QUALITY_POLICY.md for detailed policy documentation\n */\n\nimport type { ActivityDetector } from './activity';\n\nexport interface AttentionQualityOptions {\n /**\n * Maximum continuous attention duration per section (ms)\n * Default: 9000 (9 seconds)\n */\n maxSectionDuration?: number;\n\n /**\n * Minimum scroll distance to reset attention timer (px)\n * Default: 100\n */\n minScrollDistance?: number;\n\n /**\n * Idle threshold - stop tracking after this period of inactivity (ms)\n * Default: 30000 (30 seconds)\n */\n idleThreshold?: number;\n\n /**\n * Enable debug logging\n */\n debug?: boolean;\n}\n\ninterface SectionAttentionState {\n sectionName: string;\n currentDuration: number; // Cumulative duration in current attention block\n lastScrollPosition: number;\n lastResetTime: number;\n}\n\nconst DEFAULT_OPTIONS: Required<Omit<AttentionQualityOptions, 'debug'>> = {\n maxSectionDuration: 9000, // 9 seconds\n minScrollDistance: 100, // 100 pixels\n idleThreshold: 30000, // 30 seconds\n};\n\nexport class AttentionQualityManager {\n private options: Required<Omit<AttentionQualityOptions, 'debug'>> & { debug: boolean };\n private activityDetector: ActivityDetector;\n private isDestroyed = false;\n\n // Page visibility tracking\n private isPageVisible = true;\n private visibilityChangeHandler: (() => void) | null = null;\n\n // Section attention state\n private sectionStates = new Map<string, SectionAttentionState>();\n\n // Policies applied reasons (for debugging/traceability)\n private lastFilterReason: string | null = null;\n\n constructor(activityDetector: ActivityDetector, options: AttentionQualityOptions = {}) {\n this.activityDetector = activityDetector;\n this.options = {\n ...DEFAULT_OPTIONS,\n ...options,\n debug: options.debug ?? false,\n };\n\n this.setupPageVisibilityTracking();\n }\n\n /**\n * Setup page visibility tracking\n */\n private setupPageVisibilityTracking(): void {\n if (typeof document === 'undefined') return;\n\n this.isPageVisible = document.visibilityState === 'visible';\n\n this.visibilityChangeHandler = () => {\n const wasVisible = this.isPageVisible;\n this.isPageVisible = document.visibilityState === 'visible';\n\n if (!this.isPageVisible && wasVisible) {\n this.log('Page hidden - tracking paused');\n } else if (this.isPageVisible && !wasVisible) {\n this.log('Page visible - tracking resumed');\n // Reset all section states when page becomes visible again\n this.resetAllSections();\n }\n };\n\n document.addEventListener('visibilitychange', this.visibilityChangeHandler);\n }\n\n /**\n * Check if tracking should be allowed (global check)\n * Returns true if tracking is allowed, false if it should be paused\n */\n shouldTrack(): boolean {\n // Policy 1: Page Visibility\n if (!this.isPageVisible) {\n this.lastFilterReason = 'page_hidden';\n return false;\n }\n\n // Policy 2: User Activity\n if (!this.activityDetector.isActive(this.options.idleThreshold)) {\n this.lastFilterReason = 'user_idle';\n return false;\n }\n\n this.lastFilterReason = null;\n return true;\n }\n\n /**\n * Check if section view tracking should be allowed for a specific section\n * @param sectionName - Section identifier\n * @param currentScrollY - Current scroll position\n * @returns Object with shouldTrack boolean and optional reason\n */\n shouldTrackSection(sectionName: string, currentScrollY: number): {\n shouldTrack: boolean;\n reason?: string;\n resetAttention?: boolean;\n } {\n // First check global tracking state\n if (!this.shouldTrack()) {\n return {\n shouldTrack: false,\n reason: this.lastFilterReason || 'global_policy',\n };\n }\n\n // Get or create section state\n let state = this.sectionStates.get(sectionName);\n if (!state) {\n state = {\n sectionName,\n currentDuration: 0,\n lastScrollPosition: currentScrollY,\n lastResetTime: Date.now(),\n };\n this.sectionStates.set(sectionName, state);\n }\n\n // Policy 4: Scroll Distance - Check if user has scrolled enough to reset attention\n const scrollDistance = Math.abs(currentScrollY - state.lastScrollPosition);\n const hasScrolledEnough = scrollDistance >= this.options.minScrollDistance;\n\n if (hasScrolledEnough) {\n // Reset attention timer due to meaningful scroll\n this.log(`Section \"${sectionName}\": Attention reset due to ${Math.round(scrollDistance)}px scroll`);\n state.currentDuration = 0;\n state.lastScrollPosition = currentScrollY;\n state.lastResetTime = Date.now();\n return {\n shouldTrack: true,\n resetAttention: true,\n };\n }\n\n // Policy 3: Section Duration Cap\n if (state.currentDuration >= this.options.maxSectionDuration) {\n return {\n shouldTrack: false,\n reason: 'max_duration_reached',\n };\n }\n\n return {\n shouldTrack: true,\n };\n }\n\n /**\n * Update section duration (call this when tracking a section view event)\n * @param sectionName - Section identifier\n * @param durationMs - Duration to add to current attention block\n */\n updateSectionDuration(sectionName: string, durationMs: number): void {\n const state = this.sectionStates.get(sectionName);\n if (state) {\n state.currentDuration += durationMs;\n \n if (state.currentDuration >= this.options.maxSectionDuration) {\n this.log(`Section \"${sectionName}\": Max duration cap reached (${state.currentDuration}ms)`);\n }\n }\n }\n\n /**\n * Reset attention for a specific section (call when user navigates to different section)\n * @param sectionName - Section identifier\n */\n resetSection(sectionName: string): void {\n const state = this.sectionStates.get(sectionName);\n if (state) {\n this.log(`Section \"${sectionName}\": Attention reset (section exit)`);\n state.currentDuration = 0;\n state.lastResetTime = Date.now();\n }\n }\n\n /**\n * Reset all section attention states\n */\n resetAllSections(): void {\n this.log('Resetting all section attention states');\n for (const state of this.sectionStates.values()) {\n state.currentDuration = 0;\n state.lastResetTime = Date.now();\n }\n }\n\n /**\n * Get current attention state for a section (for debugging/monitoring)\n */\n getSectionState(sectionName: string): SectionAttentionState | undefined {\n return this.sectionStates.get(sectionName);\n }\n\n /**\n * Get reason why last tracking attempt was filtered\n */\n getLastFilterReason(): string | null {\n return this.lastFilterReason;\n }\n\n /**\n * Check if scroll tracking should be allowed\n * Similar to shouldTrack() but also checks scroll-specific conditions\n */\n shouldTrackScroll(previousScrollY: number, currentScrollY: number): {\n shouldTrack: boolean;\n reason?: string;\n } {\n // First check global tracking state\n if (!this.shouldTrack()) {\n return {\n shouldTrack: false,\n reason: this.lastFilterReason || 'global_policy',\n };\n }\n\n // Check if scroll is meaningful\n const scrollDistance = Math.abs(currentScrollY - previousScrollY);\n if (scrollDistance < 10) { // Minimum 10px to count as scroll\n return {\n shouldTrack: false,\n reason: 'scroll_too_small',\n };\n }\n\n return {\n shouldTrack: true,\n };\n }\n\n /**\n * Get all active policies as object (for monitoring/debugging)\n */\n getPolicies(): {\n maxSectionDuration: number;\n minScrollDistance: number;\n idleThreshold: number;\n } {\n return {\n maxSectionDuration: this.options.maxSectionDuration,\n minScrollDistance: this.options.minScrollDistance,\n idleThreshold: this.options.idleThreshold,\n };\n }\n\n /**\n * Get current tracking state (for monitoring/debugging)\n */\n getTrackingState(): {\n isPageVisible: boolean;\n isUserActive: boolean;\n timeSinceLastActivity: number;\n activeSections: number;\n } {\n return {\n isPageVisible: this.isPageVisible,\n isUserActive: this.activityDetector.isActive(this.options.idleThreshold),\n timeSinceLastActivity: this.activityDetector.getTimeSinceLastActivity(),\n activeSections: this.sectionStates.size,\n };\n }\n\n /**\n * Log debug messages\n */\n private log(...args: unknown[]): void {\n if (this.options.debug) {\n console.log('[AttentionQuality]', ...args);\n }\n }\n\n /**\n * Destroy and cleanup\n */\n destroy(): void {\n if (this.isDestroyed) return;\n\n this.isDestroyed = true;\n\n // Remove visibility change listener\n if (this.visibilityChangeHandler && typeof document !== 'undefined') {\n document.removeEventListener('visibilitychange', this.visibilityChangeHandler);\n this.visibilityChangeHandler = null;\n }\n\n // Clear section states\n this.sectionStates.clear();\n }\n}\n\n", "/**\n * Text utility functions for cleaning and processing text content\n */\n\n/**\n * Remove emojis and other Unicode symbols from text\n * This regex matches emoji ranges and other Unicode symbols\n */\nexport function removeEmojis(text: string | null | undefined): string | undefined {\n if (!text) return undefined;\n \n // Remove emojis and other Unicode symbols\n // This regex covers:\n // - Emoticons (\uD83D\uDE00-\uD83D\uDE4F)\n // - Miscellaneous Symbols and Pictographs (\uD83C\uDC00-\uD83F\uDFFF)\n // - Supplemental Symbols and Pictographs (\uD83C\uDE00-\uD83C\uDE3F)\n // - Transport and Map Symbols (\uD83D\uDE80-\uD83D\uDEFF)\n // - Enclosed characters (\u24C2-\u24FF)\n // - Regional indicator symbols (\uD83C\uDDE6-\uD83C\uDDFF)\n // - Other Unicode symbol ranges\n return text\n .replace(/[\\u{1F300}-\\u{1F9FF}]/gu, '') // Miscellaneous Symbols and Pictographs\n .replace(/[\\u{1F600}-\\u{1F64F}]/gu, '') // Emoticons\n .replace(/[\\u{1F680}-\\u{1F6FF}]/gu, '') // Transport and Map Symbols\n .replace(/[\\u{2600}-\\u{26FF}]/gu, '') // Miscellaneous Symbols\n .replace(/[\\u{2700}-\\u{27BF}]/gu, '') // Dingbats\n .replace(/[\\u{1F900}-\\u{1F9FF}]/gu, '') // Supplemental Symbols and Pictographs\n .replace(/[\\u{1F1E0}-\\u{1F1FF}]/gu, '') // Regional Indicator Symbols (flags)\n .replace(/[\\u{200D}]/gu, '') // Zero Width Joiner\n .replace(/[\\u{FE0F}]/gu, '') // Variation Selector-16\n .replace(/[\\u{20E3}]/gu, '') // Combining Enclosing Keycap\n .trim();\n}\n\n/**\n * Clean and truncate text content for event tracking\n * Removes emojis, trims whitespace, and limits length\n */\nexport function cleanElementText(text: string | null | undefined, maxLength: number = 100): string | undefined {\n if (!text) return undefined;\n \n const cleaned = removeEmojis(text);\n if (!cleaned) return undefined;\n \n return cleaned.substring(0, maxLength) || undefined;\n}\n", "/**\n * Heatmap Tracking Manager for Grain Analytics\n * Tracks click interactions and scroll depth across all pages\n */\n\nimport type {\n HeatmapClickData,\n HeatmapScrollData,\n HeatmapTrackingOptions,\n HeatmapScrollState,\n} from './types/heatmap-tracking';\nimport { AttentionQualityManager } from './attention-quality';\nimport type { ActivityDetector } from './activity';\nimport { cleanElementText } from './text-utils';\n\nexport interface SendEventOptions {\n flush?: boolean;\n}\n\nexport interface HeatmapTracker {\n trackSystemEvent(eventName: string, properties?: Record<string, unknown>, options?: SendEventOptions): void | Promise<void>;\n hasConsent(category: 'analytics' | 'marketing' | 'functional'): boolean;\n getActivityDetector(): ActivityDetector;\n log(...args: unknown[]): void;\n}\n\nconst DEFAULT_OPTIONS: HeatmapTrackingOptions = {\n scrollDebounceDelay: 100,\n batchDelay: 2000,\n maxBatchSize: 20,\n debug: false,\n};\n\nexport class HeatmapTrackingManager {\n private tracker: HeatmapTracker;\n private options: HeatmapTrackingOptions;\n private isDestroyed = false;\n\n // Tracking state\n private currentScrollState: HeatmapScrollState | null = null;\n private pendingClicks: HeatmapClickData[] = [];\n private pendingScrolls: HeatmapScrollData[] = [];\n\n // Timers\n private scrollDebounceTimer: number | null = null;\n private batchTimer: number | null = null;\n private scrollTrackingTimer: number | null = null;\n private periodicScrollTimer: number | null = null;\n\n // Scroll tracking\n private lastScrollPosition = 0;\n private lastScrollTime = Date.now();\n private readonly SPLIT_DURATION = 3000; // 3 seconds - same as section tracking\n\n // Attention quality management\n private attentionQuality: AttentionQualityManager;\n\n constructor(\n tracker: HeatmapTracker,\n options: Partial<HeatmapTrackingOptions> = {}\n ) {\n this.tracker = tracker;\n this.options = { ...DEFAULT_OPTIONS, ...options };\n\n // Initialize attention quality manager\n this.attentionQuality = new AttentionQualityManager(\n tracker.getActivityDetector(),\n {\n maxSectionDuration: 9000, // 9 seconds per viewport section\n minScrollDistance: 100, // 100 pixels\n idleThreshold: 30000, // 30 seconds\n debug: this.options.debug,\n }\n );\n\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Initialize after DOM is ready\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => this.initialize());\n } else {\n setTimeout(() => this.initialize(), 0);\n }\n }\n }\n\n /**\n * Initialize heatmap tracking\n */\n private initialize(): void {\n if (this.isDestroyed) return;\n\n this.log('Initializing heatmap tracking');\n\n // Setup click tracking\n this.setupClickTracking();\n\n // Setup scroll tracking\n this.setupScrollTracking();\n\n // Start periodic scroll state tracking\n this.startScrollTracking();\n\n // Setup page unload handler for beaconing\n this.setupUnloadHandler();\n }\n\n /**\n * Setup click event tracking\n */\n private setupClickTracking(): void {\n if (typeof document === 'undefined') return;\n\n const clickHandler = (event: MouseEvent) => {\n if (this.isDestroyed) return;\n // v3: Always track events - consent only affects ID type (daily vs permanent)\n // Removed: if (!this.tracker.hasConsent('analytics')) return;\n\n this.handleClick(event);\n };\n\n document.addEventListener('click', clickHandler, { passive: true, capture: true });\n }\n\n /**\n * Setup scroll event tracking\n */\n private setupScrollTracking(): void {\n if (typeof window === 'undefined') return;\n\n const scrollHandler = () => {\n if (this.scrollDebounceTimer !== null) {\n clearTimeout(this.scrollDebounceTimer);\n }\n\n this.scrollDebounceTimer = window.setTimeout(() => {\n this.handleScroll();\n this.scrollDebounceTimer = null;\n }, this.options.scrollDebounceDelay);\n };\n\n window.addEventListener('scroll', scrollHandler, { passive: true });\n }\n\n /**\n * Start periodic scroll state tracking\n */\n private startScrollTracking(): void {\n if (typeof window === 'undefined') return;\n\n // Track initial scroll position\n this.updateScrollState();\n\n // Update scroll state every 500ms (for detecting section changes)\n this.scrollTrackingTimer = window.setInterval(() => {\n if (this.isDestroyed) return;\n this.updateScrollState();\n }, 500);\n\n // Start periodic 3-second scroll duration tracking\n this.startPeriodicScrollTracking();\n }\n\n /**\n * Start periodic scroll tracking (sends events every 3 seconds)\n */\n private startPeriodicScrollTracking(): void {\n if (typeof window === 'undefined') return;\n\n this.periodicScrollTimer = window.setInterval(() => {\n if (this.isDestroyed || !this.currentScrollState) return;\n // v3: Always track events - consent only affects ID type (daily vs permanent)\n // Removed: if (!this.tracker.hasConsent('analytics')) return;\n\n // Check attention quality policies\n if (!this.attentionQuality.shouldTrack()) {\n this.log('Scroll tracking paused:', this.attentionQuality.getLastFilterReason());\n return;\n }\n\n const currentTime = Date.now();\n const duration = currentTime - this.currentScrollState.entryTime;\n\n // Only send if meaningful duration (> 1 second)\n if (duration > 1000) {\n const scrollY = window.scrollY || window.pageYOffset;\n const viewportHeight = window.innerHeight;\n const pageHeight = document.documentElement.scrollHeight;\n\n // Check section-specific attention quality\n const sectionKey = `viewport_section_${this.currentScrollState.viewportSection}`;\n const attentionCheck = this.attentionQuality.shouldTrackSection(sectionKey, scrollY);\n\n // If attention was reset due to scroll, reset our entry time\n if (attentionCheck.resetAttention) {\n this.log(`Viewport section ${this.currentScrollState.viewportSection}: Attention reset`);\n this.currentScrollState.entryTime = currentTime;\n return;\n }\n\n // If max duration reached for this viewport section\n if (!attentionCheck.shouldTrack) {\n this.log(`Viewport section ${this.currentScrollState.viewportSection}: ${attentionCheck.reason}`);\n return;\n }\n\n const scrollData: HeatmapScrollData = {\n pageUrl: window.location.href,\n viewportSection: this.currentScrollState.viewportSection,\n scrollDepthPx: scrollY,\n durationMs: duration,\n entryTimestamp: this.currentScrollState.entryTime,\n exitTimestamp: currentTime,\n pageHeight,\n viewportHeight,\n };\n\n // Send immediately using beacon to ensure delivery\n this.tracker.trackSystemEvent('_grain_heatmap_scroll', {\n page_url: scrollData.pageUrl,\n viewport_section: scrollData.viewportSection,\n scroll_depth_px: scrollData.scrollDepthPx,\n duration_ms: scrollData.durationMs,\n entry_timestamp: scrollData.entryTimestamp,\n exit_timestamp: scrollData.exitTimestamp,\n page_height: scrollData.pageHeight,\n viewport_height: scrollData.viewportHeight,\n is_split: true, // Flag to indicate periodic tracking, not final exit\n }, { flush: true });\n\n // Update attention quality duration tracker\n this.attentionQuality.updateSectionDuration(sectionKey, duration);\n\n // Reset entry time for next period\n this.currentScrollState.entryTime = currentTime;\n }\n }, this.SPLIT_DURATION);\n }\n\n /**\n * Setup page unload handler to beacon remaining data\n */\n private setupUnloadHandler(): void {\n if (typeof window === 'undefined') return;\n\n const unloadHandler = () => {\n // Finalize current scroll state\n if (this.currentScrollState) {\n const currentTime = Date.now();\n const duration = currentTime - this.currentScrollState.entryTime;\n\n if (duration > 100) {\n const scrollData: HeatmapScrollData = {\n pageUrl: window.location.href,\n viewportSection: this.currentScrollState.viewportSection,\n scrollDepthPx: this.currentScrollState.scrollDepthPx,\n durationMs: duration,\n entryTimestamp: this.currentScrollState.entryTime,\n exitTimestamp: currentTime,\n pageHeight: document.documentElement.scrollHeight,\n viewportHeight: window.innerHeight,\n };\n\n this.pendingScrolls.push(scrollData);\n }\n }\n\n // Flush all pending events with beacon\n this.flushPendingEventsWithBeacon();\n };\n\n // Use both events for better compatibility\n window.addEventListener('beforeunload', unloadHandler);\n window.addEventListener('pagehide', unloadHandler);\n }\n\n /**\n * Handle click event\n */\n private handleClick(event: MouseEvent): void {\n // v3: Always track events - consent only affects ID type (daily vs permanent)\n // Removed: if (!this.tracker.hasConsent('analytics')) return;\n\n const element = event.target as HTMLElement;\n if (!element) return;\n\n const pageUrl = window.location.href;\n const xpath = this.generateXPath(element);\n \n // Get viewport coordinates\n const viewportX = Math.round(event.clientX);\n const viewportY = Math.round(event.clientY);\n \n // Get page coordinates (including scroll offset)\n const pageX = Math.round(event.pageX);\n const pageY = Math.round(event.pageY);\n \n const elementTag = element.tagName?.toLowerCase() || 'unknown';\n const elementText = cleanElementText(element.textContent);\n\n const clickData: HeatmapClickData = {\n pageUrl,\n xpath,\n viewportX,\n viewportY,\n pageX,\n pageY,\n elementTag,\n elementText: elementText || undefined,\n timestamp: Date.now(),\n };\n\n // Check if this is a navigation link\n const isNavigationLink = element instanceof HTMLAnchorElement && element.href;\n\n // Send immediately with beacon for navigation links to ensure delivery\n if (isNavigationLink) {\n this.tracker.trackSystemEvent('_grain_heatmap_click', {\n page_url: clickData.pageUrl,\n xpath: clickData.xpath,\n viewport_x: clickData.viewportX,\n viewport_y: clickData.viewportY,\n page_x: clickData.pageX,\n page_y: clickData.pageY,\n element_tag: clickData.elementTag,\n element_text: clickData.elementText,\n timestamp: clickData.timestamp,\n }, { flush: true });\n } else {\n this.pendingClicks.push(clickData);\n\n // Check if we should flush\n this.considerBatchFlush();\n }\n }\n\n /**\n * Handle scroll event\n */\n private handleScroll(): void {\n // v3: Always track events - consent only affects ID type (daily vs permanent)\n // Removed: if (!this.tracker.hasConsent('analytics')) return;\n this.updateScrollState();\n }\n\n /**\n * Update current scroll state\n */\n private updateScrollState(): void {\n if (typeof window === 'undefined') return;\n // v3: Always track events - consent only affects ID type (daily vs permanent)\n // Removed: if (!this.tracker.hasConsent('analytics')) return;\n\n const currentTime = Date.now();\n const scrollY = window.scrollY || window.pageYOffset;\n const viewportHeight = window.innerHeight;\n const pageHeight = document.documentElement.scrollHeight;\n \n // Calculate which viewport section we're in\n const viewportSection = Math.floor(scrollY / viewportHeight);\n\n // If we're in a new section, record the previous one\n if (this.currentScrollState && this.currentScrollState.viewportSection !== viewportSection) {\n const duration = currentTime - this.currentScrollState.entryTime;\n \n // Only record if duration is meaningful (> 100ms)\n if (duration > 100) {\n const scrollData: HeatmapScrollData = {\n pageUrl: window.location.href,\n viewportSection: this.currentScrollState.viewportSection,\n scrollDepthPx: this.currentScrollState.scrollDepthPx,\n durationMs: duration,\n entryTimestamp: this.currentScrollState.entryTime,\n exitTimestamp: currentTime,\n pageHeight,\n viewportHeight,\n };\n\n this.pendingScrolls.push(scrollData);\n }\n\n // Reset attention for previous viewport section\n const prevSectionKey = `viewport_section_${this.currentScrollState.viewportSection}`;\n this.attentionQuality.resetSection(prevSectionKey);\n }\n\n // Update current state\n if (!this.currentScrollState || this.currentScrollState.viewportSection !== viewportSection) {\n this.currentScrollState = {\n viewportSection,\n entryTime: currentTime,\n scrollDepthPx: scrollY,\n };\n }\n\n this.lastScrollPosition = scrollY;\n this.lastScrollTime = currentTime;\n\n // Check if we should flush\n this.considerBatchFlush();\n }\n\n /**\n * Generate XPath for an element\n */\n private generateXPath(element: HTMLElement): string {\n if (!element) return '';\n\n // If element has an ID, use that for simpler XPath\n if (element.id) {\n return `//*[@id=\"${element.id}\"]`;\n }\n\n const paths: string[] = [];\n let currentElement: HTMLElement | null = element;\n\n while (currentElement && currentElement.nodeType === Node.ELEMENT_NODE) {\n let index = 0;\n let sibling: Element | null = currentElement;\n\n // Count preceding siblings of the same tag\n while (sibling) {\n sibling = sibling.previousElementSibling;\n if (sibling && sibling.nodeName === currentElement.nodeName) {\n index++;\n }\n }\n\n const tagName = currentElement.nodeName.toLowerCase();\n const pathIndex = index > 0 ? `[${index + 1}]` : '';\n paths.unshift(`${tagName}${pathIndex}`);\n\n currentElement = currentElement.parentElement;\n }\n\n return paths.length ? `/${paths.join('/')}` : '';\n }\n\n /**\n * Consider flushing batched events\n */\n private considerBatchFlush(): void {\n const totalEvents = this.pendingClicks.length + this.pendingScrolls.length;\n\n // Flush if we've hit the batch size\n if (totalEvents >= this.options.maxBatchSize) {\n this.flushPendingEvents();\n return;\n }\n\n // Otherwise, schedule a batch flush\n if (this.batchTimer === null && totalEvents > 0) {\n this.batchTimer = window.setTimeout(() => {\n this.flushPendingEvents();\n this.batchTimer = null;\n }, this.options.batchDelay);\n }\n }\n\n /**\n * Flush pending events\n */\n private flushPendingEvents(): void {\n if (this.isDestroyed) return;\n // v3: Always track events - consent only affects ID type (daily vs permanent)\n // Removed consent check that was blocking events in cookieless mode\n\n // Send click events\n if (this.pendingClicks.length > 0) {\n for (const clickData of this.pendingClicks) {\n this.tracker.trackSystemEvent('_grain_heatmap_click', {\n page_url: clickData.pageUrl,\n xpath: clickData.xpath,\n viewport_x: clickData.viewportX,\n viewport_y: clickData.viewportY,\n page_x: clickData.pageX,\n page_y: clickData.pageY,\n element_tag: clickData.elementTag,\n element_text: clickData.elementText,\n timestamp: clickData.timestamp,\n });\n }\n\n this.pendingClicks = [];\n }\n\n // Send scroll events\n if (this.pendingScrolls.length > 0) {\n for (const scrollData of this.pendingScrolls) {\n this.tracker.trackSystemEvent('_grain_heatmap_scroll', {\n page_url: scrollData.pageUrl,\n viewport_section: scrollData.viewportSection,\n scroll_depth_px: scrollData.scrollDepthPx,\n duration_ms: scrollData.durationMs,\n entry_timestamp: scrollData.entryTimestamp,\n exit_timestamp: scrollData.exitTimestamp,\n page_height: scrollData.pageHeight,\n viewport_height: scrollData.viewportHeight,\n });\n }\n\n this.pendingScrolls = [];\n }\n\n // Clear batch timer\n if (this.batchTimer !== null) {\n clearTimeout(this.batchTimer);\n this.batchTimer = null;\n }\n }\n\n /**\n * Flush pending events with beacon (for page unload)\n */\n private flushPendingEventsWithBeacon(): void {\n // v3: Always track events - consent only affects ID type (daily vs permanent)\n // Removed consent check that was blocking events in cookieless mode\n\n // Send click events with beacon\n if (this.pendingClicks.length > 0) {\n for (const clickData of this.pendingClicks) {\n this.tracker.trackSystemEvent('_grain_heatmap_click', {\n page_url: clickData.pageUrl,\n xpath: clickData.xpath,\n viewport_x: clickData.viewportX,\n viewport_y: clickData.viewportY,\n page_x: clickData.pageX,\n page_y: clickData.pageY,\n element_tag: clickData.elementTag,\n element_text: clickData.elementText,\n timestamp: clickData.timestamp,\n }, { flush: true });\n }\n\n this.pendingClicks = [];\n }\n\n // Send scroll events with beacon\n if (this.pendingScrolls.length > 0) {\n for (const scrollData of this.pendingScrolls) {\n this.tracker.trackSystemEvent('_grain_heatmap_scroll', {\n page_url: scrollData.pageUrl,\n viewport_section: scrollData.viewportSection,\n scroll_depth_px: scrollData.scrollDepthPx,\n duration_ms: scrollData.durationMs,\n entry_timestamp: scrollData.entryTimestamp,\n exit_timestamp: scrollData.exitTimestamp,\n page_height: scrollData.pageHeight,\n viewport_height: scrollData.viewportHeight,\n }, { flush: true });\n }\n\n this.pendingScrolls = [];\n }\n }\n\n /**\n * Log debug message\n */\n private log(...args: unknown[]): void {\n if (this.options.debug) {\n this.tracker.log('[Heatmap Tracking]', ...args);\n }\n }\n\n /**\n * Destroy the tracking manager\n */\n destroy(): void {\n this.isDestroyed = true;\n\n // Clear timers\n if (this.scrollDebounceTimer !== null) {\n clearTimeout(this.scrollDebounceTimer);\n this.scrollDebounceTimer = null;\n }\n\n if (this.batchTimer !== null) {\n clearTimeout(this.batchTimer);\n this.batchTimer = null;\n }\n\n if (this.scrollTrackingTimer !== null) {\n clearInterval(this.scrollTrackingTimer);\n this.scrollTrackingTimer = null;\n }\n\n if (this.periodicScrollTimer !== null) {\n clearInterval(this.periodicScrollTimer);\n this.periodicScrollTimer = null;\n }\n\n // Destroy attention quality manager\n this.attentionQuality.destroy();\n\n // Flush any remaining events\n this.flushPendingEvents();\n }\n}\n\n", "/**\n * Interaction Tracking Manager for Grain Analytics\n * Automatically attaches click and focus listeners to detected interactive elements\n */\n\nimport type { InteractionConfig } from './types/auto-tracking';\nimport { cleanElementText } from './text-utils';\n\nexport interface SendEventOptions {\n flush?: boolean;\n}\n\nexport interface InteractionTracker {\n track(eventName: string, properties?: Record<string, unknown>, options?: SendEventOptions): void | Promise<void>;\n hasConsent(category: 'analytics' | 'marketing' | 'functional'): boolean;\n log(...args: unknown[]): void;\n}\n\nexport interface InteractionTrackingConfig {\n debug?: boolean;\n enableMutationObserver?: boolean;\n mutationDebounceDelay?: number;\n tenantId?: string;\n apiUrl?: string;\n}\n\nexport class InteractionTrackingManager {\n private tracker: InteractionTracker;\n private interactions: InteractionConfig[];\n private config: InteractionTrackingConfig;\n private isDestroyed = false;\n private attachedListeners: Map<Element, Array<{ event: string; handler: EventListener }>> = new Map();\n private xpathCache: Map<string, Element | null> = new Map();\n private mutationObserver: MutationObserver | null = null;\n private mutationDebounceTimer: number | null = null;\n\n constructor(\n tracker: InteractionTracker,\n interactions: InteractionConfig[],\n config: InteractionTrackingConfig = {}\n ) {\n this.tracker = tracker;\n this.interactions = interactions;\n this.config = {\n debug: config.debug ?? false,\n enableMutationObserver: config.enableMutationObserver ?? true,\n mutationDebounceDelay: config.mutationDebounceDelay ?? 500,\n tenantId: config.tenantId,\n apiUrl: config.apiUrl,\n };\n\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Fetch and merge trackers if configured\n if (this.config.tenantId && this.config.apiUrl) {\n this.fetchAndMergeTrackers().then(() => {\n this.attachAllListeners();\n });\n } else {\n // Attach listeners after DOM is ready\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => this.attachAllListeners());\n } else {\n // DOM already loaded\n setTimeout(() => this.attachAllListeners(), 0);\n }\n }\n\n // Setup mutation observer for dynamic content\n if (this.config.enableMutationObserver) {\n this.setupMutationObserver();\n }\n }\n }\n \n /**\n * Fetch trackers from API and merge with existing interactions\n */\n private async fetchAndMergeTrackers(): Promise<void> {\n if (!this.config.tenantId || !this.config.apiUrl) return;\n \n try {\n const currentUrl = typeof window !== 'undefined' ? window.location.href : '';\n const url = `${this.config.apiUrl}/v1/client/${encodeURIComponent(this.config.tenantId)}/trackers?url=${encodeURIComponent(currentUrl)}`;\n \n this.log('Fetching trackers from:', url);\n \n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n \n if (!response.ok) {\n this.log('Failed to fetch trackers:', response.status);\n return;\n }\n \n const result = await response.json();\n \n if (result.trackers && Array.isArray(result.trackers)) {\n this.log('Fetched', result.trackers.length, 'trackers');\n \n // Convert trackers to InteractionConfig format\n const trackerInteractions: InteractionConfig[] = result.trackers.map((tracker: any) => ({\n eventName: tracker.eventName,\n selector: tracker.selector,\n priority: 5, // High priority for manually created trackers\n label: tracker.eventName,\n description: `Tracker: ${tracker.eventName}`,\n }));\n \n // Merge with existing interactions (trackers take precedence)\n this.interactions = [...trackerInteractions, ...this.interactions];\n \n this.log('Merged trackers, total interactions:', this.interactions.length);\n }\n } catch (error) {\n this.log('Error fetching trackers:', error);\n }\n }\n\n /**\n * Attach listeners to all configured interactions\n */\n private attachAllListeners(): void {\n if (this.isDestroyed) return;\n\n this.log('Attaching interaction listeners');\n\n for (const interaction of this.interactions) {\n this.attachInteractionListener(interaction);\n }\n }\n\n /**\n * Attach listener to a specific interaction\n */\n private attachInteractionListener(interaction: InteractionConfig): void {\n if (this.isDestroyed) return;\n\n const element = this.findElementByXPath(interaction.selector);\n \n if (!element) {\n this.log('Element not found for interaction:', interaction.eventName, 'selector:', interaction.selector);\n return;\n }\n\n // Check if we already attached listeners to this element for this interaction\n if (this.attachedListeners.has(element)) {\n this.log('Listeners already attached for element:', element);\n return;\n }\n\n const handlers: Array<{ event: string; handler: EventListener }> = [];\n\n // Click handler\n const clickHandler = (event: Event) => this.handleInteractionClick(interaction, event);\n element.addEventListener('click', clickHandler, { passive: true });\n handlers.push({ event: 'click', handler: clickHandler });\n\n // Focus handler (for form inputs)\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement || element instanceof HTMLSelectElement) {\n const focusHandler = (event: Event) => this.handleInteractionFocus(interaction, event);\n element.addEventListener('focus', focusHandler, { passive: true });\n handlers.push({ event: 'focus', handler: focusHandler });\n }\n\n this.attachedListeners.set(element, handlers);\n }\n\n /**\n * Handle click event on interaction\n */\n private handleInteractionClick(interaction: InteractionConfig, event: Event): void {\n if (this.isDestroyed) return;\n // v3: Always track events - consent only affects ID type (daily vs permanent)\n // Removed: if (!this.tracker.hasConsent('analytics')) return;\n\n const element = event.target as HTMLElement;\n \n // Check if this is a navigation link (has href attribute)\n const isNavigationLink = element instanceof HTMLAnchorElement && element.href;\n \n const eventProperties = {\n interaction_type: 'click',\n interaction_label: interaction.label,\n interaction_description: interaction.description,\n interaction_priority: interaction.priority,\n element_tag: element.tagName?.toLowerCase(),\n element_text: cleanElementText(element.textContent),\n element_id: element.id || undefined,\n element_class: element.className || undefined,\n ...(isNavigationLink && { href: element.href }),\n timestamp: Date.now(),\n };\n \n // Always use flush for auto-tracked clicks to ensure delivery\n // This is especially important for navigation links and quick interactions\n const result = this.tracker.track(interaction.eventName, eventProperties, { flush: true });\n if (result instanceof Promise) {\n result.catch((error: unknown) => {\n // Log error but don't block interaction\n this.log('Failed to track click:', error);\n });\n }\n }\n\n /**\n * Handle focus event on interaction (for form fields)\n */\n private handleInteractionFocus(interaction: InteractionConfig, event: Event): void {\n if (this.isDestroyed) return;\n // v3: Always track events - consent only affects ID type (daily vs permanent)\n // Removed: if (!this.tracker.hasConsent('analytics')) return;\n\n const element = event.target as HTMLElement;\n \n this.tracker.track(interaction.eventName, {\n interaction_type: 'focus',\n interaction_label: interaction.label,\n interaction_description: interaction.description,\n interaction_priority: interaction.priority,\n element_tag: element.tagName?.toLowerCase(),\n element_id: element.id || undefined,\n element_class: element.className || undefined,\n timestamp: Date.now(),\n });\n }\n\n /**\n * Find element by XPath selector\n */\n private findElementByXPath(xpath: string): Element | null {\n // Check cache first\n if (this.xpathCache.has(xpath)) {\n const cached = this.xpathCache.get(xpath);\n // Verify element is still in DOM\n if (cached && document.contains(cached)) {\n return cached;\n }\n // Clear invalid cache entry\n this.xpathCache.delete(xpath);\n }\n\n try {\n // Strip the xpath= prefix if present (from Stagehand selectors)\n let cleanXpath = xpath;\n if (xpath.startsWith('xpath=')) {\n cleanXpath = xpath.substring(6); // Remove 'xpath=' prefix\n }\n\n const result = document.evaluate(\n cleanXpath,\n document,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n \n const element = result.singleNodeValue as Element | null;\n \n // Cache the result (use original xpath as key)\n if (element) {\n this.xpathCache.set(xpath, element);\n }\n \n return element;\n } catch (error) {\n this.log('Error evaluating XPath:', xpath, error);\n return null;\n }\n }\n\n /**\n * Setup mutation observer to handle dynamic content\n */\n private setupMutationObserver(): void {\n if (typeof MutationObserver === 'undefined') {\n this.log('MutationObserver not supported');\n return;\n }\n\n this.mutationObserver = new MutationObserver((mutations) => {\n // Debounce the re-attachment\n if (this.mutationDebounceTimer !== null) {\n clearTimeout(this.mutationDebounceTimer);\n }\n\n this.mutationDebounceTimer = window.setTimeout(() => {\n this.handleMutations(mutations);\n this.mutationDebounceTimer = null;\n }, this.config.mutationDebounceDelay);\n });\n\n this.mutationObserver.observe(document.body, {\n childList: true,\n subtree: true,\n });\n\n this.log('Mutation observer setup');\n }\n\n /**\n * Handle DOM mutations\n */\n private handleMutations(mutations: MutationRecord[]): void {\n if (this.isDestroyed) return;\n\n // Clear XPath cache on mutations\n this.xpathCache.clear();\n\n // Check if any of our tracked elements were removed\n const removedElements = new Set<Element>();\n for (const mutation of mutations) {\n mutation.removedNodes.forEach((node) => {\n if (node instanceof Element) {\n removedElements.add(node);\n // Also check for child elements we were tracking\n this.attachedListeners.forEach((handlers, element) => {\n if (node.contains(element)) {\n removedElements.add(element);\n }\n });\n }\n });\n }\n\n // Clean up removed elements\n removedElements.forEach((element) => {\n this.detachListeners(element);\n });\n\n // Try to re-attach listeners for any interactions that might now be available\n this.attachAllListeners();\n }\n\n /**\n * Detach listeners from an element\n */\n private detachListeners(element: Element): void {\n const handlers = this.attachedListeners.get(element);\n if (!handlers) return;\n\n handlers.forEach(({ event, handler }) => {\n element.removeEventListener(event, handler);\n });\n\n this.attachedListeners.delete(element);\n }\n\n /**\n * Log debug messages\n */\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[InteractionTracking]', ...args);\n }\n }\n\n /**\n * Update interactions configuration\n */\n updateInteractions(interactions: InteractionConfig[]): void {\n if (this.isDestroyed) return;\n\n this.log('Updating interactions configuration');\n \n // Detach all existing listeners\n this.attachedListeners.forEach((handlers, element) => {\n this.detachListeners(element);\n });\n\n // Clear cache\n this.xpathCache.clear();\n\n // Update configuration\n this.interactions = interactions;\n\n // Reattach listeners\n this.attachAllListeners();\n }\n\n /**\n * Cleanup and destroy\n */\n destroy(): void {\n if (this.isDestroyed) return;\n\n this.log('Destroying interaction tracking manager');\n \n this.isDestroyed = true;\n\n // Clear debounce timer\n if (this.mutationDebounceTimer !== null) {\n clearTimeout(this.mutationDebounceTimer);\n this.mutationDebounceTimer = null;\n }\n\n // Disconnect mutation observer\n if (this.mutationObserver) {\n this.mutationObserver.disconnect();\n this.mutationObserver = null;\n }\n\n // Detach all listeners\n this.attachedListeners.forEach((handlers, element) => {\n this.detachListeners(element);\n });\n\n // Clear caches\n this.attachedListeners.clear();\n this.xpathCache.clear();\n }\n}\n\n", "/**\n * Section Tracking Manager for Grain Analytics\n * Intelligent scroll tracking with viewport metrics, visible sections, and engagement analysis\n */\n\nimport type { SectionConfig, SectionViewData, SectionTrackingOptions, SectionTrackingState } from './types/auto-tracking';\nimport { AttentionQualityManager } from './attention-quality';\nimport type { ActivityDetector } from './activity';\n\nexport interface SectionTracker {\n trackSystemEvent(eventName: string, properties: Record<string, unknown>): void;\n hasConsent(category: 'analytics' | 'marketing' | 'functional'): boolean;\n getActivityDetector(): ActivityDetector;\n log(...args: unknown[]): void;\n}\n\nconst DEFAULT_OPTIONS: SectionTrackingOptions = {\n minDwellTime: 1000, // 1 second minimum\n scrollVelocityThreshold: 500, // 500px/s\n intersectionThreshold: 0.1, // 10% visible\n debounceDelay: 100,\n batchDelay: 2000, // 2 seconds\n debug: false,\n};\n\nexport class SectionTrackingManager {\n private tracker: SectionTracker;\n private sections: SectionConfig[];\n private options: SectionTrackingOptions;\n private isDestroyed = false;\n \n // Tracking state\n private sectionStates: Map<string, SectionTrackingState> = new Map();\n private intersectionObserver: IntersectionObserver | null = null;\n private xpathCache: Map<string, Element | null> = new Map();\n \n // Scroll tracking\n private lastScrollPosition = 0;\n private lastScrollTime = Date.now();\n private scrollVelocity = 0;\n private scrollDebounceTimer: number | null = null;\n \n // Event batching\n private pendingEvents: SectionViewData[] = [];\n private batchTimer: number | null = null;\n\n // Periodic tracking for long-duration views\n private sectionTimers: Map<string, number> = new Map(); // sectionName -> timer ID\n private readonly SPLIT_DURATION = 3000; // 3 seconds\n\n // Attention quality management\n private attentionQuality: AttentionQualityManager;\n\n constructor(\n tracker: SectionTracker,\n sections: SectionConfig[],\n options: Partial<SectionTrackingOptions> = {}\n ) {\n this.tracker = tracker;\n this.sections = sections;\n this.options = { ...DEFAULT_OPTIONS, ...options };\n\n // Initialize attention quality manager\n this.attentionQuality = new AttentionQualityManager(\n tracker.getActivityDetector(),\n {\n maxSectionDuration: 9000, // 9 seconds\n minScrollDistance: 100, // 100 pixels\n idleThreshold: 30000, // 30 seconds\n debug: this.options.debug,\n }\n );\n\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Initialize after DOM is ready\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => this.initialize());\n } else {\n setTimeout(() => this.initialize(), 0);\n }\n }\n }\n\n /**\n * Initialize section tracking\n */\n private initialize(): void {\n if (this.isDestroyed) return;\n\n this.log('Initializing section tracking');\n\n // Setup intersection observer\n this.setupIntersectionObserver();\n\n // Setup scroll listener for velocity tracking\n this.setupScrollListener();\n\n // Initialize sections\n this.initializeSections();\n }\n\n /**\n * Setup IntersectionObserver for section visibility\n */\n private setupIntersectionObserver(): void {\n if (typeof IntersectionObserver === 'undefined') {\n this.log('IntersectionObserver not supported');\n return;\n }\n\n this.intersectionObserver = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n this.handleIntersection(entry);\n });\n },\n {\n threshold: [0, 0.1, 0.25, 0.5, 0.75, 1.0],\n rootMargin: '0px',\n }\n );\n\n this.log('IntersectionObserver created');\n }\n\n /**\n * Setup scroll listener for velocity calculation\n */\n private setupScrollListener(): void {\n if (typeof window === 'undefined') return;\n\n const scrollHandler = () => {\n if (this.scrollDebounceTimer !== null) {\n clearTimeout(this.scrollDebounceTimer);\n }\n\n this.scrollDebounceTimer = window.setTimeout(() => {\n this.updateScrollVelocity();\n this.scrollDebounceTimer = null;\n }, this.options.debounceDelay);\n };\n\n window.addEventListener('scroll', scrollHandler, { passive: true });\n this.log('Scroll listener attached');\n }\n\n /**\n * Initialize sections and start observing\n */\n private initializeSections(): void {\n for (const section of this.sections) {\n const element = this.findElementByXPath(section.selector);\n \n if (!element) {\n this.log('Section element not found:', section.sectionName, 'selector:', section.selector);\n continue;\n }\n\n // Initialize state\n const state: SectionTrackingState = {\n element,\n config: section,\n entryTime: null,\n exitTime: null,\n isVisible: false,\n lastScrollPosition: window.scrollY,\n lastScrollTime: Date.now(),\n entryScrollSpeed: 0,\n exitScrollSpeed: 0,\n maxVisibleArea: 0,\n };\n\n this.sectionStates.set(section.sectionName, state);\n\n // Start observing\n if (this.intersectionObserver) {\n this.intersectionObserver.observe(element);\n }\n }\n }\n\n /**\n * Handle intersection observer entry\n */\n private handleIntersection(entry: IntersectionObserverEntry): void {\n if (this.isDestroyed) return;\n\n // Find which section this element belongs to\n const state = Array.from(this.sectionStates.values()).find(\n (s) => s.element === entry.target\n );\n\n if (!state) return;\n\n const isVisible = entry.isIntersecting && entry.intersectionRatio >= this.options.intersectionThreshold;\n const visibleArea = entry.intersectionRatio;\n\n // Update max visible area\n if (visibleArea > state.maxVisibleArea) {\n state.maxVisibleArea = visibleArea;\n }\n\n // Handle visibility change\n if (isVisible && !state.isVisible) {\n // Section became visible\n this.handleSectionEntry(state);\n } else if (!isVisible && state.isVisible) {\n // Section became invisible\n this.handleSectionExit(state);\n }\n\n state.isVisible = isVisible;\n }\n\n /**\n * Handle section entry (became visible)\n */\n private handleSectionEntry(state: SectionTrackingState): void {\n state.entryTime = Date.now();\n state.entryScrollSpeed = this.scrollVelocity;\n state.lastScrollPosition = window.scrollY;\n state.lastScrollTime = Date.now();\n state.maxVisibleArea = 0;\n \n // Start periodic tracking timer (3 second intervals)\n this.startPeriodicTracking(state);\n }\n \n /**\n * Start periodic tracking for a section (sends events every 3 seconds)\n */\n private startPeriodicTracking(state: SectionTrackingState): void {\n // Clear any existing timer for this section\n this.stopPeriodicTracking(state.config.sectionName);\n \n const timerId = window.setInterval(() => {\n if (this.isDestroyed || !state.isVisible || state.entryTime === null) {\n this.stopPeriodicTracking(state.config.sectionName);\n return;\n }\n \n const now = Date.now();\n const duration = now - state.entryTime;\n \n // Only track if minimum dwell time has passed\n if (duration >= this.options.minDwellTime) {\n // Check attention quality policies\n const currentScrollY = window.scrollY;\n const attentionCheck = this.attentionQuality.shouldTrackSection(\n state.config.sectionName,\n currentScrollY\n );\n\n // If attention was reset due to scroll, reset our entry time\n if (attentionCheck.resetAttention) {\n this.log(`Section \"${state.config.sectionName}\": Attention reset, restarting timer`);\n state.entryTime = now;\n state.entryScrollSpeed = this.scrollVelocity;\n return;\n }\n\n // If tracking is not allowed (page hidden, idle, or max duration reached)\n if (!attentionCheck.shouldTrack) {\n this.log(`Section \"${state.config.sectionName}\": Tracking paused - ${attentionCheck.reason}`);\n return;\n }\n\n // Create partial section view data\n const viewData: SectionViewData = {\n sectionName: state.config.sectionName,\n sectionType: state.config.sectionType,\n entryTime: state.entryTime,\n exitTime: now, // Current time as \"exit\" for this split\n duration,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n scrollDepth: this.calculateScrollDepth(),\n visibleAreaPercentage: Math.round(state.maxVisibleArea * 100),\n scrollSpeedAtEntry: state.entryScrollSpeed,\n scrollSpeedAtExit: this.scrollVelocity,\n };\n \n // Track this split immediately (don't queue for batching)\n if (this.shouldTrackSection(viewData)) {\n this.tracker.trackSystemEvent('_grain_section_view', {\n section_name: viewData.sectionName,\n section_type: viewData.sectionType,\n duration_ms: viewData.duration,\n viewport_width: viewData.viewportWidth,\n viewport_height: viewData.viewportHeight,\n scroll_depth_percent: viewData.scrollDepth,\n visible_area_percent: viewData.visibleAreaPercentage,\n scroll_speed_entry: Math.round(viewData.scrollSpeedAtEntry || 0),\n scroll_speed_exit: Math.round(viewData.scrollSpeedAtExit || 0),\n entry_timestamp: viewData.entryTime,\n exit_timestamp: viewData.exitTime,\n is_split: true, // Flag to indicate this is a periodic split, not final exit\n });\n \n // Update attention quality duration tracker\n this.attentionQuality.updateSectionDuration(state.config.sectionName, duration);\n \n // Reset entry time for next split (but keep tracking)\n state.entryTime = now;\n state.entryScrollSpeed = this.scrollVelocity;\n }\n }\n }, this.SPLIT_DURATION);\n \n this.sectionTimers.set(state.config.sectionName, timerId);\n }\n \n /**\n * Stop periodic tracking for a section\n */\n private stopPeriodicTracking(sectionName: string): void {\n const timerId = this.sectionTimers.get(sectionName);\n if (timerId !== undefined) {\n clearInterval(timerId);\n this.sectionTimers.delete(sectionName);\n }\n }\n\n /**\n * Handle section exit (became invisible)\n */\n private handleSectionExit(state: SectionTrackingState): void {\n // Stop periodic tracking\n this.stopPeriodicTracking(state.config.sectionName);\n \n // Reset attention for this section\n this.attentionQuality.resetSection(state.config.sectionName);\n \n if (state.entryTime === null) return;\n\n state.exitTime = Date.now();\n state.exitScrollSpeed = this.scrollVelocity;\n\n const duration = state.exitTime - state.entryTime;\n\n // Create section view data\n const viewData: SectionViewData = {\n sectionName: state.config.sectionName,\n sectionType: state.config.sectionType,\n entryTime: state.entryTime,\n exitTime: state.exitTime,\n duration,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n scrollDepth: this.calculateScrollDepth(),\n visibleAreaPercentage: Math.round(state.maxVisibleArea * 100),\n scrollSpeedAtEntry: state.entryScrollSpeed,\n scrollSpeedAtExit: state.exitScrollSpeed,\n };\n\n // Apply sanitization and track if valid\n if (this.shouldTrackSection(viewData)) {\n this.queueSectionView(viewData);\n } else {\n this.log('Section view filtered out:', state.config.sectionName, 'duration:', duration);\n }\n\n // Reset entry time\n state.entryTime = null;\n }\n\n /**\n * Update scroll velocity\n */\n private updateScrollVelocity(): void {\n const now = Date.now();\n const currentPosition = window.scrollY;\n \n const timeDelta = now - this.lastScrollTime;\n const positionDelta = Math.abs(currentPosition - this.lastScrollPosition);\n \n if (timeDelta > 0) {\n this.scrollVelocity = (positionDelta / timeDelta) * 1000; // pixels per second\n }\n \n this.lastScrollPosition = currentPosition;\n this.lastScrollTime = now;\n }\n\n /**\n * Calculate current scroll depth as percentage\n */\n private calculateScrollDepth(): number {\n if (typeof window === 'undefined' || typeof document === 'undefined') return 0;\n\n const windowHeight = window.innerHeight;\n const documentHeight = Math.max(\n document.body.scrollHeight,\n document.body.offsetHeight,\n document.documentElement.clientHeight,\n document.documentElement.scrollHeight,\n document.documentElement.offsetHeight\n );\n \n const scrollTop = window.scrollY;\n const scrollableHeight = documentHeight - windowHeight;\n \n if (scrollableHeight <= 0) return 100;\n \n return Math.round((scrollTop / scrollableHeight) * 100);\n }\n\n /**\n * Determine if section view should be tracked (sanitization)\n */\n private shouldTrackSection(viewData: SectionViewData): boolean {\n // Minimum dwell time check\n if (viewData.duration < this.options.minDwellTime) {\n return false;\n }\n\n // Check if user was rapidly scrolling through\n const avgScrollSpeed = (viewData.scrollSpeedAtEntry! + viewData.scrollSpeedAtExit!) / 2;\n if (avgScrollSpeed > this.options.scrollVelocityThreshold * 2) {\n // Very fast scroll - likely not engaged\n return false;\n }\n\n // Must have had some meaningful visible area\n if (viewData.visibleAreaPercentage < 10) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Queue section view for batching\n */\n private queueSectionView(viewData: SectionViewData): void {\n this.pendingEvents.push(viewData);\n\n // Setup batch timer if not already set\n if (this.batchTimer === null) {\n this.batchTimer = window.setTimeout(() => {\n this.flushPendingEvents();\n }, this.options.batchDelay);\n }\n }\n\n /**\n * Flush pending section view events\n */\n private flushPendingEvents(): void {\n if (this.isDestroyed || this.pendingEvents.length === 0) return;\n // v3: Always track events - consent only affects ID type (daily vs permanent)\n // Removed consent check that was blocking events in cookieless mode\n\n // Track each section view\n for (const viewData of this.pendingEvents) {\n this.tracker.trackSystemEvent('_grain_section_view', {\n section_name: viewData.sectionName,\n section_type: viewData.sectionType,\n duration_ms: viewData.duration,\n viewport_width: viewData.viewportWidth,\n viewport_height: viewData.viewportHeight,\n scroll_depth_percent: viewData.scrollDepth,\n visible_area_percent: viewData.visibleAreaPercentage,\n scroll_speed_entry: Math.round(viewData.scrollSpeedAtEntry || 0),\n scroll_speed_exit: Math.round(viewData.scrollSpeedAtExit || 0),\n entry_timestamp: viewData.entryTime,\n exit_timestamp: viewData.exitTime,\n });\n }\n\n // Clear pending events\n this.pendingEvents = [];\n this.batchTimer = null;\n }\n\n /**\n * Find element by XPath selector\n */\n private findElementByXPath(xpath: string): Element | null {\n // Check cache first\n if (this.xpathCache.has(xpath)) {\n const cached = this.xpathCache.get(xpath);\n if (cached && document.contains(cached)) {\n return cached;\n }\n this.xpathCache.delete(xpath);\n }\n\n try {\n // Strip the xpath= prefix if present (from Stagehand selectors)\n let cleanXpath = xpath;\n if (xpath.startsWith('xpath=')) {\n cleanXpath = xpath.substring(6); // Remove 'xpath=' prefix\n }\n\n const result = document.evaluate(\n cleanXpath,\n document,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n \n const element = result.singleNodeValue as Element | null;\n \n // Cache the result (use original xpath as key)\n if (element) {\n this.xpathCache.set(xpath, element);\n }\n \n return element;\n } catch (error) {\n this.log('Error evaluating XPath:', xpath, error);\n return null;\n }\n }\n\n /**\n * Log debug messages\n */\n private log(...args: unknown[]): void {\n if (this.options.debug) {\n console.log('[SectionTracking]', ...args);\n }\n }\n\n /**\n * Update sections configuration\n */\n updateSections(sections: SectionConfig[]): void {\n if (this.isDestroyed) return;\n\n this.log('Updating sections configuration');\n \n // Disconnect observer\n if (this.intersectionObserver) {\n this.intersectionObserver.disconnect();\n }\n\n // Clear state\n this.sectionStates.clear();\n this.xpathCache.clear();\n\n // Update configuration\n this.sections = sections;\n\n // Reinitialize\n this.setupIntersectionObserver();\n this.initializeSections();\n }\n\n /**\n * Cleanup and destroy\n */\n destroy(): void {\n if (this.isDestroyed) return;\n\n this.log('Destroying section tracking manager');\n \n this.isDestroyed = true;\n\n // Stop all periodic tracking timers\n this.sectionTimers.forEach((timerId) => {\n clearInterval(timerId);\n });\n this.sectionTimers.clear();\n\n // Flush any pending events\n this.flushPendingEvents();\n\n // Clear timers\n if (this.scrollDebounceTimer !== null) {\n clearTimeout(this.scrollDebounceTimer);\n this.scrollDebounceTimer = null;\n }\n\n if (this.batchTimer !== null) {\n clearTimeout(this.batchTimer);\n this.batchTimer = null;\n }\n\n // Disconnect intersection observer\n if (this.intersectionObserver) {\n this.intersectionObserver.disconnect();\n this.intersectionObserver = null;\n }\n\n // Destroy attention quality manager\n this.attentionQuality.destroy();\n\n // Clear state\n this.sectionStates.clear();\n this.xpathCache.clear();\n this.pendingEvents = [];\n }\n}\n\n", "/**\n * Debug Agent for Visual Event Tracking\n * Provides a toolbar and element inspection mode for creating event trackers\n */\n\nexport interface DebugAgentConfig {\n debug?: boolean;\n}\n\nexport interface Tracker {\n track(eventName: string, properties?: Record<string, unknown>): void | Promise<void>;\n log(...args: unknown[]): void;\n}\n\nexport interface ExistingTracker {\n trackerId: string;\n name: string;\n type: string;\n selector: string;\n urlScope: string;\n urlPattern?: string;\n isEnabled: boolean;\n}\n\nexport class DebugAgent {\n private tracker: Tracker;\n private sessionId: string;\n private tenantId: string;\n private apiUrl: string;\n private config: DebugAgentConfig;\n private isDestroyed = false;\n \n // UI state\n private isInspectMode = false;\n private showTrackers = false;\n private selectedElement: Element | null = null;\n private toolbarElement: HTMLElement | null = null;\n private panelElement: HTMLElement | null = null;\n private highlightElement: HTMLElement | null = null;\n private existingTrackers: ExistingTracker[] = [];\n private trackerHighlights: HTMLElement[] = [];\n \n // Dragging state\n private isDragging = false;\n private dragStartX = 0;\n private dragStartY = 0;\n private toolbarStartX = 0;\n private toolbarStartY = 0;\n \n // Event listeners\n private mouseMoveListener: ((e: MouseEvent) => void) | null = null;\n private clickListener: ((e: MouseEvent) => void) | null = null;\n private dragMoveListener: ((e: MouseEvent) => void) | null = null;\n private dragEndListener: ((e: MouseEvent) => void) | null = null;\n\n constructor(\n tracker: Tracker,\n sessionId: string,\n tenantId: string,\n apiUrl: string,\n config: DebugAgentConfig = {}\n ) {\n this.tracker = tracker;\n this.sessionId = sessionId;\n this.tenantId = tenantId;\n this.apiUrl = apiUrl;\n this.config = {\n debug: config.debug ?? false,\n };\n\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n this.initialize();\n }\n }\n\n /**\n * Initialize the debug agent\n */\n private async initialize(): Promise<void> {\n this.log('Initializing debug agent');\n await this.loadExistingTrackers();\n this.showToolbar();\n this.createHighlightElement();\n \n // Show trackers by default\n this.showTrackers = true;\n this.showTrackerHighlights();\n this.showTrackersList();\n }\n\n /**\n * Load existing trackers from API\n */\n private async loadExistingTrackers(): Promise<void> {\n try {\n const url = `${this.apiUrl}/v1/tenant/${encodeURIComponent(this.tenantId)}/trackers`;\n const response = await fetch(url);\n\n if (response.ok) {\n this.existingTrackers = await response.json();\n this.log('Loaded trackers:', this.existingTrackers);\n }\n } catch (error) {\n this.log('Failed to load trackers:', error);\n this.existingTrackers = [];\n }\n }\n\n /**\n * Show the debug toolbar\n */\n private showToolbar(): void {\n if (this.toolbarElement) return;\n\n const toolbar = document.createElement('div');\n toolbar.id = 'grain-debug-toolbar';\n toolbar.innerHTML = `\n <style>\n #grain-debug-toolbar {\n position: fixed;\n bottom: 20px;\n right: 20px;\n background: repeating-linear-gradient(\n 45deg,\n #fbbf24,\n #fbbf24 10px,\n #1e293b 10px,\n #1e293b 20px\n );\n border: 2px solid #1e293b;\n border-radius: 12px;\n padding: 6px;\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2), 0 2px 8px rgba(0, 0, 0, 0.1);\n z-index: 999999;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 13px;\n }\n \n .grain-toolbar-inner {\n display: flex;\n align-items: center;\n gap: 12px;\n background: white;\n border-radius: 6px;\n padding: 8px 12px;\n }\n \n #grain-debug-toolbar.dragging {\n cursor: move;\n user-select: none;\n }\n \n .grain-toolbar-header {\n display: flex;\n align-items: center;\n cursor: move;\n user-select: none;\n padding: 6px 10px;\n background: #1e293b;\n border-radius: 4px;\n margin-right: 4px;\n }\n \n .grain-toolbar-title {\n font-size: 11px;\n font-weight: 700;\n letter-spacing: 1.2px;\n text-transform: uppercase;\n color: #fbbf24;\n }\n \n .grain-toolbar-body {\n display: flex;\n align-items: center;\n gap: 10px;\n flex: 1;\n }\n \n .grain-toolbar-stats {\n display: flex;\n gap: 12px;\n padding: 6px 10px;\n background: #f8fafc;\n border-radius: 4px;\n margin-right: 4px;\n }\n \n .grain-stat {\n display: flex;\n align-items: baseline;\n gap: 6px;\n }\n \n .grain-stat-value {\n font-size: 18px;\n font-weight: 700;\n color: #1e293b;\n }\n \n .grain-stat-label {\n font-size: 11px;\n color: #64748b;\n font-weight: 500;\n }\n \n .grain-toolbar-actions {\n display: flex;\n gap: 8px;\n align-items: center;\n }\n \n #grain-debug-toolbar button {\n background: white;\n border: 1.5px solid #e2e8f0;\n color: #475569;\n padding: 8px 14px;\n border-radius: 8px;\n cursor: pointer;\n font-size: 12px;\n font-weight: 600;\n transition: all 0.2s;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n white-space: nowrap;\n }\n \n #grain-debug-toolbar button:hover {\n background: #f8fafc;\n border-color: #cbd5e1;\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n }\n \n #grain-debug-toolbar button.active {\n background: #fbbf24;\n color: #1e293b;\n border-color: #fbbf24;\n box-shadow: 0 2px 8px rgba(251, 191, 36, 0.3);\n }\n \n #grain-debug-toolbar button.danger {\n background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);\n border-color: #ef4444;\n color: white;\n }\n \n #grain-debug-toolbar button.danger:hover {\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(239, 68, 68, 0.25);\n }\n \n .grain-debug-highlight {\n position: absolute;\n pointer-events: none;\n border: 2px solid #10b981;\n background: rgba(16, 185, 129, 0.1);\n z-index: 999998;\n transition: all 0.1s;\n }\n \n .grain-tracker-highlight {\n position: absolute;\n pointer-events: none;\n border: 2px solid #6366f1;\n background: rgba(99, 102, 241, 0.08);\n z-index: 999997;\n transition: opacity 0.2s;\n }\n \n .grain-tracker-label {\n position: absolute;\n top: -28px;\n left: 0;\n background: #6366f1;\n color: white;\n padding: 4px 10px;\n border-radius: 6px;\n font-size: 11px;\n font-weight: 600;\n white-space: nowrap;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n pointer-events: none;\n }\n \n .grain-tracker-label::after {\n content: '';\n position: absolute;\n bottom: -4px;\n left: 10px;\n width: 0;\n height: 0;\n border-left: 4px solid transparent;\n border-right: 4px solid transparent;\n border-top: 4px solid #6366f1;\n }\n \n .grain-trackers-list {\n position: fixed;\n bottom: 80px;\n right: 20px;\n background: white;\n border: 1.5px solid #e2e8f0;\n border-radius: 10px;\n padding: 12px;\n max-height: 400px;\n width: 320px;\n overflow-y: auto;\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1), 0 2px 8px rgba(0, 0, 0, 0.06);\n z-index: 999998;\n }\n \n .grain-tracker-item {\n padding: 10px;\n background: #f8fafc;\n border-radius: 8px;\n margin-bottom: 8px;\n cursor: pointer;\n transition: all 0.2s;\n }\n \n .grain-tracker-item:hover {\n background: #f1f5f9;\n transform: translateX(4px);\n }\n \n .grain-tracker-item:last-child {\n margin-bottom: 0;\n }\n \n .grain-tracker-name {\n font-weight: 600;\n color: #1e293b;\n font-size: 13px;\n margin-bottom: 4px;\n }\n \n .grain-tracker-details {\n font-size: 11px;\n color: #64748b;\n display: flex;\n gap: 8px;\n align-items: center;\n }\n \n .grain-tracker-type {\n background: #dbeafe;\n color: #1e40af;\n padding: 2px 6px;\n border-radius: 4px;\n font-weight: 600;\n text-transform: uppercase;\n font-size: 9px;\n letter-spacing: 0.5px;\n }\n </style>\n <div class=\"grain-toolbar-inner\">\n <div class=\"grain-toolbar-header\" id=\"grain-toolbar-handle\">\n <div class=\"grain-toolbar-title\">Grain Debug</div>\n </div>\n <div class=\"grain-toolbar-body\">\n <div class=\"grain-toolbar-stats\">\n <div class=\"grain-stat\">\n <div class=\"grain-stat-value\">${this.existingTrackers.length}</div>\n <div class=\"grain-stat-label\">trackers</div>\n </div>\n <div class=\"grain-stat\">\n <div class=\"grain-stat-value\">${this.existingTrackers.filter(t => t.isEnabled).length}</div>\n <div class=\"grain-stat-label\">active</div>\n </div>\n </div>\n <div class=\"grain-toolbar-actions\">\n <button id=\"grain-debug-inspect\" type=\"button\">\n + New\n </button>\n <button id=\"grain-debug-trackers\" class=\"active\" type=\"button\">\n Hide\n </button>\n <button id=\"grain-debug-end\" class=\"danger\" type=\"button\">\n End Session\n </button>\n </div>\n </div>\n </div>\n <div id=\"grain-trackers-list-container\"></div>\n `;\n\n document.body.appendChild(toolbar);\n this.toolbarElement = toolbar;\n\n // Setup dragging\n const handle = toolbar.querySelector('#grain-toolbar-handle') as HTMLElement;\n if (handle) {\n handle.addEventListener('mousedown', (e) => this.startDrag(e));\n }\n\n // Add event listeners\n const inspectBtn = toolbar.querySelector('#grain-debug-inspect');\n const trackersBtn = toolbar.querySelector('#grain-debug-trackers');\n const endBtn = toolbar.querySelector('#grain-debug-end');\n\n if (inspectBtn) {\n inspectBtn.addEventListener('click', () => this.toggleInspectMode());\n }\n\n if (trackersBtn) {\n trackersBtn.addEventListener('click', () => this.toggleTrackerView());\n }\n\n if (endBtn) {\n endBtn.addEventListener('click', () => this.endDebug());\n }\n\n this.log('Toolbar shown');\n }\n\n /**\n * Create highlight element for hovering\n */\n private createHighlightElement(): void {\n if (this.highlightElement) return;\n\n const highlight = document.createElement('div');\n highlight.className = 'grain-debug-highlight';\n highlight.style.display = 'none';\n document.body.appendChild(highlight);\n this.highlightElement = highlight;\n }\n\n /**\n * Start dragging the toolbar\n */\n private startDrag(e: MouseEvent): void {\n if (!this.toolbarElement) return;\n \n this.isDragging = true;\n this.dragStartX = e.clientX;\n this.dragStartY = e.clientY;\n \n const rect = this.toolbarElement.getBoundingClientRect();\n this.toolbarStartX = rect.left;\n this.toolbarStartY = rect.top;\n \n this.toolbarElement.classList.add('dragging');\n \n this.dragMoveListener = (e: MouseEvent) => this.onDrag(e);\n this.dragEndListener = () => this.endDrag();\n \n document.addEventListener('mousemove', this.dragMoveListener);\n document.addEventListener('mouseup', this.dragEndListener);\n }\n\n /**\n * Handle drag movement\n */\n private onDrag(e: MouseEvent): void {\n if (!this.isDragging || !this.toolbarElement) return;\n \n const deltaX = e.clientX - this.dragStartX;\n const deltaY = e.clientY - this.dragStartY;\n \n const newX = this.toolbarStartX + deltaX;\n const newY = this.toolbarStartY + deltaY;\n \n // Keep toolbar within viewport\n const maxX = window.innerWidth - this.toolbarElement.offsetWidth;\n const maxY = window.innerHeight - this.toolbarElement.offsetHeight;\n \n const clampedX = Math.max(0, Math.min(newX, maxX));\n const clampedY = Math.max(0, Math.min(newY, maxY));\n \n this.toolbarElement.style.left = `${clampedX}px`;\n this.toolbarElement.style.top = `${clampedY}px`;\n this.toolbarElement.style.right = 'auto';\n this.toolbarElement.style.bottom = 'auto';\n }\n\n /**\n * End dragging\n */\n private endDrag(): void {\n if (!this.isDragging) return;\n \n this.isDragging = false;\n \n if (this.toolbarElement) {\n this.toolbarElement.classList.remove('dragging');\n }\n \n if (this.dragMoveListener) {\n document.removeEventListener('mousemove', this.dragMoveListener);\n this.dragMoveListener = null;\n }\n \n if (this.dragEndListener) {\n document.removeEventListener('mouseup', this.dragEndListener);\n this.dragEndListener = null;\n }\n }\n\n /**\n * Toggle tracker view\n */\n private toggleTrackerView(): void {\n this.showTrackers = !this.showTrackers;\n \n const trackersBtn = document.querySelector('#grain-debug-trackers');\n if (trackersBtn) {\n trackersBtn.textContent = this.showTrackers ? 'Hide' : 'View';\n trackersBtn.classList.toggle('active', this.showTrackers);\n }\n \n if (this.showTrackers) {\n this.showTrackerHighlights();\n this.showTrackersList();\n } else {\n this.hideTrackerHighlights();\n this.hideTrackersList();\n }\n }\n\n /**\n * Show tracker highlights on page\n */\n private showTrackerHighlights(): void {\n this.hideTrackerHighlights();\n \n for (const tracker of this.existingTrackers) {\n if (!tracker.isEnabled) continue;\n \n try {\n const element = this.findElementBySelector(tracker.selector);\n if (!element) continue;\n \n const rect = element.getBoundingClientRect();\n const highlight = document.createElement('div');\n highlight.className = 'grain-tracker-highlight';\n \n const label = document.createElement('div');\n label.className = 'grain-tracker-label';\n label.textContent = tracker.name;\n \n highlight.style.top = `${rect.top + window.scrollY}px`;\n highlight.style.left = `${rect.left + window.scrollX}px`;\n highlight.style.width = `${rect.width}px`;\n highlight.style.height = `${rect.height}px`;\n \n highlight.appendChild(label);\n document.body.appendChild(highlight);\n this.trackerHighlights.push(highlight);\n } catch (error) {\n this.log('Failed to highlight tracker:', tracker.name, error);\n }\n }\n }\n\n /**\n * Hide tracker highlights\n */\n private hideTrackerHighlights(): void {\n for (const highlight of this.trackerHighlights) {\n highlight.remove();\n }\n this.trackerHighlights = [];\n }\n\n /**\n * Show trackers list\n */\n private showTrackersList(): void {\n // Check if list already exists\n let list = document.querySelector('.grain-trackers-list') as HTMLElement;\n \n if (this.existingTrackers.length === 0) {\n if (list) list.remove();\n return;\n }\n \n if (!list) {\n list = document.createElement('div');\n list.className = 'grain-trackers-list';\n document.body.appendChild(list);\n }\n \n list.innerHTML = `\n ${this.existingTrackers.map(tracker => `\n <div class=\"grain-tracker-item\" data-tracker-id=\"${tracker.trackerId}\">\n <div class=\"grain-tracker-name\">${tracker.name}</div>\n <div class=\"grain-tracker-details\">\n <span class=\"grain-tracker-type\">${tracker.type}</span>\n <span>${tracker.urlScope}</span>\n ${!tracker.isEnabled ? '<span style=\"color: #ef4444;\">\u2022 Disabled</span>' : ''}\n </div>\n </div>\n `).join('')}\n `;\n \n // Add click handlers to scroll to elements\n list.querySelectorAll('.grain-tracker-item').forEach(item => {\n item.addEventListener('click', () => {\n const trackerId = item.getAttribute('data-tracker-id');\n const tracker = this.existingTrackers.find(t => t.trackerId === trackerId);\n if (tracker) {\n this.scrollToTracker(tracker);\n }\n });\n });\n }\n\n /**\n * Hide trackers list\n */\n private hideTrackersList(): void {\n const list = document.querySelector('.grain-trackers-list');\n if (list) {\n list.remove();\n }\n }\n\n /**\n * Scroll to and highlight a tracker element\n */\n private scrollToTracker(tracker: ExistingTracker): void {\n try {\n const element = this.findElementBySelector(tracker.selector);\n if (element) {\n element.scrollIntoView({ behavior: 'smooth', block: 'center' });\n \n // Flash the highlight\n const highlight = this.trackerHighlights.find(h => {\n const rect = element.getBoundingClientRect();\n const hRect = h.getBoundingClientRect();\n return Math.abs(hRect.top - rect.top) < 5;\n });\n \n if (highlight) {\n highlight.style.opacity = '0';\n setTimeout(() => {\n highlight.style.opacity = '1';\n }, 100);\n setTimeout(() => {\n highlight.style.opacity = '0';\n }, 300);\n setTimeout(() => {\n highlight.style.opacity = '1';\n }, 500);\n }\n }\n } catch (error) {\n this.log('Failed to scroll to tracker:', error);\n }\n }\n\n /**\n * Find element by XPath selector\n */\n private findElementBySelector(selector: string): Element | null {\n try {\n const result = document.evaluate(\n selector,\n document,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n return result.singleNodeValue as Element | null;\n } catch (error) {\n this.log('Failed to find element:', error);\n return null;\n }\n }\n\n /**\n * Toggle inspect mode\n */\n private toggleInspectMode(): void {\n if (this.isInspectMode) {\n this.disableInspectMode();\n } else {\n this.enableInspectMode();\n }\n }\n\n /**\n * Enable element inspection mode\n */\n private enableInspectMode(): void {\n if (this.isInspectMode) return;\n\n this.log('Enabling inspect mode');\n this.isInspectMode = true;\n\n // Update button state\n const inspectBtn = document.querySelector('#grain-debug-inspect');\n if (inspectBtn) {\n inspectBtn.classList.add('active');\n inspectBtn.textContent = 'Click Element';\n }\n\n // Add event listeners\n this.mouseMoveListener = (e: MouseEvent) => this.handleMouseMove(e);\n this.clickListener = (e: MouseEvent) => this.handleElementClick(e);\n\n document.addEventListener('mousemove', this.mouseMoveListener, true);\n document.addEventListener('click', this.clickListener, true);\n \n // Add ESC key listener to exit inspect mode\n document.addEventListener('keydown', this.handleEscapeKey);\n }\n\n /**\n * Handle ESC key to exit inspect mode\n */\n private handleEscapeKey = (e: KeyboardEvent): void => {\n if (e.key === 'Escape' && this.isInspectMode) {\n this.disableInspectMode();\n }\n };\n\n /**\n * Disable element inspection mode\n */\n private disableInspectMode(): void {\n if (!this.isInspectMode) return;\n\n this.log('Disabling inspect mode');\n this.isInspectMode = false;\n\n // Update button state\n const inspectBtn = document.querySelector('#grain-debug-inspect');\n if (inspectBtn) {\n inspectBtn.classList.remove('active');\n inspectBtn.textContent = '+ New';\n }\n\n // Remove event listeners\n if (this.mouseMoveListener) {\n document.removeEventListener('mousemove', this.mouseMoveListener, true);\n this.mouseMoveListener = null;\n }\n\n if (this.clickListener) {\n document.removeEventListener('click', this.clickListener, true);\n this.clickListener = null;\n }\n\n document.removeEventListener('keydown', this.handleEscapeKey);\n\n // Hide highlight\n if (this.highlightElement) {\n this.highlightElement.style.display = 'none';\n }\n }\n\n /**\n * Handle mouse move to highlight hovered element\n */\n private handleMouseMove(e: MouseEvent): void {\n if (!this.isInspectMode || !this.highlightElement) return;\n\n // Ignore if hovering over toolbar, panel, or tracker list\n const target = e.target as HTMLElement;\n if (target.closest('#grain-debug-toolbar') || \n target.closest('#grain-debug-panel') ||\n target.closest('.grain-trackers-list')) {\n this.highlightElement.style.display = 'none';\n return;\n }\n\n // Get element rect\n const element = e.target as HTMLElement;\n const rect = element.getBoundingClientRect();\n\n // Position highlight\n this.highlightElement.style.display = 'block';\n this.highlightElement.style.top = `${rect.top + window.scrollY}px`;\n this.highlightElement.style.left = `${rect.left + window.scrollX}px`;\n this.highlightElement.style.width = `${rect.width}px`;\n this.highlightElement.style.height = `${rect.height}px`;\n }\n\n /**\n * Handle element click to show creation panel\n */\n private handleElementClick(e: MouseEvent): void {\n if (!this.isInspectMode) return;\n\n const target = e.target as HTMLElement;\n \n // If clicking toolbar or tracker list, exit inspect mode and allow normal click\n if (target.closest('#grain-debug-toolbar') || target.closest('.grain-trackers-list')) {\n this.disableInspectMode();\n return;\n }\n\n // If clicking panel, prevent default but don't do anything\n if (target.closest('#grain-debug-panel')) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n\n // Otherwise, select the element\n e.preventDefault();\n e.stopPropagation();\n\n this.selectedElement = target;\n this.disableInspectMode();\n this.showCreationPanel(target);\n }\n\n /**\n * Show tracker creation panel\n */\n private showCreationPanel(element: Element): void {\n // Remove existing panel if any\n if (this.panelElement) {\n this.panelElement.remove();\n }\n\n const panel = document.createElement('div');\n panel.id = 'grain-debug-panel';\n \n // Extract element info\n const tagName = element.tagName.toLowerCase();\n const elementId = element.id;\n const elementText = element.textContent?.trim().substring(0, 50) || '';\n const xpath = this.getXPathForElement(element);\n \n panel.innerHTML = `\n <style>\n #grain-debug-panel {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background: repeating-linear-gradient(\n 45deg,\n #fbbf24,\n #fbbf24 10px,\n #1e293b 10px,\n #1e293b 20px\n );\n border: 2px solid #1e293b;\n border-radius: 16px;\n padding: 6px;\n width: 420px;\n max-width: 90vw;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.25), 0 8px 24px rgba(0, 0, 0, 0.15);\n z-index: 1000000;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n }\n \n .grain-panel-inner {\n background: white;\n border-radius: 10px;\n overflow: hidden;\n }\n \n .grain-panel-header {\n background: #1e293b;\n padding: 14px 18px;\n color: white;\n }\n \n .grain-panel-header h3 {\n margin: 0 0 4px 0;\n font-size: 16px;\n font-weight: 700;\n letter-spacing: 0.5px;\n color: #fbbf24;\n text-transform: uppercase;\n }\n \n .grain-panel-header p {\n margin: 0;\n font-size: 12px;\n opacity: 0.85;\n color: white;\n }\n \n .grain-panel-body {\n padding: 18px;\n }\n \n #grain-debug-panel .element-preview {\n background: #f8fafc;\n border: 1.5px solid #e2e8f0;\n border-radius: 8px;\n padding: 10px 12px;\n margin-bottom: 16px;\n font-size: 11px;\n color: #475569;\n }\n \n #grain-debug-panel .element-preview div {\n margin-bottom: 4px;\n }\n \n #grain-debug-panel .element-preview div:last-child {\n margin-bottom: 0;\n }\n \n #grain-debug-panel .element-preview strong {\n color: #1e293b;\n font-weight: 600;\n }\n \n #grain-debug-panel label {\n display: block;\n color: #1e293b;\n font-size: 12px;\n font-weight: 600;\n margin-bottom: 6px;\n }\n \n #grain-debug-panel input,\n #grain-debug-panel select {\n width: 100%;\n background: white;\n border: 1.5px solid #e2e8f0;\n border-radius: 8px;\n padding: 9px 12px;\n color: #1e293b;\n font-size: 13px;\n margin-bottom: 14px;\n box-sizing: border-box;\n transition: all 0.2s;\n }\n \n #grain-debug-panel input:focus,\n #grain-debug-panel select:focus {\n outline: none;\n border-color: #fbbf24;\n box-shadow: 0 0 0 3px rgba(251, 191, 36, 0.1);\n }\n \n #grain-debug-panel .button-group {\n display: flex;\n gap: 8px;\n margin-top: 18px;\n }\n \n #grain-debug-panel button {\n flex: 1;\n padding: 10px 16px;\n border: none;\n border-radius: 8px;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s;\n }\n \n #grain-debug-panel button.primary {\n background: #fbbf24;\n color: #1e293b;\n box-shadow: 0 2px 8px rgba(251, 191, 36, 0.3);\n }\n \n #grain-debug-panel button.primary:hover {\n background: #f59e0b;\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(251, 191, 36, 0.4);\n }\n \n #grain-debug-panel button.secondary {\n background: white;\n border: 1.5px solid #e2e8f0;\n color: #475569;\n }\n \n #grain-debug-panel button.secondary:hover {\n background: #f8fafc;\n border-color: #cbd5e1;\n }\n \n #grain-debug-panel .url-pattern-input {\n display: none;\n }\n \n #grain-debug-panel .url-pattern-input.visible {\n display: block;\n }\n </style>\n <div class=\"grain-panel-inner\">\n <div class=\"grain-panel-header\">\n <h3>Create Tracker</h3>\n <p>Set up automatic tracking for this element</p>\n </div>\n <div class=\"grain-panel-body\">\n <div class=\"element-preview\">\n <div><strong>Element:</strong> ${tagName}${elementId ? `#${elementId}` : ''}</div>\n ${elementText ? `<div><strong>Text:</strong> ${elementText}</div>` : ''}\n </div>\n <div>\n <label>Event Name</label>\n <input type=\"text\" id=\"grain-event-name\" placeholder=\"e.g., signup_button_click\" value=\"\" />\n </div>\n <div>\n <label>Type</label>\n <select id=\"grain-event-type\">\n <option value=\"metric\">Metric</option>\n <option value=\"conversion\">Conversion</option>\n </select>\n </div>\n <div>\n <label>URL Scope</label>\n <select id=\"grain-url-scope\">\n <option value=\"all\">All Pages</option>\n <option value=\"contains\" selected>This Page</option>\n <option value=\"equals\">Exact URL</option>\n </select>\n </div>\n <div class=\"url-pattern-input visible\" id=\"grain-url-pattern-container\">\n <label>URL Pattern</label>\n <input type=\"text\" id=\"grain-url-pattern\" placeholder=\"e.g., /pricing\" value=\"${window.location.pathname}\" />\n </div>\n <div class=\"button-group\">\n <button type=\"button\" class=\"secondary\" id=\"grain-cancel\">Cancel</button>\n <button type=\"button\" class=\"primary\" id=\"grain-create\">\u2713 Create</button>\n </div>\n </div>\n </div>\n `;\n\n document.body.appendChild(panel);\n this.panelElement = panel;\n\n // Auto-generate event name suggestion\n const eventNameInput = panel.querySelector('#grain-event-name') as HTMLInputElement;\n if (eventNameInput) {\n const suggestedName = this.generateEventName(element);\n eventNameInput.value = suggestedName;\n eventNameInput.select();\n }\n\n // Handle URL scope change\n const urlScopeSelect = panel.querySelector('#grain-url-scope') as HTMLSelectElement;\n const urlPatternContainer = panel.querySelector('#grain-url-pattern-container');\n const urlPatternInput = panel.querySelector('#grain-url-pattern') as HTMLInputElement;\n \n if (urlScopeSelect && urlPatternContainer) {\n urlScopeSelect.addEventListener('change', () => {\n if (urlScopeSelect.value === 'all') {\n urlPatternContainer.classList.remove('visible');\n } else {\n urlPatternContainer.classList.add('visible');\n if (urlPatternInput && !urlPatternInput.value) {\n urlPatternInput.value = window.location.pathname;\n }\n }\n });\n }\n\n // Handle buttons\n const cancelBtn = panel.querySelector('#grain-cancel');\n const createBtn = panel.querySelector('#grain-create');\n\n if (cancelBtn) {\n cancelBtn.addEventListener('click', () => this.hideCreationPanel());\n }\n\n if (createBtn) {\n createBtn.addEventListener('click', () => this.handleCreateTracker(xpath));\n }\n }\n\n /**\n * Generate suggested event name from element\n */\n private generateEventName(element: Element): string {\n const tagName = element.tagName.toLowerCase();\n const elementId = element.id;\n const elementText = element.textContent?.trim().toLowerCase().replace(/\\s+/g, '_').substring(0, 30) || '';\n \n // Try to generate meaningful name\n if (elementId) {\n return `${elementId}_click`;\n } else if (elementText) {\n return `${elementText}_click`;\n } else if (tagName === 'button') {\n return 'button_click';\n } else if (tagName === 'a') {\n return 'link_click';\n } else {\n return `${tagName}_click`;\n }\n }\n\n /**\n * Handle tracker creation\n */\n private async handleCreateTracker(selector: string): Promise<void> {\n if (!this.panelElement) return;\n\n const eventNameInput = this.panelElement.querySelector('#grain-event-name') as HTMLInputElement;\n const eventTypeSelect = this.panelElement.querySelector('#grain-event-type') as HTMLSelectElement;\n const urlScopeSelect = this.panelElement.querySelector('#grain-url-scope') as HTMLSelectElement;\n const urlPatternInput = this.panelElement.querySelector('#grain-url-pattern') as HTMLInputElement;\n\n if (!eventNameInput || !eventTypeSelect || !urlScopeSelect) return;\n\n const eventName = eventNameInput.value.trim();\n const eventType = eventTypeSelect.value;\n const urlScope = urlScopeSelect.value;\n const urlPattern = urlPatternInput?.value.trim() || undefined;\n\n // Validate\n if (!eventName) {\n alert('Please enter an event name');\n return;\n }\n\n if (!eventName.match(/^[a-zA-Z0-9_-]+$/)) {\n alert('Event name can only contain letters, numbers, underscores, and hyphens');\n return;\n }\n\n if ((urlScope === 'contains' || urlScope === 'equals') && !urlPattern) {\n alert('Please enter a URL pattern');\n return;\n }\n\n try {\n // Show loading state\n const createBtn = this.panelElement.querySelector('#grain-create') as HTMLButtonElement;\n if (createBtn) {\n createBtn.textContent = 'Creating...';\n createBtn.disabled = true;\n }\n\n // Create tracker\n await this.createTracker(eventName, eventType, selector, urlScope, urlPattern);\n\n // Success\n this.hideCreationPanel();\n this.showSuccessMessage(`Tracker \"${eventName}\" created successfully!`);\n \n // Reload trackers and update UI\n await this.loadExistingTrackers();\n this.updateToolbarStats();\n if (this.showTrackers) {\n this.showTrackerHighlights();\n this.showTrackersList();\n }\n \n this.log('Tracker created:', eventName);\n } catch (error) {\n alert('Failed to create tracker. Please try again.');\n this.log('Failed to create tracker:', error);\n \n // Reset button\n const createBtn = this.panelElement.querySelector('#grain-create') as HTMLButtonElement;\n if (createBtn) {\n createBtn.textContent = 'Create Tracker';\n createBtn.disabled = false;\n }\n }\n }\n\n /**\n * Create tracker via API\n */\n private async createTracker(\n name: string,\n type: string,\n selector: string,\n urlScope: string,\n urlPattern?: string\n ): Promise<void> {\n const url = `${this.apiUrl}/v1/tenant/${encodeURIComponent(this.tenantId)}/debug-sessions/${this.sessionId}/trackers`;\n \n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n name,\n type,\n selector,\n urlScope,\n urlPattern,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to create tracker: ${response.status}`);\n }\n }\n\n /**\n * Hide creation panel\n */\n private hideCreationPanel(): void {\n if (this.panelElement) {\n this.panelElement.remove();\n this.panelElement = null;\n }\n this.selectedElement = null;\n }\n\n /**\n * Show success message\n */\n private showSuccessMessage(message: string): void {\n const toast = document.createElement('div');\n toast.style.cssText = `\n position: fixed;\n top: 20px;\n left: 50%;\n transform: translateX(-50%) translateY(-20px);\n background: linear-gradient(135deg, #10b981 0%, #059669 100%);\n color: white;\n padding: 14px 24px;\n border-radius: 12px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 14px;\n font-weight: 600;\n box-shadow: 0 12px 32px rgba(16, 185, 129, 0.3), 0 4px 12px rgba(0, 0, 0, 0.15);\n z-index: 1000000;\n display: flex;\n align-items: center;\n gap: 10px;\n animation: slideDown 0.3s ease-out forwards;\n `;\n toast.innerHTML = `\n <style>\n @keyframes slideDown {\n to {\n transform: translateX(-50%) translateY(0);\n }\n }\n </style>\n <span style=\"font-size: 18px;\">\u2713</span>\n <span>${message}</span>\n `;\n\n document.body.appendChild(toast);\n\n setTimeout(() => {\n toast.style.animation = 'slideDown 0.3s ease-in reverse';\n setTimeout(() => {\n toast.remove();\n }, 300);\n }, 2700);\n }\n\n /**\n * End debug session\n */\n private async endDebug(): Promise<void> {\n try {\n // Call end session API\n const url = `${this.apiUrl}/v1/tenant/${encodeURIComponent(this.tenantId)}/debug-sessions/${this.sessionId}/end`;\n \n await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n } catch (error) {\n this.log('Failed to end debug session:', error);\n }\n\n // Clean up and reload page\n this.destroy();\n \n // Remove debug params from URL and reload\n const url = new URL(window.location.href);\n url.searchParams.delete('grain_debug');\n url.searchParams.delete('grain_session');\n window.location.href = url.toString();\n }\n\n /**\n * Get XPath for element\n */\n private getXPathForElement(element: Element): string {\n if (element.id) {\n return `//*[@id=\"${element.id}\"]`;\n }\n\n const parts: string[] = [];\n let current: Element | null = element;\n\n while (current && current.nodeType === Node.ELEMENT_NODE) {\n let index = 0;\n let sibling: Element | null = current;\n\n while (sibling) {\n if (sibling.nodeType === Node.ELEMENT_NODE && sibling.tagName === current.tagName) {\n index++;\n }\n sibling = sibling.previousElementSibling;\n }\n\n const tagName = current.tagName.toLowerCase();\n const pathIndex = index > 1 ? `[${index}]` : '';\n parts.unshift(`${tagName}${pathIndex}`);\n\n current = current.parentElement;\n }\n\n return parts.length ? `/${parts.join('/')}` : '';\n }\n\n /**\n * Log debug messages\n */\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[DebugAgent]', ...args);\n }\n }\n\n /**\n * Update toolbar stats\n */\n private updateToolbarStats(): void {\n if (!this.toolbarElement) return;\n \n const totalStat = this.toolbarElement.querySelector('.grain-stat:nth-child(1) .grain-stat-value');\n const activeStat = this.toolbarElement.querySelector('.grain-stat:nth-child(2) .grain-stat-value');\n \n if (totalStat) {\n totalStat.textContent = String(this.existingTrackers.length);\n }\n if (activeStat) {\n activeStat.textContent = String(this.existingTrackers.filter(t => t.isEnabled).length);\n }\n }\n\n /**\n * Destroy the debug agent\n */\n destroy(): void {\n if (this.isDestroyed) return;\n\n this.log('Destroying debug agent');\n this.isDestroyed = true;\n\n this.disableInspectMode();\n this.hideTrackerHighlights();\n this.endDrag();\n\n if (this.toolbarElement) {\n this.toolbarElement.remove();\n this.toolbarElement = null;\n }\n\n if (this.panelElement) {\n this.panelElement.remove();\n this.panelElement = null;\n }\n\n if (this.highlightElement) {\n this.highlightElement.remove();\n this.highlightElement = null;\n }\n }\n}\n", "/**\n * Grain Analytics Web SDK\n * A lightweight, dependency-free TypeScript SDK for sending analytics events to Grain's REST API\n */\n\nimport { ConsentManager, ConsentState, ConsentMode } from './consent';\nimport { setCookie, getCookie, deleteCookie, areCookiesEnabled, CookieConfig } from './cookies';\nimport { ActivityDetector } from './activity';\nimport { HeartbeatManager, type HeartbeatTracker } from './heartbeat';\nimport { PageTrackingManager, type PageTracker } from './page-tracking';\nimport { IdManager, type IdMode } from './id-manager';\nimport {\n categorizeReferrer,\n parseUTMParameters,\n getOrCreateFirstTouchAttribution,\n getSessionUTMParameters,\n getFirstTouchAttribution,\n type ReferrerCategory,\n type UTMParameters,\n type FirstTouchAttribution,\n} from './attribution';\n\n// Re-export attribution types and functions\nexport type { ReferrerCategory, UTMParameters, FirstTouchAttribution };\nexport { categorizeReferrer, parseUTMParameters };\n\n// Re-export timezone-country utilities\nexport { getCountry, getCountryCodeFromTimezone, getState } from './countries';\n\n// Re-export auto-tracking types\nexport type {\n InteractionConfig,\n SectionConfig,\n AutoTrackingConfig,\n SectionViewData,\n SectionTrackingOptions,\n} from './types/auto-tracking';\n\nexport interface GrainEvent {\n eventName: string;\n userId?: string;\n properties?: Record<string, unknown>;\n timestamp?: Date;\n}\n\nexport interface EventPayload {\n eventName: string;\n userId: string;\n properties: Record<string, unknown>;\n}\n\nexport type AuthStrategy = 'NONE' | 'SERVER_SIDE' | 'JWT';\n\nexport interface AuthProvider {\n getToken(): Promise<string> | string;\n}\n\n// Re-export privacy types\nexport type { ConsentState, ConsentMode, CookieConfig };\n\nexport interface GrainConfig {\n tenantId: string;\n apiUrl?: string;\n authStrategy?: AuthStrategy;\n secretKey?: string; // For SERVER_SIDE auth\n authProvider?: AuthProvider; // For JWT auth\n userId?: string; // Global user ID for all events\n batchSize?: number;\n flushInterval?: number; // milliseconds\n retryAttempts?: number;\n retryDelay?: number; // milliseconds\n maxEventsPerRequest?: number; // Maximum events to send in a single API request\n debug?: boolean;\n // Remote Config options\n defaultConfigurations?: Record<string, string>; // Default values for configurations\n configCacheKey?: string; // Custom cache key for configurations\n configRefreshInterval?: number; // Auto-refresh interval in milliseconds (default: 5 minutes)\n enableConfigCache?: boolean; // Enable/disable configuration caching (default: true)\n // Privacy & Consent options (v2.0)\n consentMode?: ConsentMode; // 'cookieless' | 'gdpr-strict' | 'gdpr-opt-out' (default: 'cookieless')\n waitForConsent?: boolean; // Queue events until consent is granted (default: false, only for gdpr-strict)\n // Deprecated: enableCookies - cookies no longer used for user identification\n // Deprecated: anonymizeIP - IP addresses never stored (GeoIP used instead)\n disableAutoProperties?: boolean; // Disable automatic property collection (default: false)\n allowedProperties?: string[]; // Whitelist of allowed event properties (default: all)\n // Automatic Tracking options\n enableHeartbeat?: boolean; // Enable heartbeat tracking (default: true)\n heartbeatActiveInterval?: number; // Active interval in ms (default: 120000 - 2 min)\n heartbeatInactiveInterval?: number; // Inactive interval in ms (default: 300000 - 5 min)\n enableAutoPageView?: boolean; // Enable automatic page view tracking (default: true)\n stripQueryParams?: boolean; // Strip query params from URLs (default: true)\n stripHash?: boolean; // Strip hash from URLs (default: false)\n // Heatmap Tracking options\n enableHeatmapTracking?: boolean; // Enable heatmap tracking (default: true)\n}\n\nexport interface SendEventOptions {\n flush?: boolean; // Force immediate send\n}\n\nexport interface SetPropertyOptions {\n userId?: string; // Override global userId\n}\n\nexport interface LoginOptions {\n userId?: string; // User ID to set\n authToken?: string; // Auth token to set for JWT auth\n authStrategy?: AuthStrategy; // Override auth strategy\n}\n\nexport interface PropertyPayload {\n userId: string;\n [key: string]: string; // All property values must be strings\n}\n\n// Remote Config interfaces\nexport interface RemoteConfigRequest {\n userId: string;\n immediateKeys: string[];\n properties?: Record<string, string>;\n currentUrl?: string; // Optional current URL for page-specific configs\n}\n\nexport interface RemoteConfigResponse {\n userId: string;\n snapshotId: string;\n configurations: Record<string, string>;\n isFinal: boolean;\n qualifiedSegments: string[];\n qualifiedRuleSets: string[];\n timestamp: string;\n isFromCache: boolean;\n autoTrackingConfig?: {\n interactions: Array<{\n eventName: string;\n description: string;\n selector: string;\n priority: number;\n label: string;\n }>;\n sections: Array<{\n sectionName: string;\n description: string;\n sectionType: string;\n selector: string;\n importance: number;\n }>;\n };\n}\n\nexport interface RemoteConfigOptions {\n immediateKeys?: string[];\n properties?: Record<string, string>;\n userId?: string; // Override global userId\n forceRefresh?: boolean; // Force fetch from API, bypass cache\n currentUrl?: string; // Optional current URL for page-specific configs (auto-tracking)\n}\n\nexport interface RemoteConfigCache {\n configurations: Record<string, string>;\n snapshotId: string;\n timestamp: string;\n userId: string;\n}\n\nexport type ConfigChangeListener = (configurations: Record<string, string>) => void;\n\n// Template event interfaces\nexport interface LoginEventProperties extends Record<string, unknown> {\n method?: string; // 'email', 'google', 'facebook', etc.\n success?: boolean;\n errorMessage?: string;\n loginAttempt?: number;\n rememberMe?: boolean;\n twoFactorEnabled?: boolean;\n}\n\nexport interface SignupEventProperties extends Record<string, unknown> {\n method?: string; // 'email', 'google', 'facebook', etc.\n source?: string; // 'landing_page', 'referral', 'ad', etc.\n plan?: string; // 'free', 'pro', 'enterprise', etc.\n success?: boolean;\n errorMessage?: string;\n}\n\nexport interface CheckoutEventProperties extends Record<string, unknown> {\n orderId?: string;\n total?: number;\n currency?: string;\n items?: Array<{\n id: string;\n name: string;\n price: number;\n quantity: number;\n }>;\n paymentMethod?: string; // 'credit_card', 'paypal', 'stripe', etc.\n success?: boolean;\n errorMessage?: string;\n couponCode?: string;\n discount?: number;\n}\n\nexport interface PageViewEventProperties extends Record<string, unknown> {\n page?: string;\n title?: string;\n referrer?: string;\n url?: string;\n userAgent?: string;\n screenResolution?: string;\n viewportSize?: string;\n}\n\nexport interface PurchaseEventProperties extends Record<string, unknown> {\n orderId?: string;\n total?: number;\n currency?: string;\n items?: Array<{\n id: string;\n name: string;\n price: number;\n quantity: number;\n category?: string;\n }>;\n paymentMethod?: string;\n shippingMethod?: string;\n tax?: number;\n shipping?: number;\n discount?: number;\n couponCode?: string;\n}\n\nexport interface SearchEventProperties extends Record<string, unknown> {\n query?: string;\n results?: number;\n filters?: Record<string, unknown>;\n sortBy?: string;\n category?: string;\n success?: boolean;\n}\n\nexport interface AddToCartEventProperties extends Record<string, unknown> {\n itemId?: string;\n itemName?: string;\n price?: number;\n quantity?: number;\n currency?: string;\n category?: string;\n variant?: string;\n}\n\nexport interface RemoveFromCartEventProperties extends Record<string, unknown> {\n itemId?: string;\n itemName?: string;\n price?: number;\n quantity?: number;\n currency?: string;\n category?: string;\n variant?: string;\n}\n\n// Error handling interfaces\nexport interface ErrorDigest {\n eventCount: number;\n totalProperties: number;\n totalSize: number;\n eventNames: string[];\n userIds: string[];\n}\n\nexport interface FormattedError {\n code: string;\n message: string;\n digest: ErrorDigest;\n timestamp: string;\n context: string;\n originalError?: unknown;\n}\n\n/**\n * Main Grain Analytics client\n * \n * Features:\n * - Automatic UUIDv4 generation for anonymous users\n * - Login/logout functionality for dynamic auth token injection\n * - Persistent anonymous user ID across sessions (when consent is granted)\n * - Support for multiple auth strategies (NONE, SERVER_SIDE, JWT)\n * - GDPR-compliant consent management with strict opt-in mode\n * - Optional cookie support for cross-session tracking\n * \n * GDPR Compliance (Opt-in Mode):\n * - Without consent: Only ephemeral session IDs (memory-only) are used\n * - No cookies or localStorage identifiers until consent is granted\n * - Exceptions: User explicitly identified via identify()/login() or JWT auth\n * - Remote config cache and consent preferences use localStorage (functional/necessary)\n */\ntype RequiredConfig = Required<Omit<GrainConfig, 'secretKey' | 'authProvider' | 'userId' | 'cookieOptions' | 'allowedProperties'>> & {\n secretKey?: string;\n authProvider?: AuthProvider;\n userId?: string;\n cookieOptions?: CookieConfig;\n allowedProperties?: string[];\n};\n\nexport class GrainAnalytics implements HeartbeatTracker, PageTracker {\n private config: RequiredConfig;\n private eventQueue: EventPayload[] = [];\n private waitingForConsentQueue: EventPayload[] = [];\n private flushTimer: number | null = null;\n private isDestroyed = false;\n private globalUserId: string | null = null;\n private persistentAnonymousUserId: string | null = null; // Deprecated: use idManager instead\n // Remote Config properties\n private configCache: RemoteConfigCache | null = null;\n private configRefreshTimer: number | null = null;\n private configChangeListeners: ConfigChangeListener[] = [];\n private configFetchPromise: Promise<RemoteConfigResponse> | null = null;\n // Privacy & Consent properties (v2.0)\n private consentManager: ConsentManager;\n private idManager: IdManager;\n private cookiesEnabled: boolean = false; // Deprecated: cookies no longer used for IDs\n // Automatic Tracking properties\n private activityDetector: ActivityDetector | null = null;\n private heartbeatManager: HeartbeatManager | null = null;\n private pageTrackingManager: PageTrackingManager | null = null;\n private ephemeralSessionId: string | null = null;\n private eventCountSinceLastHeartbeat: number = 0;\n // Auto-tracking properties\n private interactionTrackingManager: any | null = null;\n private sectionTrackingManager: any | null = null;\n private heatmapTrackingManager: any | null = null;\n // Session tracking\n private sessionStartTime: number = Date.now();\n private sessionEventCount: number = 0;\n // Debug mode properties\n private debugAgent: any | null = null;\n private isDebugMode: boolean = false;\n\n constructor(config: GrainConfig) {\n this.config = {\n apiUrl: 'https://api.grainql.com',\n authStrategy: 'NONE',\n batchSize: 50,\n flushInterval: 5000, // 5 seconds\n retryAttempts: 3,\n retryDelay: 1000, // 1 second\n maxEventsPerRequest: 160, // Maximum events per API request\n debug: false,\n // Remote Config defaults\n defaultConfigurations: {},\n configCacheKey: 'grain_config',\n configRefreshInterval: 300000, // 5 minutes\n enableConfigCache: true,\n // Privacy defaults (v2.0)\n consentMode: 'COOKIELESS', // Default: privacy-first, no permanent tracking\n waitForConsent: false,\n disableAutoProperties: false,\n // Automatic Tracking defaults\n enableHeartbeat: true,\n heartbeatActiveInterval: 120000, // 2 minutes\n heartbeatInactiveInterval: 300000, // 5 minutes\n enableAutoPageView: true,\n stripQueryParams: true, // Privacy-first: strip by default\n stripHash: false,\n // Heatmap Tracking defaults\n enableHeatmapTracking: true,\n ...config,\n tenantId: config.tenantId,\n };\n\n // Initialize consent manager (v2.0)\n this.consentManager = new ConsentManager(this.config.tenantId, this.config.consentMode);\n\n // Initialize ID manager (v2.0)\n const idMode: IdMode = this.consentManager.getIdMode();\n this.idManager = new IdManager({\n mode: idMode,\n tenantId: this.config.tenantId,\n useLocalStorage: true, // For permanent IDs when consented\n });\n\n // Set global userId if provided in config\n if (config.userId) {\n this.globalUserId = config.userId;\n }\n\n this.validateConfig();\n // Deprecated: initializePersistentAnonymousUserId() - now handled by IdManager\n this.setupBeforeUnload();\n this.startFlushTimer();\n this.initializeConfigCache();\n\n // Initialize ephemeral session ID (memory-only, not persisted)\n this.ephemeralSessionId = this.generateUUID();\n\n // Initialize automatic tracking (browser only)\n if (typeof window !== 'undefined') {\n // Check for debug mode before initializing tracking\n this.checkAndInitializeDebugMode();\n \n this.initializeAutomaticTracking();\n // Track session start\n this.trackSessionStart();\n // Initialize heatmap tracking if enabled\n if (this.config.enableHeatmapTracking) {\n this.initializeHeatmapTracking();\n }\n }\n\n // Set up consent change listener to sync IdManager and flush waiting events (v2.0)\n this.consentManager.addListener((state) => {\n // Sync IdManager with consent state\n const idMode = this.consentManager.getIdMode();\n this.idManager.setMode(idMode);\n \n if (state.granted) {\n this.handleConsentGranted();\n }\n });\n }\n\n private validateConfig(): void {\n if (!this.config.tenantId) {\n throw new Error('Grain Analytics: tenantId is required');\n }\n\n if (this.config.authStrategy === 'SERVER_SIDE' && !this.config.secretKey) {\n throw new Error('Grain Analytics: secretKey is required for SERVER_SIDE auth strategy');\n }\n\n if (this.config.authStrategy === 'JWT' && !this.config.authProvider) {\n throw new Error('Grain Analytics: authProvider is required for JWT auth strategy');\n }\n }\n\n /**\n * Generate a UUID v4 string\n */\n private generateUUID(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n \n // Fallback for environments without crypto.randomUUID\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n const r = Math.random() * 16 | 0;\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n }\n\n /**\n * Check if we should allow persistent storage (GDPR compliance)\n * \n * Returns true if:\n * - Consent has been granted, OR\n * - Not in opt-in mode, OR\n * - User has been explicitly identified by the site (login/identify), OR\n * - Using JWT auth strategy (functional/essential purpose)\n */\n private shouldAllowPersistentStorage(): boolean {\n const hasConsent = this.consentManager.hasConsent('analytics');\n const isCookieless = this.config.consentMode === 'COOKIELESS';\n const userExplicitlyIdentified = !!this.globalUserId;\n const isJWTAuth = this.config.authStrategy === 'JWT';\n \n // Never allow persistent storage in cookieless mode\n if (isCookieless) return false;\n \n // Allow persistent storage if any of these conditions are met\n return hasConsent || userExplicitlyIdentified || isJWTAuth;\n }\n\n /**\n * Generate a proper UUIDv4 identifier for anonymous user ID\n */\n private generateAnonymousUserId(): string {\n return this.generateUUID();\n }\n\n /**\n * Initialize persistent anonymous user ID from cookies or localStorage\n * Priority: Cookie \u2192 localStorage \u2192 generate new\n * \n * GDPR Compliance: In opt-in mode without consent, we skip loading/saving\n * persistent IDs unless the user has been explicitly identified by the site\n * or when using JWT auth (functional/essential purpose)\n */\n private initializePersistentAnonymousUserId(): void {\n if (typeof window === 'undefined') return;\n\n // Check if we should avoid persistent storage (GDPR compliance)\n if (!this.shouldAllowPersistentStorage()) {\n this.log('Opt-in mode without consent: skipping persistent ID initialization (GDPR compliance)');\n return; // Don't load or create persistent ID\n }\n\n const storageKey = `grain_anonymous_user_id_${this.config.tenantId}`;\n const cookieName = '_grain_uid';\n \n try {\n // Try to load from cookie first if enabled\n if (this.cookiesEnabled) {\n const cookieValue = getCookie(cookieName);\n if (cookieValue) {\n this.persistentAnonymousUserId = cookieValue;\n this.log('Loaded persistent anonymous user ID from cookie:', this.persistentAnonymousUserId);\n return;\n }\n }\n\n // Fallback to localStorage\n const stored = localStorage.getItem(storageKey);\n if (stored) {\n this.persistentAnonymousUserId = stored;\n this.log('Loaded persistent anonymous user ID from localStorage:', this.persistentAnonymousUserId);\n \n // Migrate to cookie if enabled\n if (this.cookiesEnabled) {\n this.savePersistentAnonymousUserId(stored);\n }\n } else {\n // Generate new UUIDv4 anonymous user ID\n this.persistentAnonymousUserId = this.generateAnonymousUserId();\n this.savePersistentAnonymousUserId(this.persistentAnonymousUserId);\n this.log('Generated new persistent anonymous user ID:', this.persistentAnonymousUserId);\n }\n } catch (error) {\n this.log('Failed to initialize persistent anonymous user ID:', error);\n // Fallback: generate temporary ID without persistence\n this.persistentAnonymousUserId = this.generateAnonymousUserId();\n }\n }\n\n /**\n * Save persistent anonymous user ID to cookie and/or localStorage\n * \n * GDPR Compliance: In opt-in mode without consent, we don't persist IDs\n * unless the user has been explicitly identified or using JWT auth\n */\n private savePersistentAnonymousUserId(userId: string): void {\n if (typeof window === 'undefined') return;\n\n // Check if we should avoid persistent storage (GDPR compliance)\n if (!this.shouldAllowPersistentStorage()) {\n this.log('Opt-in mode without consent: skipping persistent ID save (GDPR compliance)');\n return; // Don't save persistent ID\n }\n\n const storageKey = `grain_anonymous_user_id_${this.config.tenantId}`;\n const cookieName = '_grain_uid';\n\n try {\n // Save to cookie if enabled\n if (this.cookiesEnabled) {\n const cookieOptions: CookieConfig = {\n maxAge: 365 * 24 * 60 * 60, // 365 days\n sameSite: 'lax',\n secure: typeof window !== 'undefined' && window.location.protocol === 'https:',\n ...this.config.cookieOptions,\n };\n setCookie(cookieName, userId, cookieOptions);\n }\n\n // Always save to localStorage as fallback\n localStorage.setItem(storageKey, userId);\n } catch (error) {\n this.log('Failed to save persistent anonymous user ID:', error);\n }\n }\n\n /**\n * Get the effective user ID (v2.0)\n * \n * Privacy-first implementation:\n * - Returns global userId if explicitly set (via identify/login)\n * - Otherwise uses IdManager to generate:\n * - Daily rotating ID (cookieless mode)\n * - Permanent ID (with consent)\n */\n private getEffectiveUserIdInternal(): string {\n // Explicit user identification always takes precedence\n if (this.globalUserId) {\n return this.globalUserId;\n }\n \n // Use IdManager to generate appropriate ID based on consent\n return this.idManager.getCurrentUserId();\n }\n\n log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[Grain Analytics]', ...args);\n }\n }\n\n /**\n * Create error digest from events\n */\n private createErrorDigest(events: EventPayload[]): ErrorDigest {\n const eventNames = [...new Set(events.map(e => e.eventName))];\n const userIds = [...new Set(events.map(e => e.userId))];\n \n let totalProperties = 0;\n let totalSize = 0;\n \n events.forEach(event => {\n const properties = event.properties || {};\n totalProperties += Object.keys(properties).length;\n totalSize += JSON.stringify(event).length;\n });\n\n return {\n eventCount: events.length,\n totalProperties,\n totalSize,\n eventNames,\n userIds,\n };\n }\n\n /**\n * Format error with beautiful structure\n */\n private formatError(\n error: unknown,\n context: string,\n events?: EventPayload[]\n ): FormattedError {\n const digest = events ? this.createErrorDigest(events) : {\n eventCount: 0,\n totalProperties: 0,\n totalSize: 0,\n eventNames: [],\n userIds: [],\n };\n\n let code = 'UNKNOWN_ERROR';\n let message = 'An unknown error occurred';\n\n if (error instanceof Error) {\n message = error.message;\n \n // Determine error code based on error type and message\n if (message.includes('fetch failed') || message.includes('network error')) {\n code = 'NETWORK_ERROR';\n } else if (message.includes('timeout')) {\n code = 'TIMEOUT_ERROR';\n } else if (message.includes('HTTP 4')) {\n code = 'CLIENT_ERROR';\n } else if (message.includes('HTTP 5')) {\n code = 'SERVER_ERROR';\n } else if (message.includes('JSON')) {\n code = 'PARSE_ERROR';\n } else if (message.includes('auth') || message.includes('unauthorized')) {\n code = 'AUTH_ERROR';\n } else if (message.includes('rate limit') || message.includes('429')) {\n code = 'RATE_LIMIT_ERROR';\n } else {\n code = 'GENERAL_ERROR';\n }\n } else if (typeof error === 'string') {\n message = error;\n code = 'STRING_ERROR';\n } else if (error && typeof error === 'object' && 'status' in error) {\n const status = (error as { status: number }).status;\n code = `HTTP_${status}`;\n message = `HTTP ${status} error`;\n }\n\n return {\n code,\n message,\n digest,\n timestamp: new Date().toISOString(),\n context,\n originalError: error,\n };\n }\n\n /**\n * Log formatted error gracefully\n */\n private logError(formattedError: FormattedError): void {\n // Only log errors in debug mode to reduce noise in production\n if (!this.config.debug) return;\n \n const { code, message, digest, timestamp, context } = formattedError;\n \n const errorOutput = {\n '\uD83D\uDEA8 Grain Analytics Error': {\n 'Error Code': code,\n 'Message': message,\n 'Context': context,\n 'Timestamp': timestamp,\n 'Event Digest': {\n 'Events': digest.eventCount,\n 'Properties': digest.totalProperties,\n 'Size (bytes)': digest.totalSize,\n 'Event Names': digest.eventNames.length > 0 ? digest.eventNames.join(', ') : 'None',\n 'User IDs': digest.userIds.length > 0 ? digest.userIds.slice(0, 3).join(', ') + (digest.userIds.length > 3 ? '...' : '') : 'None',\n }\n }\n };\n\n console.error('\uD83D\uDEA8 Grain Analytics Error:', errorOutput);\n console.error(`[Grain Analytics] ${code}: ${message} (${context}) - Events: ${digest.eventCount}, Props: ${digest.totalProperties}, Size: ${digest.totalSize}B`);\n }\n\n /**\n * Safely execute a function with error handling\n */\n private async safeExecute<T>(\n fn: () => Promise<T>,\n context: string,\n events?: EventPayload[]\n ): Promise<T | null> {\n try {\n return await fn();\n } catch (error) {\n const formattedError = this.formatError(error, context, events);\n this.logError(formattedError);\n return null;\n }\n }\n\n private formatEvent(event: GrainEvent): EventPayload {\n const properties = event.properties || {};\n \n // Auto-enrich events with session-level attribution properties\n // This ensures UTM parameters and attribution data are available on ALL events, not just page_view\n if (!this.config.disableAutoProperties && typeof window !== 'undefined') {\n const hasConsent = this.consentManager.hasConsent('analytics');\n \n // Only enrich if not a system event (they handle their own properties)\n const isSystemEvent = event.eventName.startsWith('_grain_');\n \n if (!isSystemEvent && hasConsent) {\n // Get session UTM parameters\n const sessionUTMs = getSessionUTMParameters();\n if (sessionUTMs) {\n if (sessionUTMs.utm_source) properties.utm_source = sessionUTMs.utm_source;\n if (sessionUTMs.utm_medium) properties.utm_medium = sessionUTMs.utm_medium;\n if (sessionUTMs.utm_campaign) properties.utm_campaign = sessionUTMs.utm_campaign;\n if (sessionUTMs.utm_term) properties.utm_term = sessionUTMs.utm_term;\n if (sessionUTMs.utm_content) properties.utm_content = sessionUTMs.utm_content;\n }\n \n // Get first-touch attribution\n const firstTouch = getFirstTouchAttribution(this.config.tenantId);\n if (firstTouch) {\n properties.first_touch_source = firstTouch.source;\n properties.first_touch_medium = firstTouch.medium;\n properties.first_touch_campaign = firstTouch.campaign;\n properties.first_touch_referrer_category = firstTouch.referrer_category;\n }\n \n // Add session ID if not already present\n if (!properties.session_id) {\n properties.session_id = this.getSessionId();\n }\n }\n }\n \n return {\n eventName: event.eventName,\n userId: event.userId || this.getEffectiveUserIdInternal(),\n properties,\n };\n }\n\n private async getAuthHeaders(): Promise<Record<string, string>> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n switch (this.config.authStrategy) {\n case 'NONE':\n break;\n case 'SERVER_SIDE':\n headers['Authorization'] = `Chase ${this.config.secretKey}`;\n break;\n case 'JWT':\n if (this.config.authProvider) {\n const token = await this.config.authProvider.getToken();\n headers['Authorization'] = `Bearer ${token}`;\n }\n break;\n }\n\n return headers;\n }\n\n private async delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n private isRetriableError(error: unknown): boolean {\n if (error instanceof Error) {\n // Check for specific network or fetch errors\n const message = error.message.toLowerCase();\n if (message.includes('fetch failed')) return true;\n if (message === 'network error') return true; // Exact match to avoid \"Non-network error\"\n if (message.includes('timeout')) return true;\n if (message.includes('connection')) return true;\n }\n \n // Check for HTTP status codes that are retriable\n if (typeof error === 'object' && error !== null && 'status' in error) {\n const status = (error as { status: number }).status;\n return status >= 500 || status === 429; // Server errors or rate limiting\n }\n \n return false;\n }\n\n private async sendEvents(events: EventPayload[]): Promise<void> {\n if (events.length === 0) return;\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= this.config.retryAttempts; attempt++) {\n try {\n const headers = await this.getAuthHeaders();\n const url = `${this.config.apiUrl}/v1/events/${encodeURIComponent(this.config.tenantId)}/multi`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(events),\n });\n\n if (!response.ok) {\n let errorMessage = `HTTP ${response.status}`;\n try {\n const errorBody = await response.json();\n if (errorBody?.message) {\n errorMessage = errorBody.message;\n }\n } catch {\n const errorText = await response.text();\n if (errorText) {\n errorMessage = errorText;\n }\n }\n \n const error = new Error(`Failed to send events: ${errorMessage}`) as Error & { status?: number };\n error.status = response.status;\n throw error;\n }\n\n this.log(`Successfully sent ${events.length} events`);\n return; // Success, exit retry loop\n \n } catch (error) {\n lastError = error;\n \n if (attempt === this.config.retryAttempts) {\n // Last attempt, don't retry - log error gracefully\n const formattedError = this.formatError(error, `sendEvents (attempt ${attempt + 1}/${this.config.retryAttempts + 1})`, events);\n this.logError(formattedError);\n return; // Don't throw, just return gracefully\n }\n \n if (!this.isRetriableError(error)) {\n // Non-retriable error, don't retry - log error gracefully\n const formattedError = this.formatError(error, `sendEvents (non-retriable error)`, events);\n this.logError(formattedError);\n return; // Don't throw, just return gracefully\n }\n \n const delayMs = this.config.retryDelay * Math.pow(2, attempt); // Exponential backoff\n this.log(`Retrying in ${delayMs}ms after error:`, error);\n await this.delay(delayMs);\n }\n }\n }\n\n private async sendEventsWithBeacon(events: EventPayload[]): Promise<void> {\n if (events.length === 0) return;\n\n try {\n const headers = await this.getAuthHeaders();\n const url = `${this.config.apiUrl}/v1/events/${encodeURIComponent(this.config.tenantId)}/multi`;\n\n // Send events array directly (not wrapped in object) to match API expectation\n const body = JSON.stringify(events);\n\n // Beacon API doesn't support custom headers, so only use it for unauthenticated requests\n const needsAuth = this.config.authStrategy !== 'NONE';\n\n // Try beacon API first (more reliable for page unload, but only if no auth needed)\n if (!needsAuth && typeof navigator !== 'undefined' && 'sendBeacon' in navigator) {\n const blob = new Blob([body], { type: 'application/json' });\n const success = navigator.sendBeacon(url, blob);\n \n if (success) {\n this.log(`Successfully sent ${events.length} events via beacon`);\n return;\n }\n }\n\n // Use fetch with keepalive (supports headers and works during page unload)\n await fetch(url, {\n method: 'POST',\n headers,\n body,\n keepalive: true,\n });\n } catch (error) {\n // Log error gracefully for beacon failures (page unload scenarios)\n const formattedError = this.formatError(error, 'sendEventsWithBeacon', events);\n this.logError(formattedError);\n }\n }\n\n private startFlushTimer(): void {\n if (typeof window === 'undefined') return;\n \n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n }\n\n this.flushTimer = window.setInterval(() => {\n if (this.eventQueue.length > 0) {\n this.flush().catch((error) => {\n const formattedError = this.formatError(error, 'auto-flush');\n this.logError(formattedError);\n });\n }\n }, this.config.flushInterval);\n }\n\n private setupBeforeUnload(): void {\n if (typeof window === 'undefined') return;\n\n const handleBeforeUnload = () => {\n // Track session end\n this.trackSessionEnd();\n \n if (this.eventQueue.length > 0) {\n // Use beacon API for reliable delivery during page unload\n const eventsToSend = [...this.eventQueue];\n this.eventQueue = [];\n \n const chunks = this.chunkEvents(eventsToSend, this.config.maxEventsPerRequest);\n \n // Send first chunk with beacon (most important for page unload)\n if (chunks.length > 0) {\n this.sendEventsWithBeacon(chunks[0]).catch(() => {\n // Silently fail - page is unloading\n });\n }\n }\n };\n\n // Handle page unload\n window.addEventListener('beforeunload', handleBeforeUnload);\n window.addEventListener('pagehide', handleBeforeUnload);\n \n // Handle visibility change (page hidden)\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden' && this.eventQueue.length > 0) {\n const eventsToSend = [...this.eventQueue];\n this.eventQueue = [];\n \n const chunks = this.chunkEvents(eventsToSend, this.config.maxEventsPerRequest);\n \n // Send first chunk with beacon (most important for page hidden)\n if (chunks.length > 0) {\n this.sendEventsWithBeacon(chunks[0]).catch(() => {\n // Silently fail\n });\n }\n }\n });\n }\n\n /**\n * Initialize automatic tracking (heartbeat and page views)\n */\n private initializeAutomaticTracking(): void {\n if (this.config.enableHeartbeat) {\n try {\n this.activityDetector = new ActivityDetector();\n this.heartbeatManager = new HeartbeatManager(\n this,\n this.activityDetector,\n {\n activeInterval: this.config.heartbeatActiveInterval,\n inactiveInterval: this.config.heartbeatInactiveInterval,\n debug: this.config.debug,\n }\n );\n } catch (error) {\n this.log('Failed to initialize heartbeat tracking:', error);\n }\n }\n\n if (this.config.enableAutoPageView) {\n try {\n this.pageTrackingManager = new PageTrackingManager(\n this,\n {\n stripQueryParams: this.config.stripQueryParams,\n stripHash: this.config.stripHash,\n debug: this.config.debug,\n tenantId: this.config.tenantId,\n }\n );\n } catch (error) {\n this.log('Failed to initialize page view tracking:', error);\n }\n }\n\n // Initialize auto-tracking when config is available\n this.initializeAutoTracking();\n }\n\n /**\n * Initialize heatmap tracking\n */\n private initializeHeatmapTracking(): void {\n if (typeof window === 'undefined') return;\n \n try {\n this.log('Initializing heatmap tracking');\n \n import('./heatmap-tracking').then(({ HeatmapTrackingManager }) => {\n try {\n this.heatmapTrackingManager = new HeatmapTrackingManager(\n this,\n {\n scrollDebounceDelay: 100,\n batchDelay: 2000,\n maxBatchSize: 20,\n debug: this.config.debug,\n }\n );\n this.log('Heatmap tracking initialized');\n } catch (error) {\n this.log('Failed to initialize heatmap tracking:', error);\n }\n }).catch((error) => {\n this.log('Failed to load heatmap tracking module:', error);\n });\n } catch (error) {\n this.log('Failed to initialize heatmap tracking:', error);\n }\n }\n\n /**\n * Initialize auto-tracking (interactions and sections)\n */\n private async initializeAutoTracking(): Promise<void> {\n try {\n this.log('Initializing auto-tracking');\n \n // Fetch remote config to get auto-tracking configuration\n const userId = this.globalUserId || this.persistentAnonymousUserId || this.generateUUID();\n const currentUrl = typeof window !== 'undefined' ? window.location.href : '';\n \n // Fetch config with currentUrl\n const request: RemoteConfigRequest = {\n userId,\n immediateKeys: [],\n properties: {},\n currentUrl, // Add current URL to request\n };\n\n const headers = await this.getAuthHeaders();\n const url = `${this.config.apiUrl}/v1/client/${encodeURIComponent(this.config.tenantId)}/config/configurations`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n this.log('Failed to fetch auto-tracking config:', response.status);\n return;\n }\n\n const configResponse: RemoteConfigResponse = await response.json();\n \n if (configResponse.autoTrackingConfig) {\n this.log('Auto-tracking config loaded');\n this.setupAutoTrackingManagers(configResponse.autoTrackingConfig);\n }\n } catch (error) {\n this.log('Failed to initialize auto-tracking:', error);\n // Fail silently - auto-tracking is optional\n }\n }\n\n /**\n * Setup auto-tracking managers\n */\n private setupAutoTrackingManagers(config: NonNullable<RemoteConfigResponse['autoTrackingConfig']>): void {\n this.log('Setting up auto-tracking managers');\n \n // Lazy load the managers to avoid bundling them if not needed\n if (config.interactions && config.interactions.length > 0) {\n this.log('Loading interaction tracking:', config.interactions.length, 'interactions');\n import('./interaction-tracking').then(({ InteractionTrackingManager }) => {\n try {\n this.interactionTrackingManager = new InteractionTrackingManager(\n this,\n config.interactions,\n {\n debug: this.config.debug,\n enableMutationObserver: true,\n mutationDebounceDelay: 500,\n tenantId: this.config.tenantId,\n apiUrl: this.config.apiUrl,\n }\n );\n this.log('Interaction tracking initialized');\n } catch (error) {\n this.log('Failed to initialize interaction tracking:', error);\n }\n }).catch((error) => {\n this.log('Failed to load interaction tracking module:', error);\n });\n }\n\n if (config.sections && config.sections.length > 0) {\n this.log('Loading section tracking:', config.sections.length, 'sections');\n import('./section-tracking').then(({ SectionTrackingManager }) => {\n try {\n this.sectionTrackingManager = new SectionTrackingManager(\n this,\n config.sections,\n {\n minDwellTime: 1000,\n scrollVelocityThreshold: 500,\n intersectionThreshold: 0.1,\n debounceDelay: 100,\n batchDelay: 2000,\n debug: this.config.debug,\n }\n );\n this.log('Section tracking initialized');\n } catch (error) {\n this.log('Failed to initialize section tracking:', error);\n }\n }).catch((error) => {\n this.log('Failed to load section tracking module:', error);\n });\n }\n }\n\n /**\n * Track session start event\n */\n private trackSessionStart(): void {\n if (typeof window === 'undefined') return;\n\n const hasConsent = this.consentManager.hasConsent('analytics');\n \n const properties: Record<string, unknown> = {\n session_id: this.getSessionId(),\n timestamp: this.sessionStartTime,\n };\n\n if (hasConsent) {\n const referrer = document.referrer || '';\n const currentUrl = window.location.href;\n \n // Parse UTM parameters\n const utmParams = parseUTMParameters(currentUrl);\n const sessionUTMs = getSessionUTMParameters() || utmParams;\n \n // Get first-touch attribution\n const firstTouch = getOrCreateFirstTouchAttribution(\n this.config.tenantId,\n referrer,\n currentUrl,\n sessionUTMs\n );\n\n // Landing page\n properties.landing_page = window.location.pathname;\n \n // Referrer info\n if (referrer) {\n properties.referrer = referrer;\n properties.referrer_domain = new URL(referrer).hostname;\n properties.referrer_category = categorizeReferrer(referrer, currentUrl);\n } else {\n properties.referrer_category = 'direct';\n }\n\n // UTM parameters\n if (sessionUTMs.utm_source) properties.utm_source = sessionUTMs.utm_source;\n if (sessionUTMs.utm_medium) properties.utm_medium = sessionUTMs.utm_medium;\n if (sessionUTMs.utm_campaign) properties.utm_campaign = sessionUTMs.utm_campaign;\n if (sessionUTMs.utm_term) properties.utm_term = sessionUTMs.utm_term;\n if (sessionUTMs.utm_content) properties.utm_content = sessionUTMs.utm_content;\n\n // First-touch attribution\n properties.first_touch_source = firstTouch.source;\n properties.first_touch_medium = firstTouch.medium;\n properties.first_touch_campaign = firstTouch.campaign;\n properties.first_touch_referrer_category = firstTouch.referrer_category;\n\n // Device and browser info\n properties.device = this.getDeviceType();\n properties.screen_resolution = `${screen.width}x${screen.height}`;\n properties.viewport = `${window.innerWidth}x${window.innerHeight}`;\n properties.browser = this.getBrowser();\n properties.os = this.getOS();\n properties.language = navigator.language || '';\n properties.timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n }\n\n this.trackSystemEvent('_grain_session_start', properties);\n this.log('Session started');\n }\n\n /**\n * Track session end event\n */\n private trackSessionEnd(): void {\n if (typeof window === 'undefined') return;\n\n const hasConsent = this.consentManager.hasConsent('analytics');\n const sessionDuration = Date.now() - this.sessionStartTime;\n \n const properties: Record<string, unknown> = {\n session_id: this.getSessionId(),\n session_duration: Math.floor(sessionDuration / 1000), // In seconds for easier querying\n duration: sessionDuration, // Keep for backward compatibility\n event_count: this.sessionEventCount,\n timestamp: Date.now(),\n };\n\n if (hasConsent && this.pageTrackingManager) {\n const pageCount = this.pageTrackingManager.getPageViewCount();\n properties.pages_per_session = pageCount;\n properties.page_count = pageCount; // Keep for backward compatibility\n }\n\n this.trackSystemEvent('_grain_session_end', properties);\n this.log('Session ended');\n }\n\n /**\n * Detect browser name\n */\n private getBrowser(): string {\n if (typeof navigator === 'undefined') return 'Unknown';\n const ua = navigator.userAgent;\n if (ua.includes('Firefox/')) return 'Firefox';\n if (ua.includes('Edg/')) return 'Edge';\n if (ua.includes('Chrome/')) return 'Chrome';\n if (ua.includes('Safari/') && !ua.includes('Chrome/')) return 'Safari';\n if (ua.includes('Opera/') || ua.includes('OPR/')) return 'Opera';\n return 'Unknown';\n }\n\n /**\n * Detect operating system\n */\n private getOS(): string {\n if (typeof navigator === 'undefined') return 'Unknown';\n const ua = navigator.userAgent;\n if (ua.includes('Win')) return 'Windows';\n if (ua.includes('Mac')) return 'macOS';\n if (ua.includes('Linux')) return 'Linux';\n if (ua.includes('Android')) return 'Android';\n if (ua.includes('iOS') || ua.includes('iPhone') || ua.includes('iPad')) return 'iOS';\n return 'Unknown';\n }\n\n /**\n * Detect device type (Mobile, Tablet, Desktop)\n */\n private getDeviceType(): string {\n if (typeof window === 'undefined' || typeof navigator === 'undefined') return 'Unknown';\n \n const ua = navigator.userAgent;\n const width = window.innerWidth;\n \n // Check for tablet-specific indicators\n if (ua.includes('iPad') || (ua.includes('Android') && !ua.includes('Mobile'))) {\n return 'Tablet';\n }\n \n // Check for mobile indicators\n if (ua.includes('Mobile') || ua.includes('iPhone') || ua.includes('Android')) {\n return 'Mobile';\n }\n \n // Fallback to screen width detection\n if (width < 768) {\n return 'Mobile';\n } else if (width >= 768 && width < 1024) {\n return 'Tablet';\n }\n \n return 'Desktop';\n }\n\n /**\n * Handle consent granted - upgrade ephemeral session to persistent user\n */\n private handleConsentGranted(): void {\n this.flushWaitingForConsentQueue();\n\n // Initialize persistent ID now that consent is granted (if not already initialized)\n if (!this.persistentAnonymousUserId) {\n this.initializePersistentAnonymousUserId();\n this.log('Initialized persistent ID after consent grant');\n }\n\n // Track consent granted event with mapping from ephemeral to persistent ID\n if (this.ephemeralSessionId) {\n this.trackSystemEvent('_grain_consent_granted', {\n previous_session_id: this.ephemeralSessionId,\n new_user_id: this.getEffectiveUserId(),\n timestamp: Date.now(),\n });\n }\n }\n\n /**\n * Track system events that bypass consent checks (for necessary/functional tracking)\n */\n trackSystemEvent(eventName: string, properties: Record<string, unknown>): void {\n if (this.isDestroyed) return;\n\n const hasConsent = this.consentManager.hasConsent('analytics');\n\n // Create event with appropriate user ID\n // v2.0: Always use IdManager which returns daily rotating ID or permanent ID based on consent\n const event: EventPayload = {\n eventName,\n userId: this.getEffectiveUserId(), // IdManager handles daily vs permanent based on consent\n properties: {\n ...properties,\n _minimal: !hasConsent, // Flag to indicate minimal tracking (daily rotating ID)\n _consent_status: hasConsent ? 'granted' : 'pending',\n },\n };\n\n // Bypass consent check for necessary system events\n this.eventQueue.push(event);\n this.eventCountSinceLastHeartbeat++;\n\n this.log(`Queued system event: ${eventName}`);\n\n // Consider flushing\n if (this.eventQueue.length >= this.config.batchSize) {\n this.flush().catch((error) => {\n const formattedError = this.formatError(error, 'flush system event');\n this.logError(formattedError);\n });\n }\n }\n\n /**\n * Get ephemeral session ID (memory-only, not persisted)\n */\n getEphemeralSessionId(): string {\n if (!this.ephemeralSessionId) {\n this.ephemeralSessionId = this.generateUUID();\n }\n return this.ephemeralSessionId;\n }\n\n /**\n * Get the current page path from page tracker\n */\n getCurrentPage(): string | null {\n return this.pageTrackingManager?.getCurrentPage() || null;\n }\n\n /**\n * Get event count since last heartbeat\n */\n getEventCountSinceLastHeartbeat(): number {\n return this.eventCountSinceLastHeartbeat;\n }\n\n /**\n * Reset event count since last heartbeat\n */\n resetEventCountSinceLastHeartbeat(): void {\n this.eventCountSinceLastHeartbeat = 0;\n }\n\n /**\n * Get the activity detector (for internal use by tracking managers)\n */\n getActivityDetector(): ActivityDetector {\n if (!this.activityDetector) {\n throw new Error('Activity detector not initialized');\n }\n return this.activityDetector;\n }\n\n /**\n * Get the effective user ID (public method)\n */\n getEffectiveUserId(): string {\n return this.getEffectiveUserIdInternal();\n }\n\n /**\n * Get the session ID (ephemeral or persistent based on consent)\n */\n getSessionId(): string {\n const hasConsent = this.consentManager.hasConsent('analytics');\n return hasConsent ? this.getEffectiveUserId() : this.getEphemeralSessionId();\n }\n\n /**\n * Track an analytics event\n */\n async track(eventName: string, properties?: Record<string, unknown>, options?: SendEventOptions): Promise<void>;\n async track(event: GrainEvent, options?: SendEventOptions): Promise<void>;\n async track(\n eventOrName: string | GrainEvent,\n propertiesOrOptions?: Record<string, unknown> | SendEventOptions,\n options?: SendEventOptions\n ): Promise<void> {\n try {\n if (this.isDestroyed) {\n const error = new Error('Grain Analytics: Client has been destroyed');\n const formattedError = this.formatError(error, 'track (client destroyed)');\n this.logError(formattedError);\n return;\n }\n\n let event: GrainEvent;\n let opts: SendEventOptions = {};\n\n if (typeof eventOrName === 'string') {\n event = {\n eventName: eventOrName,\n properties: propertiesOrOptions as Record<string, unknown>,\n };\n opts = options || {};\n } else {\n event = eventOrName;\n opts = propertiesOrOptions as SendEventOptions || {};\n }\n\n // Filter properties if whitelist is enabled\n if (this.config.allowedProperties && event.properties) {\n const filtered: Record<string, unknown> = {};\n for (const key of this.config.allowedProperties) {\n if (key in event.properties) {\n filtered[key] = event.properties[key];\n }\n }\n event.properties = filtered;\n }\n\n const formattedEvent = this.formatEvent(event);\n\n // Check if we should wait for consent (only if explicitly configured)\n if (this.consentManager.shouldWaitForConsent() && this.config.waitForConsent) {\n // Queue event until consent is granted\n this.waitingForConsentQueue.push(formattedEvent);\n this.log(`Event waiting for consent: ${event.eventName}`, event.properties);\n return;\n }\n\n // v2.0: GDPR Strict falls back to cookieless mode (daily rotating IDs)\n // Events are never blocked - IdManager already provides correct ID (daily or permanent)\n const hasConsent = this.consentManager.hasConsent('analytics');\n \n // Add tracking flags to indicate consent status\n formattedEvent.properties = {\n ...formattedEvent.properties,\n _minimal: !hasConsent, // Flag: true = daily rotating ID, false = permanent ID\n _consent_status: hasConsent ? 'granted' : 'pending',\n };\n\n this.eventQueue.push(formattedEvent);\n this.eventCountSinceLastHeartbeat++;\n this.sessionEventCount++;\n this.log(`Queued event: ${event.eventName}`);\n\n // Check if we should flush immediately\n if (opts.flush || this.eventQueue.length >= this.config.batchSize) {\n await this.flush();\n }\n } catch (error) {\n const formattedError = this.formatError(error, 'track');\n this.logError(formattedError);\n }\n }\n\n /**\n * Flush events that were waiting for consent\n */\n private flushWaitingForConsentQueue(): void {\n if (this.waitingForConsentQueue.length === 0) return;\n\n this.log(`Flushing ${this.waitingForConsentQueue.length} events waiting for consent`);\n \n // Move waiting events to main queue\n this.eventQueue.push(...this.waitingForConsentQueue);\n this.waitingForConsentQueue = [];\n\n // Flush immediately\n this.flush().catch((error) => {\n const formattedError = this.formatError(error, 'flush waiting for consent queue');\n this.logError(formattedError);\n });\n }\n\n /**\n * Identify a user (sets userId for subsequent events)\n */\n identify(userId: string): void {\n this.log(`Identified user: ${userId}`);\n this.globalUserId = userId;\n // Clear persistent anonymous user ID since we now have a real user ID\n this.persistentAnonymousUserId = null;\n }\n\n /**\n * Set global user ID for all subsequent events\n */\n setUserId(userId: string | null): void {\n this.log(`Set global user ID: ${userId}`);\n this.globalUserId = userId;\n \n if (userId) {\n // Clear persistent anonymous user ID if setting a real user ID\n this.persistentAnonymousUserId = null;\n } else {\n // If clearing user ID, ensure we have an identifier\n if (!this.persistentAnonymousUserId) {\n this.persistentAnonymousUserId = this.generateAnonymousUserId();\n \n // Try to persist the new anonymous ID (respects GDPR opt-in mode)\n this.savePersistentAnonymousUserId(this.persistentAnonymousUserId);\n }\n }\n }\n\n /**\n * Get current global user ID\n */\n getUserId(): string | null {\n return this.globalUserId;\n }\n\n /**\n * Get current effective user ID (global userId or persistent anonymous ID)\n */\n getEffectiveUserIdPublic(): string {\n return this.getEffectiveUserIdInternal();\n }\n\n /**\n * Login with auth token or userId on the fly\n * \n * @example\n * // Login with userId only\n * client.login({ userId: 'user123' });\n * \n * // Login with auth token (automatically sets authStrategy to JWT)\n * client.login({ authToken: 'jwt-token-here' });\n * \n * // Login with both userId and auth token\n * client.login({ userId: 'user123', authToken: 'jwt-token-here' });\n * \n * // Override auth strategy\n * client.login({ userId: 'user123', authStrategy: 'SERVER_SIDE' });\n */\n login(options: LoginOptions): void {\n try {\n if (this.isDestroyed) {\n const error = new Error('Grain Analytics: Client has been destroyed');\n const formattedError = this.formatError(error, 'login (client destroyed)');\n this.logError(formattedError);\n return;\n }\n\n // Set userId if provided\n if (options.userId) {\n this.log(`Login: Setting user ID to ${options.userId}`);\n this.globalUserId = options.userId;\n // Clear persistent anonymous user ID since we now have a real user ID\n this.persistentAnonymousUserId = null;\n }\n\n // Handle auth token if provided\n if (options.authToken) {\n this.log('Login: Setting auth token');\n // Update auth strategy to JWT if not already set\n if (this.config.authStrategy === 'NONE') {\n this.config.authStrategy = 'JWT';\n }\n \n // Create a simple auth provider that returns the provided token\n this.config.authProvider = {\n getToken: () => options.authToken!\n };\n }\n\n // Override auth strategy if provided\n if (options.authStrategy) {\n this.log(`Login: Setting auth strategy to ${options.authStrategy}`);\n this.config.authStrategy = options.authStrategy;\n }\n\n this.log(`Login successful. Effective user ID: ${this.getEffectiveUserIdInternal()}`);\n } catch (error) {\n const formattedError = this.formatError(error, 'login');\n this.logError(formattedError);\n }\n }\n\n /**\n * Logout and clear user session, fall back to UUIDv4 identifier\n * \n * @example\n * // Logout user and return to anonymous mode\n * client.logout();\n * \n * // After logout, events will use the persistent UUIDv4 identifier\n * client.track('page_view', { page: 'home' });\n */\n logout(): void {\n try {\n if (this.isDestroyed) {\n const error = new Error('Grain Analytics: Client has been destroyed');\n const formattedError = this.formatError(error, 'logout (client destroyed)');\n this.logError(formattedError);\n return;\n }\n\n this.log('Logout: Clearing user session');\n \n // Clear global user ID\n this.globalUserId = null;\n \n // Reset auth strategy to NONE\n this.config.authStrategy = 'NONE';\n this.config.authProvider = undefined;\n \n // Generate new UUIDv4 identifier if we don't have one\n if (!this.persistentAnonymousUserId) {\n this.persistentAnonymousUserId = this.generateAnonymousUserId();\n \n // Try to persist the new anonymous ID\n if (typeof window !== 'undefined') {\n try {\n const storageKey = `grain_anonymous_user_id_${this.config.tenantId}`;\n localStorage.setItem(storageKey, this.persistentAnonymousUserId);\n } catch (error) {\n this.log('Failed to persist new anonymous user ID after logout:', error);\n }\n }\n }\n \n this.log(`Logout successful. Effective user ID: ${this.getEffectiveUserIdInternal()}`);\n } catch (error) {\n const formattedError = this.formatError(error, 'logout');\n this.logError(formattedError);\n }\n }\n\n /**\n * Set user properties\n */\n async setProperty(properties: Record<string, unknown>, options?: SetPropertyOptions): Promise<void> {\n try {\n if (this.isDestroyed) {\n const error = new Error('Grain Analytics: Client has been destroyed');\n const formattedError = this.formatError(error, 'setProperty (client destroyed)');\n this.logError(formattedError);\n return;\n }\n\n const userId = options?.userId || this.getEffectiveUserIdInternal();\n \n // Validate property count (max 4 properties)\n const propertyKeys = Object.keys(properties);\n if (propertyKeys.length > 4) {\n const error = new Error('Grain Analytics: Maximum 4 properties allowed per request');\n const formattedError = this.formatError(error, 'setProperty (validation)');\n this.logError(formattedError);\n return;\n }\n\n if (propertyKeys.length === 0) {\n const error = new Error('Grain Analytics: At least one property is required');\n const formattedError = this.formatError(error, 'setProperty (validation)');\n this.logError(formattedError);\n return;\n }\n\n // Serialize all values to strings\n const serializedProperties: Record<string, string> = {};\n for (const [key, value] of Object.entries(properties)) {\n if (value === null || value === undefined) {\n serializedProperties[key] = '';\n } else if (typeof value === 'string') {\n serializedProperties[key] = value;\n } else {\n serializedProperties[key] = JSON.stringify(value);\n }\n }\n\n const payload: PropertyPayload = {\n userId,\n ...serializedProperties,\n };\n\n await this.sendProperties(payload);\n } catch (error) {\n const formattedError = this.formatError(error, 'setProperty');\n this.logError(formattedError);\n }\n }\n\n /**\n * Send properties to the API\n */\n private async sendProperties(payload: PropertyPayload): Promise<void> {\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= this.config.retryAttempts; attempt++) {\n try {\n const headers = await this.getAuthHeaders();\n const url = `${this.config.apiUrl}/v1/events/${encodeURIComponent(this.config.tenantId)}/properties`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n let errorMessage = `HTTP ${response.status}`;\n try {\n const errorBody = await response.json();\n if (errorBody?.message) {\n errorMessage = errorBody.message;\n }\n } catch {\n const errorText = await response.text();\n if (errorText) {\n errorMessage = errorText;\n }\n }\n \n const error = new Error(`Failed to set properties: ${errorMessage}`) as Error & { status?: number };\n error.status = response.status;\n throw error;\n }\n\n this.log(`Successfully set properties for user ${payload.userId}`);\n return; // Success, exit retry loop\n \n } catch (error) {\n lastError = error;\n \n if (attempt === this.config.retryAttempts) {\n // Last attempt, don't retry - log error gracefully\n const formattedError = this.formatError(error, `sendProperties (attempt ${attempt + 1}/${this.config.retryAttempts + 1})`);\n this.logError(formattedError);\n return; // Don't throw, just return gracefully\n }\n \n if (!this.isRetriableError(error)) {\n // Non-retriable error, don't retry - log error gracefully\n const formattedError = this.formatError(error, 'sendProperties (non-retriable error)');\n this.logError(formattedError);\n return; // Don't throw, just return gracefully\n }\n \n const delayMs = this.config.retryDelay * Math.pow(2, attempt); // Exponential backoff\n this.log(`Retrying in ${delayMs}ms after error:`, error);\n await this.delay(delayMs);\n }\n }\n }\n\n // Template event methods\n\n /**\n * Track user login event\n */\n async trackLogin(properties?: LoginEventProperties, options?: SendEventOptions): Promise<void> {\n try {\n return await this.track('login', properties, options);\n } catch (error) {\n const formattedError = this.formatError(error, 'trackLogin');\n this.logError(formattedError);\n }\n }\n\n /**\n * Track user signup event\n */\n async trackSignup(properties?: SignupEventProperties, options?: SendEventOptions): Promise<void> {\n try {\n return await this.track('signup', properties, options);\n } catch (error) {\n const formattedError = this.formatError(error, 'trackSignup');\n this.logError(formattedError);\n }\n }\n\n /**\n * Track checkout event\n */\n async trackCheckout(properties?: CheckoutEventProperties, options?: SendEventOptions): Promise<void> {\n try {\n return await this.track('checkout', properties, options);\n } catch (error) {\n const formattedError = this.formatError(error, 'trackCheckout');\n this.logError(formattedError);\n }\n }\n\n /**\n * Track page view event\n */\n async trackPageView(properties?: PageViewEventProperties, options?: SendEventOptions): Promise<void> {\n try {\n return await this.track('page_view', properties, options);\n } catch (error) {\n const formattedError = this.formatError(error, 'trackPageView');\n this.logError(formattedError);\n }\n }\n\n /**\n * Track purchase event\n */\n async trackPurchase(properties?: PurchaseEventProperties, options?: SendEventOptions): Promise<void> {\n try {\n return await this.track('purchase', properties, options);\n } catch (error) {\n const formattedError = this.formatError(error, 'trackPurchase');\n this.logError(formattedError);\n }\n }\n\n /**\n * Track search event\n */\n async trackSearch(properties?: SearchEventProperties, options?: SendEventOptions): Promise<void> {\n try {\n return await this.track('search', properties, options);\n } catch (error) {\n const formattedError = this.formatError(error, 'trackSearch');\n this.logError(formattedError);\n }\n }\n\n /**\n * Track add to cart event\n */\n async trackAddToCart(properties?: AddToCartEventProperties, options?: SendEventOptions): Promise<void> {\n try {\n return await this.track('add_to_cart', properties, options);\n } catch (error) {\n const formattedError = this.formatError(error, 'trackAddToCart');\n this.logError(formattedError);\n }\n }\n\n /**\n * Track remove from cart event\n */\n async trackRemoveFromCart(properties?: RemoveFromCartEventProperties, options?: SendEventOptions): Promise<void> {\n try {\n return await this.track('remove_from_cart', properties, options);\n } catch (error) {\n const formattedError = this.formatError(error, 'trackRemoveFromCart');\n this.logError(formattedError);\n }\n }\n\n /**\n * Manually flush all queued events\n */\n async flush(): Promise<void> {\n try {\n if (this.eventQueue.length === 0) return;\n\n const eventsToSend = [...this.eventQueue];\n this.eventQueue = [];\n\n // Split events into chunks to respect maxEventsPerRequest limit\n const chunks = this.chunkEvents(eventsToSend, this.config.maxEventsPerRequest);\n \n // Send all chunks sequentially to maintain order\n for (const chunk of chunks) {\n await this.sendEvents(chunk);\n }\n } catch (error) {\n const formattedError = this.formatError(error, 'flush');\n this.logError(formattedError);\n }\n }\n\n // Remote Config Methods\n\n /**\n * Initialize configuration cache from localStorage\n */\n private initializeConfigCache(): void {\n if (!this.config.enableConfigCache || typeof window === 'undefined') return;\n\n try {\n const cached = localStorage.getItem(this.config.configCacheKey);\n if (cached) {\n this.configCache = JSON.parse(cached);\n this.log('Loaded configuration from cache:', this.configCache);\n }\n } catch (error) {\n this.log('Failed to load configuration cache:', error);\n }\n }\n\n /**\n * Save configuration cache to localStorage\n */\n private saveConfigCache(cache: RemoteConfigCache): void {\n if (!this.config.enableConfigCache || typeof window === 'undefined') return;\n\n try {\n localStorage.setItem(this.config.configCacheKey, JSON.stringify(cache));\n this.log('Saved configuration to cache:', cache);\n } catch (error) {\n this.log('Failed to save configuration cache:', error);\n }\n }\n\n /**\n * Get configuration value with fallback to defaults\n */\n getConfig(key: string): string | undefined {\n // First check cache\n if (this.configCache?.configurations?.[key]) {\n return this.configCache.configurations[key];\n }\n\n // Then check defaults\n if (this.config.defaultConfigurations?.[key]) {\n return this.config.defaultConfigurations[key];\n }\n\n return undefined;\n }\n\n /**\n * Get all configurations with fallback to defaults\n */\n getAllConfigs(): Record<string, string> {\n const configs = { ...this.config.defaultConfigurations };\n \n if (this.configCache?.configurations) {\n Object.assign(configs, this.configCache.configurations);\n }\n\n return configs;\n }\n\n /**\n * Fetch configurations from API\n */\n async fetchConfig(options: RemoteConfigOptions = {}): Promise<RemoteConfigResponse | null> {\n try {\n if (this.isDestroyed) {\n const error = new Error('Grain Analytics: Client has been destroyed');\n const formattedError = this.formatError(error, 'fetchConfig (client destroyed)');\n this.logError(formattedError);\n return null;\n }\n\n const userId = options.userId || this.getEffectiveUserIdInternal();\n const immediateKeys = options.immediateKeys || [];\n const properties = options.properties || {};\n // Include currentUrl from options, or automatically get it from window.location if available\n // Strip query parameters and hash to match backend normalization\n let currentUrl = options.currentUrl ?? (typeof window !== 'undefined' ? window.location.href : undefined);\n if (currentUrl) {\n try {\n const urlObj = new URL(currentUrl);\n currentUrl = `${urlObj.protocol}//${urlObj.host}${urlObj.pathname}`;\n } catch {\n // If URL parsing fails, use as-is\n }\n }\n\n const request: RemoteConfigRequest = {\n userId,\n immediateKeys,\n properties,\n currentUrl,\n };\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= this.config.retryAttempts; attempt++) {\n try {\n const headers = await this.getAuthHeaders();\n const url = `${this.config.apiUrl}/v1/client/${encodeURIComponent(this.config.tenantId)}/config/configurations`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n let errorMessage = `HTTP ${response.status}`;\n try {\n const errorBody = await response.json();\n if (errorBody?.message) {\n errorMessage = errorBody.message;\n }\n } catch {\n const errorText = await response.text();\n if (errorText) {\n errorMessage = errorText;\n }\n }\n \n const error = new Error(`Failed to fetch configurations: ${errorMessage}`) as Error & { status?: number };\n error.status = response.status;\n throw error;\n }\n\n const configResponse: RemoteConfigResponse = await response.json();\n \n // Update cache if successful\n if (configResponse.configurations) {\n this.updateConfigCache(configResponse, userId);\n }\n\n this.log('Successfully fetched configurations');\n return configResponse;\n \n } catch (error) {\n lastError = error;\n \n if (attempt === this.config.retryAttempts) {\n // Last attempt, don't retry - log error gracefully\n const formattedError = this.formatError(error, `fetchConfig (attempt ${attempt + 1}/${this.config.retryAttempts + 1})`);\n this.logError(formattedError);\n return null;\n }\n \n if (!this.isRetriableError(error)) {\n // Non-retriable error, don't retry - log error gracefully\n const formattedError = this.formatError(error, 'fetchConfig (non-retriable error)');\n this.logError(formattedError);\n return null;\n }\n \n const delayMs = this.config.retryDelay * Math.pow(2, attempt);\n this.log(`Retrying config fetch in ${delayMs}ms after error:`, error);\n await this.delay(delayMs);\n }\n }\n\n return null;\n } catch (error) {\n const formattedError = this.formatError(error, 'fetchConfig');\n this.logError(formattedError);\n return null;\n }\n }\n\n /**\n * Get configuration asynchronously (cache-first with fallback to API)\n */\n async getConfigAsync(key: string, options: RemoteConfigOptions = {}): Promise<string | undefined> {\n try {\n // Return immediately if we have it in cache and not forcing refresh\n if (!options.forceRefresh && this.configCache?.configurations?.[key]) {\n return this.configCache.configurations[key];\n }\n\n // Return default if available and not forcing refresh\n if (!options.forceRefresh && this.config.defaultConfigurations?.[key]) {\n return this.config.defaultConfigurations[key];\n }\n\n // Fetch from API\n const response = await this.fetchConfig(options);\n if (response) {\n return response.configurations[key];\n }\n \n // Return default as fallback\n return this.config.defaultConfigurations?.[key];\n } catch (error) {\n const formattedError = this.formatError(error, 'getConfigAsync');\n this.logError(formattedError);\n // Return default as fallback\n return this.config.defaultConfigurations?.[key];\n }\n }\n\n /**\n * Get all configurations asynchronously (cache-first with fallback to API)\n */\n async getAllConfigsAsync(options: RemoteConfigOptions = {}): Promise<Record<string, string>> {\n try {\n // Return cache if available and not forcing refresh\n if (!options.forceRefresh && this.configCache?.configurations) {\n return { ...this.config.defaultConfigurations, ...this.configCache.configurations };\n }\n\n // Fetch from API\n const response = await this.fetchConfig(options);\n if (response) {\n return { ...this.config.defaultConfigurations, ...response.configurations };\n }\n \n // Return defaults as fallback\n return { ...this.config.defaultConfigurations };\n } catch (error) {\n const formattedError = this.formatError(error, 'getAllConfigsAsync');\n this.logError(formattedError);\n // Return defaults as fallback\n return { ...this.config.defaultConfigurations };\n }\n }\n\n /**\n * Update configuration cache and notify listeners\n */\n private updateConfigCache(response: RemoteConfigResponse, userId: string): void {\n const newCache: RemoteConfigCache = {\n configurations: response.configurations,\n snapshotId: response.snapshotId,\n timestamp: response.timestamp,\n userId,\n };\n\n const oldConfigs = this.configCache?.configurations || {};\n this.configCache = newCache;\n this.saveConfigCache(newCache);\n\n // Notify listeners if configurations changed\n if (JSON.stringify(oldConfigs) !== JSON.stringify(response.configurations)) {\n this.notifyConfigChangeListeners(response.configurations);\n }\n }\n\n /**\n * Add configuration change listener\n */\n addConfigChangeListener(listener: ConfigChangeListener): void {\n this.configChangeListeners.push(listener);\n }\n\n /**\n * Remove configuration change listener\n */\n removeConfigChangeListener(listener: ConfigChangeListener): void {\n const index = this.configChangeListeners.indexOf(listener);\n if (index > -1) {\n this.configChangeListeners.splice(index, 1);\n }\n }\n\n /**\n * Notify all configuration change listeners\n */\n private notifyConfigChangeListeners(configurations: Record<string, string>): void {\n this.configChangeListeners.forEach(listener => {\n try {\n listener(configurations);\n } catch (error) {\n console.error('[Grain Analytics] Config change listener error:', error);\n }\n });\n }\n\n /**\n * Start automatic configuration refresh timer\n */\n private startConfigRefreshTimer(): void {\n if (typeof window === 'undefined') return;\n \n if (this.configRefreshTimer) {\n clearInterval(this.configRefreshTimer);\n }\n\n this.configRefreshTimer = window.setInterval(() => {\n if (!this.isDestroyed) {\n // Use effective userId (will be generated if not set)\n this.fetchConfig().catch((error) => {\n const formattedError = this.formatError(error, 'auto-config refresh');\n this.logError(formattedError);\n });\n }\n }, this.config.configRefreshInterval);\n }\n\n /**\n * Stop automatic configuration refresh timer\n */\n private stopConfigRefreshTimer(): void {\n if (this.configRefreshTimer) {\n clearInterval(this.configRefreshTimer);\n this.configRefreshTimer = null;\n }\n }\n\n /**\n * Preload configurations for immediate access\n */\n async preloadConfig(immediateKeys: string[] = [], properties?: Record<string, string>): Promise<void> {\n try {\n // Use effective userId (will be generated if not set)\n const effectiveUserId = this.getEffectiveUserIdInternal();\n this.log(`Preloading config for user: ${effectiveUserId}`);\n\n const response = await this.fetchConfig({ immediateKeys, properties });\n if (response) {\n this.startConfigRefreshTimer();\n }\n } catch (error) {\n const formattedError = this.formatError(error, 'preloadConfig');\n this.logError(formattedError);\n }\n }\n\n /**\n * Split events array into chunks of specified size\n */\n private chunkEvents(events: EventPayload[], chunkSize: number): EventPayload[][] {\n const chunks: EventPayload[][] = [];\n for (let i = 0; i < events.length; i += chunkSize) {\n chunks.push(events.slice(i, i + chunkSize));\n }\n return chunks;\n }\n\n // Privacy & Consent Methods\n\n /**\n * Grant consent for tracking (v2.0)\n * Switches from cookieless mode to permanent IDs\n * @param categories - Optional array of consent categories (e.g., ['analytics', 'functional'])\n */\n grantConsent(categories?: string[]): void {\n try {\n this.consentManager.grantConsent(categories);\n \n // Sync ID manager with consent state\n const idMode = this.consentManager.getIdMode();\n this.idManager.setMode(idMode);\n \n this.log('Consent granted, switched to permanent IDs', categories);\n \n // Process any queued events waiting for consent\n if (this.waitingForConsentQueue.length > 0) {\n this.log(`Processing ${this.waitingForConsentQueue.length} queued events`);\n this.eventQueue.push(...this.waitingForConsentQueue);\n this.waitingForConsentQueue = [];\n this.flush();\n }\n } catch (error) {\n const formattedError = this.formatError(error, 'grantConsent');\n this.logError(formattedError);\n }\n }\n\n /**\n * Revoke consent for tracking (v2.0)\n * Switches from permanent IDs to cookieless mode\n * @param categories - Optional array of categories to revoke (if not provided, revokes all)\n */\n revokeConsent(categories?: string[]): void {\n try {\n this.consentManager.revokeConsent(categories);\n \n // Sync ID manager with consent state\n const idMode = this.consentManager.getIdMode();\n this.idManager.setMode(idMode);\n \n this.log('Consent revoked, switched to cookieless mode', categories);\n \n // Clear queued events when consent is fully revoked\n if (!this.consentManager.hasConsent()) {\n this.eventQueue = [];\n this.waitingForConsentQueue = [];\n }\n } catch (error) {\n const formattedError = this.formatError(error, 'revokeConsent');\n this.logError(formattedError);\n }\n }\n\n /**\n * Get current consent state\n */\n getConsentState(): ConsentState | null {\n return this.consentManager.getConsentState();\n }\n\n /**\n * Check if user has granted consent\n * @param category - Optional category to check (if not provided, checks general consent)\n */\n hasConsent(category?: string): boolean {\n return this.consentManager.hasConsent(category);\n }\n\n /**\n * Add listener for consent state changes\n */\n onConsentChange(listener: (state: ConsentState) => void): void {\n this.consentManager.addListener(listener);\n }\n\n /**\n * Remove consent change listener\n */\n offConsentChange(listener: (state: ConsentState) => void): void {\n this.consentManager.removeListener(listener);\n }\n\n /**\n * Check for debug mode parameters and initialize debug agent if valid\n */\n private checkAndInitializeDebugMode(): void {\n if (typeof window === 'undefined') return;\n \n try {\n const urlParams = new URLSearchParams(window.location.search);\n const isDebug = urlParams.get('grain_debug') === '1';\n const sessionId = urlParams.get('grain_session');\n \n if (!isDebug || !sessionId) {\n return;\n }\n \n this.log('Debug mode detected, verifying session:', sessionId);\n \n // Verify session with API\n this.verifyDebugSession(sessionId, window.location.hostname)\n .then((valid) => {\n if (valid) {\n this.log('Debug session verified, initializing debug agent');\n this.isDebugMode = true;\n this.initializeDebugAgent(sessionId);\n } else {\n this.log('Debug session verification failed');\n }\n })\n .catch((error) => {\n this.log('Failed to verify debug session:', error);\n });\n } catch (error) {\n this.log('Error checking debug mode:', error);\n }\n }\n \n /**\n * Verify debug session with API\n */\n private async verifyDebugSession(sessionId: string, domain: string): Promise<boolean> {\n try {\n const url = `${this.config.apiUrl}/v1/tenant/${encodeURIComponent(this.config.tenantId)}/debug-sessions/verify`;\n \n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n sessionId,\n domain,\n }),\n });\n \n if (!response.ok) {\n return false;\n }\n \n const result = await response.json();\n return result.valid === true;\n } catch (error) {\n this.log('Debug session verification error:', error);\n return false;\n }\n }\n \n /**\n * Initialize debug agent\n */\n private initializeDebugAgent(sessionId: string): void {\n if (typeof window === 'undefined') return;\n \n try {\n this.log('Loading debug agent module');\n \n import('./debug-agent').then(({ DebugAgent }) => {\n try {\n this.debugAgent = new DebugAgent(\n this,\n sessionId,\n this.config.tenantId,\n this.config.apiUrl,\n {\n debug: this.config.debug,\n }\n );\n this.log('Debug agent initialized');\n } catch (error) {\n this.log('Failed to initialize debug agent:', error);\n }\n }).catch((error) => {\n this.log('Failed to load debug agent module:', error);\n });\n } catch (error) {\n this.log('Error initializing debug agent:', error);\n }\n }\n\n /**\n * Destroy the client and clean up resources\n */\n destroy(): void {\n this.isDestroyed = true;\n \n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n\n // Stop config refresh timer\n this.stopConfigRefreshTimer();\n\n // Clear config change listeners\n this.configChangeListeners = [];\n\n // Destroy automatic tracking managers\n if (this.heartbeatManager) {\n this.heartbeatManager.destroy();\n this.heartbeatManager = null;\n }\n\n if (this.pageTrackingManager) {\n this.pageTrackingManager.destroy();\n this.pageTrackingManager = null;\n }\n\n if (this.activityDetector) {\n this.activityDetector.destroy();\n this.activityDetector = null;\n }\n\n // Destroy auto-tracking managers\n if (this.interactionTrackingManager) {\n this.interactionTrackingManager.destroy();\n this.interactionTrackingManager = null;\n }\n\n if (this.sectionTrackingManager) {\n this.sectionTrackingManager.destroy();\n this.sectionTrackingManager = null;\n }\n\n if (this.heatmapTrackingManager) {\n this.heatmapTrackingManager.destroy();\n this.heatmapTrackingManager = null;\n }\n \n // Destroy debug agent\n if (this.debugAgent) {\n this.debugAgent.destroy();\n this.debugAgent = null;\n }\n\n // Send any remaining events (in chunks if necessary)\n if (this.eventQueue.length > 0) {\n const eventsToSend = [...this.eventQueue];\n this.eventQueue = [];\n \n const chunks = this.chunkEvents(eventsToSend, this.config.maxEventsPerRequest);\n \n // Send first chunk with beacon (most important for page unload)\n if (chunks.length > 0) {\n this.sendEventsWithBeacon(chunks[0]).catch(() => {\n // Silently fail during cleanup\n });\n \n // If there are more chunks, try to send them with regular fetch\n for (let i = 1; i < chunks.length; i++) {\n this.sendEventsWithBeacon(chunks[i]).catch(() => {\n // Silently fail during cleanup\n });\n }\n }\n }\n }\n}\n\n/**\n * Create a new Grain Analytics client\n */\nexport function createGrainAnalytics(config: GrainConfig): GrainAnalytics {\n return new GrainAnalytics(config);\n}\n\n// Default export for convenience\nexport default GrainAnalytics;\n\n// Global interface for IIFE build\ndeclare global {\n interface Window {\n Grain?: {\n GrainAnalytics: typeof GrainAnalytics;\n createGrainAnalytics: typeof createGrainAnalytics;\n };\n }\n}\n\n// Auto-setup for IIFE build\nif (typeof window !== 'undefined') {\n window.Grain = {\n GrainAnalytics,\n createGrainAnalytics,\n };\n}", "/**\n * Consent management for Grain Analytics v2.0\n * Privacy-first, cookieless by default\n * \n * Consent Modes:\n * - cookieless: Default mode, daily rotating IDs, no consent needed\n * - gdpr-strict: Requires explicit consent, falls back to cookieless\n * - gdpr-opt-out: Permanent IDs by default, cookieless on opt-out\n */\n\nexport type ConsentMode = 'COOKIELESS' | 'GDPR_STRICT' | 'GDPR_OPT_OUT';\n\nexport interface ConsentState {\n granted: boolean;\n categories: string[];\n timestamp: Date;\n version: string;\n}\n\nexport const DEFAULT_CONSENT_CATEGORIES = ['necessary', 'analytics', 'functional'];\nexport const CONSENT_VERSION = '1.0.0';\n\n/**\n * Consent manager for handling user consent state\n * v2.0: Cookieless by default, privacy-first approach\n */\nexport class ConsentManager {\n private consentState: ConsentState | null = null;\n private consentMode: ConsentMode;\n private storageKey: string;\n private listeners: Array<(state: ConsentState) => void> = [];\n\n constructor(tenantId: string, consentMode: ConsentMode = 'COOKIELESS') {\n this.consentMode = consentMode;\n this.storageKey = `grain_consent_${tenantId}`;\n this.loadConsentState();\n }\n\n /**\n * Load consent state from localStorage\n * \n * GDPR Compliance: localStorage only used for storing consent preferences\n * (not for tracking), which is a legitimate interest for compliance.\n */\n private loadConsentState(): void {\n if (typeof window === 'undefined') return;\n\n try {\n const stored = localStorage.getItem(this.storageKey);\n if (stored) {\n const parsed = JSON.parse(stored);\n this.consentState = {\n ...parsed,\n timestamp: new Date(parsed.timestamp),\n };\n } else if (this.consentMode === 'GDPR_OPT_OUT') {\n // Auto-grant consent for opt-out mode (user hasn't opted out yet)\n this.consentState = {\n granted: true,\n categories: DEFAULT_CONSENT_CATEGORIES,\n timestamp: new Date(),\n version: CONSENT_VERSION,\n };\n this.saveConsentState();\n }\n // Note: cookieless and gdpr-strict modes without stored consent \u2192 no permanent tracking\n } catch (error) {\n // Silent failure - will use cookieless mode by default\n }\n }\n\n /**\n * Save consent state to localStorage\n */\n private saveConsentState(): void {\n if (typeof window === 'undefined' || !this.consentState) return;\n\n try {\n localStorage.setItem(this.storageKey, JSON.stringify(this.consentState));\n } catch (error) {\n // Silent failure - consent state won't persist\n }\n }\n\n /**\n * Grant consent with optional categories\n */\n grantConsent(categories?: string[]): void {\n const grantedCategories = categories || DEFAULT_CONSENT_CATEGORIES;\n \n this.consentState = {\n granted: true,\n categories: grantedCategories,\n timestamp: new Date(),\n version: CONSENT_VERSION,\n };\n\n this.saveConsentState();\n this.notifyListeners();\n }\n\n /**\n * Revoke consent (opt-out)\n */\n revokeConsent(categories?: string[]): void {\n if (!this.consentState) {\n this.consentState = {\n granted: false,\n categories: [],\n timestamp: new Date(),\n version: CONSENT_VERSION,\n };\n } else if (categories) {\n // Remove specific categories\n this.consentState = {\n ...this.consentState,\n categories: this.consentState.categories.filter(cat => !categories.includes(cat)),\n granted: this.consentState.categories.length > 0,\n timestamp: new Date(),\n };\n } else {\n // Revoke all consent\n this.consentState = {\n granted: false,\n categories: [],\n timestamp: new Date(),\n version: CONSENT_VERSION,\n };\n }\n\n this.saveConsentState();\n this.notifyListeners();\n }\n\n /**\n * Get current consent state\n */\n getConsentState(): ConsentState | null {\n return this.consentState ? { ...this.consentState } : null;\n }\n\n /**\n * Check if user has granted consent for permanent IDs\n */\n hasConsent(category?: string): boolean {\n // Cookieless mode: no consent needed (no permanent tracking)\n if (this.consentMode === 'COOKIELESS') {\n return false; // No permanent IDs\n }\n\n // GDPR Strict: requires explicit consent\n if (this.consentMode === 'GDPR_STRICT') {\n if (!this.consentState?.granted) {\n return false;\n }\n }\n\n // GDPR Opt-out: consent by default unless explicitly revoked\n if (this.consentMode === 'GDPR_OPT_OUT') {\n // If no state, assume consent (opt-out model)\n if (!this.consentState) {\n return true;\n }\n // Check if consent was revoked\n if (!this.consentState.granted) {\n return false;\n }\n }\n\n // Check specific category if provided\n if (category && this.consentState) {\n return this.consentState.categories.includes(category);\n }\n\n return this.consentState?.granted ?? (this.consentMode === 'GDPR_OPT_OUT');\n }\n\n /**\n * Check if permanent IDs are allowed\n */\n shouldUsePermanentId(): boolean {\n return this.hasConsent();\n }\n\n /**\n * Check if we should strip query parameters from URLs\n * Query params stripped unless:\n * - Mode is gdpr-opt-out, OR\n * - Mode is gdpr-strict AND consent given\n */\n shouldStripQueryParams(): boolean {\n if (this.consentMode === 'COOKIELESS') {\n return true; // Always strip in cookieless mode\n }\n \n if (this.consentMode === 'GDPR_STRICT') {\n return !this.hasConsent(); // Strip unless consented\n }\n \n if (this.consentMode === 'GDPR_OPT_OUT') {\n return false; // Don't strip in opt-out mode\n }\n \n return true; // Default: strip\n }\n\n /**\n * Check if we can track events (always true in v2.0)\n * Even cookieless mode allows basic analytics with daily IDs\n */\n canTrack(): boolean {\n return true; // All modes allow some form of tracking\n }\n\n /**\n * Check if we should wait for consent before tracking\n * Only relevant for GDPR Strict mode\n */\n shouldWaitForConsent(): boolean {\n return this.consentMode === 'GDPR_STRICT' && !this.consentState?.granted;\n }\n\n /**\n * Add consent change listener\n */\n addListener(listener: (state: ConsentState) => void): void {\n this.listeners.push(listener);\n }\n\n /**\n * Remove consent change listener\n */\n removeListener(listener: (state: ConsentState) => void): void {\n const index = this.listeners.indexOf(listener);\n if (index > -1) {\n this.listeners.splice(index, 1);\n }\n }\n\n /**\n * Notify all listeners of consent state change\n */\n private notifyListeners(): void {\n if (!this.consentState) return;\n\n this.listeners.forEach(listener => {\n try {\n listener(this.consentState!);\n } catch (error) {\n // Silent failure - listener threw an error\n }\n });\n }\n\n /**\n * Clear all consent data\n */\n clearConsent(): void {\n if (typeof window === 'undefined') return;\n\n try {\n localStorage.removeItem(this.storageKey);\n this.consentState = null;\n } catch (error) {\n // Silent failure - consent state may not be fully cleared\n }\n }\n\n /**\n * Get current consent mode\n */\n getConsentMode(): ConsentMode {\n return this.consentMode;\n }\n\n /**\n * Get ID mode based on consent state\n * Returns 'cookieless' or 'permanent' for IdManager\n */\n getIdMode(): 'cookieless' | 'permanent' {\n return this.shouldUsePermanentId() ? 'permanent' : 'cookieless';\n }\n}\n\n", "/**\n * Cookie utilities for Grain Analytics\n * Provides GDPR-compliant cookie management with configurable options\n */\n\nexport interface CookieConfig {\n domain?: string;\n path?: string;\n sameSite?: 'strict' | 'lax' | 'none';\n secure?: boolean;\n maxAge?: number; // seconds\n}\n\n/**\n * Set a cookie with configurable options\n */\nexport function setCookie(name: string, value: string, config?: CookieConfig): void {\n if (typeof document === 'undefined') return;\n\n const parts = [`${encodeURIComponent(name)}=${encodeURIComponent(value)}`];\n \n if (config?.maxAge !== undefined) {\n parts.push(`max-age=${config.maxAge}`);\n }\n \n if (config?.domain) {\n parts.push(`domain=${config.domain}`);\n }\n \n if (config?.path) {\n parts.push(`path=${config.path}`);\n } else {\n parts.push('path=/');\n }\n \n if (config?.sameSite) {\n parts.push(`samesite=${config.sameSite}`);\n }\n \n if (config?.secure) {\n parts.push('secure');\n }\n \n document.cookie = parts.join('; ');\n}\n\n/**\n * Get a cookie value by name\n */\nexport function getCookie(name: string): string | null {\n if (typeof document === 'undefined') return null;\n\n const nameEQ = encodeURIComponent(name) + '=';\n const cookies = document.cookie.split(';');\n \n for (let i = 0; i < cookies.length; i++) {\n let cookie = cookies[i];\n while (cookie.charAt(0) === ' ') {\n cookie = cookie.substring(1);\n }\n if (cookie.indexOf(nameEQ) === 0) {\n return decodeURIComponent(cookie.substring(nameEQ.length));\n }\n }\n \n return null;\n}\n\n/**\n * Delete a cookie by name\n */\nexport function deleteCookie(name: string, config?: Pick<CookieConfig, 'domain' | 'path'>): void {\n if (typeof document === 'undefined') return;\n\n const parts = [\n `${encodeURIComponent(name)}=`,\n 'max-age=0',\n ];\n \n if (config?.domain) {\n parts.push(`domain=${config.domain}`);\n }\n \n if (config?.path) {\n parts.push(`path=${config.path}`);\n } else {\n parts.push('path=/');\n }\n \n document.cookie = parts.join('; ');\n}\n\n/**\n * Check if cookies are available and working\n */\nexport function areCookiesEnabled(): boolean {\n if (typeof document === 'undefined') return false;\n\n try {\n const testCookie = '_grain_cookie_test';\n setCookie(testCookie, 'test', { maxAge: 1 });\n const result = getCookie(testCookie) === 'test';\n deleteCookie(testCookie);\n return result;\n } catch {\n return false;\n }\n}\n\n", "/**\n * Activity Detection for Grain Analytics\n * Tracks user activity (mouse, keyboard, touch, scroll) to determine if user is active\n */\n\nexport class ActivityDetector {\n private lastActivityTime: number;\n private activityThreshold: number = 30000; // 30 seconds\n private listeners: Array<() => void> = [];\n private boundActivityHandler: () => void;\n private isDestroyed = false;\n\n // Events that indicate user activity\n private readonly activityEvents = [\n 'mousemove',\n 'mousedown',\n 'keydown',\n 'scroll',\n 'touchstart',\n 'click',\n ] as const;\n\n constructor() {\n this.lastActivityTime = Date.now();\n this.boundActivityHandler = this.debounce(this.handleActivity.bind(this), 500);\n this.setupListeners();\n }\n\n /**\n * Setup event listeners for activity detection\n */\n private setupListeners(): void {\n if (typeof window === 'undefined') return;\n\n for (const event of this.activityEvents) {\n window.addEventListener(event, this.boundActivityHandler, { passive: true });\n }\n }\n\n /**\n * Handle activity event\n */\n private handleActivity(): void {\n if (this.isDestroyed) return;\n this.lastActivityTime = Date.now();\n this.notifyListeners();\n }\n\n /**\n * Debounce function to limit how often activity handler is called\n */\n private debounce(func: () => void, wait: number): () => void {\n let timeout: number | null = null;\n \n return () => {\n if (timeout !== null) {\n clearTimeout(timeout);\n }\n \n timeout = window.setTimeout(() => {\n func();\n timeout = null;\n }, wait);\n };\n }\n\n /**\n * Check if user is currently active\n * @param threshold Time in ms to consider user inactive (default: 30s)\n */\n isActive(threshold?: number): boolean {\n const thresholdToUse = threshold ?? this.activityThreshold;\n const now = Date.now();\n return (now - this.lastActivityTime) < thresholdToUse;\n }\n\n /**\n * Get time since last activity in milliseconds\n */\n getTimeSinceLastActivity(): number {\n return Date.now() - this.lastActivityTime;\n }\n\n /**\n * Get last activity timestamp\n */\n getLastActivityTime(): number {\n return this.lastActivityTime;\n }\n\n /**\n * Set activity threshold\n */\n setActivityThreshold(threshold: number): void {\n this.activityThreshold = threshold;\n }\n\n /**\n * Add listener for activity changes\n */\n addListener(listener: () => void): void {\n this.listeners.push(listener);\n }\n\n /**\n * Remove listener\n */\n removeListener(listener: () => void): void {\n const index = this.listeners.indexOf(listener);\n if (index > -1) {\n this.listeners.splice(index, 1);\n }\n }\n\n /**\n * Notify all listeners\n */\n private notifyListeners(): void {\n for (const listener of this.listeners) {\n try {\n listener();\n } catch (error) {\n // Silent failure - listener threw an error\n }\n }\n }\n\n /**\n * Cleanup and remove listeners\n */\n destroy(): void {\n if (this.isDestroyed) return;\n \n if (typeof window !== 'undefined') {\n for (const event of this.activityEvents) {\n window.removeEventListener(event, this.boundActivityHandler);\n }\n }\n \n this.listeners = [];\n this.isDestroyed = true;\n }\n}\n\n", "/**\n * Heartbeat Manager for Grain Analytics\n * Tracks session activity with consent-aware behavior\n */\n\nimport type { ActivityDetector } from './activity';\n\nexport interface HeartbeatConfig {\n activeInterval: number; // Interval when user is active (ms)\n inactiveInterval: number; // Interval when user is inactive (ms)\n debug?: boolean;\n}\n\nexport interface HeartbeatTracker {\n trackSystemEvent(eventName: string, properties: Record<string, unknown>): void;\n hasConsent(category?: string): boolean;\n getEffectiveUserId(): string;\n getEphemeralSessionId(): string;\n getSessionId(): string;\n getCurrentPage(): string | null;\n getEventCountSinceLastHeartbeat(): number;\n resetEventCountSinceLastHeartbeat(): void;\n}\n\nexport class HeartbeatManager {\n private config: HeartbeatConfig;\n private tracker: HeartbeatTracker;\n private activityDetector: ActivityDetector;\n private heartbeatTimer: number | null = null;\n private isDestroyed = false;\n private lastHeartbeatTime: number;\n private currentInterval: number;\n private hasSentPageLoadHeartbeat = false;\n\n constructor(\n tracker: HeartbeatTracker,\n activityDetector: ActivityDetector,\n config: HeartbeatConfig\n ) {\n this.tracker = tracker;\n this.activityDetector = activityDetector;\n this.config = config;\n this.lastHeartbeatTime = Date.now();\n this.currentInterval = config.activeInterval;\n\n // Send initial heartbeat when page loads (if allowed by consent)\n this.sendPageLoadHeartbeat();\n \n // Start periodic heartbeat tracking\n this.scheduleNextHeartbeat();\n }\n\n /**\n * Send initial heartbeat when page loads\n */\n private sendPageLoadHeartbeat(): void {\n if (this.isDestroyed || this.hasSentPageLoadHeartbeat) return;\n\n // Wait for page to be fully loaded\n if (typeof window !== 'undefined' && document.readyState !== 'complete') {\n const handleLoad = () => {\n this.sendHeartbeat('page_load');\n this.hasSentPageLoadHeartbeat = true;\n window.removeEventListener('load', handleLoad);\n };\n window.addEventListener('load', handleLoad);\n } else {\n // Page is already loaded or we're in a non-browser environment\n this.sendHeartbeat('page_load');\n this.hasSentPageLoadHeartbeat = true;\n }\n }\n\n /**\n * Schedule the next heartbeat based on current activity\n */\n private scheduleNextHeartbeat(): void {\n if (this.isDestroyed) return;\n\n // Clear existing timer\n if (this.heartbeatTimer !== null) {\n clearTimeout(this.heartbeatTimer);\n }\n\n // Determine interval based on activity\n const isActive = this.activityDetector.isActive(60000); // 1 minute threshold\n this.currentInterval = isActive ? this.config.activeInterval : this.config.inactiveInterval;\n\n // Schedule next heartbeat\n this.heartbeatTimer = window.setTimeout(() => {\n this.sendHeartbeat('periodic');\n this.scheduleNextHeartbeat();\n }, this.currentInterval);\n\n if (this.config.debug) {\n console.log(\n `[Heartbeat] Scheduled next heartbeat in ${this.currentInterval / 1000}s (${isActive ? 'active' : 'inactive'})`\n );\n }\n }\n\n /**\n * Send heartbeat event\n */\n private sendHeartbeat(heartbeatType: 'periodic' | 'page_load' = 'periodic'): void {\n if (this.isDestroyed) return;\n\n const now = Date.now();\n const isActive = this.activityDetector.isActive(60000); // 1 minute threshold\n const hasConsent = this.tracker.hasConsent('analytics');\n\n // Base properties (always included)\n const properties: Record<string, unknown> = {\n heartbeat_type: heartbeatType,\n status: isActive ? 'active' : 'inactive',\n timestamp: now,\n };\n\n // Enhanced properties when consent is granted\n if (hasConsent) {\n const page = this.tracker.getCurrentPage();\n if (page) {\n properties.page = page;\n }\n \n properties.session_id = this.tracker.getSessionId();\n \n // Only include duration and event count for periodic heartbeats\n if (heartbeatType === 'periodic') {\n properties.duration = now - this.lastHeartbeatTime;\n properties.event_count = this.tracker.getEventCountSinceLastHeartbeat();\n \n // Reset event count\n this.tracker.resetEventCountSinceLastHeartbeat();\n }\n }\n\n // Track the heartbeat event\n this.tracker.trackSystemEvent('_grain_heartbeat', properties);\n\n this.lastHeartbeatTime = now;\n }\n\n /**\n * Destroy the heartbeat manager\n */\n destroy(): void {\n if (this.isDestroyed) return;\n\n if (this.heartbeatTimer !== null) {\n clearTimeout(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n\n this.isDestroyed = true;\n }\n}\n\n", "/**\n * Attribution and Referral Tracking for Grain Analytics\n * Handles referral categorization and first-touch attribution\n */\n\nexport type ReferrerCategory = 'organic' | 'paid' | 'social' | 'direct' | 'email' | 'referral';\n\nexport interface UTMParameters {\n utm_source?: string;\n utm_medium?: string;\n utm_campaign?: string;\n utm_term?: string;\n utm_content?: string;\n}\n\nexport interface FirstTouchAttribution {\n source: string;\n medium: string;\n campaign: string;\n referrer: string;\n referrer_category: ReferrerCategory;\n timestamp: number;\n}\n\n/**\n * Known paid search parameters\n */\nconst PAID_SEARCH_PARAMS = [\n 'gclid', // Google Ads\n 'msclkid', // Microsoft Ads\n 'fbclid', // Facebook Ads\n 'ttclid', // TikTok Ads\n 'li_fat_id', // LinkedIn Ads\n 'twclid', // Twitter Ads\n 'ScCid', // Snapchat Ads\n];\n\n/**\n * Known social media domains\n */\nconst SOCIAL_DOMAINS = [\n 'facebook.com',\n 'twitter.com',\n 'x.com',\n 'linkedin.com',\n 'instagram.com',\n 'pinterest.com',\n 'reddit.com',\n 'tiktok.com',\n 'youtube.com',\n 'snapchat.com',\n 't.co', // Twitter short links\n 'fb.me', // Facebook short links\n 'lnkd.in', // LinkedIn short links\n];\n\n/**\n * Known organic search engines\n */\nconst SEARCH_ENGINES = [\n 'google.',\n 'bing.com',\n 'yahoo.com',\n 'duckduckgo.com',\n 'baidu.com',\n 'yandex.com',\n 'ecosia.org',\n 'ask.com',\n];\n\n/**\n * Email client domains\n */\nconst EMAIL_DOMAINS = [\n 'mail.google.com',\n 'outlook.live.com',\n 'mail.yahoo.com',\n 'mail.aol.com',\n];\n\n/**\n * Extract domain from URL\n */\nfunction extractDomain(url: string): string {\n try {\n const urlObj = new URL(url);\n return urlObj.hostname.toLowerCase();\n } catch {\n return '';\n }\n}\n\n/**\n * Check if URL contains paid search parameters\n */\nfunction hasPaidSearchParams(url: string): boolean {\n try {\n const urlObj = new URL(url);\n return PAID_SEARCH_PARAMS.some(param => urlObj.searchParams.has(param));\n } catch {\n return false;\n }\n}\n\n/**\n * Categorize referrer based on domain and parameters\n */\nexport function categorizeReferrer(referrer: string, currentUrl: string = ''): ReferrerCategory {\n // Direct traffic (no referrer)\n if (!referrer || referrer.trim() === '') {\n return 'direct';\n }\n\n const domain = extractDomain(referrer);\n \n // Same domain = direct\n if (currentUrl) {\n const currentDomain = extractDomain(currentUrl);\n if (domain === currentDomain) {\n return 'direct';\n }\n }\n\n // Check for paid search parameters\n if (hasPaidSearchParams(referrer) || hasPaidSearchParams(currentUrl)) {\n return 'paid';\n }\n\n // Email clients\n if (EMAIL_DOMAINS.some(emailDomain => domain.includes(emailDomain))) {\n return 'email';\n }\n\n // Social media\n if (SOCIAL_DOMAINS.some(socialDomain => domain.includes(socialDomain))) {\n return 'social';\n }\n\n // Organic search engines\n if (SEARCH_ENGINES.some(searchEngine => domain.includes(searchEngine))) {\n return 'organic';\n }\n\n // Everything else is referral\n return 'referral';\n}\n\n/**\n * Parse UTM parameters from URL\n */\nexport function parseUTMParameters(url: string): UTMParameters {\n try {\n const urlObj = new URL(url);\n const params: UTMParameters = {};\n\n const utmSource = urlObj.searchParams.get('utm_source');\n const utmMedium = urlObj.searchParams.get('utm_medium');\n const utmCampaign = urlObj.searchParams.get('utm_campaign');\n const utmTerm = urlObj.searchParams.get('utm_term');\n const utmContent = urlObj.searchParams.get('utm_content');\n\n if (utmSource) params.utm_source = utmSource;\n if (utmMedium) params.utm_medium = utmMedium;\n if (utmCampaign) params.utm_campaign = utmCampaign;\n if (utmTerm) params.utm_term = utmTerm;\n if (utmContent) params.utm_content = utmContent;\n\n return params;\n } catch {\n return {};\n }\n}\n\n/**\n * Get first-touch attribution from localStorage\n */\nexport function getFirstTouchAttribution(tenantId: string): FirstTouchAttribution | null {\n if (typeof window === 'undefined' || typeof localStorage === 'undefined') {\n return null;\n }\n\n try {\n const key = `_grain_first_touch_${tenantId}`;\n const stored = localStorage.getItem(key);\n if (stored) {\n return JSON.parse(stored) as FirstTouchAttribution;\n }\n } catch (error) {\n console.warn('[Grain Attribution] Failed to retrieve first-touch attribution:', error);\n }\n\n return null;\n}\n\n/**\n * Set first-touch attribution in localStorage\n */\nexport function setFirstTouchAttribution(\n tenantId: string,\n attribution: FirstTouchAttribution\n): void {\n if (typeof window === 'undefined' || typeof localStorage === 'undefined') {\n return;\n }\n\n try {\n const key = `_grain_first_touch_${tenantId}`;\n localStorage.setItem(key, JSON.stringify(attribution));\n } catch (error) {\n console.warn('[Grain Attribution] Failed to store first-touch attribution:', error);\n }\n}\n\n/**\n * Get or create first-touch attribution\n */\nexport function getOrCreateFirstTouchAttribution(\n tenantId: string,\n referrer: string,\n currentUrl: string,\n utmParams: UTMParameters\n): FirstTouchAttribution {\n // Try to get existing first-touch\n const existing = getFirstTouchAttribution(tenantId);\n if (existing) {\n return existing;\n }\n\n // Create new first-touch attribution\n const referrerCategory = categorizeReferrer(referrer, currentUrl);\n const referrerDomain = extractDomain(referrer);\n\n const firstTouch: FirstTouchAttribution = {\n source: utmParams.utm_source || referrerDomain || 'direct',\n medium: utmParams.utm_medium || referrerCategory,\n campaign: utmParams.utm_campaign || 'none',\n referrer: referrer || 'direct',\n referrer_category: referrerCategory,\n timestamp: Date.now(),\n };\n\n // Store it\n setFirstTouchAttribution(tenantId, firstTouch);\n\n return firstTouch;\n}\n\n/**\n * Get session UTM parameters (memory-only, not persisted across page loads)\n */\nlet sessionUTMParams: UTMParameters | null = null;\n\nexport function getSessionUTMParameters(): UTMParameters | null {\n return sessionUTMParams;\n}\n\nexport function setSessionUTMParameters(params: UTMParameters): void {\n sessionUTMParams = params;\n}\n\n/**\n * Clear session UTM parameters\n */\nexport function clearSessionUTMParameters(): void {\n sessionUTMParams = null;\n}\n\n", "const countries = {\n\t\tAD: \"Andorra\",\n\t\tAE: \"United Arab Emirates\",\n\t\tAF: \"Afghanistan\",\n\t\tAG: \"Antigua and Barbuda\",\n\t\tAI: \"Anguilla\",\n\t\tAL: \"Albania\",\n\t\tAM: \"Armenia\",\n\t\tAO: \"Angola\",\n\t\tAQ: \"Antarctica\",\n\t\tAR: \"Argentina\",\n\t\tAS: \"American Samoa\",\n\t\tAT: \"Austria\",\n\t\tAU: \"Australia\",\n\t\tAW: \"Aruba\",\n\t\tAX: \"\u00C5land Islands\",\n\t\tAZ: \"Azerbaijan\",\n\t\tBA: \"Bosnia and Herzegovina\",\n\t\tBB: \"Barbados\",\n\t\tBD: \"Bangladesh\",\n\t\tBE: \"Belgium\",\n\t\tBF: \"Burkina Faso\",\n\t\tBG: \"Bulgaria\",\n\t\tBH: \"Bahrain\",\n\t\tBI: \"Burundi\",\n\t\tBJ: \"Benin\",\n\t\tBL: \"Saint Barth\u00E9lemy\",\n\t\tBM: \"Bermuda\",\n\t\tBN: \"Brunei\",\n\t\tBO: \"Bolivia\",\n\t\tBQ: \"Caribbean Netherlands\",\n\t\tBR: \"Brazil\",\n\t\tBS: \"Bahamas\",\n\t\tBT: \"Bhutan\",\n\t\tBV: \"Bouvet Island\",\n\t\tBW: \"Botswana\",\n\t\tBY: \"Belarus\",\n\t\tBZ: \"Belize\",\n\t\tCA: \"Canada\",\n\t\tCC: \"Cocos Islands\",\n\t\tCD: \"Democratic Republic of the Congo\",\n\t\tCF: \"Central African Republic\",\n\t\tCG: \"Republic of the Congo\",\n\t\tCH: \"Switzerland\",\n\t\tCI: \"Ivory Coast\",\n\t\tCK: \"Cook Islands\",\n\t\tCL: \"Chile\",\n\t\tCM: \"Cameroon\",\n\t\tCN: \"China\",\n\t\tCO: \"Colombia\",\n\t\tCR: \"Costa Rica\",\n\t\tCU: \"Cuba\",\n\t\tCV: \"Cabo Verde\",\n\t\tCW: \"Cura\u00E7ao\",\n\t\tCX: \"Christmas Island\",\n\t\tCY: \"Cyprus\",\n\t\tCZ: \"Czechia\",\n\t\tDE: \"Germany\",\n\t\tDJ: \"Djibouti\",\n\t\tDK: \"Denmark\",\n\t\tDM: \"Dominica\",\n\t\tDO: \"Dominican Republic\",\n\t\tDZ: \"Algeria\",\n\t\tEC: \"Ecuador\",\n\t\tEE: \"Estonia\",\n\t\tEG: \"Egypt\",\n\t\tEH: \"Western Sahara\",\n\t\tER: \"Eritrea\",\n\t\tES: \"Spain\",\n\t\tET: \"Ethiopia\",\n\t\tFI: \"Finland\",\n\t\tFJ: \"Fiji\",\n\t\tFK: \"Falkland Islands\",\n\t\tFM: \"Micronesia\",\n\t\tFO: \"Faroe Islands\",\n\t\tFR: \"France\",\n\t\tGA: \"Gabon\",\n\t\tGB: \"United Kingdom\",\n\t\tGD: \"Grenada\",\n\t\tGE: \"Georgia\",\n\t\tGF: \"French Guiana\",\n\t\tGG: \"Guernsey\",\n\t\tGH: \"Ghana\",\n\t\tGI: \"Gibraltar\",\n\t\tGL: \"Greenland\",\n\t\tGM: \"Gambia\",\n\t\tGN: \"Guinea\",\n\t\tGP: \"Guadeloupe\",\n\t\tGQ: \"Equatorial Guinea\",\n\t\tGR: \"Greece\",\n\t\tGS: \"South Georgia and the South Sandwich Islands\",\n\t\tGT: \"Guatemala\",\n\t\tGU: \"Guam\",\n\t\tGW: \"Guinea-Bissau\",\n\t\tGY: \"Guyana\",\n\t\tHK: \"Hong Kong\",\n\t\tHM: \"Heard Island and McDonald Islands\",\n\t\tHN: \"Honduras\",\n\t\tHR: \"Croatia\",\n\t\tHT: \"Haiti\",\n\t\tHU: \"Hungary\",\n\t\tID: \"Indonesia\",\n\t\tIE: \"Ireland\",\n\t\tIL: \"Israel\",\n\t\tIM: \"Isle of Man\",\n\t\tIN: \"India\",\n\t\tIO: \"British Indian Ocean Territory\",\n\t\tIQ: \"Iraq\",\n\t\tIR: \"Iran\",\n\t\tIS: \"Iceland\",\n\t\tIT: \"Italy\",\n\t\tJE: \"Jersey\",\n\t\tJM: \"Jamaica\",\n\t\tJO: \"Jordan\",\n\t\tJP: \"Japan\",\n\t\tKE: \"Kenya\",\n\t\tKG: \"Kyrgyzstan\",\n\t\tKH: \"Cambodia\",\n\t\tKI: \"Kiribati\",\n\t\tKM: \"Comoros\",\n\t\tKN: \"Saint Kitts and Nevis\",\n\t\tKP: \"North Korea\",\n\t\tKR: \"South Korea\",\n\t\tKW: \"Kuwait\",\n\t\tKY: \"Cayman Islands\",\n\t\tKZ: \"Kazakhstan\",\n\t\tLA: \"Laos\",\n\t\tLB: \"Lebanon\",\n\t\tLC: \"Saint Lucia\",\n\t\tLI: \"Liechtenstein\",\n\t\tLK: \"Sri Lanka\",\n\t\tLR: \"Liberia\",\n\t\tLS: \"Lesotho\",\n\t\tLT: \"Lithuania\",\n\t\tLU: \"Luxembourg\",\n\t\tLV: \"Latvia\",\n\t\tLY: \"Libya\",\n\t\tMA: \"Morocco\",\n\t\tMC: \"Monaco\",\n\t\tMD: \"Moldova\",\n\t\tME: \"Montenegro\",\n\t\tMF: \"Saint Martin\",\n\t\tMG: \"Madagascar\",\n\t\tMH: \"Marshall Islands\",\n\t\tMK: \"North Macedonia\",\n\t\tML: \"Mali\",\n\t\tMM: \"Myanmar\",\n\t\tMN: \"Mongolia\",\n\t\tMO: \"Macao\",\n\t\tMP: \"Northern Mariana Islands\",\n\t\tMQ: \"Martinique\",\n\t\tMR: \"Mauritania\",\n\t\tMS: \"Montserrat\",\n\t\tMT: \"Malta\",\n\t\tMU: \"Mauritius\",\n\t\tMV: \"Maldives\",\n\t\tMW: \"Malawi\",\n\t\tMX: \"Mexico\",\n\t\tMY: \"Malaysia\",\n\t\tMZ: \"Mozambique\",\n\t\tNA: \"Namibia\",\n\t\tNC: \"New Caledonia\",\n\t\tNE: \"Niger\",\n\t\tNF: \"Norfolk Island\",\n\t\tNG: \"Nigeria\",\n\t\tNI: \"Nicaragua\",\n\t\tNL: \"Netherlands\",\n\t\tNO: \"Norway\",\n\t\tNP: \"Nepal\",\n\t\tNR: \"Nauru\",\n\t\tNU: \"Niue\",\n\t\tNZ: \"New Zealand\",\n\t\tOM: \"Oman\",\n\t\tPA: \"Panama\",\n\t\tPE: \"Peru\",\n\t\tPF: \"French Polynesia\",\n\t\tPG: \"Papua New Guinea\",\n\t\tPH: \"Philippines\",\n\t\tPK: \"Pakistan\",\n\t\tPL: \"Poland\",\n\t\tPM: \"Saint Pierre and Miquelon\",\n\t\tPN: \"Pitcairn\",\n\t\tPR: \"Puerto Rico\",\n\t\tPS: \"Palestine\",\n\t\tPT: \"Portugal\",\n\t\tPW: \"Palau\",\n\t\tPY: \"Paraguay\",\n\t\tQA: \"Qatar\",\n\t\tRE: \"R\u00E9union\",\n\t\tRO: \"Romania\",\n\t\tRS: \"Serbia\",\n\t\tRU: \"Russia\",\n\t\tRW: \"Rwanda\",\n\t\tSA: \"Saudi Arabia\",\n\t\tSB: \"Solomon Islands\",\n\t\tSC: \"Seychelles\",\n\t\tSD: \"Sudan\",\n\t\tSE: \"Sweden\",\n\t\tSG: \"Singapore\",\n\t\tSH: \"Saint Helena, Ascension and Tristan da Cunha\",\n\t\tSI: \"Slovenia\",\n\t\tSJ: \"Svalbard and Jan Mayen\",\n\t\tSK: \"Slovakia\",\n\t\tSL: \"Sierra Leone\",\n\t\tSM: \"San Marino\",\n\t\tSN: \"Senegal\",\n\t\tSO: \"Somalia\",\n\t\tSR: \"Suriname\",\n\t\tSS: \"South Sudan\",\n\t\tST: \"Sao Tome and Principe\",\n\t\tSV: \"El Salvador\",\n\t\tSX: \"Sint Maarten\",\n\t\tSY: \"Syria\",\n\t\tSZ: \"Eswatini\",\n\t\tTC: \"Turks and Caicos Islands\",\n\t\tTD: \"Chad\",\n\t\tTF: \"French Southern Territories\",\n\t\tTG: \"Togo\",\n\t\tTH: \"Thailand\",\n\t\tTJ: \"Tajikistan\",\n\t\tTK: \"Tokelau\",\n\t\tTL: \"Timor-Leste\",\n\t\tTM: \"Turkmenistan\",\n\t\tTN: \"Tunisia\",\n\t\tTO: \"Tonga\",\n\t\tTR: \"Turkey\",\n\t\tTT: \"Trinidad and Tobago\",\n\t\tTV: \"Tuvalu\",\n\t\tTW: \"Taiwan\",\n\t\tTZ: \"Tanzania\",\n\t\tUA: \"Ukraine\",\n\t\tUG: \"Uganda\",\n\t\tUM: \"United States Minor Outlying Islands\",\n\t\tUS: \"United States of America\",\n\t\tUY: \"Uruguay\",\n\t\tUZ: \"Uzbekistan\",\n\t\tVA: \"Holy See\",\n\t\tVC: \"Saint Vincent and the Grenadines\",\n\t\tVE: \"Venezuela\",\n\t\tVG: \"Virgin Islands (UK)\",\n\t\tVI: \"Virgin Islands (US)\",\n\t\tVN: \"Vietnam\",\n\t\tVU: \"Vanuatu\",\n\t\tWF: \"Wallis and Futuna\",\n\t\tWS: \"Samoa\",\n\t\tYE: \"Yemen\",\n\t\tYT: \"Mayotte\",\n\t\tZA: \"South Africa\",\n\t\tZM: \"Zambia\",\n\t\tZW: \"Zimbabwe\"\n};\n\nconst timezones: Record<string, any> = {\n\t\t\"Africa/Abidjan\": {\n\t\t\tu: 0,\n\t\t\tc: [\"CI\", \"BF\", \"GH\", \"GM\", \"GN\", \"ML\", \"MR\", \"SH\", \"SL\", \"SN\", \"TG\"]\n\t\t},\n\t\t\"Africa/Accra\": {\n\t\t\ta: \"Africa/Abidjan\",\n\t\t\tc: [\"GH\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Addis_Ababa\": {\n\t\t\ta: \"Africa/Nairobi\",\n\t\t\tc: [\"ET\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Algiers\": {\n\t\t\tu: 60,\n\t\t\tc: [\"DZ\"]\n\t\t},\n\t\t\"Africa/Asmara\": {\n\t\t\ta: \"Africa/Nairobi\",\n\t\t\tc: [\"ER\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Asmera\": {\n\t\t\ta: \"Africa/Nairobi\",\n\t\t\tc: [\"ER\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Bamako\": {\n\t\t\ta: \"Africa/Abidjan\",\n\t\t\tc: [\"ML\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Bangui\": {\n\t\t\ta: \"Africa/Lagos\",\n\t\t\tc: [\"CF\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Banjul\": {\n\t\t\ta: \"Africa/Abidjan\",\n\t\t\tc: [\"GM\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Bissau\": {\n\t\t\tu: 0,\n\t\t\tc: [\"GW\"]\n\t\t},\n\t\t\"Africa/Blantyre\": {\n\t\t\ta: \"Africa/Maputo\",\n\t\t\tc: [\"MW\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Brazzaville\": {\n\t\t\ta: \"Africa/Lagos\",\n\t\t\tc: [\"CG\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Bujumbura\": {\n\t\t\ta: \"Africa/Maputo\",\n\t\t\tc: [\"BI\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Cairo\": {\n\t\t\tu: 120,\n\t\t\tc: [\"EG\"]\n\t\t},\n\t\t\"Africa/Casablanca\": {\n\t\t\tu: 60,\n\t\t\td: 0,\n\t\t\tc: [\"MA\"]\n\t\t},\n\t\t\"Africa/Ceuta\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"ES\"]\n\t\t},\n\t\t\"Africa/Conakry\": {\n\t\t\ta: \"Africa/Abidjan\",\n\t\t\tc: [\"GN\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Dakar\": {\n\t\t\ta: \"Africa/Abidjan\",\n\t\t\tc: [\"SN\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Dar_es_Salaam\": {\n\t\t\ta: \"Africa/Nairobi\",\n\t\t\tc: [\"TZ\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Djibouti\": {\n\t\t\ta: \"Africa/Nairobi\",\n\t\t\tc: [\"DJ\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Douala\": {\n\t\t\ta: \"Africa/Lagos\",\n\t\t\tc: [\"CM\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/El_Aaiun\": {\n\t\t\tu: 60,\n\t\t\td: 0,\n\t\t\tc: [\"EH\"]\n\t\t},\n\t\t\"Africa/Freetown\": {\n\t\t\ta: \"Africa/Abidjan\",\n\t\t\tc: [\"SL\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Gaborone\": {\n\t\t\ta: \"Africa/Maputo\",\n\t\t\tc: [\"BW\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Harare\": {\n\t\t\ta: \"Africa/Maputo\",\n\t\t\tc: [\"ZW\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Johannesburg\": {\n\t\t\tu: 120,\n\t\t\tc: [\"ZA\", \"LS\", \"SZ\"]\n\t\t},\n\t\t\"Africa/Juba\": {\n\t\t\tu: 120,\n\t\t\tc: [\"SS\"]\n\t\t},\n\t\t\"Africa/Kampala\": {\n\t\t\ta: \"Africa/Nairobi\",\n\t\t\tc: [\"UG\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Khartoum\": {\n\t\t\tu: 120,\n\t\t\tc: [\"SD\"]\n\t\t},\n\t\t\"Africa/Kigali\": {\n\t\t\ta: \"Africa/Maputo\",\n\t\t\tc: [\"RW\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Kinshasa\": {\n\t\t\ta: \"Africa/Lagos\",\n\t\t\tc: [\"CD\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Lagos\": {\n\t\t\tu: 60,\n\t\t\tc: [\"NG\", \"AO\", \"BJ\", \"CD\", \"CF\", \"CG\", \"CM\", \"GA\", \"GQ\", \"NE\"]\n\t\t},\n\t\t\"Africa/Libreville\": {\n\t\t\ta: \"Africa/Lagos\",\n\t\t\tc: [\"GA\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Lome\": {\n\t\t\ta: \"Africa/Abidjan\",\n\t\t\tc: [\"TG\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Luanda\": {\n\t\t\ta: \"Africa/Lagos\",\n\t\t\tc: [\"AO\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Lubumbashi\": {\n\t\t\ta: \"Africa/Maputo\",\n\t\t\tc: [\"CD\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Lusaka\": {\n\t\t\ta: \"Africa/Maputo\",\n\t\t\tc: [\"ZM\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Malabo\": {\n\t\t\ta: \"Africa/Lagos\",\n\t\t\tc: [\"GQ\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Maputo\": {\n\t\t\tu: 120,\n\t\t\tc: [\"MZ\", \"BI\", \"BW\", \"CD\", \"MW\", \"RW\", \"ZM\", \"ZW\"]\n\t\t},\n\t\t\"Africa/Maseru\": {\n\t\t\ta: \"Africa/Johannesburg\",\n\t\t\tc: [\"LS\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Mbabane\": {\n\t\t\ta: \"Africa/Johannesburg\",\n\t\t\tc: [\"SZ\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Mogadishu\": {\n\t\t\ta: \"Africa/Nairobi\",\n\t\t\tc: [\"SO\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Monrovia\": {\n\t\t\tu: 0,\n\t\t\tc: [\"LR\"]\n\t\t},\n\t\t\"Africa/Nairobi\": {\n\t\t\tu: 180,\n\t\t\tc: [\"KE\", \"DJ\", \"ER\", \"ET\", \"KM\", \"MG\", \"SO\", \"TZ\", \"UG\", \"YT\"]\n\t\t},\n\t\t\"Africa/Ndjamena\": {\n\t\t\tu: 60,\n\t\t\tc: [\"TD\"]\n\t\t},\n\t\t\"Africa/Niamey\": {\n\t\t\ta: \"Africa/Lagos\",\n\t\t\tc: [\"NE\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Nouakchott\": {\n\t\t\ta: \"Africa/Abidjan\",\n\t\t\tc: [\"MR\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Ouagadougou\": {\n\t\t\ta: \"Africa/Abidjan\",\n\t\t\tc: [\"BF\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Porto-Novo\": {\n\t\t\ta: \"Africa/Lagos\",\n\t\t\tc: [\"BJ\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Sao_Tome\": {\n\t\t\tu: 0,\n\t\t\tc: [\"ST\"]\n\t\t},\n\t\t\"Africa/Timbuktu\": {\n\t\t\ta: \"Africa/Abidjan\",\n\t\t\tc: [\"ML\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Tripoli\": {\n\t\t\tu: 120,\n\t\t\tc: [\"LY\"]\n\t\t},\n\t\t\"Africa/Tunis\": {\n\t\t\tu: 60,\n\t\t\tc: [\"TN\"]\n\t\t},\n\t\t\"Africa/Windhoek\": {\n\t\t\tu: 120,\n\t\t\tc: [\"NA\"]\n\t\t},\n\t\t\"America/Adak\": {\n\t\t\tu: -600,\n\t\t\td: -540,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Anchorage\": {\n\t\t\tu: -540,\n\t\t\td: -480,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Anguilla\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"AI\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Antigua\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"AG\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Araguaina\": {\n\t\t\tu: -180,\n\t\t\tc: [\"BR\"]\n\t\t},\n\t\t\"America/Argentina/Buenos_Aires\": {\n\t\t\tu: -180,\n\t\t\tc: [\"AR\"]\n\t\t},\n\t\t\"America/Argentina/Catamarca\": {\n\t\t\tu: -180,\n\t\t\tc: [\"AR\"]\n\t\t},\n\t\t\"America/Argentina/ComodRivadavia\": {\n\t\t\ta: \"America/Argentina/Catamarca\",\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Argentina/Cordoba\": {\n\t\t\tu: -180,\n\t\t\tc: [\"AR\"]\n\t\t},\n\t\t\"America/Argentina/Jujuy\": {\n\t\t\tu: -180,\n\t\t\tc: [\"AR\"]\n\t\t},\n\t\t\"America/Argentina/La_Rioja\": {\n\t\t\tu: -180,\n\t\t\tc: [\"AR\"]\n\t\t},\n\t\t\"America/Argentina/Mendoza\": {\n\t\t\tu: -180,\n\t\t\tc: [\"AR\"]\n\t\t},\n\t\t\"America/Argentina/Rio_Gallegos\": {\n\t\t\tu: -180,\n\t\t\tc: [\"AR\"]\n\t\t},\n\t\t\"America/Argentina/Salta\": {\n\t\t\tu: -180,\n\t\t\tc: [\"AR\"]\n\t\t},\n\t\t\"America/Argentina/San_Juan\": {\n\t\t\tu: -180,\n\t\t\tc: [\"AR\"]\n\t\t},\n\t\t\"America/Argentina/San_Luis\": {\n\t\t\tu: -180,\n\t\t\tc: [\"AR\"]\n\t\t},\n\t\t\"America/Argentina/Tucuman\": {\n\t\t\tu: -180,\n\t\t\tc: [\"AR\"]\n\t\t},\n\t\t\"America/Argentina/Ushuaia\": {\n\t\t\tu: -180,\n\t\t\tc: [\"AR\"]\n\t\t},\n\t\t\"America/Aruba\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"AW\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Asuncion\": {\n\t\t\tu: -240,\n\t\t\td: -180,\n\t\t\tc: [\"PY\"]\n\t\t},\n\t\t\"America/Atikokan\": {\n\t\t\ta: \"America/Panama\",\n\t\t\tc: [\"CA\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Atka\": {\n\t\t\ta: \"America/Adak\",\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Bahia\": {\n\t\t\tu: -180,\n\t\t\tc: [\"BR\"]\n\t\t},\n\t\t\"America/Bahia_Banderas\": {\n\t\t\tu: -360,\n\t\t\td: -300,\n\t\t\tc: [\"MX\"]\n\t\t},\n\t\t\"America/Barbados\": {\n\t\t\tu: -240,\n\t\t\tc: [\"BB\"]\n\t\t},\n\t\t\"America/Belem\": {\n\t\t\tu: -180,\n\t\t\tc: [\"BR\"]\n\t\t},\n\t\t\"America/Belize\": {\n\t\t\tu: -360,\n\t\t\tc: [\"BZ\"]\n\t\t},\n\t\t\"America/Blanc-Sablon\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"CA\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Boa_Vista\": {\n\t\t\tu: -240,\n\t\t\tc: [\"BR\"]\n\t\t},\n\t\t\"America/Bogota\": {\n\t\t\tu: -300,\n\t\t\tc: [\"CO\"]\n\t\t},\n\t\t\"America/Boise\": {\n\t\t\tu: -420,\n\t\t\td: -360,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Buenos_Aires\": {\n\t\t\ta: \"America/Argentina/Buenos_Aires\",\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Cambridge_Bay\": {\n\t\t\tu: -420,\n\t\t\td: -360,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Campo_Grande\": {\n\t\t\tu: -240,\n\t\t\tc: [\"BR\"]\n\t\t},\n\t\t\"America/Cancun\": {\n\t\t\tu: -300,\n\t\t\tc: [\"MX\"]\n\t\t},\n\t\t\"America/Caracas\": {\n\t\t\tu: -240,\n\t\t\tc: [\"VE\"]\n\t\t},\n\t\t\"America/Catamarca\": {\n\t\t\ta: \"America/Argentina/Catamarca\",\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Cayenne\": {\n\t\t\tu: -180,\n\t\t\tc: [\"GF\"]\n\t\t},\n\t\t\"America/Cayman\": {\n\t\t\ta: \"America/Panama\",\n\t\t\tc: [\"KY\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Chicago\": {\n\t\t\tu: -360,\n\t\t\td: -300,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Chihuahua\": {\n\t\t\tu: -420,\n\t\t\td: -360,\n\t\t\tc: [\"MX\"]\n\t\t},\n\t\t\"America/Coral_Harbour\": {\n\t\t\ta: \"America/Panama\",\n\t\t\tc: [\"CA\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Cordoba\": {\n\t\t\ta: \"America/Argentina/Cordoba\",\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Costa_Rica\": {\n\t\t\tu: -360,\n\t\t\tc: [\"CR\"]\n\t\t},\n\t\t\"America/Creston\": {\n\t\t\ta: \"America/Phoenix\",\n\t\t\tc: [\"CA\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Cuiaba\": {\n\t\t\tu: -240,\n\t\t\tc: [\"BR\"]\n\t\t},\n\t\t\"America/Curacao\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"CW\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Danmarkshavn\": {\n\t\t\tu: 0,\n\t\t\tc: [\"GL\"]\n\t\t},\n\t\t\"America/Dawson\": {\n\t\t\tu: -420,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Dawson_Creek\": {\n\t\t\tu: -420,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Denver\": {\n\t\t\tu: -420,\n\t\t\td: -360,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Detroit\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Dominica\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"DM\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Edmonton\": {\n\t\t\tu: -420,\n\t\t\td: -360,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Eirunepe\": {\n\t\t\tu: -300,\n\t\t\tc: [\"BR\"]\n\t\t},\n\t\t\"America/El_Salvador\": {\n\t\t\tu: -360,\n\t\t\tc: [\"SV\"]\n\t\t},\n\t\t\"America/Ensenada\": {\n\t\t\ta: \"America/Tijuana\",\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Fort_Nelson\": {\n\t\t\tu: -420,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Fort_Wayne\": {\n\t\t\ta: \"America/Indiana/Indianapolis\",\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Fortaleza\": {\n\t\t\tu: -180,\n\t\t\tc: [\"BR\"]\n\t\t},\n\t\t\"America/Glace_Bay\": {\n\t\t\tu: -240,\n\t\t\td: -180,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Godthab\": {\n\t\t\ta: \"America/Nuuk\",\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Goose_Bay\": {\n\t\t\tu: -240,\n\t\t\td: -180,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Grand_Turk\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"TC\"]\n\t\t},\n\t\t\"America/Grenada\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"GD\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Guadeloupe\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"GP\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Guatemala\": {\n\t\t\tu: -360,\n\t\t\tc: [\"GT\"]\n\t\t},\n\t\t\"America/Guayaquil\": {\n\t\t\tu: -300,\n\t\t\tc: [\"EC\"]\n\t\t},\n\t\t\"America/Guyana\": {\n\t\t\tu: -240,\n\t\t\tc: [\"GY\"]\n\t\t},\n\t\t\"America/Halifax\": {\n\t\t\tu: -240,\n\t\t\td: -180,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Havana\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"CU\"]\n\t\t},\n\t\t\"America/Hermosillo\": {\n\t\t\tu: -420,\n\t\t\tc: [\"MX\"]\n\t\t},\n\t\t\"America/Indiana/Indianapolis\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Indiana/Knox\": {\n\t\t\tu: -360,\n\t\t\td: -300,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Indiana/Marengo\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Indiana/Petersburg\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Indiana/Tell_City\": {\n\t\t\tu: -360,\n\t\t\td: -300,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Indiana/Vevay\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Indiana/Vincennes\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Indiana/Winamac\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Indianapolis\": {\n\t\t\ta: \"America/Indiana/Indianapolis\",\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Inuvik\": {\n\t\t\tu: -420,\n\t\t\td: -360,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Iqaluit\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Jamaica\": {\n\t\t\tu: -300,\n\t\t\tc: [\"JM\"]\n\t\t},\n\t\t\"America/Jujuy\": {\n\t\t\ta: \"America/Argentina/Jujuy\",\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Juneau\": {\n\t\t\tu: -540,\n\t\t\td: -480,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Kentucky/Louisville\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Kentucky/Monticello\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Knox_IN\": {\n\t\t\ta: \"America/Indiana/Knox\",\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Kralendijk\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"BQ\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/La_Paz\": {\n\t\t\tu: -240,\n\t\t\tc: [\"BO\"]\n\t\t},\n\t\t\"America/Lima\": {\n\t\t\tu: -300,\n\t\t\tc: [\"PE\"]\n\t\t},\n\t\t\"America/Los_Angeles\": {\n\t\t\tu: -480,\n\t\t\td: -420,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Louisville\": {\n\t\t\ta: \"America/Kentucky/Louisville\",\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Lower_Princes\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"SX\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Maceio\": {\n\t\t\tu: -180,\n\t\t\tc: [\"BR\"]\n\t\t},\n\t\t\"America/Managua\": {\n\t\t\tu: -360,\n\t\t\tc: [\"NI\"]\n\t\t},\n\t\t\"America/Manaus\": {\n\t\t\tu: -240,\n\t\t\tc: [\"BR\"]\n\t\t},\n\t\t\"America/Marigot\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"MF\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Martinique\": {\n\t\t\tu: -240,\n\t\t\tc: [\"MQ\"]\n\t\t},\n\t\t\"America/Matamoros\": {\n\t\t\tu: -360,\n\t\t\td: -300,\n\t\t\tc: [\"MX\"]\n\t\t},\n\t\t\"America/Mazatlan\": {\n\t\t\tu: -420,\n\t\t\td: -360,\n\t\t\tc: [\"MX\"]\n\t\t},\n\t\t\"America/Mendoza\": {\n\t\t\ta: \"America/Argentina/Mendoza\",\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Menominee\": {\n\t\t\tu: -360,\n\t\t\td: -300,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Merida\": {\n\t\t\tu: -360,\n\t\t\td: -300,\n\t\t\tc: [\"MX\"]\n\t\t},\n\t\t\"America/Metlakatla\": {\n\t\t\tu: -540,\n\t\t\td: -480,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Mexico_City\": {\n\t\t\tu: -360,\n\t\t\td: -300,\n\t\t\tc: [\"MX\"]\n\t\t},\n\t\t\"America/Miquelon\": {\n\t\t\tu: -180,\n\t\t\td: -120,\n\t\t\tc: [\"PM\"]\n\t\t},\n\t\t\"America/Moncton\": {\n\t\t\tu: -240,\n\t\t\td: -180,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Monterrey\": {\n\t\t\tu: -360,\n\t\t\td: -300,\n\t\t\tc: [\"MX\"]\n\t\t},\n\t\t\"America/Montevideo\": {\n\t\t\tu: -180,\n\t\t\tc: [\"UY\"]\n\t\t},\n\t\t\"America/Montreal\": {\n\t\t\ta: \"America/Toronto\",\n\t\t\tc: [\"CA\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Montserrat\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"MS\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Nassau\": {\n\t\t\ta: \"America/Toronto\",\n\t\t\tc: [\"BS\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/New_York\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Nipigon\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Nome\": {\n\t\t\tu: -540,\n\t\t\td: -480,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Noronha\": {\n\t\t\tu: -120,\n\t\t\tc: [\"BR\"]\n\t\t},\n\t\t\"America/North_Dakota/Beulah\": {\n\t\t\tu: -360,\n\t\t\td: -300,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/North_Dakota/Center\": {\n\t\t\tu: -360,\n\t\t\td: -300,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/North_Dakota/New_Salem\": {\n\t\t\tu: -360,\n\t\t\td: -300,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Nuuk\": {\n\t\t\tu: -180,\n\t\t\td: -120,\n\t\t\tc: [\"GL\"]\n\t\t},\n\t\t\"America/Ojinaga\": {\n\t\t\tu: -420,\n\t\t\td: -360,\n\t\t\tc: [\"MX\"]\n\t\t},\n\t\t\"America/Panama\": {\n\t\t\tu: -300,\n\t\t\tc: [\"PA\", \"CA\", \"KY\"]\n\t\t},\n\t\t\"America/Pangnirtung\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Paramaribo\": {\n\t\t\tu: -180,\n\t\t\tc: [\"SR\"]\n\t\t},\n\t\t\"America/Phoenix\": {\n\t\t\tu: -420,\n\t\t\tc: [\"US\", \"CA\"]\n\t\t},\n\t\t\"America/Port-au-Prince\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"HT\"]\n\t\t},\n\t\t\"America/Port_of_Spain\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"TT\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Porto_Acre\": {\n\t\t\ta: \"America/Rio_Branco\",\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Porto_Velho\": {\n\t\t\tu: -240,\n\t\t\tc: [\"BR\"]\n\t\t},\n\t\t\"America/Puerto_Rico\": {\n\t\t\tu: -240,\n\t\t\tc: [\n\t\t\t\t\"PR\",\n\t\t\t\t\"AG\",\n\t\t\t\t\"CA\",\n\t\t\t\t\"AI\",\n\t\t\t\t\"AW\",\n\t\t\t\t\"BL\",\n\t\t\t\t\"BQ\",\n\t\t\t\t\"CW\",\n\t\t\t\t\"DM\",\n\t\t\t\t\"GD\",\n\t\t\t\t\"GP\",\n\t\t\t\t\"KN\",\n\t\t\t\t\"LC\",\n\t\t\t\t\"MF\",\n\t\t\t\t\"MS\",\n\t\t\t\t\"SX\",\n\t\t\t\t\"TT\",\n\t\t\t\t\"VC\",\n\t\t\t\t\"VG\",\n\t\t\t\t\"VI\"\n\t\t\t]\n\t\t},\n\t\t\"America/Punta_Arenas\": {\n\t\t\tu: -180,\n\t\t\tc: [\"CL\"]\n\t\t},\n\t\t\"America/Rainy_River\": {\n\t\t\tu: -360,\n\t\t\td: -300,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Rankin_Inlet\": {\n\t\t\tu: -360,\n\t\t\td: -300,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Recife\": {\n\t\t\tu: -180,\n\t\t\tc: [\"BR\"]\n\t\t},\n\t\t\"America/Regina\": {\n\t\t\tu: -360,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Resolute\": {\n\t\t\tu: -360,\n\t\t\td: -300,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Rio_Branco\": {\n\t\t\tu: -300,\n\t\t\tc: [\"BR\"]\n\t\t},\n\t\t\"America/Rosario\": {\n\t\t\ta: \"America/Argentina/Cordoba\",\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Santa_Isabel\": {\n\t\t\ta: \"America/Tijuana\",\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Santarem\": {\n\t\t\tu: -180,\n\t\t\tc: [\"BR\"]\n\t\t},\n\t\t\"America/Santiago\": {\n\t\t\tu: -240,\n\t\t\td: -180,\n\t\t\tc: [\"CL\"]\n\t\t},\n\t\t\"America/Santo_Domingo\": {\n\t\t\tu: -240,\n\t\t\tc: [\"DO\"]\n\t\t},\n\t\t\"America/Sao_Paulo\": {\n\t\t\tu: -180,\n\t\t\tc: [\"BR\"]\n\t\t},\n\t\t\"America/Scoresbysund\": {\n\t\t\tu: -60,\n\t\t\td: 0,\n\t\t\tc: [\"GL\"]\n\t\t},\n\t\t\"America/Shiprock\": {\n\t\t\ta: \"America/Denver\",\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Sitka\": {\n\t\t\tu: -540,\n\t\t\td: -480,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/St_Barthelemy\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"BL\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/St_Johns\": {\n\t\t\tu: -150,\n\t\t\td: -90,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/St_Kitts\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"KN\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/St_Lucia\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"LC\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/St_Thomas\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"VI\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/St_Vincent\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"VC\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Swift_Current\": {\n\t\t\tu: -360,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Tegucigalpa\": {\n\t\t\tu: -360,\n\t\t\tc: [\"HN\"]\n\t\t},\n\t\t\"America/Thule\": {\n\t\t\tu: -240,\n\t\t\td: -180,\n\t\t\tc: [\"GL\"]\n\t\t},\n\t\t\"America/Thunder_Bay\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Tijuana\": {\n\t\t\tu: -480,\n\t\t\td: -420,\n\t\t\tc: [\"MX\"]\n\t\t},\n\t\t\"America/Toronto\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"CA\", \"BS\"]\n\t\t},\n\t\t\"America/Tortola\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"VG\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Vancouver\": {\n\t\t\tu: -480,\n\t\t\td: -420,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Virgin\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"VI\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Whitehorse\": {\n\t\t\tu: -420,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Winnipeg\": {\n\t\t\tu: -360,\n\t\t\td: -300,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Yakutat\": {\n\t\t\tu: -540,\n\t\t\td: -480,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Yellowknife\": {\n\t\t\tu: -420,\n\t\t\td: -360,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"Antarctica/Casey\": {\n\t\t\tu: 660,\n\t\t\tc: [\"AQ\"]\n\t\t},\n\t\t\"Antarctica/Davis\": {\n\t\t\tu: 420,\n\t\t\tc: [\"AQ\"]\n\t\t},\n\t\t\"Antarctica/DumontDUrville\": {\n\t\t\ta: \"Pacific/Port_Moresby\",\n\t\t\tc: [\"AQ\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Antarctica/Macquarie\": {\n\t\t\tu: 600,\n\t\t\td: 660,\n\t\t\tc: [\"AU\"]\n\t\t},\n\t\t\"Antarctica/Mawson\": {\n\t\t\tu: 300,\n\t\t\tc: [\"AQ\"]\n\t\t},\n\t\t\"Antarctica/McMurdo\": {\n\t\t\ta: \"Pacific/Auckland\",\n\t\t\tc: [\"AQ\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Antarctica/Palmer\": {\n\t\t\tu: -180,\n\t\t\tc: [\"AQ\"]\n\t\t},\n\t\t\"Antarctica/Rothera\": {\n\t\t\tu: -180,\n\t\t\tc: [\"AQ\"]\n\t\t},\n\t\t\"Antarctica/South_Pole\": {\n\t\t\ta: \"Pacific/Auckland\",\n\t\t\tc: [\"AQ\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Antarctica/Syowa\": {\n\t\t\ta: \"Asia/Riyadh\",\n\t\t\tc: [\"AQ\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Antarctica/Troll\": {\n\t\t\tu: 0,\n\t\t\td: 120,\n\t\t\tc: [\"AQ\"]\n\t\t},\n\t\t\"Antarctica/Vostok\": {\n\t\t\tu: 360,\n\t\t\tc: [\"AQ\"]\n\t\t},\n\t\t\"Arctic/Longyearbyen\": {\n\t\t\ta: \"Europe/Oslo\",\n\t\t\tc: [\"SJ\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Aden\": {\n\t\t\ta: \"Asia/Riyadh\",\n\t\t\tc: [\"YE\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Almaty\": {\n\t\t\tu: 360,\n\t\t\tc: [\"KZ\"]\n\t\t},\n\t\t\"Asia/Amman\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"JO\"]\n\t\t},\n\t\t\"Asia/Anadyr\": {\n\t\t\tu: 720,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Aqtau\": {\n\t\t\tu: 300,\n\t\t\tc: [\"KZ\"]\n\t\t},\n\t\t\"Asia/Aqtobe\": {\n\t\t\tu: 300,\n\t\t\tc: [\"KZ\"]\n\t\t},\n\t\t\"Asia/Ashgabat\": {\n\t\t\tu: 300,\n\t\t\tc: [\"TM\"]\n\t\t},\n\t\t\"Asia/Ashkhabad\": {\n\t\t\ta: \"Asia/Ashgabat\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Atyrau\": {\n\t\t\tu: 300,\n\t\t\tc: [\"KZ\"]\n\t\t},\n\t\t\"Asia/Baghdad\": {\n\t\t\tu: 180,\n\t\t\tc: [\"IQ\"]\n\t\t},\n\t\t\"Asia/Bahrain\": {\n\t\t\ta: \"Asia/Qatar\",\n\t\t\tc: [\"BH\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Baku\": {\n\t\t\tu: 240,\n\t\t\tc: [\"AZ\"]\n\t\t},\n\t\t\"Asia/Bangkok\": {\n\t\t\tu: 420,\n\t\t\tc: [\"TH\", \"KH\", \"LA\", \"VN\"]\n\t\t},\n\t\t\"Asia/Barnaul\": {\n\t\t\tu: 420,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Beirut\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"LB\"]\n\t\t},\n\t\t\"Asia/Bishkek\": {\n\t\t\tu: 360,\n\t\t\tc: [\"KG\"]\n\t\t},\n\t\t\"Asia/Brunei\": {\n\t\t\tu: 480,\n\t\t\tc: [\"BN\"]\n\t\t},\n\t\t\"Asia/Calcutta\": {\n\t\t\ta: \"Asia/Kolkata\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Chita\": {\n\t\t\tu: 540,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Choibalsan\": {\n\t\t\tu: 480,\n\t\t\tc: [\"MN\"]\n\t\t},\n\t\t\"Asia/Chongqing\": {\n\t\t\ta: \"Asia/Shanghai\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Chungking\": {\n\t\t\ta: \"Asia/Shanghai\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Colombo\": {\n\t\t\tu: 330,\n\t\t\tc: [\"LK\"]\n\t\t},\n\t\t\"Asia/Dacca\": {\n\t\t\ta: \"Asia/Dhaka\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Damascus\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"SY\"]\n\t\t},\n\t\t\"Asia/Dhaka\": {\n\t\t\tu: 360,\n\t\t\tc: [\"BD\"]\n\t\t},\n\t\t\"Asia/Dili\": {\n\t\t\tu: 540,\n\t\t\tc: [\"TL\"]\n\t\t},\n\t\t\"Asia/Dubai\": {\n\t\t\tu: 240,\n\t\t\tc: [\"AE\", \"OM\"]\n\t\t},\n\t\t\"Asia/Dushanbe\": {\n\t\t\tu: 300,\n\t\t\tc: [\"TJ\"]\n\t\t},\n\t\t\"Asia/Famagusta\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"CY\"]\n\t\t},\n\t\t\"Asia/Gaza\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"PS\"]\n\t\t},\n\t\t\"Asia/Harbin\": {\n\t\t\ta: \"Asia/Shanghai\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Hebron\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"PS\"]\n\t\t},\n\t\t\"Asia/Ho_Chi_Minh\": {\n\t\t\tu: 420,\n\t\t\tc: [\"VN\"]\n\t\t},\n\t\t\"Asia/Hong_Kong\": {\n\t\t\tu: 480,\n\t\t\tc: [\"HK\"]\n\t\t},\n\t\t\"Asia/Hovd\": {\n\t\t\tu: 420,\n\t\t\tc: [\"MN\"]\n\t\t},\n\t\t\"Asia/Irkutsk\": {\n\t\t\tu: 480,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Istanbul\": {\n\t\t\ta: \"Europe/Istanbul\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Jakarta\": {\n\t\t\tu: 420,\n\t\t\tc: [\"ID\"]\n\t\t},\n\t\t\"Asia/Jayapura\": {\n\t\t\tu: 540,\n\t\t\tc: [\"ID\"]\n\t\t},\n\t\t\"Asia/Jerusalem\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"IL\"]\n\t\t},\n\t\t\"Asia/Kabul\": {\n\t\t\tu: 270,\n\t\t\tc: [\"AF\"]\n\t\t},\n\t\t\"Asia/Kamchatka\": {\n\t\t\tu: 720,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Karachi\": {\n\t\t\tu: 300,\n\t\t\tc: [\"PK\"]\n\t\t},\n\t\t\"Asia/Kashgar\": {\n\t\t\ta: \"Asia/Urumqi\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Kathmandu\": {\n\t\t\tu: 345,\n\t\t\tc: [\"NP\"]\n\t\t},\n\t\t\"Asia/Katmandu\": {\n\t\t\ta: \"Asia/Kathmandu\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Khandyga\": {\n\t\t\tu: 540,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Kolkata\": {\n\t\t\tu: 330,\n\t\t\tc: [\"IN\"]\n\t\t},\n\t\t\"Asia/Krasnoyarsk\": {\n\t\t\tu: 420,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Kuala_Lumpur\": {\n\t\t\tu: 480,\n\t\t\tc: [\"MY\"]\n\t\t},\n\t\t\"Asia/Kuching\": {\n\t\t\tu: 480,\n\t\t\tc: [\"MY\"]\n\t\t},\n\t\t\"Asia/Kuwait\": {\n\t\t\ta: \"Asia/Riyadh\",\n\t\t\tc: [\"KW\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Macao\": {\n\t\t\ta: \"Asia/Macau\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Macau\": {\n\t\t\tu: 480,\n\t\t\tc: [\"MO\"]\n\t\t},\n\t\t\"Asia/Magadan\": {\n\t\t\tu: 660,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Makassar\": {\n\t\t\tu: 480,\n\t\t\tc: [\"ID\"]\n\t\t},\n\t\t\"Asia/Manila\": {\n\t\t\tu: 480,\n\t\t\tc: [\"PH\"]\n\t\t},\n\t\t\"Asia/Muscat\": {\n\t\t\ta: \"Asia/Dubai\",\n\t\t\tc: [\"OM\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Nicosia\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"CY\"]\n\t\t},\n\t\t\"Asia/Novokuznetsk\": {\n\t\t\tu: 420,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Novosibirsk\": {\n\t\t\tu: 420,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Omsk\": {\n\t\t\tu: 360,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Oral\": {\n\t\t\tu: 300,\n\t\t\tc: [\"KZ\"]\n\t\t},\n\t\t\"Asia/Phnom_Penh\": {\n\t\t\ta: \"Asia/Bangkok\",\n\t\t\tc: [\"KH\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Pontianak\": {\n\t\t\tu: 420,\n\t\t\tc: [\"ID\"]\n\t\t},\n\t\t\"Asia/Pyongyang\": {\n\t\t\tu: 540,\n\t\t\tc: [\"KP\"]\n\t\t},\n\t\t\"Asia/Qatar\": {\n\t\t\tu: 180,\n\t\t\tc: [\"QA\", \"BH\"]\n\t\t},\n\t\t\"Asia/Qostanay\": {\n\t\t\tu: 360,\n\t\t\tc: [\"KZ\"]\n\t\t},\n\t\t\"Asia/Qyzylorda\": {\n\t\t\tu: 300,\n\t\t\tc: [\"KZ\"]\n\t\t},\n\t\t\"Asia/Rangoon\": {\n\t\t\ta: \"Asia/Yangon\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Riyadh\": {\n\t\t\tu: 180,\n\t\t\tc: [\"SA\", \"AQ\", \"KW\", \"YE\"]\n\t\t},\n\t\t\"Asia/Saigon\": {\n\t\t\ta: \"Asia/Ho_Chi_Minh\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Sakhalin\": {\n\t\t\tu: 660,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Samarkand\": {\n\t\t\tu: 300,\n\t\t\tc: [\"UZ\"]\n\t\t},\n\t\t\"Asia/Seoul\": {\n\t\t\tu: 540,\n\t\t\tc: [\"KR\"]\n\t\t},\n\t\t\"Asia/Shanghai\": {\n\t\t\tu: 480,\n\t\t\tc: [\"CN\"]\n\t\t},\n\t\t\"Asia/Singapore\": {\n\t\t\tu: 480,\n\t\t\tc: [\"SG\", \"MY\"]\n\t\t},\n\t\t\"Asia/Srednekolymsk\": {\n\t\t\tu: 660,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Taipei\": {\n\t\t\tu: 480,\n\t\t\tc: [\"TW\"]\n\t\t},\n\t\t\"Asia/Tashkent\": {\n\t\t\tu: 300,\n\t\t\tc: [\"UZ\"]\n\t\t},\n\t\t\"Asia/Tbilisi\": {\n\t\t\tu: 240,\n\t\t\tc: [\"GE\"]\n\t\t},\n\t\t\"Asia/Tehran\": {\n\t\t\tu: 210,\n\t\t\td: 270,\n\t\t\tc: [\"IR\"]\n\t\t},\n\t\t\"Asia/Tel_Aviv\": {\n\t\t\ta: \"Asia/Jerusalem\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Thimbu\": {\n\t\t\ta: \"Asia/Thimphu\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Thimphu\": {\n\t\t\tu: 360,\n\t\t\tc: [\"BT\"]\n\t\t},\n\t\t\"Asia/Tokyo\": {\n\t\t\tu: 540,\n\t\t\tc: [\"JP\"]\n\t\t},\n\t\t\"Asia/Tomsk\": {\n\t\t\tu: 420,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Ujung_Pandang\": {\n\t\t\ta: \"Asia/Makassar\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Ulaanbaatar\": {\n\t\t\tu: 480,\n\t\t\tc: [\"MN\"]\n\t\t},\n\t\t\"Asia/Ulan_Bator\": {\n\t\t\ta: \"Asia/Ulaanbaatar\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Urumqi\": {\n\t\t\tu: 360,\n\t\t\tc: [\"CN\"]\n\t\t},\n\t\t\"Asia/Ust-Nera\": {\n\t\t\tu: 600,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Vientiane\": {\n\t\t\ta: \"Asia/Bangkok\",\n\t\t\tc: [\"LA\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Vladivostok\": {\n\t\t\tu: 600,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Yakutsk\": {\n\t\t\tu: 540,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Yangon\": {\n\t\t\tu: 390,\n\t\t\tc: [\"MM\"]\n\t\t},\n\t\t\"Asia/Yekaterinburg\": {\n\t\t\tu: 300,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Yerevan\": {\n\t\t\tu: 240,\n\t\t\tc: [\"AM\"]\n\t\t},\n\t\t\"Atlantic/Azores\": {\n\t\t\tu: -60,\n\t\t\td: 0,\n\t\t\tc: [\"PT\"]\n\t\t},\n\t\t\"Atlantic/Bermuda\": {\n\t\t\tu: -240,\n\t\t\td: -180,\n\t\t\tc: [\"BM\"]\n\t\t},\n\t\t\"Atlantic/Canary\": {\n\t\t\tu: 0,\n\t\t\td: 60,\n\t\t\tc: [\"ES\"]\n\t\t},\n\t\t\"Atlantic/Cape_Verde\": {\n\t\t\tu: -60,\n\t\t\tc: [\"CV\"]\n\t\t},\n\t\t\"Atlantic/Faeroe\": {\n\t\t\ta: \"Atlantic/Faroe\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Atlantic/Faroe\": {\n\t\t\tu: 0,\n\t\t\td: 60,\n\t\t\tc: [\"FO\"]\n\t\t},\n\t\t\"Atlantic/Jan_Mayen\": {\n\t\t\ta: \"Europe/Oslo\",\n\t\t\tc: [\"SJ\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Atlantic/Madeira\": {\n\t\t\tu: 0,\n\t\t\td: 60,\n\t\t\tc: [\"PT\"]\n\t\t},\n\t\t\"Atlantic/Reykjavik\": {\n\t\t\tu: 0,\n\t\t\tc: [\"IS\"]\n\t\t},\n\t\t\"Atlantic/South_Georgia\": {\n\t\t\tu: -120,\n\t\t\tc: [\"GS\"]\n\t\t},\n\t\t\"Atlantic/St_Helena\": {\n\t\t\ta: \"Africa/Abidjan\",\n\t\t\tc: [\"SH\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Atlantic/Stanley\": {\n\t\t\tu: -180,\n\t\t\tc: [\"FK\"]\n\t\t},\n\t\t\"Australia/ACT\": {\n\t\t\ta: \"Australia/Sydney\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Australia/Adelaide\": {\n\t\t\tu: 570,\n\t\t\td: 630,\n\t\t\tc: [\"AU\"]\n\t\t},\n\t\t\"Australia/Brisbane\": {\n\t\t\tu: 600,\n\t\t\tc: [\"AU\"]\n\t\t},\n\t\t\"Australia/Broken_Hill\": {\n\t\t\tu: 570,\n\t\t\td: 630,\n\t\t\tc: [\"AU\"]\n\t\t},\n\t\t\"Australia/Canberra\": {\n\t\t\ta: \"Australia/Sydney\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Australia/Currie\": {\n\t\t\ta: \"Australia/Hobart\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Australia/Darwin\": {\n\t\t\tu: 570,\n\t\t\tc: [\"AU\"]\n\t\t},\n\t\t\"Australia/Eucla\": {\n\t\t\tu: 525,\n\t\t\tc: [\"AU\"]\n\t\t},\n\t\t\"Australia/Hobart\": {\n\t\t\tu: 600,\n\t\t\td: 660,\n\t\t\tc: [\"AU\"]\n\t\t},\n\t\t\"Australia/LHI\": {\n\t\t\ta: \"Australia/Lord_Howe\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Australia/Lindeman\": {\n\t\t\tu: 600,\n\t\t\tc: [\"AU\"]\n\t\t},\n\t\t\"Australia/Lord_Howe\": {\n\t\t\tu: 630,\n\t\t\td: 660,\n\t\t\tc: [\"AU\"]\n\t\t},\n\t\t\"Australia/Melbourne\": {\n\t\t\tu: 600,\n\t\t\td: 660,\n\t\t\tc: [\"AU\"]\n\t\t},\n\t\t\"Australia/NSW\": {\n\t\t\ta: \"Australia/Sydney\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Australia/North\": {\n\t\t\ta: \"Australia/Darwin\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Australia/Perth\": {\n\t\t\tu: 480,\n\t\t\tc: [\"AU\"]\n\t\t},\n\t\t\"Australia/Queensland\": {\n\t\t\ta: \"Australia/Brisbane\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Australia/South\": {\n\t\t\ta: \"Australia/Adelaide\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Australia/Sydney\": {\n\t\t\tu: 600,\n\t\t\td: 660,\n\t\t\tc: [\"AU\"]\n\t\t},\n\t\t\"Australia/Tasmania\": {\n\t\t\ta: \"Australia/Hobart\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Australia/Victoria\": {\n\t\t\ta: \"Australia/Melbourne\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Australia/West\": {\n\t\t\ta: \"Australia/Perth\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Australia/Yancowinna\": {\n\t\t\ta: \"Australia/Broken_Hill\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Brazil/Acre\": {\n\t\t\ta: \"America/Rio_Branco\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Brazil/DeNoronha\": {\n\t\t\ta: \"America/Noronha\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Brazil/East\": {\n\t\t\ta: \"America/Sao_Paulo\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Brazil/West\": {\n\t\t\ta: \"America/Manaus\",\n\t\t\tr: 1\n\t\t},\n\t\tCET: {\n\t\t\tu: 60,\n\t\t\td: 120\n\t\t},\n\t\tCST6CDT: {\n\t\t\tu: -360,\n\t\t\td: -300\n\t\t},\n\t\t\"Canada/Atlantic\": {\n\t\t\ta: \"America/Halifax\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Canada/Central\": {\n\t\t\ta: \"America/Winnipeg\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Canada/Eastern\": {\n\t\t\ta: \"America/Toronto\",\n\t\t\tc: [\"CA\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Canada/Mountain\": {\n\t\t\ta: \"America/Edmonton\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Canada/Newfoundland\": {\n\t\t\ta: \"America/St_Johns\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Canada/Pacific\": {\n\t\t\ta: \"America/Vancouver\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Canada/Saskatchewan\": {\n\t\t\ta: \"America/Regina\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Canada/Yukon\": {\n\t\t\ta: \"America/Whitehorse\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Chile/Continental\": {\n\t\t\ta: \"America/Santiago\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Chile/EasterIsland\": {\n\t\t\ta: \"Pacific/Easter\",\n\t\t\tr: 1\n\t\t},\n\t\tCuba: {\n\t\t\ta: \"America/Havana\",\n\t\t\tr: 1\n\t\t},\n\t\tEET: {\n\t\t\tu: 120,\n\t\t\td: 180\n\t\t},\n\t\tEST: {\n\t\t\tu: -300\n\t\t},\n\t\tEST5EDT: {\n\t\t\tu: -300,\n\t\t\td: -240\n\t\t},\n\t\tEgypt: {\n\t\t\ta: \"Africa/Cairo\",\n\t\t\tr: 1\n\t\t},\n\t\tEire: {\n\t\t\ta: \"Europe/Dublin\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Etc/GMT\": {\n\t\t\tu: 0\n\t\t},\n\t\t\"Etc/GMT+0\": {\n\t\t\ta: \"Etc/GMT\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Etc/GMT+1\": {\n\t\t\tu: -60\n\t\t},\n\t\t\"Etc/GMT+10\": {\n\t\t\tu: -600\n\t\t},\n\t\t\"Etc/GMT+11\": {\n\t\t\tu: -660\n\t\t},\n\t\t\"Etc/GMT+12\": {\n\t\t\tu: -720\n\t\t},\n\t\t\"Etc/GMT+2\": {\n\t\t\tu: -120\n\t\t},\n\t\t\"Etc/GMT+3\": {\n\t\t\tu: -180\n\t\t},\n\t\t\"Etc/GMT+4\": {\n\t\t\tu: -240\n\t\t},\n\t\t\"Etc/GMT+5\": {\n\t\t\tu: -300\n\t\t},\n\t\t\"Etc/GMT+6\": {\n\t\t\tu: -360\n\t\t},\n\t\t\"Etc/GMT+7\": {\n\t\t\tu: -420\n\t\t},\n\t\t\"Etc/GMT+8\": {\n\t\t\tu: -480\n\t\t},\n\t\t\"Etc/GMT+9\": {\n\t\t\tu: -540\n\t\t},\n\t\t\"Etc/GMT-0\": {\n\t\t\ta: \"Etc/GMT\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Etc/GMT-1\": {\n\t\t\tu: 60\n\t\t},\n\t\t\"Etc/GMT-10\": {\n\t\t\tu: 600\n\t\t},\n\t\t\"Etc/GMT-11\": {\n\t\t\tu: 660\n\t\t},\n\t\t\"Etc/GMT-12\": {\n\t\t\tu: 720\n\t\t},\n\t\t\"Etc/GMT-13\": {\n\t\t\tu: 780\n\t\t},\n\t\t\"Etc/GMT-14\": {\n\t\t\tu: 840\n\t\t},\n\t\t\"Etc/GMT-2\": {\n\t\t\tu: 120\n\t\t},\n\t\t\"Etc/GMT-3\": {\n\t\t\tu: 180\n\t\t},\n\t\t\"Etc/GMT-4\": {\n\t\t\tu: 240\n\t\t},\n\t\t\"Etc/GMT-5\": {\n\t\t\tu: 300\n\t\t},\n\t\t\"Etc/GMT-6\": {\n\t\t\tu: 360\n\t\t},\n\t\t\"Etc/GMT-7\": {\n\t\t\tu: 420\n\t\t},\n\t\t\"Etc/GMT-8\": {\n\t\t\tu: 480\n\t\t},\n\t\t\"Etc/GMT-9\": {\n\t\t\tu: 540\n\t\t},\n\t\t\"Etc/GMT0\": {\n\t\t\ta: \"Etc/GMT\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Etc/Greenwich\": {\n\t\t\ta: \"Etc/GMT\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Etc/UCT\": {\n\t\t\ta: \"Etc/UTC\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Etc/UTC\": {\n\t\t\tu: 0\n\t\t},\n\t\t\"Etc/Universal\": {\n\t\t\ta: \"Etc/UTC\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Etc/Zulu\": {\n\t\t\ta: \"Etc/UTC\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/Amsterdam\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"NL\"]\n\t\t},\n\t\t\"Europe/Andorra\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"AD\"]\n\t\t},\n\t\t\"Europe/Astrakhan\": {\n\t\t\tu: 240,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Europe/Athens\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"GR\"]\n\t\t},\n\t\t\"Europe/Belfast\": {\n\t\t\ta: \"Europe/London\",\n\t\t\tc: [\"GB\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/Belgrade\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"RS\", \"BA\", \"HR\", \"ME\", \"MK\", \"SI\"]\n\t\t},\n\t\t\"Europe/Berlin\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"DE\"]\n\t\t},\n\t\t\"Europe/Bratislava\": {\n\t\t\ta: \"Europe/Prague\",\n\t\t\tc: [\"SK\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/Brussels\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"BE\"]\n\t\t},\n\t\t\"Europe/Bucharest\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"RO\"]\n\t\t},\n\t\t\"Europe/Budapest\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"HU\"]\n\t\t},\n\t\t\"Europe/Busingen\": {\n\t\t\ta: \"Europe/Zurich\",\n\t\t\tc: [\"DE\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/Chisinau\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"MD\"]\n\t\t},\n\t\t\"Europe/Copenhagen\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"DK\"]\n\t\t},\n\t\t\"Europe/Dublin\": {\n\t\t\tu: 60,\n\t\t\td: 0,\n\t\t\tc: [\"IE\"]\n\t\t},\n\t\t\"Europe/Gibraltar\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"GI\"]\n\t\t},\n\t\t\"Europe/Guernsey\": {\n\t\t\ta: \"Europe/London\",\n\t\t\tc: [\"GG\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/Helsinki\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"FI\", \"AX\"]\n\t\t},\n\t\t\"Europe/Isle_of_Man\": {\n\t\t\ta: \"Europe/London\",\n\t\t\tc: [\"IM\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/Istanbul\": {\n\t\t\tu: 180,\n\t\t\tc: [\"TR\"]\n\t\t},\n\t\t\"Europe/Jersey\": {\n\t\t\ta: \"Europe/London\",\n\t\t\tc: [\"JE\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/Kaliningrad\": {\n\t\t\tu: 120,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Europe/Kiev\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"UA\"]\n\t\t},\n\t\t\"Europe/Kirov\": {\n\t\t\tu: 180,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Europe/Lisbon\": {\n\t\t\tu: 0,\n\t\t\td: 60,\n\t\t\tc: [\"PT\"]\n\t\t},\n\t\t\"Europe/Ljubljana\": {\n\t\t\ta: \"Europe/Belgrade\",\n\t\t\tc: [\"SI\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/London\": {\n\t\t\tu: 0,\n\t\t\td: 60,\n\t\t\tc: [\"GB\", \"GG\", \"IM\", \"JE\"]\n\t\t},\n\t\t\"Europe/Luxembourg\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"LU\"]\n\t\t},\n\t\t\"Europe/Madrid\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"ES\"]\n\t\t},\n\t\t\"Europe/Malta\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"MT\"]\n\t\t},\n\t\t\"Europe/Mariehamn\": {\n\t\t\ta: \"Europe/Helsinki\",\n\t\t\tc: [\"AX\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/Minsk\": {\n\t\t\tu: 180,\n\t\t\tc: [\"BY\"]\n\t\t},\n\t\t\"Europe/Monaco\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"MC\"]\n\t\t},\n\t\t\"Europe/Moscow\": {\n\t\t\tu: 180,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Europe/Nicosia\": {\n\t\t\ta: \"Asia/Nicosia\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/Oslo\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"NO\", \"SJ\", \"BV\"]\n\t\t},\n\t\t\"Europe/Paris\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"FR\"]\n\t\t},\n\t\t\"Europe/Podgorica\": {\n\t\t\ta: \"Europe/Belgrade\",\n\t\t\tc: [\"ME\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/Prague\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"CZ\", \"SK\"]\n\t\t},\n\t\t\"Europe/Riga\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"LV\"]\n\t\t},\n\t\t\"Europe/Rome\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"IT\", \"SM\", \"VA\"]\n\t\t},\n\t\t\"Europe/Samara\": {\n\t\t\tu: 240,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Europe/San_Marino\": {\n\t\t\ta: \"Europe/Rome\",\n\t\t\tc: [\"SM\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/Sarajevo\": {\n\t\t\ta: \"Europe/Belgrade\",\n\t\t\tc: [\"BA\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/Saratov\": {\n\t\t\tu: 240,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Europe/Simferopol\": {\n\t\t\tu: 180,\n\t\t\tc: [\"RU\", \"UA\"]\n\t\t},\n\t\t\"Europe/Skopje\": {\n\t\t\ta: \"Europe/Belgrade\",\n\t\t\tc: [\"MK\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/Sofia\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"BG\"]\n\t\t},\n\t\t\"Europe/Stockholm\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"SE\"]\n\t\t},\n\t\t\"Europe/Tallinn\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"EE\"]\n\t\t},\n\t\t\"Europe/Tirane\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"AL\"]\n\t\t},\n\t\t\"Europe/Tiraspol\": {\n\t\t\ta: \"Europe/Chisinau\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/Ulyanovsk\": {\n\t\t\tu: 240,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Europe/Uzhgorod\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"UA\"]\n\t\t},\n\t\t\"Europe/Vaduz\": {\n\t\t\ta: \"Europe/Zurich\",\n\t\t\tc: [\"LI\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/Vatican\": {\n\t\t\ta: \"Europe/Rome\",\n\t\t\tc: [\"VA\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/Vienna\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"AT\"]\n\t\t},\n\t\t\"Europe/Vilnius\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"LT\"]\n\t\t},\n\t\t\"Europe/Volgograd\": {\n\t\t\tu: 180,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Europe/Warsaw\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"PL\"]\n\t\t},\n\t\t\"Europe/Zagreb\": {\n\t\t\ta: \"Europe/Belgrade\",\n\t\t\tc: [\"HR\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/Zaporozhye\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"UA\"]\n\t\t},\n\t\t\"Europe/Zurich\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"CH\", \"DE\", \"LI\"]\n\t\t},\n\t\tFactory: {\n\t\t\tu: 0\n\t\t},\n\t\tGB: {\n\t\t\ta: \"Europe/London\",\n\t\t\tc: [\"GB\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"GB-Eire\": {\n\t\t\ta: \"Europe/London\",\n\t\t\tc: [\"GB\"],\n\t\t\tr: 1\n\t\t},\n\t\tGMT: {\n\t\t\ta: \"Etc/GMT\",\n\t\t\tr: 1\n\t\t},\n\t\t\"GMT+0\": {\n\t\t\ta: \"Etc/GMT\",\n\t\t\tr: 1\n\t\t},\n\t\t\"GMT-0\": {\n\t\t\ta: \"Etc/GMT\",\n\t\t\tr: 1\n\t\t},\n\t\tGMT0: {\n\t\t\ta: \"Etc/GMT\",\n\t\t\tr: 1\n\t\t},\n\t\tGreenwich: {\n\t\t\ta: \"Etc/GMT\",\n\t\t\tr: 1\n\t\t},\n\t\tHST: {\n\t\t\tu: -600\n\t\t},\n\t\tHongkong: {\n\t\t\ta: \"Asia/Hong_Kong\",\n\t\t\tr: 1\n\t\t},\n\t\tIceland: {\n\t\t\ta: \"Atlantic/Reykjavik\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Indian/Antananarivo\": {\n\t\t\ta: \"Africa/Nairobi\",\n\t\t\tc: [\"MG\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Indian/Chagos\": {\n\t\t\tu: 360,\n\t\t\tc: [\"IO\"]\n\t\t},\n\t\t\"Indian/Christmas\": {\n\t\t\tu: 420,\n\t\t\tc: [\"CX\"]\n\t\t},\n\t\t\"Indian/Cocos\": {\n\t\t\tu: 390,\n\t\t\tc: [\"CC\"]\n\t\t},\n\t\t\"Indian/Comoro\": {\n\t\t\ta: \"Africa/Nairobi\",\n\t\t\tc: [\"KM\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Indian/Kerguelen\": {\n\t\t\tu: 300,\n\t\t\tc: [\"TF\", \"HM\"]\n\t\t},\n\t\t\"Indian/Mahe\": {\n\t\t\tu: 240,\n\t\t\tc: [\"SC\"]\n\t\t},\n\t\t\"Indian/Maldives\": {\n\t\t\tu: 300,\n\t\t\tc: [\"MV\"]\n\t\t},\n\t\t\"Indian/Mauritius\": {\n\t\t\tu: 240,\n\t\t\tc: [\"MU\"]\n\t\t},\n\t\t\"Indian/Mayotte\": {\n\t\t\ta: \"Africa/Nairobi\",\n\t\t\tc: [\"YT\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Indian/Reunion\": {\n\t\t\tu: 240,\n\t\t\tc: [\"RE\", \"TF\"]\n\t\t},\n\t\tIran: {\n\t\t\ta: \"Asia/Tehran\",\n\t\t\tr: 1\n\t\t},\n\t\tIsrael: {\n\t\t\ta: \"Asia/Jerusalem\",\n\t\t\tr: 1\n\t\t},\n\t\tJamaica: {\n\t\t\ta: \"America/Jamaica\",\n\t\t\tr: 1\n\t\t},\n\t\tJapan: {\n\t\t\ta: \"Asia/Tokyo\",\n\t\t\tr: 1\n\t\t},\n\t\tKwajalein: {\n\t\t\ta: \"Pacific/Kwajalein\",\n\t\t\tr: 1\n\t\t},\n\t\tLibya: {\n\t\t\ta: \"Africa/Tripoli\",\n\t\t\tr: 1\n\t\t},\n\t\tMET: {\n\t\t\tu: 60,\n\t\t\td: 120\n\t\t},\n\t\tMST: {\n\t\t\tu: -420\n\t\t},\n\t\tMST7MDT: {\n\t\t\tu: -420,\n\t\t\td: -360\n\t\t},\n\t\t\"Mexico/BajaNorte\": {\n\t\t\ta: \"America/Tijuana\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Mexico/BajaSur\": {\n\t\t\ta: \"America/Mazatlan\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Mexico/General\": {\n\t\t\ta: \"America/Mexico_City\",\n\t\t\tr: 1\n\t\t},\n\t\tNZ: {\n\t\t\ta: \"Pacific/Auckland\",\n\t\t\tc: [\"NZ\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"NZ-CHAT\": {\n\t\t\ta: \"Pacific/Chatham\",\n\t\t\tr: 1\n\t\t},\n\t\tNavajo: {\n\t\t\ta: \"America/Denver\",\n\t\t\tr: 1\n\t\t},\n\t\tPRC: {\n\t\t\ta: \"Asia/Shanghai\",\n\t\t\tr: 1\n\t\t},\n\t\tPST8PDT: {\n\t\t\tu: -480,\n\t\t\td: -420\n\t\t},\n\t\t\"Pacific/Apia\": {\n\t\t\tu: 780,\n\t\t\tc: [\"WS\"]\n\t\t},\n\t\t\"Pacific/Auckland\": {\n\t\t\tu: 720,\n\t\t\td: 780,\n\t\t\tc: [\"NZ\", \"AQ\"]\n\t\t},\n\t\t\"Pacific/Bougainville\": {\n\t\t\tu: 660,\n\t\t\tc: [\"PG\"]\n\t\t},\n\t\t\"Pacific/Chatham\": {\n\t\t\tu: 765,\n\t\t\td: 825,\n\t\t\tc: [\"NZ\"]\n\t\t},\n\t\t\"Pacific/Chuuk\": {\n\t\t\tu: 600,\n\t\t\tc: [\"FM\"]\n\t\t},\n\t\t\"Pacific/Easter\": {\n\t\t\tu: -360,\n\t\t\td: -300,\n\t\t\tc: [\"CL\"]\n\t\t},\n\t\t\"Pacific/Efate\": {\n\t\t\tu: 660,\n\t\t\tc: [\"VU\"]\n\t\t},\n\t\t\"Pacific/Enderbury\": {\n\t\t\ta: \"Pacific/Kanton\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Pacific/Fakaofo\": {\n\t\t\tu: 780,\n\t\t\tc: [\"TK\"]\n\t\t},\n\t\t\"Pacific/Fiji\": {\n\t\t\tu: 720,\n\t\t\td: 780,\n\t\t\tc: [\"FJ\"]\n\t\t},\n\t\t\"Pacific/Funafuti\": {\n\t\t\tu: 720,\n\t\t\tc: [\"TV\"]\n\t\t},\n\t\t\"Pacific/Galapagos\": {\n\t\t\tu: -360,\n\t\t\tc: [\"EC\"]\n\t\t},\n\t\t\"Pacific/Gambier\": {\n\t\t\tu: -540,\n\t\t\tc: [\"PF\"]\n\t\t},\n\t\t\"Pacific/Guadalcanal\": {\n\t\t\tu: 660,\n\t\t\tc: [\"SB\"]\n\t\t},\n\t\t\"Pacific/Guam\": {\n\t\t\tu: 600,\n\t\t\tc: [\"GU\", \"MP\"]\n\t\t},\n\t\t\"Pacific/Honolulu\": {\n\t\t\tu: -600,\n\t\t\tc: [\"US\", \"UM\"]\n\t\t},\n\t\t\"Pacific/Johnston\": {\n\t\t\ta: \"Pacific/Honolulu\",\n\t\t\tc: [\"UM\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Pacific/Kanton\": {\n\t\t\tu: 780,\n\t\t\tc: [\"KI\"]\n\t\t},\n\t\t\"Pacific/Kiritimati\": {\n\t\t\tu: 840,\n\t\t\tc: [\"KI\"]\n\t\t},\n\t\t\"Pacific/Kosrae\": {\n\t\t\tu: 660,\n\t\t\tc: [\"FM\"]\n\t\t},\n\t\t\"Pacific/Kwajalein\": {\n\t\t\tu: 720,\n\t\t\tc: [\"MH\"]\n\t\t},\n\t\t\"Pacific/Majuro\": {\n\t\t\tu: 720,\n\t\t\tc: [\"MH\"]\n\t\t},\n\t\t\"Pacific/Marquesas\": {\n\t\t\tu: -510,\n\t\t\tc: [\"PF\"]\n\t\t},\n\t\t\"Pacific/Midway\": {\n\t\t\ta: \"Pacific/Pago_Pago\",\n\t\t\tc: [\"UM\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Pacific/Nauru\": {\n\t\t\tu: 720,\n\t\t\tc: [\"NR\"]\n\t\t},\n\t\t\"Pacific/Niue\": {\n\t\t\tu: -660,\n\t\t\tc: [\"NU\"]\n\t\t},\n\t\t\"Pacific/Norfolk\": {\n\t\t\tu: 660,\n\t\t\td: 720,\n\t\t\tc: [\"NF\"]\n\t\t},\n\t\t\"Pacific/Noumea\": {\n\t\t\tu: 660,\n\t\t\tc: [\"NC\"]\n\t\t},\n\t\t\"Pacific/Pago_Pago\": {\n\t\t\tu: -660,\n\t\t\tc: [\"AS\", \"UM\"]\n\t\t},\n\t\t\"Pacific/Palau\": {\n\t\t\tu: 540,\n\t\t\tc: [\"PW\"]\n\t\t},\n\t\t\"Pacific/Pitcairn\": {\n\t\t\tu: -480,\n\t\t\tc: [\"PN\"]\n\t\t},\n\t\t\"Pacific/Pohnpei\": {\n\t\t\tu: 660,\n\t\t\tc: [\"FM\"]\n\t\t},\n\t\t\"Pacific/Ponape\": {\n\t\t\ta: \"Pacific/Pohnpei\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Pacific/Port_Moresby\": {\n\t\t\tu: 600,\n\t\t\tc: [\"PG\", \"AQ\"]\n\t\t},\n\t\t\"Pacific/Rarotonga\": {\n\t\t\tu: -600,\n\t\t\tc: [\"CK\"]\n\t\t},\n\t\t\"Pacific/Saipan\": {\n\t\t\ta: \"Pacific/Guam\",\n\t\t\tc: [\"MP\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Pacific/Samoa\": {\n\t\t\ta: \"Pacific/Pago_Pago\",\n\t\t\tc: [\"WS\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Pacific/Tahiti\": {\n\t\t\tu: -600,\n\t\t\tc: [\"PF\"]\n\t\t},\n\t\t\"Pacific/Tarawa\": {\n\t\t\tu: 720,\n\t\t\tc: [\"KI\"]\n\t\t},\n\t\t\"Pacific/Tongatapu\": {\n\t\t\tu: 780,\n\t\t\tc: [\"TO\"]\n\t\t},\n\t\t\"Pacific/Truk\": {\n\t\t\ta: \"Pacific/Chuuk\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Pacific/Wake\": {\n\t\t\tu: 720,\n\t\t\tc: [\"UM\"]\n\t\t},\n\t\t\"Pacific/Wallis\": {\n\t\t\tu: 720,\n\t\t\tc: [\"WF\"]\n\t\t},\n\t\t\"Pacific/Yap\": {\n\t\t\ta: \"Pacific/Chuuk\",\n\t\t\tr: 1\n\t\t},\n\t\tPoland: {\n\t\t\ta: \"Europe/Warsaw\",\n\t\t\tr: 1\n\t\t},\n\t\tPortugal: {\n\t\t\ta: \"Europe/Lisbon\",\n\t\t\tr: 1\n\t\t},\n\t\tROC: {\n\t\t\ta: \"Asia/Taipei\",\n\t\t\tr: 1\n\t\t},\n\t\tROK: {\n\t\t\ta: \"Asia/Seoul\",\n\t\t\tr: 1\n\t\t},\n\t\tSingapore: {\n\t\t\ta: \"Asia/Singapore\",\n\t\t\tc: [\"SG\"],\n\t\t\tr: 1\n\t\t},\n\t\tTurkey: {\n\t\t\ta: \"Europe/Istanbul\",\n\t\t\tr: 1\n\t\t},\n\t\tUCT: {\n\t\t\ta: \"Etc/UTC\",\n\t\t\tr: 1\n\t\t},\n\t\t\"US/Alaska\": {\n\t\t\ta: \"America/Anchorage\",\n\t\t\tr: 1\n\t\t},\n\t\t\"US/Aleutian\": {\n\t\t\ta: \"America/Adak\",\n\t\t\tr: 1\n\t\t},\n\t\t\"US/Arizona\": {\n\t\t\ta: \"America/Phoenix\",\n\t\t\tc: [\"US\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"US/Central\": {\n\t\t\ta: \"America/Chicago\",\n\t\t\tr: 1\n\t\t},\n\t\t\"US/East-Indiana\": {\n\t\t\ta: \"America/Indiana/Indianapolis\",\n\t\t\tr: 1\n\t\t},\n\t\t\"US/Eastern\": {\n\t\t\ta: \"America/New_York\",\n\t\t\tr: 1\n\t\t},\n\t\t\"US/Hawaii\": {\n\t\t\ta: \"Pacific/Honolulu\",\n\t\t\tc: [\"US\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"US/Indiana-Starke\": {\n\t\t\ta: \"America/Indiana/Knox\",\n\t\t\tr: 1\n\t\t},\n\t\t\"US/Michigan\": {\n\t\t\ta: \"America/Detroit\",\n\t\t\tr: 1\n\t\t},\n\t\t\"US/Mountain\": {\n\t\t\ta: \"America/Denver\",\n\t\t\tr: 1\n\t\t},\n\t\t\"US/Pacific\": {\n\t\t\ta: \"America/Los_Angeles\",\n\t\t\tr: 1\n\t\t},\n\t\t\"US/Samoa\": {\n\t\t\ta: \"Pacific/Pago_Pago\",\n\t\t\tc: [\"WS\"],\n\t\t\tr: 1\n\t\t},\n\t\tUTC: {\n\t\t\ta: \"Etc/UTC\",\n\t\t\tr: 1\n\t\t},\n\t\tUniversal: {\n\t\t\ta: \"Etc/UTC\",\n\t\t\tr: 1\n\t\t},\n\t\t\"W-SU\": {\n\t\t\ta: \"Europe/Moscow\",\n\t\t\tr: 1\n\t\t},\n\t\tWET: {\n\t\t\tu: 0,\n\t\t\td: 60\n\t\t},\n\t\tZulu: {\n\t\t\ta: \"Etc/UTC\",\n\t\t\tr: 1\n\t\t}\n};\n\n/**\n * Get full country name from user's timezone\n * @returns Full country name or null if timezone is unavailable\n */\nexport function getCountry(): string | null {\n\tconst timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n\tif (timezone === \"\" || !timezone) {\n\t\treturn null;\n\t}\n\n\ttry {\n\t\tconst _country = timezones[timezone]?.c?.[0];\n\t\tif (!_country) return null;\n\t\tconst country = (countries as Record<string, string>)[_country];\n\t\treturn country || null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Get country code (ISO 3166-1 alpha-2) from user's timezone\n * Privacy-friendly alternative to IP geolocation\n * @returns ISO 3166-1 alpha-2 country code (e.g., \"US\", \"GB\") or \"Unknown\"\n */\nexport function getCountryCodeFromTimezone(): string {\n\tconst timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n\tif (timezone === \"\" || !timezone) {\n\t\treturn \"Unknown\";\n\t}\n\n\ttry {\n\t\tconst countryCode = timezones[timezone]?.c?.[0];\n\t\treturn countryCode || \"Unknown\";\n\t} catch {\n\t\treturn \"Unknown\";\n\t}\n}\n\nexport function getState(): string | null {\n\tconst timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n\tif (timezone === \"\" || !timezone) {\n\t\treturn null;\n\t}\n\t\n\tconst state = timezone.split(\"/\")[1]?.replace(\"_\", \" \");\n\t\n\treturn state || null;\n}\n", "/**\n * Page Tracking for Grain Analytics\n * Automatically tracks page views with consent-aware behavior\n */\n\nimport {\n categorizeReferrer,\n parseUTMParameters,\n getOrCreateFirstTouchAttribution,\n getSessionUTMParameters,\n setSessionUTMParameters,\n type UTMParameters,\n type FirstTouchAttribution,\n} from './attribution';\nimport { getCountryCodeFromTimezone } from './countries';\n\nexport interface PageTrackingConfig {\n stripQueryParams: boolean; // Default: true for privacy\n stripHash?: boolean; // Default: false\n debug?: boolean;\n tenantId: string;\n}\n\nexport interface PageTracker {\n trackSystemEvent(eventName: string, properties: Record<string, unknown>): void;\n hasConsent(category?: string): boolean;\n getEffectiveUserId(): string;\n getEphemeralSessionId(): string;\n getSessionId(): string;\n}\n\nexport class PageTrackingManager {\n private config: PageTrackingConfig;\n private tracker: PageTracker;\n private isDestroyed = false;\n private currentPath: string | null = null;\n private originalPushState: typeof history.pushState | null = null;\n private originalReplaceState: typeof history.replaceState | null = null;\n private previousPage: string | null = null;\n private landingPage: string | null = null;\n private pageViewCount = 0;\n\n constructor(tracker: PageTracker, config: PageTrackingConfig) {\n this.tracker = tracker;\n this.config = config;\n \n // Track initial page load (this is the landing page)\n this.trackCurrentPage(true);\n \n // Setup listeners\n this.setupHistoryListeners();\n this.setupHashChangeListener();\n }\n\n /**\n * Setup History API listeners (pushState, replaceState, popstate)\n */\n private setupHistoryListeners(): void {\n if (typeof window === 'undefined' || typeof history === 'undefined') return;\n\n // Wrap pushState\n this.originalPushState = history.pushState;\n history.pushState = (state: any, title: string, url?: string | URL | null) => {\n this.originalPushState?.call(history, state, title, url);\n this.trackCurrentPage();\n };\n\n // Wrap replaceState\n this.originalReplaceState = history.replaceState;\n history.replaceState = (state: any, title: string, url?: string | URL | null) => {\n this.originalReplaceState?.call(history, state, title, url);\n this.trackCurrentPage();\n };\n\n // Listen to popstate (back/forward buttons)\n window.addEventListener('popstate', this.handlePopState);\n }\n\n /**\n * Setup hash change listener\n */\n private setupHashChangeListener(): void {\n if (typeof window === 'undefined') return;\n window.addEventListener('hashchange', this.handleHashChange);\n }\n\n /**\n * Handle popstate event (back/forward navigation)\n */\n private handlePopState = (): void => {\n if (this.isDestroyed) return;\n this.trackCurrentPage();\n };\n\n /**\n * Handle hash change event\n */\n private handleHashChange = (): void => {\n if (this.isDestroyed) return;\n this.trackCurrentPage();\n };\n\n /**\n * Track the current page\n */\n private trackCurrentPage(isLanding: boolean = false): void {\n if (this.isDestroyed || typeof window === 'undefined') return;\n\n const page = this.extractPath(window.location.href);\n \n // Don't track if it's the same page (unless it's the landing page)\n if (!isLanding && page === this.currentPath) {\n return;\n }\n\n // Store previous page before updating\n if (this.currentPath) {\n this.previousPage = this.currentPath;\n }\n\n this.currentPath = page;\n this.pageViewCount++;\n\n // Set landing page on first view\n if (isLanding) {\n this.landingPage = page;\n }\n\n const hasConsent = this.tracker.hasConsent('analytics');\n const currentUrl = window.location.href;\n const referrer = document.referrer || '';\n\n // Parse UTM parameters from current URL\n const utmParams = parseUTMParameters(currentUrl);\n \n // Store session UTM if they exist (first time only or if new UTMs appear)\n if (Object.keys(utmParams).length > 0) {\n const existing = getSessionUTMParameters();\n if (!existing || isLanding) {\n setSessionUTMParameters(utmParams);\n }\n }\n\n // Get or create first-touch attribution\n const sessionUTMs = getSessionUTMParameters() || {};\n const firstTouch = getOrCreateFirstTouchAttribution(\n this.config.tenantId,\n referrer,\n currentUrl,\n sessionUTMs\n );\n\n // Base properties (always included)\n const properties: Record<string, unknown> = {\n page,\n timestamp: Date.now(),\n };\n\n // Enhanced properties when consent is granted\n if (hasConsent) {\n properties.title = document.title || '';\n properties.full_url = this.cleanUrl(currentUrl); // Clean URL based on privacy settings\n properties.session_id = this.tracker.getSessionId();\n\n // Add referrer info\n if (referrer) {\n properties.referrer = referrer;\n properties.referrer_domain = this.extractDomain(referrer);\n properties.referrer_category = categorizeReferrer(referrer, currentUrl);\n }\n\n // Add landing page if this is not the first view\n if (this.landingPage && !isLanding) {\n properties.landing_page = this.landingPage;\n }\n\n // Add previous page if available\n if (this.previousPage) {\n properties.previous_page = this.previousPage;\n }\n\n // Add UTM parameters if present (from session)\n if (sessionUTMs.utm_source) properties.utm_source = sessionUTMs.utm_source;\n if (sessionUTMs.utm_medium) properties.utm_medium = sessionUTMs.utm_medium;\n if (sessionUTMs.utm_campaign) properties.utm_campaign = sessionUTMs.utm_campaign;\n if (sessionUTMs.utm_term) properties.utm_term = sessionUTMs.utm_term;\n if (sessionUTMs.utm_content) properties.utm_content = sessionUTMs.utm_content;\n\n // Add first-touch attribution\n properties.first_touch_source = firstTouch.source;\n properties.first_touch_medium = firstTouch.medium;\n properties.first_touch_campaign = firstTouch.campaign;\n properties.first_touch_referrer_category = firstTouch.referrer_category;\n\n // Browser and device info\n properties.device = this.getDeviceType();\n properties.browser = this.getBrowser();\n properties.os = this.getOS();\n properties.language = navigator.language || '';\n \n // Timezone and country (privacy-friendly: derived from timezone, no IP tracking)\n const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n properties.timezone = timezone;\n properties.country = getCountryCodeFromTimezone();\n \n properties.screen_resolution = `${screen.width}x${screen.height}`;\n properties.viewport = `${window.innerWidth}x${window.innerHeight}`;\n }\n\n // Track the page view event\n this.tracker.trackSystemEvent('page_view', properties);\n }\n\n /**\n * Extract domain from URL\n */\n private extractDomain(url: string): string {\n try {\n const urlObj = new URL(url);\n return urlObj.hostname;\n } catch {\n return '';\n }\n }\n\n /**\n * Detect browser name\n */\n private getBrowser(): string {\n const ua = navigator.userAgent;\n if (ua.includes('Firefox/')) return 'Firefox';\n if (ua.includes('Edg/')) return 'Edge';\n if (ua.includes('Chrome/')) return 'Chrome';\n if (ua.includes('Safari/') && !ua.includes('Chrome/')) return 'Safari';\n if (ua.includes('Opera/') || ua.includes('OPR/')) return 'Opera';\n return 'Unknown';\n }\n\n /**\n * Detect operating system\n */\n private getOS(): string {\n const ua = navigator.userAgent;\n if (ua.includes('Win')) return 'Windows';\n if (ua.includes('Mac')) return 'macOS';\n if (ua.includes('Linux')) return 'Linux';\n if (ua.includes('Android')) return 'Android';\n if (ua.includes('iOS') || ua.includes('iPhone') || ua.includes('iPad')) return 'iOS';\n return 'Unknown';\n }\n\n /**\n * Detect device type (Mobile, Tablet, Desktop)\n */\n private getDeviceType(): string {\n const ua = navigator.userAgent;\n const width = window.innerWidth;\n \n // Check for tablet-specific indicators\n if (ua.includes('iPad') || (ua.includes('Android') && !ua.includes('Mobile'))) {\n return 'Tablet';\n }\n \n // Check for mobile indicators\n if (ua.includes('Mobile') || ua.includes('iPhone') || ua.includes('Android')) {\n return 'Mobile';\n }\n \n // Fallback to screen width detection\n if (width < 768) {\n return 'Mobile';\n } else if (width >= 768 && width < 1024) {\n return 'Tablet';\n }\n \n return 'Desktop';\n }\n\n /**\n * Extract path from URL, optionally stripping query parameters\n * Privacy-first: strips query params by default\n */\n private extractPath(url: string): string {\n try {\n const urlObj = new URL(url);\n let path = urlObj.pathname;\n \n // Include query params only if not stripping\n if (!this.config.stripQueryParams && urlObj.search) {\n path += urlObj.search;\n }\n \n // Include hash only if not stripping\n if (!this.config.stripHash && urlObj.hash) {\n path += urlObj.hash;\n }\n \n return path;\n } catch (error) {\n // If URL parsing fails, return the raw string\n if (this.config.debug) {\n console.warn('[Page Tracking] Failed to parse URL:', url, error);\n }\n return url;\n }\n }\n\n /**\n * Clean URL for privacy (strip query params based on config)\n */\n private cleanUrl(url: string): string {\n if (!this.config.stripQueryParams) {\n return url;\n }\n \n try {\n const urlObj = new URL(url);\n return `${urlObj.origin}${urlObj.pathname}${this.config.stripHash ? '' : urlObj.hash}`;\n } catch (error) {\n return url;\n }\n }\n\n /**\n * Get the current page path\n */\n getCurrentPage(): string | null {\n return this.currentPath;\n }\n\n /**\n * Manually track a page view (for custom navigation)\n */\n trackPage(page: string, properties?: Record<string, unknown>): void {\n if (this.isDestroyed) return;\n\n const hasConsent = this.tracker.hasConsent('analytics');\n\n // Base properties\n const baseProperties: Record<string, unknown> = {\n page,\n timestamp: Date.now(),\n ...properties,\n };\n\n // Enhanced properties when consent is granted\n if (hasConsent && typeof document !== 'undefined' && typeof window !== 'undefined') {\n if (!baseProperties.referrer) {\n baseProperties.referrer = document.referrer || '';\n }\n if (!baseProperties.title) {\n baseProperties.title = document.title || '';\n }\n if (!baseProperties.full_url) {\n baseProperties.full_url = window.location.href;\n }\n if (!baseProperties.session_id) {\n baseProperties.session_id = this.tracker.getSessionId();\n }\n if (!baseProperties.browser) {\n baseProperties.browser = this.getBrowser();\n }\n if (!baseProperties.os) {\n baseProperties.os = this.getOS();\n }\n }\n\n this.tracker.trackSystemEvent('page_view', baseProperties);\n }\n\n /**\n * Get page view count for current session\n */\n getPageViewCount(): number {\n return this.pageViewCount;\n }\n\n /**\n * Destroy the page tracker\n */\n destroy(): void {\n if (this.isDestroyed) return;\n\n // Restore original history methods\n if (typeof history !== 'undefined') {\n if (this.originalPushState) {\n history.pushState = this.originalPushState;\n }\n if (this.originalReplaceState) {\n history.replaceState = this.originalReplaceState;\n }\n }\n\n // Remove event listeners\n if (typeof window !== 'undefined') {\n window.removeEventListener('popstate', this.handlePopState);\n window.removeEventListener('hashchange', this.handleHashChange);\n }\n\n this.isDestroyed = true;\n }\n}\n\n", "/**\n * ID Manager for Grain Analytics\n * Generates and manages user IDs based on consent mode\n * \n * Privacy-first implementation:\n * - Cookieless mode: Daily rotating IDs (no persistence)\n * - GDPR Strict: Permanent IDs only with consent\n * - GDPR Opt-out: Permanent IDs by default\n */\n\nexport type IdMode = 'cookieless' | 'permanent';\n\nexport interface IdConfig {\n mode: IdMode;\n tenantId: string;\n useLocalStorage?: boolean; // For permanent IDs only\n}\n\n/**\n * Generate a simple hash from a string\n */\nfunction simpleHash(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n return Math.abs(hash).toString(36);\n}\n\n/**\n * Generate a UUID v4\n */\nfunction generateUUID(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n \n // Fallback for older browsers\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = Math.random() * 16 | 0;\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n}\n\n/**\n * Get minimal browser fingerprint for daily ID generation\n * NOT for tracking, just for same-day continuity\n */\nfunction getBrowserFingerprint(): string {\n if (typeof window === 'undefined') return 'server';\n \n const components: string[] = [\n screen.width?.toString() || '',\n screen.height?.toString() || '',\n navigator.language || '',\n Intl.DateTimeFormat().resolvedOptions().timeZone || ''\n ];\n \n return simpleHash(components.join('|'));\n}\n\n/**\n * Get current date string in local timezone (YYYY-MM-DD)\n */\nfunction getLocalDateString(): string {\n const now = new Date();\n const year = now.getFullYear();\n const month = String(now.getMonth() + 1).padStart(2, '0');\n const day = String(now.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n}\n\n/**\n * ID Manager class\n * Handles both daily rotating IDs and permanent IDs\n */\nexport class IdManager {\n private config: IdConfig;\n private cachedDailyId: string | null = null;\n private dailyIdDate: string | null = null;\n private dailyRandomSeed: string | null = null; // Random component for daily ID\n private permanentId: string | null = null;\n \n constructor(config: IdConfig) {\n this.config = config;\n \n // Load permanent ID from localStorage if in permanent mode\n if (config.mode === 'permanent' && config.useLocalStorage) {\n this.loadPermanentId();\n }\n \n // Load daily random seed from sessionStorage if in cookieless mode\n if (config.mode === 'cookieless') {\n this.loadDailySeed();\n }\n }\n \n /**\n * Generate a daily rotating ID\n * Rotates at midnight in user's local timezone\n * Provides same-day continuity without persistent tracking\n */\n generateDailyRotatingId(): string {\n const currentDate = getLocalDateString();\n \n // Return cached ID if still the same day\n if (this.cachedDailyId && this.dailyIdDate === currentDate && this.dailyRandomSeed) {\n return this.cachedDailyId;\n }\n \n // Load seed from sessionStorage if available\n const storedSeed = this.loadDailySeed();\n \n // If date changed, clear the random seed\n if (this.dailyIdDate !== currentDate) {\n this.dailyRandomSeed = null;\n this.clearDailySeed();\n }\n \n // Generate new random seed for today if needed\n if (!this.dailyRandomSeed) {\n this.dailyRandomSeed = storedSeed || generateUUID();\n this.saveDailySeed(this.dailyRandomSeed, currentDate);\n }\n \n // Generate new daily ID using fingerprint + random seed\n const fingerprint = getBrowserFingerprint();\n const seed = `${this.config.tenantId}|${currentDate}|${fingerprint}|${this.dailyRandomSeed}`;\n const dailyId = `daily_${simpleHash(seed)}`;\n \n // Cache for same-day requests\n this.cachedDailyId = dailyId;\n this.dailyIdDate = currentDate;\n \n return dailyId;\n }\n \n /**\n * Generate or retrieve permanent user ID\n * Only used when consent is given\n */\n generatePermanentId(): string {\n if (this.permanentId) {\n return this.permanentId;\n }\n \n // Try to load from localStorage\n if (this.config.useLocalStorage) {\n const stored = this.loadPermanentId();\n if (stored) {\n return stored;\n }\n }\n \n // Generate new permanent ID\n const newId = generateUUID();\n this.permanentId = newId;\n \n // Store in localStorage if enabled\n if (this.config.useLocalStorage) {\n this.savePermanentId(newId);\n }\n \n return newId;\n }\n \n /**\n * Get the current user ID based on mode\n */\n getCurrentUserId(): string {\n if (this.config.mode === 'cookieless') {\n return this.generateDailyRotatingId();\n } else {\n return this.generatePermanentId();\n }\n }\n \n /**\n * Switch ID mode (e.g., when consent is granted/revoked)\n */\n setMode(mode: IdMode): void {\n this.config.mode = mode;\n \n // Clear cached daily ID when switching to permanent\n if (mode === 'permanent') {\n this.cachedDailyId = null;\n this.dailyIdDate = null;\n this.dailyRandomSeed = null;\n this.clearDailySeed();\n }\n \n // Clear permanent ID when switching to cookieless\n if (mode === 'cookieless') {\n this.permanentId = null;\n if (this.config.useLocalStorage) {\n this.clearPermanentId();\n }\n // Load daily seed for cookieless mode\n this.loadDailySeed();\n }\n }\n \n /**\n * Load permanent ID from localStorage\n */\n private loadPermanentId(): string | null {\n if (typeof window === 'undefined') return null;\n \n try {\n const storageKey = `grain_anonymous_user_id_${this.config.tenantId}`;\n const stored = localStorage.getItem(storageKey);\n if (stored) {\n this.permanentId = stored;\n return stored;\n }\n } catch (error) {\n // Silent failure - localStorage might be disabled\n }\n \n return null;\n }\n \n /**\n * Save permanent ID to localStorage\n */\n private savePermanentId(id: string): void {\n if (typeof window === 'undefined') return;\n \n try {\n const storageKey = `grain_anonymous_user_id_${this.config.tenantId}`;\n localStorage.setItem(storageKey, id);\n } catch (error) {\n // Silent failure - localStorage might be disabled\n }\n }\n \n /**\n * Clear permanent ID from localStorage\n */\n private clearPermanentId(): void {\n if (typeof window === 'undefined') return;\n \n try {\n const storageKey = `grain_anonymous_user_id_${this.config.tenantId}`;\n localStorage.removeItem(storageKey);\n } catch (error) {\n // Silent failure\n }\n }\n \n /**\n * Load daily random seed from sessionStorage\n */\n private loadDailySeed(): string | null {\n if (typeof window === 'undefined') return null;\n \n try {\n const storageKey = `grain_daily_seed_${this.config.tenantId}`;\n const stored = sessionStorage.getItem(storageKey);\n if (stored) {\n const data = JSON.parse(stored);\n const currentDate = getLocalDateString();\n \n // Only use seed if it's from today\n if (data.date === currentDate && data.seed) {\n this.dailyRandomSeed = data.seed;\n this.dailyIdDate = data.date;\n return data.seed;\n } else {\n // Clear stale seed\n this.clearDailySeed();\n }\n }\n } catch (error) {\n // Silent failure - sessionStorage might be disabled\n }\n \n return null;\n }\n \n /**\n * Save daily random seed to sessionStorage\n */\n private saveDailySeed(seed: string, date: string): void {\n if (typeof window === 'undefined') return;\n \n try {\n const storageKey = `grain_daily_seed_${this.config.tenantId}`;\n const data = { seed, date };\n sessionStorage.setItem(storageKey, JSON.stringify(data));\n } catch (error) {\n // Silent failure - sessionStorage might be disabled\n }\n }\n \n /**\n * Clear daily seed from sessionStorage\n */\n private clearDailySeed(): void {\n if (typeof window === 'undefined') return;\n \n try {\n const storageKey = `grain_daily_seed_${this.config.tenantId}`;\n sessionStorage.removeItem(storageKey);\n } catch (error) {\n // Silent failure\n }\n }\n \n /**\n * Get info about current ID for debugging\n */\n getIdInfo(): { mode: IdMode; id: string; isDailyRotating: boolean } {\n const id = this.getCurrentUserId();\n return {\n mode: this.config.mode,\n id: id,\n isDailyRotating: id.startsWith('daily_')\n };\n }\n}\n"],
5
- "mappings": "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IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,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",
6
- "names": ["DEFAULT_OPTIONS", "DEFAULT_OPTIONS", "e", "url", "idMode", "HeatmapTrackingManager", "InteractionTrackingManager", "SectionTrackingManager", "DebugAgent"]
3
+ "sources": ["../src/attention-quality.ts", "../src/text-utils.ts", "../node_modules/types/dist/types.js", "../node_modules/utils/dist/utils.js", "../node_modules/rrweb-snapshot/src/utils.ts", "../node_modules/rrweb-snapshot/src/snapshot.ts", "../node_modules/rrweb-snapshot/src/css.ts", "../node_modules/picocolors/picocolors.browser.js", "../node_modules/rrweb-snapshot/__vite-browser-external", "../node_modules/postcss/lib/css-syntax-error.js", "../node_modules/postcss/lib/symbols.js", "../node_modules/postcss/lib/stringifier.js", "../node_modules/postcss/lib/stringify.js", "../node_modules/postcss/lib/node.js", "../node_modules/postcss/lib/declaration.js", "../node_modules/postcss/node_modules/nanoid/non-secure/index.cjs", "../node_modules/postcss/lib/previous-map.js", "../node_modules/postcss/lib/input.js", "../node_modules/postcss/lib/map-generator.js", "../node_modules/postcss/lib/comment.js", "../node_modules/postcss/lib/container.js", "../node_modules/postcss/lib/document.js", "../node_modules/postcss/lib/warn-once.js", "../node_modules/postcss/lib/warning.js", "../node_modules/postcss/lib/result.js", "../node_modules/postcss/lib/tokenize.js", "../node_modules/postcss/lib/at-rule.js", "../node_modules/postcss/lib/root.js", "../node_modules/postcss/lib/list.js", "../node_modules/postcss/lib/rule.js", "../node_modules/postcss/lib/parser.js", "../node_modules/postcss/lib/parse.js", "../node_modules/postcss/lib/lazy-result.js", "../node_modules/postcss/lib/no-work-result.js", "../node_modules/postcss/lib/processor.js", "../node_modules/postcss/lib/fromJSON.js", "../node_modules/postcss/lib/postcss.js", "../node_modules/postcss/lib/postcss.mjs", "../node_modules/rrweb-snapshot/src/rebuild.ts", "../src/heatmap-tracking.ts", "../src/interaction-tracking.ts", "../src/section-tracking.ts", "../src/debug-agent.ts", "../src/index.ts", "../src/consent.ts", "../src/cookies.ts", "../src/activity.ts", "../src/heartbeat.ts", "../src/attribution.ts", "../src/countries.ts", "../src/page-tracking.ts", "../src/id-manager.ts"],
4
+ "sourcesContent": ["/**\n * Attention Quality Manager for Grain Analytics\n * Enforces policies to ensure tracked data represents genuine user attention\n * \n * Policies:\n * 1. Page Visibility: Stop tracking when tab is hidden/backgrounded\n * 2. User Activity: Stop tracking when user is idle (no mouse/keyboard/touch)\n * 3. Section Duration Cap: Max attention per section before requiring transition\n * 4. Scroll Distance: Minimum scroll distance to count as meaningful engagement\n * \n * See: ATTENTION_QUALITY_POLICY.md for detailed policy documentation\n */\n\nimport type { ActivityDetector } from './activity';\n\nexport interface AttentionQualityOptions {\n /**\n * Maximum continuous attention duration per section (ms)\n * Default: 9000 (9 seconds)\n */\n maxSectionDuration?: number;\n\n /**\n * Minimum scroll distance to reset attention timer (px)\n * Default: 100\n */\n minScrollDistance?: number;\n\n /**\n * Idle threshold - stop tracking after this period of inactivity (ms)\n * Default: 30000 (30 seconds)\n */\n idleThreshold?: number;\n\n /**\n * Enable debug logging\n */\n debug?: boolean;\n}\n\ninterface SectionAttentionState {\n sectionName: string;\n currentDuration: number; // Cumulative duration in current attention block\n lastScrollPosition: number;\n lastResetTime: number;\n}\n\nconst DEFAULT_OPTIONS: Required<Omit<AttentionQualityOptions, 'debug'>> = {\n maxSectionDuration: 9000, // 9 seconds\n minScrollDistance: 100, // 100 pixels\n idleThreshold: 30000, // 30 seconds\n};\n\nexport class AttentionQualityManager {\n private options: Required<Omit<AttentionQualityOptions, 'debug'>> & { debug: boolean };\n private activityDetector: ActivityDetector;\n private isDestroyed = false;\n\n // Page visibility tracking\n private isPageVisible = true;\n private visibilityChangeHandler: (() => void) | null = null;\n\n // Section attention state\n private sectionStates = new Map<string, SectionAttentionState>();\n\n // Policies applied reasons (for debugging/traceability)\n private lastFilterReason: string | null = null;\n\n constructor(activityDetector: ActivityDetector, options: AttentionQualityOptions = {}) {\n this.activityDetector = activityDetector;\n this.options = {\n ...DEFAULT_OPTIONS,\n ...options,\n debug: options.debug ?? false,\n };\n\n this.setupPageVisibilityTracking();\n }\n\n /**\n * Setup page visibility tracking\n */\n private setupPageVisibilityTracking(): void {\n if (typeof document === 'undefined') return;\n\n this.isPageVisible = document.visibilityState === 'visible';\n\n this.visibilityChangeHandler = () => {\n const wasVisible = this.isPageVisible;\n this.isPageVisible = document.visibilityState === 'visible';\n\n if (!this.isPageVisible && wasVisible) {\n this.log('Page hidden - tracking paused');\n } else if (this.isPageVisible && !wasVisible) {\n this.log('Page visible - tracking resumed');\n // Reset all section states when page becomes visible again\n this.resetAllSections();\n }\n };\n\n document.addEventListener('visibilitychange', this.visibilityChangeHandler);\n }\n\n /**\n * Check if tracking should be allowed (global check)\n * Returns true if tracking is allowed, false if it should be paused\n */\n shouldTrack(): boolean {\n // Policy 1: Page Visibility\n if (!this.isPageVisible) {\n this.lastFilterReason = 'page_hidden';\n return false;\n }\n\n // Policy 2: User Activity\n if (!this.activityDetector.isActive(this.options.idleThreshold)) {\n this.lastFilterReason = 'user_idle';\n return false;\n }\n\n this.lastFilterReason = null;\n return true;\n }\n\n /**\n * Check if section view tracking should be allowed for a specific section\n * @param sectionName - Section identifier\n * @param currentScrollY - Current scroll position\n * @returns Object with shouldTrack boolean and optional reason\n */\n shouldTrackSection(sectionName: string, currentScrollY: number): {\n shouldTrack: boolean;\n reason?: string;\n resetAttention?: boolean;\n } {\n // First check global tracking state\n if (!this.shouldTrack()) {\n return {\n shouldTrack: false,\n reason: this.lastFilterReason || 'global_policy',\n };\n }\n\n // Get or create section state\n let state = this.sectionStates.get(sectionName);\n if (!state) {\n state = {\n sectionName,\n currentDuration: 0,\n lastScrollPosition: currentScrollY,\n lastResetTime: Date.now(),\n };\n this.sectionStates.set(sectionName, state);\n }\n\n // Policy 4: Scroll Distance - Check if user has scrolled enough to reset attention\n const scrollDistance = Math.abs(currentScrollY - state.lastScrollPosition);\n const hasScrolledEnough = scrollDistance >= this.options.minScrollDistance;\n\n if (hasScrolledEnough) {\n // Reset attention timer due to meaningful scroll\n this.log(`Section \"${sectionName}\": Attention reset due to ${Math.round(scrollDistance)}px scroll`);\n state.currentDuration = 0;\n state.lastScrollPosition = currentScrollY;\n state.lastResetTime = Date.now();\n return {\n shouldTrack: true,\n resetAttention: true,\n };\n }\n\n // Policy 3: Section Duration Cap\n if (state.currentDuration >= this.options.maxSectionDuration) {\n return {\n shouldTrack: false,\n reason: 'max_duration_reached',\n };\n }\n\n return {\n shouldTrack: true,\n };\n }\n\n /**\n * Update section duration (call this when tracking a section view event)\n * @param sectionName - Section identifier\n * @param durationMs - Duration to add to current attention block\n */\n updateSectionDuration(sectionName: string, durationMs: number): void {\n const state = this.sectionStates.get(sectionName);\n if (state) {\n state.currentDuration += durationMs;\n \n if (state.currentDuration >= this.options.maxSectionDuration) {\n this.log(`Section \"${sectionName}\": Max duration cap reached (${state.currentDuration}ms)`);\n }\n }\n }\n\n /**\n * Reset attention for a specific section (call when user navigates to different section)\n * @param sectionName - Section identifier\n */\n resetSection(sectionName: string): void {\n const state = this.sectionStates.get(sectionName);\n if (state) {\n this.log(`Section \"${sectionName}\": Attention reset (section exit)`);\n state.currentDuration = 0;\n state.lastResetTime = Date.now();\n }\n }\n\n /**\n * Reset all section attention states\n */\n resetAllSections(): void {\n this.log('Resetting all section attention states');\n for (const state of this.sectionStates.values()) {\n state.currentDuration = 0;\n state.lastResetTime = Date.now();\n }\n }\n\n /**\n * Get current attention state for a section (for debugging/monitoring)\n */\n getSectionState(sectionName: string): SectionAttentionState | undefined {\n return this.sectionStates.get(sectionName);\n }\n\n /**\n * Get reason why last tracking attempt was filtered\n */\n getLastFilterReason(): string | null {\n return this.lastFilterReason;\n }\n\n /**\n * Check if scroll tracking should be allowed\n * Similar to shouldTrack() but also checks scroll-specific conditions\n */\n shouldTrackScroll(previousScrollY: number, currentScrollY: number): {\n shouldTrack: boolean;\n reason?: string;\n } {\n // First check global tracking state\n if (!this.shouldTrack()) {\n return {\n shouldTrack: false,\n reason: this.lastFilterReason || 'global_policy',\n };\n }\n\n // Check if scroll is meaningful\n const scrollDistance = Math.abs(currentScrollY - previousScrollY);\n if (scrollDistance < 10) { // Minimum 10px to count as scroll\n return {\n shouldTrack: false,\n reason: 'scroll_too_small',\n };\n }\n\n return {\n shouldTrack: true,\n };\n }\n\n /**\n * Get all active policies as object (for monitoring/debugging)\n */\n getPolicies(): {\n maxSectionDuration: number;\n minScrollDistance: number;\n idleThreshold: number;\n } {\n return {\n maxSectionDuration: this.options.maxSectionDuration,\n minScrollDistance: this.options.minScrollDistance,\n idleThreshold: this.options.idleThreshold,\n };\n }\n\n /**\n * Get current tracking state (for monitoring/debugging)\n */\n getTrackingState(): {\n isPageVisible: boolean;\n isUserActive: boolean;\n timeSinceLastActivity: number;\n activeSections: number;\n } {\n return {\n isPageVisible: this.isPageVisible,\n isUserActive: this.activityDetector.isActive(this.options.idleThreshold),\n timeSinceLastActivity: this.activityDetector.getTimeSinceLastActivity(),\n activeSections: this.sectionStates.size,\n };\n }\n\n /**\n * Log debug messages\n */\n private log(...args: unknown[]): void {\n if (this.options.debug) {\n console.log('[AttentionQuality]', ...args);\n }\n }\n\n /**\n * Destroy and cleanup\n */\n destroy(): void {\n if (this.isDestroyed) return;\n\n this.isDestroyed = true;\n\n // Remove visibility change listener\n if (this.visibilityChangeHandler && typeof document !== 'undefined') {\n document.removeEventListener('visibilitychange', this.visibilityChangeHandler);\n this.visibilityChangeHandler = null;\n }\n\n // Clear section states\n this.sectionStates.clear();\n }\n}\n\n", "/**\n * Text utility functions for cleaning and processing text content\n */\n\n/**\n * Remove emojis and other Unicode symbols from text\n * This regex matches emoji ranges and other Unicode symbols\n */\nexport function removeEmojis(text: string | null | undefined): string | undefined {\n if (!text) return undefined;\n \n // Remove emojis and other Unicode symbols\n // This regex covers:\n // - Emoticons (\uD83D\uDE00-\uD83D\uDE4F)\n // - Miscellaneous Symbols and Pictographs (\uD83C\uDC00-\uD83F\uDFFF)\n // - Supplemental Symbols and Pictographs (\uD83C\uDE00-\uD83C\uDE3F)\n // - Transport and Map Symbols (\uD83D\uDE80-\uD83D\uDEFF)\n // - Enclosed characters (\u24C2-\u24FF)\n // - Regional indicator symbols (\uD83C\uDDE6-\uD83C\uDDFF)\n // - Other Unicode symbol ranges\n return text\n .replace(/[\\u{1F300}-\\u{1F9FF}]/gu, '') // Miscellaneous Symbols and Pictographs\n .replace(/[\\u{1F600}-\\u{1F64F}]/gu, '') // Emoticons\n .replace(/[\\u{1F680}-\\u{1F6FF}]/gu, '') // Transport and Map Symbols\n .replace(/[\\u{2600}-\\u{26FF}]/gu, '') // Miscellaneous Symbols\n .replace(/[\\u{2700}-\\u{27BF}]/gu, '') // Dingbats\n .replace(/[\\u{1F900}-\\u{1F9FF}]/gu, '') // Supplemental Symbols and Pictographs\n .replace(/[\\u{1F1E0}-\\u{1F1FF}]/gu, '') // Regional Indicator Symbols (flags)\n .replace(/[\\u{200D}]/gu, '') // Zero Width Joiner\n .replace(/[\\u{FE0F}]/gu, '') // Variation Selector-16\n .replace(/[\\u{20E3}]/gu, '') // Combining Enclosing Keycap\n .trim();\n}\n\n/**\n * Clean and truncate text content for event tracking\n * Removes emojis, trims whitespace, and limits length\n */\nexport function cleanElementText(text: string | null | undefined, maxLength: number = 100): string | undefined {\n if (!text) return undefined;\n \n const cleaned = removeEmojis(text);\n if (!cleaned) return undefined;\n \n return cleaned.substring(0, maxLength) || undefined;\n}\n", "var EventType = /* @__PURE__ */ ((EventType2) => {\n EventType2[EventType2[\"DomContentLoaded\"] = 0] = \"DomContentLoaded\";\n EventType2[EventType2[\"Load\"] = 1] = \"Load\";\n EventType2[EventType2[\"FullSnapshot\"] = 2] = \"FullSnapshot\";\n EventType2[EventType2[\"IncrementalSnapshot\"] = 3] = \"IncrementalSnapshot\";\n EventType2[EventType2[\"Meta\"] = 4] = \"Meta\";\n EventType2[EventType2[\"Custom\"] = 5] = \"Custom\";\n EventType2[EventType2[\"Plugin\"] = 6] = \"Plugin\";\n return EventType2;\n})(EventType || {});\nvar IncrementalSource = /* @__PURE__ */ ((IncrementalSource2) => {\n IncrementalSource2[IncrementalSource2[\"Mutation\"] = 0] = \"Mutation\";\n IncrementalSource2[IncrementalSource2[\"MouseMove\"] = 1] = \"MouseMove\";\n IncrementalSource2[IncrementalSource2[\"MouseInteraction\"] = 2] = \"MouseInteraction\";\n IncrementalSource2[IncrementalSource2[\"Scroll\"] = 3] = \"Scroll\";\n IncrementalSource2[IncrementalSource2[\"ViewportResize\"] = 4] = \"ViewportResize\";\n IncrementalSource2[IncrementalSource2[\"Input\"] = 5] = \"Input\";\n IncrementalSource2[IncrementalSource2[\"TouchMove\"] = 6] = \"TouchMove\";\n IncrementalSource2[IncrementalSource2[\"MediaInteraction\"] = 7] = \"MediaInteraction\";\n IncrementalSource2[IncrementalSource2[\"StyleSheetRule\"] = 8] = \"StyleSheetRule\";\n IncrementalSource2[IncrementalSource2[\"CanvasMutation\"] = 9] = \"CanvasMutation\";\n IncrementalSource2[IncrementalSource2[\"Font\"] = 10] = \"Font\";\n IncrementalSource2[IncrementalSource2[\"Log\"] = 11] = \"Log\";\n IncrementalSource2[IncrementalSource2[\"Drag\"] = 12] = \"Drag\";\n IncrementalSource2[IncrementalSource2[\"StyleDeclaration\"] = 13] = \"StyleDeclaration\";\n IncrementalSource2[IncrementalSource2[\"Selection\"] = 14] = \"Selection\";\n IncrementalSource2[IncrementalSource2[\"AdoptedStyleSheet\"] = 15] = \"AdoptedStyleSheet\";\n IncrementalSource2[IncrementalSource2[\"CustomElement\"] = 16] = \"CustomElement\";\n return IncrementalSource2;\n})(IncrementalSource || {});\nvar MouseInteractions = /* @__PURE__ */ ((MouseInteractions2) => {\n MouseInteractions2[MouseInteractions2[\"MouseUp\"] = 0] = \"MouseUp\";\n MouseInteractions2[MouseInteractions2[\"MouseDown\"] = 1] = \"MouseDown\";\n MouseInteractions2[MouseInteractions2[\"Click\"] = 2] = \"Click\";\n MouseInteractions2[MouseInteractions2[\"ContextMenu\"] = 3] = \"ContextMenu\";\n MouseInteractions2[MouseInteractions2[\"DblClick\"] = 4] = \"DblClick\";\n MouseInteractions2[MouseInteractions2[\"Focus\"] = 5] = \"Focus\";\n MouseInteractions2[MouseInteractions2[\"Blur\"] = 6] = \"Blur\";\n MouseInteractions2[MouseInteractions2[\"TouchStart\"] = 7] = \"TouchStart\";\n MouseInteractions2[MouseInteractions2[\"TouchMove_Departed\"] = 8] = \"TouchMove_Departed\";\n MouseInteractions2[MouseInteractions2[\"TouchEnd\"] = 9] = \"TouchEnd\";\n MouseInteractions2[MouseInteractions2[\"TouchCancel\"] = 10] = \"TouchCancel\";\n return MouseInteractions2;\n})(MouseInteractions || {});\nvar PointerTypes = /* @__PURE__ */ ((PointerTypes2) => {\n PointerTypes2[PointerTypes2[\"Mouse\"] = 0] = \"Mouse\";\n PointerTypes2[PointerTypes2[\"Pen\"] = 1] = \"Pen\";\n PointerTypes2[PointerTypes2[\"Touch\"] = 2] = \"Touch\";\n return PointerTypes2;\n})(PointerTypes || {});\nvar CanvasContext = /* @__PURE__ */ ((CanvasContext2) => {\n CanvasContext2[CanvasContext2[\"2D\"] = 0] = \"2D\";\n CanvasContext2[CanvasContext2[\"WebGL\"] = 1] = \"WebGL\";\n CanvasContext2[CanvasContext2[\"WebGL2\"] = 2] = \"WebGL2\";\n return CanvasContext2;\n})(CanvasContext || {});\nvar MediaInteractions = /* @__PURE__ */ ((MediaInteractions2) => {\n MediaInteractions2[MediaInteractions2[\"Play\"] = 0] = \"Play\";\n MediaInteractions2[MediaInteractions2[\"Pause\"] = 1] = \"Pause\";\n MediaInteractions2[MediaInteractions2[\"Seeked\"] = 2] = \"Seeked\";\n MediaInteractions2[MediaInteractions2[\"VolumeChange\"] = 3] = \"VolumeChange\";\n MediaInteractions2[MediaInteractions2[\"RateChange\"] = 4] = \"RateChange\";\n return MediaInteractions2;\n})(MediaInteractions || {});\nvar ReplayerEvents = /* @__PURE__ */ ((ReplayerEvents2) => {\n ReplayerEvents2[\"Start\"] = \"start\";\n ReplayerEvents2[\"Pause\"] = \"pause\";\n ReplayerEvents2[\"Resume\"] = \"resume\";\n ReplayerEvents2[\"Resize\"] = \"resize\";\n ReplayerEvents2[\"Finish\"] = \"finish\";\n ReplayerEvents2[\"FullsnapshotRebuilded\"] = \"fullsnapshot-rebuilded\";\n ReplayerEvents2[\"LoadStylesheetStart\"] = \"load-stylesheet-start\";\n ReplayerEvents2[\"LoadStylesheetEnd\"] = \"load-stylesheet-end\";\n ReplayerEvents2[\"SkipStart\"] = \"skip-start\";\n ReplayerEvents2[\"SkipEnd\"] = \"skip-end\";\n ReplayerEvents2[\"MouseInteraction\"] = \"mouse-interaction\";\n ReplayerEvents2[\"EventCast\"] = \"event-cast\";\n ReplayerEvents2[\"CustomEvent\"] = \"custom-event\";\n ReplayerEvents2[\"Flush\"] = \"flush\";\n ReplayerEvents2[\"StateChange\"] = \"state-change\";\n ReplayerEvents2[\"PlayBack\"] = \"play-back\";\n ReplayerEvents2[\"Destroy\"] = \"destroy\";\n return ReplayerEvents2;\n})(ReplayerEvents || {});\nvar NodeType = /* @__PURE__ */ ((NodeType2) => {\n NodeType2[NodeType2[\"Document\"] = 0] = \"Document\";\n NodeType2[NodeType2[\"DocumentType\"] = 1] = \"DocumentType\";\n NodeType2[NodeType2[\"Element\"] = 2] = \"Element\";\n NodeType2[NodeType2[\"Text\"] = 3] = \"Text\";\n NodeType2[NodeType2[\"CDATA\"] = 4] = \"CDATA\";\n NodeType2[NodeType2[\"Comment\"] = 5] = \"Comment\";\n return NodeType2;\n})(NodeType || {});\nexport {\n CanvasContext,\n EventType,\n IncrementalSource,\n MediaInteractions,\n MouseInteractions,\n NodeType,\n PointerTypes,\n ReplayerEvents\n};\n//# sourceMappingURL=types.js.map\n", "const testableAccessors = {\n Node: [\"childNodes\", \"parentNode\", \"parentElement\", \"textContent\"],\n ShadowRoot: [\"host\", \"styleSheets\"],\n Element: [\"shadowRoot\", \"querySelector\", \"querySelectorAll\"],\n MutationObserver: []\n};\nconst testableMethods = {\n Node: [\"contains\", \"getRootNode\"],\n ShadowRoot: [\"getSelection\"],\n Element: [],\n MutationObserver: [\"constructor\"]\n};\nconst untaintedBasePrototype = {};\nconst isAngularZonePresent = () => {\n return !!globalThis.Zone;\n};\nfunction getUntaintedPrototype(key) {\n if (untaintedBasePrototype[key])\n return untaintedBasePrototype[key];\n const defaultObj = globalThis[key];\n const defaultPrototype = defaultObj.prototype;\n const accessorNames = key in testableAccessors ? testableAccessors[key] : void 0;\n const isUntaintedAccessors = Boolean(\n accessorNames && // @ts-expect-error 2345\n accessorNames.every(\n (accessor) => {\n var _a, _b;\n return Boolean(\n (_b = (_a = Object.getOwnPropertyDescriptor(defaultPrototype, accessor)) == null ? void 0 : _a.get) == null ? void 0 : _b.toString().includes(\"[native code]\")\n );\n }\n )\n );\n const methodNames = key in testableMethods ? testableMethods[key] : void 0;\n const isUntaintedMethods = Boolean(\n methodNames && methodNames.every(\n // @ts-expect-error 2345\n (method) => {\n var _a;\n return typeof defaultPrototype[method] === \"function\" && ((_a = defaultPrototype[method]) == null ? void 0 : _a.toString().includes(\"[native code]\"));\n }\n )\n );\n if (isUntaintedAccessors && isUntaintedMethods && !isAngularZonePresent()) {\n untaintedBasePrototype[key] = defaultObj.prototype;\n return defaultObj.prototype;\n }\n try {\n const iframeEl = document.createElement(\"iframe\");\n document.body.appendChild(iframeEl);\n const win = iframeEl.contentWindow;\n if (!win) return defaultObj.prototype;\n const untaintedObject = win[key].prototype;\n document.body.removeChild(iframeEl);\n if (!untaintedObject) return defaultPrototype;\n return untaintedBasePrototype[key] = untaintedObject;\n } catch {\n return defaultPrototype;\n }\n}\nconst untaintedAccessorCache = {};\nfunction getUntaintedAccessor(key, instance, accessor) {\n var _a;\n const cacheKey = `${key}.${String(accessor)}`;\n if (untaintedAccessorCache[cacheKey])\n return untaintedAccessorCache[cacheKey].call(\n instance\n );\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedAccessor = (_a = Object.getOwnPropertyDescriptor(\n untaintedPrototype,\n accessor\n )) == null ? void 0 : _a.get;\n if (!untaintedAccessor) return instance[accessor];\n untaintedAccessorCache[cacheKey] = untaintedAccessor;\n return untaintedAccessor.call(instance);\n}\nconst untaintedMethodCache = {};\nfunction getUntaintedMethod(key, instance, method) {\n const cacheKey = `${key}.${String(method)}`;\n if (untaintedMethodCache[cacheKey])\n return untaintedMethodCache[cacheKey].bind(\n instance\n );\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedMethod = untaintedPrototype[method];\n if (typeof untaintedMethod !== \"function\") return instance[method];\n untaintedMethodCache[cacheKey] = untaintedMethod;\n return untaintedMethod.bind(instance);\n}\nfunction childNodes(n) {\n return getUntaintedAccessor(\"Node\", n, \"childNodes\");\n}\nfunction parentNode(n) {\n return getUntaintedAccessor(\"Node\", n, \"parentNode\");\n}\nfunction parentElement(n) {\n return getUntaintedAccessor(\"Node\", n, \"parentElement\");\n}\nfunction textContent(n) {\n return getUntaintedAccessor(\"Node\", n, \"textContent\");\n}\nfunction contains(n, other) {\n return getUntaintedMethod(\"Node\", n, \"contains\")(other);\n}\nfunction getRootNode(n) {\n return getUntaintedMethod(\"Node\", n, \"getRootNode\")();\n}\nfunction host(n) {\n if (!n || !(\"host\" in n)) return null;\n return getUntaintedAccessor(\"ShadowRoot\", n, \"host\");\n}\nfunction styleSheets(n) {\n return n.styleSheets;\n}\nfunction shadowRoot(n) {\n if (!n || !(\"shadowRoot\" in n)) return null;\n return getUntaintedAccessor(\"Element\", n, \"shadowRoot\");\n}\nfunction querySelector(n, selectors) {\n return getUntaintedAccessor(\"Element\", n, \"querySelector\")(selectors);\n}\nfunction querySelectorAll(n, selectors) {\n return getUntaintedAccessor(\"Element\", n, \"querySelectorAll\")(selectors);\n}\nfunction mutationObserverCtor() {\n return getUntaintedPrototype(\"MutationObserver\").constructor;\n}\nconst index = {\n childNodes,\n parentNode,\n parentElement,\n textContent,\n contains,\n getRootNode,\n host,\n styleSheets,\n shadowRoot,\n querySelector,\n querySelectorAll,\n mutationObserver: mutationObserverCtor\n};\nexport {\n childNodes,\n contains,\n index as default,\n getRootNode,\n getUntaintedAccessor,\n getUntaintedMethod,\n getUntaintedPrototype,\n host,\n isAngularZonePresent,\n mutationObserverCtor,\n parentElement,\n parentNode,\n querySelector,\n querySelectorAll,\n shadowRoot,\n styleSheets,\n textContent\n};\n//# sourceMappingURL=utils.js.map\n", "import type {\n idNodeMap,\n MaskInputFn,\n MaskInputOptions,\n nodeMetaMap,\n} from './types';\n\nimport { NodeType } from '@rrweb/types';\nimport type {\n IMirror,\n serializedNodeWithId,\n serializedNode,\n documentNode,\n documentTypeNode,\n textNode,\n elementNode,\n} from '@rrweb/types';\nimport dom from '@rrweb/utils';\n\nexport function isElement(n: Node): n is Element {\n return n.nodeType === n.ELEMENT_NODE;\n}\n\nexport function isShadowRoot(n: Node): n is ShadowRoot {\n const hostEl: Element | null =\n // anchor and textarea elements also have a `host` property\n // but only shadow roots have a `mode` property\n (n && 'host' in n && 'mode' in n && dom.host(n as ShadowRoot)) || null;\n return Boolean(\n hostEl && 'shadowRoot' in hostEl && dom.shadowRoot(hostEl) === n,\n );\n}\n\n/**\n * To fix the issue https://github.com/rrweb-io/rrweb/issues/933.\n * Some websites use polyfilled shadow dom and this function is used to detect this situation.\n */\nexport function isNativeShadowDom(shadowRoot: ShadowRoot): boolean {\n return Object.prototype.toString.call(shadowRoot) === '[object ShadowRoot]';\n}\n\n/**\n * Browsers sometimes destructively modify the css rules they receive.\n * This function tries to rectify the modifications the browser made to make it more cross platform compatible.\n * @param cssText - output of `CSSStyleRule.cssText`\n * @returns `cssText` with browser inconsistencies fixed.\n */\nfunction fixBrowserCompatibilityIssuesInCSS(cssText: string): string {\n /**\n * Chrome outputs `-webkit-background-clip` as `background-clip` in `CSSStyleRule.cssText`.\n * But then Chrome ignores `background-clip` as css input.\n * Re-introduce `-webkit-background-clip` to fix this issue.\n */\n if (\n cssText.includes(' background-clip: text;') &&\n !cssText.includes(' -webkit-background-clip: text;')\n ) {\n cssText = cssText.replace(\n /\\sbackground-clip:\\s*text;/g,\n ' -webkit-background-clip: text; background-clip: text;',\n );\n }\n return cssText;\n}\n\n// Remove this declaration once typescript has added `CSSImportRule.supportsText` to the lib.\ndeclare interface CSSImportRule extends CSSRule {\n readonly href: string;\n readonly layerName: string | null;\n readonly media: MediaList;\n readonly styleSheet: CSSStyleSheet;\n /**\n * experimental API, currently only supported in firefox\n * https://developer.mozilla.org/en-US/docs/Web/API/CSSImportRule/supportsText\n */\n readonly supportsText?: string | null;\n}\n\n/**\n * Browsers sometimes incorrectly escape `@import` on `.cssText` statements.\n * This function tries to correct the escaping.\n * more info: https://bugs.chromium.org/p/chromium/issues/detail?id=1472259\n * @param cssImportRule\n * @returns `cssText` with browser inconsistencies fixed, or null if not applicable.\n */\nexport function escapeImportStatement(rule: CSSImportRule): string {\n const { cssText } = rule;\n if (cssText.split('\"').length < 3) return cssText;\n\n const statement = ['@import', `url(${JSON.stringify(rule.href)})`];\n if (rule.layerName === '') {\n statement.push(`layer`);\n } else if (rule.layerName) {\n statement.push(`layer(${rule.layerName})`);\n }\n if (rule.supportsText) {\n statement.push(`supports(${rule.supportsText})`);\n }\n if (rule.media.length) {\n statement.push(rule.media.mediaText);\n }\n return statement.join(' ') + ';';\n}\n\n/*\n * serialize the css rules from the .sheet property\n * for <link rel=\"stylesheet\"> elements, this is the only way of getting the rules without a FETCH\n * for <style> elements, this is less preferable to looking at childNodes[0].textContent\n * (which will include vendor prefixed rules which may not be used or visible to the recorded browser,\n * but which might be needed by the replayer browser)\n * however, at snapshot time, we don't know whether the style element has suffered\n * any programmatic manipulation prior to the snapshot, in which case the .sheet would be more up to date\n */\nexport function stringifyStylesheet(s: CSSStyleSheet): string | null {\n try {\n const rules = s.rules || s.cssRules;\n if (!rules) {\n return null;\n }\n let sheetHref = s.href;\n if (!sheetHref && s.ownerNode && s.ownerNode.ownerDocument) {\n // an inline <style> element\n sheetHref = s.ownerNode.ownerDocument.location.href;\n }\n const stringifiedRules = Array.from(rules, (rule: CSSRule) =>\n stringifyRule(rule, sheetHref),\n ).join('');\n return fixBrowserCompatibilityIssuesInCSS(stringifiedRules);\n } catch (error) {\n return null;\n }\n}\n\nexport function stringifyRule(rule: CSSRule, sheetHref: string | null): string {\n if (isCSSImportRule(rule)) {\n let importStringified;\n try {\n importStringified =\n // for same-origin stylesheets,\n // we can access the imported stylesheet rules directly\n stringifyStylesheet(rule.styleSheet) ||\n // work around browser issues with the raw string `@import url(...)` statement\n escapeImportStatement(rule);\n } catch (error) {\n importStringified = rule.cssText;\n }\n if (rule.styleSheet.href) {\n // url()s within the imported stylesheet are relative to _that_ sheet's href\n return absolutifyURLs(importStringified, rule.styleSheet.href);\n }\n return importStringified;\n } else {\n let ruleStringified = rule.cssText;\n if (isCSSStyleRule(rule) && rule.selectorText.includes(':')) {\n // Safari does not escape selectors with : properly\n // see https://bugs.webkit.org/show_bug.cgi?id=184604\n ruleStringified = fixSafariColons(ruleStringified);\n }\n if (sheetHref) {\n return absolutifyURLs(ruleStringified, sheetHref);\n }\n return ruleStringified;\n }\n}\n\nexport function fixSafariColons(cssStringified: string): string {\n // Replace e.g. [aa:bb] with [aa\\\\:bb]\n const regex = /(\\[(?:[\\w-]+)[^\\\\])(:(?:[\\w-]+)\\])/gm;\n return cssStringified.replace(regex, '$1\\\\$2');\n}\n\nexport function isCSSImportRule(rule: CSSRule): rule is CSSImportRule {\n return 'styleSheet' in rule;\n}\n\nexport function isCSSStyleRule(rule: CSSRule): rule is CSSStyleRule {\n return 'selectorText' in rule;\n}\n\nexport class Mirror implements IMirror<Node> {\n private idNodeMap: idNodeMap = new Map();\n private nodeMetaMap: nodeMetaMap = new WeakMap();\n\n getId(n: Node | undefined | null): number {\n if (!n) return -1;\n\n const id = this.getMeta(n)?.id;\n\n // if n is not a serialized Node, use -1 as its id.\n return id ?? -1;\n }\n\n getNode(id: number): Node | null {\n return this.idNodeMap.get(id) || null;\n }\n\n getIds(): number[] {\n return Array.from(this.idNodeMap.keys());\n }\n\n getMeta(n: Node): serializedNodeWithId | null {\n return this.nodeMetaMap.get(n) || null;\n }\n\n // removes the node from idNodeMap\n // doesn't remove the node from nodeMetaMap\n removeNodeFromMap(n: Node) {\n const id = this.getId(n);\n this.idNodeMap.delete(id);\n\n if (n.childNodes) {\n n.childNodes.forEach((childNode) =>\n this.removeNodeFromMap(childNode as unknown as Node),\n );\n }\n }\n has(id: number): boolean {\n return this.idNodeMap.has(id);\n }\n\n hasNode(node: Node): boolean {\n return this.nodeMetaMap.has(node);\n }\n\n add(n: Node, meta: serializedNodeWithId) {\n const id = meta.id;\n this.idNodeMap.set(id, n);\n this.nodeMetaMap.set(n, meta);\n }\n\n replace(id: number, n: Node) {\n const oldNode = this.getNode(id);\n if (oldNode) {\n const meta = this.nodeMetaMap.get(oldNode);\n if (meta) this.nodeMetaMap.set(n, meta);\n }\n this.idNodeMap.set(id, n);\n }\n\n reset() {\n this.idNodeMap = new Map();\n this.nodeMetaMap = new WeakMap();\n }\n}\n\nexport function createMirror(): Mirror {\n return new Mirror();\n}\n\nexport function maskInputValue({\n element,\n maskInputOptions,\n tagName,\n type,\n value,\n maskInputFn,\n}: {\n element: HTMLElement;\n maskInputOptions: MaskInputOptions;\n tagName: string;\n type: string | null;\n value: string | null;\n maskInputFn?: MaskInputFn;\n}): string {\n let text = value || '';\n const actualType = type && toLowerCase(type);\n\n if (\n maskInputOptions[tagName.toLowerCase() as keyof MaskInputOptions] ||\n (actualType && maskInputOptions[actualType as keyof MaskInputOptions])\n ) {\n if (maskInputFn) {\n text = maskInputFn(text, element);\n } else {\n text = '*'.repeat(text.length);\n }\n }\n return text;\n}\n\nexport function toLowerCase<T extends string>(str: T): Lowercase<T> {\n return str.toLowerCase() as unknown as Lowercase<T>;\n}\n\nconst ORIGINAL_ATTRIBUTE_NAME = '__rrweb_original__';\ntype PatchedGetImageData = {\n [ORIGINAL_ATTRIBUTE_NAME]: CanvasImageData['getImageData'];\n} & CanvasImageData['getImageData'];\n\nexport function is2DCanvasBlank(canvas: HTMLCanvasElement): boolean {\n const ctx = canvas.getContext('2d');\n if (!ctx) return true;\n\n const chunkSize = 50;\n\n // get chunks of the canvas and check if it is blank\n for (let x = 0; x < canvas.width; x += chunkSize) {\n for (let y = 0; y < canvas.height; y += chunkSize) {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const getImageData = ctx.getImageData as PatchedGetImageData;\n const originalGetImageData =\n ORIGINAL_ATTRIBUTE_NAME in getImageData\n ? getImageData[ORIGINAL_ATTRIBUTE_NAME]\n : getImageData;\n // by getting the canvas in chunks we avoid an expensive\n // `getImageData` call that retrieves everything\n // even if we can already tell from the first chunk(s) that\n // the canvas isn't blank\n const pixelBuffer = new Uint32Array(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access\n originalGetImageData.call(\n ctx,\n x,\n y,\n Math.min(chunkSize, canvas.width - x),\n Math.min(chunkSize, canvas.height - y),\n ).data.buffer,\n );\n if (pixelBuffer.some((pixel) => pixel !== 0)) return false;\n }\n }\n return true;\n}\n\nexport function isNodeMetaEqual(a: serializedNode, b: serializedNode): boolean {\n if (!a || !b || a.type !== b.type) return false;\n if (a.type === NodeType.Document)\n return a.compatMode === (b as documentNode).compatMode;\n else if (a.type === NodeType.DocumentType)\n return (\n a.name === (b as documentTypeNode).name &&\n a.publicId === (b as documentTypeNode).publicId &&\n a.systemId === (b as documentTypeNode).systemId\n );\n else if (\n a.type === NodeType.Comment ||\n a.type === NodeType.Text ||\n a.type === NodeType.CDATA\n )\n return a.textContent === (b as textNode).textContent;\n else if (a.type === NodeType.Element)\n return (\n a.tagName === (b as elementNode).tagName &&\n JSON.stringify(a.attributes) ===\n JSON.stringify((b as elementNode).attributes) &&\n a.isSVG === (b as elementNode).isSVG &&\n a.needBlock === (b as elementNode).needBlock\n );\n return false;\n}\n\n/**\n * Get the type of an input element.\n * This takes care of the case where a password input is changed to a text input.\n * In this case, we continue to consider this of type password, in order to avoid leaking sensitive data\n * where passwords should be masked.\n */\nexport function getInputType(element: HTMLElement): Lowercase<string> | null {\n // when omitting the type of input element(e.g. <input />), the type is treated as text\n const type = (element as HTMLInputElement).type;\n\n return element.hasAttribute('data-rr-is-password')\n ? 'password'\n : type\n ? // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n toLowerCase(type)\n : null;\n}\n\n/**\n * Extracts the file extension from an a path, considering search parameters and fragments.\n * @param path - Path to file\n * @param baseURL - [optional] Base URL of the page, used to resolve relative paths. Defaults to current page URL.\n */\nexport function extractFileExtension(\n path: string,\n baseURL?: string,\n): string | null {\n let url;\n try {\n url = new URL(path, baseURL ?? window.location.href);\n } catch (err) {\n return null;\n }\n const regex = /\\.([0-9a-z]+)(?:$)/i;\n const match = url.pathname.match(regex);\n return match?.[1] ?? null;\n}\n\nfunction extractOrigin(url: string): string {\n let origin = '';\n if (url.indexOf('//') > -1) {\n origin = url.split('/').slice(0, 3).join('/');\n } else {\n origin = url.split('/')[0];\n }\n origin = origin.split('?')[0];\n return origin;\n}\n\nconst URL_IN_CSS_REF = /url\\((?:(')([^']*)'|(\")(.*?)\"|([^)]*))\\)/gm;\nconst URL_PROTOCOL_MATCH = /^(?:[a-z+]+:)?\\/\\//i;\nconst URL_WWW_MATCH = /^www\\..*/i;\nconst DATA_URI = /^(data:)([^,]*),(.*)/i;\nexport function absolutifyURLs(cssText: string | null, href: string): string {\n return (cssText || '').replace(\n URL_IN_CSS_REF,\n (\n origin: string,\n quote1: string,\n path1: string,\n quote2: string,\n path2: string,\n path3: string,\n ) => {\n const filePath = path1 || path2 || path3;\n const maybeQuote = quote1 || quote2 || '';\n if (!filePath) {\n return origin;\n }\n if (URL_PROTOCOL_MATCH.test(filePath) || URL_WWW_MATCH.test(filePath)) {\n return `url(${maybeQuote}${filePath}${maybeQuote})`;\n }\n if (DATA_URI.test(filePath)) {\n return `url(${maybeQuote}${filePath}${maybeQuote})`;\n }\n if (filePath[0] === '/') {\n return `url(${maybeQuote}${\n extractOrigin(href) + filePath\n }${maybeQuote})`;\n }\n const stack = href.split('/');\n const parts = filePath.split('/');\n stack.pop();\n for (const part of parts) {\n if (part === '.') {\n continue;\n } else if (part === '..') {\n stack.pop();\n } else {\n stack.push(part);\n }\n }\n return `url(${maybeQuote}${stack.join('/')}${maybeQuote})`;\n },\n );\n}\n\n/**\n * Intention is to normalize by remove spaces, semicolons and CSS comments\n * so that we can compare css as authored vs. output of stringifyStylesheet\n */\nexport function normalizeCssString(cssText: string): string {\n return cssText.replace(/(\\/\\*[^*]*\\*\\/)|[\\s;]/g, '');\n}\n\n/**\n * Maps the output of stringifyStylesheet to individual text nodes of a <style> element\n * performance is not considered as this is anticipated to be very much an edge case\n * (javascript is needed to add extra text nodes to a <style>)\n */\nexport function splitCssText(\n cssText: string,\n style: HTMLStyleElement,\n): string[] {\n const childNodes = Array.from(style.childNodes);\n const splits: string[] = [];\n if (childNodes.length > 1 && cssText && typeof cssText === 'string') {\n const cssTextNorm = normalizeCssString(cssText);\n for (let i = 1; i < childNodes.length; i++) {\n if (\n childNodes[i].textContent &&\n typeof childNodes[i].textContent === 'string'\n ) {\n const textContentNorm = normalizeCssString(childNodes[i].textContent!);\n for (let j = 3; j < textContentNorm.length; j++) {\n // find a substring that appears only once\n const bit = textContentNorm.substring(0, j);\n if (cssTextNorm.split(bit).length === 2) {\n const splitNorm = cssTextNorm.indexOf(bit);\n // find the split point in the original text\n for (let k = splitNorm; k < cssText.length; k++) {\n if (\n normalizeCssString(cssText.substring(0, k)).length === splitNorm\n ) {\n splits.push(cssText.substring(0, k));\n cssText = cssText.substring(k);\n break;\n }\n }\n break;\n }\n }\n }\n }\n }\n splits.push(cssText); // either the full thing if no splits were found, or the last split\n return splits;\n}\n\nexport function markCssSplits(\n cssText: string,\n style: HTMLStyleElement,\n): string {\n return splitCssText(cssText, style).join('/* rr_split */');\n}\n", "import type {\n MaskInputOptions,\n SlimDOMOptions,\n MaskTextFn,\n MaskInputFn,\n KeepIframeSrcFn,\n ICanvas,\n DialogAttributes,\n} from './types';\nimport { NodeType } from '@rrweb/types';\nimport type {\n serializedNode,\n serializedNodeWithId,\n serializedElementNodeWithId,\n elementNode,\n attributes,\n mediaAttributes,\n DataURLOptions,\n} from '@rrweb/types';\nimport {\n Mirror,\n is2DCanvasBlank,\n isElement,\n isShadowRoot,\n maskInputValue,\n isNativeShadowDom,\n stringifyStylesheet,\n getInputType,\n toLowerCase,\n extractFileExtension,\n absolutifyURLs,\n markCssSplits,\n} from './utils';\nimport dom from '@rrweb/utils';\n\nlet _id = 1;\nconst tagNameRegex = new RegExp('[^a-z0-9-_:]');\n\nexport const IGNORED_NODE = -2;\n\nexport function genId(): number {\n return _id++;\n}\n\nfunction getValidTagName(element: HTMLElement): Lowercase<string> {\n if (element instanceof HTMLFormElement) {\n return 'form';\n }\n\n const processedTagName = toLowerCase(element.tagName);\n\n if (tagNameRegex.test(processedTagName)) {\n // if the tag name is odd and we cannot extract\n // anything from the string, then we return a\n // generic div\n return 'div';\n }\n\n return processedTagName;\n}\n\nlet canvasService: HTMLCanvasElement | null;\nlet canvasCtx: CanvasRenderingContext2D | null;\n\n// eslint-disable-next-line no-control-regex\nconst SRCSET_NOT_SPACES = /^[^ \\t\\n\\r\\u000c]+/; // Don't use \\s, to avoid matching non-breaking space\n// eslint-disable-next-line no-control-regex\nconst SRCSET_COMMAS_OR_SPACES = /^[, \\t\\n\\r\\u000c]+/;\nfunction getAbsoluteSrcsetString(doc: Document, attributeValue: string) {\n /*\n run absoluteToDoc over every url in the srcset\n\n this is adapted from https://github.com/albell/parse-srcset/\n without the parsing of the descriptors (we return these as-is)\n parce-srcset is in turn based on\n https://html.spec.whatwg.org/multipage/embedded-content.html#parse-a-srcset-attribute\n */\n if (attributeValue.trim() === '') {\n return attributeValue;\n }\n\n let pos = 0;\n\n function collectCharacters(regEx: RegExp) {\n let chars: string;\n const match = regEx.exec(attributeValue.substring(pos));\n if (match) {\n chars = match[0];\n pos += chars.length;\n return chars;\n }\n return '';\n }\n\n const output = [];\n // eslint-disable-next-line no-constant-condition\n while (true) {\n collectCharacters(SRCSET_COMMAS_OR_SPACES);\n if (pos >= attributeValue.length) {\n break;\n }\n // don't split on commas within urls\n let url = collectCharacters(SRCSET_NOT_SPACES);\n if (url.slice(-1) === ',') {\n // aside: according to spec more than one comma at the end is a parse error, but we ignore that\n url = absoluteToDoc(doc, url.substring(0, url.length - 1));\n // the trailing comma splits the srcset, so the interpretion is that\n // another url will follow, and the descriptor is empty\n output.push(url);\n } else {\n let descriptorsStr = '';\n url = absoluteToDoc(doc, url);\n let inParens = false;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const c = attributeValue.charAt(pos);\n if (c === '') {\n output.push((url + descriptorsStr).trim());\n break;\n } else if (!inParens) {\n if (c === ',') {\n pos += 1;\n output.push((url + descriptorsStr).trim());\n break; // parse the next url\n } else if (c === '(') {\n inParens = true;\n }\n } else {\n // in parenthesis; ignore commas\n // (parenthesis may be supported by future additions to spec)\n if (c === ')') {\n inParens = false;\n }\n }\n descriptorsStr += c;\n pos += 1;\n }\n }\n }\n return output.join(', ');\n}\n\nconst cachedDocument = new WeakMap<Document, HTMLAnchorElement>();\n\nexport function absoluteToDoc(doc: Document, attributeValue: string): string {\n if (!attributeValue || attributeValue.trim() === '') {\n return attributeValue;\n }\n\n return getHref(doc, attributeValue);\n}\n\nfunction isSVGElement(el: Element): boolean {\n return Boolean(el.tagName === 'svg' || (el as SVGElement).ownerSVGElement);\n}\n\nfunction getHref(doc: Document, customHref?: string) {\n let a = cachedDocument.get(doc);\n if (!a) {\n a = doc.createElement('a');\n cachedDocument.set(doc, a);\n }\n if (!customHref) {\n customHref = '';\n } else if (customHref.startsWith('blob:') || customHref.startsWith('data:')) {\n return customHref;\n }\n // note: using `new URL` is slower. See #1434 or https://jsbench.me/uqlud17rxo/1\n a.setAttribute('href', customHref);\n return a.href;\n}\n\nexport function transformAttribute(\n doc: Document,\n tagName: Lowercase<string>,\n name: Lowercase<string>,\n value: string | null,\n): string | null {\n if (!value) {\n return value;\n }\n\n // relative path in attribute\n if (\n name === 'src' ||\n (name === 'href' && !(tagName === 'use' && value[0] === '#'))\n ) {\n // href starts with a # is an id pointer for svg\n return absoluteToDoc(doc, value);\n } else if (name === 'xlink:href' && value[0] !== '#') {\n // xlink:href starts with # is an id pointer\n return absoluteToDoc(doc, value);\n } else if (\n name === 'background' &&\n (tagName === 'table' || tagName === 'td' || tagName === 'th')\n ) {\n return absoluteToDoc(doc, value);\n } else if (name === 'srcset') {\n return getAbsoluteSrcsetString(doc, value);\n } else if (name === 'style') {\n return absolutifyURLs(value, getHref(doc));\n } else if (tagName === 'object' && name === 'data') {\n return absoluteToDoc(doc, value);\n }\n\n return value;\n}\n\nexport function ignoreAttribute(\n tagName: string,\n name: string,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _value: unknown,\n): boolean {\n return (tagName === 'video' || tagName === 'audio') && name === 'autoplay';\n}\n\nexport function _isBlockedElement(\n element: HTMLElement,\n blockClass: string | RegExp,\n blockSelector: string | null,\n): boolean {\n try {\n if (typeof blockClass === 'string') {\n if (element.classList.contains(blockClass)) {\n return true;\n }\n } else {\n for (let eIndex = element.classList.length; eIndex--; ) {\n const className = element.classList[eIndex];\n if (blockClass.test(className)) {\n return true;\n }\n }\n }\n if (blockSelector) {\n return element.matches(blockSelector);\n }\n } catch (e) {\n //\n }\n\n return false;\n}\n\nexport function classMatchesRegex(\n node: Node | null,\n regex: RegExp,\n checkAncestors: boolean,\n): boolean {\n if (!node) return false;\n if (node.nodeType !== node.ELEMENT_NODE) {\n if (!checkAncestors) return false;\n return classMatchesRegex(dom.parentNode(node), regex, checkAncestors);\n }\n\n for (let eIndex = (node as HTMLElement).classList.length; eIndex--; ) {\n const className = (node as HTMLElement).classList[eIndex];\n if (regex.test(className)) {\n return true;\n }\n }\n if (!checkAncestors) return false;\n return classMatchesRegex(dom.parentNode(node), regex, checkAncestors);\n}\n\nexport function needMaskingText(\n node: Node,\n maskTextClass: string | RegExp,\n maskTextSelector: string | null,\n checkAncestors: boolean,\n): boolean {\n let el: Element;\n if (isElement(node)) {\n el = node;\n if (!dom.childNodes(el).length) {\n // optimisation: we can avoid any of the below checks on leaf elements\n // as masking is applied to child text nodes only\n return false;\n }\n } else if (dom.parentElement(node) === null) {\n // should warn? maybe a text node isn't attached to a parent node yet?\n return false;\n } else {\n el = dom.parentElement(node)!;\n }\n try {\n if (typeof maskTextClass === 'string') {\n if (checkAncestors) {\n if (el.closest(`.${maskTextClass}`)) return true;\n } else {\n if (el.classList.contains(maskTextClass)) return true;\n }\n } else {\n if (classMatchesRegex(el, maskTextClass, checkAncestors)) return true;\n }\n if (maskTextSelector) {\n if (checkAncestors) {\n if (el.closest(maskTextSelector)) return true;\n } else {\n if (el.matches(maskTextSelector)) return true;\n }\n }\n } catch (e) {\n //\n }\n return false;\n}\n\n// https://stackoverflow.com/a/36155560\nfunction onceIframeLoaded(\n iframeEl: HTMLIFrameElement,\n listener: () => unknown,\n iframeLoadTimeout: number,\n) {\n const win = iframeEl.contentWindow;\n if (!win) {\n return;\n }\n // document is loading\n let fired = false;\n\n let readyState: DocumentReadyState;\n try {\n readyState = win.document.readyState;\n } catch (error) {\n return;\n }\n if (readyState !== 'complete') {\n const timer = setTimeout(() => {\n if (!fired) {\n listener();\n fired = true;\n }\n }, iframeLoadTimeout);\n iframeEl.addEventListener('load', () => {\n clearTimeout(timer);\n fired = true;\n listener();\n });\n return;\n }\n // check blank frame for Chrome\n const blankUrl = 'about:blank';\n if (\n win.location.href !== blankUrl ||\n iframeEl.src === blankUrl ||\n iframeEl.src === ''\n ) {\n // iframe was already loaded, make sure we wait to trigger the listener\n // till _after_ the mutation that found this iframe has had time to process\n setTimeout(listener, 0);\n\n return iframeEl.addEventListener('load', listener); // keep listing for future loads\n }\n // use default listener\n iframeEl.addEventListener('load', listener);\n}\n\nfunction onceStylesheetLoaded(\n link: HTMLLinkElement,\n listener: () => unknown,\n styleSheetLoadTimeout: number,\n) {\n let fired = false;\n let styleSheetLoaded: StyleSheet | null;\n try {\n styleSheetLoaded = link.sheet;\n } catch (error) {\n return;\n }\n\n if (styleSheetLoaded) return;\n\n const timer = setTimeout(() => {\n if (!fired) {\n listener();\n fired = true;\n }\n }, styleSheetLoadTimeout);\n\n link.addEventListener('load', () => {\n clearTimeout(timer);\n fired = true;\n listener();\n });\n}\n\nfunction serializeNode(\n n: Node,\n options: {\n doc: Document;\n mirror: Mirror;\n blockClass: string | RegExp;\n blockSelector: string | null;\n needsMask: boolean;\n inlineStylesheet: boolean;\n maskInputOptions: MaskInputOptions;\n maskTextFn: MaskTextFn | undefined;\n maskInputFn: MaskInputFn | undefined;\n dataURLOptions?: DataURLOptions;\n inlineImages: boolean;\n recordCanvas: boolean;\n keepIframeSrcFn: KeepIframeSrcFn;\n /**\n * `newlyAddedElement: true` skips scrollTop and scrollLeft check\n */\n newlyAddedElement?: boolean;\n cssCaptured?: boolean;\n },\n): serializedNode | false {\n const {\n doc,\n mirror,\n blockClass,\n blockSelector,\n needsMask,\n inlineStylesheet,\n maskInputOptions = {},\n maskTextFn,\n maskInputFn,\n dataURLOptions = {},\n inlineImages,\n recordCanvas,\n keepIframeSrcFn,\n newlyAddedElement = false,\n cssCaptured = false,\n } = options;\n // Only record root id when document object is not the base document\n const rootId = getRootId(doc, mirror);\n switch (n.nodeType) {\n case n.DOCUMENT_NODE:\n if ((n as Document).compatMode !== 'CSS1Compat') {\n return {\n type: NodeType.Document,\n childNodes: [],\n compatMode: (n as Document).compatMode, // probably \"BackCompat\"\n };\n } else {\n return {\n type: NodeType.Document,\n childNodes: [],\n };\n }\n case n.DOCUMENT_TYPE_NODE:\n return {\n type: NodeType.DocumentType,\n name: (n as DocumentType).name,\n publicId: (n as DocumentType).publicId,\n systemId: (n as DocumentType).systemId,\n rootId,\n };\n case n.ELEMENT_NODE:\n return serializeElementNode(n as HTMLElement, {\n doc,\n blockClass,\n blockSelector,\n inlineStylesheet,\n maskInputOptions,\n maskInputFn,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n keepIframeSrcFn,\n newlyAddedElement,\n rootId,\n });\n case n.TEXT_NODE:\n return serializeTextNode(n as Text, {\n doc,\n needsMask,\n maskTextFn,\n rootId,\n cssCaptured,\n });\n case n.CDATA_SECTION_NODE:\n return {\n type: NodeType.CDATA,\n textContent: '',\n rootId,\n };\n case n.COMMENT_NODE:\n return {\n type: NodeType.Comment,\n textContent: dom.textContent(n as Comment) || '',\n rootId,\n };\n default:\n return false;\n }\n}\n\nfunction getRootId(doc: Document, mirror: Mirror): number | undefined {\n if (!mirror.hasNode(doc)) return undefined;\n const docId = mirror.getId(doc);\n return docId === 1 ? undefined : docId;\n}\n\nfunction serializeTextNode(\n n: Text,\n options: {\n doc: Document;\n needsMask: boolean;\n maskTextFn: MaskTextFn | undefined;\n rootId: number | undefined;\n cssCaptured?: boolean;\n },\n): serializedNode {\n const { needsMask, maskTextFn, rootId, cssCaptured } = options;\n // The parent node may not be a html element which has a tagName attribute.\n // So just let it be undefined which is ok in this use case.\n const parent = dom.parentNode(n);\n const parentTagName = parent && (parent as HTMLElement).tagName;\n let textContent: string | null = '';\n const isStyle = parentTagName === 'STYLE' ? true : undefined;\n const isScript = parentTagName === 'SCRIPT' ? true : undefined;\n if (isScript) {\n textContent = 'SCRIPT_PLACEHOLDER';\n } else if (!cssCaptured) {\n textContent = dom.textContent(n);\n if (isStyle && textContent) {\n // mutation only: we don't need to use stringifyStylesheet\n // as a <style> text node mutation obliterates any previous\n // programmatic rule manipulation (.insertRule etc.)\n // so the current textContent represents the most up to date state\n textContent = absolutifyURLs(textContent, getHref(options.doc));\n }\n }\n if (!isStyle && !isScript && textContent && needsMask) {\n textContent = maskTextFn\n ? maskTextFn(textContent, dom.parentElement(n))\n : textContent.replace(/[\\S]/g, '*');\n }\n\n return {\n type: NodeType.Text,\n textContent: textContent || '',\n rootId,\n };\n}\n\nfunction serializeElementNode(\n n: HTMLElement,\n options: {\n doc: Document;\n blockClass: string | RegExp;\n blockSelector: string | null;\n inlineStylesheet: boolean;\n maskInputOptions: MaskInputOptions;\n maskInputFn: MaskInputFn | undefined;\n dataURLOptions?: DataURLOptions;\n inlineImages: boolean;\n recordCanvas: boolean;\n keepIframeSrcFn: KeepIframeSrcFn;\n /**\n * `newlyAddedElement: true` skips scrollTop and scrollLeft check\n */\n newlyAddedElement?: boolean;\n rootId: number | undefined;\n },\n): serializedNode | false {\n const {\n doc,\n blockClass,\n blockSelector,\n inlineStylesheet,\n maskInputOptions = {},\n maskInputFn,\n dataURLOptions = {},\n inlineImages,\n recordCanvas,\n keepIframeSrcFn,\n newlyAddedElement = false,\n rootId,\n } = options;\n const needBlock = _isBlockedElement(n, blockClass, blockSelector);\n const tagName = getValidTagName(n);\n let attributes: attributes = {};\n const len = n.attributes.length;\n for (let i = 0; i < len; i++) {\n const attr = n.attributes[i];\n if (!ignoreAttribute(tagName, attr.name, attr.value)) {\n attributes[attr.name] = transformAttribute(\n doc,\n tagName,\n toLowerCase(attr.name),\n attr.value,\n );\n }\n }\n // remote css\n if (tagName === 'link' && inlineStylesheet) {\n //TODO: maybe replace this `.styleSheets` with original one\n const stylesheet = Array.from(doc.styleSheets).find((s) => {\n return s.href === (n as HTMLLinkElement).href;\n });\n let cssText: string | null = null;\n if (stylesheet) {\n cssText = stringifyStylesheet(stylesheet);\n }\n if (cssText) {\n delete attributes.rel;\n delete attributes.href;\n attributes._cssText = cssText;\n }\n }\n if (tagName === 'style' && (n as HTMLStyleElement).sheet) {\n let cssText = stringifyStylesheet(\n (n as HTMLStyleElement).sheet as CSSStyleSheet,\n );\n if (cssText) {\n if (n.childNodes.length > 1) {\n cssText = markCssSplits(cssText, n as HTMLStyleElement);\n }\n attributes._cssText = cssText;\n }\n }\n // form fields\n if (tagName === 'input' || tagName === 'textarea' || tagName === 'select') {\n const value = (n as HTMLInputElement | HTMLTextAreaElement).value;\n const checked = (n as HTMLInputElement).checked;\n if (\n attributes.type !== 'radio' &&\n attributes.type !== 'checkbox' &&\n attributes.type !== 'submit' &&\n attributes.type !== 'button' &&\n value\n ) {\n attributes.value = maskInputValue({\n element: n,\n type: getInputType(n),\n tagName,\n value,\n maskInputOptions,\n maskInputFn,\n });\n } else if (checked) {\n attributes.checked = checked;\n }\n }\n if (tagName === 'option') {\n if ((n as HTMLOptionElement).selected && !maskInputOptions['select']) {\n attributes.selected = true;\n } else {\n // ignore the html attribute (which corresponds to DOM (n as HTMLOptionElement).defaultSelected)\n // if it's already been changed\n delete attributes.selected;\n }\n }\n\n if (tagName === 'dialog' && (n as HTMLDialogElement).open) {\n // register what type of dialog is this\n // `modal` or `non-modal`\n // this is used to trigger `showModal()` or `show()` on replay (outside of rrweb-snapshot, in rrweb)\n (attributes as DialogAttributes).rr_open_mode = n.matches('dialog:modal')\n ? 'modal'\n : 'non-modal';\n }\n\n // canvas image data\n if (tagName === 'canvas' && recordCanvas) {\n if ((n as ICanvas).__context === '2d') {\n // only record this on 2d canvas\n if (!is2DCanvasBlank(n as HTMLCanvasElement)) {\n attributes.rr_dataURL = (n as HTMLCanvasElement).toDataURL(\n dataURLOptions.type,\n dataURLOptions.quality,\n );\n }\n } else if (!('__context' in n)) {\n // context is unknown, better not call getContext to trigger it\n const canvasDataURL = (n as HTMLCanvasElement).toDataURL(\n dataURLOptions.type,\n dataURLOptions.quality,\n );\n\n // create blank canvas of same dimensions\n const blankCanvas = doc.createElement('canvas');\n blankCanvas.width = (n as HTMLCanvasElement).width;\n blankCanvas.height = (n as HTMLCanvasElement).height;\n const blankCanvasDataURL = blankCanvas.toDataURL(\n dataURLOptions.type,\n dataURLOptions.quality,\n );\n\n // no need to save dataURL if it's the same as blank canvas\n if (canvasDataURL !== blankCanvasDataURL) {\n attributes.rr_dataURL = canvasDataURL;\n }\n }\n }\n // save image offline\n if (tagName === 'img' && inlineImages) {\n if (!canvasService) {\n canvasService = doc.createElement('canvas');\n canvasCtx = canvasService.getContext('2d');\n }\n const image = n as HTMLImageElement;\n const imageSrc: string =\n image.currentSrc || image.getAttribute('src') || '<unknown-src>';\n const priorCrossOrigin = image.crossOrigin;\n const recordInlineImage = () => {\n image.removeEventListener('load', recordInlineImage);\n try {\n canvasService!.width = image.naturalWidth;\n canvasService!.height = image.naturalHeight;\n canvasCtx!.drawImage(image, 0, 0);\n attributes.rr_dataURL = canvasService!.toDataURL(\n dataURLOptions.type,\n dataURLOptions.quality,\n );\n } catch (err) {\n if (image.crossOrigin !== 'anonymous') {\n image.crossOrigin = 'anonymous';\n if (image.complete && image.naturalWidth !== 0)\n recordInlineImage(); // too early due to image reload\n else image.addEventListener('load', recordInlineImage);\n return;\n } else {\n console.warn(\n `Cannot inline img src=${imageSrc}! Error: ${err as string}`,\n );\n }\n }\n if (image.crossOrigin === 'anonymous') {\n priorCrossOrigin\n ? (attributes.crossOrigin = priorCrossOrigin)\n : image.removeAttribute('crossorigin');\n }\n };\n // The image content may not have finished loading yet.\n if (image.complete && image.naturalWidth !== 0) recordInlineImage();\n else image.addEventListener('load', recordInlineImage);\n }\n // media elements\n if (tagName === 'audio' || tagName === 'video') {\n const mediaAttributes = attributes as mediaAttributes;\n mediaAttributes.rr_mediaState = (n as HTMLMediaElement).paused\n ? 'paused'\n : 'played';\n mediaAttributes.rr_mediaCurrentTime = (n as HTMLMediaElement).currentTime;\n mediaAttributes.rr_mediaPlaybackRate = (n as HTMLMediaElement).playbackRate;\n mediaAttributes.rr_mediaMuted = (n as HTMLMediaElement).muted;\n mediaAttributes.rr_mediaLoop = (n as HTMLMediaElement).loop;\n mediaAttributes.rr_mediaVolume = (n as HTMLMediaElement).volume;\n }\n // Scroll\n if (!newlyAddedElement) {\n // `scrollTop` and `scrollLeft` are expensive calls because they trigger reflow.\n // Since `scrollTop` & `scrollLeft` are always 0 when an element is added to the DOM.\n // And scrolls also get picked up by rrweb's ScrollObserver\n // So we can safely skip the `scrollTop/Left` calls for newly added elements\n if (n.scrollLeft) {\n attributes.rr_scrollLeft = n.scrollLeft;\n }\n if (n.scrollTop) {\n attributes.rr_scrollTop = n.scrollTop;\n }\n }\n // block element\n if (needBlock) {\n const { width, height } = n.getBoundingClientRect();\n attributes = {\n class: attributes.class,\n rr_width: `${width}px`,\n rr_height: `${height}px`,\n };\n }\n // iframe\n if (tagName === 'iframe' && !keepIframeSrcFn(attributes.src as string)) {\n if (!(n as HTMLIFrameElement).contentDocument) {\n // we can't record it directly as we can't see into it\n // preserve the src attribute so a decision can be taken at replay time\n attributes.rr_src = attributes.src;\n }\n delete attributes.src; // prevent auto loading\n }\n\n let isCustomElement: true | undefined;\n try {\n if (customElements.get(tagName)) isCustomElement = true;\n } catch (e) {\n // In case old browsers don't support customElements\n }\n\n return {\n type: NodeType.Element,\n tagName,\n attributes,\n childNodes: [],\n isSVG: isSVGElement(n as Element) || undefined,\n needBlock,\n rootId,\n isCustom: isCustomElement,\n };\n}\n\nfunction lowerIfExists(\n maybeAttr: string | number | boolean | undefined | null,\n): string {\n if (maybeAttr === undefined || maybeAttr === null) {\n return '';\n } else {\n return (maybeAttr as string).toLowerCase();\n }\n}\n\nfunction slimDOMExcluded(\n sn: serializedNode,\n slimDOMOptions: SlimDOMOptions,\n): boolean {\n if (slimDOMOptions.comment && sn.type === NodeType.Comment) {\n // TODO: convert IE conditional comments to real nodes\n return true;\n } else if (sn.type === NodeType.Element) {\n if (\n slimDOMOptions.script &&\n // script tag\n (sn.tagName === 'script' ||\n // (module)preload link\n (sn.tagName === 'link' &&\n (sn.attributes.rel === 'preload' ||\n sn.attributes.rel === 'modulepreload') &&\n sn.attributes.as === 'script') ||\n // prefetch link\n (sn.tagName === 'link' &&\n sn.attributes.rel === 'prefetch' &&\n typeof sn.attributes.href === 'string' &&\n extractFileExtension(sn.attributes.href) === 'js'))\n ) {\n return true;\n } else if (\n slimDOMOptions.headFavicon &&\n ((sn.tagName === 'link' && sn.attributes.rel === 'shortcut icon') ||\n (sn.tagName === 'meta' &&\n (lowerIfExists(sn.attributes.name).match(\n /^msapplication-tile(image|color)$/,\n ) ||\n lowerIfExists(sn.attributes.name) === 'application-name' ||\n lowerIfExists(sn.attributes.rel) === 'icon' ||\n lowerIfExists(sn.attributes.rel) === 'apple-touch-icon' ||\n lowerIfExists(sn.attributes.rel) === 'shortcut icon')))\n ) {\n return true;\n } else if (sn.tagName === 'meta') {\n if (\n slimDOMOptions.headMetaDescKeywords &&\n lowerIfExists(sn.attributes.name).match(/^description|keywords$/)\n ) {\n return true;\n } else if (\n slimDOMOptions.headMetaSocial &&\n (lowerIfExists(sn.attributes.property).match(/^(og|twitter|fb):/) || // og = opengraph (facebook)\n lowerIfExists(sn.attributes.name).match(/^(og|twitter):/) ||\n lowerIfExists(sn.attributes.name) === 'pinterest')\n ) {\n return true;\n } else if (\n slimDOMOptions.headMetaRobots &&\n (lowerIfExists(sn.attributes.name) === 'robots' ||\n lowerIfExists(sn.attributes.name) === 'googlebot' ||\n lowerIfExists(sn.attributes.name) === 'bingbot')\n ) {\n return true;\n } else if (\n slimDOMOptions.headMetaHttpEquiv &&\n sn.attributes['http-equiv'] !== undefined\n ) {\n // e.g. X-UA-Compatible, Content-Type, Content-Language,\n // cache-control, X-Translated-By\n return true;\n } else if (\n slimDOMOptions.headMetaAuthorship &&\n (lowerIfExists(sn.attributes.name) === 'author' ||\n lowerIfExists(sn.attributes.name) === 'generator' ||\n lowerIfExists(sn.attributes.name) === 'framework' ||\n lowerIfExists(sn.attributes.name) === 'publisher' ||\n lowerIfExists(sn.attributes.name) === 'progid' ||\n lowerIfExists(sn.attributes.property).match(/^article:/) ||\n lowerIfExists(sn.attributes.property).match(/^product:/))\n ) {\n return true;\n } else if (\n slimDOMOptions.headMetaVerification &&\n (lowerIfExists(sn.attributes.name) === 'google-site-verification' ||\n lowerIfExists(sn.attributes.name) === 'yandex-verification' ||\n lowerIfExists(sn.attributes.name) === 'csrf-token' ||\n lowerIfExists(sn.attributes.name) === 'p:domain_verify' ||\n lowerIfExists(sn.attributes.name) === 'verify-v1' ||\n lowerIfExists(sn.attributes.name) === 'verification' ||\n lowerIfExists(sn.attributes.name) === 'shopify-checkout-api-token')\n ) {\n return true;\n }\n }\n }\n return false;\n}\n\nexport function serializeNodeWithId(\n n: Node,\n options: {\n doc: Document;\n mirror: Mirror;\n blockClass: string | RegExp;\n blockSelector: string | null;\n maskTextClass: string | RegExp;\n maskTextSelector: string | null;\n skipChild: boolean;\n inlineStylesheet: boolean;\n newlyAddedElement?: boolean;\n maskInputOptions?: MaskInputOptions;\n needsMask?: boolean;\n maskTextFn: MaskTextFn | undefined;\n maskInputFn: MaskInputFn | undefined;\n slimDOMOptions: SlimDOMOptions;\n dataURLOptions?: DataURLOptions;\n keepIframeSrcFn?: KeepIframeSrcFn;\n inlineImages?: boolean;\n recordCanvas?: boolean;\n preserveWhiteSpace?: boolean;\n onSerialize?: (n: Node) => unknown;\n onIframeLoad?: (\n iframeNode: HTMLIFrameElement,\n node: serializedElementNodeWithId,\n ) => unknown;\n iframeLoadTimeout?: number;\n onStylesheetLoad?: (\n linkNode: HTMLLinkElement,\n node: serializedElementNodeWithId,\n ) => unknown;\n stylesheetLoadTimeout?: number;\n cssCaptured?: boolean;\n },\n): serializedNodeWithId | null {\n const {\n doc,\n mirror,\n blockClass,\n blockSelector,\n maskTextClass,\n maskTextSelector,\n skipChild = false,\n inlineStylesheet = true,\n maskInputOptions = {},\n maskTextFn,\n maskInputFn,\n slimDOMOptions,\n dataURLOptions = {},\n inlineImages = false,\n recordCanvas = false,\n onSerialize,\n onIframeLoad,\n iframeLoadTimeout = 5000,\n onStylesheetLoad,\n stylesheetLoadTimeout = 5000,\n keepIframeSrcFn = () => false,\n newlyAddedElement = false,\n cssCaptured = false,\n } = options;\n let { needsMask } = options;\n let { preserveWhiteSpace = true } = options;\n\n if (!needsMask) {\n // perf: if needsMask = true, children won't also need to check\n const checkAncestors = needsMask === undefined; // if false, we've already checked ancestors\n needsMask = needMaskingText(\n n as Element,\n maskTextClass,\n maskTextSelector,\n checkAncestors,\n );\n }\n\n const _serializedNode = serializeNode(n, {\n doc,\n mirror,\n blockClass,\n blockSelector,\n needsMask,\n inlineStylesheet,\n maskInputOptions,\n maskTextFn,\n maskInputFn,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n keepIframeSrcFn,\n newlyAddedElement,\n cssCaptured,\n });\n if (!_serializedNode) {\n // TODO: dev only\n console.warn(n, 'not serialized');\n return null;\n }\n\n let id: number | undefined;\n if (mirror.hasNode(n)) {\n // Reuse the previous id\n id = mirror.getId(n);\n } else if (\n slimDOMExcluded(_serializedNode, slimDOMOptions) ||\n (!preserveWhiteSpace &&\n _serializedNode.type === NodeType.Text &&\n !_serializedNode.textContent.replace(/^\\s+|\\s+$/gm, '').length)\n ) {\n id = IGNORED_NODE;\n } else {\n id = genId();\n }\n\n const serializedNode = Object.assign(_serializedNode, { id });\n // add IGNORED_NODE to mirror to track nextSiblings\n mirror.add(n, serializedNode);\n\n if (id === IGNORED_NODE) {\n return null; // slimDOM\n }\n\n if (onSerialize) {\n onSerialize(n);\n }\n let recordChild = !skipChild;\n if (serializedNode.type === NodeType.Element) {\n recordChild = recordChild && !serializedNode.needBlock;\n // this property was not needed in replay side\n delete serializedNode.needBlock;\n const shadowRootEl = dom.shadowRoot(n);\n if (shadowRootEl && isNativeShadowDom(shadowRootEl))\n serializedNode.isShadowHost = true;\n }\n if (\n (serializedNode.type === NodeType.Document ||\n serializedNode.type === NodeType.Element) &&\n recordChild\n ) {\n if (\n slimDOMOptions.headWhitespace &&\n serializedNode.type === NodeType.Element &&\n serializedNode.tagName === 'head'\n // would impede performance: || getComputedStyle(n)['white-space'] === 'normal'\n ) {\n preserveWhiteSpace = false;\n }\n const bypassOptions = {\n doc,\n mirror,\n blockClass,\n blockSelector,\n needsMask,\n maskTextClass,\n maskTextSelector,\n skipChild,\n inlineStylesheet,\n maskInputOptions,\n maskTextFn,\n maskInputFn,\n slimDOMOptions,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n preserveWhiteSpace,\n onSerialize,\n onIframeLoad,\n iframeLoadTimeout,\n onStylesheetLoad,\n stylesheetLoadTimeout,\n keepIframeSrcFn,\n cssCaptured: false,\n };\n\n if (\n serializedNode.type === NodeType.Element &&\n serializedNode.tagName === 'textarea' &&\n (serializedNode as elementNode).attributes.value !== undefined\n ) {\n // value parameter in DOM reflects the correct value, so ignore childNode\n } else {\n if (\n serializedNode.type === NodeType.Element &&\n (serializedNode as elementNode).attributes._cssText !== undefined &&\n typeof serializedNode.attributes._cssText === 'string'\n ) {\n bypassOptions.cssCaptured = true;\n }\n for (const childN of Array.from(dom.childNodes(n))) {\n const serializedChildNode = serializeNodeWithId(childN, bypassOptions);\n if (serializedChildNode) {\n serializedNode.childNodes.push(serializedChildNode);\n }\n }\n }\n\n let shadowRootEl: ShadowRoot | null = null;\n if (isElement(n) && (shadowRootEl = dom.shadowRoot(n))) {\n for (const childN of Array.from(dom.childNodes(shadowRootEl))) {\n const serializedChildNode = serializeNodeWithId(childN, bypassOptions);\n if (serializedChildNode) {\n isNativeShadowDom(shadowRootEl) &&\n (serializedChildNode.isShadow = true);\n serializedNode.childNodes.push(serializedChildNode);\n }\n }\n }\n }\n\n const parent = dom.parentNode(n);\n if (parent && isShadowRoot(parent) && isNativeShadowDom(parent)) {\n serializedNode.isShadow = true;\n }\n\n if (\n serializedNode.type === NodeType.Element &&\n serializedNode.tagName === 'iframe'\n ) {\n onceIframeLoaded(\n n as HTMLIFrameElement,\n () => {\n const iframeDoc = (n as HTMLIFrameElement).contentDocument;\n if (iframeDoc && onIframeLoad) {\n const serializedIframeNode = serializeNodeWithId(iframeDoc, {\n doc: iframeDoc,\n mirror,\n blockClass,\n blockSelector,\n needsMask,\n maskTextClass,\n maskTextSelector,\n skipChild: false,\n inlineStylesheet,\n maskInputOptions,\n maskTextFn,\n maskInputFn,\n slimDOMOptions,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n preserveWhiteSpace,\n onSerialize,\n onIframeLoad,\n iframeLoadTimeout,\n onStylesheetLoad,\n stylesheetLoadTimeout,\n keepIframeSrcFn,\n });\n\n if (serializedIframeNode) {\n onIframeLoad(\n n as HTMLIFrameElement,\n serializedIframeNode as serializedElementNodeWithId,\n );\n }\n }\n },\n iframeLoadTimeout,\n );\n }\n\n // <link rel=stylesheet href=...>\n if (\n serializedNode.type === NodeType.Element &&\n serializedNode.tagName === 'link' &&\n typeof serializedNode.attributes.rel === 'string' &&\n (serializedNode.attributes.rel === 'stylesheet' ||\n (serializedNode.attributes.rel === 'preload' &&\n typeof serializedNode.attributes.href === 'string' &&\n extractFileExtension(serializedNode.attributes.href) === 'css'))\n ) {\n onceStylesheetLoaded(\n n as HTMLLinkElement,\n () => {\n if (onStylesheetLoad) {\n const serializedLinkNode = serializeNodeWithId(n, {\n doc,\n mirror,\n blockClass,\n blockSelector,\n needsMask,\n maskTextClass,\n maskTextSelector,\n skipChild: false,\n inlineStylesheet,\n maskInputOptions,\n maskTextFn,\n maskInputFn,\n slimDOMOptions,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n preserveWhiteSpace,\n onSerialize,\n onIframeLoad,\n iframeLoadTimeout,\n onStylesheetLoad,\n stylesheetLoadTimeout,\n keepIframeSrcFn,\n });\n\n if (serializedLinkNode) {\n onStylesheetLoad(\n n as HTMLLinkElement,\n serializedLinkNode as serializedElementNodeWithId,\n );\n }\n }\n },\n stylesheetLoadTimeout,\n );\n }\n\n return serializedNode;\n}\n\nfunction snapshot(\n n: Document,\n options?: {\n mirror?: Mirror;\n blockClass?: string | RegExp;\n blockSelector?: string | null;\n maskTextClass?: string | RegExp;\n maskTextSelector?: string | null;\n inlineStylesheet?: boolean;\n maskAllInputs?: boolean | MaskInputOptions;\n maskTextFn?: MaskTextFn;\n maskInputFn?: MaskInputFn;\n slimDOM?: 'all' | boolean | SlimDOMOptions;\n dataURLOptions?: DataURLOptions;\n inlineImages?: boolean;\n recordCanvas?: boolean;\n preserveWhiteSpace?: boolean;\n onSerialize?: (n: Node) => unknown;\n onIframeLoad?: (\n iframeNode: HTMLIFrameElement,\n node: serializedElementNodeWithId,\n ) => unknown;\n iframeLoadTimeout?: number;\n onStylesheetLoad?: (\n linkNode: HTMLLinkElement,\n node: serializedElementNodeWithId,\n ) => unknown;\n stylesheetLoadTimeout?: number;\n keepIframeSrcFn?: KeepIframeSrcFn;\n },\n): serializedNodeWithId | null {\n const {\n mirror = new Mirror(),\n blockClass = 'rr-block',\n blockSelector = null,\n maskTextClass = 'rr-mask',\n maskTextSelector = null,\n inlineStylesheet = true,\n inlineImages = false,\n recordCanvas = false,\n maskAllInputs = false,\n maskTextFn,\n maskInputFn,\n slimDOM = false,\n dataURLOptions,\n preserveWhiteSpace,\n onSerialize,\n onIframeLoad,\n iframeLoadTimeout,\n onStylesheetLoad,\n stylesheetLoadTimeout,\n keepIframeSrcFn = () => false,\n } = options || {};\n const maskInputOptions: MaskInputOptions =\n maskAllInputs === true\n ? {\n color: true,\n date: true,\n 'datetime-local': true,\n email: true,\n month: true,\n number: true,\n range: true,\n search: true,\n tel: true,\n text: true,\n time: true,\n url: true,\n week: true,\n textarea: true,\n select: true,\n password: true,\n }\n : maskAllInputs === false\n ? {\n password: true,\n }\n : maskAllInputs;\n const slimDOMOptions: SlimDOMOptions =\n slimDOM === true || slimDOM === 'all'\n ? // if true: set of sensible options that should not throw away any information\n {\n script: true,\n comment: true,\n headFavicon: true,\n headWhitespace: true,\n headMetaDescKeywords: slimDOM === 'all', // destructive\n headMetaSocial: true,\n headMetaRobots: true,\n headMetaHttpEquiv: true,\n headMetaAuthorship: true,\n headMetaVerification: true,\n }\n : slimDOM === false\n ? {}\n : slimDOM;\n return serializeNodeWithId(n, {\n doc: n,\n mirror,\n blockClass,\n blockSelector,\n maskTextClass,\n maskTextSelector,\n skipChild: false,\n inlineStylesheet,\n maskInputOptions,\n maskTextFn,\n maskInputFn,\n slimDOMOptions,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n preserveWhiteSpace,\n onSerialize,\n onIframeLoad,\n iframeLoadTimeout,\n onStylesheetLoad,\n stylesheetLoadTimeout,\n keepIframeSrcFn,\n newlyAddedElement: false,\n });\n}\n\nexport function visitSnapshot(\n node: serializedNodeWithId,\n onVisit: (node: serializedNodeWithId) => unknown,\n) {\n function walk(current: serializedNodeWithId) {\n onVisit(current);\n if (\n current.type === NodeType.Document ||\n current.type === NodeType.Element\n ) {\n current.childNodes.forEach(walk);\n }\n }\n\n walk(node);\n}\n\nexport function cleanupSnapshot() {\n // allow a new recording to start numbering nodes from scratch\n _id = 1;\n}\n\nexport default snapshot;\n", "import type { AcceptedPlugin, Rule } from 'postcss';\n\nconst MEDIA_SELECTOR = /(max|min)-device-(width|height)/;\nconst MEDIA_SELECTOR_GLOBAL = new RegExp(MEDIA_SELECTOR.source, 'g');\n\nconst mediaSelectorPlugin: AcceptedPlugin = {\n postcssPlugin: 'postcss-custom-selectors',\n prepare() {\n return {\n postcssPlugin: 'postcss-custom-selectors',\n AtRule: function (atrule) {\n if (atrule.params.match(MEDIA_SELECTOR_GLOBAL)) {\n atrule.params = atrule.params.replace(MEDIA_SELECTOR_GLOBAL, '$1-$2');\n }\n },\n };\n },\n};\n\n// Simplified from https://github.com/giuseppeg/postcss-pseudo-classes/blob/master/index.js\nconst pseudoClassPlugin: AcceptedPlugin = {\n postcssPlugin: 'postcss-hover-classes',\n prepare: function () {\n const fixed: Rule[] = [];\n return {\n Rule: function (rule) {\n if (fixed.indexOf(rule) !== -1) {\n return;\n }\n fixed.push(rule);\n rule.selectors.forEach(function (selector) {\n if (selector.includes(':hover')) {\n rule.selector += ',\\n' + selector.replace(/:hover/g, '.\\\\:hover');\n }\n });\n },\n };\n },\n};\n\nexport { mediaSelectorPlugin, pseudoClassPlugin };\n", "var x=String;\nvar create=function() {return {isColorSupported:false,reset:x,bold:x,dim:x,italic:x,underline:x,inverse:x,hidden:x,strikethrough:x,black:x,red:x,green:x,yellow:x,blue:x,magenta:x,cyan:x,white:x,gray:x,bgBlack:x,bgRed:x,bgGreen:x,bgYellow:x,bgBlue:x,bgMagenta:x,bgCyan:x,bgWhite:x}};\nmodule.exports=create();\nmodule.exports.createColors = create;\n", "export default {}", "'use strict'\n\nlet pico = require('picocolors')\n\nlet terminalHighlight = require('./terminal-highlight')\n\nclass CssSyntaxError extends Error {\n constructor(message, line, column, source, file, plugin) {\n super(message)\n this.name = 'CssSyntaxError'\n this.reason = message\n\n if (file) {\n this.file = file\n }\n if (source) {\n this.source = source\n }\n if (plugin) {\n this.plugin = plugin\n }\n if (typeof line !== 'undefined' && typeof column !== 'undefined') {\n if (typeof line === 'number') {\n this.line = line\n this.column = column\n } else {\n this.line = line.line\n this.column = line.column\n this.endLine = column.line\n this.endColumn = column.column\n }\n }\n\n this.setMessage()\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, CssSyntaxError)\n }\n }\n\n setMessage() {\n this.message = this.plugin ? this.plugin + ': ' : ''\n this.message += this.file ? this.file : '<css input>'\n if (typeof this.line !== 'undefined') {\n this.message += ':' + this.line + ':' + this.column\n }\n this.message += ': ' + this.reason\n }\n\n showSourceCode(color) {\n if (!this.source) return ''\n\n let css = this.source\n if (color == null) color = pico.isColorSupported\n if (terminalHighlight) {\n if (color) css = terminalHighlight(css)\n }\n\n let lines = css.split(/\\r?\\n/)\n let start = Math.max(this.line - 3, 0)\n let end = Math.min(this.line + 2, lines.length)\n\n let maxWidth = String(end).length\n\n let mark, aside\n if (color) {\n let { bold, gray, red } = pico.createColors(true)\n mark = text => bold(red(text))\n aside = text => gray(text)\n } else {\n mark = aside = str => str\n }\n\n return lines\n .slice(start, end)\n .map((line, index) => {\n let number = start + 1 + index\n let gutter = ' ' + (' ' + number).slice(-maxWidth) + ' | '\n if (number === this.line) {\n let spacing =\n aside(gutter.replace(/\\d/g, ' ')) +\n line.slice(0, this.column - 1).replace(/[^\\t]/g, ' ')\n return mark('>') + aside(gutter) + line + '\\n ' + spacing + mark('^')\n }\n return ' ' + aside(gutter) + line\n })\n .join('\\n')\n }\n\n toString() {\n let code = this.showSourceCode()\n if (code) {\n code = '\\n\\n' + code + '\\n'\n }\n return this.name + ': ' + this.message + code\n }\n}\n\nmodule.exports = CssSyntaxError\nCssSyntaxError.default = CssSyntaxError\n", "'use strict'\n\nmodule.exports.isClean = Symbol('isClean')\n\nmodule.exports.my = Symbol('my')\n", "'use strict'\n\nconst DEFAULT_RAW = {\n after: '\\n',\n beforeClose: '\\n',\n beforeComment: '\\n',\n beforeDecl: '\\n',\n beforeOpen: ' ',\n beforeRule: '\\n',\n colon: ': ',\n commentLeft: ' ',\n commentRight: ' ',\n emptyBody: '',\n indent: ' ',\n semicolon: false\n}\n\nfunction capitalize(str) {\n return str[0].toUpperCase() + str.slice(1)\n}\n\nclass Stringifier {\n constructor(builder) {\n this.builder = builder\n }\n\n atrule(node, semicolon) {\n let name = '@' + node.name\n let params = node.params ? this.rawValue(node, 'params') : ''\n\n if (typeof node.raws.afterName !== 'undefined') {\n name += node.raws.afterName\n } else if (params) {\n name += ' '\n }\n\n if (node.nodes) {\n this.block(node, name + params)\n } else {\n let end = (node.raws.between || '') + (semicolon ? ';' : '')\n this.builder(name + params + end, node)\n }\n }\n\n beforeAfter(node, detect) {\n let value\n if (node.type === 'decl') {\n value = this.raw(node, null, 'beforeDecl')\n } else if (node.type === 'comment') {\n value = this.raw(node, null, 'beforeComment')\n } else if (detect === 'before') {\n value = this.raw(node, null, 'beforeRule')\n } else {\n value = this.raw(node, null, 'beforeClose')\n }\n\n let buf = node.parent\n let depth = 0\n while (buf && buf.type !== 'root') {\n depth += 1\n buf = buf.parent\n }\n\n if (value.includes('\\n')) {\n let indent = this.raw(node, null, 'indent')\n if (indent.length) {\n for (let step = 0; step < depth; step++) value += indent\n }\n }\n\n return value\n }\n\n block(node, start) {\n let between = this.raw(node, 'between', 'beforeOpen')\n this.builder(start + between + '{', node, 'start')\n\n let after\n if (node.nodes && node.nodes.length) {\n this.body(node)\n after = this.raw(node, 'after')\n } else {\n after = this.raw(node, 'after', 'emptyBody')\n }\n\n if (after) this.builder(after)\n this.builder('}', node, 'end')\n }\n\n body(node) {\n let last = node.nodes.length - 1\n while (last > 0) {\n if (node.nodes[last].type !== 'comment') break\n last -= 1\n }\n\n let semicolon = this.raw(node, 'semicolon')\n for (let i = 0; i < node.nodes.length; i++) {\n let child = node.nodes[i]\n let before = this.raw(child, 'before')\n if (before) this.builder(before)\n this.stringify(child, last !== i || semicolon)\n }\n }\n\n comment(node) {\n let left = this.raw(node, 'left', 'commentLeft')\n let right = this.raw(node, 'right', 'commentRight')\n this.builder('/*' + left + node.text + right + '*/', node)\n }\n\n decl(node, semicolon) {\n let between = this.raw(node, 'between', 'colon')\n let string = node.prop + between + this.rawValue(node, 'value')\n\n if (node.important) {\n string += node.raws.important || ' !important'\n }\n\n if (semicolon) string += ';'\n this.builder(string, node)\n }\n\n document(node) {\n this.body(node)\n }\n\n raw(node, own, detect) {\n let value\n if (!detect) detect = own\n\n // Already had\n if (own) {\n value = node.raws[own]\n if (typeof value !== 'undefined') return value\n }\n\n let parent = node.parent\n\n if (detect === 'before') {\n // Hack for first rule in CSS\n if (!parent || (parent.type === 'root' && parent.first === node)) {\n return ''\n }\n\n // `root` nodes in `document` should use only their own raws\n if (parent && parent.type === 'document') {\n return ''\n }\n }\n\n // Floating child without parent\n if (!parent) return DEFAULT_RAW[detect]\n\n // Detect style by other nodes\n let root = node.root()\n if (!root.rawCache) root.rawCache = {}\n if (typeof root.rawCache[detect] !== 'undefined') {\n return root.rawCache[detect]\n }\n\n if (detect === 'before' || detect === 'after') {\n return this.beforeAfter(node, detect)\n } else {\n let method = 'raw' + capitalize(detect)\n if (this[method]) {\n value = this[method](root, node)\n } else {\n root.walk(i => {\n value = i.raws[own]\n if (typeof value !== 'undefined') return false\n })\n }\n }\n\n if (typeof value === 'undefined') value = DEFAULT_RAW[detect]\n\n root.rawCache[detect] = value\n return value\n }\n\n rawBeforeClose(root) {\n let value\n root.walk(i => {\n if (i.nodes && i.nodes.length > 0) {\n if (typeof i.raws.after !== 'undefined') {\n value = i.raws.after\n if (value.includes('\\n')) {\n value = value.replace(/[^\\n]+$/, '')\n }\n return false\n }\n }\n })\n if (value) value = value.replace(/\\S/g, '')\n return value\n }\n\n rawBeforeComment(root, node) {\n let value\n root.walkComments(i => {\n if (typeof i.raws.before !== 'undefined') {\n value = i.raws.before\n if (value.includes('\\n')) {\n value = value.replace(/[^\\n]+$/, '')\n }\n return false\n }\n })\n if (typeof value === 'undefined') {\n value = this.raw(node, null, 'beforeDecl')\n } else if (value) {\n value = value.replace(/\\S/g, '')\n }\n return value\n }\n\n rawBeforeDecl(root, node) {\n let value\n root.walkDecls(i => {\n if (typeof i.raws.before !== 'undefined') {\n value = i.raws.before\n if (value.includes('\\n')) {\n value = value.replace(/[^\\n]+$/, '')\n }\n return false\n }\n })\n if (typeof value === 'undefined') {\n value = this.raw(node, null, 'beforeRule')\n } else if (value) {\n value = value.replace(/\\S/g, '')\n }\n return value\n }\n\n rawBeforeOpen(root) {\n let value\n root.walk(i => {\n if (i.type !== 'decl') {\n value = i.raws.between\n if (typeof value !== 'undefined') return false\n }\n })\n return value\n }\n\n rawBeforeRule(root) {\n let value\n root.walk(i => {\n if (i.nodes && (i.parent !== root || root.first !== i)) {\n if (typeof i.raws.before !== 'undefined') {\n value = i.raws.before\n if (value.includes('\\n')) {\n value = value.replace(/[^\\n]+$/, '')\n }\n return false\n }\n }\n })\n if (value) value = value.replace(/\\S/g, '')\n return value\n }\n\n rawColon(root) {\n let value\n root.walkDecls(i => {\n if (typeof i.raws.between !== 'undefined') {\n value = i.raws.between.replace(/[^\\s:]/g, '')\n return false\n }\n })\n return value\n }\n\n rawEmptyBody(root) {\n let value\n root.walk(i => {\n if (i.nodes && i.nodes.length === 0) {\n value = i.raws.after\n if (typeof value !== 'undefined') return false\n }\n })\n return value\n }\n\n rawIndent(root) {\n if (root.raws.indent) return root.raws.indent\n let value\n root.walk(i => {\n let p = i.parent\n if (p && p !== root && p.parent && p.parent === root) {\n if (typeof i.raws.before !== 'undefined') {\n let parts = i.raws.before.split('\\n')\n value = parts[parts.length - 1]\n value = value.replace(/\\S/g, '')\n return false\n }\n }\n })\n return value\n }\n\n rawSemicolon(root) {\n let value\n root.walk(i => {\n if (i.nodes && i.nodes.length && i.last.type === 'decl') {\n value = i.raws.semicolon\n if (typeof value !== 'undefined') return false\n }\n })\n return value\n }\n\n rawValue(node, prop) {\n let value = node[prop]\n let raw = node.raws[prop]\n if (raw && raw.value === value) {\n return raw.raw\n }\n\n return value\n }\n\n root(node) {\n this.body(node)\n if (node.raws.after) this.builder(node.raws.after)\n }\n\n rule(node) {\n this.block(node, this.rawValue(node, 'selector'))\n if (node.raws.ownSemicolon) {\n this.builder(node.raws.ownSemicolon, node, 'end')\n }\n }\n\n stringify(node, semicolon) {\n /* c8 ignore start */\n if (!this[node.type]) {\n throw new Error(\n 'Unknown AST node type ' +\n node.type +\n '. ' +\n 'Maybe you need to change PostCSS stringifier.'\n )\n }\n /* c8 ignore stop */\n this[node.type](node, semicolon)\n }\n}\n\nmodule.exports = Stringifier\nStringifier.default = Stringifier\n", "'use strict'\n\nlet Stringifier = require('./stringifier')\n\nfunction stringify(node, builder) {\n let str = new Stringifier(builder)\n str.stringify(node)\n}\n\nmodule.exports = stringify\nstringify.default = stringify\n", "'use strict'\n\nlet { isClean, my } = require('./symbols')\nlet CssSyntaxError = require('./css-syntax-error')\nlet Stringifier = require('./stringifier')\nlet stringify = require('./stringify')\n\nfunction cloneNode(obj, parent) {\n let cloned = new obj.constructor()\n\n for (let i in obj) {\n if (!Object.prototype.hasOwnProperty.call(obj, i)) {\n /* c8 ignore next 2 */\n continue\n }\n if (i === 'proxyCache') continue\n let value = obj[i]\n let type = typeof value\n\n if (i === 'parent' && type === 'object') {\n if (parent) cloned[i] = parent\n } else if (i === 'source') {\n cloned[i] = value\n } else if (Array.isArray(value)) {\n cloned[i] = value.map(j => cloneNode(j, cloned))\n } else {\n if (type === 'object' && value !== null) value = cloneNode(value)\n cloned[i] = value\n }\n }\n\n return cloned\n}\n\nclass Node {\n constructor(defaults = {}) {\n this.raws = {}\n this[isClean] = false\n this[my] = true\n\n for (let name in defaults) {\n if (name === 'nodes') {\n this.nodes = []\n for (let node of defaults[name]) {\n if (typeof node.clone === 'function') {\n this.append(node.clone())\n } else {\n this.append(node)\n }\n }\n } else {\n this[name] = defaults[name]\n }\n }\n }\n\n addToError(error) {\n error.postcssNode = this\n if (error.stack && this.source && /\\n\\s{4}at /.test(error.stack)) {\n let s = this.source\n error.stack = error.stack.replace(\n /\\n\\s{4}at /,\n `$&${s.input.from}:${s.start.line}:${s.start.column}$&`\n )\n }\n return error\n }\n\n after(add) {\n this.parent.insertAfter(this, add)\n return this\n }\n\n assign(overrides = {}) {\n for (let name in overrides) {\n this[name] = overrides[name]\n }\n return this\n }\n\n before(add) {\n this.parent.insertBefore(this, add)\n return this\n }\n\n cleanRaws(keepBetween) {\n delete this.raws.before\n delete this.raws.after\n if (!keepBetween) delete this.raws.between\n }\n\n clone(overrides = {}) {\n let cloned = cloneNode(this)\n for (let name in overrides) {\n cloned[name] = overrides[name]\n }\n return cloned\n }\n\n cloneAfter(overrides = {}) {\n let cloned = this.clone(overrides)\n this.parent.insertAfter(this, cloned)\n return cloned\n }\n\n cloneBefore(overrides = {}) {\n let cloned = this.clone(overrides)\n this.parent.insertBefore(this, cloned)\n return cloned\n }\n\n error(message, opts = {}) {\n if (this.source) {\n let { end, start } = this.rangeBy(opts)\n return this.source.input.error(\n message,\n { column: start.column, line: start.line },\n { column: end.column, line: end.line },\n opts\n )\n }\n return new CssSyntaxError(message)\n }\n\n getProxyProcessor() {\n return {\n get(node, prop) {\n if (prop === 'proxyOf') {\n return node\n } else if (prop === 'root') {\n return () => node.root().toProxy()\n } else {\n return node[prop]\n }\n },\n\n set(node, prop, value) {\n if (node[prop] === value) return true\n node[prop] = value\n if (\n prop === 'prop' ||\n prop === 'value' ||\n prop === 'name' ||\n prop === 'params' ||\n prop === 'important' ||\n /* c8 ignore next */\n prop === 'text'\n ) {\n node.markDirty()\n }\n return true\n }\n }\n }\n\n markDirty() {\n if (this[isClean]) {\n this[isClean] = false\n let next = this\n while ((next = next.parent)) {\n next[isClean] = false\n }\n }\n }\n\n next() {\n if (!this.parent) return undefined\n let index = this.parent.index(this)\n return this.parent.nodes[index + 1]\n }\n\n positionBy(opts, stringRepresentation) {\n let pos = this.source.start\n if (opts.index) {\n pos = this.positionInside(opts.index, stringRepresentation)\n } else if (opts.word) {\n stringRepresentation = this.toString()\n let index = stringRepresentation.indexOf(opts.word)\n if (index !== -1) pos = this.positionInside(index, stringRepresentation)\n }\n return pos\n }\n\n positionInside(index, stringRepresentation) {\n let string = stringRepresentation || this.toString()\n let column = this.source.start.column\n let line = this.source.start.line\n\n for (let i = 0; i < index; i++) {\n if (string[i] === '\\n') {\n column = 1\n line += 1\n } else {\n column += 1\n }\n }\n\n return { column, line }\n }\n\n prev() {\n if (!this.parent) return undefined\n let index = this.parent.index(this)\n return this.parent.nodes[index - 1]\n }\n\n rangeBy(opts) {\n let start = {\n column: this.source.start.column,\n line: this.source.start.line\n }\n let end = this.source.end\n ? {\n column: this.source.end.column + 1,\n line: this.source.end.line\n }\n : {\n column: start.column + 1,\n line: start.line\n }\n\n if (opts.word) {\n let stringRepresentation = this.toString()\n let index = stringRepresentation.indexOf(opts.word)\n if (index !== -1) {\n start = this.positionInside(index, stringRepresentation)\n end = this.positionInside(index + opts.word.length, stringRepresentation)\n }\n } else {\n if (opts.start) {\n start = {\n column: opts.start.column,\n line: opts.start.line\n }\n } else if (opts.index) {\n start = this.positionInside(opts.index)\n }\n\n if (opts.end) {\n end = {\n column: opts.end.column,\n line: opts.end.line\n }\n } else if (typeof opts.endIndex === 'number') {\n end = this.positionInside(opts.endIndex)\n } else if (opts.index) {\n end = this.positionInside(opts.index + 1)\n }\n }\n\n if (\n end.line < start.line ||\n (end.line === start.line && end.column <= start.column)\n ) {\n end = { column: start.column + 1, line: start.line }\n }\n\n return { end, start }\n }\n\n raw(prop, defaultType) {\n let str = new Stringifier()\n return str.raw(this, prop, defaultType)\n }\n\n remove() {\n if (this.parent) {\n this.parent.removeChild(this)\n }\n this.parent = undefined\n return this\n }\n\n replaceWith(...nodes) {\n if (this.parent) {\n let bookmark = this\n let foundSelf = false\n for (let node of nodes) {\n if (node === this) {\n foundSelf = true\n } else if (foundSelf) {\n this.parent.insertAfter(bookmark, node)\n bookmark = node\n } else {\n this.parent.insertBefore(bookmark, node)\n }\n }\n\n if (!foundSelf) {\n this.remove()\n }\n }\n\n return this\n }\n\n root() {\n let result = this\n while (result.parent && result.parent.type !== 'document') {\n result = result.parent\n }\n return result\n }\n\n toJSON(_, inputs) {\n let fixed = {}\n let emitInputs = inputs == null\n inputs = inputs || new Map()\n let inputsNextIndex = 0\n\n for (let name in this) {\n if (!Object.prototype.hasOwnProperty.call(this, name)) {\n /* c8 ignore next 2 */\n continue\n }\n if (name === 'parent' || name === 'proxyCache') continue\n let value = this[name]\n\n if (Array.isArray(value)) {\n fixed[name] = value.map(i => {\n if (typeof i === 'object' && i.toJSON) {\n return i.toJSON(null, inputs)\n } else {\n return i\n }\n })\n } else if (typeof value === 'object' && value.toJSON) {\n fixed[name] = value.toJSON(null, inputs)\n } else if (name === 'source') {\n let inputId = inputs.get(value.input)\n if (inputId == null) {\n inputId = inputsNextIndex\n inputs.set(value.input, inputsNextIndex)\n inputsNextIndex++\n }\n fixed[name] = {\n end: value.end,\n inputId,\n start: value.start\n }\n } else {\n fixed[name] = value\n }\n }\n\n if (emitInputs) {\n fixed.inputs = [...inputs.keys()].map(input => input.toJSON())\n }\n\n return fixed\n }\n\n toProxy() {\n if (!this.proxyCache) {\n this.proxyCache = new Proxy(this, this.getProxyProcessor())\n }\n return this.proxyCache\n }\n\n toString(stringifier = stringify) {\n if (stringifier.stringify) stringifier = stringifier.stringify\n let result = ''\n stringifier(this, i => {\n result += i\n })\n return result\n }\n\n warn(result, text, opts) {\n let data = { node: this }\n for (let i in opts) data[i] = opts[i]\n return result.warn(text, data)\n }\n\n get proxyOf() {\n return this\n }\n}\n\nmodule.exports = Node\nNode.default = Node\n", "'use strict'\n\nlet Node = require('./node')\n\nclass Declaration extends Node {\n constructor(defaults) {\n if (\n defaults &&\n typeof defaults.value !== 'undefined' &&\n typeof defaults.value !== 'string'\n ) {\n defaults = { ...defaults, value: String(defaults.value) }\n }\n super(defaults)\n this.type = 'decl'\n }\n\n get variable() {\n return this.prop.startsWith('--') || this.prop[0] === '$'\n }\n}\n\nmodule.exports = Declaration\nDeclaration.default = Declaration\n", "let urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\nlet customAlphabet = (alphabet, defaultSize = 21) => {\n return (size = defaultSize) => {\n let id = ''\n let i = size\n while (i--) {\n id += alphabet[(Math.random() * alphabet.length) | 0]\n }\n return id\n }\n}\nlet nanoid = (size = 21) => {\n let id = ''\n let i = size\n while (i--) {\n id += urlAlphabet[(Math.random() * 64) | 0]\n }\n return id\n}\nmodule.exports = { nanoid, customAlphabet }\n", "'use strict'\n\nlet { SourceMapConsumer, SourceMapGenerator } = require('source-map-js')\nlet { existsSync, readFileSync } = require('fs')\nlet { dirname, join } = require('path')\n\nfunction fromBase64(str) {\n if (Buffer) {\n return Buffer.from(str, 'base64').toString()\n } else {\n /* c8 ignore next 2 */\n return window.atob(str)\n }\n}\n\nclass PreviousMap {\n constructor(css, opts) {\n if (opts.map === false) return\n this.loadAnnotation(css)\n this.inline = this.startWith(this.annotation, 'data:')\n\n let prev = opts.map ? opts.map.prev : undefined\n let text = this.loadMap(opts.from, prev)\n if (!this.mapFile && opts.from) {\n this.mapFile = opts.from\n }\n if (this.mapFile) this.root = dirname(this.mapFile)\n if (text) this.text = text\n }\n\n consumer() {\n if (!this.consumerCache) {\n this.consumerCache = new SourceMapConsumer(this.text)\n }\n return this.consumerCache\n }\n\n decodeInline(text) {\n let baseCharsetUri = /^data:application\\/json;charset=utf-?8;base64,/\n let baseUri = /^data:application\\/json;base64,/\n let charsetUri = /^data:application\\/json;charset=utf-?8,/\n let uri = /^data:application\\/json,/\n\n if (charsetUri.test(text) || uri.test(text)) {\n return decodeURIComponent(text.substr(RegExp.lastMatch.length))\n }\n\n if (baseCharsetUri.test(text) || baseUri.test(text)) {\n return fromBase64(text.substr(RegExp.lastMatch.length))\n }\n\n let encoding = text.match(/data:application\\/json;([^,]+),/)[1]\n throw new Error('Unsupported source map encoding ' + encoding)\n }\n\n getAnnotationURL(sourceMapString) {\n return sourceMapString.replace(/^\\/\\*\\s*# sourceMappingURL=/, '').trim()\n }\n\n isMap(map) {\n if (typeof map !== 'object') return false\n return (\n typeof map.mappings === 'string' ||\n typeof map._mappings === 'string' ||\n Array.isArray(map.sections)\n )\n }\n\n loadAnnotation(css) {\n let comments = css.match(/\\/\\*\\s*# sourceMappingURL=/gm)\n if (!comments) return\n\n // sourceMappingURLs from comments, strings, etc.\n let start = css.lastIndexOf(comments.pop())\n let end = css.indexOf('*/', start)\n\n if (start > -1 && end > -1) {\n // Locate the last sourceMappingURL to avoid pickin\n this.annotation = this.getAnnotationURL(css.substring(start, end))\n }\n }\n\n loadFile(path) {\n this.root = dirname(path)\n if (existsSync(path)) {\n this.mapFile = path\n return readFileSync(path, 'utf-8').toString().trim()\n }\n }\n\n loadMap(file, prev) {\n if (prev === false) return false\n\n if (prev) {\n if (typeof prev === 'string') {\n return prev\n } else if (typeof prev === 'function') {\n let prevPath = prev(file)\n if (prevPath) {\n let map = this.loadFile(prevPath)\n if (!map) {\n throw new Error(\n 'Unable to load previous source map: ' + prevPath.toString()\n )\n }\n return map\n }\n } else if (prev instanceof SourceMapConsumer) {\n return SourceMapGenerator.fromSourceMap(prev).toString()\n } else if (prev instanceof SourceMapGenerator) {\n return prev.toString()\n } else if (this.isMap(prev)) {\n return JSON.stringify(prev)\n } else {\n throw new Error(\n 'Unsupported previous source map format: ' + prev.toString()\n )\n }\n } else if (this.inline) {\n return this.decodeInline(this.annotation)\n } else if (this.annotation) {\n let map = this.annotation\n if (file) map = join(dirname(file), map)\n return this.loadFile(map)\n }\n }\n\n startWith(string, start) {\n if (!string) return false\n return string.substr(0, start.length) === start\n }\n\n withContent() {\n return !!(\n this.consumer().sourcesContent &&\n this.consumer().sourcesContent.length > 0\n )\n }\n}\n\nmodule.exports = PreviousMap\nPreviousMap.default = PreviousMap\n", "'use strict'\n\nlet { SourceMapConsumer, SourceMapGenerator } = require('source-map-js')\nlet { fileURLToPath, pathToFileURL } = require('url')\nlet { isAbsolute, resolve } = require('path')\nlet { nanoid } = require('nanoid/non-secure')\n\nlet terminalHighlight = require('./terminal-highlight')\nlet CssSyntaxError = require('./css-syntax-error')\nlet PreviousMap = require('./previous-map')\n\nlet fromOffsetCache = Symbol('fromOffsetCache')\n\nlet sourceMapAvailable = Boolean(SourceMapConsumer && SourceMapGenerator)\nlet pathAvailable = Boolean(resolve && isAbsolute)\n\nclass Input {\n constructor(css, opts = {}) {\n if (\n css === null ||\n typeof css === 'undefined' ||\n (typeof css === 'object' && !css.toString)\n ) {\n throw new Error(`PostCSS received ${css} instead of CSS string`)\n }\n\n this.css = css.toString()\n\n if (this.css[0] === '\\uFEFF' || this.css[0] === '\\uFFFE') {\n this.hasBOM = true\n this.css = this.css.slice(1)\n } else {\n this.hasBOM = false\n }\n\n if (opts.from) {\n if (\n !pathAvailable ||\n /^\\w+:\\/\\//.test(opts.from) ||\n isAbsolute(opts.from)\n ) {\n this.file = opts.from\n } else {\n this.file = resolve(opts.from)\n }\n }\n\n if (pathAvailable && sourceMapAvailable) {\n let map = new PreviousMap(this.css, opts)\n if (map.text) {\n this.map = map\n let file = map.consumer().file\n if (!this.file && file) this.file = this.mapResolve(file)\n }\n }\n\n if (!this.file) {\n this.id = '<input css ' + nanoid(6) + '>'\n }\n if (this.map) this.map.file = this.from\n }\n\n error(message, line, column, opts = {}) {\n let result, endLine, endColumn\n\n if (line && typeof line === 'object') {\n let start = line\n let end = column\n if (typeof start.offset === 'number') {\n let pos = this.fromOffset(start.offset)\n line = pos.line\n column = pos.col\n } else {\n line = start.line\n column = start.column\n }\n if (typeof end.offset === 'number') {\n let pos = this.fromOffset(end.offset)\n endLine = pos.line\n endColumn = pos.col\n } else {\n endLine = end.line\n endColumn = end.column\n }\n } else if (!column) {\n let pos = this.fromOffset(line)\n line = pos.line\n column = pos.col\n }\n\n let origin = this.origin(line, column, endLine, endColumn)\n if (origin) {\n result = new CssSyntaxError(\n message,\n origin.endLine === undefined\n ? origin.line\n : { column: origin.column, line: origin.line },\n origin.endLine === undefined\n ? origin.column\n : { column: origin.endColumn, line: origin.endLine },\n origin.source,\n origin.file,\n opts.plugin\n )\n } else {\n result = new CssSyntaxError(\n message,\n endLine === undefined ? line : { column, line },\n endLine === undefined ? column : { column: endColumn, line: endLine },\n this.css,\n this.file,\n opts.plugin\n )\n }\n\n result.input = { column, endColumn, endLine, line, source: this.css }\n if (this.file) {\n if (pathToFileURL) {\n result.input.url = pathToFileURL(this.file).toString()\n }\n result.input.file = this.file\n }\n\n return result\n }\n\n fromOffset(offset) {\n let lastLine, lineToIndex\n if (!this[fromOffsetCache]) {\n let lines = this.css.split('\\n')\n lineToIndex = new Array(lines.length)\n let prevIndex = 0\n\n for (let i = 0, l = lines.length; i < l; i++) {\n lineToIndex[i] = prevIndex\n prevIndex += lines[i].length + 1\n }\n\n this[fromOffsetCache] = lineToIndex\n } else {\n lineToIndex = this[fromOffsetCache]\n }\n lastLine = lineToIndex[lineToIndex.length - 1]\n\n let min = 0\n if (offset >= lastLine) {\n min = lineToIndex.length - 1\n } else {\n let max = lineToIndex.length - 2\n let mid\n while (min < max) {\n mid = min + ((max - min) >> 1)\n if (offset < lineToIndex[mid]) {\n max = mid - 1\n } else if (offset >= lineToIndex[mid + 1]) {\n min = mid + 1\n } else {\n min = mid\n break\n }\n }\n }\n return {\n col: offset - lineToIndex[min] + 1,\n line: min + 1\n }\n }\n\n mapResolve(file) {\n if (/^\\w+:\\/\\//.test(file)) {\n return file\n }\n return resolve(this.map.consumer().sourceRoot || this.map.root || '.', file)\n }\n\n origin(line, column, endLine, endColumn) {\n if (!this.map) return false\n let consumer = this.map.consumer()\n\n let from = consumer.originalPositionFor({ column, line })\n if (!from.source) return false\n\n let to\n if (typeof endLine === 'number') {\n to = consumer.originalPositionFor({ column: endColumn, line: endLine })\n }\n\n let fromUrl\n\n if (isAbsolute(from.source)) {\n fromUrl = pathToFileURL(from.source)\n } else {\n fromUrl = new URL(\n from.source,\n this.map.consumer().sourceRoot || pathToFileURL(this.map.mapFile)\n )\n }\n\n let result = {\n column: from.column,\n endColumn: to && to.column,\n endLine: to && to.line,\n line: from.line,\n url: fromUrl.toString()\n }\n\n if (fromUrl.protocol === 'file:') {\n if (fileURLToPath) {\n result.file = fileURLToPath(fromUrl)\n } else {\n /* c8 ignore next 2 */\n throw new Error(`file: protocol is not available in this PostCSS build`)\n }\n }\n\n let source = consumer.sourceContentFor(from.source)\n if (source) result.source = source\n\n return result\n }\n\n toJSON() {\n let json = {}\n for (let name of ['hasBOM', 'css', 'file', 'id']) {\n if (this[name] != null) {\n json[name] = this[name]\n }\n }\n if (this.map) {\n json.map = { ...this.map }\n if (json.map.consumerCache) {\n json.map.consumerCache = undefined\n }\n }\n return json\n }\n\n get from() {\n return this.file || this.id\n }\n}\n\nmodule.exports = Input\nInput.default = Input\n\nif (terminalHighlight && terminalHighlight.registerInput) {\n terminalHighlight.registerInput(Input)\n}\n", "'use strict'\n\nlet { SourceMapConsumer, SourceMapGenerator } = require('source-map-js')\nlet { dirname, relative, resolve, sep } = require('path')\nlet { pathToFileURL } = require('url')\n\nlet Input = require('./input')\n\nlet sourceMapAvailable = Boolean(SourceMapConsumer && SourceMapGenerator)\nlet pathAvailable = Boolean(dirname && resolve && relative && sep)\n\nclass MapGenerator {\n constructor(stringify, root, opts, cssString) {\n this.stringify = stringify\n this.mapOpts = opts.map || {}\n this.root = root\n this.opts = opts\n this.css = cssString\n this.originalCSS = cssString\n this.usesFileUrls = !this.mapOpts.from && this.mapOpts.absolute\n\n this.memoizedFileURLs = new Map()\n this.memoizedPaths = new Map()\n this.memoizedURLs = new Map()\n }\n\n addAnnotation() {\n let content\n\n if (this.isInline()) {\n content =\n 'data:application/json;base64,' + this.toBase64(this.map.toString())\n } else if (typeof this.mapOpts.annotation === 'string') {\n content = this.mapOpts.annotation\n } else if (typeof this.mapOpts.annotation === 'function') {\n content = this.mapOpts.annotation(this.opts.to, this.root)\n } else {\n content = this.outputFile() + '.map'\n }\n let eol = '\\n'\n if (this.css.includes('\\r\\n')) eol = '\\r\\n'\n\n this.css += eol + '/*# sourceMappingURL=' + content + ' */'\n }\n\n applyPrevMaps() {\n for (let prev of this.previous()) {\n let from = this.toUrl(this.path(prev.file))\n let root = prev.root || dirname(prev.file)\n let map\n\n if (this.mapOpts.sourcesContent === false) {\n map = new SourceMapConsumer(prev.text)\n if (map.sourcesContent) {\n map.sourcesContent = null\n }\n } else {\n map = prev.consumer()\n }\n\n this.map.applySourceMap(map, from, this.toUrl(this.path(root)))\n }\n }\n\n clearAnnotation() {\n if (this.mapOpts.annotation === false) return\n\n if (this.root) {\n let node\n for (let i = this.root.nodes.length - 1; i >= 0; i--) {\n node = this.root.nodes[i]\n if (node.type !== 'comment') continue\n if (node.text.indexOf('# sourceMappingURL=') === 0) {\n this.root.removeChild(i)\n }\n }\n } else if (this.css) {\n this.css = this.css.replace(/\\n*?\\/\\*#[\\S\\s]*?\\*\\/$/gm, '')\n }\n }\n\n generate() {\n this.clearAnnotation()\n if (pathAvailable && sourceMapAvailable && this.isMap()) {\n return this.generateMap()\n } else {\n let result = ''\n this.stringify(this.root, i => {\n result += i\n })\n return [result]\n }\n }\n\n generateMap() {\n if (this.root) {\n this.generateString()\n } else if (this.previous().length === 1) {\n let prev = this.previous()[0].consumer()\n prev.file = this.outputFile()\n this.map = SourceMapGenerator.fromSourceMap(prev, {\n ignoreInvalidMapping: true\n })\n } else {\n this.map = new SourceMapGenerator({\n file: this.outputFile(),\n ignoreInvalidMapping: true\n })\n this.map.addMapping({\n generated: { column: 0, line: 1 },\n original: { column: 0, line: 1 },\n source: this.opts.from\n ? this.toUrl(this.path(this.opts.from))\n : '<no source>'\n })\n }\n\n if (this.isSourcesContent()) this.setSourcesContent()\n if (this.root && this.previous().length > 0) this.applyPrevMaps()\n if (this.isAnnotation()) this.addAnnotation()\n\n if (this.isInline()) {\n return [this.css]\n } else {\n return [this.css, this.map]\n }\n }\n\n generateString() {\n this.css = ''\n this.map = new SourceMapGenerator({\n file: this.outputFile(),\n ignoreInvalidMapping: true\n })\n\n let line = 1\n let column = 1\n\n let noSource = '<no source>'\n let mapping = {\n generated: { column: 0, line: 0 },\n original: { column: 0, line: 0 },\n source: ''\n }\n\n let lines, last\n this.stringify(this.root, (str, node, type) => {\n this.css += str\n\n if (node && type !== 'end') {\n mapping.generated.line = line\n mapping.generated.column = column - 1\n if (node.source && node.source.start) {\n mapping.source = this.sourcePath(node)\n mapping.original.line = node.source.start.line\n mapping.original.column = node.source.start.column - 1\n this.map.addMapping(mapping)\n } else {\n mapping.source = noSource\n mapping.original.line = 1\n mapping.original.column = 0\n this.map.addMapping(mapping)\n }\n }\n\n lines = str.match(/\\n/g)\n if (lines) {\n line += lines.length\n last = str.lastIndexOf('\\n')\n column = str.length - last\n } else {\n column += str.length\n }\n\n if (node && type !== 'start') {\n let p = node.parent || { raws: {} }\n let childless =\n node.type === 'decl' || (node.type === 'atrule' && !node.nodes)\n if (!childless || node !== p.last || p.raws.semicolon) {\n if (node.source && node.source.end) {\n mapping.source = this.sourcePath(node)\n mapping.original.line = node.source.end.line\n mapping.original.column = node.source.end.column - 1\n mapping.generated.line = line\n mapping.generated.column = column - 2\n this.map.addMapping(mapping)\n } else {\n mapping.source = noSource\n mapping.original.line = 1\n mapping.original.column = 0\n mapping.generated.line = line\n mapping.generated.column = column - 1\n this.map.addMapping(mapping)\n }\n }\n }\n })\n }\n\n isAnnotation() {\n if (this.isInline()) {\n return true\n }\n if (typeof this.mapOpts.annotation !== 'undefined') {\n return this.mapOpts.annotation\n }\n if (this.previous().length) {\n return this.previous().some(i => i.annotation)\n }\n return true\n }\n\n isInline() {\n if (typeof this.mapOpts.inline !== 'undefined') {\n return this.mapOpts.inline\n }\n\n let annotation = this.mapOpts.annotation\n if (typeof annotation !== 'undefined' && annotation !== true) {\n return false\n }\n\n if (this.previous().length) {\n return this.previous().some(i => i.inline)\n }\n return true\n }\n\n isMap() {\n if (typeof this.opts.map !== 'undefined') {\n return !!this.opts.map\n }\n return this.previous().length > 0\n }\n\n isSourcesContent() {\n if (typeof this.mapOpts.sourcesContent !== 'undefined') {\n return this.mapOpts.sourcesContent\n }\n if (this.previous().length) {\n return this.previous().some(i => i.withContent())\n }\n return true\n }\n\n outputFile() {\n if (this.opts.to) {\n return this.path(this.opts.to)\n } else if (this.opts.from) {\n return this.path(this.opts.from)\n } else {\n return 'to.css'\n }\n }\n\n path(file) {\n if (this.mapOpts.absolute) return file\n if (file.charCodeAt(0) === 60 /* `<` */) return file\n if (/^\\w+:\\/\\//.test(file)) return file\n let cached = this.memoizedPaths.get(file)\n if (cached) return cached\n\n let from = this.opts.to ? dirname(this.opts.to) : '.'\n\n if (typeof this.mapOpts.annotation === 'string') {\n from = dirname(resolve(from, this.mapOpts.annotation))\n }\n\n let path = relative(from, file)\n this.memoizedPaths.set(file, path)\n\n return path\n }\n\n previous() {\n if (!this.previousMaps) {\n this.previousMaps = []\n if (this.root) {\n this.root.walk(node => {\n if (node.source && node.source.input.map) {\n let map = node.source.input.map\n if (!this.previousMaps.includes(map)) {\n this.previousMaps.push(map)\n }\n }\n })\n } else {\n let input = new Input(this.originalCSS, this.opts)\n if (input.map) this.previousMaps.push(input.map)\n }\n }\n\n return this.previousMaps\n }\n\n setSourcesContent() {\n let already = {}\n if (this.root) {\n this.root.walk(node => {\n if (node.source) {\n let from = node.source.input.from\n if (from && !already[from]) {\n already[from] = true\n let fromUrl = this.usesFileUrls\n ? this.toFileUrl(from)\n : this.toUrl(this.path(from))\n this.map.setSourceContent(fromUrl, node.source.input.css)\n }\n }\n })\n } else if (this.css) {\n let from = this.opts.from\n ? this.toUrl(this.path(this.opts.from))\n : '<no source>'\n this.map.setSourceContent(from, this.css)\n }\n }\n\n sourcePath(node) {\n if (this.mapOpts.from) {\n return this.toUrl(this.mapOpts.from)\n } else if (this.usesFileUrls) {\n return this.toFileUrl(node.source.input.from)\n } else {\n return this.toUrl(this.path(node.source.input.from))\n }\n }\n\n toBase64(str) {\n if (Buffer) {\n return Buffer.from(str).toString('base64')\n } else {\n return window.btoa(unescape(encodeURIComponent(str)))\n }\n }\n\n toFileUrl(path) {\n let cached = this.memoizedFileURLs.get(path)\n if (cached) return cached\n\n if (pathToFileURL) {\n let fileURL = pathToFileURL(path).toString()\n this.memoizedFileURLs.set(path, fileURL)\n\n return fileURL\n } else {\n throw new Error(\n '`map.absolute` option is not available in this PostCSS build'\n )\n }\n }\n\n toUrl(path) {\n let cached = this.memoizedURLs.get(path)\n if (cached) return cached\n\n if (sep === '\\\\') {\n path = path.replace(/\\\\/g, '/')\n }\n\n let url = encodeURI(path).replace(/[#?]/g, encodeURIComponent)\n this.memoizedURLs.set(path, url)\n\n return url\n }\n}\n\nmodule.exports = MapGenerator\n", "'use strict'\n\nlet Node = require('./node')\n\nclass Comment extends Node {\n constructor(defaults) {\n super(defaults)\n this.type = 'comment'\n }\n}\n\nmodule.exports = Comment\nComment.default = Comment\n", "'use strict'\n\nlet { isClean, my } = require('./symbols')\nlet Declaration = require('./declaration')\nlet Comment = require('./comment')\nlet Node = require('./node')\n\nlet parse, Rule, AtRule, Root\n\nfunction cleanSource(nodes) {\n return nodes.map(i => {\n if (i.nodes) i.nodes = cleanSource(i.nodes)\n delete i.source\n return i\n })\n}\n\nfunction markDirtyUp(node) {\n node[isClean] = false\n if (node.proxyOf.nodes) {\n for (let i of node.proxyOf.nodes) {\n markDirtyUp(i)\n }\n }\n}\n\nclass Container extends Node {\n append(...children) {\n for (let child of children) {\n let nodes = this.normalize(child, this.last)\n for (let node of nodes) this.proxyOf.nodes.push(node)\n }\n\n this.markDirty()\n\n return this\n }\n\n cleanRaws(keepBetween) {\n super.cleanRaws(keepBetween)\n if (this.nodes) {\n for (let node of this.nodes) node.cleanRaws(keepBetween)\n }\n }\n\n each(callback) {\n if (!this.proxyOf.nodes) return undefined\n let iterator = this.getIterator()\n\n let index, result\n while (this.indexes[iterator] < this.proxyOf.nodes.length) {\n index = this.indexes[iterator]\n result = callback(this.proxyOf.nodes[index], index)\n if (result === false) break\n\n this.indexes[iterator] += 1\n }\n\n delete this.indexes[iterator]\n return result\n }\n\n every(condition) {\n return this.nodes.every(condition)\n }\n\n getIterator() {\n if (!this.lastEach) this.lastEach = 0\n if (!this.indexes) this.indexes = {}\n\n this.lastEach += 1\n let iterator = this.lastEach\n this.indexes[iterator] = 0\n\n return iterator\n }\n\n getProxyProcessor() {\n return {\n get(node, prop) {\n if (prop === 'proxyOf') {\n return node\n } else if (!node[prop]) {\n return node[prop]\n } else if (\n prop === 'each' ||\n (typeof prop === 'string' && prop.startsWith('walk'))\n ) {\n return (...args) => {\n return node[prop](\n ...args.map(i => {\n if (typeof i === 'function') {\n return (child, index) => i(child.toProxy(), index)\n } else {\n return i\n }\n })\n )\n }\n } else if (prop === 'every' || prop === 'some') {\n return cb => {\n return node[prop]((child, ...other) =>\n cb(child.toProxy(), ...other)\n )\n }\n } else if (prop === 'root') {\n return () => node.root().toProxy()\n } else if (prop === 'nodes') {\n return node.nodes.map(i => i.toProxy())\n } else if (prop === 'first' || prop === 'last') {\n return node[prop].toProxy()\n } else {\n return node[prop]\n }\n },\n\n set(node, prop, value) {\n if (node[prop] === value) return true\n node[prop] = value\n if (prop === 'name' || prop === 'params' || prop === 'selector') {\n node.markDirty()\n }\n return true\n }\n }\n }\n\n index(child) {\n if (typeof child === 'number') return child\n if (child.proxyOf) child = child.proxyOf\n return this.proxyOf.nodes.indexOf(child)\n }\n\n insertAfter(exist, add) {\n let existIndex = this.index(exist)\n let nodes = this.normalize(add, this.proxyOf.nodes[existIndex]).reverse()\n existIndex = this.index(exist)\n for (let node of nodes) this.proxyOf.nodes.splice(existIndex + 1, 0, node)\n\n let index\n for (let id in this.indexes) {\n index = this.indexes[id]\n if (existIndex < index) {\n this.indexes[id] = index + nodes.length\n }\n }\n\n this.markDirty()\n\n return this\n }\n\n insertBefore(exist, add) {\n let existIndex = this.index(exist)\n let type = existIndex === 0 ? 'prepend' : false\n let nodes = this.normalize(add, this.proxyOf.nodes[existIndex], type).reverse()\n existIndex = this.index(exist)\n for (let node of nodes) this.proxyOf.nodes.splice(existIndex, 0, node)\n\n let index\n for (let id in this.indexes) {\n index = this.indexes[id]\n if (existIndex <= index) {\n this.indexes[id] = index + nodes.length\n }\n }\n\n this.markDirty()\n\n return this\n }\n\n normalize(nodes, sample) {\n if (typeof nodes === 'string') {\n nodes = cleanSource(parse(nodes).nodes)\n } else if (typeof nodes === 'undefined') {\n nodes = []\n } else if (Array.isArray(nodes)) {\n nodes = nodes.slice(0)\n for (let i of nodes) {\n if (i.parent) i.parent.removeChild(i, 'ignore')\n }\n } else if (nodes.type === 'root' && this.type !== 'document') {\n nodes = nodes.nodes.slice(0)\n for (let i of nodes) {\n if (i.parent) i.parent.removeChild(i, 'ignore')\n }\n } else if (nodes.type) {\n nodes = [nodes]\n } else if (nodes.prop) {\n if (typeof nodes.value === 'undefined') {\n throw new Error('Value field is missed in node creation')\n } else if (typeof nodes.value !== 'string') {\n nodes.value = String(nodes.value)\n }\n nodes = [new Declaration(nodes)]\n } else if (nodes.selector) {\n nodes = [new Rule(nodes)]\n } else if (nodes.name) {\n nodes = [new AtRule(nodes)]\n } else if (nodes.text) {\n nodes = [new Comment(nodes)]\n } else {\n throw new Error('Unknown node type in node creation')\n }\n\n let processed = nodes.map(i => {\n /* c8 ignore next */\n if (!i[my]) Container.rebuild(i)\n i = i.proxyOf\n if (i.parent) i.parent.removeChild(i)\n if (i[isClean]) markDirtyUp(i)\n if (typeof i.raws.before === 'undefined') {\n if (sample && typeof sample.raws.before !== 'undefined') {\n i.raws.before = sample.raws.before.replace(/\\S/g, '')\n }\n }\n i.parent = this.proxyOf\n return i\n })\n\n return processed\n }\n\n prepend(...children) {\n children = children.reverse()\n for (let child of children) {\n let nodes = this.normalize(child, this.first, 'prepend').reverse()\n for (let node of nodes) this.proxyOf.nodes.unshift(node)\n for (let id in this.indexes) {\n this.indexes[id] = this.indexes[id] + nodes.length\n }\n }\n\n this.markDirty()\n\n return this\n }\n\n push(child) {\n child.parent = this\n this.proxyOf.nodes.push(child)\n return this\n }\n\n removeAll() {\n for (let node of this.proxyOf.nodes) node.parent = undefined\n this.proxyOf.nodes = []\n\n this.markDirty()\n\n return this\n }\n\n removeChild(child) {\n child = this.index(child)\n this.proxyOf.nodes[child].parent = undefined\n this.proxyOf.nodes.splice(child, 1)\n\n let index\n for (let id in this.indexes) {\n index = this.indexes[id]\n if (index >= child) {\n this.indexes[id] = index - 1\n }\n }\n\n this.markDirty()\n\n return this\n }\n\n replaceValues(pattern, opts, callback) {\n if (!callback) {\n callback = opts\n opts = {}\n }\n\n this.walkDecls(decl => {\n if (opts.props && !opts.props.includes(decl.prop)) return\n if (opts.fast && !decl.value.includes(opts.fast)) return\n\n decl.value = decl.value.replace(pattern, callback)\n })\n\n this.markDirty()\n\n return this\n }\n\n some(condition) {\n return this.nodes.some(condition)\n }\n\n walk(callback) {\n return this.each((child, i) => {\n let result\n try {\n result = callback(child, i)\n } catch (e) {\n throw child.addToError(e)\n }\n if (result !== false && child.walk) {\n result = child.walk(callback)\n }\n\n return result\n })\n }\n\n walkAtRules(name, callback) {\n if (!callback) {\n callback = name\n return this.walk((child, i) => {\n if (child.type === 'atrule') {\n return callback(child, i)\n }\n })\n }\n if (name instanceof RegExp) {\n return this.walk((child, i) => {\n if (child.type === 'atrule' && name.test(child.name)) {\n return callback(child, i)\n }\n })\n }\n return this.walk((child, i) => {\n if (child.type === 'atrule' && child.name === name) {\n return callback(child, i)\n }\n })\n }\n\n walkComments(callback) {\n return this.walk((child, i) => {\n if (child.type === 'comment') {\n return callback(child, i)\n }\n })\n }\n\n walkDecls(prop, callback) {\n if (!callback) {\n callback = prop\n return this.walk((child, i) => {\n if (child.type === 'decl') {\n return callback(child, i)\n }\n })\n }\n if (prop instanceof RegExp) {\n return this.walk((child, i) => {\n if (child.type === 'decl' && prop.test(child.prop)) {\n return callback(child, i)\n }\n })\n }\n return this.walk((child, i) => {\n if (child.type === 'decl' && child.prop === prop) {\n return callback(child, i)\n }\n })\n }\n\n walkRules(selector, callback) {\n if (!callback) {\n callback = selector\n\n return this.walk((child, i) => {\n if (child.type === 'rule') {\n return callback(child, i)\n }\n })\n }\n if (selector instanceof RegExp) {\n return this.walk((child, i) => {\n if (child.type === 'rule' && selector.test(child.selector)) {\n return callback(child, i)\n }\n })\n }\n return this.walk((child, i) => {\n if (child.type === 'rule' && child.selector === selector) {\n return callback(child, i)\n }\n })\n }\n\n get first() {\n if (!this.proxyOf.nodes) return undefined\n return this.proxyOf.nodes[0]\n }\n\n get last() {\n if (!this.proxyOf.nodes) return undefined\n return this.proxyOf.nodes[this.proxyOf.nodes.length - 1]\n }\n}\n\nContainer.registerParse = dependant => {\n parse = dependant\n}\n\nContainer.registerRule = dependant => {\n Rule = dependant\n}\n\nContainer.registerAtRule = dependant => {\n AtRule = dependant\n}\n\nContainer.registerRoot = dependant => {\n Root = dependant\n}\n\nmodule.exports = Container\nContainer.default = Container\n\n/* c8 ignore start */\nContainer.rebuild = node => {\n if (node.type === 'atrule') {\n Object.setPrototypeOf(node, AtRule.prototype)\n } else if (node.type === 'rule') {\n Object.setPrototypeOf(node, Rule.prototype)\n } else if (node.type === 'decl') {\n Object.setPrototypeOf(node, Declaration.prototype)\n } else if (node.type === 'comment') {\n Object.setPrototypeOf(node, Comment.prototype)\n } else if (node.type === 'root') {\n Object.setPrototypeOf(node, Root.prototype)\n }\n\n node[my] = true\n\n if (node.nodes) {\n node.nodes.forEach(child => {\n Container.rebuild(child)\n })\n }\n}\n/* c8 ignore stop */\n", "'use strict'\n\nlet Container = require('./container')\n\nlet LazyResult, Processor\n\nclass Document extends Container {\n constructor(defaults) {\n // type needs to be passed to super, otherwise child roots won't be normalized correctly\n super({ type: 'document', ...defaults })\n\n if (!this.nodes) {\n this.nodes = []\n }\n }\n\n toResult(opts = {}) {\n let lazy = new LazyResult(new Processor(), this, opts)\n\n return lazy.stringify()\n }\n}\n\nDocument.registerLazyResult = dependant => {\n LazyResult = dependant\n}\n\nDocument.registerProcessor = dependant => {\n Processor = dependant\n}\n\nmodule.exports = Document\nDocument.default = Document\n", "/* eslint-disable no-console */\n'use strict'\n\nlet printed = {}\n\nmodule.exports = function warnOnce(message) {\n if (printed[message]) return\n printed[message] = true\n\n if (typeof console !== 'undefined' && console.warn) {\n console.warn(message)\n }\n}\n", "'use strict'\n\nclass Warning {\n constructor(text, opts = {}) {\n this.type = 'warning'\n this.text = text\n\n if (opts.node && opts.node.source) {\n let range = opts.node.rangeBy(opts)\n this.line = range.start.line\n this.column = range.start.column\n this.endLine = range.end.line\n this.endColumn = range.end.column\n }\n\n for (let opt in opts) this[opt] = opts[opt]\n }\n\n toString() {\n if (this.node) {\n return this.node.error(this.text, {\n index: this.index,\n plugin: this.plugin,\n word: this.word\n }).message\n }\n\n if (this.plugin) {\n return this.plugin + ': ' + this.text\n }\n\n return this.text\n }\n}\n\nmodule.exports = Warning\nWarning.default = Warning\n", "'use strict'\n\nlet Warning = require('./warning')\n\nclass Result {\n constructor(processor, root, opts) {\n this.processor = processor\n this.messages = []\n this.root = root\n this.opts = opts\n this.css = undefined\n this.map = undefined\n }\n\n toString() {\n return this.css\n }\n\n warn(text, opts = {}) {\n if (!opts.plugin) {\n if (this.lastPlugin && this.lastPlugin.postcssPlugin) {\n opts.plugin = this.lastPlugin.postcssPlugin\n }\n }\n\n let warning = new Warning(text, opts)\n this.messages.push(warning)\n\n return warning\n }\n\n warnings() {\n return this.messages.filter(i => i.type === 'warning')\n }\n\n get content() {\n return this.css\n }\n}\n\nmodule.exports = Result\nResult.default = Result\n", "'use strict'\n\nconst SINGLE_QUOTE = \"'\".charCodeAt(0)\nconst DOUBLE_QUOTE = '\"'.charCodeAt(0)\nconst BACKSLASH = '\\\\'.charCodeAt(0)\nconst SLASH = '/'.charCodeAt(0)\nconst NEWLINE = '\\n'.charCodeAt(0)\nconst SPACE = ' '.charCodeAt(0)\nconst FEED = '\\f'.charCodeAt(0)\nconst TAB = '\\t'.charCodeAt(0)\nconst CR = '\\r'.charCodeAt(0)\nconst OPEN_SQUARE = '['.charCodeAt(0)\nconst CLOSE_SQUARE = ']'.charCodeAt(0)\nconst OPEN_PARENTHESES = '('.charCodeAt(0)\nconst CLOSE_PARENTHESES = ')'.charCodeAt(0)\nconst OPEN_CURLY = '{'.charCodeAt(0)\nconst CLOSE_CURLY = '}'.charCodeAt(0)\nconst SEMICOLON = ';'.charCodeAt(0)\nconst ASTERISK = '*'.charCodeAt(0)\nconst COLON = ':'.charCodeAt(0)\nconst AT = '@'.charCodeAt(0)\n\nconst RE_AT_END = /[\\t\\n\\f\\r \"#'()/;[\\\\\\]{}]/g\nconst RE_WORD_END = /[\\t\\n\\f\\r !\"#'():;@[\\\\\\]{}]|\\/(?=\\*)/g\nconst RE_BAD_BRACKET = /.[\\r\\n\"'(/\\\\]/\nconst RE_HEX_ESCAPE = /[\\da-f]/i\n\nmodule.exports = function tokenizer(input, options = {}) {\n let css = input.css.valueOf()\n let ignore = options.ignoreErrors\n\n let code, next, quote, content, escape\n let escaped, escapePos, prev, n, currentToken\n\n let length = css.length\n let pos = 0\n let buffer = []\n let returned = []\n\n function position() {\n return pos\n }\n\n function unclosed(what) {\n throw input.error('Unclosed ' + what, pos)\n }\n\n function endOfFile() {\n return returned.length === 0 && pos >= length\n }\n\n function nextToken(opts) {\n if (returned.length) return returned.pop()\n if (pos >= length) return\n\n let ignoreUnclosed = opts ? opts.ignoreUnclosed : false\n\n code = css.charCodeAt(pos)\n\n switch (code) {\n case NEWLINE:\n case SPACE:\n case TAB:\n case CR:\n case FEED: {\n next = pos\n do {\n next += 1\n code = css.charCodeAt(next)\n } while (\n code === SPACE ||\n code === NEWLINE ||\n code === TAB ||\n code === CR ||\n code === FEED\n )\n\n currentToken = ['space', css.slice(pos, next)]\n pos = next - 1\n break\n }\n\n case OPEN_SQUARE:\n case CLOSE_SQUARE:\n case OPEN_CURLY:\n case CLOSE_CURLY:\n case COLON:\n case SEMICOLON:\n case CLOSE_PARENTHESES: {\n let controlChar = String.fromCharCode(code)\n currentToken = [controlChar, controlChar, pos]\n break\n }\n\n case OPEN_PARENTHESES: {\n prev = buffer.length ? buffer.pop()[1] : ''\n n = css.charCodeAt(pos + 1)\n if (\n prev === 'url' &&\n n !== SINGLE_QUOTE &&\n n !== DOUBLE_QUOTE &&\n n !== SPACE &&\n n !== NEWLINE &&\n n !== TAB &&\n n !== FEED &&\n n !== CR\n ) {\n next = pos\n do {\n escaped = false\n next = css.indexOf(')', next + 1)\n if (next === -1) {\n if (ignore || ignoreUnclosed) {\n next = pos\n break\n } else {\n unclosed('bracket')\n }\n }\n escapePos = next\n while (css.charCodeAt(escapePos - 1) === BACKSLASH) {\n escapePos -= 1\n escaped = !escaped\n }\n } while (escaped)\n\n currentToken = ['brackets', css.slice(pos, next + 1), pos, next]\n\n pos = next\n } else {\n next = css.indexOf(')', pos + 1)\n content = css.slice(pos, next + 1)\n\n if (next === -1 || RE_BAD_BRACKET.test(content)) {\n currentToken = ['(', '(', pos]\n } else {\n currentToken = ['brackets', content, pos, next]\n pos = next\n }\n }\n\n break\n }\n\n case SINGLE_QUOTE:\n case DOUBLE_QUOTE: {\n quote = code === SINGLE_QUOTE ? \"'\" : '\"'\n next = pos\n do {\n escaped = false\n next = css.indexOf(quote, next + 1)\n if (next === -1) {\n if (ignore || ignoreUnclosed) {\n next = pos + 1\n break\n } else {\n unclosed('string')\n }\n }\n escapePos = next\n while (css.charCodeAt(escapePos - 1) === BACKSLASH) {\n escapePos -= 1\n escaped = !escaped\n }\n } while (escaped)\n\n currentToken = ['string', css.slice(pos, next + 1), pos, next]\n pos = next\n break\n }\n\n case AT: {\n RE_AT_END.lastIndex = pos + 1\n RE_AT_END.test(css)\n if (RE_AT_END.lastIndex === 0) {\n next = css.length - 1\n } else {\n next = RE_AT_END.lastIndex - 2\n }\n\n currentToken = ['at-word', css.slice(pos, next + 1), pos, next]\n\n pos = next\n break\n }\n\n case BACKSLASH: {\n next = pos\n escape = true\n while (css.charCodeAt(next + 1) === BACKSLASH) {\n next += 1\n escape = !escape\n }\n code = css.charCodeAt(next + 1)\n if (\n escape &&\n code !== SLASH &&\n code !== SPACE &&\n code !== NEWLINE &&\n code !== TAB &&\n code !== CR &&\n code !== FEED\n ) {\n next += 1\n if (RE_HEX_ESCAPE.test(css.charAt(next))) {\n while (RE_HEX_ESCAPE.test(css.charAt(next + 1))) {\n next += 1\n }\n if (css.charCodeAt(next + 1) === SPACE) {\n next += 1\n }\n }\n }\n\n currentToken = ['word', css.slice(pos, next + 1), pos, next]\n\n pos = next\n break\n }\n\n default: {\n if (code === SLASH && css.charCodeAt(pos + 1) === ASTERISK) {\n next = css.indexOf('*/', pos + 2) + 1\n if (next === 0) {\n if (ignore || ignoreUnclosed) {\n next = css.length\n } else {\n unclosed('comment')\n }\n }\n\n currentToken = ['comment', css.slice(pos, next + 1), pos, next]\n pos = next\n } else {\n RE_WORD_END.lastIndex = pos + 1\n RE_WORD_END.test(css)\n if (RE_WORD_END.lastIndex === 0) {\n next = css.length - 1\n } else {\n next = RE_WORD_END.lastIndex - 2\n }\n\n currentToken = ['word', css.slice(pos, next + 1), pos, next]\n buffer.push(currentToken)\n pos = next\n }\n\n break\n }\n }\n\n pos++\n return currentToken\n }\n\n function back(token) {\n returned.push(token)\n }\n\n return {\n back,\n endOfFile,\n nextToken,\n position\n }\n}\n", "'use strict'\n\nlet Container = require('./container')\n\nclass AtRule extends Container {\n constructor(defaults) {\n super(defaults)\n this.type = 'atrule'\n }\n\n append(...children) {\n if (!this.proxyOf.nodes) this.nodes = []\n return super.append(...children)\n }\n\n prepend(...children) {\n if (!this.proxyOf.nodes) this.nodes = []\n return super.prepend(...children)\n }\n}\n\nmodule.exports = AtRule\nAtRule.default = AtRule\n\nContainer.registerAtRule(AtRule)\n", "'use strict'\n\nlet Container = require('./container')\n\nlet LazyResult, Processor\n\nclass Root extends Container {\n constructor(defaults) {\n super(defaults)\n this.type = 'root'\n if (!this.nodes) this.nodes = []\n }\n\n normalize(child, sample, type) {\n let nodes = super.normalize(child)\n\n if (sample) {\n if (type === 'prepend') {\n if (this.nodes.length > 1) {\n sample.raws.before = this.nodes[1].raws.before\n } else {\n delete sample.raws.before\n }\n } else if (this.first !== sample) {\n for (let node of nodes) {\n node.raws.before = sample.raws.before\n }\n }\n }\n\n return nodes\n }\n\n removeChild(child, ignore) {\n let index = this.index(child)\n\n if (!ignore && index === 0 && this.nodes.length > 1) {\n this.nodes[1].raws.before = this.nodes[index].raws.before\n }\n\n return super.removeChild(child)\n }\n\n toResult(opts = {}) {\n let lazy = new LazyResult(new Processor(), this, opts)\n return lazy.stringify()\n }\n}\n\nRoot.registerLazyResult = dependant => {\n LazyResult = dependant\n}\n\nRoot.registerProcessor = dependant => {\n Processor = dependant\n}\n\nmodule.exports = Root\nRoot.default = Root\n\nContainer.registerRoot(Root)\n", "'use strict'\n\nlet list = {\n comma(string) {\n return list.split(string, [','], true)\n },\n\n space(string) {\n let spaces = [' ', '\\n', '\\t']\n return list.split(string, spaces)\n },\n\n split(string, separators, last) {\n let array = []\n let current = ''\n let split = false\n\n let func = 0\n let inQuote = false\n let prevQuote = ''\n let escape = false\n\n for (let letter of string) {\n if (escape) {\n escape = false\n } else if (letter === '\\\\') {\n escape = true\n } else if (inQuote) {\n if (letter === prevQuote) {\n inQuote = false\n }\n } else if (letter === '\"' || letter === \"'\") {\n inQuote = true\n prevQuote = letter\n } else if (letter === '(') {\n func += 1\n } else if (letter === ')') {\n if (func > 0) func -= 1\n } else if (func === 0) {\n if (separators.includes(letter)) split = true\n }\n\n if (split) {\n if (current !== '') array.push(current.trim())\n current = ''\n split = false\n } else {\n current += letter\n }\n }\n\n if (last || current !== '') array.push(current.trim())\n return array\n }\n}\n\nmodule.exports = list\nlist.default = list\n", "'use strict'\n\nlet Container = require('./container')\nlet list = require('./list')\n\nclass Rule extends Container {\n constructor(defaults) {\n super(defaults)\n this.type = 'rule'\n if (!this.nodes) this.nodes = []\n }\n\n get selectors() {\n return list.comma(this.selector)\n }\n\n set selectors(values) {\n let match = this.selector ? this.selector.match(/,\\s*/) : null\n let sep = match ? match[0] : ',' + this.raw('between', 'beforeOpen')\n this.selector = values.join(sep)\n }\n}\n\nmodule.exports = Rule\nRule.default = Rule\n\nContainer.registerRule(Rule)\n", "'use strict'\n\nlet Declaration = require('./declaration')\nlet tokenizer = require('./tokenize')\nlet Comment = require('./comment')\nlet AtRule = require('./at-rule')\nlet Root = require('./root')\nlet Rule = require('./rule')\n\nconst SAFE_COMMENT_NEIGHBOR = {\n empty: true,\n space: true\n}\n\nfunction findLastWithPosition(tokens) {\n for (let i = tokens.length - 1; i >= 0; i--) {\n let token = tokens[i]\n let pos = token[3] || token[2]\n if (pos) return pos\n }\n}\n\nclass Parser {\n constructor(input) {\n this.input = input\n\n this.root = new Root()\n this.current = this.root\n this.spaces = ''\n this.semicolon = false\n\n this.createTokenizer()\n this.root.source = { input, start: { column: 1, line: 1, offset: 0 } }\n }\n\n atrule(token) {\n let node = new AtRule()\n node.name = token[1].slice(1)\n if (node.name === '') {\n this.unnamedAtrule(node, token)\n }\n this.init(node, token[2])\n\n let type\n let prev\n let shift\n let last = false\n let open = false\n let params = []\n let brackets = []\n\n while (!this.tokenizer.endOfFile()) {\n token = this.tokenizer.nextToken()\n type = token[0]\n\n if (type === '(' || type === '[') {\n brackets.push(type === '(' ? ')' : ']')\n } else if (type === '{' && brackets.length > 0) {\n brackets.push('}')\n } else if (type === brackets[brackets.length - 1]) {\n brackets.pop()\n }\n\n if (brackets.length === 0) {\n if (type === ';') {\n node.source.end = this.getPosition(token[2])\n node.source.end.offset++\n this.semicolon = true\n break\n } else if (type === '{') {\n open = true\n break\n } else if (type === '}') {\n if (params.length > 0) {\n shift = params.length - 1\n prev = params[shift]\n while (prev && prev[0] === 'space') {\n prev = params[--shift]\n }\n if (prev) {\n node.source.end = this.getPosition(prev[3] || prev[2])\n node.source.end.offset++\n }\n }\n this.end(token)\n break\n } else {\n params.push(token)\n }\n } else {\n params.push(token)\n }\n\n if (this.tokenizer.endOfFile()) {\n last = true\n break\n }\n }\n\n node.raws.between = this.spacesAndCommentsFromEnd(params)\n if (params.length) {\n node.raws.afterName = this.spacesAndCommentsFromStart(params)\n this.raw(node, 'params', params)\n if (last) {\n token = params[params.length - 1]\n node.source.end = this.getPosition(token[3] || token[2])\n node.source.end.offset++\n this.spaces = node.raws.between\n node.raws.between = ''\n }\n } else {\n node.raws.afterName = ''\n node.params = ''\n }\n\n if (open) {\n node.nodes = []\n this.current = node\n }\n }\n\n checkMissedSemicolon(tokens) {\n let colon = this.colon(tokens)\n if (colon === false) return\n\n let founded = 0\n let token\n for (let j = colon - 1; j >= 0; j--) {\n token = tokens[j]\n if (token[0] !== 'space') {\n founded += 1\n if (founded === 2) break\n }\n }\n // If the token is a word, e.g. `!important`, `red` or any other valid property's value.\n // Then we need to return the colon after that word token. [3] is the \"end\" colon of that word.\n // And because we need it after that one we do +1 to get the next one.\n throw this.input.error(\n 'Missed semicolon',\n token[0] === 'word' ? token[3] + 1 : token[2]\n )\n }\n\n colon(tokens) {\n let brackets = 0\n let token, type, prev\n for (let [i, element] of tokens.entries()) {\n token = element\n type = token[0]\n\n if (type === '(') {\n brackets += 1\n }\n if (type === ')') {\n brackets -= 1\n }\n if (brackets === 0 && type === ':') {\n if (!prev) {\n this.doubleColon(token)\n } else if (prev[0] === 'word' && prev[1] === 'progid') {\n continue\n } else {\n return i\n }\n }\n\n prev = token\n }\n return false\n }\n\n comment(token) {\n let node = new Comment()\n this.init(node, token[2])\n node.source.end = this.getPosition(token[3] || token[2])\n node.source.end.offset++\n\n let text = token[1].slice(2, -2)\n if (/^\\s*$/.test(text)) {\n node.text = ''\n node.raws.left = text\n node.raws.right = ''\n } else {\n let match = text.match(/^(\\s*)([^]*\\S)(\\s*)$/)\n node.text = match[2]\n node.raws.left = match[1]\n node.raws.right = match[3]\n }\n }\n\n createTokenizer() {\n this.tokenizer = tokenizer(this.input)\n }\n\n decl(tokens, customProperty) {\n let node = new Declaration()\n this.init(node, tokens[0][2])\n\n let last = tokens[tokens.length - 1]\n if (last[0] === ';') {\n this.semicolon = true\n tokens.pop()\n }\n\n node.source.end = this.getPosition(\n last[3] || last[2] || findLastWithPosition(tokens)\n )\n node.source.end.offset++\n\n while (tokens[0][0] !== 'word') {\n if (tokens.length === 1) this.unknownWord(tokens)\n node.raws.before += tokens.shift()[1]\n }\n node.source.start = this.getPosition(tokens[0][2])\n\n node.prop = ''\n while (tokens.length) {\n let type = tokens[0][0]\n if (type === ':' || type === 'space' || type === 'comment') {\n break\n }\n node.prop += tokens.shift()[1]\n }\n\n node.raws.between = ''\n\n let token\n while (tokens.length) {\n token = tokens.shift()\n\n if (token[0] === ':') {\n node.raws.between += token[1]\n break\n } else {\n if (token[0] === 'word' && /\\w/.test(token[1])) {\n this.unknownWord([token])\n }\n node.raws.between += token[1]\n }\n }\n\n if (node.prop[0] === '_' || node.prop[0] === '*') {\n node.raws.before += node.prop[0]\n node.prop = node.prop.slice(1)\n }\n\n let firstSpaces = []\n let next\n while (tokens.length) {\n next = tokens[0][0]\n if (next !== 'space' && next !== 'comment') break\n firstSpaces.push(tokens.shift())\n }\n\n this.precheckMissedSemicolon(tokens)\n\n for (let i = tokens.length - 1; i >= 0; i--) {\n token = tokens[i]\n if (token[1].toLowerCase() === '!important') {\n node.important = true\n let string = this.stringFrom(tokens, i)\n string = this.spacesFromEnd(tokens) + string\n if (string !== ' !important') node.raws.important = string\n break\n } else if (token[1].toLowerCase() === 'important') {\n let cache = tokens.slice(0)\n let str = ''\n for (let j = i; j > 0; j--) {\n let type = cache[j][0]\n if (str.trim().indexOf('!') === 0 && type !== 'space') {\n break\n }\n str = cache.pop()[1] + str\n }\n if (str.trim().indexOf('!') === 0) {\n node.important = true\n node.raws.important = str\n tokens = cache\n }\n }\n\n if (token[0] !== 'space' && token[0] !== 'comment') {\n break\n }\n }\n\n let hasWord = tokens.some(i => i[0] !== 'space' && i[0] !== 'comment')\n\n if (hasWord) {\n node.raws.between += firstSpaces.map(i => i[1]).join('')\n firstSpaces = []\n }\n this.raw(node, 'value', firstSpaces.concat(tokens), customProperty)\n\n if (node.value.includes(':') && !customProperty) {\n this.checkMissedSemicolon(tokens)\n }\n }\n\n doubleColon(token) {\n throw this.input.error(\n 'Double colon',\n { offset: token[2] },\n { offset: token[2] + token[1].length }\n )\n }\n\n emptyRule(token) {\n let node = new Rule()\n this.init(node, token[2])\n node.selector = ''\n node.raws.between = ''\n this.current = node\n }\n\n end(token) {\n if (this.current.nodes && this.current.nodes.length) {\n this.current.raws.semicolon = this.semicolon\n }\n this.semicolon = false\n\n this.current.raws.after = (this.current.raws.after || '') + this.spaces\n this.spaces = ''\n\n if (this.current.parent) {\n this.current.source.end = this.getPosition(token[2])\n this.current.source.end.offset++\n this.current = this.current.parent\n } else {\n this.unexpectedClose(token)\n }\n }\n\n endFile() {\n if (this.current.parent) this.unclosedBlock()\n if (this.current.nodes && this.current.nodes.length) {\n this.current.raws.semicolon = this.semicolon\n }\n this.current.raws.after = (this.current.raws.after || '') + this.spaces\n this.root.source.end = this.getPosition(this.tokenizer.position())\n }\n\n freeSemicolon(token) {\n this.spaces += token[1]\n if (this.current.nodes) {\n let prev = this.current.nodes[this.current.nodes.length - 1]\n if (prev && prev.type === 'rule' && !prev.raws.ownSemicolon) {\n prev.raws.ownSemicolon = this.spaces\n this.spaces = ''\n }\n }\n }\n\n // Helpers\n\n getPosition(offset) {\n let pos = this.input.fromOffset(offset)\n return {\n column: pos.col,\n line: pos.line,\n offset\n }\n }\n\n init(node, offset) {\n this.current.push(node)\n node.source = {\n input: this.input,\n start: this.getPosition(offset)\n }\n node.raws.before = this.spaces\n this.spaces = ''\n if (node.type !== 'comment') this.semicolon = false\n }\n\n other(start) {\n let end = false\n let type = null\n let colon = false\n let bracket = null\n let brackets = []\n let customProperty = start[1].startsWith('--')\n\n let tokens = []\n let token = start\n while (token) {\n type = token[0]\n tokens.push(token)\n\n if (type === '(' || type === '[') {\n if (!bracket) bracket = token\n brackets.push(type === '(' ? ')' : ']')\n } else if (customProperty && colon && type === '{') {\n if (!bracket) bracket = token\n brackets.push('}')\n } else if (brackets.length === 0) {\n if (type === ';') {\n if (colon) {\n this.decl(tokens, customProperty)\n return\n } else {\n break\n }\n } else if (type === '{') {\n this.rule(tokens)\n return\n } else if (type === '}') {\n this.tokenizer.back(tokens.pop())\n end = true\n break\n } else if (type === ':') {\n colon = true\n }\n } else if (type === brackets[brackets.length - 1]) {\n brackets.pop()\n if (brackets.length === 0) bracket = null\n }\n\n token = this.tokenizer.nextToken()\n }\n\n if (this.tokenizer.endOfFile()) end = true\n if (brackets.length > 0) this.unclosedBracket(bracket)\n\n if (end && colon) {\n if (!customProperty) {\n while (tokens.length) {\n token = tokens[tokens.length - 1][0]\n if (token !== 'space' && token !== 'comment') break\n this.tokenizer.back(tokens.pop())\n }\n }\n this.decl(tokens, customProperty)\n } else {\n this.unknownWord(tokens)\n }\n }\n\n parse() {\n let token\n while (!this.tokenizer.endOfFile()) {\n token = this.tokenizer.nextToken()\n\n switch (token[0]) {\n case 'space':\n this.spaces += token[1]\n break\n\n case ';':\n this.freeSemicolon(token)\n break\n\n case '}':\n this.end(token)\n break\n\n case 'comment':\n this.comment(token)\n break\n\n case 'at-word':\n this.atrule(token)\n break\n\n case '{':\n this.emptyRule(token)\n break\n\n default:\n this.other(token)\n break\n }\n }\n this.endFile()\n }\n\n precheckMissedSemicolon(/* tokens */) {\n // Hook for Safe Parser\n }\n\n raw(node, prop, tokens, customProperty) {\n let token, type\n let length = tokens.length\n let value = ''\n let clean = true\n let next, prev\n\n for (let i = 0; i < length; i += 1) {\n token = tokens[i]\n type = token[0]\n if (type === 'space' && i === length - 1 && !customProperty) {\n clean = false\n } else if (type === 'comment') {\n prev = tokens[i - 1] ? tokens[i - 1][0] : 'empty'\n next = tokens[i + 1] ? tokens[i + 1][0] : 'empty'\n if (!SAFE_COMMENT_NEIGHBOR[prev] && !SAFE_COMMENT_NEIGHBOR[next]) {\n if (value.slice(-1) === ',') {\n clean = false\n } else {\n value += token[1]\n }\n } else {\n clean = false\n }\n } else {\n value += token[1]\n }\n }\n if (!clean) {\n let raw = tokens.reduce((all, i) => all + i[1], '')\n node.raws[prop] = { raw, value }\n }\n node[prop] = value\n }\n\n rule(tokens) {\n tokens.pop()\n\n let node = new Rule()\n this.init(node, tokens[0][2])\n\n node.raws.between = this.spacesAndCommentsFromEnd(tokens)\n this.raw(node, 'selector', tokens)\n this.current = node\n }\n\n spacesAndCommentsFromEnd(tokens) {\n let lastTokenType\n let spaces = ''\n while (tokens.length) {\n lastTokenType = tokens[tokens.length - 1][0]\n if (lastTokenType !== 'space' && lastTokenType !== 'comment') break\n spaces = tokens.pop()[1] + spaces\n }\n return spaces\n }\n\n // Errors\n\n spacesAndCommentsFromStart(tokens) {\n let next\n let spaces = ''\n while (tokens.length) {\n next = tokens[0][0]\n if (next !== 'space' && next !== 'comment') break\n spaces += tokens.shift()[1]\n }\n return spaces\n }\n\n spacesFromEnd(tokens) {\n let lastTokenType\n let spaces = ''\n while (tokens.length) {\n lastTokenType = tokens[tokens.length - 1][0]\n if (lastTokenType !== 'space') break\n spaces = tokens.pop()[1] + spaces\n }\n return spaces\n }\n\n stringFrom(tokens, from) {\n let result = ''\n for (let i = from; i < tokens.length; i++) {\n result += tokens[i][1]\n }\n tokens.splice(from, tokens.length - from)\n return result\n }\n\n unclosedBlock() {\n let pos = this.current.source.start\n throw this.input.error('Unclosed block', pos.line, pos.column)\n }\n\n unclosedBracket(bracket) {\n throw this.input.error(\n 'Unclosed bracket',\n { offset: bracket[2] },\n { offset: bracket[2] + 1 }\n )\n }\n\n unexpectedClose(token) {\n throw this.input.error(\n 'Unexpected }',\n { offset: token[2] },\n { offset: token[2] + 1 }\n )\n }\n\n unknownWord(tokens) {\n throw this.input.error(\n 'Unknown word',\n { offset: tokens[0][2] },\n { offset: tokens[0][2] + tokens[0][1].length }\n )\n }\n\n unnamedAtrule(node, token) {\n throw this.input.error(\n 'At-rule without name',\n { offset: token[2] },\n { offset: token[2] + token[1].length }\n )\n }\n}\n\nmodule.exports = Parser\n", "'use strict'\n\nlet Container = require('./container')\nlet Parser = require('./parser')\nlet Input = require('./input')\n\nfunction parse(css, opts) {\n let input = new Input(css, opts)\n let parser = new Parser(input)\n try {\n parser.parse()\n } catch (e) {\n if (process.env.NODE_ENV !== 'production') {\n if (e.name === 'CssSyntaxError' && opts && opts.from) {\n if (/\\.scss$/i.test(opts.from)) {\n e.message +=\n '\\nYou tried to parse SCSS with ' +\n 'the standard CSS parser; ' +\n 'try again with the postcss-scss parser'\n } else if (/\\.sass/i.test(opts.from)) {\n e.message +=\n '\\nYou tried to parse Sass with ' +\n 'the standard CSS parser; ' +\n 'try again with the postcss-sass parser'\n } else if (/\\.less$/i.test(opts.from)) {\n e.message +=\n '\\nYou tried to parse Less with ' +\n 'the standard CSS parser; ' +\n 'try again with the postcss-less parser'\n }\n }\n }\n throw e\n }\n\n return parser.root\n}\n\nmodule.exports = parse\nparse.default = parse\n\nContainer.registerParse(parse)\n", "'use strict'\n\nlet { isClean, my } = require('./symbols')\nlet MapGenerator = require('./map-generator')\nlet stringify = require('./stringify')\nlet Container = require('./container')\nlet Document = require('./document')\nlet warnOnce = require('./warn-once')\nlet Result = require('./result')\nlet parse = require('./parse')\nlet Root = require('./root')\n\nconst TYPE_TO_CLASS_NAME = {\n atrule: 'AtRule',\n comment: 'Comment',\n decl: 'Declaration',\n document: 'Document',\n root: 'Root',\n rule: 'Rule'\n}\n\nconst PLUGIN_PROPS = {\n AtRule: true,\n AtRuleExit: true,\n Comment: true,\n CommentExit: true,\n Declaration: true,\n DeclarationExit: true,\n Document: true,\n DocumentExit: true,\n Once: true,\n OnceExit: true,\n postcssPlugin: true,\n prepare: true,\n Root: true,\n RootExit: true,\n Rule: true,\n RuleExit: true\n}\n\nconst NOT_VISITORS = {\n Once: true,\n postcssPlugin: true,\n prepare: true\n}\n\nconst CHILDREN = 0\n\nfunction isPromise(obj) {\n return typeof obj === 'object' && typeof obj.then === 'function'\n}\n\nfunction getEvents(node) {\n let key = false\n let type = TYPE_TO_CLASS_NAME[node.type]\n if (node.type === 'decl') {\n key = node.prop.toLowerCase()\n } else if (node.type === 'atrule') {\n key = node.name.toLowerCase()\n }\n\n if (key && node.append) {\n return [\n type,\n type + '-' + key,\n CHILDREN,\n type + 'Exit',\n type + 'Exit-' + key\n ]\n } else if (key) {\n return [type, type + '-' + key, type + 'Exit', type + 'Exit-' + key]\n } else if (node.append) {\n return [type, CHILDREN, type + 'Exit']\n } else {\n return [type, type + 'Exit']\n }\n}\n\nfunction toStack(node) {\n let events\n if (node.type === 'document') {\n events = ['Document', CHILDREN, 'DocumentExit']\n } else if (node.type === 'root') {\n events = ['Root', CHILDREN, 'RootExit']\n } else {\n events = getEvents(node)\n }\n\n return {\n eventIndex: 0,\n events,\n iterator: 0,\n node,\n visitorIndex: 0,\n visitors: []\n }\n}\n\nfunction cleanMarks(node) {\n node[isClean] = false\n if (node.nodes) node.nodes.forEach(i => cleanMarks(i))\n return node\n}\n\nlet postcss = {}\n\nclass LazyResult {\n constructor(processor, css, opts) {\n this.stringified = false\n this.processed = false\n\n let root\n if (\n typeof css === 'object' &&\n css !== null &&\n (css.type === 'root' || css.type === 'document')\n ) {\n root = cleanMarks(css)\n } else if (css instanceof LazyResult || css instanceof Result) {\n root = cleanMarks(css.root)\n if (css.map) {\n if (typeof opts.map === 'undefined') opts.map = {}\n if (!opts.map.inline) opts.map.inline = false\n opts.map.prev = css.map\n }\n } else {\n let parser = parse\n if (opts.syntax) parser = opts.syntax.parse\n if (opts.parser) parser = opts.parser\n if (parser.parse) parser = parser.parse\n\n try {\n root = parser(css, opts)\n } catch (error) {\n this.processed = true\n this.error = error\n }\n\n if (root && !root[my]) {\n /* c8 ignore next 2 */\n Container.rebuild(root)\n }\n }\n\n this.result = new Result(processor, root, opts)\n this.helpers = { ...postcss, postcss, result: this.result }\n this.plugins = this.processor.plugins.map(plugin => {\n if (typeof plugin === 'object' && plugin.prepare) {\n return { ...plugin, ...plugin.prepare(this.result) }\n } else {\n return plugin\n }\n })\n }\n\n async() {\n if (this.error) return Promise.reject(this.error)\n if (this.processed) return Promise.resolve(this.result)\n if (!this.processing) {\n this.processing = this.runAsync()\n }\n return this.processing\n }\n\n catch(onRejected) {\n return this.async().catch(onRejected)\n }\n\n finally(onFinally) {\n return this.async().then(onFinally, onFinally)\n }\n\n getAsyncError() {\n throw new Error('Use process(css).then(cb) to work with async plugins')\n }\n\n handleError(error, node) {\n let plugin = this.result.lastPlugin\n try {\n if (node) node.addToError(error)\n this.error = error\n if (error.name === 'CssSyntaxError' && !error.plugin) {\n error.plugin = plugin.postcssPlugin\n error.setMessage()\n } else if (plugin.postcssVersion) {\n if (process.env.NODE_ENV !== 'production') {\n let pluginName = plugin.postcssPlugin\n let pluginVer = plugin.postcssVersion\n let runtimeVer = this.result.processor.version\n let a = pluginVer.split('.')\n let b = runtimeVer.split('.')\n\n if (a[0] !== b[0] || parseInt(a[1]) > parseInt(b[1])) {\n // eslint-disable-next-line no-console\n console.error(\n 'Unknown error from PostCSS plugin. Your current PostCSS ' +\n 'version is ' +\n runtimeVer +\n ', but ' +\n pluginName +\n ' uses ' +\n pluginVer +\n '. Perhaps this is the source of the error below.'\n )\n }\n }\n }\n } catch (err) {\n /* c8 ignore next 3 */\n // eslint-disable-next-line no-console\n if (console && console.error) console.error(err)\n }\n return error\n }\n\n prepareVisitors() {\n this.listeners = {}\n let add = (plugin, type, cb) => {\n if (!this.listeners[type]) this.listeners[type] = []\n this.listeners[type].push([plugin, cb])\n }\n for (let plugin of this.plugins) {\n if (typeof plugin === 'object') {\n for (let event in plugin) {\n if (!PLUGIN_PROPS[event] && /^[A-Z]/.test(event)) {\n throw new Error(\n `Unknown event ${event} in ${plugin.postcssPlugin}. ` +\n `Try to update PostCSS (${this.processor.version} now).`\n )\n }\n if (!NOT_VISITORS[event]) {\n if (typeof plugin[event] === 'object') {\n for (let filter in plugin[event]) {\n if (filter === '*') {\n add(plugin, event, plugin[event][filter])\n } else {\n add(\n plugin,\n event + '-' + filter.toLowerCase(),\n plugin[event][filter]\n )\n }\n }\n } else if (typeof plugin[event] === 'function') {\n add(plugin, event, plugin[event])\n }\n }\n }\n }\n }\n this.hasListener = Object.keys(this.listeners).length > 0\n }\n\n async runAsync() {\n this.plugin = 0\n for (let i = 0; i < this.plugins.length; i++) {\n let plugin = this.plugins[i]\n let promise = this.runOnRoot(plugin)\n if (isPromise(promise)) {\n try {\n await promise\n } catch (error) {\n throw this.handleError(error)\n }\n }\n }\n\n this.prepareVisitors()\n if (this.hasListener) {\n let root = this.result.root\n while (!root[isClean]) {\n root[isClean] = true\n let stack = [toStack(root)]\n while (stack.length > 0) {\n let promise = this.visitTick(stack)\n if (isPromise(promise)) {\n try {\n await promise\n } catch (e) {\n let node = stack[stack.length - 1].node\n throw this.handleError(e, node)\n }\n }\n }\n }\n\n if (this.listeners.OnceExit) {\n for (let [plugin, visitor] of this.listeners.OnceExit) {\n this.result.lastPlugin = plugin\n try {\n if (root.type === 'document') {\n let roots = root.nodes.map(subRoot =>\n visitor(subRoot, this.helpers)\n )\n\n await Promise.all(roots)\n } else {\n await visitor(root, this.helpers)\n }\n } catch (e) {\n throw this.handleError(e)\n }\n }\n }\n }\n\n this.processed = true\n return this.stringify()\n }\n\n runOnRoot(plugin) {\n this.result.lastPlugin = plugin\n try {\n if (typeof plugin === 'object' && plugin.Once) {\n if (this.result.root.type === 'document') {\n let roots = this.result.root.nodes.map(root =>\n plugin.Once(root, this.helpers)\n )\n\n if (isPromise(roots[0])) {\n return Promise.all(roots)\n }\n\n return roots\n }\n\n return plugin.Once(this.result.root, this.helpers)\n } else if (typeof plugin === 'function') {\n return plugin(this.result.root, this.result)\n }\n } catch (error) {\n throw this.handleError(error)\n }\n }\n\n stringify() {\n if (this.error) throw this.error\n if (this.stringified) return this.result\n this.stringified = true\n\n this.sync()\n\n let opts = this.result.opts\n let str = stringify\n if (opts.syntax) str = opts.syntax.stringify\n if (opts.stringifier) str = opts.stringifier\n if (str.stringify) str = str.stringify\n\n let map = new MapGenerator(str, this.result.root, this.result.opts)\n let data = map.generate()\n this.result.css = data[0]\n this.result.map = data[1]\n\n return this.result\n }\n\n sync() {\n if (this.error) throw this.error\n if (this.processed) return this.result\n this.processed = true\n\n if (this.processing) {\n throw this.getAsyncError()\n }\n\n for (let plugin of this.plugins) {\n let promise = this.runOnRoot(plugin)\n if (isPromise(promise)) {\n throw this.getAsyncError()\n }\n }\n\n this.prepareVisitors()\n if (this.hasListener) {\n let root = this.result.root\n while (!root[isClean]) {\n root[isClean] = true\n this.walkSync(root)\n }\n if (this.listeners.OnceExit) {\n if (root.type === 'document') {\n for (let subRoot of root.nodes) {\n this.visitSync(this.listeners.OnceExit, subRoot)\n }\n } else {\n this.visitSync(this.listeners.OnceExit, root)\n }\n }\n }\n\n return this.result\n }\n\n then(onFulfilled, onRejected) {\n if (process.env.NODE_ENV !== 'production') {\n if (!('from' in this.opts)) {\n warnOnce(\n 'Without `from` option PostCSS could generate wrong source map ' +\n 'and will not find Browserslist config. Set it to CSS file path ' +\n 'or to `undefined` to prevent this warning.'\n )\n }\n }\n return this.async().then(onFulfilled, onRejected)\n }\n\n toString() {\n return this.css\n }\n\n visitSync(visitors, node) {\n for (let [plugin, visitor] of visitors) {\n this.result.lastPlugin = plugin\n let promise\n try {\n promise = visitor(node, this.helpers)\n } catch (e) {\n throw this.handleError(e, node.proxyOf)\n }\n if (node.type !== 'root' && node.type !== 'document' && !node.parent) {\n return true\n }\n if (isPromise(promise)) {\n throw this.getAsyncError()\n }\n }\n }\n\n visitTick(stack) {\n let visit = stack[stack.length - 1]\n let { node, visitors } = visit\n\n if (node.type !== 'root' && node.type !== 'document' && !node.parent) {\n stack.pop()\n return\n }\n\n if (visitors.length > 0 && visit.visitorIndex < visitors.length) {\n let [plugin, visitor] = visitors[visit.visitorIndex]\n visit.visitorIndex += 1\n if (visit.visitorIndex === visitors.length) {\n visit.visitors = []\n visit.visitorIndex = 0\n }\n this.result.lastPlugin = plugin\n try {\n return visitor(node.toProxy(), this.helpers)\n } catch (e) {\n throw this.handleError(e, node)\n }\n }\n\n if (visit.iterator !== 0) {\n let iterator = visit.iterator\n let child\n while ((child = node.nodes[node.indexes[iterator]])) {\n node.indexes[iterator] += 1\n if (!child[isClean]) {\n child[isClean] = true\n stack.push(toStack(child))\n return\n }\n }\n visit.iterator = 0\n delete node.indexes[iterator]\n }\n\n let events = visit.events\n while (visit.eventIndex < events.length) {\n let event = events[visit.eventIndex]\n visit.eventIndex += 1\n if (event === CHILDREN) {\n if (node.nodes && node.nodes.length) {\n node[isClean] = true\n visit.iterator = node.getIterator()\n }\n return\n } else if (this.listeners[event]) {\n visit.visitors = this.listeners[event]\n return\n }\n }\n stack.pop()\n }\n\n walkSync(node) {\n node[isClean] = true\n let events = getEvents(node)\n for (let event of events) {\n if (event === CHILDREN) {\n if (node.nodes) {\n node.each(child => {\n if (!child[isClean]) this.walkSync(child)\n })\n }\n } else {\n let visitors = this.listeners[event]\n if (visitors) {\n if (this.visitSync(visitors, node.toProxy())) return\n }\n }\n }\n }\n\n warnings() {\n return this.sync().warnings()\n }\n\n get content() {\n return this.stringify().content\n }\n\n get css() {\n return this.stringify().css\n }\n\n get map() {\n return this.stringify().map\n }\n\n get messages() {\n return this.sync().messages\n }\n\n get opts() {\n return this.result.opts\n }\n\n get processor() {\n return this.result.processor\n }\n\n get root() {\n return this.sync().root\n }\n\n get [Symbol.toStringTag]() {\n return 'LazyResult'\n }\n}\n\nLazyResult.registerPostcss = dependant => {\n postcss = dependant\n}\n\nmodule.exports = LazyResult\nLazyResult.default = LazyResult\n\nRoot.registerLazyResult(LazyResult)\nDocument.registerLazyResult(LazyResult)\n", "'use strict'\n\nlet MapGenerator = require('./map-generator')\nlet stringify = require('./stringify')\nlet warnOnce = require('./warn-once')\nlet parse = require('./parse')\nconst Result = require('./result')\n\nclass NoWorkResult {\n constructor(processor, css, opts) {\n css = css.toString()\n this.stringified = false\n\n this._processor = processor\n this._css = css\n this._opts = opts\n this._map = undefined\n let root\n\n let str = stringify\n this.result = new Result(this._processor, root, this._opts)\n this.result.css = css\n\n let self = this\n Object.defineProperty(this.result, 'root', {\n get() {\n return self.root\n }\n })\n\n let map = new MapGenerator(str, root, this._opts, css)\n if (map.isMap()) {\n let [generatedCSS, generatedMap] = map.generate()\n if (generatedCSS) {\n this.result.css = generatedCSS\n }\n if (generatedMap) {\n this.result.map = generatedMap\n }\n } else {\n map.clearAnnotation()\n this.result.css = map.css\n }\n }\n\n async() {\n if (this.error) return Promise.reject(this.error)\n return Promise.resolve(this.result)\n }\n\n catch(onRejected) {\n return this.async().catch(onRejected)\n }\n\n finally(onFinally) {\n return this.async().then(onFinally, onFinally)\n }\n\n sync() {\n if (this.error) throw this.error\n return this.result\n }\n\n then(onFulfilled, onRejected) {\n if (process.env.NODE_ENV !== 'production') {\n if (!('from' in this._opts)) {\n warnOnce(\n 'Without `from` option PostCSS could generate wrong source map ' +\n 'and will not find Browserslist config. Set it to CSS file path ' +\n 'or to `undefined` to prevent this warning.'\n )\n }\n }\n\n return this.async().then(onFulfilled, onRejected)\n }\n\n toString() {\n return this._css\n }\n\n warnings() {\n return []\n }\n\n get content() {\n return this.result.css\n }\n\n get css() {\n return this.result.css\n }\n\n get map() {\n return this.result.map\n }\n\n get messages() {\n return []\n }\n\n get opts() {\n return this.result.opts\n }\n\n get processor() {\n return this.result.processor\n }\n\n get root() {\n if (this._root) {\n return this._root\n }\n\n let root\n let parser = parse\n\n try {\n root = parser(this._css, this._opts)\n } catch (error) {\n this.error = error\n }\n\n if (this.error) {\n throw this.error\n } else {\n this._root = root\n return root\n }\n }\n\n get [Symbol.toStringTag]() {\n return 'NoWorkResult'\n }\n}\n\nmodule.exports = NoWorkResult\nNoWorkResult.default = NoWorkResult\n", "'use strict'\n\nlet NoWorkResult = require('./no-work-result')\nlet LazyResult = require('./lazy-result')\nlet Document = require('./document')\nlet Root = require('./root')\n\nclass Processor {\n constructor(plugins = []) {\n this.version = '8.4.38'\n this.plugins = this.normalize(plugins)\n }\n\n normalize(plugins) {\n let normalized = []\n for (let i of plugins) {\n if (i.postcss === true) {\n i = i()\n } else if (i.postcss) {\n i = i.postcss\n }\n\n if (typeof i === 'object' && Array.isArray(i.plugins)) {\n normalized = normalized.concat(i.plugins)\n } else if (typeof i === 'object' && i.postcssPlugin) {\n normalized.push(i)\n } else if (typeof i === 'function') {\n normalized.push(i)\n } else if (typeof i === 'object' && (i.parse || i.stringify)) {\n if (process.env.NODE_ENV !== 'production') {\n throw new Error(\n 'PostCSS syntaxes cannot be used as plugins. Instead, please use ' +\n 'one of the syntax/parser/stringifier options as outlined ' +\n 'in your PostCSS runner documentation.'\n )\n }\n } else {\n throw new Error(i + ' is not a PostCSS plugin')\n }\n }\n return normalized\n }\n\n process(css, opts = {}) {\n if (\n !this.plugins.length &&\n !opts.parser &&\n !opts.stringifier &&\n !opts.syntax\n ) {\n return new NoWorkResult(this, css, opts)\n } else {\n return new LazyResult(this, css, opts)\n }\n }\n\n use(plugin) {\n this.plugins = this.plugins.concat(this.normalize([plugin]))\n return this\n }\n}\n\nmodule.exports = Processor\nProcessor.default = Processor\n\nRoot.registerProcessor(Processor)\nDocument.registerProcessor(Processor)\n", "'use strict'\n\nlet Declaration = require('./declaration')\nlet PreviousMap = require('./previous-map')\nlet Comment = require('./comment')\nlet AtRule = require('./at-rule')\nlet Input = require('./input')\nlet Root = require('./root')\nlet Rule = require('./rule')\n\nfunction fromJSON(json, inputs) {\n if (Array.isArray(json)) return json.map(n => fromJSON(n))\n\n let { inputs: ownInputs, ...defaults } = json\n if (ownInputs) {\n inputs = []\n for (let input of ownInputs) {\n let inputHydrated = { ...input, __proto__: Input.prototype }\n if (inputHydrated.map) {\n inputHydrated.map = {\n ...inputHydrated.map,\n __proto__: PreviousMap.prototype\n }\n }\n inputs.push(inputHydrated)\n }\n }\n if (defaults.nodes) {\n defaults.nodes = json.nodes.map(n => fromJSON(n, inputs))\n }\n if (defaults.source) {\n let { inputId, ...source } = defaults.source\n defaults.source = source\n if (inputId != null) {\n defaults.source.input = inputs[inputId]\n }\n }\n if (defaults.type === 'root') {\n return new Root(defaults)\n } else if (defaults.type === 'decl') {\n return new Declaration(defaults)\n } else if (defaults.type === 'rule') {\n return new Rule(defaults)\n } else if (defaults.type === 'comment') {\n return new Comment(defaults)\n } else if (defaults.type === 'atrule') {\n return new AtRule(defaults)\n } else {\n throw new Error('Unknown node type: ' + json.type)\n }\n}\n\nmodule.exports = fromJSON\nfromJSON.default = fromJSON\n", "'use strict'\n\nlet CssSyntaxError = require('./css-syntax-error')\nlet Declaration = require('./declaration')\nlet LazyResult = require('./lazy-result')\nlet Container = require('./container')\nlet Processor = require('./processor')\nlet stringify = require('./stringify')\nlet fromJSON = require('./fromJSON')\nlet Document = require('./document')\nlet Warning = require('./warning')\nlet Comment = require('./comment')\nlet AtRule = require('./at-rule')\nlet Result = require('./result.js')\nlet Input = require('./input')\nlet parse = require('./parse')\nlet list = require('./list')\nlet Rule = require('./rule')\nlet Root = require('./root')\nlet Node = require('./node')\n\nfunction postcss(...plugins) {\n if (plugins.length === 1 && Array.isArray(plugins[0])) {\n plugins = plugins[0]\n }\n return new Processor(plugins)\n}\n\npostcss.plugin = function plugin(name, initializer) {\n let warningPrinted = false\n function creator(...args) {\n // eslint-disable-next-line no-console\n if (console && console.warn && !warningPrinted) {\n warningPrinted = true\n // eslint-disable-next-line no-console\n console.warn(\n name +\n ': postcss.plugin was deprecated. Migration guide:\\n' +\n 'https://evilmartians.com/chronicles/postcss-8-plugin-migration'\n )\n if (process.env.LANG && process.env.LANG.startsWith('cn')) {\n /* c8 ignore next 7 */\n // eslint-disable-next-line no-console\n console.warn(\n name +\n ': 里面 postcss.plugin 被弃用. 迁移指南:\\n' +\n 'https://www.w3ctech.com/topic/2226'\n )\n }\n }\n let transformer = initializer(...args)\n transformer.postcssPlugin = name\n transformer.postcssVersion = new Processor().version\n return transformer\n }\n\n let cache\n Object.defineProperty(creator, 'postcss', {\n get() {\n if (!cache) cache = creator()\n return cache\n }\n })\n\n creator.process = function (css, processOpts, pluginOpts) {\n return postcss([creator(pluginOpts)]).process(css, processOpts)\n }\n\n return creator\n}\n\npostcss.stringify = stringify\npostcss.parse = parse\npostcss.fromJSON = fromJSON\npostcss.list = list\n\npostcss.comment = defaults => new Comment(defaults)\npostcss.atRule = defaults => new AtRule(defaults)\npostcss.decl = defaults => new Declaration(defaults)\npostcss.rule = defaults => new Rule(defaults)\npostcss.root = defaults => new Root(defaults)\npostcss.document = defaults => new Document(defaults)\n\npostcss.CssSyntaxError = CssSyntaxError\npostcss.Declaration = Declaration\npostcss.Container = Container\npostcss.Processor = Processor\npostcss.Document = Document\npostcss.Comment = Comment\npostcss.Warning = Warning\npostcss.AtRule = AtRule\npostcss.Result = Result\npostcss.Input = Input\npostcss.Rule = Rule\npostcss.Root = Root\npostcss.Node = Node\n\nLazyResult.registerPostcss(postcss)\n\nmodule.exports = postcss\npostcss.default = postcss\n", "import postcss from './postcss.js'\n\nexport default postcss\n\nexport const stringify = postcss.stringify\nexport const fromJSON = postcss.fromJSON\nexport const plugin = postcss.plugin\nexport const parse = postcss.parse\nexport const list = postcss.list\n\nexport const document = postcss.document\nexport const comment = postcss.comment\nexport const atRule = postcss.atRule\nexport const rule = postcss.rule\nexport const decl = postcss.decl\nexport const root = postcss.root\n\nexport const CssSyntaxError = postcss.CssSyntaxError\nexport const Declaration = postcss.Declaration\nexport const Container = postcss.Container\nexport const Processor = postcss.Processor\nexport const Document = postcss.Document\nexport const Comment = postcss.Comment\nexport const Warning = postcss.Warning\nexport const AtRule = postcss.AtRule\nexport const Result = postcss.Result\nexport const Input = postcss.Input\nexport const Rule = postcss.Rule\nexport const Root = postcss.Root\nexport const Node = postcss.Node\n", "import { mediaSelectorPlugin, pseudoClassPlugin } from './css';\nimport {\n type serializedNodeWithId,\n type serializedElementNodeWithId,\n NodeType,\n type elementNode,\n type legacyAttributes,\n} from '@rrweb/types';\nimport { type tagMap, type BuildCache } from './types';\nimport { isElement, Mirror, isNodeMetaEqual } from './utils';\nimport postcss from 'postcss';\n\nconst tagMap: tagMap = {\n script: 'noscript',\n // camel case svg element tag names\n altglyph: 'altGlyph',\n altglyphdef: 'altGlyphDef',\n altglyphitem: 'altGlyphItem',\n animatecolor: 'animateColor',\n animatemotion: 'animateMotion',\n animatetransform: 'animateTransform',\n clippath: 'clipPath',\n feblend: 'feBlend',\n fecolormatrix: 'feColorMatrix',\n fecomponenttransfer: 'feComponentTransfer',\n fecomposite: 'feComposite',\n feconvolvematrix: 'feConvolveMatrix',\n fediffuselighting: 'feDiffuseLighting',\n fedisplacementmap: 'feDisplacementMap',\n fedistantlight: 'feDistantLight',\n fedropshadow: 'feDropShadow',\n feflood: 'feFlood',\n fefunca: 'feFuncA',\n fefuncb: 'feFuncB',\n fefuncg: 'feFuncG',\n fefuncr: 'feFuncR',\n fegaussianblur: 'feGaussianBlur',\n feimage: 'feImage',\n femerge: 'feMerge',\n femergenode: 'feMergeNode',\n femorphology: 'feMorphology',\n feoffset: 'feOffset',\n fepointlight: 'fePointLight',\n fespecularlighting: 'feSpecularLighting',\n fespotlight: 'feSpotLight',\n fetile: 'feTile',\n feturbulence: 'feTurbulence',\n foreignobject: 'foreignObject',\n glyphref: 'glyphRef',\n lineargradient: 'linearGradient',\n radialgradient: 'radialGradient',\n};\nfunction getTagName(n: elementNode): string {\n let tagName = tagMap[n.tagName] ? tagMap[n.tagName] : n.tagName;\n if (tagName === 'link' && n.attributes._cssText) {\n tagName = 'style';\n }\n return tagName;\n}\n\nexport function adaptCssForReplay(cssText: string, cache: BuildCache): string {\n const cachedStyle = cache?.stylesWithHoverClass.get(cssText);\n if (cachedStyle) return cachedStyle;\n\n const ast: { css: string } = postcss([\n mediaSelectorPlugin,\n pseudoClassPlugin,\n ]).process(cssText);\n const result = ast.css;\n cache?.stylesWithHoverClass.set(cssText, result);\n return result;\n}\n\nexport function createCache(): BuildCache {\n const stylesWithHoverClass: Map<string, string> = new Map();\n return {\n stylesWithHoverClass,\n };\n}\n\n/**\n * undo splitCssText/markCssSplits\n * (would move to utils.ts but uses `adaptCssForReplay`)\n */\nexport function applyCssSplits(\n n: serializedElementNodeWithId,\n cssText: string,\n hackCss: boolean,\n cache: BuildCache,\n): void {\n const childTextNodes = [];\n for (const scn of n.childNodes) {\n if (scn.type === NodeType.Text) {\n childTextNodes.push(scn);\n }\n }\n const cssTextSplits = cssText.split('/* rr_split */');\n while (\n cssTextSplits.length > 1 &&\n cssTextSplits.length > childTextNodes.length\n ) {\n // unexpected: remerge the last two so that we don't discard any css\n cssTextSplits.splice(-2, 2, cssTextSplits.slice(-2).join(''));\n }\n for (let i = 0; i < childTextNodes.length; i++) {\n const childTextNode = childTextNodes[i];\n const cssTextSection = cssTextSplits[i];\n if (childTextNode && cssTextSection) {\n // id will be assigned when these child nodes are\n // iterated over in buildNodeWithSN\n childTextNode.textContent = hackCss\n ? adaptCssForReplay(cssTextSection, cache)\n : cssTextSection;\n }\n }\n}\n\n/**\n * Normally a <style> element has a single textNode containing the rules.\n * During serialization, we bypass this (`styleEl.sheet`) to get the rules the\n * browser sees and serialize this to a special _cssText attribute, blanking\n * out any text nodes. This function reverses that and also handles cases where\n * there were no textNode children present (dynamic css/or a <link> element) as\n * well as multiple textNodes, which need to be repopulated (based on presence of\n * a special `rr_split` marker in case they are modified by subsequent mutations.\n */\nexport function buildStyleNode(\n n: serializedElementNodeWithId,\n styleEl: HTMLStyleElement, // when inlined, a <link type=\"stylesheet\"> also gets rebuilt as a <style>\n cssText: string,\n options: {\n doc: Document;\n hackCss: boolean;\n cache: BuildCache;\n },\n) {\n const { doc, hackCss, cache } = options;\n if (n.childNodes.length) {\n applyCssSplits(n, cssText, hackCss, cache);\n } else {\n if (hackCss) {\n cssText = adaptCssForReplay(cssText, cache);\n }\n /**\n <link> element or dynamic <style> are serialized without any child nodes\n we create the text node without an ID or presence in mirror as it can't\n */\n styleEl.appendChild(doc.createTextNode(cssText));\n }\n}\n\nfunction buildNode(\n n: serializedNodeWithId,\n options: {\n doc: Document;\n hackCss: boolean;\n cache: BuildCache;\n },\n): Node | null {\n const { doc, hackCss, cache } = options;\n switch (n.type) {\n case NodeType.Document:\n return doc.implementation.createDocument(null, '', null);\n case NodeType.DocumentType:\n return doc.implementation.createDocumentType(\n n.name || 'html',\n n.publicId,\n n.systemId,\n );\n case NodeType.Element: {\n const tagName = getTagName(n);\n let node: Element;\n if (n.isSVG) {\n node = doc.createElementNS('http://www.w3.org/2000/svg', tagName);\n } else {\n if (\n // If the tag name is a custom element name\n n.isCustom &&\n // If the browser supports custom elements\n doc.defaultView?.customElements &&\n // If the custom element hasn't been defined yet\n !doc.defaultView.customElements.get(n.tagName)\n )\n doc.defaultView.customElements.define(\n n.tagName,\n class extends doc.defaultView.HTMLElement {},\n );\n node = doc.createElement(tagName);\n }\n /**\n * Attribute names start with `rr_` are internal attributes added by rrweb.\n * They often overwrite other attributes on the element.\n * We need to parse them last so they can overwrite conflicting attributes.\n */\n const specialAttributes: { [key: string]: string | number } = {};\n for (const name in n.attributes) {\n if (!Object.prototype.hasOwnProperty.call(n.attributes, name)) {\n continue;\n }\n let value = n.attributes[name];\n if (\n tagName === 'option' &&\n name === 'selected' &&\n (value as legacyAttributes[typeof name]) === false\n ) {\n // legacy fix (TODO: if `value === false` can be generated for other attrs,\n // should we also omit those other attrs from build ?)\n continue;\n }\n\n // null values mean the attribute was removed\n if (value === null) {\n continue;\n }\n\n /**\n * Boolean attributes are considered to be true if they're present on the element at all.\n * We should set value to the empty string (\"\") or the attribute's name, with no leading or trailing whitespace.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/setAttribute#parameters\n */\n if (value === true) value = '';\n\n if (name.startsWith('rr_')) {\n specialAttributes[name] = value;\n continue;\n }\n\n if (typeof value !== 'string') {\n // pass\n } else if (tagName === 'style' && name === '_cssText') {\n buildStyleNode(n, node as HTMLStyleElement, value, options);\n continue; // no need to set _cssText as attribute\n } else if (tagName === 'textarea' && name === 'value') {\n // create without an ID or presence in mirror\n node.appendChild(doc.createTextNode(value));\n n.childNodes = []; // value overrides childNodes\n continue;\n }\n\n try {\n if (n.isSVG && name === 'xlink:href') {\n node.setAttributeNS(\n 'http://www.w3.org/1999/xlink',\n name,\n value.toString(),\n );\n } else if (\n name === 'onload' ||\n name === 'onclick' ||\n name.substring(0, 7) === 'onmouse'\n ) {\n // Rename some of the more common atttributes from https://www.w3schools.com/tags/ref_eventattributes.asp\n // as setting them triggers a console.error (which shows up despite the try/catch)\n // Assumption: these attributes are not used to css\n node.setAttribute('_' + name, value.toString());\n } else if (\n tagName === 'meta' &&\n n.attributes['http-equiv'] === 'Content-Security-Policy' &&\n name === 'content'\n ) {\n // If CSP contains style-src and inline-style is disabled, there will be an error \"Refused to apply inline style because it violates the following Content Security Policy directive: style-src '*'\".\n // And the function insertStyleRules in rrweb replayer will throw an error \"Uncaught TypeError: Cannot read property 'insertRule' of null\".\n node.setAttribute('csp-content', value.toString());\n continue;\n } else if (\n tagName === 'link' &&\n (n.attributes.rel === 'preload' ||\n n.attributes.rel === 'modulepreload') &&\n n.attributes.as === 'script'\n ) {\n // ignore\n } else if (\n tagName === 'link' &&\n n.attributes.rel === 'prefetch' &&\n typeof n.attributes.href === 'string' &&\n n.attributes.href.endsWith('.js')\n ) {\n // ignore\n } else if (\n tagName === 'img' &&\n n.attributes.srcset &&\n n.attributes.rr_dataURL\n ) {\n // backup original img srcset\n node.setAttribute(\n 'rrweb-original-srcset',\n n.attributes.srcset as string,\n );\n } else {\n node.setAttribute(name, value.toString());\n }\n } catch (error) {\n // skip invalid attribute\n }\n }\n\n for (const name in specialAttributes) {\n const value = specialAttributes[name];\n // handle internal attributes\n if (tagName === 'canvas' && name === 'rr_dataURL') {\n const image = doc.createElement('img');\n image.onload = () => {\n const ctx = (node as HTMLCanvasElement).getContext('2d');\n if (ctx) {\n ctx.drawImage(image, 0, 0, image.width, image.height);\n }\n };\n image.src = value.toString();\n type RRCanvasElement = {\n RRNodeType: NodeType;\n rr_dataURL: string;\n };\n // If the canvas element is created in RRDom runtime (seeking to a time point), the canvas context isn't supported. So the data has to be stored and not handled until diff process. https://github.com/rrweb-io/rrweb/pull/944\n if ((node as unknown as RRCanvasElement).RRNodeType)\n (node as unknown as RRCanvasElement).rr_dataURL = value.toString();\n } else if (tagName === 'img' && name === 'rr_dataURL') {\n const image = node as HTMLImageElement;\n if (!image.currentSrc.startsWith('data:')) {\n // Backup original img src. It may not have been set yet.\n image.setAttribute(\n 'rrweb-original-src',\n n.attributes.src as string,\n );\n image.src = value.toString();\n }\n }\n\n if (name === 'rr_width') {\n (node as HTMLElement).style.setProperty('width', value.toString());\n } else if (name === 'rr_height') {\n (node as HTMLElement).style.setProperty('height', value.toString());\n } else if (\n name === 'rr_mediaCurrentTime' &&\n typeof value === 'number'\n ) {\n (node as HTMLMediaElement).currentTime = value;\n } else if (name === 'rr_mediaState') {\n switch (value) {\n case 'played':\n (node as HTMLMediaElement)\n .play()\n .catch((e) => console.warn('media playback error', e));\n break;\n case 'paused':\n (node as HTMLMediaElement).pause();\n break;\n default:\n }\n } else if (\n name === 'rr_mediaPlaybackRate' &&\n typeof value === 'number'\n ) {\n (node as HTMLMediaElement).playbackRate = value;\n } else if (name === 'rr_mediaMuted' && typeof value === 'boolean') {\n (node as HTMLMediaElement).muted = value;\n } else if (name === 'rr_mediaLoop' && typeof value === 'boolean') {\n (node as HTMLMediaElement).loop = value;\n } else if (name === 'rr_mediaVolume' && typeof value === 'number') {\n (node as HTMLMediaElement).volume = value;\n } else if (name === 'rr_open_mode') {\n (node as HTMLDialogElement).setAttribute(\n 'rr_open_mode',\n value as string,\n ); // keep this attribute for rrweb to trigger showModal\n }\n }\n\n if (n.isShadowHost) {\n /**\n * Since node is newly rebuilt, it should be a normal element\n * without shadowRoot.\n * But if there are some weird situations that has defined\n * custom element in the scope before we rebuild node, it may\n * register the shadowRoot earlier.\n * The logic in the 'else' block is just a try-my-best solution\n * for the corner case, please let we know if it is wrong and\n * we can remove it.\n */\n if (!node.shadowRoot) {\n node.attachShadow({ mode: 'open' });\n } else {\n while (node.shadowRoot.firstChild) {\n node.shadowRoot.removeChild(node.shadowRoot.firstChild);\n }\n }\n }\n return node;\n }\n case NodeType.Text:\n if (n.isStyle && hackCss) {\n // support legacy style\n return doc.createTextNode(adaptCssForReplay(n.textContent, cache));\n }\n return doc.createTextNode(n.textContent);\n case NodeType.CDATA:\n return doc.createCDATASection(n.textContent);\n case NodeType.Comment:\n return doc.createComment(n.textContent);\n default:\n return null;\n }\n}\n\nexport function buildNodeWithSN(\n n: serializedNodeWithId,\n options: {\n doc: Document;\n mirror: Mirror;\n skipChild?: boolean;\n hackCss: boolean;\n /**\n * This callback will be called for each of this nodes' `.childNodes` after they are appended to _this_ node.\n * Caveat: This callback _doesn't_ get called when this node is appended to the DOM.\n */\n afterAppend?: (n: Node, id: number) => unknown;\n cache: BuildCache;\n },\n): Node | null {\n const {\n doc,\n mirror,\n skipChild = false,\n hackCss = true,\n afterAppend,\n cache,\n } = options;\n /**\n * Add a check to see if the node is already in the mirror. If it is, we can skip the whole process.\n * This situation (duplicated nodes) can happen when recorder has some unfixed bugs and the same node is recorded twice. Or something goes wrong when saving or transferring event data.\n * Duplicated node creation may cause unexpected errors in replayer. This check tries best effort to prevent the errors.\n */\n if (mirror.has(n.id)) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const nodeInMirror = mirror.getNode(n.id)!;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const meta = mirror.getMeta(nodeInMirror)!;\n // For safety concern, check if the node in mirror is the same as the node we are trying to build\n if (isNodeMetaEqual(meta, n)) return mirror.getNode(n.id);\n }\n let node = buildNode(n, { doc, hackCss, cache });\n if (!node) {\n return null;\n }\n // If the snapshot is created by checkout, the rootId doesn't change but the iframe's document can be changed automatically when a new iframe element is created.\n if (n.rootId && (mirror.getNode(n.rootId) as Document) !== doc) {\n mirror.replace(n.rootId, doc);\n }\n // use target document as root document\n if (n.type === NodeType.Document) {\n // close before open to make sure document was closed\n doc.close();\n doc.open();\n if (\n n.compatMode === 'BackCompat' &&\n n.childNodes &&\n n.childNodes[0].type !== NodeType.DocumentType // there isn't one already defined\n ) {\n // Trigger compatMode in the iframe\n // this is needed as document.createElement('iframe') otherwise inherits a CSS1Compat mode from the parent replayer environment\n if (\n n.childNodes[0].type === NodeType.Element &&\n 'xmlns' in n.childNodes[0].attributes &&\n n.childNodes[0].attributes.xmlns === 'http://www.w3.org/1999/xhtml'\n ) {\n // might as well use an xhtml doctype if we've got an xhtml namespace\n doc.write(\n '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"\">',\n );\n } else {\n doc.write(\n '<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"\">',\n );\n }\n }\n node = doc;\n }\n\n mirror.add(node, n);\n\n if (\n (n.type === NodeType.Document || n.type === NodeType.Element) &&\n !skipChild\n ) {\n for (const childN of n.childNodes) {\n const childNode = buildNodeWithSN(childN, {\n doc,\n mirror,\n skipChild: false,\n hackCss,\n afterAppend,\n cache,\n });\n if (!childNode) {\n console.warn('Failed to rebuild', childN);\n continue;\n }\n\n if (childN.isShadow && isElement(node) && node.shadowRoot) {\n node.shadowRoot.appendChild(childNode);\n } else if (\n n.type === NodeType.Document &&\n childN.type == NodeType.Element\n ) {\n const htmlElement = childNode as HTMLElement;\n let body: HTMLBodyElement | null = null;\n htmlElement.childNodes.forEach((child) => {\n if (child.nodeName === 'BODY') body = child as HTMLBodyElement;\n });\n if (body) {\n // this branch solves a problem in Firefox where css transitions are incorrectly\n // being applied upon rebuild. Presumably FF doesn't finished parsing the styles\n // in time, and applies e.g. a default margin:0 to elements which have a non-zero\n // margin set in CSS, along with a transition on them\n htmlElement.removeChild(body);\n // append <head> and <style>s\n node.appendChild(childNode);\n // now append <body>\n htmlElement.appendChild(body);\n } else {\n node.appendChild(childNode);\n }\n } else {\n node.appendChild(childNode);\n }\n if (afterAppend) {\n afterAppend(childNode, childN.id);\n }\n }\n }\n\n return node;\n}\n\nfunction visit(mirror: Mirror, onVisit: (node: Node) => void) {\n function walk(node: Node) {\n onVisit(node);\n }\n\n for (const id of mirror.getIds()) {\n if (mirror.has(id)) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n walk(mirror.getNode(id)!);\n }\n }\n}\n\nfunction handleScroll(node: Node, mirror: Mirror) {\n const n = mirror.getMeta(node);\n if (n?.type !== NodeType.Element) {\n return;\n }\n const el = node as HTMLElement;\n for (const name in n.attributes) {\n if (\n !(\n Object.prototype.hasOwnProperty.call(n.attributes, name) &&\n name.startsWith('rr_')\n )\n ) {\n continue;\n }\n const value = n.attributes[name];\n if (name === 'rr_scrollLeft') {\n el.scrollLeft = value as number;\n }\n if (name === 'rr_scrollTop') {\n el.scrollTop = value as number;\n }\n }\n}\n\nfunction rebuild(\n n: serializedNodeWithId,\n options: {\n doc: Document;\n onVisit?: (node: Node) => unknown;\n hackCss?: boolean;\n afterAppend?: (n: Node, id: number) => unknown;\n cache: BuildCache;\n mirror: Mirror;\n },\n): Node | null {\n const {\n doc,\n onVisit,\n hackCss = true,\n afterAppend,\n cache,\n mirror = new Mirror(),\n } = options;\n const node = buildNodeWithSN(n, {\n doc,\n mirror,\n skipChild: false,\n hackCss,\n afterAppend,\n cache,\n });\n visit(mirror, (visitedNode) => {\n if (onVisit) {\n onVisit(visitedNode);\n }\n handleScroll(visitedNode, mirror);\n });\n return node;\n}\n\nexport default rebuild;\n", "/**\n * Heatmap Tracking Manager for Grain Analytics\n * Tracks click interactions and scroll depth across all pages\n */\n\nimport type {\n HeatmapClickData,\n HeatmapScrollData,\n HeatmapTrackingOptions,\n HeatmapScrollState,\n} from './types/heatmap-tracking';\nimport { AttentionQualityManager } from './attention-quality';\nimport type { ActivityDetector } from './activity';\nimport { cleanElementText } from './text-utils';\n\nexport interface SendEventOptions {\n flush?: boolean;\n}\n\nexport interface HeatmapTracker {\n trackSystemEvent(eventName: string, properties?: Record<string, unknown>, options?: SendEventOptions): void | Promise<void>;\n hasConsent(category: 'analytics' | 'marketing' | 'functional'): boolean;\n getActivityDetector(): ActivityDetector;\n getConfigAsync(key: string): Promise<string | undefined>;\n getEffectiveUserId(): string;\n log(...args: unknown[]): void;\n}\n\nconst DEFAULT_OPTIONS: HeatmapTrackingOptions = {\n scrollDebounceDelay: 100,\n batchDelay: 2000,\n maxBatchSize: 20,\n debug: false,\n};\n\nexport class HeatmapTrackingManager {\n private tracker: HeatmapTracker;\n private options: HeatmapTrackingOptions;\n private isDestroyed = false;\n\n // Tracking state\n private currentScrollState: HeatmapScrollState | null = null;\n private pendingClicks: HeatmapClickData[] = [];\n private pendingScrolls: HeatmapScrollData[] = [];\n\n // Timers\n private scrollDebounceTimer: number | null = null;\n private batchTimer: number | null = null;\n private scrollTrackingTimer: number | null = null;\n private periodicScrollTimer: number | null = null;\n\n // Scroll tracking\n private lastScrollPosition = 0;\n private lastScrollTime = Date.now();\n private readonly SPLIT_DURATION = 3000; // 3 seconds - same as section tracking\n\n // Attention quality management\n private attentionQuality: AttentionQualityManager;\n\n // Snapshot capture state\n private snapshotCaptured = false;\n private snapshotEnabled = false;\n\n constructor(\n tracker: HeatmapTracker,\n options: Partial<HeatmapTrackingOptions> = {}\n ) {\n this.tracker = tracker;\n this.options = { ...DEFAULT_OPTIONS, ...options };\n\n // Initialize attention quality manager\n this.attentionQuality = new AttentionQualityManager(\n tracker.getActivityDetector(),\n {\n maxSectionDuration: 9000, // 9 seconds per viewport section\n minScrollDistance: 100, // 100 pixels\n idleThreshold: 30000, // 30 seconds\n debug: this.options.debug,\n }\n );\n\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Initialize after DOM is ready\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => this.initialize());\n } else {\n setTimeout(() => this.initialize(), 0);\n }\n }\n }\n\n /**\n * Initialize heatmap tracking\n */\n private async initialize(): Promise<void> {\n if (this.isDestroyed) return;\n\n this.log('Initializing heatmap tracking');\n\n // Check remote config for snapshot capture\n await this.checkSnapshotConfig();\n\n // Setup click tracking\n this.setupClickTracking();\n\n // Setup scroll tracking\n this.setupScrollTracking();\n\n // Start periodic scroll state tracking\n this.startScrollTracking();\n\n // Setup page unload handler for beaconing\n this.setupUnloadHandler();\n\n // Initialize snapshot capture if enabled\n if (this.snapshotEnabled && !this.snapshotCaptured) {\n this.captureSnapshot();\n }\n }\n\n /**\n * Check remote config for snapshot capture enablement\n */\n /**\n * Normalize URL by removing query params and hash, and stripping www prefix\n * This ensures heatmap data is aggregated by page, not by URL variations\n * Subdomains (other than www) are preserved: api.example.com != app.example.com\n */\n private normalizeUrl(url: string): string {\n try {\n const urlObj = new URL(url);\n let hostname = urlObj.hostname.toLowerCase();\n \n // Strip www prefix but keep other subdomains\n if (hostname.startsWith('www.')) {\n hostname = hostname.substring(4);\n }\n \n // Return protocol + normalized hostname + pathname only\n return `${urlObj.protocol}//${hostname}${urlObj.pathname}`;\n } catch {\n // If URL parsing fails, return as-is\n return url;\n }\n }\n\n private async checkSnapshotConfig(): Promise<void> {\n try {\n const enableSnapshot = await this.tracker.getConfigAsync('enableHeatmapSnapshot');\n this.snapshotEnabled = enableSnapshot === 'true';\n this.log('Heatmap snapshot capture enabled:', this.snapshotEnabled);\n } catch (error) {\n this.log('Failed to check snapshot config, defaulting to disabled:', error);\n this.snapshotEnabled = false;\n }\n }\n\n /**\n * Capture DOM snapshot using rrweb-snapshot\n */\n private async captureSnapshot(): Promise<void> {\n if (this.snapshotCaptured || !this.snapshotEnabled) return;\n\n try {\n this.log('Capturing DOM snapshot...');\n \n // Dynamically import rrweb-snapshot (only if enabled)\n // @ts-ignore - rrweb-snapshot is an optional dependency, may not be resolvable during React build\n const rrwebSnapshot = await import('rrweb-snapshot');\n \n // Capture full DOM snapshot with PII masking\n const snapshot = rrwebSnapshot.snapshot(document, {\n maskAllInputs: true,\n maskTextFn: (text: string) => {\n // Basic PII masking - mask anything that looks like email or sensitive data\n return text.replace(/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}/g, '*****');\n },\n });\n\n this.snapshotCaptured = true;\n this.log('DOM snapshot captured successfully');\n\n // Upload snapshot to backend\n await this.uploadSnapshot(snapshot);\n } catch (error) {\n this.log('Failed to capture DOM snapshot:', error);\n }\n }\n\n /**\n * Upload snapshot to backend\n */\n private async uploadSnapshot(snapshot: unknown): Promise<void> {\n try {\n const sessionId = this.tracker.getEffectiveUserId();\n const pageUrl = this.normalizeUrl(window.location.href);\n\n this.log('Uploading snapshot to backend - sessionId:', sessionId);\n\n // Note: The actual API call would need the tenantId from the tracker\n // For now, we'll log that the snapshot is ready to be uploaded\n // The tracker would need to expose tenantId for this to work\n const snapshotData = {\n sessionId,\n pageUrl,\n snapshot\n };\n \n this.log('Snapshot data prepared:', { sessionId, pageUrl, snapshotSize: JSON.stringify(snapshot).length });\n \n // Get API configuration from tracker\n const apiUrl = await this.getApiUrl();\n const tenantId = await this.getTenantId();\n const headers = await this.getAuthHeaders();\n \n if (!apiUrl || !tenantId) {\n this.log('Cannot upload snapshot: missing API URL or tenant ID');\n return;\n }\n \n // Upload to backend\n const response = await fetch(\n `${apiUrl}/v1/events/${encodeURIComponent(tenantId)}/snapshot`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...headers\n },\n body: JSON.stringify({\n sessionId,\n pageUrl,\n snapshot: JSON.stringify(snapshot),\n timestamp: Date.now()\n })\n }\n );\n \n if (!response.ok) {\n throw new Error(`Snapshot upload failed: ${response.status}`);\n }\n \n const result = await response.json();\n this.log('Snapshot uploaded successfully:', result);\n } catch (error) {\n this.log('Failed to upload snapshot:', error);\n }\n }\n \n /**\n * Get API URL from tracker configuration\n */\n private async getApiUrl(): Promise<string | undefined> {\n try {\n return (this.tracker as any).config?.apiUrl || 'https://api.grainql.com';\n } catch {\n return 'https://api.grainql.com';\n }\n }\n \n /**\n * Get tenant ID from tracker configuration\n */\n private async getTenantId(): Promise<string | undefined> {\n try {\n return (this.tracker as any).config?.tenantId;\n } catch {\n return undefined;\n }\n }\n \n /**\n * Get auth headers from tracker\n */\n private async getAuthHeaders(): Promise<Record<string, string>> {\n try {\n if (typeof (this.tracker as any).getAuthHeaders === 'function') {\n return await (this.tracker as any).getAuthHeaders();\n }\n return {};\n } catch {\n return {};\n }\n }\n\n /**\n * Setup click event tracking\n */\n private setupClickTracking(): void {\n if (typeof document === 'undefined') return;\n\n const clickHandler = (event: MouseEvent) => {\n if (this.isDestroyed) return;\n // v3: Always track events - consent only affects ID type (daily vs permanent)\n // Removed: if (!this.tracker.hasConsent('analytics')) return;\n\n this.handleClick(event);\n };\n\n document.addEventListener('click', clickHandler, { passive: true, capture: true });\n }\n\n /**\n * Setup scroll event tracking\n */\n private setupScrollTracking(): void {\n if (typeof window === 'undefined') return;\n\n const scrollHandler = () => {\n if (this.scrollDebounceTimer !== null) {\n clearTimeout(this.scrollDebounceTimer);\n }\n\n this.scrollDebounceTimer = window.setTimeout(() => {\n this.handleScroll();\n this.scrollDebounceTimer = null;\n }, this.options.scrollDebounceDelay);\n };\n\n window.addEventListener('scroll', scrollHandler, { passive: true });\n }\n\n /**\n * Start periodic scroll state tracking\n */\n private startScrollTracking(): void {\n if (typeof window === 'undefined') return;\n\n // Track initial scroll position\n this.updateScrollState();\n\n // Update scroll state every 500ms (for detecting section changes)\n this.scrollTrackingTimer = window.setInterval(() => {\n if (this.isDestroyed) return;\n this.updateScrollState();\n }, 500);\n\n // Start periodic 3-second scroll duration tracking\n this.startPeriodicScrollTracking();\n }\n\n /**\n * Start periodic scroll tracking (sends events every 3 seconds)\n */\n private startPeriodicScrollTracking(): void {\n if (typeof window === 'undefined') return;\n\n this.periodicScrollTimer = window.setInterval(() => {\n if (this.isDestroyed || !this.currentScrollState) return;\n // v3: Always track events - consent only affects ID type (daily vs permanent)\n // Removed: if (!this.tracker.hasConsent('analytics')) return;\n\n // Check attention quality policies\n if (!this.attentionQuality.shouldTrack()) {\n this.log('Scroll tracking paused:', this.attentionQuality.getLastFilterReason());\n return;\n }\n\n const currentTime = Date.now();\n const duration = currentTime - this.currentScrollState.entryTime;\n\n // Only send if meaningful duration (> 1 second)\n if (duration > 1000) {\n const scrollY = window.scrollY || window.pageYOffset;\n const viewportHeight = window.innerHeight;\n const pageHeight = document.documentElement.scrollHeight;\n\n // Check section-specific attention quality\n const sectionKey = `viewport_section_${this.currentScrollState.viewportSection}`;\n const attentionCheck = this.attentionQuality.shouldTrackSection(sectionKey, scrollY);\n\n // If attention was reset due to scroll, reset our entry time\n if (attentionCheck.resetAttention) {\n this.log(`Viewport section ${this.currentScrollState.viewportSection}: Attention reset`);\n this.currentScrollState.entryTime = currentTime;\n return;\n }\n\n // If max duration reached for this viewport section\n if (!attentionCheck.shouldTrack) {\n this.log(`Viewport section ${this.currentScrollState.viewportSection}: ${attentionCheck.reason}`);\n return;\n }\n\n const scrollData: HeatmapScrollData = {\n pageUrl: this.normalizeUrl(window.location.href),\n viewportSection: this.currentScrollState.viewportSection,\n scrollDepthPx: scrollY,\n durationMs: duration,\n entryTimestamp: this.currentScrollState.entryTime,\n exitTimestamp: currentTime,\n pageHeight,\n viewportHeight,\n };\n\n // Send immediately using beacon to ensure delivery\n this.tracker.trackSystemEvent('_grain_heatmap_scroll', {\n page_url: scrollData.pageUrl,\n viewport_section: scrollData.viewportSection,\n scroll_depth_px: scrollData.scrollDepthPx,\n duration_ms: scrollData.durationMs,\n entry_timestamp: scrollData.entryTimestamp,\n exit_timestamp: scrollData.exitTimestamp,\n page_height: scrollData.pageHeight,\n viewport_height: scrollData.viewportHeight,\n is_split: true, // Flag to indicate periodic tracking, not final exit\n }, { flush: true });\n\n // Update attention quality duration tracker\n this.attentionQuality.updateSectionDuration(sectionKey, duration);\n\n // Reset entry time for next period\n this.currentScrollState.entryTime = currentTime;\n }\n }, this.SPLIT_DURATION);\n }\n\n /**\n * Setup page unload handler to beacon remaining data\n */\n private setupUnloadHandler(): void {\n if (typeof window === 'undefined') return;\n\n const unloadHandler = () => {\n // Finalize current scroll state\n if (this.currentScrollState) {\n const currentTime = Date.now();\n const duration = currentTime - this.currentScrollState.entryTime;\n\n if (duration > 100) {\n const scrollData: HeatmapScrollData = {\n pageUrl: this.normalizeUrl(window.location.href),\n viewportSection: this.currentScrollState.viewportSection,\n scrollDepthPx: this.currentScrollState.scrollDepthPx,\n durationMs: duration,\n entryTimestamp: this.currentScrollState.entryTime,\n exitTimestamp: currentTime,\n pageHeight: document.documentElement.scrollHeight,\n viewportHeight: window.innerHeight,\n };\n\n this.pendingScrolls.push(scrollData);\n }\n }\n\n // Flush all pending events with beacon\n this.flushPendingEventsWithBeacon();\n };\n\n // Use both events for better compatibility\n window.addEventListener('beforeunload', unloadHandler);\n window.addEventListener('pagehide', unloadHandler);\n }\n\n /**\n * Handle click event\n */\n private handleClick(event: MouseEvent): void {\n // v3: Always track events - consent only affects ID type (daily vs permanent)\n // Removed: if (!this.tracker.hasConsent('analytics')) return;\n\n const element = event.target as HTMLElement;\n if (!element) return;\n\n const pageUrl = this.normalizeUrl(window.location.href);\n const xpath = this.generateXPath(element);\n \n // Generate CSS selector for element-relative positioning\n const selector = this.generateCSSSelector(element);\n \n // Calculate element-relative coordinates\n let relX: number | undefined;\n let relY: number | undefined;\n try {\n const rect = element.getBoundingClientRect();\n if (rect.width > 0 && rect.height > 0) {\n relX = Math.max(0, Math.min(1, (event.clientX - rect.left) / rect.width));\n relY = Math.max(0, Math.min(1, (event.clientY - rect.top) / rect.height));\n }\n } catch (error) {\n this.log('Failed to calculate relative coordinates:', error);\n }\n \n // Get viewport coordinates\n const viewportX = Math.round(event.clientX);\n const viewportY = Math.round(event.clientY);\n \n // Get page coordinates (including scroll offset)\n const pageX = Math.round(event.pageX);\n const pageY = Math.round(event.pageY);\n \n const elementTag = element.tagName?.toLowerCase() || 'unknown';\n const elementText = cleanElementText(element.textContent);\n\n const clickData: HeatmapClickData = {\n pageUrl,\n xpath,\n selector,\n relX,\n relY,\n viewportX,\n viewportY,\n pageX,\n pageY,\n elementTag,\n elementText: elementText || undefined,\n timestamp: Date.now(),\n };\n\n // Check if this is a navigation link\n const isNavigationLink = element instanceof HTMLAnchorElement && element.href;\n\n // Send immediately with beacon for navigation links to ensure delivery\n if (isNavigationLink) {\n this.tracker.trackSystemEvent('_grain_heatmap_click', {\n page_url: clickData.pageUrl,\n xpath: clickData.xpath,\n selector: clickData.selector,\n rel_x: clickData.relX,\n rel_y: clickData.relY,\n viewport_x: clickData.viewportX,\n viewport_y: clickData.viewportY,\n page_x: clickData.pageX,\n page_y: clickData.pageY,\n element_tag: clickData.elementTag,\n element_text: clickData.elementText,\n timestamp: clickData.timestamp,\n }, { flush: true });\n } else {\n this.pendingClicks.push(clickData);\n\n // Check if we should flush\n this.considerBatchFlush();\n }\n }\n\n /**\n * Handle scroll event\n */\n private handleScroll(): void {\n // v3: Always track events - consent only affects ID type (daily vs permanent)\n // Removed: if (!this.tracker.hasConsent('analytics')) return;\n this.updateScrollState();\n }\n\n /**\n * Update current scroll state\n */\n private updateScrollState(): void {\n if (typeof window === 'undefined') return;\n // v3: Always track events - consent only affects ID type (daily vs permanent)\n // Removed: if (!this.tracker.hasConsent('analytics')) return;\n\n const currentTime = Date.now();\n const scrollY = window.scrollY || window.pageYOffset;\n const viewportHeight = window.innerHeight;\n const pageHeight = document.documentElement.scrollHeight;\n \n // Calculate which viewport section we're in\n const viewportSection = Math.floor(scrollY / viewportHeight);\n\n // If we're in a new section, record the previous one\n if (this.currentScrollState && this.currentScrollState.viewportSection !== viewportSection) {\n const duration = currentTime - this.currentScrollState.entryTime;\n \n // Only record if duration is meaningful (> 100ms)\n if (duration > 100) {\n const scrollData: HeatmapScrollData = {\n pageUrl: this.normalizeUrl(window.location.href),\n viewportSection: this.currentScrollState.viewportSection,\n scrollDepthPx: this.currentScrollState.scrollDepthPx,\n durationMs: duration,\n entryTimestamp: this.currentScrollState.entryTime,\n exitTimestamp: currentTime,\n pageHeight,\n viewportHeight,\n };\n\n this.pendingScrolls.push(scrollData);\n }\n\n // Reset attention for previous viewport section\n const prevSectionKey = `viewport_section_${this.currentScrollState.viewportSection}`;\n this.attentionQuality.resetSection(prevSectionKey);\n }\n\n // Update current state\n if (!this.currentScrollState || this.currentScrollState.viewportSection !== viewportSection) {\n this.currentScrollState = {\n viewportSection,\n entryTime: currentTime,\n scrollDepthPx: scrollY,\n };\n }\n\n this.lastScrollPosition = scrollY;\n this.lastScrollTime = currentTime;\n\n // Check if we should flush\n this.considerBatchFlush();\n }\n\n /**\n * Generate CSS selector for an element (for element-relative positioning)\n */\n private generateCSSSelector(element: HTMLElement): string {\n if (!element) return '';\n\n // Prefer ID if available\n if (element.id) {\n return `#${element.id}`;\n }\n\n // Try data attributes\n const dataAttrs = Array.from(element.attributes).filter(attr => attr.name.startsWith('data-'));\n if (dataAttrs.length > 0) {\n const attr = dataAttrs[0];\n return `${element.tagName.toLowerCase()}[${attr.name}=\"${attr.value}\"]`;\n }\n\n // Try class names (pick first meaningful class)\n if (element.className && typeof element.className === 'string') {\n const classes = element.className.split(' ').filter(c => c && !c.match(/^(active|hover|focus)/));\n if (classes.length > 0) {\n return `${element.tagName.toLowerCase()}.${classes[0]}`;\n }\n }\n\n // Fall back to nth-child path\n const path: string[] = [];\n let current: HTMLElement | null = element;\n \n while (current && current !== document.body) {\n let selector = current.tagName.toLowerCase();\n \n if (current.parentElement) {\n const siblings = Array.from(current.parentElement.children);\n const sameTagSiblings = siblings.filter(s => s.tagName === current!.tagName);\n \n if (sameTagSiblings.length > 1) {\n const index = sameTagSiblings.indexOf(current) + 1;\n selector += `:nth-child(${index})`;\n }\n }\n \n path.unshift(selector);\n current = current.parentElement;\n \n // Limit path depth to avoid overly long selectors\n if (path.length >= 5) break;\n }\n\n return path.join(' > ');\n }\n\n /**\n * Generate XPath for an element\n */\n private generateXPath(element: HTMLElement): string {\n if (!element) return '';\n\n // If element has an ID, use that for simpler XPath\n if (element.id) {\n return `//*[@id=\"${element.id}\"]`;\n }\n\n const paths: string[] = [];\n let currentElement: HTMLElement | null = element;\n\n while (currentElement && currentElement.nodeType === Node.ELEMENT_NODE) {\n let index = 0;\n let sibling: Element | null = currentElement;\n\n // Count preceding siblings of the same tag\n while (sibling) {\n sibling = sibling.previousElementSibling;\n if (sibling && sibling.nodeName === currentElement.nodeName) {\n index++;\n }\n }\n\n const tagName = currentElement.nodeName.toLowerCase();\n const pathIndex = index > 0 ? `[${index + 1}]` : '';\n paths.unshift(`${tagName}${pathIndex}`);\n\n currentElement = currentElement.parentElement;\n }\n\n return paths.length ? `/${paths.join('/')}` : '';\n }\n\n /**\n * Consider flushing batched events\n */\n private considerBatchFlush(): void {\n const totalEvents = this.pendingClicks.length + this.pendingScrolls.length;\n\n // Flush if we've hit the batch size\n if (totalEvents >= this.options.maxBatchSize) {\n this.flushPendingEvents();\n return;\n }\n\n // Otherwise, schedule a batch flush\n if (this.batchTimer === null && totalEvents > 0) {\n this.batchTimer = window.setTimeout(() => {\n this.flushPendingEvents();\n this.batchTimer = null;\n }, this.options.batchDelay);\n }\n }\n\n /**\n * Flush pending events\n */\n private flushPendingEvents(): void {\n if (this.isDestroyed) return;\n // v3: Always track events - consent only affects ID type (daily vs permanent)\n // Removed consent check that was blocking events in cookieless mode\n\n // Send click events\n if (this.pendingClicks.length > 0) {\n for (const clickData of this.pendingClicks) {\n this.tracker.trackSystemEvent('_grain_heatmap_click', {\n page_url: clickData.pageUrl,\n xpath: clickData.xpath,\n selector: clickData.selector,\n rel_x: clickData.relX,\n rel_y: clickData.relY,\n viewport_x: clickData.viewportX,\n viewport_y: clickData.viewportY,\n page_x: clickData.pageX,\n page_y: clickData.pageY,\n element_tag: clickData.elementTag,\n element_text: clickData.elementText,\n timestamp: clickData.timestamp,\n });\n }\n\n this.pendingClicks = [];\n }\n\n // Send scroll events\n if (this.pendingScrolls.length > 0) {\n for (const scrollData of this.pendingScrolls) {\n this.tracker.trackSystemEvent('_grain_heatmap_scroll', {\n page_url: scrollData.pageUrl,\n viewport_section: scrollData.viewportSection,\n scroll_depth_px: scrollData.scrollDepthPx,\n duration_ms: scrollData.durationMs,\n entry_timestamp: scrollData.entryTimestamp,\n exit_timestamp: scrollData.exitTimestamp,\n page_height: scrollData.pageHeight,\n viewport_height: scrollData.viewportHeight,\n });\n }\n\n this.pendingScrolls = [];\n }\n\n // Clear batch timer\n if (this.batchTimer !== null) {\n clearTimeout(this.batchTimer);\n this.batchTimer = null;\n }\n }\n\n /**\n * Flush pending events with beacon (for page unload)\n */\n private flushPendingEventsWithBeacon(): void {\n // v3: Always track events - consent only affects ID type (daily vs permanent)\n // Removed consent check that was blocking events in cookieless mode\n\n // Send click events with beacon\n if (this.pendingClicks.length > 0) {\n for (const clickData of this.pendingClicks) {\n this.tracker.trackSystemEvent('_grain_heatmap_click', {\n page_url: clickData.pageUrl,\n xpath: clickData.xpath,\n selector: clickData.selector,\n rel_x: clickData.relX,\n rel_y: clickData.relY,\n viewport_x: clickData.viewportX,\n viewport_y: clickData.viewportY,\n page_x: clickData.pageX,\n page_y: clickData.pageY,\n element_tag: clickData.elementTag,\n element_text: clickData.elementText,\n timestamp: clickData.timestamp,\n }, { flush: true });\n }\n\n this.pendingClicks = [];\n }\n\n // Send scroll events with beacon\n if (this.pendingScrolls.length > 0) {\n for (const scrollData of this.pendingScrolls) {\n this.tracker.trackSystemEvent('_grain_heatmap_scroll', {\n page_url: scrollData.pageUrl,\n viewport_section: scrollData.viewportSection,\n scroll_depth_px: scrollData.scrollDepthPx,\n duration_ms: scrollData.durationMs,\n entry_timestamp: scrollData.entryTimestamp,\n exit_timestamp: scrollData.exitTimestamp,\n page_height: scrollData.pageHeight,\n viewport_height: scrollData.viewportHeight,\n }, { flush: true });\n }\n\n this.pendingScrolls = [];\n }\n }\n\n /**\n * Log debug message\n */\n private log(...args: unknown[]): void {\n if (this.options.debug) {\n this.tracker.log('[Heatmap Tracking]', ...args);\n }\n }\n\n /**\n * Destroy the tracking manager\n */\n destroy(): void {\n this.isDestroyed = true;\n\n // Clear timers\n if (this.scrollDebounceTimer !== null) {\n clearTimeout(this.scrollDebounceTimer);\n this.scrollDebounceTimer = null;\n }\n\n if (this.batchTimer !== null) {\n clearTimeout(this.batchTimer);\n this.batchTimer = null;\n }\n\n if (this.scrollTrackingTimer !== null) {\n clearInterval(this.scrollTrackingTimer);\n this.scrollTrackingTimer = null;\n }\n\n if (this.periodicScrollTimer !== null) {\n clearInterval(this.periodicScrollTimer);\n this.periodicScrollTimer = null;\n }\n\n // Destroy attention quality manager\n this.attentionQuality.destroy();\n\n // Flush any remaining events\n this.flushPendingEvents();\n }\n}\n\n", "/**\n * Interaction Tracking Manager for Grain Analytics\n * Automatically attaches click and focus listeners to detected interactive elements\n */\n\nimport type { InteractionConfig } from './types/auto-tracking';\nimport { cleanElementText } from './text-utils';\n\nexport interface SendEventOptions {\n flush?: boolean;\n}\n\nexport interface InteractionTracker {\n track(eventName: string, properties?: Record<string, unknown>, options?: SendEventOptions): void | Promise<void>;\n hasConsent(category: 'analytics' | 'marketing' | 'functional'): boolean;\n log(...args: unknown[]): void;\n}\n\nexport interface InteractionTrackingConfig {\n debug?: boolean;\n enableMutationObserver?: boolean;\n mutationDebounceDelay?: number;\n tenantId?: string;\n apiUrl?: string;\n}\n\nexport class InteractionTrackingManager {\n private tracker: InteractionTracker;\n private interactions: InteractionConfig[];\n private config: InteractionTrackingConfig;\n private isDestroyed = false;\n private attachedListeners: Map<Element, Array<{ event: string; handler: EventListener }>> = new Map();\n private xpathCache: Map<string, Element | null> = new Map();\n private mutationObserver: MutationObserver | null = null;\n private mutationDebounceTimer: number | null = null;\n\n constructor(\n tracker: InteractionTracker,\n interactions: InteractionConfig[],\n config: InteractionTrackingConfig = {}\n ) {\n this.tracker = tracker;\n this.interactions = interactions;\n this.config = {\n debug: config.debug ?? false,\n enableMutationObserver: config.enableMutationObserver ?? true,\n mutationDebounceDelay: config.mutationDebounceDelay ?? 500,\n tenantId: config.tenantId,\n apiUrl: config.apiUrl,\n };\n\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Fetch and merge trackers if configured\n if (this.config.tenantId && this.config.apiUrl) {\n this.fetchAndMergeTrackers().then(() => {\n this.attachAllListeners();\n });\n } else {\n // Attach listeners after DOM is ready\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => this.attachAllListeners());\n } else {\n // DOM already loaded\n setTimeout(() => this.attachAllListeners(), 0);\n }\n }\n\n // Setup mutation observer for dynamic content\n if (this.config.enableMutationObserver) {\n this.setupMutationObserver();\n }\n }\n }\n \n /**\n * Fetch trackers from API and merge with existing interactions\n */\n private async fetchAndMergeTrackers(): Promise<void> {\n if (!this.config.tenantId || !this.config.apiUrl) return;\n \n try {\n const currentUrl = typeof window !== 'undefined' ? window.location.href : '';\n const url = `${this.config.apiUrl}/v1/client/${encodeURIComponent(this.config.tenantId)}/trackers?url=${encodeURIComponent(currentUrl)}`;\n \n this.log('Fetching trackers from:', url);\n \n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n \n if (!response.ok) {\n this.log('Failed to fetch trackers:', response.status);\n return;\n }\n \n const result = await response.json();\n \n if (result.trackers && Array.isArray(result.trackers)) {\n this.log('Fetched', result.trackers.length, 'trackers');\n \n // Convert trackers to InteractionConfig format\n const trackerInteractions: InteractionConfig[] = result.trackers.map((tracker: any) => ({\n eventName: tracker.eventName,\n selector: tracker.selector,\n priority: 5, // High priority for manually created trackers\n label: tracker.eventName,\n description: `Tracker: ${tracker.eventName}`,\n }));\n \n // Merge with existing interactions (trackers take precedence)\n this.interactions = [...trackerInteractions, ...this.interactions];\n \n this.log('Merged trackers, total interactions:', this.interactions.length);\n }\n } catch (error) {\n this.log('Error fetching trackers:', error);\n }\n }\n\n /**\n * Attach listeners to all configured interactions\n */\n private attachAllListeners(): void {\n if (this.isDestroyed) return;\n\n this.log('Attaching interaction listeners');\n\n for (const interaction of this.interactions) {\n this.attachInteractionListener(interaction);\n }\n }\n\n /**\n * Attach listener to a specific interaction\n */\n private attachInteractionListener(interaction: InteractionConfig): void {\n if (this.isDestroyed) return;\n\n const element = this.findElementByXPath(interaction.selector);\n \n if (!element) {\n this.log('Element not found for interaction:', interaction.eventName, 'selector:', interaction.selector);\n return;\n }\n\n // Check if we already attached listeners to this element for this interaction\n if (this.attachedListeners.has(element)) {\n this.log('Listeners already attached for element:', element);\n return;\n }\n\n const handlers: Array<{ event: string; handler: EventListener }> = [];\n\n // Click handler\n const clickHandler = (event: Event) => this.handleInteractionClick(interaction, event);\n element.addEventListener('click', clickHandler, { passive: true });\n handlers.push({ event: 'click', handler: clickHandler });\n\n // Focus handler (for form inputs)\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement || element instanceof HTMLSelectElement) {\n const focusHandler = (event: Event) => this.handleInteractionFocus(interaction, event);\n element.addEventListener('focus', focusHandler, { passive: true });\n handlers.push({ event: 'focus', handler: focusHandler });\n }\n\n this.attachedListeners.set(element, handlers);\n }\n\n /**\n * Handle click event on interaction\n */\n private handleInteractionClick(interaction: InteractionConfig, event: Event): void {\n if (this.isDestroyed) return;\n // v3: Always track events - consent only affects ID type (daily vs permanent)\n // Removed: if (!this.tracker.hasConsent('analytics')) return;\n\n const element = event.target as HTMLElement;\n \n // Check if this is a navigation link (has href attribute)\n const isNavigationLink = element instanceof HTMLAnchorElement && element.href;\n \n const eventProperties = {\n interaction_type: 'click',\n interaction_label: interaction.label,\n interaction_description: interaction.description,\n interaction_priority: interaction.priority,\n element_tag: element.tagName?.toLowerCase(),\n element_text: cleanElementText(element.textContent),\n element_id: element.id || undefined,\n element_class: element.className || undefined,\n ...(isNavigationLink && { href: element.href }),\n timestamp: Date.now(),\n };\n \n // Always use flush for auto-tracked clicks to ensure delivery\n // This is especially important for navigation links and quick interactions\n const result = this.tracker.track(interaction.eventName, eventProperties, { flush: true });\n if (result instanceof Promise) {\n result.catch((error: unknown) => {\n // Log error but don't block interaction\n this.log('Failed to track click:', error);\n });\n }\n }\n\n /**\n * Handle focus event on interaction (for form fields)\n */\n private handleInteractionFocus(interaction: InteractionConfig, event: Event): void {\n if (this.isDestroyed) return;\n // v3: Always track events - consent only affects ID type (daily vs permanent)\n // Removed: if (!this.tracker.hasConsent('analytics')) return;\n\n const element = event.target as HTMLElement;\n \n this.tracker.track(interaction.eventName, {\n interaction_type: 'focus',\n interaction_label: interaction.label,\n interaction_description: interaction.description,\n interaction_priority: interaction.priority,\n element_tag: element.tagName?.toLowerCase(),\n element_id: element.id || undefined,\n element_class: element.className || undefined,\n timestamp: Date.now(),\n });\n }\n\n /**\n * Find element by XPath selector\n */\n private findElementByXPath(xpath: string): Element | null {\n // Check cache first\n if (this.xpathCache.has(xpath)) {\n const cached = this.xpathCache.get(xpath);\n // Verify element is still in DOM\n if (cached && document.contains(cached)) {\n return cached;\n }\n // Clear invalid cache entry\n this.xpathCache.delete(xpath);\n }\n\n try {\n // Strip the xpath= prefix if present (from Stagehand selectors)\n let cleanXpath = xpath;\n if (xpath.startsWith('xpath=')) {\n cleanXpath = xpath.substring(6); // Remove 'xpath=' prefix\n }\n\n const result = document.evaluate(\n cleanXpath,\n document,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n \n const element = result.singleNodeValue as Element | null;\n \n // Cache the result (use original xpath as key)\n if (element) {\n this.xpathCache.set(xpath, element);\n }\n \n return element;\n } catch (error) {\n this.log('Error evaluating XPath:', xpath, error);\n return null;\n }\n }\n\n /**\n * Setup mutation observer to handle dynamic content\n */\n private setupMutationObserver(): void {\n if (typeof MutationObserver === 'undefined') {\n this.log('MutationObserver not supported');\n return;\n }\n\n this.mutationObserver = new MutationObserver((mutations) => {\n // Debounce the re-attachment\n if (this.mutationDebounceTimer !== null) {\n clearTimeout(this.mutationDebounceTimer);\n }\n\n this.mutationDebounceTimer = window.setTimeout(() => {\n this.handleMutations(mutations);\n this.mutationDebounceTimer = null;\n }, this.config.mutationDebounceDelay);\n });\n\n this.mutationObserver.observe(document.body, {\n childList: true,\n subtree: true,\n });\n\n this.log('Mutation observer setup');\n }\n\n /**\n * Handle DOM mutations\n */\n private handleMutations(mutations: MutationRecord[]): void {\n if (this.isDestroyed) return;\n\n // Clear XPath cache on mutations\n this.xpathCache.clear();\n\n // Check if any of our tracked elements were removed\n const removedElements = new Set<Element>();\n for (const mutation of mutations) {\n mutation.removedNodes.forEach((node) => {\n if (node instanceof Element) {\n removedElements.add(node);\n // Also check for child elements we were tracking\n this.attachedListeners.forEach((handlers, element) => {\n if (node.contains(element)) {\n removedElements.add(element);\n }\n });\n }\n });\n }\n\n // Clean up removed elements\n removedElements.forEach((element) => {\n this.detachListeners(element);\n });\n\n // Try to re-attach listeners for any interactions that might now be available\n this.attachAllListeners();\n }\n\n /**\n * Detach listeners from an element\n */\n private detachListeners(element: Element): void {\n const handlers = this.attachedListeners.get(element);\n if (!handlers) return;\n\n handlers.forEach(({ event, handler }) => {\n element.removeEventListener(event, handler);\n });\n\n this.attachedListeners.delete(element);\n }\n\n /**\n * Log debug messages\n */\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[InteractionTracking]', ...args);\n }\n }\n\n /**\n * Update interactions configuration\n */\n updateInteractions(interactions: InteractionConfig[]): void {\n if (this.isDestroyed) return;\n\n this.log('Updating interactions configuration');\n \n // Detach all existing listeners\n this.attachedListeners.forEach((handlers, element) => {\n this.detachListeners(element);\n });\n\n // Clear cache\n this.xpathCache.clear();\n\n // Update configuration\n this.interactions = interactions;\n\n // Reattach listeners\n this.attachAllListeners();\n }\n\n /**\n * Cleanup and destroy\n */\n destroy(): void {\n if (this.isDestroyed) return;\n\n this.log('Destroying interaction tracking manager');\n \n this.isDestroyed = true;\n\n // Clear debounce timer\n if (this.mutationDebounceTimer !== null) {\n clearTimeout(this.mutationDebounceTimer);\n this.mutationDebounceTimer = null;\n }\n\n // Disconnect mutation observer\n if (this.mutationObserver) {\n this.mutationObserver.disconnect();\n this.mutationObserver = null;\n }\n\n // Detach all listeners\n this.attachedListeners.forEach((handlers, element) => {\n this.detachListeners(element);\n });\n\n // Clear caches\n this.attachedListeners.clear();\n this.xpathCache.clear();\n }\n}\n\n", "/**\n * Section Tracking Manager for Grain Analytics\n * Intelligent scroll tracking with viewport metrics, visible sections, and engagement analysis\n */\n\nimport type { SectionConfig, SectionViewData, SectionTrackingOptions, SectionTrackingState } from './types/auto-tracking';\nimport { AttentionQualityManager } from './attention-quality';\nimport type { ActivityDetector } from './activity';\n\nexport interface SectionTracker {\n trackSystemEvent(eventName: string, properties: Record<string, unknown>): void;\n hasConsent(category: 'analytics' | 'marketing' | 'functional'): boolean;\n getActivityDetector(): ActivityDetector;\n log(...args: unknown[]): void;\n}\n\nconst DEFAULT_OPTIONS: SectionTrackingOptions = {\n minDwellTime: 1000, // 1 second minimum\n scrollVelocityThreshold: 500, // 500px/s\n intersectionThreshold: 0.1, // 10% visible\n debounceDelay: 100,\n batchDelay: 2000, // 2 seconds\n debug: false,\n};\n\nexport class SectionTrackingManager {\n private tracker: SectionTracker;\n private sections: SectionConfig[];\n private options: SectionTrackingOptions;\n private isDestroyed = false;\n \n // Tracking state\n private sectionStates: Map<string, SectionTrackingState> = new Map();\n private intersectionObserver: IntersectionObserver | null = null;\n private xpathCache: Map<string, Element | null> = new Map();\n \n // Scroll tracking\n private lastScrollPosition = 0;\n private lastScrollTime = Date.now();\n private scrollVelocity = 0;\n private scrollDebounceTimer: number | null = null;\n \n // Event batching\n private pendingEvents: SectionViewData[] = [];\n private batchTimer: number | null = null;\n\n // Periodic tracking for long-duration views\n private sectionTimers: Map<string, number> = new Map(); // sectionName -> timer ID\n private readonly SPLIT_DURATION = 3000; // 3 seconds\n\n // Attention quality management\n private attentionQuality: AttentionQualityManager;\n\n constructor(\n tracker: SectionTracker,\n sections: SectionConfig[],\n options: Partial<SectionTrackingOptions> = {}\n ) {\n this.tracker = tracker;\n this.sections = sections;\n this.options = { ...DEFAULT_OPTIONS, ...options };\n\n // Initialize attention quality manager\n this.attentionQuality = new AttentionQualityManager(\n tracker.getActivityDetector(),\n {\n maxSectionDuration: 9000, // 9 seconds\n minScrollDistance: 100, // 100 pixels\n idleThreshold: 30000, // 30 seconds\n debug: this.options.debug,\n }\n );\n\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Initialize after DOM is ready\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => this.initialize());\n } else {\n setTimeout(() => this.initialize(), 0);\n }\n }\n }\n\n /**\n * Initialize section tracking\n */\n private initialize(): void {\n if (this.isDestroyed) return;\n\n this.log('Initializing section tracking');\n\n // Setup intersection observer\n this.setupIntersectionObserver();\n\n // Setup scroll listener for velocity tracking\n this.setupScrollListener();\n\n // Initialize sections\n this.initializeSections();\n }\n\n /**\n * Setup IntersectionObserver for section visibility\n */\n private setupIntersectionObserver(): void {\n if (typeof IntersectionObserver === 'undefined') {\n this.log('IntersectionObserver not supported');\n return;\n }\n\n this.intersectionObserver = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n this.handleIntersection(entry);\n });\n },\n {\n threshold: [0, 0.1, 0.25, 0.5, 0.75, 1.0],\n rootMargin: '0px',\n }\n );\n\n this.log('IntersectionObserver created');\n }\n\n /**\n * Setup scroll listener for velocity calculation\n */\n private setupScrollListener(): void {\n if (typeof window === 'undefined') return;\n\n const scrollHandler = () => {\n if (this.scrollDebounceTimer !== null) {\n clearTimeout(this.scrollDebounceTimer);\n }\n\n this.scrollDebounceTimer = window.setTimeout(() => {\n this.updateScrollVelocity();\n this.scrollDebounceTimer = null;\n }, this.options.debounceDelay);\n };\n\n window.addEventListener('scroll', scrollHandler, { passive: true });\n this.log('Scroll listener attached');\n }\n\n /**\n * Initialize sections and start observing\n */\n private initializeSections(): void {\n for (const section of this.sections) {\n const element = this.findElementByXPath(section.selector);\n \n if (!element) {\n this.log('Section element not found:', section.sectionName, 'selector:', section.selector);\n continue;\n }\n\n // Initialize state\n const state: SectionTrackingState = {\n element,\n config: section,\n entryTime: null,\n exitTime: null,\n isVisible: false,\n lastScrollPosition: window.scrollY,\n lastScrollTime: Date.now(),\n entryScrollSpeed: 0,\n exitScrollSpeed: 0,\n maxVisibleArea: 0,\n };\n\n this.sectionStates.set(section.sectionName, state);\n\n // Start observing\n if (this.intersectionObserver) {\n this.intersectionObserver.observe(element);\n }\n }\n }\n\n /**\n * Handle intersection observer entry\n */\n private handleIntersection(entry: IntersectionObserverEntry): void {\n if (this.isDestroyed) return;\n\n // Find which section this element belongs to\n const state = Array.from(this.sectionStates.values()).find(\n (s) => s.element === entry.target\n );\n\n if (!state) return;\n\n const isVisible = entry.isIntersecting && entry.intersectionRatio >= this.options.intersectionThreshold;\n const visibleArea = entry.intersectionRatio;\n\n // Update max visible area\n if (visibleArea > state.maxVisibleArea) {\n state.maxVisibleArea = visibleArea;\n }\n\n // Handle visibility change\n if (isVisible && !state.isVisible) {\n // Section became visible\n this.handleSectionEntry(state);\n } else if (!isVisible && state.isVisible) {\n // Section became invisible\n this.handleSectionExit(state);\n }\n\n state.isVisible = isVisible;\n }\n\n /**\n * Handle section entry (became visible)\n */\n private handleSectionEntry(state: SectionTrackingState): void {\n state.entryTime = Date.now();\n state.entryScrollSpeed = this.scrollVelocity;\n state.lastScrollPosition = window.scrollY;\n state.lastScrollTime = Date.now();\n state.maxVisibleArea = 0;\n \n // Start periodic tracking timer (3 second intervals)\n this.startPeriodicTracking(state);\n }\n \n /**\n * Start periodic tracking for a section (sends events every 3 seconds)\n */\n private startPeriodicTracking(state: SectionTrackingState): void {\n // Clear any existing timer for this section\n this.stopPeriodicTracking(state.config.sectionName);\n \n const timerId = window.setInterval(() => {\n if (this.isDestroyed || !state.isVisible || state.entryTime === null) {\n this.stopPeriodicTracking(state.config.sectionName);\n return;\n }\n \n const now = Date.now();\n const duration = now - state.entryTime;\n \n // Only track if minimum dwell time has passed\n if (duration >= this.options.minDwellTime) {\n // Check attention quality policies\n const currentScrollY = window.scrollY;\n const attentionCheck = this.attentionQuality.shouldTrackSection(\n state.config.sectionName,\n currentScrollY\n );\n\n // If attention was reset due to scroll, reset our entry time\n if (attentionCheck.resetAttention) {\n this.log(`Section \"${state.config.sectionName}\": Attention reset, restarting timer`);\n state.entryTime = now;\n state.entryScrollSpeed = this.scrollVelocity;\n return;\n }\n\n // If tracking is not allowed (page hidden, idle, or max duration reached)\n if (!attentionCheck.shouldTrack) {\n this.log(`Section \"${state.config.sectionName}\": Tracking paused - ${attentionCheck.reason}`);\n return;\n }\n\n // Create partial section view data\n const viewData: SectionViewData = {\n sectionName: state.config.sectionName,\n sectionType: state.config.sectionType,\n entryTime: state.entryTime,\n exitTime: now, // Current time as \"exit\" for this split\n duration,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n scrollDepth: this.calculateScrollDepth(),\n visibleAreaPercentage: Math.round(state.maxVisibleArea * 100),\n scrollSpeedAtEntry: state.entryScrollSpeed,\n scrollSpeedAtExit: this.scrollVelocity,\n };\n \n // Track this split immediately (don't queue for batching)\n if (this.shouldTrackSection(viewData)) {\n this.tracker.trackSystemEvent('_grain_section_view', {\n section_name: viewData.sectionName,\n section_type: viewData.sectionType,\n duration_ms: viewData.duration,\n viewport_width: viewData.viewportWidth,\n viewport_height: viewData.viewportHeight,\n scroll_depth_percent: viewData.scrollDepth,\n visible_area_percent: viewData.visibleAreaPercentage,\n scroll_speed_entry: Math.round(viewData.scrollSpeedAtEntry || 0),\n scroll_speed_exit: Math.round(viewData.scrollSpeedAtExit || 0),\n entry_timestamp: viewData.entryTime,\n exit_timestamp: viewData.exitTime,\n is_split: true, // Flag to indicate this is a periodic split, not final exit\n });\n \n // Update attention quality duration tracker\n this.attentionQuality.updateSectionDuration(state.config.sectionName, duration);\n \n // Reset entry time for next split (but keep tracking)\n state.entryTime = now;\n state.entryScrollSpeed = this.scrollVelocity;\n }\n }\n }, this.SPLIT_DURATION);\n \n this.sectionTimers.set(state.config.sectionName, timerId);\n }\n \n /**\n * Stop periodic tracking for a section\n */\n private stopPeriodicTracking(sectionName: string): void {\n const timerId = this.sectionTimers.get(sectionName);\n if (timerId !== undefined) {\n clearInterval(timerId);\n this.sectionTimers.delete(sectionName);\n }\n }\n\n /**\n * Handle section exit (became invisible)\n */\n private handleSectionExit(state: SectionTrackingState): void {\n // Stop periodic tracking\n this.stopPeriodicTracking(state.config.sectionName);\n \n // Reset attention for this section\n this.attentionQuality.resetSection(state.config.sectionName);\n \n if (state.entryTime === null) return;\n\n state.exitTime = Date.now();\n state.exitScrollSpeed = this.scrollVelocity;\n\n const duration = state.exitTime - state.entryTime;\n\n // Create section view data\n const viewData: SectionViewData = {\n sectionName: state.config.sectionName,\n sectionType: state.config.sectionType,\n entryTime: state.entryTime,\n exitTime: state.exitTime,\n duration,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n scrollDepth: this.calculateScrollDepth(),\n visibleAreaPercentage: Math.round(state.maxVisibleArea * 100),\n scrollSpeedAtEntry: state.entryScrollSpeed,\n scrollSpeedAtExit: state.exitScrollSpeed,\n };\n\n // Apply sanitization and track if valid\n if (this.shouldTrackSection(viewData)) {\n this.queueSectionView(viewData);\n } else {\n this.log('Section view filtered out:', state.config.sectionName, 'duration:', duration);\n }\n\n // Reset entry time\n state.entryTime = null;\n }\n\n /**\n * Update scroll velocity\n */\n private updateScrollVelocity(): void {\n const now = Date.now();\n const currentPosition = window.scrollY;\n \n const timeDelta = now - this.lastScrollTime;\n const positionDelta = Math.abs(currentPosition - this.lastScrollPosition);\n \n if (timeDelta > 0) {\n this.scrollVelocity = (positionDelta / timeDelta) * 1000; // pixels per second\n }\n \n this.lastScrollPosition = currentPosition;\n this.lastScrollTime = now;\n }\n\n /**\n * Calculate current scroll depth as percentage\n */\n private calculateScrollDepth(): number {\n if (typeof window === 'undefined' || typeof document === 'undefined') return 0;\n\n const windowHeight = window.innerHeight;\n const documentHeight = Math.max(\n document.body.scrollHeight,\n document.body.offsetHeight,\n document.documentElement.clientHeight,\n document.documentElement.scrollHeight,\n document.documentElement.offsetHeight\n );\n \n const scrollTop = window.scrollY;\n const scrollableHeight = documentHeight - windowHeight;\n \n if (scrollableHeight <= 0) return 100;\n \n return Math.round((scrollTop / scrollableHeight) * 100);\n }\n\n /**\n * Determine if section view should be tracked (sanitization)\n */\n private shouldTrackSection(viewData: SectionViewData): boolean {\n // Minimum dwell time check\n if (viewData.duration < this.options.minDwellTime) {\n return false;\n }\n\n // Check if user was rapidly scrolling through\n const avgScrollSpeed = (viewData.scrollSpeedAtEntry! + viewData.scrollSpeedAtExit!) / 2;\n if (avgScrollSpeed > this.options.scrollVelocityThreshold * 2) {\n // Very fast scroll - likely not engaged\n return false;\n }\n\n // Must have had some meaningful visible area\n if (viewData.visibleAreaPercentage < 10) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Queue section view for batching\n */\n private queueSectionView(viewData: SectionViewData): void {\n this.pendingEvents.push(viewData);\n\n // Setup batch timer if not already set\n if (this.batchTimer === null) {\n this.batchTimer = window.setTimeout(() => {\n this.flushPendingEvents();\n }, this.options.batchDelay);\n }\n }\n\n /**\n * Flush pending section view events\n */\n private flushPendingEvents(): void {\n if (this.isDestroyed || this.pendingEvents.length === 0) return;\n // v3: Always track events - consent only affects ID type (daily vs permanent)\n // Removed consent check that was blocking events in cookieless mode\n\n // Track each section view\n for (const viewData of this.pendingEvents) {\n this.tracker.trackSystemEvent('_grain_section_view', {\n section_name: viewData.sectionName,\n section_type: viewData.sectionType,\n duration_ms: viewData.duration,\n viewport_width: viewData.viewportWidth,\n viewport_height: viewData.viewportHeight,\n scroll_depth_percent: viewData.scrollDepth,\n visible_area_percent: viewData.visibleAreaPercentage,\n scroll_speed_entry: Math.round(viewData.scrollSpeedAtEntry || 0),\n scroll_speed_exit: Math.round(viewData.scrollSpeedAtExit || 0),\n entry_timestamp: viewData.entryTime,\n exit_timestamp: viewData.exitTime,\n });\n }\n\n // Clear pending events\n this.pendingEvents = [];\n this.batchTimer = null;\n }\n\n /**\n * Find element by XPath selector\n */\n private findElementByXPath(xpath: string): Element | null {\n // Check cache first\n if (this.xpathCache.has(xpath)) {\n const cached = this.xpathCache.get(xpath);\n if (cached && document.contains(cached)) {\n return cached;\n }\n this.xpathCache.delete(xpath);\n }\n\n try {\n // Strip the xpath= prefix if present (from Stagehand selectors)\n let cleanXpath = xpath;\n if (xpath.startsWith('xpath=')) {\n cleanXpath = xpath.substring(6); // Remove 'xpath=' prefix\n }\n\n const result = document.evaluate(\n cleanXpath,\n document,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n \n const element = result.singleNodeValue as Element | null;\n \n // Cache the result (use original xpath as key)\n if (element) {\n this.xpathCache.set(xpath, element);\n }\n \n return element;\n } catch (error) {\n this.log('Error evaluating XPath:', xpath, error);\n return null;\n }\n }\n\n /**\n * Log debug messages\n */\n private log(...args: unknown[]): void {\n if (this.options.debug) {\n console.log('[SectionTracking]', ...args);\n }\n }\n\n /**\n * Update sections configuration\n */\n updateSections(sections: SectionConfig[]): void {\n if (this.isDestroyed) return;\n\n this.log('Updating sections configuration');\n \n // Disconnect observer\n if (this.intersectionObserver) {\n this.intersectionObserver.disconnect();\n }\n\n // Clear state\n this.sectionStates.clear();\n this.xpathCache.clear();\n\n // Update configuration\n this.sections = sections;\n\n // Reinitialize\n this.setupIntersectionObserver();\n this.initializeSections();\n }\n\n /**\n * Cleanup and destroy\n */\n destroy(): void {\n if (this.isDestroyed) return;\n\n this.log('Destroying section tracking manager');\n \n this.isDestroyed = true;\n\n // Stop all periodic tracking timers\n this.sectionTimers.forEach((timerId) => {\n clearInterval(timerId);\n });\n this.sectionTimers.clear();\n\n // Flush any pending events\n this.flushPendingEvents();\n\n // Clear timers\n if (this.scrollDebounceTimer !== null) {\n clearTimeout(this.scrollDebounceTimer);\n this.scrollDebounceTimer = null;\n }\n\n if (this.batchTimer !== null) {\n clearTimeout(this.batchTimer);\n this.batchTimer = null;\n }\n\n // Disconnect intersection observer\n if (this.intersectionObserver) {\n this.intersectionObserver.disconnect();\n this.intersectionObserver = null;\n }\n\n // Destroy attention quality manager\n this.attentionQuality.destroy();\n\n // Clear state\n this.sectionStates.clear();\n this.xpathCache.clear();\n this.pendingEvents = [];\n }\n}\n\n", "/**\n * Debug Agent for Visual Event Tracking\n * Provides a toolbar and element inspection mode for creating event trackers\n */\n\nexport interface DebugAgentConfig {\n debug?: boolean;\n}\n\nexport interface Tracker {\n track(eventName: string, properties?: Record<string, unknown>): void | Promise<void>;\n log(...args: unknown[]): void;\n}\n\nexport interface ExistingTracker {\n trackerId: string;\n name: string;\n type: string;\n selector: string;\n urlScope: string;\n urlPattern?: string;\n isEnabled: boolean;\n}\n\nexport class DebugAgent {\n private tracker: Tracker;\n private sessionId: string;\n private tenantId: string;\n private apiUrl: string;\n private config: DebugAgentConfig;\n private isDestroyed = false;\n \n // UI state\n private isInspectMode = false;\n private showTrackers = false;\n private selectedElement: Element | null = null;\n private toolbarElement: HTMLElement | null = null;\n private panelElement: HTMLElement | null = null;\n private highlightElement: HTMLElement | null = null;\n private existingTrackers: ExistingTracker[] = [];\n private trackerHighlights: HTMLElement[] = [];\n \n // Dragging state\n private isDragging = false;\n private dragStartX = 0;\n private dragStartY = 0;\n private toolbarStartX = 0;\n private toolbarStartY = 0;\n \n // Event listeners\n private mouseMoveListener: ((e: MouseEvent) => void) | null = null;\n private clickListener: ((e: MouseEvent) => void) | null = null;\n private dragMoveListener: ((e: MouseEvent) => void) | null = null;\n private dragEndListener: ((e: MouseEvent) => void) | null = null;\n\n constructor(\n tracker: Tracker,\n sessionId: string,\n tenantId: string,\n apiUrl: string,\n config: DebugAgentConfig = {}\n ) {\n this.tracker = tracker;\n this.sessionId = sessionId;\n this.tenantId = tenantId;\n this.apiUrl = apiUrl;\n this.config = {\n debug: config.debug ?? false,\n };\n\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n this.initialize();\n }\n }\n\n /**\n * Initialize the debug agent\n */\n private async initialize(): Promise<void> {\n this.log('Initializing debug agent');\n await this.loadExistingTrackers();\n this.showToolbar();\n this.createHighlightElement();\n \n // Show trackers by default\n this.showTrackers = true;\n this.showTrackerHighlights();\n this.showTrackersList();\n }\n\n /**\n * Load existing trackers from API\n */\n private async loadExistingTrackers(): Promise<void> {\n try {\n const url = `${this.apiUrl}/v1/tenant/${encodeURIComponent(this.tenantId)}/trackers`;\n const response = await fetch(url);\n\n if (response.ok) {\n this.existingTrackers = await response.json();\n this.log('Loaded trackers:', this.existingTrackers);\n }\n } catch (error) {\n this.log('Failed to load trackers:', error);\n this.existingTrackers = [];\n }\n }\n\n /**\n * Show the debug toolbar\n */\n private showToolbar(): void {\n if (this.toolbarElement) return;\n\n const toolbar = document.createElement('div');\n toolbar.id = 'grain-debug-toolbar';\n toolbar.innerHTML = `\n <style>\n #grain-debug-toolbar {\n position: fixed;\n bottom: 20px;\n right: 20px;\n background: repeating-linear-gradient(\n 45deg,\n #fbbf24,\n #fbbf24 10px,\n #1e293b 10px,\n #1e293b 20px\n );\n border: 2px solid #1e293b;\n border-radius: 12px;\n padding: 6px;\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2), 0 2px 8px rgba(0, 0, 0, 0.1);\n z-index: 999999;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 13px;\n }\n \n .grain-toolbar-inner {\n display: flex;\n align-items: center;\n gap: 12px;\n background: white;\n border-radius: 6px;\n padding: 8px 12px;\n }\n \n #grain-debug-toolbar.dragging {\n cursor: move;\n user-select: none;\n }\n \n .grain-toolbar-header {\n display: flex;\n align-items: center;\n cursor: move;\n user-select: none;\n padding: 6px 10px;\n background: #1e293b;\n border-radius: 4px;\n margin-right: 4px;\n }\n \n .grain-toolbar-title {\n font-size: 11px;\n font-weight: 700;\n letter-spacing: 1.2px;\n text-transform: uppercase;\n color: #fbbf24;\n }\n \n .grain-toolbar-body {\n display: flex;\n align-items: center;\n gap: 10px;\n flex: 1;\n }\n \n .grain-toolbar-stats {\n display: flex;\n gap: 12px;\n padding: 6px 10px;\n background: #f8fafc;\n border-radius: 4px;\n margin-right: 4px;\n }\n \n .grain-stat {\n display: flex;\n align-items: baseline;\n gap: 6px;\n }\n \n .grain-stat-value {\n font-size: 18px;\n font-weight: 700;\n color: #1e293b;\n }\n \n .grain-stat-label {\n font-size: 11px;\n color: #64748b;\n font-weight: 500;\n }\n \n .grain-toolbar-actions {\n display: flex;\n gap: 8px;\n align-items: center;\n }\n \n #grain-debug-toolbar button {\n background: white;\n border: 1.5px solid #e2e8f0;\n color: #475569;\n padding: 8px 14px;\n border-radius: 8px;\n cursor: pointer;\n font-size: 12px;\n font-weight: 600;\n transition: all 0.2s;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n white-space: nowrap;\n }\n \n #grain-debug-toolbar button:hover {\n background: #f8fafc;\n border-color: #cbd5e1;\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);\n }\n \n #grain-debug-toolbar button.active {\n background: #fbbf24;\n color: #1e293b;\n border-color: #fbbf24;\n box-shadow: 0 2px 8px rgba(251, 191, 36, 0.3);\n }\n \n #grain-debug-toolbar button.danger {\n background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);\n border-color: #ef4444;\n color: white;\n }\n \n #grain-debug-toolbar button.danger:hover {\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(239, 68, 68, 0.25);\n }\n \n .grain-debug-highlight {\n position: absolute;\n pointer-events: none;\n border: 2px solid #10b981;\n background: rgba(16, 185, 129, 0.1);\n z-index: 999998;\n transition: all 0.1s;\n }\n \n .grain-tracker-highlight {\n position: absolute;\n pointer-events: none;\n border: 2px solid #6366f1;\n background: rgba(99, 102, 241, 0.08);\n z-index: 999997;\n transition: opacity 0.2s;\n }\n \n .grain-tracker-label {\n position: absolute;\n top: -28px;\n left: 0;\n background: #6366f1;\n color: white;\n padding: 4px 10px;\n border-radius: 6px;\n font-size: 11px;\n font-weight: 600;\n white-space: nowrap;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n pointer-events: none;\n }\n \n .grain-tracker-label::after {\n content: '';\n position: absolute;\n bottom: -4px;\n left: 10px;\n width: 0;\n height: 0;\n border-left: 4px solid transparent;\n border-right: 4px solid transparent;\n border-top: 4px solid #6366f1;\n }\n \n .grain-trackers-list {\n position: fixed;\n bottom: 80px;\n right: 20px;\n background: white;\n border: 1.5px solid #e2e8f0;\n border-radius: 10px;\n padding: 12px;\n max-height: 400px;\n width: 320px;\n overflow-y: auto;\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1), 0 2px 8px rgba(0, 0, 0, 0.06);\n z-index: 999998;\n }\n \n .grain-tracker-item {\n padding: 10px;\n background: #f8fafc;\n border-radius: 8px;\n margin-bottom: 8px;\n cursor: pointer;\n transition: all 0.2s;\n }\n \n .grain-tracker-item:hover {\n background: #f1f5f9;\n transform: translateX(4px);\n }\n \n .grain-tracker-item:last-child {\n margin-bottom: 0;\n }\n \n .grain-tracker-name {\n font-weight: 600;\n color: #1e293b;\n font-size: 13px;\n margin-bottom: 4px;\n }\n \n .grain-tracker-details {\n font-size: 11px;\n color: #64748b;\n display: flex;\n gap: 8px;\n align-items: center;\n }\n \n .grain-tracker-type {\n background: #dbeafe;\n color: #1e40af;\n padding: 2px 6px;\n border-radius: 4px;\n font-weight: 600;\n text-transform: uppercase;\n font-size: 9px;\n letter-spacing: 0.5px;\n }\n </style>\n <div class=\"grain-toolbar-inner\">\n <div class=\"grain-toolbar-header\" id=\"grain-toolbar-handle\">\n <div class=\"grain-toolbar-title\">Grain Debug</div>\n </div>\n <div class=\"grain-toolbar-body\">\n <div class=\"grain-toolbar-stats\">\n <div class=\"grain-stat\">\n <div class=\"grain-stat-value\">${this.existingTrackers.length}</div>\n <div class=\"grain-stat-label\">trackers</div>\n </div>\n <div class=\"grain-stat\">\n <div class=\"grain-stat-value\">${this.existingTrackers.filter(t => t.isEnabled).length}</div>\n <div class=\"grain-stat-label\">active</div>\n </div>\n </div>\n <div class=\"grain-toolbar-actions\">\n <button id=\"grain-debug-inspect\" type=\"button\">\n + New\n </button>\n <button id=\"grain-debug-trackers\" class=\"active\" type=\"button\">\n Hide\n </button>\n <button id=\"grain-debug-end\" class=\"danger\" type=\"button\">\n End Session\n </button>\n </div>\n </div>\n </div>\n <div id=\"grain-trackers-list-container\"></div>\n `;\n\n document.body.appendChild(toolbar);\n this.toolbarElement = toolbar;\n\n // Setup dragging\n const handle = toolbar.querySelector('#grain-toolbar-handle') as HTMLElement;\n if (handle) {\n handle.addEventListener('mousedown', (e) => this.startDrag(e));\n }\n\n // Add event listeners\n const inspectBtn = toolbar.querySelector('#grain-debug-inspect');\n const trackersBtn = toolbar.querySelector('#grain-debug-trackers');\n const endBtn = toolbar.querySelector('#grain-debug-end');\n\n if (inspectBtn) {\n inspectBtn.addEventListener('click', () => this.toggleInspectMode());\n }\n\n if (trackersBtn) {\n trackersBtn.addEventListener('click', () => this.toggleTrackerView());\n }\n\n if (endBtn) {\n endBtn.addEventListener('click', () => this.endDebug());\n }\n\n this.log('Toolbar shown');\n }\n\n /**\n * Create highlight element for hovering\n */\n private createHighlightElement(): void {\n if (this.highlightElement) return;\n\n const highlight = document.createElement('div');\n highlight.className = 'grain-debug-highlight';\n highlight.style.display = 'none';\n document.body.appendChild(highlight);\n this.highlightElement = highlight;\n }\n\n /**\n * Start dragging the toolbar\n */\n private startDrag(e: MouseEvent): void {\n if (!this.toolbarElement) return;\n \n this.isDragging = true;\n this.dragStartX = e.clientX;\n this.dragStartY = e.clientY;\n \n const rect = this.toolbarElement.getBoundingClientRect();\n this.toolbarStartX = rect.left;\n this.toolbarStartY = rect.top;\n \n this.toolbarElement.classList.add('dragging');\n \n this.dragMoveListener = (e: MouseEvent) => this.onDrag(e);\n this.dragEndListener = () => this.endDrag();\n \n document.addEventListener('mousemove', this.dragMoveListener);\n document.addEventListener('mouseup', this.dragEndListener);\n }\n\n /**\n * Handle drag movement\n */\n private onDrag(e: MouseEvent): void {\n if (!this.isDragging || !this.toolbarElement) return;\n \n const deltaX = e.clientX - this.dragStartX;\n const deltaY = e.clientY - this.dragStartY;\n \n const newX = this.toolbarStartX + deltaX;\n const newY = this.toolbarStartY + deltaY;\n \n // Keep toolbar within viewport\n const maxX = window.innerWidth - this.toolbarElement.offsetWidth;\n const maxY = window.innerHeight - this.toolbarElement.offsetHeight;\n \n const clampedX = Math.max(0, Math.min(newX, maxX));\n const clampedY = Math.max(0, Math.min(newY, maxY));\n \n this.toolbarElement.style.left = `${clampedX}px`;\n this.toolbarElement.style.top = `${clampedY}px`;\n this.toolbarElement.style.right = 'auto';\n this.toolbarElement.style.bottom = 'auto';\n }\n\n /**\n * End dragging\n */\n private endDrag(): void {\n if (!this.isDragging) return;\n \n this.isDragging = false;\n \n if (this.toolbarElement) {\n this.toolbarElement.classList.remove('dragging');\n }\n \n if (this.dragMoveListener) {\n document.removeEventListener('mousemove', this.dragMoveListener);\n this.dragMoveListener = null;\n }\n \n if (this.dragEndListener) {\n document.removeEventListener('mouseup', this.dragEndListener);\n this.dragEndListener = null;\n }\n }\n\n /**\n * Toggle tracker view\n */\n private toggleTrackerView(): void {\n this.showTrackers = !this.showTrackers;\n \n const trackersBtn = document.querySelector('#grain-debug-trackers');\n if (trackersBtn) {\n trackersBtn.textContent = this.showTrackers ? 'Hide' : 'View';\n trackersBtn.classList.toggle('active', this.showTrackers);\n }\n \n if (this.showTrackers) {\n this.showTrackerHighlights();\n this.showTrackersList();\n } else {\n this.hideTrackerHighlights();\n this.hideTrackersList();\n }\n }\n\n /**\n * Show tracker highlights on page\n */\n private showTrackerHighlights(): void {\n this.hideTrackerHighlights();\n \n for (const tracker of this.existingTrackers) {\n if (!tracker.isEnabled) continue;\n \n try {\n const element = this.findElementBySelector(tracker.selector);\n if (!element) continue;\n \n const rect = element.getBoundingClientRect();\n const highlight = document.createElement('div');\n highlight.className = 'grain-tracker-highlight';\n \n const label = document.createElement('div');\n label.className = 'grain-tracker-label';\n label.textContent = tracker.name;\n \n highlight.style.top = `${rect.top + window.scrollY}px`;\n highlight.style.left = `${rect.left + window.scrollX}px`;\n highlight.style.width = `${rect.width}px`;\n highlight.style.height = `${rect.height}px`;\n \n highlight.appendChild(label);\n document.body.appendChild(highlight);\n this.trackerHighlights.push(highlight);\n } catch (error) {\n this.log('Failed to highlight tracker:', tracker.name, error);\n }\n }\n }\n\n /**\n * Hide tracker highlights\n */\n private hideTrackerHighlights(): void {\n for (const highlight of this.trackerHighlights) {\n highlight.remove();\n }\n this.trackerHighlights = [];\n }\n\n /**\n * Show trackers list\n */\n private showTrackersList(): void {\n // Check if list already exists\n let list = document.querySelector('.grain-trackers-list') as HTMLElement;\n \n if (this.existingTrackers.length === 0) {\n if (list) list.remove();\n return;\n }\n \n if (!list) {\n list = document.createElement('div');\n list.className = 'grain-trackers-list';\n document.body.appendChild(list);\n }\n \n list.innerHTML = `\n ${this.existingTrackers.map(tracker => `\n <div class=\"grain-tracker-item\" data-tracker-id=\"${tracker.trackerId}\">\n <div class=\"grain-tracker-name\">${tracker.name}</div>\n <div class=\"grain-tracker-details\">\n <span class=\"grain-tracker-type\">${tracker.type}</span>\n <span>${tracker.urlScope}</span>\n ${!tracker.isEnabled ? '<span style=\"color: #ef4444;\">\u2022 Disabled</span>' : ''}\n </div>\n </div>\n `).join('')}\n `;\n \n // Add click handlers to scroll to elements\n list.querySelectorAll('.grain-tracker-item').forEach(item => {\n item.addEventListener('click', () => {\n const trackerId = item.getAttribute('data-tracker-id');\n const tracker = this.existingTrackers.find(t => t.trackerId === trackerId);\n if (tracker) {\n this.scrollToTracker(tracker);\n }\n });\n });\n }\n\n /**\n * Hide trackers list\n */\n private hideTrackersList(): void {\n const list = document.querySelector('.grain-trackers-list');\n if (list) {\n list.remove();\n }\n }\n\n /**\n * Scroll to and highlight a tracker element\n */\n private scrollToTracker(tracker: ExistingTracker): void {\n try {\n const element = this.findElementBySelector(tracker.selector);\n if (element) {\n element.scrollIntoView({ behavior: 'smooth', block: 'center' });\n \n // Flash the highlight\n const highlight = this.trackerHighlights.find(h => {\n const rect = element.getBoundingClientRect();\n const hRect = h.getBoundingClientRect();\n return Math.abs(hRect.top - rect.top) < 5;\n });\n \n if (highlight) {\n highlight.style.opacity = '0';\n setTimeout(() => {\n highlight.style.opacity = '1';\n }, 100);\n setTimeout(() => {\n highlight.style.opacity = '0';\n }, 300);\n setTimeout(() => {\n highlight.style.opacity = '1';\n }, 500);\n }\n }\n } catch (error) {\n this.log('Failed to scroll to tracker:', error);\n }\n }\n\n /**\n * Find element by XPath selector\n */\n private findElementBySelector(selector: string): Element | null {\n try {\n const result = document.evaluate(\n selector,\n document,\n null,\n XPathResult.FIRST_ORDERED_NODE_TYPE,\n null\n );\n return result.singleNodeValue as Element | null;\n } catch (error) {\n this.log('Failed to find element:', error);\n return null;\n }\n }\n\n /**\n * Toggle inspect mode\n */\n private toggleInspectMode(): void {\n if (this.isInspectMode) {\n this.disableInspectMode();\n } else {\n this.enableInspectMode();\n }\n }\n\n /**\n * Enable element inspection mode\n */\n private enableInspectMode(): void {\n if (this.isInspectMode) return;\n\n this.log('Enabling inspect mode');\n this.isInspectMode = true;\n\n // Update button state\n const inspectBtn = document.querySelector('#grain-debug-inspect');\n if (inspectBtn) {\n inspectBtn.classList.add('active');\n inspectBtn.textContent = 'Click Element';\n }\n\n // Add event listeners\n this.mouseMoveListener = (e: MouseEvent) => this.handleMouseMove(e);\n this.clickListener = (e: MouseEvent) => this.handleElementClick(e);\n\n document.addEventListener('mousemove', this.mouseMoveListener, true);\n document.addEventListener('click', this.clickListener, true);\n \n // Add ESC key listener to exit inspect mode\n document.addEventListener('keydown', this.handleEscapeKey);\n }\n\n /**\n * Handle ESC key to exit inspect mode\n */\n private handleEscapeKey = (e: KeyboardEvent): void => {\n if (e.key === 'Escape' && this.isInspectMode) {\n this.disableInspectMode();\n }\n };\n\n /**\n * Disable element inspection mode\n */\n private disableInspectMode(): void {\n if (!this.isInspectMode) return;\n\n this.log('Disabling inspect mode');\n this.isInspectMode = false;\n\n // Update button state\n const inspectBtn = document.querySelector('#grain-debug-inspect');\n if (inspectBtn) {\n inspectBtn.classList.remove('active');\n inspectBtn.textContent = '+ New';\n }\n\n // Remove event listeners\n if (this.mouseMoveListener) {\n document.removeEventListener('mousemove', this.mouseMoveListener, true);\n this.mouseMoveListener = null;\n }\n\n if (this.clickListener) {\n document.removeEventListener('click', this.clickListener, true);\n this.clickListener = null;\n }\n\n document.removeEventListener('keydown', this.handleEscapeKey);\n\n // Hide highlight\n if (this.highlightElement) {\n this.highlightElement.style.display = 'none';\n }\n }\n\n /**\n * Handle mouse move to highlight hovered element\n */\n private handleMouseMove(e: MouseEvent): void {\n if (!this.isInspectMode || !this.highlightElement) return;\n\n // Ignore if hovering over toolbar, panel, or tracker list\n const target = e.target as HTMLElement;\n if (target.closest('#grain-debug-toolbar') || \n target.closest('#grain-debug-panel') ||\n target.closest('.grain-trackers-list')) {\n this.highlightElement.style.display = 'none';\n return;\n }\n\n // Get element rect\n const element = e.target as HTMLElement;\n const rect = element.getBoundingClientRect();\n\n // Position highlight\n this.highlightElement.style.display = 'block';\n this.highlightElement.style.top = `${rect.top + window.scrollY}px`;\n this.highlightElement.style.left = `${rect.left + window.scrollX}px`;\n this.highlightElement.style.width = `${rect.width}px`;\n this.highlightElement.style.height = `${rect.height}px`;\n }\n\n /**\n * Handle element click to show creation panel\n */\n private handleElementClick(e: MouseEvent): void {\n if (!this.isInspectMode) return;\n\n const target = e.target as HTMLElement;\n \n // If clicking toolbar or tracker list, exit inspect mode and allow normal click\n if (target.closest('#grain-debug-toolbar') || target.closest('.grain-trackers-list')) {\n this.disableInspectMode();\n return;\n }\n\n // If clicking panel, prevent default but don't do anything\n if (target.closest('#grain-debug-panel')) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n\n // Otherwise, select the element\n e.preventDefault();\n e.stopPropagation();\n\n this.selectedElement = target;\n this.disableInspectMode();\n this.showCreationPanel(target);\n }\n\n /**\n * Show tracker creation panel\n */\n private showCreationPanel(element: Element): void {\n // Remove existing panel if any\n if (this.panelElement) {\n this.panelElement.remove();\n }\n\n const panel = document.createElement('div');\n panel.id = 'grain-debug-panel';\n \n // Extract element info\n const tagName = element.tagName.toLowerCase();\n const elementId = element.id;\n const elementText = element.textContent?.trim().substring(0, 50) || '';\n const xpath = this.getXPathForElement(element);\n \n panel.innerHTML = `\n <style>\n #grain-debug-panel {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background: repeating-linear-gradient(\n 45deg,\n #fbbf24,\n #fbbf24 10px,\n #1e293b 10px,\n #1e293b 20px\n );\n border: 2px solid #1e293b;\n border-radius: 16px;\n padding: 6px;\n width: 420px;\n max-width: 90vw;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.25), 0 8px 24px rgba(0, 0, 0, 0.15);\n z-index: 1000000;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n }\n \n .grain-panel-inner {\n background: white;\n border-radius: 10px;\n overflow: hidden;\n }\n \n .grain-panel-header {\n background: #1e293b;\n padding: 14px 18px;\n color: white;\n }\n \n .grain-panel-header h3 {\n margin: 0 0 4px 0;\n font-size: 16px;\n font-weight: 700;\n letter-spacing: 0.5px;\n color: #fbbf24;\n text-transform: uppercase;\n }\n \n .grain-panel-header p {\n margin: 0;\n font-size: 12px;\n opacity: 0.85;\n color: white;\n }\n \n .grain-panel-body {\n padding: 18px;\n }\n \n #grain-debug-panel .element-preview {\n background: #f8fafc;\n border: 1.5px solid #e2e8f0;\n border-radius: 8px;\n padding: 10px 12px;\n margin-bottom: 16px;\n font-size: 11px;\n color: #475569;\n }\n \n #grain-debug-panel .element-preview div {\n margin-bottom: 4px;\n }\n \n #grain-debug-panel .element-preview div:last-child {\n margin-bottom: 0;\n }\n \n #grain-debug-panel .element-preview strong {\n color: #1e293b;\n font-weight: 600;\n }\n \n #grain-debug-panel label {\n display: block;\n color: #1e293b;\n font-size: 12px;\n font-weight: 600;\n margin-bottom: 6px;\n }\n \n #grain-debug-panel input,\n #grain-debug-panel select {\n width: 100%;\n background: white;\n border: 1.5px solid #e2e8f0;\n border-radius: 8px;\n padding: 9px 12px;\n color: #1e293b;\n font-size: 13px;\n margin-bottom: 14px;\n box-sizing: border-box;\n transition: all 0.2s;\n }\n \n #grain-debug-panel input:focus,\n #grain-debug-panel select:focus {\n outline: none;\n border-color: #fbbf24;\n box-shadow: 0 0 0 3px rgba(251, 191, 36, 0.1);\n }\n \n #grain-debug-panel .button-group {\n display: flex;\n gap: 8px;\n margin-top: 18px;\n }\n \n #grain-debug-panel button {\n flex: 1;\n padding: 10px 16px;\n border: none;\n border-radius: 8px;\n font-size: 13px;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.2s;\n }\n \n #grain-debug-panel button.primary {\n background: #fbbf24;\n color: #1e293b;\n box-shadow: 0 2px 8px rgba(251, 191, 36, 0.3);\n }\n \n #grain-debug-panel button.primary:hover {\n background: #f59e0b;\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(251, 191, 36, 0.4);\n }\n \n #grain-debug-panel button.secondary {\n background: white;\n border: 1.5px solid #e2e8f0;\n color: #475569;\n }\n \n #grain-debug-panel button.secondary:hover {\n background: #f8fafc;\n border-color: #cbd5e1;\n }\n \n #grain-debug-panel .url-pattern-input {\n display: none;\n }\n \n #grain-debug-panel .url-pattern-input.visible {\n display: block;\n }\n </style>\n <div class=\"grain-panel-inner\">\n <div class=\"grain-panel-header\">\n <h3>Create Tracker</h3>\n <p>Set up automatic tracking for this element</p>\n </div>\n <div class=\"grain-panel-body\">\n <div class=\"element-preview\">\n <div><strong>Element:</strong> ${tagName}${elementId ? `#${elementId}` : ''}</div>\n ${elementText ? `<div><strong>Text:</strong> ${elementText}</div>` : ''}\n </div>\n <div>\n <label>Event Name</label>\n <input type=\"text\" id=\"grain-event-name\" placeholder=\"e.g., signup_button_click\" value=\"\" />\n </div>\n <div>\n <label>Type</label>\n <select id=\"grain-event-type\">\n <option value=\"metric\">Metric</option>\n <option value=\"conversion\">Conversion</option>\n </select>\n </div>\n <div>\n <label>URL Scope</label>\n <select id=\"grain-url-scope\">\n <option value=\"all\">All Pages</option>\n <option value=\"contains\" selected>This Page</option>\n <option value=\"equals\">Exact URL</option>\n </select>\n </div>\n <div class=\"url-pattern-input visible\" id=\"grain-url-pattern-container\">\n <label>URL Pattern</label>\n <input type=\"text\" id=\"grain-url-pattern\" placeholder=\"e.g., /pricing\" value=\"${window.location.pathname}\" />\n </div>\n <div class=\"button-group\">\n <button type=\"button\" class=\"secondary\" id=\"grain-cancel\">Cancel</button>\n <button type=\"button\" class=\"primary\" id=\"grain-create\">\u2713 Create</button>\n </div>\n </div>\n </div>\n `;\n\n document.body.appendChild(panel);\n this.panelElement = panel;\n\n // Auto-generate event name suggestion\n const eventNameInput = panel.querySelector('#grain-event-name') as HTMLInputElement;\n if (eventNameInput) {\n const suggestedName = this.generateEventName(element);\n eventNameInput.value = suggestedName;\n eventNameInput.select();\n }\n\n // Handle URL scope change\n const urlScopeSelect = panel.querySelector('#grain-url-scope') as HTMLSelectElement;\n const urlPatternContainer = panel.querySelector('#grain-url-pattern-container');\n const urlPatternInput = panel.querySelector('#grain-url-pattern') as HTMLInputElement;\n \n if (urlScopeSelect && urlPatternContainer) {\n urlScopeSelect.addEventListener('change', () => {\n if (urlScopeSelect.value === 'all') {\n urlPatternContainer.classList.remove('visible');\n } else {\n urlPatternContainer.classList.add('visible');\n if (urlPatternInput && !urlPatternInput.value) {\n urlPatternInput.value = window.location.pathname;\n }\n }\n });\n }\n\n // Handle buttons\n const cancelBtn = panel.querySelector('#grain-cancel');\n const createBtn = panel.querySelector('#grain-create');\n\n if (cancelBtn) {\n cancelBtn.addEventListener('click', () => this.hideCreationPanel());\n }\n\n if (createBtn) {\n createBtn.addEventListener('click', () => this.handleCreateTracker(xpath));\n }\n }\n\n /**\n * Generate suggested event name from element\n */\n private generateEventName(element: Element): string {\n const tagName = element.tagName.toLowerCase();\n const elementId = element.id;\n const elementText = element.textContent?.trim().toLowerCase().replace(/\\s+/g, '_').substring(0, 30) || '';\n \n // Try to generate meaningful name\n if (elementId) {\n return `${elementId}_click`;\n } else if (elementText) {\n return `${elementText}_click`;\n } else if (tagName === 'button') {\n return 'button_click';\n } else if (tagName === 'a') {\n return 'link_click';\n } else {\n return `${tagName}_click`;\n }\n }\n\n /**\n * Handle tracker creation\n */\n private async handleCreateTracker(selector: string): Promise<void> {\n if (!this.panelElement) return;\n\n const eventNameInput = this.panelElement.querySelector('#grain-event-name') as HTMLInputElement;\n const eventTypeSelect = this.panelElement.querySelector('#grain-event-type') as HTMLSelectElement;\n const urlScopeSelect = this.panelElement.querySelector('#grain-url-scope') as HTMLSelectElement;\n const urlPatternInput = this.panelElement.querySelector('#grain-url-pattern') as HTMLInputElement;\n\n if (!eventNameInput || !eventTypeSelect || !urlScopeSelect) return;\n\n const eventName = eventNameInput.value.trim();\n const eventType = eventTypeSelect.value;\n const urlScope = urlScopeSelect.value;\n const urlPattern = urlPatternInput?.value.trim() || undefined;\n\n // Validate\n if (!eventName) {\n alert('Please enter an event name');\n return;\n }\n\n if (!eventName.match(/^[a-zA-Z0-9_-]+$/)) {\n alert('Event name can only contain letters, numbers, underscores, and hyphens');\n return;\n }\n\n if ((urlScope === 'contains' || urlScope === 'equals') && !urlPattern) {\n alert('Please enter a URL pattern');\n return;\n }\n\n try {\n // Show loading state\n const createBtn = this.panelElement.querySelector('#grain-create') as HTMLButtonElement;\n if (createBtn) {\n createBtn.textContent = 'Creating...';\n createBtn.disabled = true;\n }\n\n // Create tracker\n await this.createTracker(eventName, eventType, selector, urlScope, urlPattern);\n\n // Success\n this.hideCreationPanel();\n this.showSuccessMessage(`Tracker \"${eventName}\" created successfully!`);\n \n // Reload trackers and update UI\n await this.loadExistingTrackers();\n this.updateToolbarStats();\n if (this.showTrackers) {\n this.showTrackerHighlights();\n this.showTrackersList();\n }\n \n this.log('Tracker created:', eventName);\n } catch (error) {\n alert('Failed to create tracker. Please try again.');\n this.log('Failed to create tracker:', error);\n \n // Reset button\n const createBtn = this.panelElement.querySelector('#grain-create') as HTMLButtonElement;\n if (createBtn) {\n createBtn.textContent = 'Create Tracker';\n createBtn.disabled = false;\n }\n }\n }\n\n /**\n * Create tracker via API\n */\n private async createTracker(\n name: string,\n type: string,\n selector: string,\n urlScope: string,\n urlPattern?: string\n ): Promise<void> {\n const url = `${this.apiUrl}/v1/tenant/${encodeURIComponent(this.tenantId)}/debug-sessions/${this.sessionId}/trackers`;\n \n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n name,\n type,\n selector,\n urlScope,\n urlPattern,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to create tracker: ${response.status}`);\n }\n }\n\n /**\n * Hide creation panel\n */\n private hideCreationPanel(): void {\n if (this.panelElement) {\n this.panelElement.remove();\n this.panelElement = null;\n }\n this.selectedElement = null;\n }\n\n /**\n * Show success message\n */\n private showSuccessMessage(message: string): void {\n const toast = document.createElement('div');\n toast.style.cssText = `\n position: fixed;\n top: 20px;\n left: 50%;\n transform: translateX(-50%) translateY(-20px);\n background: linear-gradient(135deg, #10b981 0%, #059669 100%);\n color: white;\n padding: 14px 24px;\n border-radius: 12px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 14px;\n font-weight: 600;\n box-shadow: 0 12px 32px rgba(16, 185, 129, 0.3), 0 4px 12px rgba(0, 0, 0, 0.15);\n z-index: 1000000;\n display: flex;\n align-items: center;\n gap: 10px;\n animation: slideDown 0.3s ease-out forwards;\n `;\n toast.innerHTML = `\n <style>\n @keyframes slideDown {\n to {\n transform: translateX(-50%) translateY(0);\n }\n }\n </style>\n <span style=\"font-size: 18px;\">\u2713</span>\n <span>${message}</span>\n `;\n\n document.body.appendChild(toast);\n\n setTimeout(() => {\n toast.style.animation = 'slideDown 0.3s ease-in reverse';\n setTimeout(() => {\n toast.remove();\n }, 300);\n }, 2700);\n }\n\n /**\n * End debug session\n */\n private async endDebug(): Promise<void> {\n try {\n // Call end session API\n const url = `${this.apiUrl}/v1/tenant/${encodeURIComponent(this.tenantId)}/debug-sessions/${this.sessionId}/end`;\n \n await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n } catch (error) {\n this.log('Failed to end debug session:', error);\n }\n\n // Clean up and reload page\n this.destroy();\n \n // Remove debug params from URL and reload\n const url = new URL(window.location.href);\n url.searchParams.delete('grain_debug');\n url.searchParams.delete('grain_session');\n window.location.href = url.toString();\n }\n\n /**\n * Get XPath for element\n */\n private getXPathForElement(element: Element): string {\n if (element.id) {\n return `//*[@id=\"${element.id}\"]`;\n }\n\n const parts: string[] = [];\n let current: Element | null = element;\n\n while (current && current.nodeType === Node.ELEMENT_NODE) {\n let index = 0;\n let sibling: Element | null = current;\n\n while (sibling) {\n if (sibling.nodeType === Node.ELEMENT_NODE && sibling.tagName === current.tagName) {\n index++;\n }\n sibling = sibling.previousElementSibling;\n }\n\n const tagName = current.tagName.toLowerCase();\n const pathIndex = index > 1 ? `[${index}]` : '';\n parts.unshift(`${tagName}${pathIndex}`);\n\n current = current.parentElement;\n }\n\n return parts.length ? `/${parts.join('/')}` : '';\n }\n\n /**\n * Log debug messages\n */\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[DebugAgent]', ...args);\n }\n }\n\n /**\n * Update toolbar stats\n */\n private updateToolbarStats(): void {\n if (!this.toolbarElement) return;\n \n const totalStat = this.toolbarElement.querySelector('.grain-stat:nth-child(1) .grain-stat-value');\n const activeStat = this.toolbarElement.querySelector('.grain-stat:nth-child(2) .grain-stat-value');\n \n if (totalStat) {\n totalStat.textContent = String(this.existingTrackers.length);\n }\n if (activeStat) {\n activeStat.textContent = String(this.existingTrackers.filter(t => t.isEnabled).length);\n }\n }\n\n /**\n * Destroy the debug agent\n */\n destroy(): void {\n if (this.isDestroyed) return;\n\n this.log('Destroying debug agent');\n this.isDestroyed = true;\n\n this.disableInspectMode();\n this.hideTrackerHighlights();\n this.endDrag();\n\n if (this.toolbarElement) {\n this.toolbarElement.remove();\n this.toolbarElement = null;\n }\n\n if (this.panelElement) {\n this.panelElement.remove();\n this.panelElement = null;\n }\n\n if (this.highlightElement) {\n this.highlightElement.remove();\n this.highlightElement = null;\n }\n }\n}\n", "/**\n * Grain Analytics Web SDK\n * A lightweight, dependency-free TypeScript SDK for sending analytics events to Grain's REST API\n */\n\nimport { ConsentManager, ConsentState, ConsentMode } from './consent';\nimport { setCookie, getCookie, deleteCookie, areCookiesEnabled, CookieConfig } from './cookies';\nimport { ActivityDetector } from './activity';\nimport { HeartbeatManager, type HeartbeatTracker } from './heartbeat';\nimport { PageTrackingManager, type PageTracker } from './page-tracking';\nimport { IdManager, type IdMode } from './id-manager';\nimport {\n categorizeReferrer,\n parseUTMParameters,\n getOrCreateFirstTouchAttribution,\n getSessionUTMParameters,\n getFirstTouchAttribution,\n type ReferrerCategory,\n type UTMParameters,\n type FirstTouchAttribution,\n} from './attribution';\n\n// Re-export attribution types and functions\nexport type { ReferrerCategory, UTMParameters, FirstTouchAttribution };\nexport { categorizeReferrer, parseUTMParameters };\n\n// Re-export timezone-country utilities\nexport { getCountry, getCountryCodeFromTimezone, getState } from './countries';\n\n// Re-export auto-tracking types\nexport type {\n InteractionConfig,\n SectionConfig,\n AutoTrackingConfig,\n SectionViewData,\n SectionTrackingOptions,\n} from './types/auto-tracking';\n\nexport interface GrainEvent {\n eventName: string;\n userId?: string;\n properties?: Record<string, unknown>;\n timestamp?: Date;\n}\n\nexport interface EventPayload {\n eventName: string;\n userId: string;\n properties: Record<string, unknown>;\n}\n\nexport type AuthStrategy = 'NONE' | 'SERVER_SIDE' | 'JWT';\n\nexport interface AuthProvider {\n getToken(): Promise<string> | string;\n}\n\n// Re-export privacy types\nexport type { ConsentState, ConsentMode, CookieConfig };\n\nexport interface GrainConfig {\n tenantId: string;\n apiUrl?: string;\n authStrategy?: AuthStrategy;\n secretKey?: string; // For SERVER_SIDE auth\n authProvider?: AuthProvider; // For JWT auth\n userId?: string; // Global user ID for all events\n batchSize?: number;\n flushInterval?: number; // milliseconds\n retryAttempts?: number;\n retryDelay?: number; // milliseconds\n maxEventsPerRequest?: number; // Maximum events to send in a single API request\n debug?: boolean;\n // Remote Config options\n defaultConfigurations?: Record<string, string>; // Default values for configurations\n configCacheKey?: string; // Custom cache key for configurations\n configRefreshInterval?: number; // Auto-refresh interval in milliseconds (default: 5 minutes)\n enableConfigCache?: boolean; // Enable/disable configuration caching (default: true)\n // Privacy & Consent options (v2.0)\n consentMode?: ConsentMode; // 'cookieless' | 'gdpr-strict' | 'gdpr-opt-out' (default: 'cookieless')\n waitForConsent?: boolean; // Queue events until consent is granted (default: false, only for gdpr-strict)\n // Deprecated: enableCookies - cookies no longer used for user identification\n // Deprecated: anonymizeIP - IP addresses never stored (GeoIP used instead)\n disableAutoProperties?: boolean; // Disable automatic property collection (default: false)\n allowedProperties?: string[]; // Whitelist of allowed event properties (default: all)\n // Automatic Tracking options\n enableHeartbeat?: boolean; // Enable heartbeat tracking (default: true)\n heartbeatActiveInterval?: number; // Active interval in ms (default: 120000 - 2 min)\n heartbeatInactiveInterval?: number; // Inactive interval in ms (default: 300000 - 5 min)\n enableAutoPageView?: boolean; // Enable automatic page view tracking (default: true)\n stripQueryParams?: boolean; // Strip query params from URLs (default: true)\n stripHash?: boolean; // Strip hash from URLs (default: false)\n // Heatmap Tracking options\n enableHeatmapTracking?: boolean; // Enable heatmap tracking (default: true)\n}\n\nexport interface SendEventOptions {\n flush?: boolean; // Force immediate send\n}\n\nexport interface SetPropertyOptions {\n userId?: string; // Override global userId\n}\n\nexport interface LoginOptions {\n userId?: string; // User ID to set\n authToken?: string; // Auth token to set for JWT auth\n authStrategy?: AuthStrategy; // Override auth strategy\n}\n\nexport interface PropertyPayload {\n userId: string;\n [key: string]: string; // All property values must be strings\n}\n\n// Remote Config interfaces\nexport interface RemoteConfigRequest {\n userId: string;\n immediateKeys: string[];\n properties?: Record<string, string>;\n currentUrl?: string; // Optional current URL for page-specific configs\n}\n\nexport interface RemoteConfigResponse {\n userId: string;\n snapshotId: string;\n configurations: Record<string, string>;\n isFinal: boolean;\n qualifiedSegments: string[];\n qualifiedRuleSets: string[];\n timestamp: string;\n isFromCache: boolean;\n autoTrackingConfig?: {\n interactions: Array<{\n eventName: string;\n description: string;\n selector: string;\n priority: number;\n label: string;\n }>;\n sections: Array<{\n sectionName: string;\n description: string;\n sectionType: string;\n selector: string;\n importance: number;\n }>;\n };\n}\n\nexport interface RemoteConfigOptions {\n immediateKeys?: string[];\n properties?: Record<string, string>;\n userId?: string; // Override global userId\n forceRefresh?: boolean; // Force fetch from API, bypass cache\n currentUrl?: string; // Optional current URL for page-specific configs (auto-tracking)\n}\n\nexport interface RemoteConfigCache {\n configurations: Record<string, string>;\n snapshotId: string;\n timestamp: string;\n userId: string;\n}\n\nexport type ConfigChangeListener = (configurations: Record<string, string>) => void;\n\n// Template event interfaces\nexport interface LoginEventProperties extends Record<string, unknown> {\n method?: string; // 'email', 'google', 'facebook', etc.\n success?: boolean;\n errorMessage?: string;\n loginAttempt?: number;\n rememberMe?: boolean;\n twoFactorEnabled?: boolean;\n}\n\nexport interface SignupEventProperties extends Record<string, unknown> {\n method?: string; // 'email', 'google', 'facebook', etc.\n source?: string; // 'landing_page', 'referral', 'ad', etc.\n plan?: string; // 'free', 'pro', 'enterprise', etc.\n success?: boolean;\n errorMessage?: string;\n}\n\nexport interface CheckoutEventProperties extends Record<string, unknown> {\n orderId?: string;\n total?: number;\n currency?: string;\n items?: Array<{\n id: string;\n name: string;\n price: number;\n quantity: number;\n }>;\n paymentMethod?: string; // 'credit_card', 'paypal', 'stripe', etc.\n success?: boolean;\n errorMessage?: string;\n couponCode?: string;\n discount?: number;\n}\n\nexport interface PageViewEventProperties extends Record<string, unknown> {\n page?: string;\n title?: string;\n referrer?: string;\n url?: string;\n userAgent?: string;\n screenResolution?: string;\n viewportSize?: string;\n}\n\nexport interface PurchaseEventProperties extends Record<string, unknown> {\n orderId?: string;\n total?: number;\n currency?: string;\n items?: Array<{\n id: string;\n name: string;\n price: number;\n quantity: number;\n category?: string;\n }>;\n paymentMethod?: string;\n shippingMethod?: string;\n tax?: number;\n shipping?: number;\n discount?: number;\n couponCode?: string;\n}\n\nexport interface SearchEventProperties extends Record<string, unknown> {\n query?: string;\n results?: number;\n filters?: Record<string, unknown>;\n sortBy?: string;\n category?: string;\n success?: boolean;\n}\n\nexport interface AddToCartEventProperties extends Record<string, unknown> {\n itemId?: string;\n itemName?: string;\n price?: number;\n quantity?: number;\n currency?: string;\n category?: string;\n variant?: string;\n}\n\nexport interface RemoveFromCartEventProperties extends Record<string, unknown> {\n itemId?: string;\n itemName?: string;\n price?: number;\n quantity?: number;\n currency?: string;\n category?: string;\n variant?: string;\n}\n\n// Error handling interfaces\nexport interface ErrorDigest {\n eventCount: number;\n totalProperties: number;\n totalSize: number;\n eventNames: string[];\n userIds: string[];\n}\n\nexport interface FormattedError {\n code: string;\n message: string;\n digest: ErrorDigest;\n timestamp: string;\n context: string;\n originalError?: unknown;\n}\n\n/**\n * Main Grain Analytics client\n * \n * Features:\n * - Automatic UUIDv4 generation for anonymous users\n * - Login/logout functionality for dynamic auth token injection\n * - Persistent anonymous user ID across sessions (when consent is granted)\n * - Support for multiple auth strategies (NONE, SERVER_SIDE, JWT)\n * - GDPR-compliant consent management with strict opt-in mode\n * - Optional cookie support for cross-session tracking\n * \n * GDPR Compliance (Opt-in Mode):\n * - Without consent: Only ephemeral session IDs (memory-only) are used\n * - No cookies or localStorage identifiers until consent is granted\n * - Exceptions: User explicitly identified via identify()/login() or JWT auth\n * - Remote config cache and consent preferences use localStorage (functional/necessary)\n */\ntype RequiredConfig = Required<Omit<GrainConfig, 'secretKey' | 'authProvider' | 'userId' | 'cookieOptions' | 'allowedProperties'>> & {\n secretKey?: string;\n authProvider?: AuthProvider;\n userId?: string;\n cookieOptions?: CookieConfig;\n allowedProperties?: string[];\n};\n\nexport class GrainAnalytics implements HeartbeatTracker, PageTracker {\n private config: RequiredConfig;\n private eventQueue: EventPayload[] = [];\n private waitingForConsentQueue: EventPayload[] = [];\n private flushTimer: number | null = null;\n private isDestroyed = false;\n private globalUserId: string | null = null;\n private persistentAnonymousUserId: string | null = null; // Deprecated: use idManager instead\n // Remote Config properties\n private configCache: RemoteConfigCache | null = null;\n private configRefreshTimer: number | null = null;\n private configChangeListeners: ConfigChangeListener[] = [];\n private configFetchPromise: Promise<RemoteConfigResponse> | null = null;\n // Privacy & Consent properties (v2.0)\n private consentManager: ConsentManager;\n private idManager: IdManager;\n private cookiesEnabled: boolean = false; // Deprecated: cookies no longer used for IDs\n // Automatic Tracking properties\n private activityDetector: ActivityDetector | null = null;\n private heartbeatManager: HeartbeatManager | null = null;\n private pageTrackingManager: PageTrackingManager | null = null;\n private ephemeralSessionId: string | null = null;\n private eventCountSinceLastHeartbeat: number = 0;\n // Auto-tracking properties\n private interactionTrackingManager: any | null = null;\n private sectionTrackingManager: any | null = null;\n private heatmapTrackingManager: any | null = null;\n // Session tracking\n private sessionStartTime: number = Date.now();\n private sessionEventCount: number = 0;\n // Debug mode properties\n private debugAgent: any | null = null;\n private isDebugMode: boolean = false;\n\n constructor(config: GrainConfig) {\n this.config = {\n apiUrl: 'https://api.grainql.com',\n authStrategy: 'NONE',\n batchSize: 50,\n flushInterval: 5000, // 5 seconds\n retryAttempts: 3,\n retryDelay: 1000, // 1 second\n maxEventsPerRequest: 160, // Maximum events per API request\n debug: false,\n // Remote Config defaults\n defaultConfigurations: {},\n configCacheKey: 'grain_config',\n configRefreshInterval: 300000, // 5 minutes\n enableConfigCache: true,\n // Privacy defaults (v2.0)\n consentMode: 'COOKIELESS', // Default: privacy-first, no permanent tracking\n waitForConsent: false,\n disableAutoProperties: false,\n // Automatic Tracking defaults\n enableHeartbeat: true,\n heartbeatActiveInterval: 120000, // 2 minutes\n heartbeatInactiveInterval: 300000, // 5 minutes\n enableAutoPageView: true,\n stripQueryParams: true, // Privacy-first: strip by default\n stripHash: false,\n // Heatmap Tracking defaults\n enableHeatmapTracking: true,\n ...config,\n tenantId: config.tenantId,\n };\n\n // Initialize consent manager (v2.0)\n this.consentManager = new ConsentManager(this.config.tenantId, this.config.consentMode);\n\n // Initialize ID manager (v2.0)\n const idMode: IdMode = this.consentManager.getIdMode();\n this.idManager = new IdManager({\n mode: idMode,\n tenantId: this.config.tenantId,\n useLocalStorage: true, // For permanent IDs when consented\n });\n\n // Set global userId if provided in config\n if (config.userId) {\n this.globalUserId = config.userId;\n }\n\n this.validateConfig();\n // Deprecated: initializePersistentAnonymousUserId() - now handled by IdManager\n this.setupBeforeUnload();\n this.startFlushTimer();\n this.initializeConfigCache();\n\n // Initialize ephemeral session ID (memory-only, not persisted)\n this.ephemeralSessionId = this.generateUUID();\n\n // Initialize automatic tracking (browser only)\n if (typeof window !== 'undefined') {\n // Check for debug mode before initializing tracking\n this.checkAndInitializeDebugMode();\n \n this.initializeAutomaticTracking();\n // Track session start\n this.trackSessionStart();\n // Initialize heatmap tracking if enabled\n if (this.config.enableHeatmapTracking) {\n this.initializeHeatmapTracking();\n }\n }\n\n // Set up consent change listener to sync IdManager and flush waiting events (v2.0)\n this.consentManager.addListener((state) => {\n // Sync IdManager with consent state\n const idMode = this.consentManager.getIdMode();\n this.idManager.setMode(idMode);\n \n if (state.granted) {\n this.handleConsentGranted();\n }\n });\n }\n\n private validateConfig(): void {\n if (!this.config.tenantId) {\n throw new Error('Grain Analytics: tenantId is required');\n }\n\n if (this.config.authStrategy === 'SERVER_SIDE' && !this.config.secretKey) {\n throw new Error('Grain Analytics: secretKey is required for SERVER_SIDE auth strategy');\n }\n\n if (this.config.authStrategy === 'JWT' && !this.config.authProvider) {\n throw new Error('Grain Analytics: authProvider is required for JWT auth strategy');\n }\n }\n\n /**\n * Generate a UUID v4 string\n */\n private generateUUID(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n \n // Fallback for environments without crypto.randomUUID\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n const r = Math.random() * 16 | 0;\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n }\n\n /**\n * Check if we should allow persistent storage (GDPR compliance)\n * \n * Returns true if:\n * - Consent has been granted, OR\n * - Not in opt-in mode, OR\n * - User has been explicitly identified by the site (login/identify), OR\n * - Using JWT auth strategy (functional/essential purpose)\n */\n private shouldAllowPersistentStorage(): boolean {\n const hasConsent = this.consentManager.hasConsent('analytics');\n const isCookieless = this.config.consentMode === 'COOKIELESS';\n const userExplicitlyIdentified = !!this.globalUserId;\n const isJWTAuth = this.config.authStrategy === 'JWT';\n \n // Never allow persistent storage in cookieless mode\n if (isCookieless) return false;\n \n // Allow persistent storage if any of these conditions are met\n return hasConsent || userExplicitlyIdentified || isJWTAuth;\n }\n\n /**\n * Generate a proper UUIDv4 identifier for anonymous user ID\n */\n private generateAnonymousUserId(): string {\n return this.generateUUID();\n }\n\n /**\n * Initialize persistent anonymous user ID from cookies or localStorage\n * Priority: Cookie \u2192 localStorage \u2192 generate new\n * \n * GDPR Compliance: In opt-in mode without consent, we skip loading/saving\n * persistent IDs unless the user has been explicitly identified by the site\n * or when using JWT auth (functional/essential purpose)\n */\n private initializePersistentAnonymousUserId(): void {\n if (typeof window === 'undefined') return;\n\n // Check if we should avoid persistent storage (GDPR compliance)\n if (!this.shouldAllowPersistentStorage()) {\n this.log('Opt-in mode without consent: skipping persistent ID initialization (GDPR compliance)');\n return; // Don't load or create persistent ID\n }\n\n const storageKey = `grain_anonymous_user_id_${this.config.tenantId}`;\n const cookieName = '_grain_uid';\n \n try {\n // Try to load from cookie first if enabled\n if (this.cookiesEnabled) {\n const cookieValue = getCookie(cookieName);\n if (cookieValue) {\n this.persistentAnonymousUserId = cookieValue;\n this.log('Loaded persistent anonymous user ID from cookie:', this.persistentAnonymousUserId);\n return;\n }\n }\n\n // Fallback to localStorage\n const stored = localStorage.getItem(storageKey);\n if (stored) {\n this.persistentAnonymousUserId = stored;\n this.log('Loaded persistent anonymous user ID from localStorage:', this.persistentAnonymousUserId);\n \n // Migrate to cookie if enabled\n if (this.cookiesEnabled) {\n this.savePersistentAnonymousUserId(stored);\n }\n } else {\n // Generate new UUIDv4 anonymous user ID\n this.persistentAnonymousUserId = this.generateAnonymousUserId();\n this.savePersistentAnonymousUserId(this.persistentAnonymousUserId);\n this.log('Generated new persistent anonymous user ID:', this.persistentAnonymousUserId);\n }\n } catch (error) {\n this.log('Failed to initialize persistent anonymous user ID:', error);\n // Fallback: generate temporary ID without persistence\n this.persistentAnonymousUserId = this.generateAnonymousUserId();\n }\n }\n\n /**\n * Save persistent anonymous user ID to cookie and/or localStorage\n * \n * GDPR Compliance: In opt-in mode without consent, we don't persist IDs\n * unless the user has been explicitly identified or using JWT auth\n */\n private savePersistentAnonymousUserId(userId: string): void {\n if (typeof window === 'undefined') return;\n\n // Check if we should avoid persistent storage (GDPR compliance)\n if (!this.shouldAllowPersistentStorage()) {\n this.log('Opt-in mode without consent: skipping persistent ID save (GDPR compliance)');\n return; // Don't save persistent ID\n }\n\n const storageKey = `grain_anonymous_user_id_${this.config.tenantId}`;\n const cookieName = '_grain_uid';\n\n try {\n // Save to cookie if enabled\n if (this.cookiesEnabled) {\n const cookieOptions: CookieConfig = {\n maxAge: 365 * 24 * 60 * 60, // 365 days\n sameSite: 'lax',\n secure: typeof window !== 'undefined' && window.location.protocol === 'https:',\n ...this.config.cookieOptions,\n };\n setCookie(cookieName, userId, cookieOptions);\n }\n\n // Always save to localStorage as fallback\n localStorage.setItem(storageKey, userId);\n } catch (error) {\n this.log('Failed to save persistent anonymous user ID:', error);\n }\n }\n\n /**\n * Get the effective user ID (v2.0)\n * \n * Privacy-first implementation:\n * - Returns global userId if explicitly set (via identify/login)\n * - Otherwise uses IdManager to generate:\n * - Daily rotating ID (cookieless mode)\n * - Permanent ID (with consent)\n */\n private getEffectiveUserIdInternal(): string {\n // Explicit user identification always takes precedence\n if (this.globalUserId) {\n return this.globalUserId;\n }\n \n // Use IdManager to generate appropriate ID based on consent\n return this.idManager.getCurrentUserId();\n }\n\n log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[Grain Analytics]', ...args);\n }\n }\n\n /**\n * Create error digest from events\n */\n private createErrorDigest(events: EventPayload[]): ErrorDigest {\n const eventNames = [...new Set(events.map(e => e.eventName))];\n const userIds = [...new Set(events.map(e => e.userId))];\n \n let totalProperties = 0;\n let totalSize = 0;\n \n events.forEach(event => {\n const properties = event.properties || {};\n totalProperties += Object.keys(properties).length;\n totalSize += JSON.stringify(event).length;\n });\n\n return {\n eventCount: events.length,\n totalProperties,\n totalSize,\n eventNames,\n userIds,\n };\n }\n\n /**\n * Format error with beautiful structure\n */\n private formatError(\n error: unknown,\n context: string,\n events?: EventPayload[]\n ): FormattedError {\n const digest = events ? this.createErrorDigest(events) : {\n eventCount: 0,\n totalProperties: 0,\n totalSize: 0,\n eventNames: [],\n userIds: [],\n };\n\n let code = 'UNKNOWN_ERROR';\n let message = 'An unknown error occurred';\n\n if (error instanceof Error) {\n message = error.message;\n \n // Determine error code based on error type and message\n if (message.includes('fetch failed') || message.includes('network error')) {\n code = 'NETWORK_ERROR';\n } else if (message.includes('timeout')) {\n code = 'TIMEOUT_ERROR';\n } else if (message.includes('HTTP 4')) {\n code = 'CLIENT_ERROR';\n } else if (message.includes('HTTP 5')) {\n code = 'SERVER_ERROR';\n } else if (message.includes('JSON')) {\n code = 'PARSE_ERROR';\n } else if (message.includes('auth') || message.includes('unauthorized')) {\n code = 'AUTH_ERROR';\n } else if (message.includes('rate limit') || message.includes('429')) {\n code = 'RATE_LIMIT_ERROR';\n } else {\n code = 'GENERAL_ERROR';\n }\n } else if (typeof error === 'string') {\n message = error;\n code = 'STRING_ERROR';\n } else if (error && typeof error === 'object' && 'status' in error) {\n const status = (error as { status: number }).status;\n code = `HTTP_${status}`;\n message = `HTTP ${status} error`;\n }\n\n return {\n code,\n message,\n digest,\n timestamp: new Date().toISOString(),\n context,\n originalError: error,\n };\n }\n\n /**\n * Log formatted error gracefully\n */\n private logError(formattedError: FormattedError): void {\n // Only log errors in debug mode to reduce noise in production\n if (!this.config.debug) return;\n \n const { code, message, digest, timestamp, context } = formattedError;\n \n const errorOutput = {\n '\uD83D\uDEA8 Grain Analytics Error': {\n 'Error Code': code,\n 'Message': message,\n 'Context': context,\n 'Timestamp': timestamp,\n 'Event Digest': {\n 'Events': digest.eventCount,\n 'Properties': digest.totalProperties,\n 'Size (bytes)': digest.totalSize,\n 'Event Names': digest.eventNames.length > 0 ? digest.eventNames.join(', ') : 'None',\n 'User IDs': digest.userIds.length > 0 ? digest.userIds.slice(0, 3).join(', ') + (digest.userIds.length > 3 ? '...' : '') : 'None',\n }\n }\n };\n\n console.error('\uD83D\uDEA8 Grain Analytics Error:', errorOutput);\n console.error(`[Grain Analytics] ${code}: ${message} (${context}) - Events: ${digest.eventCount}, Props: ${digest.totalProperties}, Size: ${digest.totalSize}B`);\n }\n\n /**\n * Safely execute a function with error handling\n */\n private async safeExecute<T>(\n fn: () => Promise<T>,\n context: string,\n events?: EventPayload[]\n ): Promise<T | null> {\n try {\n return await fn();\n } catch (error) {\n const formattedError = this.formatError(error, context, events);\n this.logError(formattedError);\n return null;\n }\n }\n\n private formatEvent(event: GrainEvent): EventPayload {\n const properties = event.properties || {};\n \n // Auto-enrich events with session-level attribution properties\n // This ensures UTM parameters and attribution data are available on ALL events, not just page_view\n if (!this.config.disableAutoProperties && typeof window !== 'undefined') {\n const hasConsent = this.consentManager.hasConsent('analytics');\n \n // Only enrich if not a system event (they handle their own properties)\n const isSystemEvent = event.eventName.startsWith('_grain_');\n \n if (!isSystemEvent && hasConsent) {\n // Get session UTM parameters\n const sessionUTMs = getSessionUTMParameters();\n if (sessionUTMs) {\n if (sessionUTMs.utm_source) properties.utm_source = sessionUTMs.utm_source;\n if (sessionUTMs.utm_medium) properties.utm_medium = sessionUTMs.utm_medium;\n if (sessionUTMs.utm_campaign) properties.utm_campaign = sessionUTMs.utm_campaign;\n if (sessionUTMs.utm_term) properties.utm_term = sessionUTMs.utm_term;\n if (sessionUTMs.utm_content) properties.utm_content = sessionUTMs.utm_content;\n }\n \n // Get first-touch attribution\n const firstTouch = getFirstTouchAttribution(this.config.tenantId);\n if (firstTouch) {\n properties.first_touch_source = firstTouch.source;\n properties.first_touch_medium = firstTouch.medium;\n properties.first_touch_campaign = firstTouch.campaign;\n properties.first_touch_referrer_category = firstTouch.referrer_category;\n }\n \n // Add session ID if not already present\n if (!properties.session_id) {\n properties.session_id = this.getSessionId();\n }\n }\n }\n \n return {\n eventName: event.eventName,\n userId: event.userId || this.getEffectiveUserIdInternal(),\n properties,\n };\n }\n\n private async getAuthHeaders(): Promise<Record<string, string>> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n switch (this.config.authStrategy) {\n case 'NONE':\n break;\n case 'SERVER_SIDE':\n headers['Authorization'] = `Chase ${this.config.secretKey}`;\n break;\n case 'JWT':\n if (this.config.authProvider) {\n const token = await this.config.authProvider.getToken();\n headers['Authorization'] = `Bearer ${token}`;\n }\n break;\n }\n\n return headers;\n }\n\n private async delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n private isRetriableError(error: unknown): boolean {\n if (error instanceof Error) {\n // Check for specific network or fetch errors\n const message = error.message.toLowerCase();\n if (message.includes('fetch failed')) return true;\n if (message === 'network error') return true; // Exact match to avoid \"Non-network error\"\n if (message.includes('timeout')) return true;\n if (message.includes('connection')) return true;\n }\n \n // Check for HTTP status codes that are retriable\n if (typeof error === 'object' && error !== null && 'status' in error) {\n const status = (error as { status: number }).status;\n return status >= 500 || status === 429; // Server errors or rate limiting\n }\n \n return false;\n }\n\n private async sendEvents(events: EventPayload[]): Promise<void> {\n if (events.length === 0) return;\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= this.config.retryAttempts; attempt++) {\n try {\n const headers = await this.getAuthHeaders();\n const url = `${this.config.apiUrl}/v1/events/${encodeURIComponent(this.config.tenantId)}/multi`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(events),\n });\n\n if (!response.ok) {\n let errorMessage = `HTTP ${response.status}`;\n try {\n const errorBody = await response.json();\n if (errorBody?.message) {\n errorMessage = errorBody.message;\n }\n } catch {\n const errorText = await response.text();\n if (errorText) {\n errorMessage = errorText;\n }\n }\n \n const error = new Error(`Failed to send events: ${errorMessage}`) as Error & { status?: number };\n error.status = response.status;\n throw error;\n }\n\n this.log(`Successfully sent ${events.length} events`);\n return; // Success, exit retry loop\n \n } catch (error) {\n lastError = error;\n \n if (attempt === this.config.retryAttempts) {\n // Last attempt, don't retry - log error gracefully\n const formattedError = this.formatError(error, `sendEvents (attempt ${attempt + 1}/${this.config.retryAttempts + 1})`, events);\n this.logError(formattedError);\n return; // Don't throw, just return gracefully\n }\n \n if (!this.isRetriableError(error)) {\n // Non-retriable error, don't retry - log error gracefully\n const formattedError = this.formatError(error, `sendEvents (non-retriable error)`, events);\n this.logError(formattedError);\n return; // Don't throw, just return gracefully\n }\n \n const delayMs = this.config.retryDelay * Math.pow(2, attempt); // Exponential backoff\n this.log(`Retrying in ${delayMs}ms after error:`, error);\n await this.delay(delayMs);\n }\n }\n }\n\n private async sendEventsWithBeacon(events: EventPayload[]): Promise<void> {\n if (events.length === 0) return;\n\n try {\n const headers = await this.getAuthHeaders();\n const url = `${this.config.apiUrl}/v1/events/${encodeURIComponent(this.config.tenantId)}/multi`;\n\n // Send events array directly (not wrapped in object) to match API expectation\n const body = JSON.stringify(events);\n\n // Beacon API doesn't support custom headers, so only use it for unauthenticated requests\n const needsAuth = this.config.authStrategy !== 'NONE';\n\n // Try beacon API first (more reliable for page unload, but only if no auth needed)\n if (!needsAuth && typeof navigator !== 'undefined' && 'sendBeacon' in navigator) {\n const blob = new Blob([body], { type: 'application/json' });\n const success = navigator.sendBeacon(url, blob);\n \n if (success) {\n this.log(`Successfully sent ${events.length} events via beacon`);\n return;\n }\n }\n\n // Use fetch with keepalive (supports headers and works during page unload)\n await fetch(url, {\n method: 'POST',\n headers,\n body,\n keepalive: true,\n });\n } catch (error) {\n // Log error gracefully for beacon failures (page unload scenarios)\n const formattedError = this.formatError(error, 'sendEventsWithBeacon', events);\n this.logError(formattedError);\n }\n }\n\n private startFlushTimer(): void {\n if (typeof window === 'undefined') return;\n \n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n }\n\n this.flushTimer = window.setInterval(() => {\n if (this.eventQueue.length > 0) {\n this.flush().catch((error) => {\n const formattedError = this.formatError(error, 'auto-flush');\n this.logError(formattedError);\n });\n }\n }, this.config.flushInterval);\n }\n\n private setupBeforeUnload(): void {\n if (typeof window === 'undefined') return;\n\n const handleBeforeUnload = () => {\n // Track session end\n this.trackSessionEnd();\n \n if (this.eventQueue.length > 0) {\n // Use beacon API for reliable delivery during page unload\n const eventsToSend = [...this.eventQueue];\n this.eventQueue = [];\n \n const chunks = this.chunkEvents(eventsToSend, this.config.maxEventsPerRequest);\n \n // Send first chunk with beacon (most important for page unload)\n if (chunks.length > 0) {\n this.sendEventsWithBeacon(chunks[0]).catch(() => {\n // Silently fail - page is unloading\n });\n }\n }\n };\n\n // Handle page unload\n window.addEventListener('beforeunload', handleBeforeUnload);\n window.addEventListener('pagehide', handleBeforeUnload);\n \n // Handle visibility change (page hidden)\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden' && this.eventQueue.length > 0) {\n const eventsToSend = [...this.eventQueue];\n this.eventQueue = [];\n \n const chunks = this.chunkEvents(eventsToSend, this.config.maxEventsPerRequest);\n \n // Send first chunk with beacon (most important for page hidden)\n if (chunks.length > 0) {\n this.sendEventsWithBeacon(chunks[0]).catch(() => {\n // Silently fail\n });\n }\n }\n });\n }\n\n /**\n * Initialize automatic tracking (heartbeat and page views)\n */\n private initializeAutomaticTracking(): void {\n if (this.config.enableHeartbeat) {\n try {\n this.activityDetector = new ActivityDetector();\n this.heartbeatManager = new HeartbeatManager(\n this,\n this.activityDetector,\n {\n activeInterval: this.config.heartbeatActiveInterval,\n inactiveInterval: this.config.heartbeatInactiveInterval,\n debug: this.config.debug,\n }\n );\n } catch (error) {\n this.log('Failed to initialize heartbeat tracking:', error);\n }\n }\n\n if (this.config.enableAutoPageView) {\n try {\n this.pageTrackingManager = new PageTrackingManager(\n this,\n {\n stripQueryParams: this.config.stripQueryParams,\n stripHash: this.config.stripHash,\n debug: this.config.debug,\n tenantId: this.config.tenantId,\n }\n );\n } catch (error) {\n this.log('Failed to initialize page view tracking:', error);\n }\n }\n\n // Initialize auto-tracking when config is available\n this.initializeAutoTracking();\n }\n\n /**\n * Initialize heatmap tracking\n */\n private initializeHeatmapTracking(): void {\n if (typeof window === 'undefined') return;\n \n try {\n this.log('Initializing heatmap tracking');\n \n import('./heatmap-tracking').then(({ HeatmapTrackingManager }) => {\n try {\n this.heatmapTrackingManager = new HeatmapTrackingManager(\n this,\n {\n scrollDebounceDelay: 100,\n batchDelay: 2000,\n maxBatchSize: 20,\n debug: this.config.debug,\n }\n );\n this.log('Heatmap tracking initialized');\n } catch (error) {\n this.log('Failed to initialize heatmap tracking:', error);\n }\n }).catch((error) => {\n this.log('Failed to load heatmap tracking module:', error);\n });\n } catch (error) {\n this.log('Failed to initialize heatmap tracking:', error);\n }\n }\n\n /**\n * Initialize auto-tracking (interactions and sections)\n */\n private async initializeAutoTracking(): Promise<void> {\n try {\n this.log('Initializing auto-tracking');\n \n // Fetch remote config to get auto-tracking configuration\n const userId = this.globalUserId || this.persistentAnonymousUserId || this.generateUUID();\n const currentUrl = typeof window !== 'undefined' ? window.location.href : '';\n \n // Fetch config with currentUrl\n const request: RemoteConfigRequest = {\n userId,\n immediateKeys: [],\n properties: {},\n currentUrl, // Add current URL to request\n };\n\n const headers = await this.getAuthHeaders();\n const url = `${this.config.apiUrl}/v1/client/${encodeURIComponent(this.config.tenantId)}/config/configurations`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n this.log('Failed to fetch auto-tracking config:', response.status);\n return;\n }\n\n const configResponse: RemoteConfigResponse = await response.json();\n \n if (configResponse.autoTrackingConfig) {\n this.log('Auto-tracking config loaded');\n this.setupAutoTrackingManagers(configResponse.autoTrackingConfig);\n }\n } catch (error) {\n this.log('Failed to initialize auto-tracking:', error);\n // Fail silently - auto-tracking is optional\n }\n }\n\n /**\n * Setup auto-tracking managers\n */\n private setupAutoTrackingManagers(config: NonNullable<RemoteConfigResponse['autoTrackingConfig']>): void {\n this.log('Setting up auto-tracking managers');\n \n // Lazy load the managers to avoid bundling them if not needed\n if (config.interactions && config.interactions.length > 0) {\n this.log('Loading interaction tracking:', config.interactions.length, 'interactions');\n import('./interaction-tracking').then(({ InteractionTrackingManager }) => {\n try {\n this.interactionTrackingManager = new InteractionTrackingManager(\n this,\n config.interactions,\n {\n debug: this.config.debug,\n enableMutationObserver: true,\n mutationDebounceDelay: 500,\n tenantId: this.config.tenantId,\n apiUrl: this.config.apiUrl,\n }\n );\n this.log('Interaction tracking initialized');\n } catch (error) {\n this.log('Failed to initialize interaction tracking:', error);\n }\n }).catch((error) => {\n this.log('Failed to load interaction tracking module:', error);\n });\n }\n\n if (config.sections && config.sections.length > 0) {\n this.log('Loading section tracking:', config.sections.length, 'sections');\n import('./section-tracking').then(({ SectionTrackingManager }) => {\n try {\n this.sectionTrackingManager = new SectionTrackingManager(\n this,\n config.sections,\n {\n minDwellTime: 1000,\n scrollVelocityThreshold: 500,\n intersectionThreshold: 0.1,\n debounceDelay: 100,\n batchDelay: 2000,\n debug: this.config.debug,\n }\n );\n this.log('Section tracking initialized');\n } catch (error) {\n this.log('Failed to initialize section tracking:', error);\n }\n }).catch((error) => {\n this.log('Failed to load section tracking module:', error);\n });\n }\n }\n\n /**\n * Track session start event\n */\n private trackSessionStart(): void {\n if (typeof window === 'undefined') return;\n\n const hasConsent = this.consentManager.hasConsent('analytics');\n \n const properties: Record<string, unknown> = {\n session_id: this.getSessionId(),\n timestamp: this.sessionStartTime,\n };\n\n if (hasConsent) {\n const referrer = document.referrer || '';\n const currentUrl = window.location.href;\n \n // Parse UTM parameters\n const utmParams = parseUTMParameters(currentUrl);\n const sessionUTMs = getSessionUTMParameters() || utmParams;\n \n // Get first-touch attribution\n const firstTouch = getOrCreateFirstTouchAttribution(\n this.config.tenantId,\n referrer,\n currentUrl,\n sessionUTMs\n );\n\n // Landing page\n properties.landing_page = window.location.pathname;\n \n // Referrer info\n if (referrer) {\n properties.referrer = referrer;\n properties.referrer_domain = new URL(referrer).hostname;\n properties.referrer_category = categorizeReferrer(referrer, currentUrl);\n } else {\n properties.referrer_category = 'direct';\n }\n\n // UTM parameters\n if (sessionUTMs.utm_source) properties.utm_source = sessionUTMs.utm_source;\n if (sessionUTMs.utm_medium) properties.utm_medium = sessionUTMs.utm_medium;\n if (sessionUTMs.utm_campaign) properties.utm_campaign = sessionUTMs.utm_campaign;\n if (sessionUTMs.utm_term) properties.utm_term = sessionUTMs.utm_term;\n if (sessionUTMs.utm_content) properties.utm_content = sessionUTMs.utm_content;\n\n // First-touch attribution\n properties.first_touch_source = firstTouch.source;\n properties.first_touch_medium = firstTouch.medium;\n properties.first_touch_campaign = firstTouch.campaign;\n properties.first_touch_referrer_category = firstTouch.referrer_category;\n\n // Device and browser info\n properties.device = this.getDeviceType();\n properties.screen_resolution = `${screen.width}x${screen.height}`;\n properties.viewport = `${window.innerWidth}x${window.innerHeight}`;\n properties.browser = this.getBrowser();\n properties.os = this.getOS();\n properties.language = navigator.language || '';\n properties.timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n }\n\n this.trackSystemEvent('_grain_session_start', properties);\n this.log('Session started');\n }\n\n /**\n * Track session end event\n */\n private trackSessionEnd(): void {\n if (typeof window === 'undefined') return;\n\n const hasConsent = this.consentManager.hasConsent('analytics');\n const sessionDuration = Date.now() - this.sessionStartTime;\n \n const properties: Record<string, unknown> = {\n session_id: this.getSessionId(),\n session_duration: Math.floor(sessionDuration / 1000), // In seconds for easier querying\n duration: sessionDuration, // Keep for backward compatibility\n event_count: this.sessionEventCount,\n timestamp: Date.now(),\n };\n\n if (hasConsent && this.pageTrackingManager) {\n const pageCount = this.pageTrackingManager.getPageViewCount();\n properties.pages_per_session = pageCount;\n properties.page_count = pageCount; // Keep for backward compatibility\n }\n\n this.trackSystemEvent('_grain_session_end', properties);\n this.log('Session ended');\n }\n\n /**\n * Detect browser name\n */\n private getBrowser(): string {\n if (typeof navigator === 'undefined') return 'Unknown';\n const ua = navigator.userAgent;\n if (ua.includes('Firefox/')) return 'Firefox';\n if (ua.includes('Edg/')) return 'Edge';\n if (ua.includes('Chrome/')) return 'Chrome';\n if (ua.includes('Safari/') && !ua.includes('Chrome/')) return 'Safari';\n if (ua.includes('Opera/') || ua.includes('OPR/')) return 'Opera';\n return 'Unknown';\n }\n\n /**\n * Detect operating system\n */\n private getOS(): string {\n if (typeof navigator === 'undefined') return 'Unknown';\n const ua = navigator.userAgent;\n if (ua.includes('Win')) return 'Windows';\n if (ua.includes('Mac')) return 'macOS';\n if (ua.includes('Linux')) return 'Linux';\n if (ua.includes('Android')) return 'Android';\n if (ua.includes('iOS') || ua.includes('iPhone') || ua.includes('iPad')) return 'iOS';\n return 'Unknown';\n }\n\n /**\n * Detect device type (Mobile, Tablet, Desktop)\n */\n private getDeviceType(): string {\n if (typeof window === 'undefined' || typeof navigator === 'undefined') return 'Unknown';\n \n const ua = navigator.userAgent;\n const width = window.innerWidth;\n \n // Check for tablet-specific indicators\n if (ua.includes('iPad') || (ua.includes('Android') && !ua.includes('Mobile'))) {\n return 'Tablet';\n }\n \n // Check for mobile indicators\n if (ua.includes('Mobile') || ua.includes('iPhone') || ua.includes('Android')) {\n return 'Mobile';\n }\n \n // Fallback to screen width detection\n if (width < 768) {\n return 'Mobile';\n } else if (width >= 768 && width < 1024) {\n return 'Tablet';\n }\n \n return 'Desktop';\n }\n\n /**\n * Handle consent granted - upgrade ephemeral session to persistent user\n */\n private handleConsentGranted(): void {\n this.flushWaitingForConsentQueue();\n\n // Initialize persistent ID now that consent is granted (if not already initialized)\n if (!this.persistentAnonymousUserId) {\n this.initializePersistentAnonymousUserId();\n this.log('Initialized persistent ID after consent grant');\n }\n\n // Track consent granted event with mapping from ephemeral to persistent ID\n if (this.ephemeralSessionId) {\n this.trackSystemEvent('_grain_consent_granted', {\n previous_session_id: this.ephemeralSessionId,\n new_user_id: this.getEffectiveUserId(),\n timestamp: Date.now(),\n });\n }\n }\n\n /**\n * Track system events that bypass consent checks (for necessary/functional tracking)\n */\n trackSystemEvent(eventName: string, properties: Record<string, unknown>): void {\n if (this.isDestroyed) return;\n\n const hasConsent = this.consentManager.hasConsent('analytics');\n\n // Create event with appropriate user ID\n // v2.0: Always use IdManager which returns daily rotating ID or permanent ID based on consent\n const event: EventPayload = {\n eventName,\n userId: this.getEffectiveUserId(), // IdManager handles daily vs permanent based on consent\n properties: {\n ...properties,\n _minimal: !hasConsent, // Flag to indicate minimal tracking (daily rotating ID)\n _consent_status: hasConsent ? 'granted' : 'pending',\n },\n };\n\n // Bypass consent check for necessary system events\n this.eventQueue.push(event);\n this.eventCountSinceLastHeartbeat++;\n\n this.log(`Queued system event: ${eventName}`);\n\n // Consider flushing\n if (this.eventQueue.length >= this.config.batchSize) {\n this.flush().catch((error) => {\n const formattedError = this.formatError(error, 'flush system event');\n this.logError(formattedError);\n });\n }\n }\n\n /**\n * Get ephemeral session ID (memory-only, not persisted)\n */\n getEphemeralSessionId(): string {\n if (!this.ephemeralSessionId) {\n this.ephemeralSessionId = this.generateUUID();\n }\n return this.ephemeralSessionId;\n }\n\n /**\n * Get the current page path from page tracker\n */\n getCurrentPage(): string | null {\n return this.pageTrackingManager?.getCurrentPage() || null;\n }\n\n /**\n * Get event count since last heartbeat\n */\n getEventCountSinceLastHeartbeat(): number {\n return this.eventCountSinceLastHeartbeat;\n }\n\n /**\n * Reset event count since last heartbeat\n */\n resetEventCountSinceLastHeartbeat(): void {\n this.eventCountSinceLastHeartbeat = 0;\n }\n\n /**\n * Get the activity detector (for internal use by tracking managers)\n */\n getActivityDetector(): ActivityDetector {\n if (!this.activityDetector) {\n throw new Error('Activity detector not initialized');\n }\n return this.activityDetector;\n }\n\n /**\n * Get the effective user ID (public method)\n */\n getEffectiveUserId(): string {\n return this.getEffectiveUserIdInternal();\n }\n\n /**\n * Get the session ID (ephemeral or persistent based on consent)\n */\n getSessionId(): string {\n const hasConsent = this.consentManager.hasConsent('analytics');\n return hasConsent ? this.getEffectiveUserId() : this.getEphemeralSessionId();\n }\n\n /**\n * Track an analytics event\n */\n async track(eventName: string, properties?: Record<string, unknown>, options?: SendEventOptions): Promise<void>;\n async track(event: GrainEvent, options?: SendEventOptions): Promise<void>;\n async track(\n eventOrName: string | GrainEvent,\n propertiesOrOptions?: Record<string, unknown> | SendEventOptions,\n options?: SendEventOptions\n ): Promise<void> {\n try {\n if (this.isDestroyed) {\n const error = new Error('Grain Analytics: Client has been destroyed');\n const formattedError = this.formatError(error, 'track (client destroyed)');\n this.logError(formattedError);\n return;\n }\n\n let event: GrainEvent;\n let opts: SendEventOptions = {};\n\n if (typeof eventOrName === 'string') {\n event = {\n eventName: eventOrName,\n properties: propertiesOrOptions as Record<string, unknown>,\n };\n opts = options || {};\n } else {\n event = eventOrName;\n opts = propertiesOrOptions as SendEventOptions || {};\n }\n\n // Filter properties if whitelist is enabled\n if (this.config.allowedProperties && event.properties) {\n const filtered: Record<string, unknown> = {};\n for (const key of this.config.allowedProperties) {\n if (key in event.properties) {\n filtered[key] = event.properties[key];\n }\n }\n event.properties = filtered;\n }\n\n const formattedEvent = this.formatEvent(event);\n\n // Check if we should wait for consent (only if explicitly configured)\n if (this.consentManager.shouldWaitForConsent() && this.config.waitForConsent) {\n // Queue event until consent is granted\n this.waitingForConsentQueue.push(formattedEvent);\n this.log(`Event waiting for consent: ${event.eventName}`, event.properties);\n return;\n }\n\n // v2.0: GDPR Strict falls back to cookieless mode (daily rotating IDs)\n // Events are never blocked - IdManager already provides correct ID (daily or permanent)\n const hasConsent = this.consentManager.hasConsent('analytics');\n \n // Add tracking flags to indicate consent status\n formattedEvent.properties = {\n ...formattedEvent.properties,\n _minimal: !hasConsent, // Flag: true = daily rotating ID, false = permanent ID\n _consent_status: hasConsent ? 'granted' : 'pending',\n };\n\n this.eventQueue.push(formattedEvent);\n this.eventCountSinceLastHeartbeat++;\n this.sessionEventCount++;\n this.log(`Queued event: ${event.eventName}`);\n\n // Check if we should flush immediately\n if (opts.flush || this.eventQueue.length >= this.config.batchSize) {\n await this.flush();\n }\n } catch (error) {\n const formattedError = this.formatError(error, 'track');\n this.logError(formattedError);\n }\n }\n\n /**\n * Flush events that were waiting for consent\n */\n private flushWaitingForConsentQueue(): void {\n if (this.waitingForConsentQueue.length === 0) return;\n\n this.log(`Flushing ${this.waitingForConsentQueue.length} events waiting for consent`);\n \n // Move waiting events to main queue\n this.eventQueue.push(...this.waitingForConsentQueue);\n this.waitingForConsentQueue = [];\n\n // Flush immediately\n this.flush().catch((error) => {\n const formattedError = this.formatError(error, 'flush waiting for consent queue');\n this.logError(formattedError);\n });\n }\n\n /**\n * Identify a user (sets userId for subsequent events)\n */\n identify(userId: string): void {\n this.log(`Identified user: ${userId}`);\n this.globalUserId = userId;\n // Clear persistent anonymous user ID since we now have a real user ID\n this.persistentAnonymousUserId = null;\n }\n\n /**\n * Set global user ID for all subsequent events\n */\n setUserId(userId: string | null): void {\n this.log(`Set global user ID: ${userId}`);\n this.globalUserId = userId;\n \n if (userId) {\n // Clear persistent anonymous user ID if setting a real user ID\n this.persistentAnonymousUserId = null;\n } else {\n // If clearing user ID, ensure we have an identifier\n if (!this.persistentAnonymousUserId) {\n this.persistentAnonymousUserId = this.generateAnonymousUserId();\n \n // Try to persist the new anonymous ID (respects GDPR opt-in mode)\n this.savePersistentAnonymousUserId(this.persistentAnonymousUserId);\n }\n }\n }\n\n /**\n * Get current global user ID\n */\n getUserId(): string | null {\n return this.globalUserId;\n }\n\n /**\n * Get current effective user ID (global userId or persistent anonymous ID)\n */\n getEffectiveUserIdPublic(): string {\n return this.getEffectiveUserIdInternal();\n }\n\n /**\n * Login with auth token or userId on the fly\n * \n * @example\n * // Login with userId only\n * client.login({ userId: 'user123' });\n * \n * // Login with auth token (automatically sets authStrategy to JWT)\n * client.login({ authToken: 'jwt-token-here' });\n * \n * // Login with both userId and auth token\n * client.login({ userId: 'user123', authToken: 'jwt-token-here' });\n * \n * // Override auth strategy\n * client.login({ userId: 'user123', authStrategy: 'SERVER_SIDE' });\n */\n login(options: LoginOptions): void {\n try {\n if (this.isDestroyed) {\n const error = new Error('Grain Analytics: Client has been destroyed');\n const formattedError = this.formatError(error, 'login (client destroyed)');\n this.logError(formattedError);\n return;\n }\n\n // Set userId if provided\n if (options.userId) {\n this.log(`Login: Setting user ID to ${options.userId}`);\n this.globalUserId = options.userId;\n // Clear persistent anonymous user ID since we now have a real user ID\n this.persistentAnonymousUserId = null;\n }\n\n // Handle auth token if provided\n if (options.authToken) {\n this.log('Login: Setting auth token');\n // Update auth strategy to JWT if not already set\n if (this.config.authStrategy === 'NONE') {\n this.config.authStrategy = 'JWT';\n }\n \n // Create a simple auth provider that returns the provided token\n this.config.authProvider = {\n getToken: () => options.authToken!\n };\n }\n\n // Override auth strategy if provided\n if (options.authStrategy) {\n this.log(`Login: Setting auth strategy to ${options.authStrategy}`);\n this.config.authStrategy = options.authStrategy;\n }\n\n this.log(`Login successful. Effective user ID: ${this.getEffectiveUserIdInternal()}`);\n } catch (error) {\n const formattedError = this.formatError(error, 'login');\n this.logError(formattedError);\n }\n }\n\n /**\n * Logout and clear user session, fall back to UUIDv4 identifier\n * \n * @example\n * // Logout user and return to anonymous mode\n * client.logout();\n * \n * // After logout, events will use the persistent UUIDv4 identifier\n * client.track('page_view', { page: 'home' });\n */\n logout(): void {\n try {\n if (this.isDestroyed) {\n const error = new Error('Grain Analytics: Client has been destroyed');\n const formattedError = this.formatError(error, 'logout (client destroyed)');\n this.logError(formattedError);\n return;\n }\n\n this.log('Logout: Clearing user session');\n \n // Clear global user ID\n this.globalUserId = null;\n \n // Reset auth strategy to NONE\n this.config.authStrategy = 'NONE';\n this.config.authProvider = undefined;\n \n // Generate new UUIDv4 identifier if we don't have one\n if (!this.persistentAnonymousUserId) {\n this.persistentAnonymousUserId = this.generateAnonymousUserId();\n \n // Try to persist the new anonymous ID\n if (typeof window !== 'undefined') {\n try {\n const storageKey = `grain_anonymous_user_id_${this.config.tenantId}`;\n localStorage.setItem(storageKey, this.persistentAnonymousUserId);\n } catch (error) {\n this.log('Failed to persist new anonymous user ID after logout:', error);\n }\n }\n }\n \n this.log(`Logout successful. Effective user ID: ${this.getEffectiveUserIdInternal()}`);\n } catch (error) {\n const formattedError = this.formatError(error, 'logout');\n this.logError(formattedError);\n }\n }\n\n /**\n * Set user properties\n */\n async setProperty(properties: Record<string, unknown>, options?: SetPropertyOptions): Promise<void> {\n try {\n if (this.isDestroyed) {\n const error = new Error('Grain Analytics: Client has been destroyed');\n const formattedError = this.formatError(error, 'setProperty (client destroyed)');\n this.logError(formattedError);\n return;\n }\n\n const userId = options?.userId || this.getEffectiveUserIdInternal();\n \n // Validate property count (max 4 properties)\n const propertyKeys = Object.keys(properties);\n if (propertyKeys.length > 4) {\n const error = new Error('Grain Analytics: Maximum 4 properties allowed per request');\n const formattedError = this.formatError(error, 'setProperty (validation)');\n this.logError(formattedError);\n return;\n }\n\n if (propertyKeys.length === 0) {\n const error = new Error('Grain Analytics: At least one property is required');\n const formattedError = this.formatError(error, 'setProperty (validation)');\n this.logError(formattedError);\n return;\n }\n\n // Serialize all values to strings\n const serializedProperties: Record<string, string> = {};\n for (const [key, value] of Object.entries(properties)) {\n if (value === null || value === undefined) {\n serializedProperties[key] = '';\n } else if (typeof value === 'string') {\n serializedProperties[key] = value;\n } else {\n serializedProperties[key] = JSON.stringify(value);\n }\n }\n\n const payload: PropertyPayload = {\n userId,\n ...serializedProperties,\n };\n\n await this.sendProperties(payload);\n } catch (error) {\n const formattedError = this.formatError(error, 'setProperty');\n this.logError(formattedError);\n }\n }\n\n /**\n * Send properties to the API\n */\n private async sendProperties(payload: PropertyPayload): Promise<void> {\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= this.config.retryAttempts; attempt++) {\n try {\n const headers = await this.getAuthHeaders();\n const url = `${this.config.apiUrl}/v1/events/${encodeURIComponent(this.config.tenantId)}/properties`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n let errorMessage = `HTTP ${response.status}`;\n try {\n const errorBody = await response.json();\n if (errorBody?.message) {\n errorMessage = errorBody.message;\n }\n } catch {\n const errorText = await response.text();\n if (errorText) {\n errorMessage = errorText;\n }\n }\n \n const error = new Error(`Failed to set properties: ${errorMessage}`) as Error & { status?: number };\n error.status = response.status;\n throw error;\n }\n\n this.log(`Successfully set properties for user ${payload.userId}`);\n return; // Success, exit retry loop\n \n } catch (error) {\n lastError = error;\n \n if (attempt === this.config.retryAttempts) {\n // Last attempt, don't retry - log error gracefully\n const formattedError = this.formatError(error, `sendProperties (attempt ${attempt + 1}/${this.config.retryAttempts + 1})`);\n this.logError(formattedError);\n return; // Don't throw, just return gracefully\n }\n \n if (!this.isRetriableError(error)) {\n // Non-retriable error, don't retry - log error gracefully\n const formattedError = this.formatError(error, 'sendProperties (non-retriable error)');\n this.logError(formattedError);\n return; // Don't throw, just return gracefully\n }\n \n const delayMs = this.config.retryDelay * Math.pow(2, attempt); // Exponential backoff\n this.log(`Retrying in ${delayMs}ms after error:`, error);\n await this.delay(delayMs);\n }\n }\n }\n\n // Template event methods\n\n /**\n * Track user login event\n */\n async trackLogin(properties?: LoginEventProperties, options?: SendEventOptions): Promise<void> {\n try {\n return await this.track('login', properties, options);\n } catch (error) {\n const formattedError = this.formatError(error, 'trackLogin');\n this.logError(formattedError);\n }\n }\n\n /**\n * Track user signup event\n */\n async trackSignup(properties?: SignupEventProperties, options?: SendEventOptions): Promise<void> {\n try {\n return await this.track('signup', properties, options);\n } catch (error) {\n const formattedError = this.formatError(error, 'trackSignup');\n this.logError(formattedError);\n }\n }\n\n /**\n * Track checkout event\n */\n async trackCheckout(properties?: CheckoutEventProperties, options?: SendEventOptions): Promise<void> {\n try {\n return await this.track('checkout', properties, options);\n } catch (error) {\n const formattedError = this.formatError(error, 'trackCheckout');\n this.logError(formattedError);\n }\n }\n\n /**\n * Track page view event\n */\n async trackPageView(properties?: PageViewEventProperties, options?: SendEventOptions): Promise<void> {\n try {\n return await this.track('page_view', properties, options);\n } catch (error) {\n const formattedError = this.formatError(error, 'trackPageView');\n this.logError(formattedError);\n }\n }\n\n /**\n * Track purchase event\n */\n async trackPurchase(properties?: PurchaseEventProperties, options?: SendEventOptions): Promise<void> {\n try {\n return await this.track('purchase', properties, options);\n } catch (error) {\n const formattedError = this.formatError(error, 'trackPurchase');\n this.logError(formattedError);\n }\n }\n\n /**\n * Track search event\n */\n async trackSearch(properties?: SearchEventProperties, options?: SendEventOptions): Promise<void> {\n try {\n return await this.track('search', properties, options);\n } catch (error) {\n const formattedError = this.formatError(error, 'trackSearch');\n this.logError(formattedError);\n }\n }\n\n /**\n * Track add to cart event\n */\n async trackAddToCart(properties?: AddToCartEventProperties, options?: SendEventOptions): Promise<void> {\n try {\n return await this.track('add_to_cart', properties, options);\n } catch (error) {\n const formattedError = this.formatError(error, 'trackAddToCart');\n this.logError(formattedError);\n }\n }\n\n /**\n * Track remove from cart event\n */\n async trackRemoveFromCart(properties?: RemoveFromCartEventProperties, options?: SendEventOptions): Promise<void> {\n try {\n return await this.track('remove_from_cart', properties, options);\n } catch (error) {\n const formattedError = this.formatError(error, 'trackRemoveFromCart');\n this.logError(formattedError);\n }\n }\n\n /**\n * Manually flush all queued events\n */\n async flush(): Promise<void> {\n try {\n if (this.eventQueue.length === 0) return;\n\n const eventsToSend = [...this.eventQueue];\n this.eventQueue = [];\n\n // Split events into chunks to respect maxEventsPerRequest limit\n const chunks = this.chunkEvents(eventsToSend, this.config.maxEventsPerRequest);\n \n // Send all chunks sequentially to maintain order\n for (const chunk of chunks) {\n await this.sendEvents(chunk);\n }\n } catch (error) {\n const formattedError = this.formatError(error, 'flush');\n this.logError(formattedError);\n }\n }\n\n // Remote Config Methods\n\n /**\n * Initialize configuration cache from localStorage\n */\n private initializeConfigCache(): void {\n if (!this.config.enableConfigCache || typeof window === 'undefined') return;\n\n try {\n const cached = localStorage.getItem(this.config.configCacheKey);\n if (cached) {\n this.configCache = JSON.parse(cached);\n this.log('Loaded configuration from cache:', this.configCache);\n }\n } catch (error) {\n this.log('Failed to load configuration cache:', error);\n }\n }\n\n /**\n * Save configuration cache to localStorage\n */\n private saveConfigCache(cache: RemoteConfigCache): void {\n if (!this.config.enableConfigCache || typeof window === 'undefined') return;\n\n try {\n localStorage.setItem(this.config.configCacheKey, JSON.stringify(cache));\n this.log('Saved configuration to cache:', cache);\n } catch (error) {\n this.log('Failed to save configuration cache:', error);\n }\n }\n\n /**\n * Get configuration value with fallback to defaults\n */\n getConfig(key: string): string | undefined {\n // First check cache\n if (this.configCache?.configurations?.[key]) {\n return this.configCache.configurations[key];\n }\n\n // Then check defaults\n if (this.config.defaultConfigurations?.[key]) {\n return this.config.defaultConfigurations[key];\n }\n\n return undefined;\n }\n\n /**\n * Get all configurations with fallback to defaults\n */\n getAllConfigs(): Record<string, string> {\n const configs = { ...this.config.defaultConfigurations };\n \n if (this.configCache?.configurations) {\n Object.assign(configs, this.configCache.configurations);\n }\n\n return configs;\n }\n\n /**\n * Fetch configurations from API\n */\n async fetchConfig(options: RemoteConfigOptions = {}): Promise<RemoteConfigResponse | null> {\n try {\n if (this.isDestroyed) {\n const error = new Error('Grain Analytics: Client has been destroyed');\n const formattedError = this.formatError(error, 'fetchConfig (client destroyed)');\n this.logError(formattedError);\n return null;\n }\n\n const userId = options.userId || this.getEffectiveUserIdInternal();\n const immediateKeys = options.immediateKeys || [];\n const properties = options.properties || {};\n // Include currentUrl from options, or automatically get it from window.location if available\n // Strip query parameters and hash to match backend normalization\n let currentUrl = options.currentUrl ?? (typeof window !== 'undefined' ? window.location.href : undefined);\n if (currentUrl) {\n try {\n const urlObj = new URL(currentUrl);\n currentUrl = `${urlObj.protocol}//${urlObj.host}${urlObj.pathname}`;\n } catch {\n // If URL parsing fails, use as-is\n }\n }\n\n const request: RemoteConfigRequest = {\n userId,\n immediateKeys,\n properties,\n currentUrl,\n };\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= this.config.retryAttempts; attempt++) {\n try {\n const headers = await this.getAuthHeaders();\n const url = `${this.config.apiUrl}/v1/client/${encodeURIComponent(this.config.tenantId)}/config/configurations`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(request),\n });\n\n if (!response.ok) {\n let errorMessage = `HTTP ${response.status}`;\n try {\n const errorBody = await response.json();\n if (errorBody?.message) {\n errorMessage = errorBody.message;\n }\n } catch {\n const errorText = await response.text();\n if (errorText) {\n errorMessage = errorText;\n }\n }\n \n const error = new Error(`Failed to fetch configurations: ${errorMessage}`) as Error & { status?: number };\n error.status = response.status;\n throw error;\n }\n\n const configResponse: RemoteConfigResponse = await response.json();\n \n // Update cache if successful\n if (configResponse.configurations) {\n this.updateConfigCache(configResponse, userId);\n }\n\n this.log('Successfully fetched configurations');\n return configResponse;\n \n } catch (error) {\n lastError = error;\n \n if (attempt === this.config.retryAttempts) {\n // Last attempt, don't retry - log error gracefully\n const formattedError = this.formatError(error, `fetchConfig (attempt ${attempt + 1}/${this.config.retryAttempts + 1})`);\n this.logError(formattedError);\n return null;\n }\n \n if (!this.isRetriableError(error)) {\n // Non-retriable error, don't retry - log error gracefully\n const formattedError = this.formatError(error, 'fetchConfig (non-retriable error)');\n this.logError(formattedError);\n return null;\n }\n \n const delayMs = this.config.retryDelay * Math.pow(2, attempt);\n this.log(`Retrying config fetch in ${delayMs}ms after error:`, error);\n await this.delay(delayMs);\n }\n }\n\n return null;\n } catch (error) {\n const formattedError = this.formatError(error, 'fetchConfig');\n this.logError(formattedError);\n return null;\n }\n }\n\n /**\n * Get configuration asynchronously (cache-first with fallback to API)\n */\n async getConfigAsync(key: string, options: RemoteConfigOptions = {}): Promise<string | undefined> {\n try {\n // Return immediately if we have it in cache and not forcing refresh\n if (!options.forceRefresh && this.configCache?.configurations?.[key]) {\n return this.configCache.configurations[key];\n }\n\n // Return default if available and not forcing refresh\n if (!options.forceRefresh && this.config.defaultConfigurations?.[key]) {\n return this.config.defaultConfigurations[key];\n }\n\n // Fetch from API\n const response = await this.fetchConfig(options);\n if (response) {\n return response.configurations[key];\n }\n \n // Return default as fallback\n return this.config.defaultConfigurations?.[key];\n } catch (error) {\n const formattedError = this.formatError(error, 'getConfigAsync');\n this.logError(formattedError);\n // Return default as fallback\n return this.config.defaultConfigurations?.[key];\n }\n }\n\n /**\n * Get all configurations asynchronously (cache-first with fallback to API)\n */\n async getAllConfigsAsync(options: RemoteConfigOptions = {}): Promise<Record<string, string>> {\n try {\n // Return cache if available and not forcing refresh\n if (!options.forceRefresh && this.configCache?.configurations) {\n return { ...this.config.defaultConfigurations, ...this.configCache.configurations };\n }\n\n // Fetch from API\n const response = await this.fetchConfig(options);\n if (response) {\n return { ...this.config.defaultConfigurations, ...response.configurations };\n }\n \n // Return defaults as fallback\n return { ...this.config.defaultConfigurations };\n } catch (error) {\n const formattedError = this.formatError(error, 'getAllConfigsAsync');\n this.logError(formattedError);\n // Return defaults as fallback\n return { ...this.config.defaultConfigurations };\n }\n }\n\n /**\n * Update configuration cache and notify listeners\n */\n private updateConfigCache(response: RemoteConfigResponse, userId: string): void {\n const newCache: RemoteConfigCache = {\n configurations: response.configurations,\n snapshotId: response.snapshotId,\n timestamp: response.timestamp,\n userId,\n };\n\n const oldConfigs = this.configCache?.configurations || {};\n this.configCache = newCache;\n this.saveConfigCache(newCache);\n\n // Notify listeners if configurations changed\n if (JSON.stringify(oldConfigs) !== JSON.stringify(response.configurations)) {\n this.notifyConfigChangeListeners(response.configurations);\n }\n }\n\n /**\n * Add configuration change listener\n */\n addConfigChangeListener(listener: ConfigChangeListener): void {\n this.configChangeListeners.push(listener);\n }\n\n /**\n * Remove configuration change listener\n */\n removeConfigChangeListener(listener: ConfigChangeListener): void {\n const index = this.configChangeListeners.indexOf(listener);\n if (index > -1) {\n this.configChangeListeners.splice(index, 1);\n }\n }\n\n /**\n * Notify all configuration change listeners\n */\n private notifyConfigChangeListeners(configurations: Record<string, string>): void {\n this.configChangeListeners.forEach(listener => {\n try {\n listener(configurations);\n } catch (error) {\n console.error('[Grain Analytics] Config change listener error:', error);\n }\n });\n }\n\n /**\n * Start automatic configuration refresh timer\n */\n private startConfigRefreshTimer(): void {\n if (typeof window === 'undefined') return;\n \n if (this.configRefreshTimer) {\n clearInterval(this.configRefreshTimer);\n }\n\n this.configRefreshTimer = window.setInterval(() => {\n if (!this.isDestroyed) {\n // Use effective userId (will be generated if not set)\n this.fetchConfig().catch((error) => {\n const formattedError = this.formatError(error, 'auto-config refresh');\n this.logError(formattedError);\n });\n }\n }, this.config.configRefreshInterval);\n }\n\n /**\n * Stop automatic configuration refresh timer\n */\n private stopConfigRefreshTimer(): void {\n if (this.configRefreshTimer) {\n clearInterval(this.configRefreshTimer);\n this.configRefreshTimer = null;\n }\n }\n\n /**\n * Preload configurations for immediate access\n */\n async preloadConfig(immediateKeys: string[] = [], properties?: Record<string, string>): Promise<void> {\n try {\n // Use effective userId (will be generated if not set)\n const effectiveUserId = this.getEffectiveUserIdInternal();\n this.log(`Preloading config for user: ${effectiveUserId}`);\n\n const response = await this.fetchConfig({ immediateKeys, properties });\n if (response) {\n this.startConfigRefreshTimer();\n }\n } catch (error) {\n const formattedError = this.formatError(error, 'preloadConfig');\n this.logError(formattedError);\n }\n }\n\n /**\n * Split events array into chunks of specified size\n */\n private chunkEvents(events: EventPayload[], chunkSize: number): EventPayload[][] {\n const chunks: EventPayload[][] = [];\n for (let i = 0; i < events.length; i += chunkSize) {\n chunks.push(events.slice(i, i + chunkSize));\n }\n return chunks;\n }\n\n // Privacy & Consent Methods\n\n /**\n * Grant consent for tracking (v2.0)\n * Switches from cookieless mode to permanent IDs\n * @param categories - Optional array of consent categories (e.g., ['analytics', 'functional'])\n */\n grantConsent(categories?: string[]): void {\n try {\n this.consentManager.grantConsent(categories);\n \n // Sync ID manager with consent state\n const idMode = this.consentManager.getIdMode();\n this.idManager.setMode(idMode);\n \n this.log('Consent granted, switched to permanent IDs', categories);\n \n // Process any queued events waiting for consent\n if (this.waitingForConsentQueue.length > 0) {\n this.log(`Processing ${this.waitingForConsentQueue.length} queued events`);\n this.eventQueue.push(...this.waitingForConsentQueue);\n this.waitingForConsentQueue = [];\n this.flush();\n }\n } catch (error) {\n const formattedError = this.formatError(error, 'grantConsent');\n this.logError(formattedError);\n }\n }\n\n /**\n * Revoke consent for tracking (v2.0)\n * Switches from permanent IDs to cookieless mode\n * @param categories - Optional array of categories to revoke (if not provided, revokes all)\n */\n revokeConsent(categories?: string[]): void {\n try {\n this.consentManager.revokeConsent(categories);\n \n // Sync ID manager with consent state\n const idMode = this.consentManager.getIdMode();\n this.idManager.setMode(idMode);\n \n this.log('Consent revoked, switched to cookieless mode', categories);\n \n // Clear queued events when consent is fully revoked\n if (!this.consentManager.hasConsent()) {\n this.eventQueue = [];\n this.waitingForConsentQueue = [];\n }\n } catch (error) {\n const formattedError = this.formatError(error, 'revokeConsent');\n this.logError(formattedError);\n }\n }\n\n /**\n * Get current consent state\n */\n getConsentState(): ConsentState | null {\n return this.consentManager.getConsentState();\n }\n\n /**\n * Check if user has granted consent\n * @param category - Optional category to check (if not provided, checks general consent)\n */\n hasConsent(category?: string): boolean {\n return this.consentManager.hasConsent(category);\n }\n\n /**\n * Add listener for consent state changes\n */\n onConsentChange(listener: (state: ConsentState) => void): void {\n this.consentManager.addListener(listener);\n }\n\n /**\n * Remove consent change listener\n */\n offConsentChange(listener: (state: ConsentState) => void): void {\n this.consentManager.removeListener(listener);\n }\n\n /**\n * Check for debug mode parameters and initialize debug agent if valid\n */\n private checkAndInitializeDebugMode(): void {\n if (typeof window === 'undefined') return;\n \n try {\n const urlParams = new URLSearchParams(window.location.search);\n const isDebug = urlParams.get('grain_debug') === '1';\n const sessionId = urlParams.get('grain_session');\n \n if (!isDebug || !sessionId) {\n return;\n }\n \n this.log('Debug mode detected, verifying session:', sessionId);\n \n // Verify session with API\n this.verifyDebugSession(sessionId, window.location.hostname)\n .then((valid) => {\n if (valid) {\n this.log('Debug session verified, initializing debug agent');\n this.isDebugMode = true;\n this.initializeDebugAgent(sessionId);\n } else {\n this.log('Debug session verification failed');\n }\n })\n .catch((error) => {\n this.log('Failed to verify debug session:', error);\n });\n } catch (error) {\n this.log('Error checking debug mode:', error);\n }\n }\n \n /**\n * Verify debug session with API\n */\n private async verifyDebugSession(sessionId: string, domain: string): Promise<boolean> {\n try {\n const url = `${this.config.apiUrl}/v1/tenant/${encodeURIComponent(this.config.tenantId)}/debug-sessions/verify`;\n \n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n sessionId,\n domain,\n }),\n });\n \n if (!response.ok) {\n return false;\n }\n \n const result = await response.json();\n return result.valid === true;\n } catch (error) {\n this.log('Debug session verification error:', error);\n return false;\n }\n }\n \n /**\n * Initialize debug agent\n */\n private initializeDebugAgent(sessionId: string): void {\n if (typeof window === 'undefined') return;\n \n try {\n this.log('Loading debug agent module');\n \n import('./debug-agent').then(({ DebugAgent }) => {\n try {\n this.debugAgent = new DebugAgent(\n this,\n sessionId,\n this.config.tenantId,\n this.config.apiUrl,\n {\n debug: this.config.debug,\n }\n );\n this.log('Debug agent initialized');\n } catch (error) {\n this.log('Failed to initialize debug agent:', error);\n }\n }).catch((error) => {\n this.log('Failed to load debug agent module:', error);\n });\n } catch (error) {\n this.log('Error initializing debug agent:', error);\n }\n }\n\n /**\n * Destroy the client and clean up resources\n */\n destroy(): void {\n this.isDestroyed = true;\n \n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n\n // Stop config refresh timer\n this.stopConfigRefreshTimer();\n\n // Clear config change listeners\n this.configChangeListeners = [];\n\n // Destroy automatic tracking managers\n if (this.heartbeatManager) {\n this.heartbeatManager.destroy();\n this.heartbeatManager = null;\n }\n\n if (this.pageTrackingManager) {\n this.pageTrackingManager.destroy();\n this.pageTrackingManager = null;\n }\n\n if (this.activityDetector) {\n this.activityDetector.destroy();\n this.activityDetector = null;\n }\n\n // Destroy auto-tracking managers\n if (this.interactionTrackingManager) {\n this.interactionTrackingManager.destroy();\n this.interactionTrackingManager = null;\n }\n\n if (this.sectionTrackingManager) {\n this.sectionTrackingManager.destroy();\n this.sectionTrackingManager = null;\n }\n\n if (this.heatmapTrackingManager) {\n this.heatmapTrackingManager.destroy();\n this.heatmapTrackingManager = null;\n }\n \n // Destroy debug agent\n if (this.debugAgent) {\n this.debugAgent.destroy();\n this.debugAgent = null;\n }\n\n // Send any remaining events (in chunks if necessary)\n if (this.eventQueue.length > 0) {\n const eventsToSend = [...this.eventQueue];\n this.eventQueue = [];\n \n const chunks = this.chunkEvents(eventsToSend, this.config.maxEventsPerRequest);\n \n // Send first chunk with beacon (most important for page unload)\n if (chunks.length > 0) {\n this.sendEventsWithBeacon(chunks[0]).catch(() => {\n // Silently fail during cleanup\n });\n \n // If there are more chunks, try to send them with regular fetch\n for (let i = 1; i < chunks.length; i++) {\n this.sendEventsWithBeacon(chunks[i]).catch(() => {\n // Silently fail during cleanup\n });\n }\n }\n }\n }\n}\n\n/**\n * Create a new Grain Analytics client\n */\nexport function createGrainAnalytics(config: GrainConfig): GrainAnalytics {\n return new GrainAnalytics(config);\n}\n\n// Default export for convenience\nexport default GrainAnalytics;\n\n// Global interface for IIFE build\ndeclare global {\n interface Window {\n Grain?: {\n GrainAnalytics: typeof GrainAnalytics;\n createGrainAnalytics: typeof createGrainAnalytics;\n };\n }\n}\n\n// Auto-setup for IIFE build\nif (typeof window !== 'undefined') {\n window.Grain = {\n GrainAnalytics,\n createGrainAnalytics,\n };\n}", "/**\n * Consent management for Grain Analytics v2.0\n * Privacy-first, cookieless by default\n * \n * Consent Modes:\n * - cookieless: Default mode, daily rotating IDs, no consent needed\n * - gdpr-strict: Requires explicit consent, falls back to cookieless\n * - gdpr-opt-out: Permanent IDs by default, cookieless on opt-out\n */\n\nexport type ConsentMode = 'COOKIELESS' | 'GDPR_STRICT' | 'GDPR_OPT_OUT';\n\nexport interface ConsentState {\n granted: boolean;\n categories: string[];\n timestamp: Date;\n version: string;\n}\n\nexport const DEFAULT_CONSENT_CATEGORIES = ['necessary', 'analytics', 'functional'];\nexport const CONSENT_VERSION = '1.0.0';\n\n/**\n * Consent manager for handling user consent state\n * v2.0: Cookieless by default, privacy-first approach\n */\nexport class ConsentManager {\n private consentState: ConsentState | null = null;\n private consentMode: ConsentMode;\n private storageKey: string;\n private listeners: Array<(state: ConsentState) => void> = [];\n\n constructor(tenantId: string, consentMode: ConsentMode = 'COOKIELESS') {\n this.consentMode = consentMode;\n this.storageKey = `grain_consent_${tenantId}`;\n this.loadConsentState();\n }\n\n /**\n * Load consent state from localStorage\n * \n * GDPR Compliance: localStorage only used for storing consent preferences\n * (not for tracking), which is a legitimate interest for compliance.\n */\n private loadConsentState(): void {\n if (typeof window === 'undefined') return;\n\n try {\n const stored = localStorage.getItem(this.storageKey);\n if (stored) {\n const parsed = JSON.parse(stored);\n this.consentState = {\n ...parsed,\n timestamp: new Date(parsed.timestamp),\n };\n } else if (this.consentMode === 'GDPR_OPT_OUT') {\n // Auto-grant consent for opt-out mode (user hasn't opted out yet)\n this.consentState = {\n granted: true,\n categories: DEFAULT_CONSENT_CATEGORIES,\n timestamp: new Date(),\n version: CONSENT_VERSION,\n };\n this.saveConsentState();\n }\n // Note: cookieless and gdpr-strict modes without stored consent \u2192 no permanent tracking\n } catch (error) {\n // Silent failure - will use cookieless mode by default\n }\n }\n\n /**\n * Save consent state to localStorage\n */\n private saveConsentState(): void {\n if (typeof window === 'undefined' || !this.consentState) return;\n\n try {\n localStorage.setItem(this.storageKey, JSON.stringify(this.consentState));\n } catch (error) {\n // Silent failure - consent state won't persist\n }\n }\n\n /**\n * Grant consent with optional categories\n */\n grantConsent(categories?: string[]): void {\n const grantedCategories = categories || DEFAULT_CONSENT_CATEGORIES;\n \n this.consentState = {\n granted: true,\n categories: grantedCategories,\n timestamp: new Date(),\n version: CONSENT_VERSION,\n };\n\n this.saveConsentState();\n this.notifyListeners();\n }\n\n /**\n * Revoke consent (opt-out)\n */\n revokeConsent(categories?: string[]): void {\n if (!this.consentState) {\n this.consentState = {\n granted: false,\n categories: [],\n timestamp: new Date(),\n version: CONSENT_VERSION,\n };\n } else if (categories) {\n // Remove specific categories\n this.consentState = {\n ...this.consentState,\n categories: this.consentState.categories.filter(cat => !categories.includes(cat)),\n granted: this.consentState.categories.length > 0,\n timestamp: new Date(),\n };\n } else {\n // Revoke all consent\n this.consentState = {\n granted: false,\n categories: [],\n timestamp: new Date(),\n version: CONSENT_VERSION,\n };\n }\n\n this.saveConsentState();\n this.notifyListeners();\n }\n\n /**\n * Get current consent state\n */\n getConsentState(): ConsentState | null {\n return this.consentState ? { ...this.consentState } : null;\n }\n\n /**\n * Check if user has granted consent for permanent IDs\n */\n hasConsent(category?: string): boolean {\n // Cookieless mode: no consent needed (no permanent tracking)\n if (this.consentMode === 'COOKIELESS') {\n return false; // No permanent IDs\n }\n\n // GDPR Strict: requires explicit consent\n if (this.consentMode === 'GDPR_STRICT') {\n if (!this.consentState?.granted) {\n return false;\n }\n }\n\n // GDPR Opt-out: consent by default unless explicitly revoked\n if (this.consentMode === 'GDPR_OPT_OUT') {\n // If no state, assume consent (opt-out model)\n if (!this.consentState) {\n return true;\n }\n // Check if consent was revoked\n if (!this.consentState.granted) {\n return false;\n }\n }\n\n // Check specific category if provided\n if (category && this.consentState) {\n return this.consentState.categories.includes(category);\n }\n\n return this.consentState?.granted ?? (this.consentMode === 'GDPR_OPT_OUT');\n }\n\n /**\n * Check if permanent IDs are allowed\n */\n shouldUsePermanentId(): boolean {\n return this.hasConsent();\n }\n\n /**\n * Check if we should strip query parameters from URLs\n * Query params stripped unless:\n * - Mode is gdpr-opt-out, OR\n * - Mode is gdpr-strict AND consent given\n */\n shouldStripQueryParams(): boolean {\n if (this.consentMode === 'COOKIELESS') {\n return true; // Always strip in cookieless mode\n }\n \n if (this.consentMode === 'GDPR_STRICT') {\n return !this.hasConsent(); // Strip unless consented\n }\n \n if (this.consentMode === 'GDPR_OPT_OUT') {\n return false; // Don't strip in opt-out mode\n }\n \n return true; // Default: strip\n }\n\n /**\n * Check if we can track events (always true in v2.0)\n * Even cookieless mode allows basic analytics with daily IDs\n */\n canTrack(): boolean {\n return true; // All modes allow some form of tracking\n }\n\n /**\n * Check if we should wait for consent before tracking\n * Only relevant for GDPR Strict mode\n */\n shouldWaitForConsent(): boolean {\n return this.consentMode === 'GDPR_STRICT' && !this.consentState?.granted;\n }\n\n /**\n * Add consent change listener\n */\n addListener(listener: (state: ConsentState) => void): void {\n this.listeners.push(listener);\n }\n\n /**\n * Remove consent change listener\n */\n removeListener(listener: (state: ConsentState) => void): void {\n const index = this.listeners.indexOf(listener);\n if (index > -1) {\n this.listeners.splice(index, 1);\n }\n }\n\n /**\n * Notify all listeners of consent state change\n */\n private notifyListeners(): void {\n if (!this.consentState) return;\n\n this.listeners.forEach(listener => {\n try {\n listener(this.consentState!);\n } catch (error) {\n // Silent failure - listener threw an error\n }\n });\n }\n\n /**\n * Clear all consent data\n */\n clearConsent(): void {\n if (typeof window === 'undefined') return;\n\n try {\n localStorage.removeItem(this.storageKey);\n this.consentState = null;\n } catch (error) {\n // Silent failure - consent state may not be fully cleared\n }\n }\n\n /**\n * Get current consent mode\n */\n getConsentMode(): ConsentMode {\n return this.consentMode;\n }\n\n /**\n * Get ID mode based on consent state\n * Returns 'cookieless' or 'permanent' for IdManager\n */\n getIdMode(): 'cookieless' | 'permanent' {\n return this.shouldUsePermanentId() ? 'permanent' : 'cookieless';\n }\n}\n\n", "/**\n * Cookie utilities for Grain Analytics\n * Provides GDPR-compliant cookie management with configurable options\n */\n\nexport interface CookieConfig {\n domain?: string;\n path?: string;\n sameSite?: 'strict' | 'lax' | 'none';\n secure?: boolean;\n maxAge?: number; // seconds\n}\n\n/**\n * Set a cookie with configurable options\n */\nexport function setCookie(name: string, value: string, config?: CookieConfig): void {\n if (typeof document === 'undefined') return;\n\n const parts = [`${encodeURIComponent(name)}=${encodeURIComponent(value)}`];\n \n if (config?.maxAge !== undefined) {\n parts.push(`max-age=${config.maxAge}`);\n }\n \n if (config?.domain) {\n parts.push(`domain=${config.domain}`);\n }\n \n if (config?.path) {\n parts.push(`path=${config.path}`);\n } else {\n parts.push('path=/');\n }\n \n if (config?.sameSite) {\n parts.push(`samesite=${config.sameSite}`);\n }\n \n if (config?.secure) {\n parts.push('secure');\n }\n \n document.cookie = parts.join('; ');\n}\n\n/**\n * Get a cookie value by name\n */\nexport function getCookie(name: string): string | null {\n if (typeof document === 'undefined') return null;\n\n const nameEQ = encodeURIComponent(name) + '=';\n const cookies = document.cookie.split(';');\n \n for (let i = 0; i < cookies.length; i++) {\n let cookie = cookies[i];\n while (cookie.charAt(0) === ' ') {\n cookie = cookie.substring(1);\n }\n if (cookie.indexOf(nameEQ) === 0) {\n return decodeURIComponent(cookie.substring(nameEQ.length));\n }\n }\n \n return null;\n}\n\n/**\n * Delete a cookie by name\n */\nexport function deleteCookie(name: string, config?: Pick<CookieConfig, 'domain' | 'path'>): void {\n if (typeof document === 'undefined') return;\n\n const parts = [\n `${encodeURIComponent(name)}=`,\n 'max-age=0',\n ];\n \n if (config?.domain) {\n parts.push(`domain=${config.domain}`);\n }\n \n if (config?.path) {\n parts.push(`path=${config.path}`);\n } else {\n parts.push('path=/');\n }\n \n document.cookie = parts.join('; ');\n}\n\n/**\n * Check if cookies are available and working\n */\nexport function areCookiesEnabled(): boolean {\n if (typeof document === 'undefined') return false;\n\n try {\n const testCookie = '_grain_cookie_test';\n setCookie(testCookie, 'test', { maxAge: 1 });\n const result = getCookie(testCookie) === 'test';\n deleteCookie(testCookie);\n return result;\n } catch {\n return false;\n }\n}\n\n", "/**\n * Activity Detection for Grain Analytics\n * Tracks user activity (mouse, keyboard, touch, scroll) to determine if user is active\n */\n\nexport class ActivityDetector {\n private lastActivityTime: number;\n private activityThreshold: number = 30000; // 30 seconds\n private listeners: Array<() => void> = [];\n private boundActivityHandler: () => void;\n private isDestroyed = false;\n\n // Events that indicate user activity\n private readonly activityEvents = [\n 'mousemove',\n 'mousedown',\n 'keydown',\n 'scroll',\n 'touchstart',\n 'click',\n ] as const;\n\n constructor() {\n this.lastActivityTime = Date.now();\n this.boundActivityHandler = this.debounce(this.handleActivity.bind(this), 500);\n this.setupListeners();\n }\n\n /**\n * Setup event listeners for activity detection\n */\n private setupListeners(): void {\n if (typeof window === 'undefined') return;\n\n for (const event of this.activityEvents) {\n window.addEventListener(event, this.boundActivityHandler, { passive: true });\n }\n }\n\n /**\n * Handle activity event\n */\n private handleActivity(): void {\n if (this.isDestroyed) return;\n this.lastActivityTime = Date.now();\n this.notifyListeners();\n }\n\n /**\n * Debounce function to limit how often activity handler is called\n */\n private debounce(func: () => void, wait: number): () => void {\n let timeout: number | null = null;\n \n return () => {\n if (timeout !== null) {\n clearTimeout(timeout);\n }\n \n timeout = window.setTimeout(() => {\n func();\n timeout = null;\n }, wait);\n };\n }\n\n /**\n * Check if user is currently active\n * @param threshold Time in ms to consider user inactive (default: 30s)\n */\n isActive(threshold?: number): boolean {\n const thresholdToUse = threshold ?? this.activityThreshold;\n const now = Date.now();\n return (now - this.lastActivityTime) < thresholdToUse;\n }\n\n /**\n * Get time since last activity in milliseconds\n */\n getTimeSinceLastActivity(): number {\n return Date.now() - this.lastActivityTime;\n }\n\n /**\n * Get last activity timestamp\n */\n getLastActivityTime(): number {\n return this.lastActivityTime;\n }\n\n /**\n * Set activity threshold\n */\n setActivityThreshold(threshold: number): void {\n this.activityThreshold = threshold;\n }\n\n /**\n * Add listener for activity changes\n */\n addListener(listener: () => void): void {\n this.listeners.push(listener);\n }\n\n /**\n * Remove listener\n */\n removeListener(listener: () => void): void {\n const index = this.listeners.indexOf(listener);\n if (index > -1) {\n this.listeners.splice(index, 1);\n }\n }\n\n /**\n * Notify all listeners\n */\n private notifyListeners(): void {\n for (const listener of this.listeners) {\n try {\n listener();\n } catch (error) {\n // Silent failure - listener threw an error\n }\n }\n }\n\n /**\n * Cleanup and remove listeners\n */\n destroy(): void {\n if (this.isDestroyed) return;\n \n if (typeof window !== 'undefined') {\n for (const event of this.activityEvents) {\n window.removeEventListener(event, this.boundActivityHandler);\n }\n }\n \n this.listeners = [];\n this.isDestroyed = true;\n }\n}\n\n", "/**\n * Heartbeat Manager for Grain Analytics\n * Tracks session activity with consent-aware behavior\n */\n\nimport type { ActivityDetector } from './activity';\n\nexport interface HeartbeatConfig {\n activeInterval: number; // Interval when user is active (ms)\n inactiveInterval: number; // Interval when user is inactive (ms)\n debug?: boolean;\n}\n\nexport interface HeartbeatTracker {\n trackSystemEvent(eventName: string, properties: Record<string, unknown>): void;\n hasConsent(category?: string): boolean;\n getEffectiveUserId(): string;\n getEphemeralSessionId(): string;\n getSessionId(): string;\n getCurrentPage(): string | null;\n getEventCountSinceLastHeartbeat(): number;\n resetEventCountSinceLastHeartbeat(): void;\n}\n\nexport class HeartbeatManager {\n private config: HeartbeatConfig;\n private tracker: HeartbeatTracker;\n private activityDetector: ActivityDetector;\n private heartbeatTimer: number | null = null;\n private isDestroyed = false;\n private lastHeartbeatTime: number;\n private currentInterval: number;\n private hasSentPageLoadHeartbeat = false;\n\n constructor(\n tracker: HeartbeatTracker,\n activityDetector: ActivityDetector,\n config: HeartbeatConfig\n ) {\n this.tracker = tracker;\n this.activityDetector = activityDetector;\n this.config = config;\n this.lastHeartbeatTime = Date.now();\n this.currentInterval = config.activeInterval;\n\n // Send initial heartbeat when page loads (if allowed by consent)\n this.sendPageLoadHeartbeat();\n \n // Start periodic heartbeat tracking\n this.scheduleNextHeartbeat();\n }\n\n /**\n * Send initial heartbeat when page loads\n */\n private sendPageLoadHeartbeat(): void {\n if (this.isDestroyed || this.hasSentPageLoadHeartbeat) return;\n\n // Wait for page to be fully loaded\n if (typeof window !== 'undefined' && document.readyState !== 'complete') {\n const handleLoad = () => {\n this.sendHeartbeat('page_load');\n this.hasSentPageLoadHeartbeat = true;\n window.removeEventListener('load', handleLoad);\n };\n window.addEventListener('load', handleLoad);\n } else {\n // Page is already loaded or we're in a non-browser environment\n this.sendHeartbeat('page_load');\n this.hasSentPageLoadHeartbeat = true;\n }\n }\n\n /**\n * Schedule the next heartbeat based on current activity\n */\n private scheduleNextHeartbeat(): void {\n if (this.isDestroyed) return;\n\n // Clear existing timer\n if (this.heartbeatTimer !== null) {\n clearTimeout(this.heartbeatTimer);\n }\n\n // Determine interval based on activity\n const isActive = this.activityDetector.isActive(60000); // 1 minute threshold\n this.currentInterval = isActive ? this.config.activeInterval : this.config.inactiveInterval;\n\n // Schedule next heartbeat\n this.heartbeatTimer = window.setTimeout(() => {\n this.sendHeartbeat('periodic');\n this.scheduleNextHeartbeat();\n }, this.currentInterval);\n\n if (this.config.debug) {\n console.log(\n `[Heartbeat] Scheduled next heartbeat in ${this.currentInterval / 1000}s (${isActive ? 'active' : 'inactive'})`\n );\n }\n }\n\n /**\n * Send heartbeat event\n */\n private sendHeartbeat(heartbeatType: 'periodic' | 'page_load' = 'periodic'): void {\n if (this.isDestroyed) return;\n\n const now = Date.now();\n const isActive = this.activityDetector.isActive(60000); // 1 minute threshold\n const hasConsent = this.tracker.hasConsent('analytics');\n\n // Base properties (always included)\n const properties: Record<string, unknown> = {\n heartbeat_type: heartbeatType,\n status: isActive ? 'active' : 'inactive',\n timestamp: now,\n };\n\n // Enhanced properties when consent is granted\n if (hasConsent) {\n const page = this.tracker.getCurrentPage();\n if (page) {\n properties.page = page;\n }\n \n properties.session_id = this.tracker.getSessionId();\n \n // Only include duration and event count for periodic heartbeats\n if (heartbeatType === 'periodic') {\n properties.duration = now - this.lastHeartbeatTime;\n properties.event_count = this.tracker.getEventCountSinceLastHeartbeat();\n \n // Reset event count\n this.tracker.resetEventCountSinceLastHeartbeat();\n }\n }\n\n // Track the heartbeat event\n this.tracker.trackSystemEvent('_grain_heartbeat', properties);\n\n this.lastHeartbeatTime = now;\n }\n\n /**\n * Destroy the heartbeat manager\n */\n destroy(): void {\n if (this.isDestroyed) return;\n\n if (this.heartbeatTimer !== null) {\n clearTimeout(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n\n this.isDestroyed = true;\n }\n}\n\n", "/**\n * Attribution and Referral Tracking for Grain Analytics\n * Handles referral categorization and first-touch attribution\n */\n\nexport type ReferrerCategory = 'organic' | 'paid' | 'social' | 'direct' | 'email' | 'referral';\n\nexport interface UTMParameters {\n utm_source?: string;\n utm_medium?: string;\n utm_campaign?: string;\n utm_term?: string;\n utm_content?: string;\n}\n\nexport interface FirstTouchAttribution {\n source: string;\n medium: string;\n campaign: string;\n referrer: string;\n referrer_category: ReferrerCategory;\n timestamp: number;\n}\n\n/**\n * Known paid search parameters\n */\nconst PAID_SEARCH_PARAMS = [\n 'gclid', // Google Ads\n 'msclkid', // Microsoft Ads\n 'fbclid', // Facebook Ads\n 'ttclid', // TikTok Ads\n 'li_fat_id', // LinkedIn Ads\n 'twclid', // Twitter Ads\n 'ScCid', // Snapchat Ads\n];\n\n/**\n * Known social media domains\n */\nconst SOCIAL_DOMAINS = [\n 'facebook.com',\n 'twitter.com',\n 'x.com',\n 'linkedin.com',\n 'instagram.com',\n 'pinterest.com',\n 'reddit.com',\n 'tiktok.com',\n 'youtube.com',\n 'snapchat.com',\n 't.co', // Twitter short links\n 'fb.me', // Facebook short links\n 'lnkd.in', // LinkedIn short links\n];\n\n/**\n * Known organic search engines\n */\nconst SEARCH_ENGINES = [\n 'google.',\n 'bing.com',\n 'yahoo.com',\n 'duckduckgo.com',\n 'baidu.com',\n 'yandex.com',\n 'ecosia.org',\n 'ask.com',\n];\n\n/**\n * Email client domains\n */\nconst EMAIL_DOMAINS = [\n 'mail.google.com',\n 'outlook.live.com',\n 'mail.yahoo.com',\n 'mail.aol.com',\n];\n\n/**\n * Extract domain from URL\n */\nfunction extractDomain(url: string): string {\n try {\n const urlObj = new URL(url);\n return urlObj.hostname.toLowerCase();\n } catch {\n return '';\n }\n}\n\n/**\n * Check if URL contains paid search parameters\n */\nfunction hasPaidSearchParams(url: string): boolean {\n try {\n const urlObj = new URL(url);\n return PAID_SEARCH_PARAMS.some(param => urlObj.searchParams.has(param));\n } catch {\n return false;\n }\n}\n\n/**\n * Categorize referrer based on domain and parameters\n */\nexport function categorizeReferrer(referrer: string, currentUrl: string = ''): ReferrerCategory {\n // Direct traffic (no referrer)\n if (!referrer || referrer.trim() === '') {\n return 'direct';\n }\n\n const domain = extractDomain(referrer);\n \n // Same domain = direct\n if (currentUrl) {\n const currentDomain = extractDomain(currentUrl);\n if (domain === currentDomain) {\n return 'direct';\n }\n }\n\n // Check for paid search parameters\n if (hasPaidSearchParams(referrer) || hasPaidSearchParams(currentUrl)) {\n return 'paid';\n }\n\n // Email clients\n if (EMAIL_DOMAINS.some(emailDomain => domain.includes(emailDomain))) {\n return 'email';\n }\n\n // Social media\n if (SOCIAL_DOMAINS.some(socialDomain => domain.includes(socialDomain))) {\n return 'social';\n }\n\n // Organic search engines\n if (SEARCH_ENGINES.some(searchEngine => domain.includes(searchEngine))) {\n return 'organic';\n }\n\n // Everything else is referral\n return 'referral';\n}\n\n/**\n * Parse UTM parameters from URL\n */\nexport function parseUTMParameters(url: string): UTMParameters {\n try {\n const urlObj = new URL(url);\n const params: UTMParameters = {};\n\n const utmSource = urlObj.searchParams.get('utm_source');\n const utmMedium = urlObj.searchParams.get('utm_medium');\n const utmCampaign = urlObj.searchParams.get('utm_campaign');\n const utmTerm = urlObj.searchParams.get('utm_term');\n const utmContent = urlObj.searchParams.get('utm_content');\n\n if (utmSource) params.utm_source = utmSource;\n if (utmMedium) params.utm_medium = utmMedium;\n if (utmCampaign) params.utm_campaign = utmCampaign;\n if (utmTerm) params.utm_term = utmTerm;\n if (utmContent) params.utm_content = utmContent;\n\n return params;\n } catch {\n return {};\n }\n}\n\n/**\n * Get first-touch attribution from localStorage\n */\nexport function getFirstTouchAttribution(tenantId: string): FirstTouchAttribution | null {\n if (typeof window === 'undefined' || typeof localStorage === 'undefined') {\n return null;\n }\n\n try {\n const key = `_grain_first_touch_${tenantId}`;\n const stored = localStorage.getItem(key);\n if (stored) {\n return JSON.parse(stored) as FirstTouchAttribution;\n }\n } catch (error) {\n console.warn('[Grain Attribution] Failed to retrieve first-touch attribution:', error);\n }\n\n return null;\n}\n\n/**\n * Set first-touch attribution in localStorage\n */\nexport function setFirstTouchAttribution(\n tenantId: string,\n attribution: FirstTouchAttribution\n): void {\n if (typeof window === 'undefined' || typeof localStorage === 'undefined') {\n return;\n }\n\n try {\n const key = `_grain_first_touch_${tenantId}`;\n localStorage.setItem(key, JSON.stringify(attribution));\n } catch (error) {\n console.warn('[Grain Attribution] Failed to store first-touch attribution:', error);\n }\n}\n\n/**\n * Get or create first-touch attribution\n */\nexport function getOrCreateFirstTouchAttribution(\n tenantId: string,\n referrer: string,\n currentUrl: string,\n utmParams: UTMParameters\n): FirstTouchAttribution {\n // Try to get existing first-touch\n const existing = getFirstTouchAttribution(tenantId);\n if (existing) {\n return existing;\n }\n\n // Create new first-touch attribution\n const referrerCategory = categorizeReferrer(referrer, currentUrl);\n const referrerDomain = extractDomain(referrer);\n\n const firstTouch: FirstTouchAttribution = {\n source: utmParams.utm_source || referrerDomain || 'direct',\n medium: utmParams.utm_medium || referrerCategory,\n campaign: utmParams.utm_campaign || 'none',\n referrer: referrer || 'direct',\n referrer_category: referrerCategory,\n timestamp: Date.now(),\n };\n\n // Store it\n setFirstTouchAttribution(tenantId, firstTouch);\n\n return firstTouch;\n}\n\n/**\n * Get session UTM parameters (memory-only, not persisted across page loads)\n */\nlet sessionUTMParams: UTMParameters | null = null;\n\nexport function getSessionUTMParameters(): UTMParameters | null {\n return sessionUTMParams;\n}\n\nexport function setSessionUTMParameters(params: UTMParameters): void {\n sessionUTMParams = params;\n}\n\n/**\n * Clear session UTM parameters\n */\nexport function clearSessionUTMParameters(): void {\n sessionUTMParams = null;\n}\n\n", "const countries = {\n\t\tAD: \"Andorra\",\n\t\tAE: \"United Arab Emirates\",\n\t\tAF: \"Afghanistan\",\n\t\tAG: \"Antigua and Barbuda\",\n\t\tAI: \"Anguilla\",\n\t\tAL: \"Albania\",\n\t\tAM: \"Armenia\",\n\t\tAO: \"Angola\",\n\t\tAQ: \"Antarctica\",\n\t\tAR: \"Argentina\",\n\t\tAS: \"American Samoa\",\n\t\tAT: \"Austria\",\n\t\tAU: \"Australia\",\n\t\tAW: \"Aruba\",\n\t\tAX: \"\u00C5land Islands\",\n\t\tAZ: \"Azerbaijan\",\n\t\tBA: \"Bosnia and Herzegovina\",\n\t\tBB: \"Barbados\",\n\t\tBD: \"Bangladesh\",\n\t\tBE: \"Belgium\",\n\t\tBF: \"Burkina Faso\",\n\t\tBG: \"Bulgaria\",\n\t\tBH: \"Bahrain\",\n\t\tBI: \"Burundi\",\n\t\tBJ: \"Benin\",\n\t\tBL: \"Saint Barth\u00E9lemy\",\n\t\tBM: \"Bermuda\",\n\t\tBN: \"Brunei\",\n\t\tBO: \"Bolivia\",\n\t\tBQ: \"Caribbean Netherlands\",\n\t\tBR: \"Brazil\",\n\t\tBS: \"Bahamas\",\n\t\tBT: \"Bhutan\",\n\t\tBV: \"Bouvet Island\",\n\t\tBW: \"Botswana\",\n\t\tBY: \"Belarus\",\n\t\tBZ: \"Belize\",\n\t\tCA: \"Canada\",\n\t\tCC: \"Cocos Islands\",\n\t\tCD: \"Democratic Republic of the Congo\",\n\t\tCF: \"Central African Republic\",\n\t\tCG: \"Republic of the Congo\",\n\t\tCH: \"Switzerland\",\n\t\tCI: \"Ivory Coast\",\n\t\tCK: \"Cook Islands\",\n\t\tCL: \"Chile\",\n\t\tCM: \"Cameroon\",\n\t\tCN: \"China\",\n\t\tCO: \"Colombia\",\n\t\tCR: \"Costa Rica\",\n\t\tCU: \"Cuba\",\n\t\tCV: \"Cabo Verde\",\n\t\tCW: \"Cura\u00E7ao\",\n\t\tCX: \"Christmas Island\",\n\t\tCY: \"Cyprus\",\n\t\tCZ: \"Czechia\",\n\t\tDE: \"Germany\",\n\t\tDJ: \"Djibouti\",\n\t\tDK: \"Denmark\",\n\t\tDM: \"Dominica\",\n\t\tDO: \"Dominican Republic\",\n\t\tDZ: \"Algeria\",\n\t\tEC: \"Ecuador\",\n\t\tEE: \"Estonia\",\n\t\tEG: \"Egypt\",\n\t\tEH: \"Western Sahara\",\n\t\tER: \"Eritrea\",\n\t\tES: \"Spain\",\n\t\tET: \"Ethiopia\",\n\t\tFI: \"Finland\",\n\t\tFJ: \"Fiji\",\n\t\tFK: \"Falkland Islands\",\n\t\tFM: \"Micronesia\",\n\t\tFO: \"Faroe Islands\",\n\t\tFR: \"France\",\n\t\tGA: \"Gabon\",\n\t\tGB: \"United Kingdom\",\n\t\tGD: \"Grenada\",\n\t\tGE: \"Georgia\",\n\t\tGF: \"French Guiana\",\n\t\tGG: \"Guernsey\",\n\t\tGH: \"Ghana\",\n\t\tGI: \"Gibraltar\",\n\t\tGL: \"Greenland\",\n\t\tGM: \"Gambia\",\n\t\tGN: \"Guinea\",\n\t\tGP: \"Guadeloupe\",\n\t\tGQ: \"Equatorial Guinea\",\n\t\tGR: \"Greece\",\n\t\tGS: \"South Georgia and the South Sandwich Islands\",\n\t\tGT: \"Guatemala\",\n\t\tGU: \"Guam\",\n\t\tGW: \"Guinea-Bissau\",\n\t\tGY: \"Guyana\",\n\t\tHK: \"Hong Kong\",\n\t\tHM: \"Heard Island and McDonald Islands\",\n\t\tHN: \"Honduras\",\n\t\tHR: \"Croatia\",\n\t\tHT: \"Haiti\",\n\t\tHU: \"Hungary\",\n\t\tID: \"Indonesia\",\n\t\tIE: \"Ireland\",\n\t\tIL: \"Israel\",\n\t\tIM: \"Isle of Man\",\n\t\tIN: \"India\",\n\t\tIO: \"British Indian Ocean Territory\",\n\t\tIQ: \"Iraq\",\n\t\tIR: \"Iran\",\n\t\tIS: \"Iceland\",\n\t\tIT: \"Italy\",\n\t\tJE: \"Jersey\",\n\t\tJM: \"Jamaica\",\n\t\tJO: \"Jordan\",\n\t\tJP: \"Japan\",\n\t\tKE: \"Kenya\",\n\t\tKG: \"Kyrgyzstan\",\n\t\tKH: \"Cambodia\",\n\t\tKI: \"Kiribati\",\n\t\tKM: \"Comoros\",\n\t\tKN: \"Saint Kitts and Nevis\",\n\t\tKP: \"North Korea\",\n\t\tKR: \"South Korea\",\n\t\tKW: \"Kuwait\",\n\t\tKY: \"Cayman Islands\",\n\t\tKZ: \"Kazakhstan\",\n\t\tLA: \"Laos\",\n\t\tLB: \"Lebanon\",\n\t\tLC: \"Saint Lucia\",\n\t\tLI: \"Liechtenstein\",\n\t\tLK: \"Sri Lanka\",\n\t\tLR: \"Liberia\",\n\t\tLS: \"Lesotho\",\n\t\tLT: \"Lithuania\",\n\t\tLU: \"Luxembourg\",\n\t\tLV: \"Latvia\",\n\t\tLY: \"Libya\",\n\t\tMA: \"Morocco\",\n\t\tMC: \"Monaco\",\n\t\tMD: \"Moldova\",\n\t\tME: \"Montenegro\",\n\t\tMF: \"Saint Martin\",\n\t\tMG: \"Madagascar\",\n\t\tMH: \"Marshall Islands\",\n\t\tMK: \"North Macedonia\",\n\t\tML: \"Mali\",\n\t\tMM: \"Myanmar\",\n\t\tMN: \"Mongolia\",\n\t\tMO: \"Macao\",\n\t\tMP: \"Northern Mariana Islands\",\n\t\tMQ: \"Martinique\",\n\t\tMR: \"Mauritania\",\n\t\tMS: \"Montserrat\",\n\t\tMT: \"Malta\",\n\t\tMU: \"Mauritius\",\n\t\tMV: \"Maldives\",\n\t\tMW: \"Malawi\",\n\t\tMX: \"Mexico\",\n\t\tMY: \"Malaysia\",\n\t\tMZ: \"Mozambique\",\n\t\tNA: \"Namibia\",\n\t\tNC: \"New Caledonia\",\n\t\tNE: \"Niger\",\n\t\tNF: \"Norfolk Island\",\n\t\tNG: \"Nigeria\",\n\t\tNI: \"Nicaragua\",\n\t\tNL: \"Netherlands\",\n\t\tNO: \"Norway\",\n\t\tNP: \"Nepal\",\n\t\tNR: \"Nauru\",\n\t\tNU: \"Niue\",\n\t\tNZ: \"New Zealand\",\n\t\tOM: \"Oman\",\n\t\tPA: \"Panama\",\n\t\tPE: \"Peru\",\n\t\tPF: \"French Polynesia\",\n\t\tPG: \"Papua New Guinea\",\n\t\tPH: \"Philippines\",\n\t\tPK: \"Pakistan\",\n\t\tPL: \"Poland\",\n\t\tPM: \"Saint Pierre and Miquelon\",\n\t\tPN: \"Pitcairn\",\n\t\tPR: \"Puerto Rico\",\n\t\tPS: \"Palestine\",\n\t\tPT: \"Portugal\",\n\t\tPW: \"Palau\",\n\t\tPY: \"Paraguay\",\n\t\tQA: \"Qatar\",\n\t\tRE: \"R\u00E9union\",\n\t\tRO: \"Romania\",\n\t\tRS: \"Serbia\",\n\t\tRU: \"Russia\",\n\t\tRW: \"Rwanda\",\n\t\tSA: \"Saudi Arabia\",\n\t\tSB: \"Solomon Islands\",\n\t\tSC: \"Seychelles\",\n\t\tSD: \"Sudan\",\n\t\tSE: \"Sweden\",\n\t\tSG: \"Singapore\",\n\t\tSH: \"Saint Helena, Ascension and Tristan da Cunha\",\n\t\tSI: \"Slovenia\",\n\t\tSJ: \"Svalbard and Jan Mayen\",\n\t\tSK: \"Slovakia\",\n\t\tSL: \"Sierra Leone\",\n\t\tSM: \"San Marino\",\n\t\tSN: \"Senegal\",\n\t\tSO: \"Somalia\",\n\t\tSR: \"Suriname\",\n\t\tSS: \"South Sudan\",\n\t\tST: \"Sao Tome and Principe\",\n\t\tSV: \"El Salvador\",\n\t\tSX: \"Sint Maarten\",\n\t\tSY: \"Syria\",\n\t\tSZ: \"Eswatini\",\n\t\tTC: \"Turks and Caicos Islands\",\n\t\tTD: \"Chad\",\n\t\tTF: \"French Southern Territories\",\n\t\tTG: \"Togo\",\n\t\tTH: \"Thailand\",\n\t\tTJ: \"Tajikistan\",\n\t\tTK: \"Tokelau\",\n\t\tTL: \"Timor-Leste\",\n\t\tTM: \"Turkmenistan\",\n\t\tTN: \"Tunisia\",\n\t\tTO: \"Tonga\",\n\t\tTR: \"Turkey\",\n\t\tTT: \"Trinidad and Tobago\",\n\t\tTV: \"Tuvalu\",\n\t\tTW: \"Taiwan\",\n\t\tTZ: \"Tanzania\",\n\t\tUA: \"Ukraine\",\n\t\tUG: \"Uganda\",\n\t\tUM: \"United States Minor Outlying Islands\",\n\t\tUS: \"United States of America\",\n\t\tUY: \"Uruguay\",\n\t\tUZ: \"Uzbekistan\",\n\t\tVA: \"Holy See\",\n\t\tVC: \"Saint Vincent and the Grenadines\",\n\t\tVE: \"Venezuela\",\n\t\tVG: \"Virgin Islands (UK)\",\n\t\tVI: \"Virgin Islands (US)\",\n\t\tVN: \"Vietnam\",\n\t\tVU: \"Vanuatu\",\n\t\tWF: \"Wallis and Futuna\",\n\t\tWS: \"Samoa\",\n\t\tYE: \"Yemen\",\n\t\tYT: \"Mayotte\",\n\t\tZA: \"South Africa\",\n\t\tZM: \"Zambia\",\n\t\tZW: \"Zimbabwe\"\n};\n\nconst timezones: Record<string, any> = {\n\t\t\"Africa/Abidjan\": {\n\t\t\tu: 0,\n\t\t\tc: [\"CI\", \"BF\", \"GH\", \"GM\", \"GN\", \"ML\", \"MR\", \"SH\", \"SL\", \"SN\", \"TG\"]\n\t\t},\n\t\t\"Africa/Accra\": {\n\t\t\ta: \"Africa/Abidjan\",\n\t\t\tc: [\"GH\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Addis_Ababa\": {\n\t\t\ta: \"Africa/Nairobi\",\n\t\t\tc: [\"ET\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Algiers\": {\n\t\t\tu: 60,\n\t\t\tc: [\"DZ\"]\n\t\t},\n\t\t\"Africa/Asmara\": {\n\t\t\ta: \"Africa/Nairobi\",\n\t\t\tc: [\"ER\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Asmera\": {\n\t\t\ta: \"Africa/Nairobi\",\n\t\t\tc: [\"ER\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Bamako\": {\n\t\t\ta: \"Africa/Abidjan\",\n\t\t\tc: [\"ML\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Bangui\": {\n\t\t\ta: \"Africa/Lagos\",\n\t\t\tc: [\"CF\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Banjul\": {\n\t\t\ta: \"Africa/Abidjan\",\n\t\t\tc: [\"GM\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Bissau\": {\n\t\t\tu: 0,\n\t\t\tc: [\"GW\"]\n\t\t},\n\t\t\"Africa/Blantyre\": {\n\t\t\ta: \"Africa/Maputo\",\n\t\t\tc: [\"MW\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Brazzaville\": {\n\t\t\ta: \"Africa/Lagos\",\n\t\t\tc: [\"CG\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Bujumbura\": {\n\t\t\ta: \"Africa/Maputo\",\n\t\t\tc: [\"BI\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Cairo\": {\n\t\t\tu: 120,\n\t\t\tc: [\"EG\"]\n\t\t},\n\t\t\"Africa/Casablanca\": {\n\t\t\tu: 60,\n\t\t\td: 0,\n\t\t\tc: [\"MA\"]\n\t\t},\n\t\t\"Africa/Ceuta\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"ES\"]\n\t\t},\n\t\t\"Africa/Conakry\": {\n\t\t\ta: \"Africa/Abidjan\",\n\t\t\tc: [\"GN\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Dakar\": {\n\t\t\ta: \"Africa/Abidjan\",\n\t\t\tc: [\"SN\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Dar_es_Salaam\": {\n\t\t\ta: \"Africa/Nairobi\",\n\t\t\tc: [\"TZ\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Djibouti\": {\n\t\t\ta: \"Africa/Nairobi\",\n\t\t\tc: [\"DJ\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Douala\": {\n\t\t\ta: \"Africa/Lagos\",\n\t\t\tc: [\"CM\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/El_Aaiun\": {\n\t\t\tu: 60,\n\t\t\td: 0,\n\t\t\tc: [\"EH\"]\n\t\t},\n\t\t\"Africa/Freetown\": {\n\t\t\ta: \"Africa/Abidjan\",\n\t\t\tc: [\"SL\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Gaborone\": {\n\t\t\ta: \"Africa/Maputo\",\n\t\t\tc: [\"BW\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Harare\": {\n\t\t\ta: \"Africa/Maputo\",\n\t\t\tc: [\"ZW\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Johannesburg\": {\n\t\t\tu: 120,\n\t\t\tc: [\"ZA\", \"LS\", \"SZ\"]\n\t\t},\n\t\t\"Africa/Juba\": {\n\t\t\tu: 120,\n\t\t\tc: [\"SS\"]\n\t\t},\n\t\t\"Africa/Kampala\": {\n\t\t\ta: \"Africa/Nairobi\",\n\t\t\tc: [\"UG\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Khartoum\": {\n\t\t\tu: 120,\n\t\t\tc: [\"SD\"]\n\t\t},\n\t\t\"Africa/Kigali\": {\n\t\t\ta: \"Africa/Maputo\",\n\t\t\tc: [\"RW\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Kinshasa\": {\n\t\t\ta: \"Africa/Lagos\",\n\t\t\tc: [\"CD\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Lagos\": {\n\t\t\tu: 60,\n\t\t\tc: [\"NG\", \"AO\", \"BJ\", \"CD\", \"CF\", \"CG\", \"CM\", \"GA\", \"GQ\", \"NE\"]\n\t\t},\n\t\t\"Africa/Libreville\": {\n\t\t\ta: \"Africa/Lagos\",\n\t\t\tc: [\"GA\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Lome\": {\n\t\t\ta: \"Africa/Abidjan\",\n\t\t\tc: [\"TG\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Luanda\": {\n\t\t\ta: \"Africa/Lagos\",\n\t\t\tc: [\"AO\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Lubumbashi\": {\n\t\t\ta: \"Africa/Maputo\",\n\t\t\tc: [\"CD\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Lusaka\": {\n\t\t\ta: \"Africa/Maputo\",\n\t\t\tc: [\"ZM\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Malabo\": {\n\t\t\ta: \"Africa/Lagos\",\n\t\t\tc: [\"GQ\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Maputo\": {\n\t\t\tu: 120,\n\t\t\tc: [\"MZ\", \"BI\", \"BW\", \"CD\", \"MW\", \"RW\", \"ZM\", \"ZW\"]\n\t\t},\n\t\t\"Africa/Maseru\": {\n\t\t\ta: \"Africa/Johannesburg\",\n\t\t\tc: [\"LS\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Mbabane\": {\n\t\t\ta: \"Africa/Johannesburg\",\n\t\t\tc: [\"SZ\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Mogadishu\": {\n\t\t\ta: \"Africa/Nairobi\",\n\t\t\tc: [\"SO\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Monrovia\": {\n\t\t\tu: 0,\n\t\t\tc: [\"LR\"]\n\t\t},\n\t\t\"Africa/Nairobi\": {\n\t\t\tu: 180,\n\t\t\tc: [\"KE\", \"DJ\", \"ER\", \"ET\", \"KM\", \"MG\", \"SO\", \"TZ\", \"UG\", \"YT\"]\n\t\t},\n\t\t\"Africa/Ndjamena\": {\n\t\t\tu: 60,\n\t\t\tc: [\"TD\"]\n\t\t},\n\t\t\"Africa/Niamey\": {\n\t\t\ta: \"Africa/Lagos\",\n\t\t\tc: [\"NE\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Nouakchott\": {\n\t\t\ta: \"Africa/Abidjan\",\n\t\t\tc: [\"MR\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Ouagadougou\": {\n\t\t\ta: \"Africa/Abidjan\",\n\t\t\tc: [\"BF\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Porto-Novo\": {\n\t\t\ta: \"Africa/Lagos\",\n\t\t\tc: [\"BJ\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Sao_Tome\": {\n\t\t\tu: 0,\n\t\t\tc: [\"ST\"]\n\t\t},\n\t\t\"Africa/Timbuktu\": {\n\t\t\ta: \"Africa/Abidjan\",\n\t\t\tc: [\"ML\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Africa/Tripoli\": {\n\t\t\tu: 120,\n\t\t\tc: [\"LY\"]\n\t\t},\n\t\t\"Africa/Tunis\": {\n\t\t\tu: 60,\n\t\t\tc: [\"TN\"]\n\t\t},\n\t\t\"Africa/Windhoek\": {\n\t\t\tu: 120,\n\t\t\tc: [\"NA\"]\n\t\t},\n\t\t\"America/Adak\": {\n\t\t\tu: -600,\n\t\t\td: -540,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Anchorage\": {\n\t\t\tu: -540,\n\t\t\td: -480,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Anguilla\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"AI\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Antigua\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"AG\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Araguaina\": {\n\t\t\tu: -180,\n\t\t\tc: [\"BR\"]\n\t\t},\n\t\t\"America/Argentina/Buenos_Aires\": {\n\t\t\tu: -180,\n\t\t\tc: [\"AR\"]\n\t\t},\n\t\t\"America/Argentina/Catamarca\": {\n\t\t\tu: -180,\n\t\t\tc: [\"AR\"]\n\t\t},\n\t\t\"America/Argentina/ComodRivadavia\": {\n\t\t\ta: \"America/Argentina/Catamarca\",\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Argentina/Cordoba\": {\n\t\t\tu: -180,\n\t\t\tc: [\"AR\"]\n\t\t},\n\t\t\"America/Argentina/Jujuy\": {\n\t\t\tu: -180,\n\t\t\tc: [\"AR\"]\n\t\t},\n\t\t\"America/Argentina/La_Rioja\": {\n\t\t\tu: -180,\n\t\t\tc: [\"AR\"]\n\t\t},\n\t\t\"America/Argentina/Mendoza\": {\n\t\t\tu: -180,\n\t\t\tc: [\"AR\"]\n\t\t},\n\t\t\"America/Argentina/Rio_Gallegos\": {\n\t\t\tu: -180,\n\t\t\tc: [\"AR\"]\n\t\t},\n\t\t\"America/Argentina/Salta\": {\n\t\t\tu: -180,\n\t\t\tc: [\"AR\"]\n\t\t},\n\t\t\"America/Argentina/San_Juan\": {\n\t\t\tu: -180,\n\t\t\tc: [\"AR\"]\n\t\t},\n\t\t\"America/Argentina/San_Luis\": {\n\t\t\tu: -180,\n\t\t\tc: [\"AR\"]\n\t\t},\n\t\t\"America/Argentina/Tucuman\": {\n\t\t\tu: -180,\n\t\t\tc: [\"AR\"]\n\t\t},\n\t\t\"America/Argentina/Ushuaia\": {\n\t\t\tu: -180,\n\t\t\tc: [\"AR\"]\n\t\t},\n\t\t\"America/Aruba\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"AW\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Asuncion\": {\n\t\t\tu: -240,\n\t\t\td: -180,\n\t\t\tc: [\"PY\"]\n\t\t},\n\t\t\"America/Atikokan\": {\n\t\t\ta: \"America/Panama\",\n\t\t\tc: [\"CA\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Atka\": {\n\t\t\ta: \"America/Adak\",\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Bahia\": {\n\t\t\tu: -180,\n\t\t\tc: [\"BR\"]\n\t\t},\n\t\t\"America/Bahia_Banderas\": {\n\t\t\tu: -360,\n\t\t\td: -300,\n\t\t\tc: [\"MX\"]\n\t\t},\n\t\t\"America/Barbados\": {\n\t\t\tu: -240,\n\t\t\tc: [\"BB\"]\n\t\t},\n\t\t\"America/Belem\": {\n\t\t\tu: -180,\n\t\t\tc: [\"BR\"]\n\t\t},\n\t\t\"America/Belize\": {\n\t\t\tu: -360,\n\t\t\tc: [\"BZ\"]\n\t\t},\n\t\t\"America/Blanc-Sablon\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"CA\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Boa_Vista\": {\n\t\t\tu: -240,\n\t\t\tc: [\"BR\"]\n\t\t},\n\t\t\"America/Bogota\": {\n\t\t\tu: -300,\n\t\t\tc: [\"CO\"]\n\t\t},\n\t\t\"America/Boise\": {\n\t\t\tu: -420,\n\t\t\td: -360,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Buenos_Aires\": {\n\t\t\ta: \"America/Argentina/Buenos_Aires\",\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Cambridge_Bay\": {\n\t\t\tu: -420,\n\t\t\td: -360,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Campo_Grande\": {\n\t\t\tu: -240,\n\t\t\tc: [\"BR\"]\n\t\t},\n\t\t\"America/Cancun\": {\n\t\t\tu: -300,\n\t\t\tc: [\"MX\"]\n\t\t},\n\t\t\"America/Caracas\": {\n\t\t\tu: -240,\n\t\t\tc: [\"VE\"]\n\t\t},\n\t\t\"America/Catamarca\": {\n\t\t\ta: \"America/Argentina/Catamarca\",\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Cayenne\": {\n\t\t\tu: -180,\n\t\t\tc: [\"GF\"]\n\t\t},\n\t\t\"America/Cayman\": {\n\t\t\ta: \"America/Panama\",\n\t\t\tc: [\"KY\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Chicago\": {\n\t\t\tu: -360,\n\t\t\td: -300,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Chihuahua\": {\n\t\t\tu: -420,\n\t\t\td: -360,\n\t\t\tc: [\"MX\"]\n\t\t},\n\t\t\"America/Coral_Harbour\": {\n\t\t\ta: \"America/Panama\",\n\t\t\tc: [\"CA\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Cordoba\": {\n\t\t\ta: \"America/Argentina/Cordoba\",\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Costa_Rica\": {\n\t\t\tu: -360,\n\t\t\tc: [\"CR\"]\n\t\t},\n\t\t\"America/Creston\": {\n\t\t\ta: \"America/Phoenix\",\n\t\t\tc: [\"CA\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Cuiaba\": {\n\t\t\tu: -240,\n\t\t\tc: [\"BR\"]\n\t\t},\n\t\t\"America/Curacao\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"CW\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Danmarkshavn\": {\n\t\t\tu: 0,\n\t\t\tc: [\"GL\"]\n\t\t},\n\t\t\"America/Dawson\": {\n\t\t\tu: -420,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Dawson_Creek\": {\n\t\t\tu: -420,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Denver\": {\n\t\t\tu: -420,\n\t\t\td: -360,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Detroit\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Dominica\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"DM\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Edmonton\": {\n\t\t\tu: -420,\n\t\t\td: -360,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Eirunepe\": {\n\t\t\tu: -300,\n\t\t\tc: [\"BR\"]\n\t\t},\n\t\t\"America/El_Salvador\": {\n\t\t\tu: -360,\n\t\t\tc: [\"SV\"]\n\t\t},\n\t\t\"America/Ensenada\": {\n\t\t\ta: \"America/Tijuana\",\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Fort_Nelson\": {\n\t\t\tu: -420,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Fort_Wayne\": {\n\t\t\ta: \"America/Indiana/Indianapolis\",\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Fortaleza\": {\n\t\t\tu: -180,\n\t\t\tc: [\"BR\"]\n\t\t},\n\t\t\"America/Glace_Bay\": {\n\t\t\tu: -240,\n\t\t\td: -180,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Godthab\": {\n\t\t\ta: \"America/Nuuk\",\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Goose_Bay\": {\n\t\t\tu: -240,\n\t\t\td: -180,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Grand_Turk\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"TC\"]\n\t\t},\n\t\t\"America/Grenada\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"GD\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Guadeloupe\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"GP\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Guatemala\": {\n\t\t\tu: -360,\n\t\t\tc: [\"GT\"]\n\t\t},\n\t\t\"America/Guayaquil\": {\n\t\t\tu: -300,\n\t\t\tc: [\"EC\"]\n\t\t},\n\t\t\"America/Guyana\": {\n\t\t\tu: -240,\n\t\t\tc: [\"GY\"]\n\t\t},\n\t\t\"America/Halifax\": {\n\t\t\tu: -240,\n\t\t\td: -180,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Havana\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"CU\"]\n\t\t},\n\t\t\"America/Hermosillo\": {\n\t\t\tu: -420,\n\t\t\tc: [\"MX\"]\n\t\t},\n\t\t\"America/Indiana/Indianapolis\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Indiana/Knox\": {\n\t\t\tu: -360,\n\t\t\td: -300,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Indiana/Marengo\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Indiana/Petersburg\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Indiana/Tell_City\": {\n\t\t\tu: -360,\n\t\t\td: -300,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Indiana/Vevay\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Indiana/Vincennes\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Indiana/Winamac\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Indianapolis\": {\n\t\t\ta: \"America/Indiana/Indianapolis\",\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Inuvik\": {\n\t\t\tu: -420,\n\t\t\td: -360,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Iqaluit\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Jamaica\": {\n\t\t\tu: -300,\n\t\t\tc: [\"JM\"]\n\t\t},\n\t\t\"America/Jujuy\": {\n\t\t\ta: \"America/Argentina/Jujuy\",\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Juneau\": {\n\t\t\tu: -540,\n\t\t\td: -480,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Kentucky/Louisville\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Kentucky/Monticello\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Knox_IN\": {\n\t\t\ta: \"America/Indiana/Knox\",\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Kralendijk\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"BQ\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/La_Paz\": {\n\t\t\tu: -240,\n\t\t\tc: [\"BO\"]\n\t\t},\n\t\t\"America/Lima\": {\n\t\t\tu: -300,\n\t\t\tc: [\"PE\"]\n\t\t},\n\t\t\"America/Los_Angeles\": {\n\t\t\tu: -480,\n\t\t\td: -420,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Louisville\": {\n\t\t\ta: \"America/Kentucky/Louisville\",\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Lower_Princes\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"SX\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Maceio\": {\n\t\t\tu: -180,\n\t\t\tc: [\"BR\"]\n\t\t},\n\t\t\"America/Managua\": {\n\t\t\tu: -360,\n\t\t\tc: [\"NI\"]\n\t\t},\n\t\t\"America/Manaus\": {\n\t\t\tu: -240,\n\t\t\tc: [\"BR\"]\n\t\t},\n\t\t\"America/Marigot\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"MF\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Martinique\": {\n\t\t\tu: -240,\n\t\t\tc: [\"MQ\"]\n\t\t},\n\t\t\"America/Matamoros\": {\n\t\t\tu: -360,\n\t\t\td: -300,\n\t\t\tc: [\"MX\"]\n\t\t},\n\t\t\"America/Mazatlan\": {\n\t\t\tu: -420,\n\t\t\td: -360,\n\t\t\tc: [\"MX\"]\n\t\t},\n\t\t\"America/Mendoza\": {\n\t\t\ta: \"America/Argentina/Mendoza\",\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Menominee\": {\n\t\t\tu: -360,\n\t\t\td: -300,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Merida\": {\n\t\t\tu: -360,\n\t\t\td: -300,\n\t\t\tc: [\"MX\"]\n\t\t},\n\t\t\"America/Metlakatla\": {\n\t\t\tu: -540,\n\t\t\td: -480,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Mexico_City\": {\n\t\t\tu: -360,\n\t\t\td: -300,\n\t\t\tc: [\"MX\"]\n\t\t},\n\t\t\"America/Miquelon\": {\n\t\t\tu: -180,\n\t\t\td: -120,\n\t\t\tc: [\"PM\"]\n\t\t},\n\t\t\"America/Moncton\": {\n\t\t\tu: -240,\n\t\t\td: -180,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Monterrey\": {\n\t\t\tu: -360,\n\t\t\td: -300,\n\t\t\tc: [\"MX\"]\n\t\t},\n\t\t\"America/Montevideo\": {\n\t\t\tu: -180,\n\t\t\tc: [\"UY\"]\n\t\t},\n\t\t\"America/Montreal\": {\n\t\t\ta: \"America/Toronto\",\n\t\t\tc: [\"CA\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Montserrat\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"MS\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Nassau\": {\n\t\t\ta: \"America/Toronto\",\n\t\t\tc: [\"BS\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/New_York\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Nipigon\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Nome\": {\n\t\t\tu: -540,\n\t\t\td: -480,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Noronha\": {\n\t\t\tu: -120,\n\t\t\tc: [\"BR\"]\n\t\t},\n\t\t\"America/North_Dakota/Beulah\": {\n\t\t\tu: -360,\n\t\t\td: -300,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/North_Dakota/Center\": {\n\t\t\tu: -360,\n\t\t\td: -300,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/North_Dakota/New_Salem\": {\n\t\t\tu: -360,\n\t\t\td: -300,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Nuuk\": {\n\t\t\tu: -180,\n\t\t\td: -120,\n\t\t\tc: [\"GL\"]\n\t\t},\n\t\t\"America/Ojinaga\": {\n\t\t\tu: -420,\n\t\t\td: -360,\n\t\t\tc: [\"MX\"]\n\t\t},\n\t\t\"America/Panama\": {\n\t\t\tu: -300,\n\t\t\tc: [\"PA\", \"CA\", \"KY\"]\n\t\t},\n\t\t\"America/Pangnirtung\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Paramaribo\": {\n\t\t\tu: -180,\n\t\t\tc: [\"SR\"]\n\t\t},\n\t\t\"America/Phoenix\": {\n\t\t\tu: -420,\n\t\t\tc: [\"US\", \"CA\"]\n\t\t},\n\t\t\"America/Port-au-Prince\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"HT\"]\n\t\t},\n\t\t\"America/Port_of_Spain\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"TT\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Porto_Acre\": {\n\t\t\ta: \"America/Rio_Branco\",\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Porto_Velho\": {\n\t\t\tu: -240,\n\t\t\tc: [\"BR\"]\n\t\t},\n\t\t\"America/Puerto_Rico\": {\n\t\t\tu: -240,\n\t\t\tc: [\n\t\t\t\t\"PR\",\n\t\t\t\t\"AG\",\n\t\t\t\t\"CA\",\n\t\t\t\t\"AI\",\n\t\t\t\t\"AW\",\n\t\t\t\t\"BL\",\n\t\t\t\t\"BQ\",\n\t\t\t\t\"CW\",\n\t\t\t\t\"DM\",\n\t\t\t\t\"GD\",\n\t\t\t\t\"GP\",\n\t\t\t\t\"KN\",\n\t\t\t\t\"LC\",\n\t\t\t\t\"MF\",\n\t\t\t\t\"MS\",\n\t\t\t\t\"SX\",\n\t\t\t\t\"TT\",\n\t\t\t\t\"VC\",\n\t\t\t\t\"VG\",\n\t\t\t\t\"VI\"\n\t\t\t]\n\t\t},\n\t\t\"America/Punta_Arenas\": {\n\t\t\tu: -180,\n\t\t\tc: [\"CL\"]\n\t\t},\n\t\t\"America/Rainy_River\": {\n\t\t\tu: -360,\n\t\t\td: -300,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Rankin_Inlet\": {\n\t\t\tu: -360,\n\t\t\td: -300,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Recife\": {\n\t\t\tu: -180,\n\t\t\tc: [\"BR\"]\n\t\t},\n\t\t\"America/Regina\": {\n\t\t\tu: -360,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Resolute\": {\n\t\t\tu: -360,\n\t\t\td: -300,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Rio_Branco\": {\n\t\t\tu: -300,\n\t\t\tc: [\"BR\"]\n\t\t},\n\t\t\"America/Rosario\": {\n\t\t\ta: \"America/Argentina/Cordoba\",\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Santa_Isabel\": {\n\t\t\ta: \"America/Tijuana\",\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Santarem\": {\n\t\t\tu: -180,\n\t\t\tc: [\"BR\"]\n\t\t},\n\t\t\"America/Santiago\": {\n\t\t\tu: -240,\n\t\t\td: -180,\n\t\t\tc: [\"CL\"]\n\t\t},\n\t\t\"America/Santo_Domingo\": {\n\t\t\tu: -240,\n\t\t\tc: [\"DO\"]\n\t\t},\n\t\t\"America/Sao_Paulo\": {\n\t\t\tu: -180,\n\t\t\tc: [\"BR\"]\n\t\t},\n\t\t\"America/Scoresbysund\": {\n\t\t\tu: -60,\n\t\t\td: 0,\n\t\t\tc: [\"GL\"]\n\t\t},\n\t\t\"America/Shiprock\": {\n\t\t\ta: \"America/Denver\",\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Sitka\": {\n\t\t\tu: -540,\n\t\t\td: -480,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/St_Barthelemy\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"BL\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/St_Johns\": {\n\t\t\tu: -150,\n\t\t\td: -90,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/St_Kitts\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"KN\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/St_Lucia\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"LC\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/St_Thomas\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"VI\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/St_Vincent\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"VC\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Swift_Current\": {\n\t\t\tu: -360,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Tegucigalpa\": {\n\t\t\tu: -360,\n\t\t\tc: [\"HN\"]\n\t\t},\n\t\t\"America/Thule\": {\n\t\t\tu: -240,\n\t\t\td: -180,\n\t\t\tc: [\"GL\"]\n\t\t},\n\t\t\"America/Thunder_Bay\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Tijuana\": {\n\t\t\tu: -480,\n\t\t\td: -420,\n\t\t\tc: [\"MX\"]\n\t\t},\n\t\t\"America/Toronto\": {\n\t\t\tu: -300,\n\t\t\td: -240,\n\t\t\tc: [\"CA\", \"BS\"]\n\t\t},\n\t\t\"America/Tortola\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"VG\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Vancouver\": {\n\t\t\tu: -480,\n\t\t\td: -420,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Virgin\": {\n\t\t\ta: \"America/Puerto_Rico\",\n\t\t\tc: [\"VI\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"America/Whitehorse\": {\n\t\t\tu: -420,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Winnipeg\": {\n\t\t\tu: -360,\n\t\t\td: -300,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"America/Yakutat\": {\n\t\t\tu: -540,\n\t\t\td: -480,\n\t\t\tc: [\"US\"]\n\t\t},\n\t\t\"America/Yellowknife\": {\n\t\t\tu: -420,\n\t\t\td: -360,\n\t\t\tc: [\"CA\"]\n\t\t},\n\t\t\"Antarctica/Casey\": {\n\t\t\tu: 660,\n\t\t\tc: [\"AQ\"]\n\t\t},\n\t\t\"Antarctica/Davis\": {\n\t\t\tu: 420,\n\t\t\tc: [\"AQ\"]\n\t\t},\n\t\t\"Antarctica/DumontDUrville\": {\n\t\t\ta: \"Pacific/Port_Moresby\",\n\t\t\tc: [\"AQ\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Antarctica/Macquarie\": {\n\t\t\tu: 600,\n\t\t\td: 660,\n\t\t\tc: [\"AU\"]\n\t\t},\n\t\t\"Antarctica/Mawson\": {\n\t\t\tu: 300,\n\t\t\tc: [\"AQ\"]\n\t\t},\n\t\t\"Antarctica/McMurdo\": {\n\t\t\ta: \"Pacific/Auckland\",\n\t\t\tc: [\"AQ\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Antarctica/Palmer\": {\n\t\t\tu: -180,\n\t\t\tc: [\"AQ\"]\n\t\t},\n\t\t\"Antarctica/Rothera\": {\n\t\t\tu: -180,\n\t\t\tc: [\"AQ\"]\n\t\t},\n\t\t\"Antarctica/South_Pole\": {\n\t\t\ta: \"Pacific/Auckland\",\n\t\t\tc: [\"AQ\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Antarctica/Syowa\": {\n\t\t\ta: \"Asia/Riyadh\",\n\t\t\tc: [\"AQ\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Antarctica/Troll\": {\n\t\t\tu: 0,\n\t\t\td: 120,\n\t\t\tc: [\"AQ\"]\n\t\t},\n\t\t\"Antarctica/Vostok\": {\n\t\t\tu: 360,\n\t\t\tc: [\"AQ\"]\n\t\t},\n\t\t\"Arctic/Longyearbyen\": {\n\t\t\ta: \"Europe/Oslo\",\n\t\t\tc: [\"SJ\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Aden\": {\n\t\t\ta: \"Asia/Riyadh\",\n\t\t\tc: [\"YE\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Almaty\": {\n\t\t\tu: 360,\n\t\t\tc: [\"KZ\"]\n\t\t},\n\t\t\"Asia/Amman\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"JO\"]\n\t\t},\n\t\t\"Asia/Anadyr\": {\n\t\t\tu: 720,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Aqtau\": {\n\t\t\tu: 300,\n\t\t\tc: [\"KZ\"]\n\t\t},\n\t\t\"Asia/Aqtobe\": {\n\t\t\tu: 300,\n\t\t\tc: [\"KZ\"]\n\t\t},\n\t\t\"Asia/Ashgabat\": {\n\t\t\tu: 300,\n\t\t\tc: [\"TM\"]\n\t\t},\n\t\t\"Asia/Ashkhabad\": {\n\t\t\ta: \"Asia/Ashgabat\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Atyrau\": {\n\t\t\tu: 300,\n\t\t\tc: [\"KZ\"]\n\t\t},\n\t\t\"Asia/Baghdad\": {\n\t\t\tu: 180,\n\t\t\tc: [\"IQ\"]\n\t\t},\n\t\t\"Asia/Bahrain\": {\n\t\t\ta: \"Asia/Qatar\",\n\t\t\tc: [\"BH\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Baku\": {\n\t\t\tu: 240,\n\t\t\tc: [\"AZ\"]\n\t\t},\n\t\t\"Asia/Bangkok\": {\n\t\t\tu: 420,\n\t\t\tc: [\"TH\", \"KH\", \"LA\", \"VN\"]\n\t\t},\n\t\t\"Asia/Barnaul\": {\n\t\t\tu: 420,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Beirut\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"LB\"]\n\t\t},\n\t\t\"Asia/Bishkek\": {\n\t\t\tu: 360,\n\t\t\tc: [\"KG\"]\n\t\t},\n\t\t\"Asia/Brunei\": {\n\t\t\tu: 480,\n\t\t\tc: [\"BN\"]\n\t\t},\n\t\t\"Asia/Calcutta\": {\n\t\t\ta: \"Asia/Kolkata\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Chita\": {\n\t\t\tu: 540,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Choibalsan\": {\n\t\t\tu: 480,\n\t\t\tc: [\"MN\"]\n\t\t},\n\t\t\"Asia/Chongqing\": {\n\t\t\ta: \"Asia/Shanghai\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Chungking\": {\n\t\t\ta: \"Asia/Shanghai\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Colombo\": {\n\t\t\tu: 330,\n\t\t\tc: [\"LK\"]\n\t\t},\n\t\t\"Asia/Dacca\": {\n\t\t\ta: \"Asia/Dhaka\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Damascus\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"SY\"]\n\t\t},\n\t\t\"Asia/Dhaka\": {\n\t\t\tu: 360,\n\t\t\tc: [\"BD\"]\n\t\t},\n\t\t\"Asia/Dili\": {\n\t\t\tu: 540,\n\t\t\tc: [\"TL\"]\n\t\t},\n\t\t\"Asia/Dubai\": {\n\t\t\tu: 240,\n\t\t\tc: [\"AE\", \"OM\"]\n\t\t},\n\t\t\"Asia/Dushanbe\": {\n\t\t\tu: 300,\n\t\t\tc: [\"TJ\"]\n\t\t},\n\t\t\"Asia/Famagusta\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"CY\"]\n\t\t},\n\t\t\"Asia/Gaza\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"PS\"]\n\t\t},\n\t\t\"Asia/Harbin\": {\n\t\t\ta: \"Asia/Shanghai\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Hebron\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"PS\"]\n\t\t},\n\t\t\"Asia/Ho_Chi_Minh\": {\n\t\t\tu: 420,\n\t\t\tc: [\"VN\"]\n\t\t},\n\t\t\"Asia/Hong_Kong\": {\n\t\t\tu: 480,\n\t\t\tc: [\"HK\"]\n\t\t},\n\t\t\"Asia/Hovd\": {\n\t\t\tu: 420,\n\t\t\tc: [\"MN\"]\n\t\t},\n\t\t\"Asia/Irkutsk\": {\n\t\t\tu: 480,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Istanbul\": {\n\t\t\ta: \"Europe/Istanbul\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Jakarta\": {\n\t\t\tu: 420,\n\t\t\tc: [\"ID\"]\n\t\t},\n\t\t\"Asia/Jayapura\": {\n\t\t\tu: 540,\n\t\t\tc: [\"ID\"]\n\t\t},\n\t\t\"Asia/Jerusalem\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"IL\"]\n\t\t},\n\t\t\"Asia/Kabul\": {\n\t\t\tu: 270,\n\t\t\tc: [\"AF\"]\n\t\t},\n\t\t\"Asia/Kamchatka\": {\n\t\t\tu: 720,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Karachi\": {\n\t\t\tu: 300,\n\t\t\tc: [\"PK\"]\n\t\t},\n\t\t\"Asia/Kashgar\": {\n\t\t\ta: \"Asia/Urumqi\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Kathmandu\": {\n\t\t\tu: 345,\n\t\t\tc: [\"NP\"]\n\t\t},\n\t\t\"Asia/Katmandu\": {\n\t\t\ta: \"Asia/Kathmandu\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Khandyga\": {\n\t\t\tu: 540,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Kolkata\": {\n\t\t\tu: 330,\n\t\t\tc: [\"IN\"]\n\t\t},\n\t\t\"Asia/Krasnoyarsk\": {\n\t\t\tu: 420,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Kuala_Lumpur\": {\n\t\t\tu: 480,\n\t\t\tc: [\"MY\"]\n\t\t},\n\t\t\"Asia/Kuching\": {\n\t\t\tu: 480,\n\t\t\tc: [\"MY\"]\n\t\t},\n\t\t\"Asia/Kuwait\": {\n\t\t\ta: \"Asia/Riyadh\",\n\t\t\tc: [\"KW\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Macao\": {\n\t\t\ta: \"Asia/Macau\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Macau\": {\n\t\t\tu: 480,\n\t\t\tc: [\"MO\"]\n\t\t},\n\t\t\"Asia/Magadan\": {\n\t\t\tu: 660,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Makassar\": {\n\t\t\tu: 480,\n\t\t\tc: [\"ID\"]\n\t\t},\n\t\t\"Asia/Manila\": {\n\t\t\tu: 480,\n\t\t\tc: [\"PH\"]\n\t\t},\n\t\t\"Asia/Muscat\": {\n\t\t\ta: \"Asia/Dubai\",\n\t\t\tc: [\"OM\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Nicosia\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"CY\"]\n\t\t},\n\t\t\"Asia/Novokuznetsk\": {\n\t\t\tu: 420,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Novosibirsk\": {\n\t\t\tu: 420,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Omsk\": {\n\t\t\tu: 360,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Oral\": {\n\t\t\tu: 300,\n\t\t\tc: [\"KZ\"]\n\t\t},\n\t\t\"Asia/Phnom_Penh\": {\n\t\t\ta: \"Asia/Bangkok\",\n\t\t\tc: [\"KH\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Pontianak\": {\n\t\t\tu: 420,\n\t\t\tc: [\"ID\"]\n\t\t},\n\t\t\"Asia/Pyongyang\": {\n\t\t\tu: 540,\n\t\t\tc: [\"KP\"]\n\t\t},\n\t\t\"Asia/Qatar\": {\n\t\t\tu: 180,\n\t\t\tc: [\"QA\", \"BH\"]\n\t\t},\n\t\t\"Asia/Qostanay\": {\n\t\t\tu: 360,\n\t\t\tc: [\"KZ\"]\n\t\t},\n\t\t\"Asia/Qyzylorda\": {\n\t\t\tu: 300,\n\t\t\tc: [\"KZ\"]\n\t\t},\n\t\t\"Asia/Rangoon\": {\n\t\t\ta: \"Asia/Yangon\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Riyadh\": {\n\t\t\tu: 180,\n\t\t\tc: [\"SA\", \"AQ\", \"KW\", \"YE\"]\n\t\t},\n\t\t\"Asia/Saigon\": {\n\t\t\ta: \"Asia/Ho_Chi_Minh\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Sakhalin\": {\n\t\t\tu: 660,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Samarkand\": {\n\t\t\tu: 300,\n\t\t\tc: [\"UZ\"]\n\t\t},\n\t\t\"Asia/Seoul\": {\n\t\t\tu: 540,\n\t\t\tc: [\"KR\"]\n\t\t},\n\t\t\"Asia/Shanghai\": {\n\t\t\tu: 480,\n\t\t\tc: [\"CN\"]\n\t\t},\n\t\t\"Asia/Singapore\": {\n\t\t\tu: 480,\n\t\t\tc: [\"SG\", \"MY\"]\n\t\t},\n\t\t\"Asia/Srednekolymsk\": {\n\t\t\tu: 660,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Taipei\": {\n\t\t\tu: 480,\n\t\t\tc: [\"TW\"]\n\t\t},\n\t\t\"Asia/Tashkent\": {\n\t\t\tu: 300,\n\t\t\tc: [\"UZ\"]\n\t\t},\n\t\t\"Asia/Tbilisi\": {\n\t\t\tu: 240,\n\t\t\tc: [\"GE\"]\n\t\t},\n\t\t\"Asia/Tehran\": {\n\t\t\tu: 210,\n\t\t\td: 270,\n\t\t\tc: [\"IR\"]\n\t\t},\n\t\t\"Asia/Tel_Aviv\": {\n\t\t\ta: \"Asia/Jerusalem\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Thimbu\": {\n\t\t\ta: \"Asia/Thimphu\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Thimphu\": {\n\t\t\tu: 360,\n\t\t\tc: [\"BT\"]\n\t\t},\n\t\t\"Asia/Tokyo\": {\n\t\t\tu: 540,\n\t\t\tc: [\"JP\"]\n\t\t},\n\t\t\"Asia/Tomsk\": {\n\t\t\tu: 420,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Ujung_Pandang\": {\n\t\t\ta: \"Asia/Makassar\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Ulaanbaatar\": {\n\t\t\tu: 480,\n\t\t\tc: [\"MN\"]\n\t\t},\n\t\t\"Asia/Ulan_Bator\": {\n\t\t\ta: \"Asia/Ulaanbaatar\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Urumqi\": {\n\t\t\tu: 360,\n\t\t\tc: [\"CN\"]\n\t\t},\n\t\t\"Asia/Ust-Nera\": {\n\t\t\tu: 600,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Vientiane\": {\n\t\t\ta: \"Asia/Bangkok\",\n\t\t\tc: [\"LA\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Asia/Vladivostok\": {\n\t\t\tu: 600,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Yakutsk\": {\n\t\t\tu: 540,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Yangon\": {\n\t\t\tu: 390,\n\t\t\tc: [\"MM\"]\n\t\t},\n\t\t\"Asia/Yekaterinburg\": {\n\t\t\tu: 300,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Asia/Yerevan\": {\n\t\t\tu: 240,\n\t\t\tc: [\"AM\"]\n\t\t},\n\t\t\"Atlantic/Azores\": {\n\t\t\tu: -60,\n\t\t\td: 0,\n\t\t\tc: [\"PT\"]\n\t\t},\n\t\t\"Atlantic/Bermuda\": {\n\t\t\tu: -240,\n\t\t\td: -180,\n\t\t\tc: [\"BM\"]\n\t\t},\n\t\t\"Atlantic/Canary\": {\n\t\t\tu: 0,\n\t\t\td: 60,\n\t\t\tc: [\"ES\"]\n\t\t},\n\t\t\"Atlantic/Cape_Verde\": {\n\t\t\tu: -60,\n\t\t\tc: [\"CV\"]\n\t\t},\n\t\t\"Atlantic/Faeroe\": {\n\t\t\ta: \"Atlantic/Faroe\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Atlantic/Faroe\": {\n\t\t\tu: 0,\n\t\t\td: 60,\n\t\t\tc: [\"FO\"]\n\t\t},\n\t\t\"Atlantic/Jan_Mayen\": {\n\t\t\ta: \"Europe/Oslo\",\n\t\t\tc: [\"SJ\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Atlantic/Madeira\": {\n\t\t\tu: 0,\n\t\t\td: 60,\n\t\t\tc: [\"PT\"]\n\t\t},\n\t\t\"Atlantic/Reykjavik\": {\n\t\t\tu: 0,\n\t\t\tc: [\"IS\"]\n\t\t},\n\t\t\"Atlantic/South_Georgia\": {\n\t\t\tu: -120,\n\t\t\tc: [\"GS\"]\n\t\t},\n\t\t\"Atlantic/St_Helena\": {\n\t\t\ta: \"Africa/Abidjan\",\n\t\t\tc: [\"SH\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Atlantic/Stanley\": {\n\t\t\tu: -180,\n\t\t\tc: [\"FK\"]\n\t\t},\n\t\t\"Australia/ACT\": {\n\t\t\ta: \"Australia/Sydney\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Australia/Adelaide\": {\n\t\t\tu: 570,\n\t\t\td: 630,\n\t\t\tc: [\"AU\"]\n\t\t},\n\t\t\"Australia/Brisbane\": {\n\t\t\tu: 600,\n\t\t\tc: [\"AU\"]\n\t\t},\n\t\t\"Australia/Broken_Hill\": {\n\t\t\tu: 570,\n\t\t\td: 630,\n\t\t\tc: [\"AU\"]\n\t\t},\n\t\t\"Australia/Canberra\": {\n\t\t\ta: \"Australia/Sydney\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Australia/Currie\": {\n\t\t\ta: \"Australia/Hobart\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Australia/Darwin\": {\n\t\t\tu: 570,\n\t\t\tc: [\"AU\"]\n\t\t},\n\t\t\"Australia/Eucla\": {\n\t\t\tu: 525,\n\t\t\tc: [\"AU\"]\n\t\t},\n\t\t\"Australia/Hobart\": {\n\t\t\tu: 600,\n\t\t\td: 660,\n\t\t\tc: [\"AU\"]\n\t\t},\n\t\t\"Australia/LHI\": {\n\t\t\ta: \"Australia/Lord_Howe\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Australia/Lindeman\": {\n\t\t\tu: 600,\n\t\t\tc: [\"AU\"]\n\t\t},\n\t\t\"Australia/Lord_Howe\": {\n\t\t\tu: 630,\n\t\t\td: 660,\n\t\t\tc: [\"AU\"]\n\t\t},\n\t\t\"Australia/Melbourne\": {\n\t\t\tu: 600,\n\t\t\td: 660,\n\t\t\tc: [\"AU\"]\n\t\t},\n\t\t\"Australia/NSW\": {\n\t\t\ta: \"Australia/Sydney\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Australia/North\": {\n\t\t\ta: \"Australia/Darwin\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Australia/Perth\": {\n\t\t\tu: 480,\n\t\t\tc: [\"AU\"]\n\t\t},\n\t\t\"Australia/Queensland\": {\n\t\t\ta: \"Australia/Brisbane\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Australia/South\": {\n\t\t\ta: \"Australia/Adelaide\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Australia/Sydney\": {\n\t\t\tu: 600,\n\t\t\td: 660,\n\t\t\tc: [\"AU\"]\n\t\t},\n\t\t\"Australia/Tasmania\": {\n\t\t\ta: \"Australia/Hobart\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Australia/Victoria\": {\n\t\t\ta: \"Australia/Melbourne\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Australia/West\": {\n\t\t\ta: \"Australia/Perth\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Australia/Yancowinna\": {\n\t\t\ta: \"Australia/Broken_Hill\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Brazil/Acre\": {\n\t\t\ta: \"America/Rio_Branco\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Brazil/DeNoronha\": {\n\t\t\ta: \"America/Noronha\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Brazil/East\": {\n\t\t\ta: \"America/Sao_Paulo\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Brazil/West\": {\n\t\t\ta: \"America/Manaus\",\n\t\t\tr: 1\n\t\t},\n\t\tCET: {\n\t\t\tu: 60,\n\t\t\td: 120\n\t\t},\n\t\tCST6CDT: {\n\t\t\tu: -360,\n\t\t\td: -300\n\t\t},\n\t\t\"Canada/Atlantic\": {\n\t\t\ta: \"America/Halifax\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Canada/Central\": {\n\t\t\ta: \"America/Winnipeg\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Canada/Eastern\": {\n\t\t\ta: \"America/Toronto\",\n\t\t\tc: [\"CA\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Canada/Mountain\": {\n\t\t\ta: \"America/Edmonton\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Canada/Newfoundland\": {\n\t\t\ta: \"America/St_Johns\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Canada/Pacific\": {\n\t\t\ta: \"America/Vancouver\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Canada/Saskatchewan\": {\n\t\t\ta: \"America/Regina\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Canada/Yukon\": {\n\t\t\ta: \"America/Whitehorse\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Chile/Continental\": {\n\t\t\ta: \"America/Santiago\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Chile/EasterIsland\": {\n\t\t\ta: \"Pacific/Easter\",\n\t\t\tr: 1\n\t\t},\n\t\tCuba: {\n\t\t\ta: \"America/Havana\",\n\t\t\tr: 1\n\t\t},\n\t\tEET: {\n\t\t\tu: 120,\n\t\t\td: 180\n\t\t},\n\t\tEST: {\n\t\t\tu: -300\n\t\t},\n\t\tEST5EDT: {\n\t\t\tu: -300,\n\t\t\td: -240\n\t\t},\n\t\tEgypt: {\n\t\t\ta: \"Africa/Cairo\",\n\t\t\tr: 1\n\t\t},\n\t\tEire: {\n\t\t\ta: \"Europe/Dublin\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Etc/GMT\": {\n\t\t\tu: 0\n\t\t},\n\t\t\"Etc/GMT+0\": {\n\t\t\ta: \"Etc/GMT\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Etc/GMT+1\": {\n\t\t\tu: -60\n\t\t},\n\t\t\"Etc/GMT+10\": {\n\t\t\tu: -600\n\t\t},\n\t\t\"Etc/GMT+11\": {\n\t\t\tu: -660\n\t\t},\n\t\t\"Etc/GMT+12\": {\n\t\t\tu: -720\n\t\t},\n\t\t\"Etc/GMT+2\": {\n\t\t\tu: -120\n\t\t},\n\t\t\"Etc/GMT+3\": {\n\t\t\tu: -180\n\t\t},\n\t\t\"Etc/GMT+4\": {\n\t\t\tu: -240\n\t\t},\n\t\t\"Etc/GMT+5\": {\n\t\t\tu: -300\n\t\t},\n\t\t\"Etc/GMT+6\": {\n\t\t\tu: -360\n\t\t},\n\t\t\"Etc/GMT+7\": {\n\t\t\tu: -420\n\t\t},\n\t\t\"Etc/GMT+8\": {\n\t\t\tu: -480\n\t\t},\n\t\t\"Etc/GMT+9\": {\n\t\t\tu: -540\n\t\t},\n\t\t\"Etc/GMT-0\": {\n\t\t\ta: \"Etc/GMT\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Etc/GMT-1\": {\n\t\t\tu: 60\n\t\t},\n\t\t\"Etc/GMT-10\": {\n\t\t\tu: 600\n\t\t},\n\t\t\"Etc/GMT-11\": {\n\t\t\tu: 660\n\t\t},\n\t\t\"Etc/GMT-12\": {\n\t\t\tu: 720\n\t\t},\n\t\t\"Etc/GMT-13\": {\n\t\t\tu: 780\n\t\t},\n\t\t\"Etc/GMT-14\": {\n\t\t\tu: 840\n\t\t},\n\t\t\"Etc/GMT-2\": {\n\t\t\tu: 120\n\t\t},\n\t\t\"Etc/GMT-3\": {\n\t\t\tu: 180\n\t\t},\n\t\t\"Etc/GMT-4\": {\n\t\t\tu: 240\n\t\t},\n\t\t\"Etc/GMT-5\": {\n\t\t\tu: 300\n\t\t},\n\t\t\"Etc/GMT-6\": {\n\t\t\tu: 360\n\t\t},\n\t\t\"Etc/GMT-7\": {\n\t\t\tu: 420\n\t\t},\n\t\t\"Etc/GMT-8\": {\n\t\t\tu: 480\n\t\t},\n\t\t\"Etc/GMT-9\": {\n\t\t\tu: 540\n\t\t},\n\t\t\"Etc/GMT0\": {\n\t\t\ta: \"Etc/GMT\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Etc/Greenwich\": {\n\t\t\ta: \"Etc/GMT\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Etc/UCT\": {\n\t\t\ta: \"Etc/UTC\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Etc/UTC\": {\n\t\t\tu: 0\n\t\t},\n\t\t\"Etc/Universal\": {\n\t\t\ta: \"Etc/UTC\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Etc/Zulu\": {\n\t\t\ta: \"Etc/UTC\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/Amsterdam\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"NL\"]\n\t\t},\n\t\t\"Europe/Andorra\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"AD\"]\n\t\t},\n\t\t\"Europe/Astrakhan\": {\n\t\t\tu: 240,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Europe/Athens\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"GR\"]\n\t\t},\n\t\t\"Europe/Belfast\": {\n\t\t\ta: \"Europe/London\",\n\t\t\tc: [\"GB\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/Belgrade\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"RS\", \"BA\", \"HR\", \"ME\", \"MK\", \"SI\"]\n\t\t},\n\t\t\"Europe/Berlin\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"DE\"]\n\t\t},\n\t\t\"Europe/Bratislava\": {\n\t\t\ta: \"Europe/Prague\",\n\t\t\tc: [\"SK\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/Brussels\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"BE\"]\n\t\t},\n\t\t\"Europe/Bucharest\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"RO\"]\n\t\t},\n\t\t\"Europe/Budapest\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"HU\"]\n\t\t},\n\t\t\"Europe/Busingen\": {\n\t\t\ta: \"Europe/Zurich\",\n\t\t\tc: [\"DE\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/Chisinau\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"MD\"]\n\t\t},\n\t\t\"Europe/Copenhagen\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"DK\"]\n\t\t},\n\t\t\"Europe/Dublin\": {\n\t\t\tu: 60,\n\t\t\td: 0,\n\t\t\tc: [\"IE\"]\n\t\t},\n\t\t\"Europe/Gibraltar\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"GI\"]\n\t\t},\n\t\t\"Europe/Guernsey\": {\n\t\t\ta: \"Europe/London\",\n\t\t\tc: [\"GG\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/Helsinki\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"FI\", \"AX\"]\n\t\t},\n\t\t\"Europe/Isle_of_Man\": {\n\t\t\ta: \"Europe/London\",\n\t\t\tc: [\"IM\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/Istanbul\": {\n\t\t\tu: 180,\n\t\t\tc: [\"TR\"]\n\t\t},\n\t\t\"Europe/Jersey\": {\n\t\t\ta: \"Europe/London\",\n\t\t\tc: [\"JE\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/Kaliningrad\": {\n\t\t\tu: 120,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Europe/Kiev\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"UA\"]\n\t\t},\n\t\t\"Europe/Kirov\": {\n\t\t\tu: 180,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Europe/Lisbon\": {\n\t\t\tu: 0,\n\t\t\td: 60,\n\t\t\tc: [\"PT\"]\n\t\t},\n\t\t\"Europe/Ljubljana\": {\n\t\t\ta: \"Europe/Belgrade\",\n\t\t\tc: [\"SI\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/London\": {\n\t\t\tu: 0,\n\t\t\td: 60,\n\t\t\tc: [\"GB\", \"GG\", \"IM\", \"JE\"]\n\t\t},\n\t\t\"Europe/Luxembourg\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"LU\"]\n\t\t},\n\t\t\"Europe/Madrid\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"ES\"]\n\t\t},\n\t\t\"Europe/Malta\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"MT\"]\n\t\t},\n\t\t\"Europe/Mariehamn\": {\n\t\t\ta: \"Europe/Helsinki\",\n\t\t\tc: [\"AX\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/Minsk\": {\n\t\t\tu: 180,\n\t\t\tc: [\"BY\"]\n\t\t},\n\t\t\"Europe/Monaco\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"MC\"]\n\t\t},\n\t\t\"Europe/Moscow\": {\n\t\t\tu: 180,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Europe/Nicosia\": {\n\t\t\ta: \"Asia/Nicosia\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/Oslo\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"NO\", \"SJ\", \"BV\"]\n\t\t},\n\t\t\"Europe/Paris\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"FR\"]\n\t\t},\n\t\t\"Europe/Podgorica\": {\n\t\t\ta: \"Europe/Belgrade\",\n\t\t\tc: [\"ME\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/Prague\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"CZ\", \"SK\"]\n\t\t},\n\t\t\"Europe/Riga\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"LV\"]\n\t\t},\n\t\t\"Europe/Rome\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"IT\", \"SM\", \"VA\"]\n\t\t},\n\t\t\"Europe/Samara\": {\n\t\t\tu: 240,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Europe/San_Marino\": {\n\t\t\ta: \"Europe/Rome\",\n\t\t\tc: [\"SM\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/Sarajevo\": {\n\t\t\ta: \"Europe/Belgrade\",\n\t\t\tc: [\"BA\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/Saratov\": {\n\t\t\tu: 240,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Europe/Simferopol\": {\n\t\t\tu: 180,\n\t\t\tc: [\"RU\", \"UA\"]\n\t\t},\n\t\t\"Europe/Skopje\": {\n\t\t\ta: \"Europe/Belgrade\",\n\t\t\tc: [\"MK\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/Sofia\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"BG\"]\n\t\t},\n\t\t\"Europe/Stockholm\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"SE\"]\n\t\t},\n\t\t\"Europe/Tallinn\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"EE\"]\n\t\t},\n\t\t\"Europe/Tirane\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"AL\"]\n\t\t},\n\t\t\"Europe/Tiraspol\": {\n\t\t\ta: \"Europe/Chisinau\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/Ulyanovsk\": {\n\t\t\tu: 240,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Europe/Uzhgorod\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"UA\"]\n\t\t},\n\t\t\"Europe/Vaduz\": {\n\t\t\ta: \"Europe/Zurich\",\n\t\t\tc: [\"LI\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/Vatican\": {\n\t\t\ta: \"Europe/Rome\",\n\t\t\tc: [\"VA\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/Vienna\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"AT\"]\n\t\t},\n\t\t\"Europe/Vilnius\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"LT\"]\n\t\t},\n\t\t\"Europe/Volgograd\": {\n\t\t\tu: 180,\n\t\t\tc: [\"RU\"]\n\t\t},\n\t\t\"Europe/Warsaw\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"PL\"]\n\t\t},\n\t\t\"Europe/Zagreb\": {\n\t\t\ta: \"Europe/Belgrade\",\n\t\t\tc: [\"HR\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Europe/Zaporozhye\": {\n\t\t\tu: 120,\n\t\t\td: 180,\n\t\t\tc: [\"UA\"]\n\t\t},\n\t\t\"Europe/Zurich\": {\n\t\t\tu: 60,\n\t\t\td: 120,\n\t\t\tc: [\"CH\", \"DE\", \"LI\"]\n\t\t},\n\t\tFactory: {\n\t\t\tu: 0\n\t\t},\n\t\tGB: {\n\t\t\ta: \"Europe/London\",\n\t\t\tc: [\"GB\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"GB-Eire\": {\n\t\t\ta: \"Europe/London\",\n\t\t\tc: [\"GB\"],\n\t\t\tr: 1\n\t\t},\n\t\tGMT: {\n\t\t\ta: \"Etc/GMT\",\n\t\t\tr: 1\n\t\t},\n\t\t\"GMT+0\": {\n\t\t\ta: \"Etc/GMT\",\n\t\t\tr: 1\n\t\t},\n\t\t\"GMT-0\": {\n\t\t\ta: \"Etc/GMT\",\n\t\t\tr: 1\n\t\t},\n\t\tGMT0: {\n\t\t\ta: \"Etc/GMT\",\n\t\t\tr: 1\n\t\t},\n\t\tGreenwich: {\n\t\t\ta: \"Etc/GMT\",\n\t\t\tr: 1\n\t\t},\n\t\tHST: {\n\t\t\tu: -600\n\t\t},\n\t\tHongkong: {\n\t\t\ta: \"Asia/Hong_Kong\",\n\t\t\tr: 1\n\t\t},\n\t\tIceland: {\n\t\t\ta: \"Atlantic/Reykjavik\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Indian/Antananarivo\": {\n\t\t\ta: \"Africa/Nairobi\",\n\t\t\tc: [\"MG\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Indian/Chagos\": {\n\t\t\tu: 360,\n\t\t\tc: [\"IO\"]\n\t\t},\n\t\t\"Indian/Christmas\": {\n\t\t\tu: 420,\n\t\t\tc: [\"CX\"]\n\t\t},\n\t\t\"Indian/Cocos\": {\n\t\t\tu: 390,\n\t\t\tc: [\"CC\"]\n\t\t},\n\t\t\"Indian/Comoro\": {\n\t\t\ta: \"Africa/Nairobi\",\n\t\t\tc: [\"KM\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Indian/Kerguelen\": {\n\t\t\tu: 300,\n\t\t\tc: [\"TF\", \"HM\"]\n\t\t},\n\t\t\"Indian/Mahe\": {\n\t\t\tu: 240,\n\t\t\tc: [\"SC\"]\n\t\t},\n\t\t\"Indian/Maldives\": {\n\t\t\tu: 300,\n\t\t\tc: [\"MV\"]\n\t\t},\n\t\t\"Indian/Mauritius\": {\n\t\t\tu: 240,\n\t\t\tc: [\"MU\"]\n\t\t},\n\t\t\"Indian/Mayotte\": {\n\t\t\ta: \"Africa/Nairobi\",\n\t\t\tc: [\"YT\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Indian/Reunion\": {\n\t\t\tu: 240,\n\t\t\tc: [\"RE\", \"TF\"]\n\t\t},\n\t\tIran: {\n\t\t\ta: \"Asia/Tehran\",\n\t\t\tr: 1\n\t\t},\n\t\tIsrael: {\n\t\t\ta: \"Asia/Jerusalem\",\n\t\t\tr: 1\n\t\t},\n\t\tJamaica: {\n\t\t\ta: \"America/Jamaica\",\n\t\t\tr: 1\n\t\t},\n\t\tJapan: {\n\t\t\ta: \"Asia/Tokyo\",\n\t\t\tr: 1\n\t\t},\n\t\tKwajalein: {\n\t\t\ta: \"Pacific/Kwajalein\",\n\t\t\tr: 1\n\t\t},\n\t\tLibya: {\n\t\t\ta: \"Africa/Tripoli\",\n\t\t\tr: 1\n\t\t},\n\t\tMET: {\n\t\t\tu: 60,\n\t\t\td: 120\n\t\t},\n\t\tMST: {\n\t\t\tu: -420\n\t\t},\n\t\tMST7MDT: {\n\t\t\tu: -420,\n\t\t\td: -360\n\t\t},\n\t\t\"Mexico/BajaNorte\": {\n\t\t\ta: \"America/Tijuana\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Mexico/BajaSur\": {\n\t\t\ta: \"America/Mazatlan\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Mexico/General\": {\n\t\t\ta: \"America/Mexico_City\",\n\t\t\tr: 1\n\t\t},\n\t\tNZ: {\n\t\t\ta: \"Pacific/Auckland\",\n\t\t\tc: [\"NZ\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"NZ-CHAT\": {\n\t\t\ta: \"Pacific/Chatham\",\n\t\t\tr: 1\n\t\t},\n\t\tNavajo: {\n\t\t\ta: \"America/Denver\",\n\t\t\tr: 1\n\t\t},\n\t\tPRC: {\n\t\t\ta: \"Asia/Shanghai\",\n\t\t\tr: 1\n\t\t},\n\t\tPST8PDT: {\n\t\t\tu: -480,\n\t\t\td: -420\n\t\t},\n\t\t\"Pacific/Apia\": {\n\t\t\tu: 780,\n\t\t\tc: [\"WS\"]\n\t\t},\n\t\t\"Pacific/Auckland\": {\n\t\t\tu: 720,\n\t\t\td: 780,\n\t\t\tc: [\"NZ\", \"AQ\"]\n\t\t},\n\t\t\"Pacific/Bougainville\": {\n\t\t\tu: 660,\n\t\t\tc: [\"PG\"]\n\t\t},\n\t\t\"Pacific/Chatham\": {\n\t\t\tu: 765,\n\t\t\td: 825,\n\t\t\tc: [\"NZ\"]\n\t\t},\n\t\t\"Pacific/Chuuk\": {\n\t\t\tu: 600,\n\t\t\tc: [\"FM\"]\n\t\t},\n\t\t\"Pacific/Easter\": {\n\t\t\tu: -360,\n\t\t\td: -300,\n\t\t\tc: [\"CL\"]\n\t\t},\n\t\t\"Pacific/Efate\": {\n\t\t\tu: 660,\n\t\t\tc: [\"VU\"]\n\t\t},\n\t\t\"Pacific/Enderbury\": {\n\t\t\ta: \"Pacific/Kanton\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Pacific/Fakaofo\": {\n\t\t\tu: 780,\n\t\t\tc: [\"TK\"]\n\t\t},\n\t\t\"Pacific/Fiji\": {\n\t\t\tu: 720,\n\t\t\td: 780,\n\t\t\tc: [\"FJ\"]\n\t\t},\n\t\t\"Pacific/Funafuti\": {\n\t\t\tu: 720,\n\t\t\tc: [\"TV\"]\n\t\t},\n\t\t\"Pacific/Galapagos\": {\n\t\t\tu: -360,\n\t\t\tc: [\"EC\"]\n\t\t},\n\t\t\"Pacific/Gambier\": {\n\t\t\tu: -540,\n\t\t\tc: [\"PF\"]\n\t\t},\n\t\t\"Pacific/Guadalcanal\": {\n\t\t\tu: 660,\n\t\t\tc: [\"SB\"]\n\t\t},\n\t\t\"Pacific/Guam\": {\n\t\t\tu: 600,\n\t\t\tc: [\"GU\", \"MP\"]\n\t\t},\n\t\t\"Pacific/Honolulu\": {\n\t\t\tu: -600,\n\t\t\tc: [\"US\", \"UM\"]\n\t\t},\n\t\t\"Pacific/Johnston\": {\n\t\t\ta: \"Pacific/Honolulu\",\n\t\t\tc: [\"UM\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Pacific/Kanton\": {\n\t\t\tu: 780,\n\t\t\tc: [\"KI\"]\n\t\t},\n\t\t\"Pacific/Kiritimati\": {\n\t\t\tu: 840,\n\t\t\tc: [\"KI\"]\n\t\t},\n\t\t\"Pacific/Kosrae\": {\n\t\t\tu: 660,\n\t\t\tc: [\"FM\"]\n\t\t},\n\t\t\"Pacific/Kwajalein\": {\n\t\t\tu: 720,\n\t\t\tc: [\"MH\"]\n\t\t},\n\t\t\"Pacific/Majuro\": {\n\t\t\tu: 720,\n\t\t\tc: [\"MH\"]\n\t\t},\n\t\t\"Pacific/Marquesas\": {\n\t\t\tu: -510,\n\t\t\tc: [\"PF\"]\n\t\t},\n\t\t\"Pacific/Midway\": {\n\t\t\ta: \"Pacific/Pago_Pago\",\n\t\t\tc: [\"UM\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Pacific/Nauru\": {\n\t\t\tu: 720,\n\t\t\tc: [\"NR\"]\n\t\t},\n\t\t\"Pacific/Niue\": {\n\t\t\tu: -660,\n\t\t\tc: [\"NU\"]\n\t\t},\n\t\t\"Pacific/Norfolk\": {\n\t\t\tu: 660,\n\t\t\td: 720,\n\t\t\tc: [\"NF\"]\n\t\t},\n\t\t\"Pacific/Noumea\": {\n\t\t\tu: 660,\n\t\t\tc: [\"NC\"]\n\t\t},\n\t\t\"Pacific/Pago_Pago\": {\n\t\t\tu: -660,\n\t\t\tc: [\"AS\", \"UM\"]\n\t\t},\n\t\t\"Pacific/Palau\": {\n\t\t\tu: 540,\n\t\t\tc: [\"PW\"]\n\t\t},\n\t\t\"Pacific/Pitcairn\": {\n\t\t\tu: -480,\n\t\t\tc: [\"PN\"]\n\t\t},\n\t\t\"Pacific/Pohnpei\": {\n\t\t\tu: 660,\n\t\t\tc: [\"FM\"]\n\t\t},\n\t\t\"Pacific/Ponape\": {\n\t\t\ta: \"Pacific/Pohnpei\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Pacific/Port_Moresby\": {\n\t\t\tu: 600,\n\t\t\tc: [\"PG\", \"AQ\"]\n\t\t},\n\t\t\"Pacific/Rarotonga\": {\n\t\t\tu: -600,\n\t\t\tc: [\"CK\"]\n\t\t},\n\t\t\"Pacific/Saipan\": {\n\t\t\ta: \"Pacific/Guam\",\n\t\t\tc: [\"MP\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Pacific/Samoa\": {\n\t\t\ta: \"Pacific/Pago_Pago\",\n\t\t\tc: [\"WS\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"Pacific/Tahiti\": {\n\t\t\tu: -600,\n\t\t\tc: [\"PF\"]\n\t\t},\n\t\t\"Pacific/Tarawa\": {\n\t\t\tu: 720,\n\t\t\tc: [\"KI\"]\n\t\t},\n\t\t\"Pacific/Tongatapu\": {\n\t\t\tu: 780,\n\t\t\tc: [\"TO\"]\n\t\t},\n\t\t\"Pacific/Truk\": {\n\t\t\ta: \"Pacific/Chuuk\",\n\t\t\tr: 1\n\t\t},\n\t\t\"Pacific/Wake\": {\n\t\t\tu: 720,\n\t\t\tc: [\"UM\"]\n\t\t},\n\t\t\"Pacific/Wallis\": {\n\t\t\tu: 720,\n\t\t\tc: [\"WF\"]\n\t\t},\n\t\t\"Pacific/Yap\": {\n\t\t\ta: \"Pacific/Chuuk\",\n\t\t\tr: 1\n\t\t},\n\t\tPoland: {\n\t\t\ta: \"Europe/Warsaw\",\n\t\t\tr: 1\n\t\t},\n\t\tPortugal: {\n\t\t\ta: \"Europe/Lisbon\",\n\t\t\tr: 1\n\t\t},\n\t\tROC: {\n\t\t\ta: \"Asia/Taipei\",\n\t\t\tr: 1\n\t\t},\n\t\tROK: {\n\t\t\ta: \"Asia/Seoul\",\n\t\t\tr: 1\n\t\t},\n\t\tSingapore: {\n\t\t\ta: \"Asia/Singapore\",\n\t\t\tc: [\"SG\"],\n\t\t\tr: 1\n\t\t},\n\t\tTurkey: {\n\t\t\ta: \"Europe/Istanbul\",\n\t\t\tr: 1\n\t\t},\n\t\tUCT: {\n\t\t\ta: \"Etc/UTC\",\n\t\t\tr: 1\n\t\t},\n\t\t\"US/Alaska\": {\n\t\t\ta: \"America/Anchorage\",\n\t\t\tr: 1\n\t\t},\n\t\t\"US/Aleutian\": {\n\t\t\ta: \"America/Adak\",\n\t\t\tr: 1\n\t\t},\n\t\t\"US/Arizona\": {\n\t\t\ta: \"America/Phoenix\",\n\t\t\tc: [\"US\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"US/Central\": {\n\t\t\ta: \"America/Chicago\",\n\t\t\tr: 1\n\t\t},\n\t\t\"US/East-Indiana\": {\n\t\t\ta: \"America/Indiana/Indianapolis\",\n\t\t\tr: 1\n\t\t},\n\t\t\"US/Eastern\": {\n\t\t\ta: \"America/New_York\",\n\t\t\tr: 1\n\t\t},\n\t\t\"US/Hawaii\": {\n\t\t\ta: \"Pacific/Honolulu\",\n\t\t\tc: [\"US\"],\n\t\t\tr: 1\n\t\t},\n\t\t\"US/Indiana-Starke\": {\n\t\t\ta: \"America/Indiana/Knox\",\n\t\t\tr: 1\n\t\t},\n\t\t\"US/Michigan\": {\n\t\t\ta: \"America/Detroit\",\n\t\t\tr: 1\n\t\t},\n\t\t\"US/Mountain\": {\n\t\t\ta: \"America/Denver\",\n\t\t\tr: 1\n\t\t},\n\t\t\"US/Pacific\": {\n\t\t\ta: \"America/Los_Angeles\",\n\t\t\tr: 1\n\t\t},\n\t\t\"US/Samoa\": {\n\t\t\ta: \"Pacific/Pago_Pago\",\n\t\t\tc: [\"WS\"],\n\t\t\tr: 1\n\t\t},\n\t\tUTC: {\n\t\t\ta: \"Etc/UTC\",\n\t\t\tr: 1\n\t\t},\n\t\tUniversal: {\n\t\t\ta: \"Etc/UTC\",\n\t\t\tr: 1\n\t\t},\n\t\t\"W-SU\": {\n\t\t\ta: \"Europe/Moscow\",\n\t\t\tr: 1\n\t\t},\n\t\tWET: {\n\t\t\tu: 0,\n\t\t\td: 60\n\t\t},\n\t\tZulu: {\n\t\t\ta: \"Etc/UTC\",\n\t\t\tr: 1\n\t\t}\n};\n\n/**\n * Get full country name from user's timezone\n * @returns Full country name or null if timezone is unavailable\n */\nexport function getCountry(): string | null {\n\tconst timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n\tif (timezone === \"\" || !timezone) {\n\t\treturn null;\n\t}\n\n\ttry {\n\t\tconst _country = timezones[timezone]?.c?.[0];\n\t\tif (!_country) return null;\n\t\tconst country = (countries as Record<string, string>)[_country];\n\t\treturn country || null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Get country code (ISO 3166-1 alpha-2) from user's timezone\n * Privacy-friendly alternative to IP geolocation\n * @returns ISO 3166-1 alpha-2 country code (e.g., \"US\", \"GB\") or \"Unknown\"\n */\nexport function getCountryCodeFromTimezone(): string {\n\tconst timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n\tif (timezone === \"\" || !timezone) {\n\t\treturn \"Unknown\";\n\t}\n\n\ttry {\n\t\tconst countryCode = timezones[timezone]?.c?.[0];\n\t\treturn countryCode || \"Unknown\";\n\t} catch {\n\t\treturn \"Unknown\";\n\t}\n}\n\nexport function getState(): string | null {\n\tconst timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n\tif (timezone === \"\" || !timezone) {\n\t\treturn null;\n\t}\n\t\n\tconst state = timezone.split(\"/\")[1]?.replace(\"_\", \" \");\n\t\n\treturn state || null;\n}\n", "/**\n * Page Tracking for Grain Analytics\n * Automatically tracks page views with consent-aware behavior\n */\n\nimport {\n categorizeReferrer,\n parseUTMParameters,\n getOrCreateFirstTouchAttribution,\n getSessionUTMParameters,\n setSessionUTMParameters,\n type UTMParameters,\n type FirstTouchAttribution,\n} from './attribution';\nimport { getCountryCodeFromTimezone } from './countries';\n\nexport interface PageTrackingConfig {\n stripQueryParams: boolean; // Default: true for privacy\n stripHash?: boolean; // Default: false\n debug?: boolean;\n tenantId: string;\n}\n\nexport interface PageTracker {\n trackSystemEvent(eventName: string, properties: Record<string, unknown>): void;\n hasConsent(category?: string): boolean;\n getEffectiveUserId(): string;\n getEphemeralSessionId(): string;\n getSessionId(): string;\n}\n\nexport class PageTrackingManager {\n private config: PageTrackingConfig;\n private tracker: PageTracker;\n private isDestroyed = false;\n private currentPath: string | null = null;\n private originalPushState: typeof history.pushState | null = null;\n private originalReplaceState: typeof history.replaceState | null = null;\n private previousPage: string | null = null;\n private landingPage: string | null = null;\n private pageViewCount = 0;\n\n constructor(tracker: PageTracker, config: PageTrackingConfig) {\n this.tracker = tracker;\n this.config = config;\n \n // Track initial page load (this is the landing page)\n this.trackCurrentPage(true);\n \n // Setup listeners\n this.setupHistoryListeners();\n this.setupHashChangeListener();\n }\n\n /**\n * Setup History API listeners (pushState, replaceState, popstate)\n */\n private setupHistoryListeners(): void {\n if (typeof window === 'undefined' || typeof history === 'undefined') return;\n\n // Wrap pushState\n this.originalPushState = history.pushState;\n history.pushState = (state: any, title: string, url?: string | URL | null) => {\n this.originalPushState?.call(history, state, title, url);\n this.trackCurrentPage();\n };\n\n // Wrap replaceState\n this.originalReplaceState = history.replaceState;\n history.replaceState = (state: any, title: string, url?: string | URL | null) => {\n this.originalReplaceState?.call(history, state, title, url);\n this.trackCurrentPage();\n };\n\n // Listen to popstate (back/forward buttons)\n window.addEventListener('popstate', this.handlePopState);\n }\n\n /**\n * Setup hash change listener\n */\n private setupHashChangeListener(): void {\n if (typeof window === 'undefined') return;\n window.addEventListener('hashchange', this.handleHashChange);\n }\n\n /**\n * Handle popstate event (back/forward navigation)\n */\n private handlePopState = (): void => {\n if (this.isDestroyed) return;\n this.trackCurrentPage();\n };\n\n /**\n * Handle hash change event\n */\n private handleHashChange = (): void => {\n if (this.isDestroyed) return;\n this.trackCurrentPage();\n };\n\n /**\n * Track the current page\n */\n private trackCurrentPage(isLanding: boolean = false): void {\n if (this.isDestroyed || typeof window === 'undefined') return;\n\n const page = this.extractPath(window.location.href);\n \n // Don't track if it's the same page (unless it's the landing page)\n if (!isLanding && page === this.currentPath) {\n return;\n }\n\n // Store previous page before updating\n if (this.currentPath) {\n this.previousPage = this.currentPath;\n }\n\n this.currentPath = page;\n this.pageViewCount++;\n\n // Set landing page on first view\n if (isLanding) {\n this.landingPage = page;\n }\n\n const hasConsent = this.tracker.hasConsent('analytics');\n const currentUrl = window.location.href;\n const referrer = document.referrer || '';\n\n // Parse UTM parameters from current URL\n const utmParams = parseUTMParameters(currentUrl);\n \n // Store session UTM if they exist (first time only or if new UTMs appear)\n if (Object.keys(utmParams).length > 0) {\n const existing = getSessionUTMParameters();\n if (!existing || isLanding) {\n setSessionUTMParameters(utmParams);\n }\n }\n\n // Get or create first-touch attribution\n const sessionUTMs = getSessionUTMParameters() || {};\n const firstTouch = getOrCreateFirstTouchAttribution(\n this.config.tenantId,\n referrer,\n currentUrl,\n sessionUTMs\n );\n\n // Base properties (always included)\n const properties: Record<string, unknown> = {\n page,\n timestamp: Date.now(),\n };\n\n // Enhanced properties when consent is granted\n if (hasConsent) {\n properties.title = document.title || '';\n properties.full_url = this.cleanUrl(currentUrl); // Clean URL based on privacy settings\n properties.session_id = this.tracker.getSessionId();\n\n // Add referrer info\n if (referrer) {\n properties.referrer = referrer;\n properties.referrer_domain = this.extractDomain(referrer);\n properties.referrer_category = categorizeReferrer(referrer, currentUrl);\n }\n\n // Add landing page if this is not the first view\n if (this.landingPage && !isLanding) {\n properties.landing_page = this.landingPage;\n }\n\n // Add previous page if available\n if (this.previousPage) {\n properties.previous_page = this.previousPage;\n \n // Track navigation edge for Project Vanguard (minimal Phase 1)\n this.tracker.trackSystemEvent('_grain_navigation', {\n from_page: this.previousPage,\n to_page: page,\n timestamp: Date.now()\n });\n }\n\n // Add UTM parameters if present (from session)\n if (sessionUTMs.utm_source) properties.utm_source = sessionUTMs.utm_source;\n if (sessionUTMs.utm_medium) properties.utm_medium = sessionUTMs.utm_medium;\n if (sessionUTMs.utm_campaign) properties.utm_campaign = sessionUTMs.utm_campaign;\n if (sessionUTMs.utm_term) properties.utm_term = sessionUTMs.utm_term;\n if (sessionUTMs.utm_content) properties.utm_content = sessionUTMs.utm_content;\n\n // Add first-touch attribution\n properties.first_touch_source = firstTouch.source;\n properties.first_touch_medium = firstTouch.medium;\n properties.first_touch_campaign = firstTouch.campaign;\n properties.first_touch_referrer_category = firstTouch.referrer_category;\n\n // Browser and device info\n properties.device = this.getDeviceType();\n properties.browser = this.getBrowser();\n properties.os = this.getOS();\n properties.language = navigator.language || '';\n \n // Timezone and country (privacy-friendly: derived from timezone, no IP tracking)\n const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n properties.timezone = timezone;\n properties.country = getCountryCodeFromTimezone();\n \n properties.screen_resolution = `${screen.width}x${screen.height}`;\n properties.viewport = `${window.innerWidth}x${window.innerHeight}`;\n }\n\n // Track the page view event\n this.tracker.trackSystemEvent('page_view', properties);\n }\n\n /**\n * Extract domain from URL\n */\n private extractDomain(url: string): string {\n try {\n const urlObj = new URL(url);\n return urlObj.hostname;\n } catch {\n return '';\n }\n }\n\n /**\n * Detect browser name\n */\n private getBrowser(): string {\n const ua = navigator.userAgent;\n if (ua.includes('Firefox/')) return 'Firefox';\n if (ua.includes('Edg/')) return 'Edge';\n if (ua.includes('Chrome/')) return 'Chrome';\n if (ua.includes('Safari/') && !ua.includes('Chrome/')) return 'Safari';\n if (ua.includes('Opera/') || ua.includes('OPR/')) return 'Opera';\n return 'Unknown';\n }\n\n /**\n * Detect operating system\n */\n private getOS(): string {\n const ua = navigator.userAgent;\n if (ua.includes('Win')) return 'Windows';\n if (ua.includes('Mac')) return 'macOS';\n if (ua.includes('Linux')) return 'Linux';\n if (ua.includes('Android')) return 'Android';\n if (ua.includes('iOS') || ua.includes('iPhone') || ua.includes('iPad')) return 'iOS';\n return 'Unknown';\n }\n\n /**\n * Detect device type (Mobile, Tablet, Desktop)\n */\n private getDeviceType(): string {\n const ua = navigator.userAgent;\n const width = window.innerWidth;\n \n // Check for tablet-specific indicators\n if (ua.includes('iPad') || (ua.includes('Android') && !ua.includes('Mobile'))) {\n return 'Tablet';\n }\n \n // Check for mobile indicators\n if (ua.includes('Mobile') || ua.includes('iPhone') || ua.includes('Android')) {\n return 'Mobile';\n }\n \n // Fallback to screen width detection\n if (width < 768) {\n return 'Mobile';\n } else if (width >= 768 && width < 1024) {\n return 'Tablet';\n }\n \n return 'Desktop';\n }\n\n /**\n * Extract path from URL, optionally stripping query parameters\n * Privacy-first: strips query params by default\n */\n private extractPath(url: string): string {\n try {\n const urlObj = new URL(url);\n let path = urlObj.pathname;\n \n // Include query params only if not stripping\n if (!this.config.stripQueryParams && urlObj.search) {\n path += urlObj.search;\n }\n \n // Include hash only if not stripping\n if (!this.config.stripHash && urlObj.hash) {\n path += urlObj.hash;\n }\n \n return path;\n } catch (error) {\n // If URL parsing fails, return the raw string\n if (this.config.debug) {\n console.warn('[Page Tracking] Failed to parse URL:', url, error);\n }\n return url;\n }\n }\n\n /**\n * Clean URL for privacy (strip query params based on config)\n */\n private cleanUrl(url: string): string {\n if (!this.config.stripQueryParams) {\n return url;\n }\n \n try {\n const urlObj = new URL(url);\n return `${urlObj.origin}${urlObj.pathname}${this.config.stripHash ? '' : urlObj.hash}`;\n } catch (error) {\n return url;\n }\n }\n\n /**\n * Get the current page path\n */\n getCurrentPage(): string | null {\n return this.currentPath;\n }\n\n /**\n * Manually track a page view (for custom navigation)\n */\n trackPage(page: string, properties?: Record<string, unknown>): void {\n if (this.isDestroyed) return;\n\n const hasConsent = this.tracker.hasConsent('analytics');\n\n // Base properties\n const baseProperties: Record<string, unknown> = {\n page,\n timestamp: Date.now(),\n ...properties,\n };\n\n // Enhanced properties when consent is granted\n if (hasConsent && typeof document !== 'undefined' && typeof window !== 'undefined') {\n if (!baseProperties.referrer) {\n baseProperties.referrer = document.referrer || '';\n }\n if (!baseProperties.title) {\n baseProperties.title = document.title || '';\n }\n if (!baseProperties.full_url) {\n baseProperties.full_url = window.location.href;\n }\n if (!baseProperties.session_id) {\n baseProperties.session_id = this.tracker.getSessionId();\n }\n if (!baseProperties.browser) {\n baseProperties.browser = this.getBrowser();\n }\n if (!baseProperties.os) {\n baseProperties.os = this.getOS();\n }\n }\n\n this.tracker.trackSystemEvent('page_view', baseProperties);\n }\n\n /**\n * Get page view count for current session\n */\n getPageViewCount(): number {\n return this.pageViewCount;\n }\n\n /**\n * Destroy the page tracker\n */\n destroy(): void {\n if (this.isDestroyed) return;\n\n // Restore original history methods\n if (typeof history !== 'undefined') {\n if (this.originalPushState) {\n history.pushState = this.originalPushState;\n }\n if (this.originalReplaceState) {\n history.replaceState = this.originalReplaceState;\n }\n }\n\n // Remove event listeners\n if (typeof window !== 'undefined') {\n window.removeEventListener('popstate', this.handlePopState);\n window.removeEventListener('hashchange', this.handleHashChange);\n }\n\n this.isDestroyed = true;\n }\n}\n\n", "/**\n * ID Manager for Grain Analytics\n * Generates and manages user IDs based on consent mode\n * \n * Privacy-first implementation:\n * - Cookieless mode: Daily rotating IDs (no persistence)\n * - GDPR Strict: Permanent IDs only with consent\n * - GDPR Opt-out: Permanent IDs by default\n */\n\nexport type IdMode = 'cookieless' | 'permanent';\n\nexport interface IdConfig {\n mode: IdMode;\n tenantId: string;\n useLocalStorage?: boolean; // For permanent IDs only\n}\n\n/**\n * Generate a simple hash from a string\n */\nfunction simpleHash(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n return Math.abs(hash).toString(36);\n}\n\n/**\n * Generate a UUID v4\n */\nfunction generateUUID(): string {\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n return crypto.randomUUID();\n }\n \n // Fallback for older browsers\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = Math.random() * 16 | 0;\n const v = c === 'x' ? r : (r & 0x3 | 0x8);\n return v.toString(16);\n });\n}\n\n/**\n * Get minimal browser fingerprint for daily ID generation\n * NOT for tracking, just for same-day continuity\n */\nfunction getBrowserFingerprint(): string {\n if (typeof window === 'undefined') return 'server';\n \n const components: string[] = [\n screen.width?.toString() || '',\n screen.height?.toString() || '',\n navigator.language || '',\n Intl.DateTimeFormat().resolvedOptions().timeZone || ''\n ];\n \n return simpleHash(components.join('|'));\n}\n\n/**\n * Get current date string in local timezone (YYYY-MM-DD)\n */\nfunction getLocalDateString(): string {\n const now = new Date();\n const year = now.getFullYear();\n const month = String(now.getMonth() + 1).padStart(2, '0');\n const day = String(now.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n}\n\n/**\n * ID Manager class\n * Handles both daily rotating IDs and permanent IDs\n */\nexport class IdManager {\n private config: IdConfig;\n private cachedDailyId: string | null = null;\n private dailyIdDate: string | null = null;\n private dailyRandomSeed: string | null = null; // Random component for daily ID\n private permanentId: string | null = null;\n \n constructor(config: IdConfig) {\n this.config = config;\n \n // Load permanent ID from localStorage if in permanent mode\n if (config.mode === 'permanent' && config.useLocalStorage) {\n this.loadPermanentId();\n }\n \n // Load daily random seed from sessionStorage if in cookieless mode\n if (config.mode === 'cookieless') {\n this.loadDailySeed();\n }\n }\n \n /**\n * Generate a daily rotating ID\n * Rotates at midnight in user's local timezone\n * Provides same-day continuity without persistent tracking\n */\n generateDailyRotatingId(): string {\n const currentDate = getLocalDateString();\n \n // Return cached ID if still the same day\n if (this.cachedDailyId && this.dailyIdDate === currentDate && this.dailyRandomSeed) {\n return this.cachedDailyId;\n }\n \n // Load seed from sessionStorage if available\n const storedSeed = this.loadDailySeed();\n \n // If date changed, clear the random seed\n if (this.dailyIdDate !== currentDate) {\n this.dailyRandomSeed = null;\n this.clearDailySeed();\n }\n \n // Generate new random seed for today if needed\n if (!this.dailyRandomSeed) {\n this.dailyRandomSeed = storedSeed || generateUUID();\n this.saveDailySeed(this.dailyRandomSeed, currentDate);\n }\n \n // Generate new daily ID using fingerprint + random seed\n const fingerprint = getBrowserFingerprint();\n const seed = `${this.config.tenantId}|${currentDate}|${fingerprint}|${this.dailyRandomSeed}`;\n const dailyId = `daily_${simpleHash(seed)}`;\n \n // Cache for same-day requests\n this.cachedDailyId = dailyId;\n this.dailyIdDate = currentDate;\n \n return dailyId;\n }\n \n /**\n * Generate or retrieve permanent user ID\n * Only used when consent is given\n */\n generatePermanentId(): string {\n if (this.permanentId) {\n return this.permanentId;\n }\n \n // Try to load from localStorage\n if (this.config.useLocalStorage) {\n const stored = this.loadPermanentId();\n if (stored) {\n return stored;\n }\n }\n \n // Generate new permanent ID\n const newId = generateUUID();\n this.permanentId = newId;\n \n // Store in localStorage if enabled\n if (this.config.useLocalStorage) {\n this.savePermanentId(newId);\n }\n \n return newId;\n }\n \n /**\n * Get the current user ID based on mode\n */\n getCurrentUserId(): string {\n if (this.config.mode === 'cookieless') {\n return this.generateDailyRotatingId();\n } else {\n return this.generatePermanentId();\n }\n }\n \n /**\n * Switch ID mode (e.g., when consent is granted/revoked)\n */\n setMode(mode: IdMode): void {\n this.config.mode = mode;\n \n // Clear cached daily ID when switching to permanent\n if (mode === 'permanent') {\n this.cachedDailyId = null;\n this.dailyIdDate = null;\n this.dailyRandomSeed = null;\n this.clearDailySeed();\n }\n \n // Clear permanent ID when switching to cookieless\n if (mode === 'cookieless') {\n this.permanentId = null;\n if (this.config.useLocalStorage) {\n this.clearPermanentId();\n }\n // Load daily seed for cookieless mode\n this.loadDailySeed();\n }\n }\n \n /**\n * Load permanent ID from localStorage\n */\n private loadPermanentId(): string | null {\n if (typeof window === 'undefined') return null;\n \n try {\n const storageKey = `grain_anonymous_user_id_${this.config.tenantId}`;\n const stored = localStorage.getItem(storageKey);\n if (stored) {\n this.permanentId = stored;\n return stored;\n }\n } catch (error) {\n // Silent failure - localStorage might be disabled\n }\n \n return null;\n }\n \n /**\n * Save permanent ID to localStorage\n */\n private savePermanentId(id: string): void {\n if (typeof window === 'undefined') return;\n \n try {\n const storageKey = `grain_anonymous_user_id_${this.config.tenantId}`;\n localStorage.setItem(storageKey, id);\n } catch (error) {\n // Silent failure - localStorage might be disabled\n }\n }\n \n /**\n * Clear permanent ID from localStorage\n */\n private clearPermanentId(): void {\n if (typeof window === 'undefined') return;\n \n try {\n const storageKey = `grain_anonymous_user_id_${this.config.tenantId}`;\n localStorage.removeItem(storageKey);\n } catch (error) {\n // Silent failure\n }\n }\n \n /**\n * Load daily random seed from sessionStorage\n */\n private loadDailySeed(): string | null {\n if (typeof window === 'undefined') return null;\n \n try {\n const storageKey = `grain_daily_seed_${this.config.tenantId}`;\n const stored = sessionStorage.getItem(storageKey);\n if (stored) {\n const data = JSON.parse(stored);\n const currentDate = getLocalDateString();\n \n // Only use seed if it's from today\n if (data.date === currentDate && data.seed) {\n this.dailyRandomSeed = data.seed;\n this.dailyIdDate = data.date;\n return data.seed;\n } else {\n // Clear stale seed\n this.clearDailySeed();\n }\n }\n } catch (error) {\n // Silent failure - sessionStorage might be disabled\n }\n \n return null;\n }\n \n /**\n * Save daily random seed to sessionStorage\n */\n private saveDailySeed(seed: string, date: string): void {\n if (typeof window === 'undefined') return;\n \n try {\n const storageKey = `grain_daily_seed_${this.config.tenantId}`;\n const data = { seed, date };\n sessionStorage.setItem(storageKey, JSON.stringify(data));\n } catch (error) {\n // Silent failure - sessionStorage might be disabled\n }\n }\n \n /**\n * Clear daily seed from sessionStorage\n */\n private clearDailySeed(): void {\n if (typeof window === 'undefined') return;\n \n try {\n const storageKey = `grain_daily_seed_${this.config.tenantId}`;\n sessionStorage.removeItem(storageKey);\n } catch (error) {\n // Silent failure\n }\n }\n \n /**\n * Get info about current ID for debugging\n */\n getIdInfo(): { mode: IdMode; id: string; isDailyRotating: boolean } {\n const id = this.getCurrentUserId();\n return {\n mode: this.config.mode,\n id: id,\n isDailyRotating: id.startsWith('daily_')\n };\n }\n}\n"],
5
+ "mappings": "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B,eAAe,WAAW,IAAI,MAAM,QAC7D;AACA;QACE;QACA,MAAM;AACJ,cAAI,kBAAkB;AACd,kBAAA,qBAAqB,oBAAoB,GAAG;cAChD;cACA;cACA;cACA;cACA;cACA;cACA;cACA,WAAW;cACX;cACA;cACA;cACA;cACA;cACA;cACA;cACA;cACA;cACA;cACA;cACA;cACA;cACA;cACA;YAAA,CACD;AAED,gBAAI,oBAAoB;AACtB;gBACE;gBACA;cAAA;YAEJ;UACF;QACF;QACA;MAAA;IAEJ;AAEO,WAAA;EACT;AAEA,WAAS,SACP,GACA,SA4B6B;AACvB,UAAA;MACJ,SAAS,IAAI,OAAO;MACpB,aAAa;MACb,gBAAgB;MAChB,gBAAgB;MAChB,mBAAmB;MACnB,mBAAmB;MACnB,eAAe;MACf,eAAe;MACf,gBAAgB;MAChB;MACA;MACA,UAAU;MACV;MACA;MACA;MACA;MACA;MACA;MACA;MACA,kBAAkB,MAAM;IAAA,IACtB,WAAW,CAAA;AACT,UAAA,mBACJ,kBAAkB,OACd;MACE,OAAO;MACP,MAAM;MACN,kBAAkB;MAClB,OAAO;MACP,OAAO;MACP,QAAQ;MACR,OAAO;MACP,QAAQ;MACR,KAAK;MACL,MAAM;MACN,MAAM;MACN,KAAK;MACL,MAAM;MACN,UAAU;MACV,QAAQ;MACR,UAAU;IAAA,IAEZ,kBAAkB,QAClB;MACE,UAAU;IAEZ,IAAA;AACA,UAAA,iBACJ,YAAY,QAAQ,YAAY;;MAE5B;QACE,QAAQ;QACR,SAAS;QACT,aAAa;QACb,gBAAgB;QAChB,sBAAsB,YAAY;;QAClC,gBAAgB;QAChB,gBAAgB;QAChB,mBAAmB;QACnB,oBAAoB;QACpB,sBAAsB;MACxB;QACA,YAAY,QACZ,CACA,IAAA;AACN,WAAO,oBAAoB,GAAG;MAC5B,KAAK;MACL;MACA;MACA;MACA;MACA;MACA,WAAW;MACX;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA;MACA,mBAAmB;IAAA,CACpB;EACH;AAEgB,WAAA,cACdK,OACA,SACA;AACA,aAAS,KAAK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c,KAAK;AAC5C,kBAAQ,KAAK;AACb,kBAAQ,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA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",
6
+ "names": ["dom", "shadowRoot", "rule", "x", "childNodes", "node", "textContent", "stringify", "Stringifier", "isClean", "parse", "input", "Input", "parser", "Parser", "fromJSON", "PreviousMap", "Root", "Declaration", "Rule", "Comment", "AtRule", "Processor", "postcss", "result", "terminalHighlight", "my", "CssSyntaxError", "Node", "nanoid", "SourceMapConsumer", "SourceMapGenerator", "dirname", "pathToFileURL", "resolve", "sourceMapAvailable", "pathAvailable", "Container", "LazyResult", "document", "warnOnce", "Warning", "list", "tokenizer", "MapGenerator", "Document", "Result", "NoWorkResult", "picocolors_browserModule", "require$$0", "require$$1", "plugin", "index", "root", "require$$2", "require$$3", "stringifier", "require$$4", "require$$5", "require$$6", "processor", "warning", "sep", "require$$7", "require$$8", "visit", "require$$9", "require$$10", "require$$11", "require$$12", "require$$13", "require$$14", "require$$15", "require$$16", "require$$17", "DEFAULT_OPTIONS", "snapshot", "result", "index", "result", "node", "DEFAULT_OPTIONS", "result", "e", "list", "result", "url", "index", "index", "index", "idMode", "resolve", "HeatmapTrackingManager", "InteractionTrackingManager", "SectionTrackingManager", "index", "result", "DebugAgent"]
7
7
  }