{"version":3,"sources":["../../src/core/ConsentStorage.ts","../../src/core/ScriptBlocker.ts","../../src/core/ConsentAPI.ts","../../src/utils/EventEmitter.ts","../../src/utils/fingerprint.ts","../../src/version.ts","../../src/core/ConsentManager.ts","../../src/angular/index.ts"],"sourcesContent":["/**\n * ConsentStorage - Lokale Speicherung des Consent-Status\n *\n * Speichert Consent-Daten im localStorage mit HMAC-Signatur\n * zur Manipulationserkennung.\n */\n\nimport type { ConsentConfig, ConsentState } from '../types';\n\nconst STORAGE_KEY = 'bp_consent';\nconst STORAGE_VERSION = '1';\n\n/**\n * Gespeichertes Format\n */\ninterface StoredConsent {\n version: string;\n consent: ConsentState;\n signature: string;\n}\n\n/**\n * ConsentStorage - Persistente Speicherung\n */\nexport class ConsentStorage {\n private config: ConsentConfig;\n private storageKey: string;\n\n constructor(config: ConsentConfig) {\n this.config = config;\n // Pro Site ein separater Key\n this.storageKey = `${STORAGE_KEY}_${config.siteId}`;\n }\n\n /**\n * Consent laden\n */\n get(): ConsentState | null {\n if (typeof window === 'undefined') {\n return null;\n }\n\n try {\n const raw = localStorage.getItem(this.storageKey);\n if (!raw) {\n return null;\n }\n\n const stored: StoredConsent = JSON.parse(raw);\n\n // Version pruefen\n if (stored.version !== STORAGE_VERSION) {\n this.log('Storage version mismatch, clearing');\n this.clear();\n return null;\n }\n\n // Signatur pruefen\n if (!this.verifySignature(stored.consent, stored.signature)) {\n this.log('Invalid signature, clearing');\n this.clear();\n return null;\n }\n\n return stored.consent;\n } catch (error) {\n this.log('Failed to load consent:', error);\n return null;\n }\n }\n\n /**\n * Consent speichern\n */\n set(consent: ConsentState): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n try {\n const signature = this.generateSignature(consent);\n\n const stored: StoredConsent = {\n version: STORAGE_VERSION,\n consent,\n signature,\n };\n\n localStorage.setItem(this.storageKey, JSON.stringify(stored));\n\n // Auch als Cookie setzen (fuer Server-Side Rendering)\n this.setCookie(consent);\n\n this.log('Consent saved to storage');\n } catch (error) {\n this.log('Failed to save consent:', error);\n }\n }\n\n /**\n * Consent loeschen\n */\n clear(): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n try {\n localStorage.removeItem(this.storageKey);\n this.clearCookie();\n this.log('Consent cleared from storage');\n } catch (error) {\n this.log('Failed to clear consent:', error);\n }\n }\n\n /**\n * Pruefen ob Consent existiert\n */\n exists(): boolean {\n return this.get() !== null;\n }\n\n // ===========================================================================\n // Cookie Management\n // ===========================================================================\n\n /**\n * Consent als Cookie setzen\n */\n private setCookie(consent: ConsentState): void {\n const days = this.config.consent?.rememberDays ?? 365;\n const expires = new Date();\n expires.setDate(expires.getDate() + days);\n\n // Nur Kategorien als Cookie (fuer SSR)\n const cookieValue = JSON.stringify(consent.categories);\n const encoded = encodeURIComponent(cookieValue);\n\n document.cookie = [\n `${this.storageKey}=${encoded}`,\n `expires=${expires.toUTCString()}`,\n 'path=/',\n 'SameSite=Lax',\n location.protocol === 'https:' ? 'Secure' : '',\n ]\n .filter(Boolean)\n .join('; ');\n }\n\n /**\n * Cookie loeschen\n */\n private clearCookie(): void {\n document.cookie = `${this.storageKey}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;\n }\n\n // ===========================================================================\n // Signature (Simple HMAC-like)\n // ===========================================================================\n\n /**\n * Signatur generieren\n */\n private generateSignature(consent: ConsentState): string {\n const data = JSON.stringify(consent);\n const key = this.config.siteId;\n\n // Einfache Hash-Funktion (fuer Client-Side)\n // In Produktion wuerde man SubtleCrypto verwenden\n return this.simpleHash(data + key);\n }\n\n /**\n * Signatur verifizieren\n */\n private verifySignature(consent: ConsentState, signature: string): boolean {\n const expected = this.generateSignature(consent);\n return expected === signature;\n }\n\n /**\n * Einfache Hash-Funktion (djb2)\n */\n private simpleHash(str: string): string {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = (hash * 33) ^ str.charCodeAt(i);\n }\n return (hash >>> 0).toString(16);\n }\n\n /**\n * Debug-Logging\n */\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[ConsentStorage]', ...args);\n }\n }\n}\n\nexport default ConsentStorage;\n","/**\n * ScriptBlocker - Blockiert Skripte bis Consent erteilt wird\n *\n * Verwendet das data-consent Attribut zur Identifikation von\n * Skripten, die erst nach Consent geladen werden duerfen.\n *\n * Beispiel:\n * \n */\n\nimport type { ConsentConfig, ConsentCategory } from '../types';\n\n/**\n * Script-Element mit Consent-Attributen\n */\ninterface ConsentScript extends HTMLScriptElement {\n dataset: DOMStringMap & {\n consent?: string;\n src?: string;\n };\n}\n\n/**\n * iFrame-Element mit Consent-Attributen\n */\ninterface ConsentIframe extends HTMLIFrameElement {\n dataset: DOMStringMap & {\n consent?: string;\n src?: string;\n };\n}\n\n/**\n * ScriptBlocker - Verwaltet Script-Blocking\n */\nexport class ScriptBlocker {\n private config: ConsentConfig;\n private observer: MutationObserver | null = null;\n private enabledCategories: Set = new Set(['essential']);\n private processedElements: WeakSet = new WeakSet();\n\n constructor(config: ConsentConfig) {\n this.config = config;\n }\n\n /**\n * Initialisieren und Observer starten\n */\n init(): void {\n if (typeof window === 'undefined') {\n return;\n }\n\n // Bestehende Elemente verarbeiten\n this.processExistingElements();\n\n // MutationObserver fuer neue Elemente\n this.observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n for (const node of mutation.addedNodes) {\n if (node.nodeType === Node.ELEMENT_NODE) {\n this.processElement(node as Element);\n }\n }\n }\n });\n\n this.observer.observe(document.documentElement, {\n childList: true,\n subtree: true,\n });\n\n this.log('ScriptBlocker initialized');\n }\n\n /**\n * Kategorie aktivieren\n */\n enableCategory(category: ConsentCategory): void {\n if (this.enabledCategories.has(category)) {\n return;\n }\n\n this.enabledCategories.add(category);\n this.log('Category enabled:', category);\n\n // Blockierte Elemente dieser Kategorie aktivieren\n this.activateCategory(category);\n }\n\n /**\n * Kategorie deaktivieren\n */\n disableCategory(category: ConsentCategory): void {\n if (category === 'essential') {\n // Essential kann nicht deaktiviert werden\n return;\n }\n\n this.enabledCategories.delete(category);\n this.log('Category disabled:', category);\n\n // Hinweis: Bereits geladene Skripte koennen nicht entladen werden\n // Page-Reload noetig fuer vollstaendige Deaktivierung\n }\n\n /**\n * Alle Kategorien blockieren (ausser Essential)\n */\n blockAll(): void {\n this.enabledCategories.clear();\n this.enabledCategories.add('essential');\n this.log('All categories blocked');\n }\n\n /**\n * Pruefen ob Kategorie aktiviert\n */\n isCategoryEnabled(category: ConsentCategory): boolean {\n return this.enabledCategories.has(category);\n }\n\n /**\n * Observer stoppen\n */\n destroy(): void {\n this.observer?.disconnect();\n this.observer = null;\n this.log('ScriptBlocker destroyed');\n }\n\n // ===========================================================================\n // Internal Methods\n // ===========================================================================\n\n /**\n * Bestehende Elemente verarbeiten\n */\n private processExistingElements(): void {\n // Scripts mit data-consent\n const scripts = document.querySelectorAll(\n 'script[data-consent]'\n );\n scripts.forEach((script) => this.processScript(script));\n\n // iFrames mit data-consent\n const iframes = document.querySelectorAll(\n 'iframe[data-consent]'\n );\n iframes.forEach((iframe) => this.processIframe(iframe));\n\n this.log(`Processed ${scripts.length} scripts, ${iframes.length} iframes`);\n }\n\n /**\n * Element verarbeiten\n */\n private processElement(element: Element): void {\n if (element.tagName === 'SCRIPT') {\n this.processScript(element as ConsentScript);\n } else if (element.tagName === 'IFRAME') {\n this.processIframe(element as ConsentIframe);\n }\n\n // Auch Kinder verarbeiten\n element\n .querySelectorAll('script[data-consent]')\n .forEach((script) => this.processScript(script));\n element\n .querySelectorAll('iframe[data-consent]')\n .forEach((iframe) => this.processIframe(iframe));\n }\n\n /**\n * Script-Element verarbeiten\n */\n private processScript(script: ConsentScript): void {\n if (this.processedElements.has(script)) {\n return;\n }\n\n const category = script.dataset.consent as ConsentCategory | undefined;\n if (!category) {\n return;\n }\n\n this.processedElements.add(script);\n\n if (this.enabledCategories.has(category)) {\n this.activateScript(script);\n } else {\n this.log(`Script blocked (${category}):`, script.dataset.src || 'inline');\n }\n }\n\n /**\n * iFrame-Element verarbeiten\n */\n private processIframe(iframe: ConsentIframe): void {\n if (this.processedElements.has(iframe)) {\n return;\n }\n\n const category = iframe.dataset.consent as ConsentCategory | undefined;\n if (!category) {\n return;\n }\n\n this.processedElements.add(iframe);\n\n if (this.enabledCategories.has(category)) {\n this.activateIframe(iframe);\n } else {\n this.log(`iFrame blocked (${category}):`, iframe.dataset.src);\n // Placeholder anzeigen\n this.showPlaceholder(iframe, category);\n }\n }\n\n /**\n * Script aktivieren\n */\n private activateScript(script: ConsentScript): void {\n const src = script.dataset.src;\n\n if (src) {\n // Externes Script: neues Element erstellen\n const newScript = document.createElement('script');\n\n // Attribute kopieren\n for (const attr of script.attributes) {\n if (attr.name !== 'type' && attr.name !== 'data-src') {\n newScript.setAttribute(attr.name, attr.value);\n }\n }\n\n newScript.src = src;\n newScript.removeAttribute('data-consent');\n\n // Altes Element ersetzen\n script.parentNode?.replaceChild(newScript, script);\n\n this.log('External script activated:', src);\n } else {\n // Inline-Script: type aendern\n const newScript = document.createElement('script');\n\n for (const attr of script.attributes) {\n if (attr.name !== 'type') {\n newScript.setAttribute(attr.name, attr.value);\n }\n }\n\n newScript.textContent = script.textContent;\n newScript.removeAttribute('data-consent');\n\n script.parentNode?.replaceChild(newScript, script);\n\n this.log('Inline script activated');\n }\n }\n\n /**\n * iFrame aktivieren\n */\n private activateIframe(iframe: ConsentIframe): void {\n const src = iframe.dataset.src;\n if (!src) {\n return;\n }\n\n // Placeholder entfernen falls vorhanden\n const placeholder = iframe.parentElement?.querySelector(\n '.bp-consent-placeholder'\n );\n placeholder?.remove();\n\n // src setzen\n iframe.src = src;\n iframe.removeAttribute('data-src');\n iframe.removeAttribute('data-consent');\n iframe.style.display = '';\n\n this.log('iFrame activated:', src);\n }\n\n /**\n * Placeholder fuer blockierten iFrame anzeigen\n */\n private showPlaceholder(iframe: ConsentIframe, category: ConsentCategory): void {\n // iFrame verstecken\n iframe.style.display = 'none';\n\n // Placeholder erstellen\n const placeholder = document.createElement('div');\n placeholder.className = 'bp-consent-placeholder';\n placeholder.setAttribute('data-category', category);\n placeholder.innerHTML = `\n \n Dieser Inhalt erfordert Ihre Zustimmung.\n \n ${this.getCategoryName(category)} aktivieren\n \n \n `;\n\n // Click-Handler\n const btn = placeholder.querySelector('button');\n btn?.addEventListener('click', () => {\n // Event dispatchen damit ConsentManager reagieren kann\n window.dispatchEvent(\n new CustomEvent('bp-consent-request', {\n detail: { category },\n })\n );\n });\n\n // Nach iFrame einfuegen\n iframe.parentNode?.insertBefore(placeholder, iframe.nextSibling);\n }\n\n /**\n * Alle Elemente einer Kategorie aktivieren\n */\n private activateCategory(category: ConsentCategory): void {\n // Scripts\n const scripts = document.querySelectorAll(\n `script[data-consent=\"${category}\"]`\n );\n scripts.forEach((script) => this.activateScript(script));\n\n // iFrames\n const iframes = document.querySelectorAll(\n `iframe[data-consent=\"${category}\"]`\n );\n iframes.forEach((iframe) => this.activateIframe(iframe));\n\n this.log(\n `Activated ${scripts.length} scripts, ${iframes.length} iframes for ${category}`\n );\n }\n\n /**\n * Kategorie-Name fuer UI\n */\n private getCategoryName(category: ConsentCategory): string {\n const names: Record = {\n essential: 'Essentielle Cookies',\n functional: 'Funktionale Cookies',\n analytics: 'Statistik-Cookies',\n marketing: 'Marketing-Cookies',\n social: 'Social Media-Cookies',\n };\n return names[category] ?? category;\n }\n\n /**\n * Debug-Logging\n */\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[ScriptBlocker]', ...args);\n }\n }\n}\n\nexport default ScriptBlocker;\n","/**\n * ConsentAPI - Kommunikation mit dem Consent-Backend\n *\n * Sendet Consent-Entscheidungen an das Backend zur\n * revisionssicheren Speicherung.\n */\n\nimport type {\n ConsentConfig,\n ConsentState,\n ConsentAPIResponse,\n SiteConfigResponse,\n} from '../types';\n\n/**\n * Request-Payload fuer Consent-Speicherung\n */\ninterface SaveConsentRequest {\n siteId: string;\n userId?: string;\n deviceFingerprint: string;\n consent: ConsentState;\n metadata?: {\n userAgent?: string;\n language?: string;\n screenResolution?: string;\n platform?: string;\n appVersion?: string;\n };\n}\n\n/**\n * ConsentAPI - Backend-Kommunikation\n */\nexport class ConsentAPI {\n private config: ConsentConfig;\n private baseUrl: string;\n\n constructor(config: ConsentConfig) {\n this.config = config;\n this.baseUrl = config.apiEndpoint.replace(/\\/$/, '');\n }\n\n /**\n * Consent speichern\n */\n async saveConsent(request: SaveConsentRequest): Promise {\n const payload = {\n ...request,\n metadata: {\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : '',\n language: typeof navigator !== 'undefined' ? navigator.language : '',\n screenResolution:\n typeof window !== 'undefined'\n ? `${window.screen.width}x${window.screen.height}`\n : '',\n platform: 'web',\n ...request.metadata,\n },\n };\n\n const response = await this.fetch('/consent', {\n method: 'POST',\n body: JSON.stringify(payload),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to save consent: ${response.status}`);\n }\n\n return response.json();\n }\n\n /**\n * Consent abrufen\n */\n async getConsent(\n siteId: string,\n deviceFingerprint: string\n ): Promise {\n const params = new URLSearchParams({\n siteId,\n deviceFingerprint,\n });\n\n const response = await this.fetch(`/consent?${params}`);\n\n if (response.status === 404) {\n return null;\n }\n\n if (!response.ok) {\n throw new Error(`Failed to get consent: ${response.status}`);\n }\n\n const data = await response.json();\n return data.consent;\n }\n\n /**\n * Consent widerrufen\n */\n async revokeConsent(consentId: string): Promise {\n const response = await this.fetch(`/consent/${consentId}`, {\n method: 'DELETE',\n });\n\n if (!response.ok) {\n throw new Error(`Failed to revoke consent: ${response.status}`);\n }\n }\n\n /**\n * Site-Konfiguration abrufen\n */\n async getSiteConfig(siteId: string): Promise {\n const response = await this.fetch(`/config/${siteId}`);\n\n if (!response.ok) {\n throw new Error(`Failed to get site config: ${response.status}`);\n }\n\n return response.json();\n }\n\n /**\n * Consent-Historie exportieren (DSGVO Art. 20)\n */\n async exportConsent(userId: string): Promise {\n const params = new URLSearchParams({ userId });\n const response = await this.fetch(`/consent/export?${params}`);\n\n if (!response.ok) {\n throw new Error(`Failed to export consent: ${response.status}`);\n }\n\n return response.json();\n }\n\n // ===========================================================================\n // Internal Methods\n // ===========================================================================\n\n /**\n * Fetch mit Standard-Headers\n */\n private async fetch(\n path: string,\n options: RequestInit = {}\n ): Promise {\n const url = `${this.baseUrl}${path}`;\n\n const headers: HeadersInit = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n ...this.getSignatureHeaders(),\n ...(options.headers || {}),\n };\n\n try {\n const response = await fetch(url, {\n ...options,\n headers,\n credentials: 'include',\n });\n\n this.log(`${options.method || 'GET'} ${path}:`, response.status);\n return response;\n } catch (error) {\n this.log('Fetch error:', error);\n throw error;\n }\n }\n\n /**\n * Signatur-Headers generieren (HMAC)\n */\n private getSignatureHeaders(): Record {\n const timestamp = Math.floor(Date.now() / 1000).toString();\n\n // Einfache Signatur fuer Client-Side\n // In Produktion: Server-seitige Validierung mit echtem HMAC\n const signature = this.simpleHash(`${this.config.siteId}:${timestamp}`);\n\n return {\n 'X-Consent-Timestamp': timestamp,\n 'X-Consent-Signature': `sha256=${signature}`,\n };\n }\n\n /**\n * Einfache Hash-Funktion (djb2)\n */\n private simpleHash(str: string): string {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = (hash * 33) ^ str.charCodeAt(i);\n }\n return (hash >>> 0).toString(16);\n }\n\n /**\n * Debug-Logging\n */\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[ConsentAPI]', ...args);\n }\n }\n}\n\nexport default ConsentAPI;\n","/**\n * EventEmitter - Typsicherer Event-Handler\n */\n\ntype EventCallback = (data: T) => void;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class EventEmitter = Record> {\n private listeners: Map>> = new Map();\n\n /**\n * Event-Listener registrieren\n * @returns Unsubscribe-Funktion\n */\n on(\n event: K,\n callback: EventCallback\n ): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n\n this.listeners.get(event)!.add(callback as EventCallback);\n\n // Unsubscribe-Funktion zurueckgeben\n return () => this.off(event, callback);\n }\n\n /**\n * Event-Listener entfernen\n */\n off(\n event: K,\n callback: EventCallback\n ): void {\n this.listeners.get(event)?.delete(callback as EventCallback);\n }\n\n /**\n * Event emittieren\n */\n emit(event: K, data: Events[K]): void {\n this.listeners.get(event)?.forEach((callback) => {\n try {\n callback(data);\n } catch (error) {\n console.error(`Error in event handler for ${String(event)}:`, error);\n }\n });\n }\n\n /**\n * Einmaligen Listener registrieren\n */\n once(\n event: K,\n callback: EventCallback\n ): () => void {\n const wrapper = (data: Events[K]) => {\n this.off(event, wrapper);\n callback(data);\n };\n\n return this.on(event, wrapper);\n }\n\n /**\n * Alle Listener entfernen\n */\n clear(): void {\n this.listeners.clear();\n }\n\n /**\n * Alle Listener fuer ein Event entfernen\n */\n clearEvent(event: K): void {\n this.listeners.delete(event);\n }\n\n /**\n * Anzahl Listener fuer ein Event\n */\n listenerCount(event: K): number {\n return this.listeners.get(event)?.size ?? 0;\n }\n}\n\nexport default EventEmitter;\n","/**\n * Device Fingerprinting - Datenschutzkonform\n *\n * Generiert einen anonymen Fingerprint OHNE:\n * - Canvas Fingerprinting\n * - WebGL Fingerprinting\n * - Audio Fingerprinting\n * - Hardware-spezifische IDs\n *\n * Verwendet nur:\n * - User Agent\n * - Sprache\n * - Bildschirmaufloesung\n * - Zeitzone\n * - Platform\n */\n\n/**\n * Fingerprint-Komponenten sammeln\n */\nfunction getComponents(): string[] {\n if (typeof window === 'undefined') {\n return ['server'];\n }\n\n const components: string[] = [];\n\n // User Agent (anonymisiert)\n try {\n // Nur Browser-Familie, nicht vollstaendiger UA\n const ua = navigator.userAgent;\n if (ua.includes('Chrome')) components.push('chrome');\n else if (ua.includes('Firefox')) components.push('firefox');\n else if (ua.includes('Safari')) components.push('safari');\n else if (ua.includes('Edge')) components.push('edge');\n else components.push('other');\n } catch {\n components.push('unknown-browser');\n }\n\n // Sprache\n try {\n components.push(navigator.language || 'unknown-lang');\n } catch {\n components.push('unknown-lang');\n }\n\n // Bildschirm-Kategorie (nicht exakte Aufloesung)\n try {\n const width = window.screen.width;\n if (width >= 2560) components.push('4k');\n else if (width >= 1920) components.push('fhd');\n else if (width >= 1366) components.push('hd');\n else if (width >= 768) components.push('tablet');\n else components.push('mobile');\n } catch {\n components.push('unknown-screen');\n }\n\n // Farbtiefe (grob)\n try {\n const depth = window.screen.colorDepth;\n if (depth >= 24) components.push('deep-color');\n else components.push('standard-color');\n } catch {\n components.push('unknown-color');\n }\n\n // Zeitzone (nur Offset, nicht Name)\n try {\n const offset = new Date().getTimezoneOffset();\n const hours = Math.floor(Math.abs(offset) / 60);\n const sign = offset <= 0 ? '+' : '-';\n components.push(`tz${sign}${hours}`);\n } catch {\n components.push('unknown-tz');\n }\n\n // Platform-Kategorie\n try {\n const platform = navigator.platform?.toLowerCase() || '';\n if (platform.includes('mac')) components.push('mac');\n else if (platform.includes('win')) components.push('win');\n else if (platform.includes('linux')) components.push('linux');\n else if (platform.includes('iphone') || platform.includes('ipad'))\n components.push('ios');\n else if (platform.includes('android')) components.push('android');\n else components.push('other-platform');\n } catch {\n components.push('unknown-platform');\n }\n\n // Touch-Faehigkeit\n try {\n if ('ontouchstart' in window || navigator.maxTouchPoints > 0) {\n components.push('touch');\n } else {\n components.push('no-touch');\n }\n } catch {\n components.push('unknown-touch');\n }\n\n // Do Not Track (als Datenschutz-Signal)\n try {\n if (navigator.doNotTrack === '1') {\n components.push('dnt');\n }\n } catch {\n // Ignorieren\n }\n\n return components;\n}\n\n/**\n * SHA-256 Hash (async, nutzt SubtleCrypto)\n */\nasync function sha256(message: string): Promise {\n if (typeof window === 'undefined' || !window.crypto?.subtle) {\n // Fallback fuer Server/alte Browser\n return simpleHash(message);\n }\n\n try {\n const encoder = new TextEncoder();\n const data = encoder.encode(message);\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');\n } catch {\n return simpleHash(message);\n }\n}\n\n/**\n * Fallback Hash-Funktion (djb2)\n */\nfunction simpleHash(str: string): string {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = (hash * 33) ^ str.charCodeAt(i);\n }\n return (hash >>> 0).toString(16).padStart(8, '0');\n}\n\n/**\n * Datenschutzkonformen Fingerprint generieren\n *\n * Der Fingerprint ist:\n * - Nicht eindeutig (viele Nutzer teilen sich denselben)\n * - Nicht persistent (aendert sich bei Browser-Updates)\n * - Nicht invasiv (keine Canvas/WebGL/Audio)\n * - Anonymisiert (SHA-256 Hash)\n */\nexport async function generateFingerprint(): Promise {\n const components = getComponents();\n const combined = components.join('|');\n const hash = await sha256(combined);\n\n // Prefix fuer Identifikation\n return `fp_${hash.substring(0, 32)}`;\n}\n\n/**\n * Synchrone Version (mit einfachem Hash)\n */\nexport function generateFingerprintSync(): string {\n const components = getComponents();\n const combined = components.join('|');\n const hash = simpleHash(combined);\n\n return `fp_${hash}`;\n}\n\nexport default generateFingerprint;\n","/**\n * SDK Version\n */\nexport const SDK_VERSION = '1.0.0';\n\nexport default SDK_VERSION;\n","/**\n * ConsentManager - Hauptklasse fuer das Consent Management\n *\n * DSGVO/TTDSG-konformes Consent Management fuer Web, PWA und Mobile.\n */\n\nimport type {\n ConsentConfig,\n ConsentState,\n ConsentCategory,\n ConsentCategories,\n ConsentInput,\n ConsentEventType,\n ConsentEventCallback,\n ConsentEventData,\n} from '../types';\nimport { ConsentStorage } from './ConsentStorage';\nimport { ScriptBlocker } from './ScriptBlocker';\nimport { ConsentAPI } from './ConsentAPI';\nimport { EventEmitter } from '../utils/EventEmitter';\nimport { generateFingerprint } from '../utils/fingerprint';\nimport { SDK_VERSION } from '../version';\n\n/**\n * Default-Konfiguration\n */\nconst DEFAULT_CONFIG: Partial = {\n language: 'de',\n fallbackLanguage: 'en',\n ui: {\n position: 'bottom',\n layout: 'modal',\n theme: 'auto',\n zIndex: 999999,\n blockScrollOnModal: true,\n },\n consent: {\n required: true,\n rejectAllVisible: true,\n acceptAllVisible: true,\n granularControl: true,\n vendorControl: false,\n rememberChoice: true,\n rememberDays: 365,\n geoTargeting: false,\n recheckAfterDays: 180,\n },\n categories: ['essential', 'functional', 'analytics', 'marketing', 'social'],\n debug: false,\n};\n\n/**\n * Default Consent-State (nur Essential aktiv)\n */\nconst DEFAULT_CONSENT: ConsentCategories = {\n essential: true,\n functional: false,\n analytics: false,\n marketing: false,\n social: false,\n};\n\n/**\n * ConsentManager - Zentrale Klasse fuer Consent-Verwaltung\n */\nexport class ConsentManager {\n private config: ConsentConfig;\n private storage: ConsentStorage;\n private scriptBlocker: ScriptBlocker;\n private api: ConsentAPI;\n private events: EventEmitter;\n private currentConsent: ConsentState | null = null;\n private initialized = false;\n private bannerVisible = false;\n private deviceFingerprint: string = '';\n\n constructor(config: ConsentConfig) {\n this.config = this.mergeConfig(config);\n this.storage = new ConsentStorage(this.config);\n this.scriptBlocker = new ScriptBlocker(this.config);\n this.api = new ConsentAPI(this.config);\n this.events = new EventEmitter();\n\n this.log('ConsentManager created with config:', this.config);\n }\n\n /**\n * SDK initialisieren\n */\n async init(): Promise {\n if (this.initialized) {\n this.log('Already initialized, skipping');\n return;\n }\n\n try {\n this.log('Initializing ConsentManager...');\n\n // Device Fingerprint generieren\n this.deviceFingerprint = await generateFingerprint();\n\n // Consent aus Storage laden\n this.currentConsent = this.storage.get();\n\n if (this.currentConsent) {\n this.log('Loaded consent from storage:', this.currentConsent);\n\n // Pruefen ob Consent abgelaufen\n if (this.isConsentExpired()) {\n this.log('Consent expired, clearing');\n this.storage.clear();\n this.currentConsent = null;\n } else {\n // Consent anwenden\n this.applyConsent();\n }\n }\n\n // Script-Blocker initialisieren\n this.scriptBlocker.init();\n\n this.initialized = true;\n this.emit('init', this.currentConsent);\n\n // Banner anzeigen falls noetig\n if (this.needsConsent()) {\n this.showBanner();\n }\n\n this.log('ConsentManager initialized successfully');\n } catch (error) {\n this.handleError(error as Error);\n throw error;\n }\n }\n\n // ===========================================================================\n // Public API\n // ===========================================================================\n\n /**\n * Pruefen ob Consent fuer Kategorie vorhanden\n */\n hasConsent(category: ConsentCategory): boolean {\n if (!this.currentConsent) {\n return category === 'essential';\n }\n return this.currentConsent.categories[category] ?? false;\n }\n\n /**\n * Pruefen ob Consent fuer Vendor vorhanden\n */\n hasVendorConsent(vendorId: string): boolean {\n if (!this.currentConsent) {\n return false;\n }\n return this.currentConsent.vendors[vendorId] ?? false;\n }\n\n /**\n * Aktuellen Consent-State abrufen\n */\n getConsent(): ConsentState | null {\n return this.currentConsent ? { ...this.currentConsent } : null;\n }\n\n /**\n * Consent setzen\n */\n async setConsent(input: ConsentInput): Promise {\n const categories = this.normalizeConsentInput(input);\n\n // Essential ist immer aktiv\n categories.essential = true;\n\n const newConsent: ConsentState = {\n categories,\n vendors: 'vendors' in input && input.vendors ? input.vendors : {},\n timestamp: new Date().toISOString(),\n version: SDK_VERSION,\n };\n\n try {\n // An Backend senden\n const response = await this.api.saveConsent({\n siteId: this.config.siteId,\n deviceFingerprint: this.deviceFingerprint,\n consent: newConsent,\n });\n\n newConsent.consentId = response.consentId;\n newConsent.expiresAt = response.expiresAt;\n\n // Lokal speichern\n this.storage.set(newConsent);\n this.currentConsent = newConsent;\n\n // Consent anwenden\n this.applyConsent();\n\n // Event emittieren\n this.emit('change', newConsent);\n this.config.onConsentChange?.(newConsent);\n\n this.log('Consent saved:', newConsent);\n } catch (error) {\n // Bei Netzwerkfehler trotzdem lokal speichern\n this.log('API error, saving locally:', error);\n this.storage.set(newConsent);\n this.currentConsent = newConsent;\n this.applyConsent();\n this.emit('change', newConsent);\n }\n }\n\n /**\n * Alle Kategorien akzeptieren\n */\n async acceptAll(): Promise {\n const allCategories: ConsentCategories = {\n essential: true,\n functional: true,\n analytics: true,\n marketing: true,\n social: true,\n };\n\n await this.setConsent(allCategories);\n this.emit('accept_all', this.currentConsent!);\n this.hideBanner();\n }\n\n /**\n * Alle nicht-essentiellen Kategorien ablehnen\n */\n async rejectAll(): Promise {\n const minimalCategories: ConsentCategories = {\n essential: true,\n functional: false,\n analytics: false,\n marketing: false,\n social: false,\n };\n\n await this.setConsent(minimalCategories);\n this.emit('reject_all', this.currentConsent!);\n this.hideBanner();\n }\n\n /**\n * Alle Einwilligungen widerrufen\n */\n async revokeAll(): Promise {\n if (this.currentConsent?.consentId) {\n try {\n await this.api.revokeConsent(this.currentConsent.consentId);\n } catch (error) {\n this.log('Failed to revoke on server:', error);\n }\n }\n\n this.storage.clear();\n this.currentConsent = null;\n this.scriptBlocker.blockAll();\n\n this.log('All consents revoked');\n }\n\n /**\n * Consent-Daten exportieren (DSGVO Art. 20)\n */\n async exportConsent(): Promise {\n const exportData = {\n currentConsent: this.currentConsent,\n exportedAt: new Date().toISOString(),\n siteId: this.config.siteId,\n deviceFingerprint: this.deviceFingerprint,\n };\n\n return JSON.stringify(exportData, null, 2);\n }\n\n // ===========================================================================\n // Banner Control\n // ===========================================================================\n\n /**\n * Pruefen ob Consent-Abfrage noetig\n */\n needsConsent(): boolean {\n if (!this.currentConsent) {\n return true;\n }\n\n if (this.isConsentExpired()) {\n return true;\n }\n\n // Recheck nach X Tagen\n if (this.config.consent?.recheckAfterDays) {\n const consentDate = new Date(this.currentConsent.timestamp);\n const recheckDate = new Date(consentDate);\n recheckDate.setDate(\n recheckDate.getDate() + this.config.consent.recheckAfterDays\n );\n\n if (new Date() > recheckDate) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Banner anzeigen\n */\n showBanner(): void {\n if (this.bannerVisible) {\n return;\n }\n\n this.bannerVisible = true;\n this.emit('banner_show', undefined);\n this.config.onBannerShow?.();\n\n // Banner wird von UI-Komponente gerendert\n // Hier nur Status setzen\n this.log('Banner shown');\n }\n\n /**\n * Banner verstecken\n */\n hideBanner(): void {\n if (!this.bannerVisible) {\n return;\n }\n\n this.bannerVisible = false;\n this.emit('banner_hide', undefined);\n this.config.onBannerHide?.();\n\n this.log('Banner hidden');\n }\n\n /**\n * Einstellungs-Modal oeffnen\n */\n showSettings(): void {\n this.emit('settings_open', undefined);\n this.log('Settings opened');\n }\n\n /**\n * Pruefen ob Banner sichtbar\n */\n isBannerVisible(): boolean {\n return this.bannerVisible;\n }\n\n // ===========================================================================\n // Event Handling\n // ===========================================================================\n\n /**\n * Event-Listener registrieren\n */\n on(\n event: T,\n callback: ConsentEventCallback\n ): () => void {\n return this.events.on(event, callback);\n }\n\n /**\n * Event-Listener entfernen\n */\n off(\n event: T,\n callback: ConsentEventCallback\n ): void {\n this.events.off(event, callback);\n }\n\n // ===========================================================================\n // Internal Methods\n // ===========================================================================\n\n /**\n * Konfiguration zusammenfuehren\n */\n private mergeConfig(config: ConsentConfig): ConsentConfig {\n return {\n ...DEFAULT_CONFIG,\n ...config,\n ui: { ...DEFAULT_CONFIG.ui, ...config.ui },\n consent: { ...DEFAULT_CONFIG.consent, ...config.consent },\n } as ConsentConfig;\n }\n\n /**\n * Consent-Input normalisieren\n */\n private normalizeConsentInput(input: ConsentInput): ConsentCategories {\n if ('categories' in input && input.categories) {\n return { ...DEFAULT_CONSENT, ...input.categories };\n }\n\n return { ...DEFAULT_CONSENT, ...(input as Partial) };\n }\n\n /**\n * Consent anwenden (Skripte aktivieren/blockieren)\n */\n private applyConsent(): void {\n if (!this.currentConsent) {\n return;\n }\n\n for (const [category, allowed] of Object.entries(\n this.currentConsent.categories\n )) {\n if (allowed) {\n this.scriptBlocker.enableCategory(category as ConsentCategory);\n } else {\n this.scriptBlocker.disableCategory(category as ConsentCategory);\n }\n }\n\n // Google Consent Mode aktualisieren\n this.updateGoogleConsentMode();\n }\n\n /**\n * Google Consent Mode v2 aktualisieren\n */\n private updateGoogleConsentMode(): void {\n if (typeof window === 'undefined' || !this.currentConsent) {\n return;\n }\n\n const gtag = (window as unknown as { gtag?: (...args: unknown[]) => void }).gtag;\n if (typeof gtag !== 'function') {\n return;\n }\n\n const { categories } = this.currentConsent;\n\n gtag('consent', 'update', {\n ad_storage: categories.marketing ? 'granted' : 'denied',\n ad_user_data: categories.marketing ? 'granted' : 'denied',\n ad_personalization: categories.marketing ? 'granted' : 'denied',\n analytics_storage: categories.analytics ? 'granted' : 'denied',\n functionality_storage: categories.functional ? 'granted' : 'denied',\n personalization_storage: categories.functional ? 'granted' : 'denied',\n security_storage: 'granted',\n });\n\n this.log('Google Consent Mode updated');\n }\n\n /**\n * Pruefen ob Consent abgelaufen\n */\n private isConsentExpired(): boolean {\n if (!this.currentConsent?.expiresAt) {\n // Fallback: Nach rememberDays ablaufen\n if (this.currentConsent?.timestamp && this.config.consent?.rememberDays) {\n const consentDate = new Date(this.currentConsent.timestamp);\n const expiryDate = new Date(consentDate);\n expiryDate.setDate(\n expiryDate.getDate() + this.config.consent.rememberDays\n );\n return new Date() > expiryDate;\n }\n return false;\n }\n\n return new Date() > new Date(this.currentConsent.expiresAt);\n }\n\n /**\n * Event emittieren\n */\n private emit(\n event: T,\n data: ConsentEventData[T]\n ): void {\n this.events.emit(event, data);\n }\n\n /**\n * Fehler behandeln\n */\n private handleError(error: Error): void {\n this.log('Error:', error);\n this.emit('error', error);\n this.config.onError?.(error);\n }\n\n /**\n * Debug-Logging\n */\n private log(...args: unknown[]): void {\n if (this.config.debug) {\n console.log('[ConsentSDK]', ...args);\n }\n }\n\n // ===========================================================================\n // Static Methods\n // ===========================================================================\n\n /**\n * SDK-Version abrufen\n */\n static getVersion(): string {\n return SDK_VERSION;\n }\n}\n\n// Default-Export\nexport default ConsentManager;\n","/**\n * Angular Integration fuer @breakpilot/consent-sdk\n *\n * @example\n * ```typescript\n * // app.module.ts\n * import { ConsentModule } from '@breakpilot/consent-sdk/angular';\n *\n * @NgModule({\n * imports: [\n * ConsentModule.forRoot({\n * apiEndpoint: 'https://consent.example.com/api/v1',\n * siteId: 'site_abc123',\n * }),\n * ],\n * })\n * export class AppModule {}\n * ```\n */\n\n// =============================================================================\n// NOTE: Angular SDK Structure\n// =============================================================================\n//\n// Angular hat ein komplexeres Build-System (ngc, ng-packagr).\n// Diese Datei definiert die Schnittstelle - fuer Production muss ein\n// separates Angular Library Package erstellt werden:\n//\n// ng generate library @breakpilot/consent-sdk-angular\n//\n// Die folgende Implementation ist fuer direkten Import vorgesehen.\n// =============================================================================\n\nimport { ConsentManager } from '../core/ConsentManager';\nimport type {\n ConsentConfig,\n ConsentState,\n ConsentCategory,\n ConsentCategories,\n} from '../types';\n\n// =============================================================================\n// Angular Service Interface\n// =============================================================================\n\n/**\n * ConsentService Interface fuer Angular DI\n *\n * @example\n * ```typescript\n * @Component({...})\n * export class MyComponent {\n * constructor(private consent: ConsentService) {\n * if (this.consent.hasConsent('analytics')) {\n * // Analytics laden\n * }\n * }\n * }\n * ```\n */\nexport interface IConsentService {\n /** Initialisiert? */\n readonly isInitialized: boolean;\n\n /** Laedt noch? */\n readonly isLoading: boolean;\n\n /** Banner sichtbar? */\n readonly isBannerVisible: boolean;\n\n /** Aktueller Consent-Zustand */\n readonly consent: ConsentState | null;\n\n /** Muss Consent eingeholt werden? */\n readonly needsConsent: boolean;\n\n /** Prueft Consent fuer Kategorie */\n hasConsent(category: ConsentCategory): boolean;\n\n /** Alle akzeptieren */\n acceptAll(): Promise;\n\n /** Alle ablehnen */\n rejectAll(): Promise;\n\n /** Auswahl speichern */\n saveSelection(categories: Partial): Promise;\n\n /** Banner anzeigen */\n showBanner(): void;\n\n /** Banner ausblenden */\n hideBanner(): void;\n\n /** Einstellungen oeffnen */\n showSettings(): void;\n}\n\n// =============================================================================\n// ConsentService Implementation\n// =============================================================================\n\n/**\n * ConsentService - Angular Service Wrapper\n *\n * Diese Klasse kann als Angular Service registriert werden:\n *\n * @example\n * ```typescript\n * // consent.service.ts\n * import { Injectable } from '@angular/core';\n * import { ConsentServiceBase } from '@breakpilot/consent-sdk/angular';\n *\n * @Injectable({ providedIn: 'root' })\n * export class ConsentService extends ConsentServiceBase {\n * constructor() {\n * super({\n * apiEndpoint: environment.consentApiEndpoint,\n * siteId: environment.siteId,\n * });\n * }\n * }\n * ```\n */\nexport class ConsentServiceBase implements IConsentService {\n private manager: ConsentManager;\n private _consent: ConsentState | null = null;\n private _isInitialized = false;\n private _isLoading = true;\n private _isBannerVisible = false;\n\n // Callbacks fuer Angular Change Detection\n private changeCallbacks: Array<(consent: ConsentState) => void> = [];\n private bannerShowCallbacks: Array<() => void> = [];\n private bannerHideCallbacks: Array<() => void> = [];\n\n constructor(config: ConsentConfig) {\n this.manager = new ConsentManager(config);\n this.setupEventListeners();\n this.initialize();\n }\n\n // ---------------------------------------------------------------------------\n // Getters\n // ---------------------------------------------------------------------------\n\n get isInitialized(): boolean {\n return this._isInitialized;\n }\n\n get isLoading(): boolean {\n return this._isLoading;\n }\n\n get isBannerVisible(): boolean {\n return this._isBannerVisible;\n }\n\n get consent(): ConsentState | null {\n return this._consent;\n }\n\n get needsConsent(): boolean {\n return this.manager.needsConsent();\n }\n\n // ---------------------------------------------------------------------------\n // Methods\n // ---------------------------------------------------------------------------\n\n hasConsent(category: ConsentCategory): boolean {\n return this.manager.hasConsent(category);\n }\n\n async acceptAll(): Promise {\n await this.manager.acceptAll();\n }\n\n async rejectAll(): Promise {\n await this.manager.rejectAll();\n }\n\n async saveSelection(categories: Partial): Promise {\n await this.manager.setConsent(categories);\n this.manager.hideBanner();\n }\n\n showBanner(): void {\n this.manager.showBanner();\n }\n\n hideBanner(): void {\n this.manager.hideBanner();\n }\n\n showSettings(): void {\n this.manager.showSettings();\n }\n\n // ---------------------------------------------------------------------------\n // Change Detection Support\n // ---------------------------------------------------------------------------\n\n /**\n * Registriert Callback fuer Consent-Aenderungen\n * (fuer Angular Change Detection)\n */\n onConsentChange(callback: (consent: ConsentState) => void): () => void {\n this.changeCallbacks.push(callback);\n return () => {\n const index = this.changeCallbacks.indexOf(callback);\n if (index > -1) {\n this.changeCallbacks.splice(index, 1);\n }\n };\n }\n\n /**\n * Registriert Callback wenn Banner angezeigt wird\n */\n onBannerShow(callback: () => void): () => void {\n this.bannerShowCallbacks.push(callback);\n return () => {\n const index = this.bannerShowCallbacks.indexOf(callback);\n if (index > -1) {\n this.bannerShowCallbacks.splice(index, 1);\n }\n };\n }\n\n /**\n * Registriert Callback wenn Banner ausgeblendet wird\n */\n onBannerHide(callback: () => void): () => void {\n this.bannerHideCallbacks.push(callback);\n return () => {\n const index = this.bannerHideCallbacks.indexOf(callback);\n if (index > -1) {\n this.bannerHideCallbacks.splice(index, 1);\n }\n };\n }\n\n // ---------------------------------------------------------------------------\n // Internal\n // ---------------------------------------------------------------------------\n\n private setupEventListeners(): void {\n this.manager.on('change', (consent) => {\n this._consent = consent;\n this.changeCallbacks.forEach((cb) => cb(consent));\n });\n\n this.manager.on('banner_show', () => {\n this._isBannerVisible = true;\n this.bannerShowCallbacks.forEach((cb) => cb());\n });\n\n this.manager.on('banner_hide', () => {\n this._isBannerVisible = false;\n this.bannerHideCallbacks.forEach((cb) => cb());\n });\n }\n\n private async initialize(): Promise {\n try {\n await this.manager.init();\n this._consent = this.manager.getConsent();\n this._isInitialized = true;\n this._isBannerVisible = this.manager.isBannerVisible();\n } catch (error) {\n console.error('Failed to initialize ConsentManager:', error);\n } finally {\n this._isLoading = false;\n }\n }\n}\n\n// =============================================================================\n// Angular Module Configuration\n// =============================================================================\n\n/**\n * Konfiguration fuer ConsentModule.forRoot()\n */\nexport interface ConsentModuleConfig extends ConsentConfig {}\n\n/**\n * Token fuer Dependency Injection\n * Verwendung mit Angular @Inject():\n *\n * @example\n * ```typescript\n * constructor(@Inject(CONSENT_CONFIG) private config: ConsentConfig) {}\n * ```\n */\nexport const CONSENT_CONFIG = 'CONSENT_CONFIG';\nexport const CONSENT_SERVICE = 'CONSENT_SERVICE';\n\n// =============================================================================\n// Factory Functions fuer Angular DI\n// =============================================================================\n\n/**\n * Factory fuer ConsentService\n *\n * @example\n * ```typescript\n * // app.module.ts\n * providers: [\n * { provide: CONSENT_CONFIG, useValue: { apiEndpoint: '...', siteId: '...' } },\n * { provide: CONSENT_SERVICE, useFactory: consentServiceFactory, deps: [CONSENT_CONFIG] },\n * ]\n * ```\n */\nexport function consentServiceFactory(config: ConsentConfig): ConsentServiceBase {\n return new ConsentServiceBase(config);\n}\n\n// =============================================================================\n// Angular Module Definition (Template)\n// =============================================================================\n\n/**\n * ConsentModule - Angular Module\n *\n * Dies ist eine Template-Definition. Fuer echte Angular-Nutzung\n * muss ein separates Angular Library Package erstellt werden.\n *\n * @example\n * ```typescript\n * // In einem Angular Library Package:\n * @NgModule({\n * declarations: [ConsentBannerComponent, ConsentGateDirective],\n * exports: [ConsentBannerComponent, ConsentGateDirective],\n * })\n * export class ConsentModule {\n * static forRoot(config: ConsentModuleConfig): ModuleWithProviders {\n * return {\n * ngModule: ConsentModule,\n * providers: [\n * { provide: CONSENT_CONFIG, useValue: config },\n * { provide: CONSENT_SERVICE, useFactory: consentServiceFactory, deps: [CONSENT_CONFIG] },\n * ],\n * };\n * }\n * }\n * ```\n */\nexport const ConsentModuleDefinition = {\n /**\n * Providers fuer Root-Module\n */\n forRoot: (config: ConsentModuleConfig) => ({\n provide: CONSENT_CONFIG,\n useValue: config,\n }),\n};\n\n// =============================================================================\n// Component Templates (fuer Angular Library)\n// =============================================================================\n\n/**\n * ConsentBannerComponent Template\n *\n * Fuer Angular Library Implementation:\n *\n * @example\n * ```typescript\n * @Component({\n * selector: 'bp-consent-banner',\n * template: CONSENT_BANNER_TEMPLATE,\n * styles: [CONSENT_BANNER_STYLES],\n * })\n * export class ConsentBannerComponent {\n * constructor(public consent: ConsentService) {}\n * }\n * ```\n */\nexport const CONSENT_BANNER_TEMPLATE = `\n\n \n Datenschutzeinstellungen\n \n Wir nutzen Cookies und ähnliche Technologien, um Ihnen ein optimales\n Nutzererlebnis zu bieten.\n \n \n \n Alle ablehnen\n \n \n Einstellungen\n \n \n Alle akzeptieren\n \n \n \n\n`;\n\n/**\n * ConsentGateDirective Template\n *\n * @example\n * ```typescript\n * @Directive({\n * selector: '[bpConsentGate]',\n * })\n * export class ConsentGateDirective implements OnInit, OnDestroy {\n * @Input('bpConsentGate') category!: ConsentCategory;\n *\n * private unsubscribe?: () => void;\n *\n * constructor(\n * private templateRef: TemplateRef,\n * private viewContainer: ViewContainerRef,\n * private consent: ConsentService\n * ) {}\n *\n * ngOnInit() {\n * this.updateView();\n * this.unsubscribe = this.consent.onConsentChange(() => this.updateView());\n * }\n *\n * ngOnDestroy() {\n * this.unsubscribe?.();\n * }\n *\n * private updateView() {\n * if (this.consent.hasConsent(this.category)) {\n * this.viewContainer.createEmbeddedView(this.templateRef);\n * } else {\n * this.viewContainer.clear();\n * }\n * }\n * }\n * ```\n */\nexport const CONSENT_GATE_USAGE = `\n\n\n \n\n\n\n\n \n\n\n Bitte akzeptieren Sie Marketing-Cookies.\n\n`;\n\n// =============================================================================\n// RxJS Observable Wrapper (Optional)\n// =============================================================================\n\n/**\n * RxJS Observable Wrapper fuer ConsentService\n *\n * Fuer Projekte die RxJS bevorzugen:\n *\n * @example\n * ```typescript\n * import { BehaviorSubject, Observable } from 'rxjs';\n *\n * export class ConsentServiceRx extends ConsentServiceBase {\n * private consentSubject = new BehaviorSubject(null);\n * private bannerVisibleSubject = new BehaviorSubject(false);\n *\n * consent$ = this.consentSubject.asObservable();\n * isBannerVisible$ = this.bannerVisibleSubject.asObservable();\n *\n * constructor(config: ConsentConfig) {\n * super(config);\n * this.onConsentChange((c) => this.consentSubject.next(c));\n * this.onBannerShow(() => this.bannerVisibleSubject.next(true));\n * this.onBannerHide(() => this.bannerVisibleSubject.next(false));\n * }\n * }\n * ```\n */\n\n// =============================================================================\n// Exports\n// =============================================================================\n\nexport type { ConsentConfig, ConsentState, ConsentCategory, ConsentCategories };\n"],"mappings":";AASA,IAAM,cAAc;AACpB,IAAM,kBAAkB;AAcjB,IAAM,iBAAN,MAAqB;AAAA,EAI1B,YAAY,QAAuB;AACjC,SAAK,SAAS;AAEd,SAAK,aAAa,GAAG,WAAW,IAAI,OAAO,MAAM;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,MAA2B;AACzB,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,MAAM,aAAa,QAAQ,KAAK,UAAU;AAChD,UAAI,CAAC,KAAK;AACR,eAAO;AAAA,MACT;AAEA,YAAM,SAAwB,KAAK,MAAM,GAAG;AAG5C,UAAI,OAAO,YAAY,iBAAiB;AACtC,aAAK,IAAI,oCAAoC;AAC7C,aAAK,MAAM;AACX,eAAO;AAAA,MACT;AAGA,UAAI,CAAC,KAAK,gBAAgB,OAAO,SAAS,OAAO,SAAS,GAAG;AAC3D,aAAK,IAAI,6BAA6B;AACtC,aAAK,MAAM;AACX,eAAO;AAAA,MACT;AAEA,aAAO,OAAO;AAAA,IAChB,SAAS,OAAO;AACd,WAAK,IAAI,2BAA2B,KAAK;AACzC,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAA6B;AAC/B,QAAI,OAAO,WAAW,aAAa;AACjC;AAAA,IACF;AAEA,QAAI;AACF,YAAM,YAAY,KAAK,kBAAkB,OAAO;AAEhD,YAAM,SAAwB;AAAA,QAC5B,SAAS;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAEA,mBAAa,QAAQ,KAAK,YAAY,KAAK,UAAU,MAAM,CAAC;AAG5D,WAAK,UAAU,OAAO;AAEtB,WAAK,IAAI,0BAA0B;AAAA,IACrC,SAAS,OAAO;AACd,WAAK,IAAI,2BAA2B,KAAK;AAAA,IAC3C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,QAAI,OAAO,WAAW,aAAa;AACjC;AAAA,IACF;AAEA,QAAI;AACF,mBAAa,WAAW,KAAK,UAAU;AACvC,WAAK,YAAY;AACjB,WAAK,IAAI,8BAA8B;AAAA,IACzC,SAAS,OAAO;AACd,WAAK,IAAI,4BAA4B,KAAK;AAAA,IAC5C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAkB;AAChB,WAAO,KAAK,IAAI,MAAM;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,UAAU,SAA6B;AAC7C,UAAM,OAAO,KAAK,OAAO,SAAS,gBAAgB;AAClD,UAAM,UAAU,oBAAI,KAAK;AACzB,YAAQ,QAAQ,QAAQ,QAAQ,IAAI,IAAI;AAGxC,UAAM,cAAc,KAAK,UAAU,QAAQ,UAAU;AACrD,UAAM,UAAU,mBAAmB,WAAW;AAE9C,aAAS,SAAS;AAAA,MAChB,GAAG,KAAK,UAAU,IAAI,OAAO;AAAA,MAC7B,WAAW,QAAQ,YAAY,CAAC;AAAA,MAChC;AAAA,MACA;AAAA,MACA,SAAS,aAAa,WAAW,WAAW;AAAA,IAC9C,EACG,OAAO,OAAO,EACd,KAAK,IAAI;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAoB;AAC1B,aAAS,SAAS,GAAG,KAAK,UAAU;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,kBAAkB,SAA+B;AACvD,UAAM,OAAO,KAAK,UAAU,OAAO;AACnC,UAAM,MAAM,KAAK,OAAO;AAIxB,WAAO,KAAK,WAAW,OAAO,GAAG;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,SAAuB,WAA4B;AACzE,UAAM,WAAW,KAAK,kBAAkB,OAAO;AAC/C,WAAO,aAAa;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAW,KAAqB;AACtC,QAAI,OAAO;AACX,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,aAAQ,OAAO,KAAM,IAAI,WAAW,CAAC;AAAA,IACvC;AACA,YAAQ,SAAS,GAAG,SAAS,EAAE;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKQ,OAAO,MAAuB;AACpC,QAAI,KAAK,OAAO,OAAO;AACrB,cAAQ,IAAI,oBAAoB,GAAG,IAAI;AAAA,IACzC;AAAA,EACF;AACF;;;ACrKO,IAAM,gBAAN,MAAoB;AAAA,EAMzB,YAAY,QAAuB;AAJnC,SAAQ,WAAoC;AAC5C,SAAQ,oBAA0C,oBAAI,IAAI,CAAC,WAAW,CAAC;AACvE,SAAQ,oBAAsC,oBAAI,QAAQ;AAGxD,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAa;AACX,QAAI,OAAO,WAAW,aAAa;AACjC;AAAA,IACF;AAGA,SAAK,wBAAwB;AAG7B,SAAK,WAAW,IAAI,iBAAiB,CAAC,cAAc;AAClD,iBAAW,YAAY,WAAW;AAChC,mBAAW,QAAQ,SAAS,YAAY;AACtC,cAAI,KAAK,aAAa,KAAK,cAAc;AACvC,iBAAK,eAAe,IAAe;AAAA,UACrC;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,SAAK,SAAS,QAAQ,SAAS,iBAAiB;AAAA,MAC9C,WAAW;AAAA,MACX,SAAS;AAAA,IACX,CAAC;AAED,SAAK,IAAI,2BAA2B;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,UAAiC;AAC9C,QAAI,KAAK,kBAAkB,IAAI,QAAQ,GAAG;AACxC;AAAA,IACF;AAEA,SAAK,kBAAkB,IAAI,QAAQ;AACnC,SAAK,IAAI,qBAAqB,QAAQ;AAGtC,SAAK,iBAAiB,QAAQ;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,UAAiC;AAC/C,QAAI,aAAa,aAAa;AAE5B;AAAA,IACF;AAEA,SAAK,kBAAkB,OAAO,QAAQ;AACtC,SAAK,IAAI,sBAAsB,QAAQ;AAAA,EAIzC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAiB;AACf,SAAK,kBAAkB,MAAM;AAC7B,SAAK,kBAAkB,IAAI,WAAW;AACtC,SAAK,IAAI,wBAAwB;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,UAAoC;AACpD,WAAO,KAAK,kBAAkB,IAAI,QAAQ;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,SAAK,UAAU,WAAW;AAC1B,SAAK,WAAW;AAChB,SAAK,IAAI,yBAAyB;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,0BAAgC;AAEtC,UAAM,UAAU,SAAS;AAAA,MACvB;AAAA,IACF;AACA,YAAQ,QAAQ,CAAC,WAAW,KAAK,cAAc,MAAM,CAAC;AAGtD,UAAM,UAAU,SAAS;AAAA,MACvB;AAAA,IACF;AACA,YAAQ,QAAQ,CAAC,WAAW,KAAK,cAAc,MAAM,CAAC;AAEtD,SAAK,IAAI,aAAa,QAAQ,MAAM,aAAa,QAAQ,MAAM,UAAU;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,SAAwB;AAC7C,QAAI,QAAQ,YAAY,UAAU;AAChC,WAAK,cAAc,OAAwB;AAAA,IAC7C,WAAW,QAAQ,YAAY,UAAU;AACvC,WAAK,cAAc,OAAwB;AAAA,IAC7C;AAGA,YACG,iBAAgC,sBAAsB,EACtD,QAAQ,CAAC,WAAW,KAAK,cAAc,MAAM,CAAC;AACjD,YACG,iBAAgC,sBAAsB,EACtD,QAAQ,CAAC,WAAW,KAAK,cAAc,MAAM,CAAC;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,QAA6B;AACjD,QAAI,KAAK,kBAAkB,IAAI,MAAM,GAAG;AACtC;AAAA,IACF;AAEA,UAAM,WAAW,OAAO,QAAQ;AAChC,QAAI,CAAC,UAAU;AACb;AAAA,IACF;AAEA,SAAK,kBAAkB,IAAI,MAAM;AAEjC,QAAI,KAAK,kBAAkB,IAAI,QAAQ,GAAG;AACxC,WAAK,eAAe,MAAM;AAAA,IAC5B,OAAO;AACL,WAAK,IAAI,mBAAmB,QAAQ,MAAM,OAAO,QAAQ,OAAO,QAAQ;AAAA,IAC1E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,QAA6B;AACjD,QAAI,KAAK,kBAAkB,IAAI,MAAM,GAAG;AACtC;AAAA,IACF;AAEA,UAAM,WAAW,OAAO,QAAQ;AAChC,QAAI,CAAC,UAAU;AACb;AAAA,IACF;AAEA,SAAK,kBAAkB,IAAI,MAAM;AAEjC,QAAI,KAAK,kBAAkB,IAAI,QAAQ,GAAG;AACxC,WAAK,eAAe,MAAM;AAAA,IAC5B,OAAO;AACL,WAAK,IAAI,mBAAmB,QAAQ,MAAM,OAAO,QAAQ,GAAG;AAE5D,WAAK,gBAAgB,QAAQ,QAAQ;AAAA,IACvC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,QAA6B;AAClD,UAAM,MAAM,OAAO,QAAQ;AAE3B,QAAI,KAAK;AAEP,YAAM,YAAY,SAAS,cAAc,QAAQ;AAGjD,iBAAW,QAAQ,OAAO,YAAY;AACpC,YAAI,KAAK,SAAS,UAAU,KAAK,SAAS,YAAY;AACpD,oBAAU,aAAa,KAAK,MAAM,KAAK,KAAK;AAAA,QAC9C;AAAA,MACF;AAEA,gBAAU,MAAM;AAChB,gBAAU,gBAAgB,cAAc;AAGxC,aAAO,YAAY,aAAa,WAAW,MAAM;AAEjD,WAAK,IAAI,8BAA8B,GAAG;AAAA,IAC5C,OAAO;AAEL,YAAM,YAAY,SAAS,cAAc,QAAQ;AAEjD,iBAAW,QAAQ,OAAO,YAAY;AACpC,YAAI,KAAK,SAAS,QAAQ;AACxB,oBAAU,aAAa,KAAK,MAAM,KAAK,KAAK;AAAA,QAC9C;AAAA,MACF;AAEA,gBAAU,cAAc,OAAO;AAC/B,gBAAU,gBAAgB,cAAc;AAExC,aAAO,YAAY,aAAa,WAAW,MAAM;AAEjD,WAAK,IAAI,yBAAyB;AAAA,IACpC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,QAA6B;AAClD,UAAM,MAAM,OAAO,QAAQ;AAC3B,QAAI,CAAC,KAAK;AACR;AAAA,IACF;AAGA,UAAM,cAAc,OAAO,eAAe;AAAA,MACxC;AAAA,IACF;AACA,iBAAa,OAAO;AAGpB,WAAO,MAAM;AACb,WAAO,gBAAgB,UAAU;AACjC,WAAO,gBAAgB,cAAc;AACrC,WAAO,MAAM,UAAU;AAEvB,SAAK,IAAI,qBAAqB,GAAG;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,QAAuB,UAAiC;AAE9E,WAAO,MAAM,UAAU;AAGvB,UAAM,cAAc,SAAS,cAAc,KAAK;AAChD,gBAAY,YAAY;AACxB,gBAAY,aAAa,iBAAiB,QAAQ;AAClD,gBAAY,YAAY;AAAA;AAAA;AAAA;AAAA,YAIhB,KAAK,gBAAgB,QAAQ,CAAC;AAAA;AAAA;AAAA;AAMtC,UAAM,MAAM,YAAY,cAAc,QAAQ;AAC9C,SAAK,iBAAiB,SAAS,MAAM;AAEnC,aAAO;AAAA,QACL,IAAI,YAAY,sBAAsB;AAAA,UACpC,QAAQ,EAAE,SAAS;AAAA,QACrB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAGD,WAAO,YAAY,aAAa,aAAa,OAAO,WAAW;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,UAAiC;AAExD,UAAM,UAAU,SAAS;AAAA,MACvB,wBAAwB,QAAQ;AAAA,IAClC;AACA,YAAQ,QAAQ,CAAC,WAAW,KAAK,eAAe,MAAM,CAAC;AAGvD,UAAM,UAAU,SAAS;AAAA,MACvB,wBAAwB,QAAQ;AAAA,IAClC;AACA,YAAQ,QAAQ,CAAC,WAAW,KAAK,eAAe,MAAM,CAAC;AAEvD,SAAK;AAAA,MACH,aAAa,QAAQ,MAAM,aAAa,QAAQ,MAAM,gBAAgB,QAAQ;AAAA,IAChF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,UAAmC;AACzD,UAAM,QAAyC;AAAA,MAC7C,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,WAAW;AAAA,MACX,QAAQ;AAAA,IACV;AACA,WAAO,MAAM,QAAQ,KAAK;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKQ,OAAO,MAAuB;AACpC,QAAI,KAAK,OAAO,OAAO;AACrB,cAAQ,IAAI,mBAAmB,GAAG,IAAI;AAAA,IACxC;AAAA,EACF;AACF;;;AC1UO,IAAM,aAAN,MAAiB;AAAA,EAItB,YAAY,QAAuB;AACjC,SAAK,SAAS;AACd,SAAK,UAAU,OAAO,YAAY,QAAQ,OAAO,EAAE;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,SAA0D;AAC1E,UAAM,UAAU;AAAA,MACd,GAAG;AAAA,MACH,UAAU;AAAA,QACR,WAAW,OAAO,cAAc,cAAc,UAAU,YAAY;AAAA,QACpE,UAAU,OAAO,cAAc,cAAc,UAAU,WAAW;AAAA,QAClE,kBACE,OAAO,WAAW,cACd,GAAG,OAAO,OAAO,KAAK,IAAI,OAAO,OAAO,MAAM,KAC9C;AAAA,QACN,UAAU;AAAA,QACV,GAAG,QAAQ;AAAA,MACb;AAAA,IACF;AAEA,UAAM,WAAW,MAAM,KAAK,MAAM,YAAY;AAAA,MAC5C,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,OAAO;AAAA,IAC9B,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,2BAA2B,SAAS,MAAM,EAAE;AAAA,IAC9D;AAEA,WAAO,SAAS,KAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WACJ,QACA,mBAC8B;AAC9B,UAAM,SAAS,IAAI,gBAAgB;AAAA,MACjC;AAAA,MACA;AAAA,IACF,CAAC;AAED,UAAM,WAAW,MAAM,KAAK,MAAM,YAAY,MAAM,EAAE;AAEtD,QAAI,SAAS,WAAW,KAAK;AAC3B,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,0BAA0B,SAAS,MAAM,EAAE;AAAA,IAC7D;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,WAAkC;AACpD,UAAM,WAAW,MAAM,KAAK,MAAM,YAAY,SAAS,IAAI;AAAA,MACzD,QAAQ;AAAA,IACV,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,6BAA6B,SAAS,MAAM,EAAE;AAAA,IAChE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,QAA6C;AAC/D,UAAM,WAAW,MAAM,KAAK,MAAM,WAAW,MAAM,EAAE;AAErD,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,8BAA8B,SAAS,MAAM,EAAE;AAAA,IACjE;AAEA,WAAO,SAAS,KAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,QAAkC;AACpD,UAAM,SAAS,IAAI,gBAAgB,EAAE,OAAO,CAAC;AAC7C,UAAM,WAAW,MAAM,KAAK,MAAM,mBAAmB,MAAM,EAAE;AAE7D,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,6BAA6B,SAAS,MAAM,EAAE;AAAA,IAChE;AAEA,WAAO,SAAS,KAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,MACZ,MACA,UAAuB,CAAC,GACL;AACnB,UAAM,MAAM,GAAG,KAAK,OAAO,GAAG,IAAI;AAElC,UAAM,UAAuB;AAAA,MAC3B,gBAAgB;AAAA,MAChB,QAAQ;AAAA,MACR,GAAG,KAAK,oBAAoB;AAAA,MAC5B,GAAI,QAAQ,WAAW,CAAC;AAAA,IAC1B;AAEA,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,KAAK;AAAA,QAChC,GAAG;AAAA,QACH;AAAA,QACA,aAAa;AAAA,MACf,CAAC;AAED,WAAK,IAAI,GAAG,QAAQ,UAAU,KAAK,IAAI,IAAI,KAAK,SAAS,MAAM;AAC/D,aAAO;AAAA,IACT,SAAS,OAAO;AACd,WAAK,IAAI,gBAAgB,KAAK;AAC9B,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAA8C;AACpD,UAAM,YAAY,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,EAAE,SAAS;AAIzD,UAAM,YAAY,KAAK,WAAW,GAAG,KAAK,OAAO,MAAM,IAAI,SAAS,EAAE;AAEtE,WAAO;AAAA,MACL,uBAAuB;AAAA,MACvB,uBAAuB,UAAU,SAAS;AAAA,IAC5C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAW,KAAqB;AACtC,QAAI,OAAO;AACX,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,aAAQ,OAAO,KAAM,IAAI,WAAW,CAAC;AAAA,IACvC;AACA,YAAQ,SAAS,GAAG,SAAS,EAAE;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKQ,OAAO,MAAuB;AACpC,QAAI,KAAK,OAAO,OAAO;AACrB,cAAQ,IAAI,gBAAgB,GAAG,IAAI;AAAA,IACrC;AAAA,EACF;AACF;;;AC1MO,IAAM,eAAN,MAAiF;AAAA,EAAjF;AACL,SAAQ,YAA4D,oBAAI,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM5E,GACE,OACA,UACY;AACZ,QAAI,CAAC,KAAK,UAAU,IAAI,KAAK,GAAG;AAC9B,WAAK,UAAU,IAAI,OAAO,oBAAI,IAAI,CAAC;AAAA,IACrC;AAEA,SAAK,UAAU,IAAI,KAAK,EAAG,IAAI,QAAkC;AAGjE,WAAO,MAAM,KAAK,IAAI,OAAO,QAAQ;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,IACE,OACA,UACM;AACN,SAAK,UAAU,IAAI,KAAK,GAAG,OAAO,QAAkC;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA,EAKA,KAA6B,OAAU,MAAuB;AAC5D,SAAK,UAAU,IAAI,KAAK,GAAG,QAAQ,CAAC,aAAa;AAC/C,UAAI;AACF,iBAAS,IAAI;AAAA,MACf,SAAS,OAAO;AACd,gBAAQ,MAAM,8BAA8B,OAAO,KAAK,CAAC,KAAK,KAAK;AAAA,MACrE;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,KACE,OACA,UACY;AACZ,UAAM,UAAU,CAAC,SAAoB;AACnC,WAAK,IAAI,OAAO,OAAO;AACvB,eAAS,IAAI;AAAA,IACf;AAEA,WAAO,KAAK,GAAG,OAAO,OAAO;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,UAAU,MAAM;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAmC,OAAgB;AACjD,SAAK,UAAU,OAAO,KAAK;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,cAAsC,OAAkB;AACtD,WAAO,KAAK,UAAU,IAAI,KAAK,GAAG,QAAQ;AAAA,EAC5C;AACF;;;AClEA,SAAS,gBAA0B;AACjC,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO,CAAC,QAAQ;AAAA,EAClB;AAEA,QAAM,aAAuB,CAAC;AAG9B,MAAI;AAEF,UAAM,KAAK,UAAU;AACrB,QAAI,GAAG,SAAS,QAAQ,EAAG,YAAW,KAAK,QAAQ;AAAA,aAC1C,GAAG,SAAS,SAAS,EAAG,YAAW,KAAK,SAAS;AAAA,aACjD,GAAG,SAAS,QAAQ,EAAG,YAAW,KAAK,QAAQ;AAAA,aAC/C,GAAG,SAAS,MAAM,EAAG,YAAW,KAAK,MAAM;AAAA,QAC/C,YAAW,KAAK,OAAO;AAAA,EAC9B,QAAQ;AACN,eAAW,KAAK,iBAAiB;AAAA,EACnC;AAGA,MAAI;AACF,eAAW,KAAK,UAAU,YAAY,cAAc;AAAA,EACtD,QAAQ;AACN,eAAW,KAAK,cAAc;AAAA,EAChC;AAGA,MAAI;AACF,UAAM,QAAQ,OAAO,OAAO;AAC5B,QAAI,SAAS,KAAM,YAAW,KAAK,IAAI;AAAA,aAC9B,SAAS,KAAM,YAAW,KAAK,KAAK;AAAA,aACpC,SAAS,KAAM,YAAW,KAAK,IAAI;AAAA,aACnC,SAAS,IAAK,YAAW,KAAK,QAAQ;AAAA,QAC1C,YAAW,KAAK,QAAQ;AAAA,EAC/B,QAAQ;AACN,eAAW,KAAK,gBAAgB;AAAA,EAClC;AAGA,MAAI;AACF,UAAM,QAAQ,OAAO,OAAO;AAC5B,QAAI,SAAS,GAAI,YAAW,KAAK,YAAY;AAAA,QACxC,YAAW,KAAK,gBAAgB;AAAA,EACvC,QAAQ;AACN,eAAW,KAAK,eAAe;AAAA,EACjC;AAGA,MAAI;AACF,UAAM,UAAS,oBAAI,KAAK,GAAE,kBAAkB;AAC5C,UAAM,QAAQ,KAAK,MAAM,KAAK,IAAI,MAAM,IAAI,EAAE;AAC9C,UAAM,OAAO,UAAU,IAAI,MAAM;AACjC,eAAW,KAAK,KAAK,IAAI,GAAG,KAAK,EAAE;AAAA,EACrC,QAAQ;AACN,eAAW,KAAK,YAAY;AAAA,EAC9B;AAGA,MAAI;AACF,UAAM,WAAW,UAAU,UAAU,YAAY,KAAK;AACtD,QAAI,SAAS,SAAS,KAAK,EAAG,YAAW,KAAK,KAAK;AAAA,aAC1C,SAAS,SAAS,KAAK,EAAG,YAAW,KAAK,KAAK;AAAA,aAC/C,SAAS,SAAS,OAAO,EAAG,YAAW,KAAK,OAAO;AAAA,aACnD,SAAS,SAAS,QAAQ,KAAK,SAAS,SAAS,MAAM;AAC9D,iBAAW,KAAK,KAAK;AAAA,aACd,SAAS,SAAS,SAAS,EAAG,YAAW,KAAK,SAAS;AAAA,QAC3D,YAAW,KAAK,gBAAgB;AAAA,EACvC,QAAQ;AACN,eAAW,KAAK,kBAAkB;AAAA,EACpC;AAGA,MAAI;AACF,QAAI,kBAAkB,UAAU,UAAU,iBAAiB,GAAG;AAC5D,iBAAW,KAAK,OAAO;AAAA,IACzB,OAAO;AACL,iBAAW,KAAK,UAAU;AAAA,IAC5B;AAAA,EACF,QAAQ;AACN,eAAW,KAAK,eAAe;AAAA,EACjC;AAGA,MAAI;AACF,QAAI,UAAU,eAAe,KAAK;AAChC,iBAAW,KAAK,KAAK;AAAA,IACvB;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO;AACT;AAKA,eAAe,OAAO,SAAkC;AACtD,MAAI,OAAO,WAAW,eAAe,CAAC,OAAO,QAAQ,QAAQ;AAE3D,WAAO,WAAW,OAAO;AAAA,EAC3B;AAEA,MAAI;AACF,UAAM,UAAU,IAAI,YAAY;AAChC,UAAM,OAAO,QAAQ,OAAO,OAAO;AACnC,UAAM,aAAa,MAAM,OAAO,OAAO,OAAO,WAAW,IAAI;AAC7D,UAAM,YAAY,MAAM,KAAK,IAAI,WAAW,UAAU,CAAC;AACvD,WAAO,UAAU,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AAAA,EACtE,QAAQ;AACN,WAAO,WAAW,OAAO;AAAA,EAC3B;AACF;AAKA,SAAS,WAAW,KAAqB;AACvC,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,WAAQ,OAAO,KAAM,IAAI,WAAW,CAAC;AAAA,EACvC;AACA,UAAQ,SAAS,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAClD;AAWA,eAAsB,sBAAuC;AAC3D,QAAM,aAAa,cAAc;AACjC,QAAM,WAAW,WAAW,KAAK,GAAG;AACpC,QAAM,OAAO,MAAM,OAAO,QAAQ;AAGlC,SAAO,MAAM,KAAK,UAAU,GAAG,EAAE,CAAC;AACpC;;;AC/JO,IAAM,cAAc;;;ACuB3B,IAAM,iBAAyC;AAAA,EAC7C,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,IAAI;AAAA,IACF,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,oBAAoB;AAAA,EACtB;AAAA,EACA,SAAS;AAAA,IACP,UAAU;AAAA,IACV,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,cAAc;AAAA,IACd,cAAc;AAAA,IACd,kBAAkB;AAAA,EACpB;AAAA,EACA,YAAY,CAAC,aAAa,cAAc,aAAa,aAAa,QAAQ;AAAA,EAC1E,OAAO;AACT;AAKA,IAAM,kBAAqC;AAAA,EACzC,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,QAAQ;AACV;AAKO,IAAM,iBAAN,MAAqB;AAAA,EAW1B,YAAY,QAAuB;AALnC,SAAQ,iBAAsC;AAC9C,SAAQ,cAAc;AACtB,SAAQ,gBAAgB;AACxB,SAAQ,oBAA4B;AAGlC,SAAK,SAAS,KAAK,YAAY,MAAM;AACrC,SAAK,UAAU,IAAI,eAAe,KAAK,MAAM;AAC7C,SAAK,gBAAgB,IAAI,cAAc,KAAK,MAAM;AAClD,SAAK,MAAM,IAAI,WAAW,KAAK,MAAM;AACrC,SAAK,SAAS,IAAI,aAAa;AAE/B,SAAK,IAAI,uCAAuC,KAAK,MAAM;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAsB;AAC1B,QAAI,KAAK,aAAa;AACpB,WAAK,IAAI,+BAA+B;AACxC;AAAA,IACF;AAEA,QAAI;AACF,WAAK,IAAI,gCAAgC;AAGzC,WAAK,oBAAoB,MAAM,oBAAoB;AAGnD,WAAK,iBAAiB,KAAK,QAAQ,IAAI;AAEvC,UAAI,KAAK,gBAAgB;AACvB,aAAK,IAAI,gCAAgC,KAAK,cAAc;AAG5D,YAAI,KAAK,iBAAiB,GAAG;AAC3B,eAAK,IAAI,2BAA2B;AACpC,eAAK,QAAQ,MAAM;AACnB,eAAK,iBAAiB;AAAA,QACxB,OAAO;AAEL,eAAK,aAAa;AAAA,QACpB;AAAA,MACF;AAGA,WAAK,cAAc,KAAK;AAExB,WAAK,cAAc;AACnB,WAAK,KAAK,QAAQ,KAAK,cAAc;AAGrC,UAAI,KAAK,aAAa,GAAG;AACvB,aAAK,WAAW;AAAA,MAClB;AAEA,WAAK,IAAI,yCAAyC;AAAA,IACpD,SAAS,OAAO;AACd,WAAK,YAAY,KAAc;AAC/B,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,WAAW,UAAoC;AAC7C,QAAI,CAAC,KAAK,gBAAgB;AACxB,aAAO,aAAa;AAAA,IACtB;AACA,WAAO,KAAK,eAAe,WAAW,QAAQ,KAAK;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,UAA2B;AAC1C,QAAI,CAAC,KAAK,gBAAgB;AACxB,aAAO;AAAA,IACT;AACA,WAAO,KAAK,eAAe,QAAQ,QAAQ,KAAK;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,aAAkC;AAChC,WAAO,KAAK,iBAAiB,EAAE,GAAG,KAAK,eAAe,IAAI;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,OAAoC;AACnD,UAAM,aAAa,KAAK,sBAAsB,KAAK;AAGnD,eAAW,YAAY;AAEvB,UAAM,aAA2B;AAAA,MAC/B;AAAA,MACA,SAAS,aAAa,SAAS,MAAM,UAAU,MAAM,UAAU,CAAC;AAAA,MAChE,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,SAAS;AAAA,IACX;AAEA,QAAI;AAEF,YAAM,WAAW,MAAM,KAAK,IAAI,YAAY;AAAA,QAC1C,QAAQ,KAAK,OAAO;AAAA,QACpB,mBAAmB,KAAK;AAAA,QACxB,SAAS;AAAA,MACX,CAAC;AAED,iBAAW,YAAY,SAAS;AAChC,iBAAW,YAAY,SAAS;AAGhC,WAAK,QAAQ,IAAI,UAAU;AAC3B,WAAK,iBAAiB;AAGtB,WAAK,aAAa;AAGlB,WAAK,KAAK,UAAU,UAAU;AAC9B,WAAK,OAAO,kBAAkB,UAAU;AAExC,WAAK,IAAI,kBAAkB,UAAU;AAAA,IACvC,SAAS,OAAO;AAEd,WAAK,IAAI,8BAA8B,KAAK;AAC5C,WAAK,QAAQ,IAAI,UAAU;AAC3B,WAAK,iBAAiB;AACtB,WAAK,aAAa;AAClB,WAAK,KAAK,UAAU,UAAU;AAAA,IAChC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAA2B;AAC/B,UAAM,gBAAmC;AAAA,MACvC,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,WAAW;AAAA,MACX,QAAQ;AAAA,IACV;AAEA,UAAM,KAAK,WAAW,aAAa;AACnC,SAAK,KAAK,cAAc,KAAK,cAAe;AAC5C,SAAK,WAAW;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAA2B;AAC/B,UAAM,oBAAuC;AAAA,MAC3C,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,WAAW;AAAA,MACX,QAAQ;AAAA,IACV;AAEA,UAAM,KAAK,WAAW,iBAAiB;AACvC,SAAK,KAAK,cAAc,KAAK,cAAe;AAC5C,SAAK,WAAW;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAA2B;AAC/B,QAAI,KAAK,gBAAgB,WAAW;AAClC,UAAI;AACF,cAAM,KAAK,IAAI,cAAc,KAAK,eAAe,SAAS;AAAA,MAC5D,SAAS,OAAO;AACd,aAAK,IAAI,+BAA+B,KAAK;AAAA,MAC/C;AAAA,IACF;AAEA,SAAK,QAAQ,MAAM;AACnB,SAAK,iBAAiB;AACtB,SAAK,cAAc,SAAS;AAE5B,SAAK,IAAI,sBAAsB;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAiC;AACrC,UAAM,aAAa;AAAA,MACjB,gBAAgB,KAAK;AAAA,MACrB,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,MACnC,QAAQ,KAAK,OAAO;AAAA,MACpB,mBAAmB,KAAK;AAAA,IAC1B;AAEA,WAAO,KAAK,UAAU,YAAY,MAAM,CAAC;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,eAAwB;AACtB,QAAI,CAAC,KAAK,gBAAgB;AACxB,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,iBAAiB,GAAG;AAC3B,aAAO;AAAA,IACT;AAGA,QAAI,KAAK,OAAO,SAAS,kBAAkB;AACzC,YAAM,cAAc,IAAI,KAAK,KAAK,eAAe,SAAS;AAC1D,YAAM,cAAc,IAAI,KAAK,WAAW;AACxC,kBAAY;AAAA,QACV,YAAY,QAAQ,IAAI,KAAK,OAAO,QAAQ;AAAA,MAC9C;AAEA,UAAI,oBAAI,KAAK,IAAI,aAAa;AAC5B,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAmB;AACjB,QAAI,KAAK,eAAe;AACtB;AAAA,IACF;AAEA,SAAK,gBAAgB;AACrB,SAAK,KAAK,eAAe,MAAS;AAClC,SAAK,OAAO,eAAe;AAI3B,SAAK,IAAI,cAAc;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAmB;AACjB,QAAI,CAAC,KAAK,eAAe;AACvB;AAAA,IACF;AAEA,SAAK,gBAAgB;AACrB,SAAK,KAAK,eAAe,MAAS;AAClC,SAAK,OAAO,eAAe;AAE3B,SAAK,IAAI,eAAe;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,eAAqB;AACnB,SAAK,KAAK,iBAAiB,MAAS;AACpC,SAAK,IAAI,iBAAiB;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,kBAA2B;AACzB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,GACE,OACA,UACY;AACZ,WAAO,KAAK,OAAO,GAAG,OAAO,QAAQ;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,IACE,OACA,UACM;AACN,SAAK,OAAO,IAAI,OAAO,QAAQ;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,YAAY,QAAsC;AACxD,WAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH,IAAI,EAAE,GAAG,eAAe,IAAI,GAAG,OAAO,GAAG;AAAA,MACzC,SAAS,EAAE,GAAG,eAAe,SAAS,GAAG,OAAO,QAAQ;AAAA,IAC1D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,OAAwC;AACpE,QAAI,gBAAgB,SAAS,MAAM,YAAY;AAC7C,aAAO,EAAE,GAAG,iBAAiB,GAAG,MAAM,WAAW;AAAA,IACnD;AAEA,WAAO,EAAE,GAAG,iBAAiB,GAAI,MAAqC;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAqB;AAC3B,QAAI,CAAC,KAAK,gBAAgB;AACxB;AAAA,IACF;AAEA,eAAW,CAAC,UAAU,OAAO,KAAK,OAAO;AAAA,MACvC,KAAK,eAAe;AAAA,IACtB,GAAG;AACD,UAAI,SAAS;AACX,aAAK,cAAc,eAAe,QAA2B;AAAA,MAC/D,OAAO;AACL,aAAK,cAAc,gBAAgB,QAA2B;AAAA,MAChE;AAAA,IACF;AAGA,SAAK,wBAAwB;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKQ,0BAAgC;AACtC,QAAI,OAAO,WAAW,eAAe,CAAC,KAAK,gBAAgB;AACzD;AAAA,IACF;AAEA,UAAM,OAAQ,OAA8D;AAC5E,QAAI,OAAO,SAAS,YAAY;AAC9B;AAAA,IACF;AAEA,UAAM,EAAE,WAAW,IAAI,KAAK;AAE5B,SAAK,WAAW,UAAU;AAAA,MACxB,YAAY,WAAW,YAAY,YAAY;AAAA,MAC/C,cAAc,WAAW,YAAY,YAAY;AAAA,MACjD,oBAAoB,WAAW,YAAY,YAAY;AAAA,MACvD,mBAAmB,WAAW,YAAY,YAAY;AAAA,MACtD,uBAAuB,WAAW,aAAa,YAAY;AAAA,MAC3D,yBAAyB,WAAW,aAAa,YAAY;AAAA,MAC7D,kBAAkB;AAAA,IACpB,CAAC;AAED,SAAK,IAAI,6BAA6B;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAA4B;AAClC,QAAI,CAAC,KAAK,gBAAgB,WAAW;AAEnC,UAAI,KAAK,gBAAgB,aAAa,KAAK,OAAO,SAAS,cAAc;AACvE,cAAM,cAAc,IAAI,KAAK,KAAK,eAAe,SAAS;AAC1D,cAAM,aAAa,IAAI,KAAK,WAAW;AACvC,mBAAW;AAAA,UACT,WAAW,QAAQ,IAAI,KAAK,OAAO,QAAQ;AAAA,QAC7C;AACA,eAAO,oBAAI,KAAK,IAAI;AAAA,MACtB;AACA,aAAO;AAAA,IACT;AAEA,WAAO,oBAAI,KAAK,IAAI,IAAI,KAAK,KAAK,eAAe,SAAS;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKQ,KACN,OACA,MACM;AACN,SAAK,OAAO,KAAK,OAAO,IAAI;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,OAAoB;AACtC,SAAK,IAAI,UAAU,KAAK;AACxB,SAAK,KAAK,SAAS,KAAK;AACxB,SAAK,OAAO,UAAU,KAAK;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKQ,OAAO,MAAuB;AACpC,QAAI,KAAK,OAAO,OAAO;AACrB,cAAQ,IAAI,gBAAgB,GAAG,IAAI;AAAA,IACrC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,aAAqB;AAC1B,WAAO;AAAA,EACT;AACF;;;AC7YO,IAAM,qBAAN,MAAoD;AAAA,EAYzD,YAAY,QAAuB;AAVnC,SAAQ,WAAgC;AACxC,SAAQ,iBAAiB;AACzB,SAAQ,aAAa;AACrB,SAAQ,mBAAmB;AAG3B;AAAA,SAAQ,kBAA0D,CAAC;AACnE,SAAQ,sBAAyC,CAAC;AAClD,SAAQ,sBAAyC,CAAC;AAGhD,SAAK,UAAU,IAAI,eAAe,MAAM;AACxC,SAAK,oBAAoB;AACzB,SAAK,WAAW;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,gBAAyB;AAC3B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,YAAqB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,kBAA2B;AAC7B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,UAA+B;AACjC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,eAAwB;AAC1B,WAAO,KAAK,QAAQ,aAAa;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,UAAoC;AAC7C,WAAO,KAAK,QAAQ,WAAW,QAAQ;AAAA,EACzC;AAAA,EAEA,MAAM,YAA2B;AAC/B,UAAM,KAAK,QAAQ,UAAU;AAAA,EAC/B;AAAA,EAEA,MAAM,YAA2B;AAC/B,UAAM,KAAK,QAAQ,UAAU;AAAA,EAC/B;AAAA,EAEA,MAAM,cAAc,YAAuD;AACzE,UAAM,KAAK,QAAQ,WAAW,UAAU;AACxC,SAAK,QAAQ,WAAW;AAAA,EAC1B;AAAA,EAEA,aAAmB;AACjB,SAAK,QAAQ,WAAW;AAAA,EAC1B;AAAA,EAEA,aAAmB;AACjB,SAAK,QAAQ,WAAW;AAAA,EAC1B;AAAA,EAEA,eAAqB;AACnB,SAAK,QAAQ,aAAa;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,gBAAgB,UAAuD;AACrE,SAAK,gBAAgB,KAAK,QAAQ;AAClC,WAAO,MAAM;AACX,YAAM,QAAQ,KAAK,gBAAgB,QAAQ,QAAQ;AACnD,UAAI,QAAQ,IAAI;AACd,aAAK,gBAAgB,OAAO,OAAO,CAAC;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,UAAkC;AAC7C,SAAK,oBAAoB,KAAK,QAAQ;AACtC,WAAO,MAAM;AACX,YAAM,QAAQ,KAAK,oBAAoB,QAAQ,QAAQ;AACvD,UAAI,QAAQ,IAAI;AACd,aAAK,oBAAoB,OAAO,OAAO,CAAC;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,UAAkC;AAC7C,SAAK,oBAAoB,KAAK,QAAQ;AACtC,WAAO,MAAM;AACX,YAAM,QAAQ,KAAK,oBAAoB,QAAQ,QAAQ;AACvD,UAAI,QAAQ,IAAI;AACd,aAAK,oBAAoB,OAAO,OAAO,CAAC;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMQ,sBAA4B;AAClC,SAAK,QAAQ,GAAG,UAAU,CAAC,YAAY;AACrC,WAAK,WAAW;AAChB,WAAK,gBAAgB,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;AAAA,IAClD,CAAC;AAED,SAAK,QAAQ,GAAG,eAAe,MAAM;AACnC,WAAK,mBAAmB;AACxB,WAAK,oBAAoB,QAAQ,CAAC,OAAO,GAAG,CAAC;AAAA,IAC/C,CAAC;AAED,SAAK,QAAQ,GAAG,eAAe,MAAM;AACnC,WAAK,mBAAmB;AACxB,WAAK,oBAAoB,QAAQ,CAAC,OAAO,GAAG,CAAC;AAAA,IAC/C,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,aAA4B;AACxC,QAAI;AACF,YAAM,KAAK,QAAQ,KAAK;AACxB,WAAK,WAAW,KAAK,QAAQ,WAAW;AACxC,WAAK,iBAAiB;AACtB,WAAK,mBAAmB,KAAK,QAAQ,gBAAgB;AAAA,IACvD,SAAS,OAAO;AACd,cAAQ,MAAM,wCAAwC,KAAK;AAAA,IAC7D,UAAE;AACA,WAAK,aAAa;AAAA,IACpB;AAAA,EACF;AACF;AAoBO,IAAM,iBAAiB;AACvB,IAAM,kBAAkB;AAkBxB,SAAS,sBAAsB,QAA2C;AAC/E,SAAO,IAAI,mBAAmB,MAAM;AACtC;AAgCO,IAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA,EAIrC,SAAS,CAAC,YAAiC;AAAA,IACzC,SAAS;AAAA,IACT,UAAU;AAAA,EACZ;AACF;AAuBO,IAAM,0BAA0B;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;AA+EhC,IAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;","names":[]}
Dieser Inhalt erfordert Ihre Zustimmung.
\n Wir nutzen Cookies und ähnliche Technologien, um Ihnen ein optimales\n Nutzererlebnis zu bieten.\n
Bitte akzeptieren Sie Marketing-Cookies.