@rsltda/components 1.0.15 → 1.0.17

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 +1 @@
1
- {"version":3,"file":"rs-components.es.js","sources":["../src/utils/define.ts","../src/components/rs-map.ts","../src/index.ts"],"sourcesContent":["// Registro seguro para evitar DOMException por doble definición\r\nexport function safeDefine(tag: string, Ctor: CustomElementConstructor) {\r\n if (!customElements.get(tag)) customElements.define(tag, Ctor);\r\n}\r\n","type ZoneKey = 'norte' | 'rm' | 'centro' | 'sur';\ntype ZoneFilter = ZoneKey | 'all';\n\nconst LOCAL_POINTS_LOADERS = import.meta.glob('../json/PuntosMapas_*.json', {\n import: 'default'\n}) as Record<string, () => Promise<unknown>>;\n\ninterface MapPointPhone {\n id: number;\n dist: number;\n telefono: string;\n nombre: string;\n whatsapp: number;\n orden: number;\n}\n\ninterface MapPointApi {\n id: number;\n titulo: string;\n rut: string;\n direccion: string;\n comuna: number;\n tipo: number;\n lat: string;\n lng: string;\n url: string;\n email: string;\n adicional: string;\n portada: string;\n googlelink: string;\n activo: number;\n marca: number;\n comuna_name: string;\n provincia_name: string;\n region_name: string;\n telefonos: MapPointPhone[];\n}\n\ninterface MapPoint extends MapPointApi {\n zone: ZoneKey;\n}\n\ninterface PointsCacheEntry {\n timestamp: number;\n data: MapPointApi[];\n}\n\ninterface PointsCacheRecord extends PointsCacheEntry {\n key: string;\n}\n\nconst DEFAULT_BRAND_COLOR = '#1e88e5';\nconst FONT_AWESOME_LOCAL_PATH = '/assets/fontawesome/css/all.min.css';\nconst DEFAULT_MARKER_ICON_BASE_URL = 'https://cdn.rsltda.cl/logos/marker/';\nconst DEFAULT_POINTS_API_URL = 'https://ap2.rs-shop.cl/web/PuntosMapas';\nconst BRAND_COLORS: Record<string, string> = {\n ktm: '#ff6600'\n};\nconst TYPE_CODES: Record<string, number> = {\n sucursal: 0,\n distribuidor: 1\n};\nconst ZONE_ORDER: ZoneKey[] = ['norte', 'rm', 'centro', 'sur'];\nconst ZONE_LABELS: Record<ZoneKey, string> = {\n norte: 'Zona Norte',\n rm: 'RM',\n centro: 'Zona Centro',\n sur: 'Zona Sur'\n};\nconst TYPE_LABELS: Record<number, string> = {\n 0: 'Sucursales',\n 1: 'Distribuidores'\n};\nconst DEFAULT_POINTS_CACHE_TTL_MS = 30 * 24 * 60 * 60 * 1000;\nconst POINTS_CACHE_DB_NAME = 'rs-map-cache';\nconst POINTS_CACHE_STORE_NAME = 'points';\nconst REGION_ZONE_MAP: Record<string, ZoneKey> = {\n 'region de arica y parinacota': 'norte',\n 'arica y parinacota': 'norte',\n 'region de tarapaca': 'norte',\n tarapaca: 'norte',\n 'region de antofagasta': 'norte',\n antofagasta: 'norte',\n 'region de atacama': 'norte',\n atacama: 'norte',\n 'region de coquimbo': 'norte',\n coquimbo: 'norte',\n 'region de valparaiso': 'centro',\n valparaiso: 'centro',\n 'region del libertador general bernardo o higgins': 'centro',\n \"region del libertador general bernardo o'higgins\": 'centro',\n \"libertador bernardo o'higgins\": 'centro',\n ohiggins: 'centro',\n 'region del maule': 'centro',\n maule: 'centro',\n 'region de nuble': 'centro',\n nuble: 'centro',\n 'region del biobio': 'centro',\n biobio: 'centro',\n 'region metropolitana de santiago': 'rm',\n 'region metropolitana': 'rm',\n 'rm': 'rm',\n santiago: 'rm',\n 'region de la araucania': 'sur',\n araucania: 'sur',\n 'region de los rios': 'sur',\n 'los rios': 'sur',\n 'region de los lagos': 'sur',\n 'los lagos': 'sur',\n 'region de aysen del general carlos ibanez del campo': 'sur',\n 'region de aysen': 'sur',\n aysen: 'sur',\n 'region de magallanes y la antartica chilena': 'sur',\n magallanes: 'sur'\n};\n\nexport class RsMap extends HTMLElement {\n static tag = 'rs-map';\n private static googleMapsLoaderPromise: Promise<void> | null = null;\n private static pointsCacheDbPromise: Promise<IDBDatabase | null> | null = null;\n private root: ShadowRoot;\n private mapEl!: HTMLDivElement;\n private map: any;\n private markers: any[] = [];\n private marca = '';\n private marcaKey = 'default';\n private tipo = '';\n private tipoCode: number | null = null;\n private pointsController?: AbortController;\n private points: MapPoint[] = [];\n private pointsByZone: Record<ZoneKey, MapPoint[]> = {\n norte: [],\n rm: [],\n centro: [],\n sur: []\n };\n private initialViewApplied = false;\n private zonesContainer!: HTMLElement;\n private componentMessageEl!: HTMLElement;\n private mapLayoutEl!: HTMLElement;\n private zoneButtons: HTMLButtonElement[] = [];\n private nearestButton!: HTMLButtonElement;\n private panelTitleEl!: HTMLElement;\n private activeZone: ZoneFilter = 'all';\n private mapHeight = '';\n private googleMapsApiKey = '';\n private pointsApiUrl = DEFAULT_POINTS_API_URL;\n private markerIconBaseUrl = DEFAULT_MARKER_ICON_BASE_URL;\n private defaultMarkerIconUrl = '';\n private pointsCacheTtlMs = DEFAULT_POINTS_CACHE_TTL_MS;\n private static fontAwesomeAttached = false;\n private panAnimationFrame: number | null = null;\n private highlightTimeout: number | null = null;\n private isSyncingInitialAttributes = false;\n private refreshQueued = false;\n private localPointsRequests = new Map<string, Promise<MapPointApi[] | null>>();\n\n static get observedAttributes() {\n return [\n 'marca',\n 'tipo',\n 'height',\n 'google-maps-key',\n 'points-api-url',\n 'cache-days',\n 'marker-icon-base',\n 'marker-icon-default'\n ];\n }\n\n constructor() {\n super();\n RsMap.ensureFontAwesome();\n this.root = this.attachShadow({ mode: 'open' });\n this.root.innerHTML = `\n <link rel=\"stylesheet\" href=\"${FONT_AWESOME_LOCAL_PATH}\" />\n <style>\n :host {\n display: block;\n width: 100%;\n height: var(--map-height, 520px);\n --rs-map-accent: ${DEFAULT_BRAND_COLOR};\n }\n .map-layout {\n display: grid;\n grid-template-columns: minmax(0, 2.5fr) minmax(220px, 1fr);\n gap: 16px;\n width: 100%;\n height: 100%;\n }\n .map-panel,\n #map {\n width: 100%;\n height: 100%;\n animation: mapSlide 90s infinite;\n animation-timing-function: ease-in-out; \n }\n .map-panel {\n border-radius: 8px;\n overflow: hidden;\n border: 2px solid var(--rs-map-accent);\n }\n #map {\n background: #f5f5f5;\n }\n .component-shell {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n .component-message {\n margin: 0;\n font-size: 1rem;\n color: #555;\n text-align: center;\n padding: 24px 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 1;\n }\n .component-message[hidden] {\n display: none;\n }\n .map-layout[hidden] {\n display: none;\n }\n .points-panel {\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n border-top: 4px solid var(--rs-map-accent);\n padding: 16px;\n font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n background: #fff;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n .panel-message {\n margin: 0;\n font-size: 0.95rem;\n color: #555;\n text-align: center;\n padding: 32px 12px;\n }\n .panel-content[hidden] {\n display: none;\n }\n .points-panel h2 {\n margin: 0 0 8px;\n font-size: 1rem;\n color: var(--rs-map-accent);\n }\n .zone-filters {\n display: flex;\n gap: 8px;\n margin-bottom: 12px;\n overflow-x: auto;\n padding-bottom: 8px;\n flex-wrap: nowrap;\n }\n .zone-button {\n border: 1px solid var(--rs-map-accent);\n border-radius: 999px;\n padding: 6px 12px;\n font-size: 0.85rem;\n background: transparent;\n color: var(--rs-map-accent);\n cursor: pointer;\n transition: background 0.2s ease, color 0.2s ease;\n text-align: center;\n white-space: nowrap;\n }\n .zone-button:hover,\n .zone-button:focus-visible {\n background: var(--rs-map-accent);\n color: #fff;\n }\n .zone-button.is-active {\n background: var(--rs-map-accent);\n color: #fff;\n }\n .zone-button--secondary {\n flex-shrink: 0;\n border-color: #444;\n color: #444;\n }\n .zone-button--secondary i {\n margin-right: 6px;\n }\n .panel-header {\n margin-bottom: 12px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n }\n .panel-header h2[data-panel-title] {\n margin: 0;\n font-size: 1.25rem;\n }\n .zones-container {\n display: flex;\n flex-direction: column;\n gap: 16px;\n flex: 1;\n overflow-y: auto;\n }\n .zone-section {\n border-top: 2px solid #eee;\n padding-top: 12px;\n }\n .zone-section[hidden] {\n display: none;\n }\n .zone-section__header {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n margin: 0 0 8px;\n font-weight: 600;\n color: #333;\n }\n .zone-section__empty {\n margin: 0;\n font-size: 0.85rem;\n color: #777;\n }\n .zone-section__list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n .point-card {\n border: 1px solid #e6e6e6;\n border-radius: 8px;\n padding: 10px;\n background: #fff;\n display: flex;\n flex-direction: column;\n gap: 6px;\n overflow: hidden;\n transition: border 0.2s ease, box-shadow 0.2s ease;\n }\n .point-card--highlight {\n border: 2px solid var(--rs-map-accent);\n box-shadow: 0 0 0 2px rgba(30, 136, 229, 0.2);\n animation: highlightFade 3s forwards;\n }\n @keyframes highlightFade {\n 0% {\n border-color: var(--rs-map-accent);\n box-shadow: 0 0 0 2px rgba(30, 136, 229, 0.2);\n }\n 80% {\n border-color: #111;\n box-shadow: 0 0 0 2px rgba(17, 17, 17, 0.2);\n }\n 100% {\n border-color: #e6e6e6;\n box-shadow: none;\n }\n }\n .point-card__title {\n margin: -10px -10px 8px;\n padding: 10px;\n font-size: 0.95rem;\n font-weight: 600;\n text-align: center;\n color: #fff;\n background: var(--rs-map-accent);\n }\n .point-card__focus {\n border: 1px solid var(--rs-map-accent);\n border-radius: 999px;\n padding: 4px 12px;\n font-size: 0.8rem;\n background: transparent;\n color: var(--rs-map-accent);\n cursor: pointer;\n align-self: flex-start;\n margin-top: 8px;\n }\n .point-card__focus:hover,\n .point-card__focus:focus-visible {\n background: var(--rs-map-accent);\n color: #fff;\n }\n @media (max-width: 768px) {\n .map-layout {\n grid-template-columns: 1fr;\n }\n .map-panel {\n display: none;\n }\n .panel-header {\n flex-direction: column;\n align-items: stretch;\n }\n .zone-filters {\n flex-wrap: wrap;\n }\n .point-card__focus {\n display: none;\n }\n }\n .point-card__address,\n .point-card__meta,\n .point-card__contact {\n margin: 0;\n font-size: 0.85rem;\n color: #555;\n }\n .point-card__contact {\n margin: 0 0 6px;\n font-size: 0.85rem;\n color: #555;\n }\n .point-card__contact-title {\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: 600;\n color: #333;\n margin-bottom: 4px;\n }\n .point-card__phone-list {\n list-style: none;\n padding: 0;\n margin: 0;\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n .point-card__phone-item {\n display: flex;\n gap: 8px;\n align-items: flex-start;\n }\n .point-card__phone-icon {\n width: 16px;\n display: inline-flex;\n justify-content: center;\n color: var(--rs-map-accent);\n font-size: 0.85rem;\n }\n .point-card__phone-content {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n .point-card__phone-name {\n font-weight: 600;\n color: #333;\n }\n .point-card__phone-number {\n font-family: 'Segoe UI', system-ui, sans-serif;\n font-size: 0.85rem;\n }\n .point-card__phone-number--link {\n color: var(--rs-map-accent);\n text-decoration: none;\n }\n .point-card__phone-number--link:hover,\n .point-card__phone-number--link:focus-visible {\n text-decoration: underline;\n }\n .point-card__address-block {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n .point-card__details {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin-top: 6px;\n }\n .point-card__details[hidden] {\n display: none;\n }\n .point-card__toggle {\n border: 1px solid var(--rs-map-accent);\n border-radius: 16px;\n padding: 4px 10px;\n background: transparent;\n color: var(--rs-map-accent);\n font-size: 0.8rem;\n cursor: pointer;\n align-self: flex-start;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n }\n .point-card__toggle:hover,\n .point-card__toggle:focus-visible {\n background: var(--rs-map-accent);\n color: #fff;\n }\n .point-card__actions {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 6px;\n margin-top: 8px;\n }\n .point-card__action {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 0.8rem;\n }\n .point-card__actions a.point-card__action {\n color: var(--rs-map-accent);\n text-decoration: none;\n border-bottom: 1px solid transparent;\n }\n .point-card__actions a.point-card__action:hover,\n .point-card__actions a.point-card__action:focus-visible {\n border-color: currentColor;\n }\n .point-card__actions .point-card__action i {\n font-size: 0.85rem;\n }\n .point-card__actions .point-card__action--text {\n color: #444;\n }\n .point-card__extra {\n margin: 0;\n font-size: 0.8rem;\n color: #444;\n }\n .point-card__extra a {\n color: var(--rs-map-accent);\n text-decoration: none;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n }\n .point-card__extra a:hover,\n .point-card__extra a:focus-visible {\n color: #444;\n text-decoration: underline;\n }\n .point-card__extra-icon {\n font-size: 0.75rem;\n }\n .empty-state {\n margin: 0;\n font-size: 0.9rem;\n color: #777;\n text-align: center;\n }\n .points-panel p {\n margin: 0;\n color: #666;\n font-size: 0.9rem;\n }\n </style>\n <div class=\"component-shell\">\n <p class=\"component-message\" data-component-message>Cargando puntos...</p>\n <div class=\"map-layout\" data-map-layout hidden>\n <div class=\"map-panel\">\n <div id=\"map\"></div>\n </div>\n <aside class=\"points-panel\" aria-live=\"polite\">\n <div class=\"zone-filters\" role=\"group\" aria-label=\"Filtrar por zona\">\n <button class=\"zone-button\" type=\"button\" data-zone=\"norte\" data-label=\"Zona Norte\" aria-pressed=\"false\">Zona Norte</button>\n <button class=\"zone-button\" type=\"button\" data-zone=\"rm\" data-label=\"RM\" aria-pressed=\"false\">RM</button>\n <button class=\"zone-button\" type=\"button\" data-zone=\"centro\" data-label=\"Zona Centro\" aria-pressed=\"false\">Zona Centro</button>\n <button class=\"zone-button\" type=\"button\" data-zone=\"sur\" data-label=\"Zona Sur\" aria-pressed=\"false\">Zona Sur</button>\n </div>\n <div class=\"panel-header\">\n <h2 data-panel-title>Puntos del mapa</h2>\n <button class=\"zone-button zone-button--secondary\" type=\"button\" data-action=\"nearest\">\n <i class=\"fa-solid fa-location-dot\" aria-hidden=\"true\"></i>\n Buscar tienda cercana\n </button>\n </div>\n <div class=\"zones-container\" data-zone-container></div>\n </aside>\n </div>\n </div>\n `;\n }\n\n connectedCallback() {\n this.mapEl = this.root.querySelector<HTMLDivElement>('#map')!;\n this.panelTitleEl = this.root.querySelector<HTMLElement>('[data-panel-title]')!;\n this.zonesContainer = this.root.querySelector<HTMLElement>('[data-zone-container]')!;\n this.componentMessageEl = this.root.querySelector<HTMLElement>('[data-component-message]')!;\n this.mapLayoutEl = this.root.querySelector<HTMLElement>('[data-map-layout]')!;\n this.zoneButtons = Array.from(this.root.querySelectorAll<HTMLButtonElement>('[data-zone]'));\n this.nearestButton = this.root.querySelector<HTMLButtonElement>('[data-action=\"nearest\"]')!;\n this.zoneButtons.forEach((btn) => btn.addEventListener('click', this.handleZoneButtonClick));\n if (this.nearestButton) {\n this.nearestButton.addEventListener('click', this.handleNearestClick);\n }\n this.updateZoneButtons();\n this.setMapHeight(this.getAttribute('height'));\n this.setComponentState('loading');\n this.syncAttributesToState();\n }\n\n disconnectedCallback() {\n this.pointsController?.abort();\n this.zoneButtons.forEach((btn) => btn.removeEventListener('click', this.handleZoneButtonClick));\n if (this.nearestButton) {\n this.nearestButton.removeEventListener('click', this.handleNearestClick);\n }\n }\n\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null) {\n if (name === 'marca') {\n this.setMarca(newValue ?? '');\n } else if (name === 'tipo') {\n this.setTipo(newValue ?? '');\n } else if (name === 'height') {\n this.setMapHeight(newValue);\n } else if (name === 'google-maps-key') {\n this.setGoogleMapsKey(newValue);\n } else if (name === 'points-api-url') {\n this.setPointsApiUrl(newValue);\n } else if (name === 'cache-days') {\n this.setCacheDays(newValue);\n } else if (name === 'marker-icon-base') {\n this.setMarkerIconBase(newValue);\n } else if (name === 'marker-icon-default') {\n this.setDefaultMarkerIcon(newValue);\n }\n }\n\n private loadGoogleMaps() {\n if ((window as any)._rsGoogleMapsLoaded) {\n return Promise.resolve().then(() => {\n this.initMap();\n });\n }\n\n if (!this.googleMapsApiKey) {\n console.error('Falta la clave de Google Maps. Define el atributo \"google-maps-key\" en <rs-map>.');\n return Promise.resolve();\n }\n\n if (!RsMap.googleMapsLoaderPromise) {\n RsMap.googleMapsLoaderPromise = new Promise<void>((resolve, reject) => {\n const existingScript = document.querySelector<HTMLScriptElement>('script[data-rs-google-maps=\"true\"]');\n if (existingScript) {\n existingScript.addEventListener('load', () => resolve(), { once: true });\n existingScript.addEventListener(\n 'error',\n () => reject(new Error('Error al cargar la API de Google Maps')),\n { once: true }\n );\n return;\n }\n\n const script = document.createElement('script');\n const params = new URLSearchParams({\n key: this.googleMapsApiKey,\n v: 'weekly'\n });\n script.src = `https://maps.googleapis.com/maps/api/js?${params.toString()}`;\n script.async = true;\n script.defer = true;\n script.dataset.rsGoogleMaps = 'true';\n\n script.onload = () => {\n (window as any)._rsGoogleMapsLoaded = true;\n resolve();\n };\n\n script.onerror = () => {\n RsMap.googleMapsLoaderPromise = null;\n reject(new Error('Error al cargar la API de Google Maps'));\n };\n\n document.head.appendChild(script);\n });\n }\n\n return RsMap.googleMapsLoaderPromise\n .then(() => {\n (window as any)._rsGoogleMapsLoaded = true;\n this.initMap();\n })\n .catch((error) => {\n console.error(error instanceof Error ? error.message : 'Error al cargar la API de Google Maps');\n });\n }\n\n private initMap() {\n const g = (window as any).google;\n if (!g) {\n console.error('Google Maps aun no esta disponible.');\n return;\n }\n\n const initialCenter = this.getInitialCenter();\n this.map = new g.maps.Map(this.mapEl, {\n center: initialCenter,\n zoom: 14,\n mapTypeId: 'roadmap'\n });\n if (this.points.length) {\n this.updateMarkers(this.points);\n }\n }\n\n private getInitialCenter() {\n const firstPoint = this.getFirstValidPoint();\n if (firstPoint) {\n return firstPoint;\n }\n return { lat: -33.4489, lng: -70.6693 };\n }\n\n private getFirstValidPoint(): { lat: number; lng: number } | null {\n for (const point of this.points) {\n const lat = Number(point.lat);\n const lng = Number(point.lng);\n if (Number.isFinite(lat) && Number.isFinite(lng)) {\n return { lat, lng };\n }\n }\n return null;\n }\n\n private syncAttributesToState() {\n this.isSyncingInitialAttributes = true;\n this.setMarca(this.getAttribute('marca') ?? '');\n this.setTipo(this.getAttribute('tipo') ?? '');\n this.setGoogleMapsKey(this.getAttribute('google-maps-key'));\n this.setPointsApiUrl(this.getAttribute('points-api-url'));\n this.setCacheDays(this.getAttribute('cache-days'));\n this.setMarkerIconBase(this.getAttribute('marker-icon-base'));\n this.setDefaultMarkerIcon(this.getAttribute('marker-icon-default'));\n this.isSyncingInitialAttributes = false;\n this.queueRefreshPoints();\n }\n\n private setMapHeight(value: string | null) {\n const normalized = (value ?? '').trim();\n if (!normalized) {\n this.mapHeight = '';\n this.style.removeProperty('--map-height');\n return;\n }\n this.mapHeight = normalized;\n this.style.setProperty('--map-height', normalized);\n }\n\n private setGoogleMapsKey(value: string | null) {\n this.googleMapsApiKey = (value ?? '').trim();\n if (this.googleMapsApiKey && this.isConnected) {\n void this.loadGoogleMaps();\n }\n }\n\n private setPointsApiUrl(value: string | null) {\n const normalized = (value ?? '').trim();\n this.pointsApiUrl = normalized || DEFAULT_POINTS_API_URL;\n if (this.pointsApiUrl && this.isConnected && !this.isSyncingInitialAttributes) {\n this.queueRefreshPoints();\n }\n }\n\n private setCacheDays(value: string | null) {\n const normalized = (value ?? '').trim();\n if (!normalized) {\n this.pointsCacheTtlMs = DEFAULT_POINTS_CACHE_TTL_MS;\n return;\n }\n\n const days = Number(normalized);\n if (!Number.isFinite(days) || days < 0) {\n this.pointsCacheTtlMs = DEFAULT_POINTS_CACHE_TTL_MS;\n return;\n }\n\n this.pointsCacheTtlMs = days * 24 * 60 * 60 * 1000;\n }\n\n private setMarkerIconBase(value: string | null) {\n const normalized = (value ?? '').trim();\n if (!normalized) {\n this.markerIconBaseUrl = DEFAULT_MARKER_ICON_BASE_URL;\n return;\n }\n this.markerIconBaseUrl = normalized.endsWith('/') ? normalized : `${normalized}/`;\n }\n\n private setDefaultMarkerIcon(value: string | null) {\n this.defaultMarkerIconUrl = (value ?? '').trim();\n }\n\n private setMarca(value: string) {\n this.marca = value.trim();\n this.marcaKey = this.normalizeBrandKey(this.marca);\n this.applyBrandColor();\n if (!this.isSyncingInitialAttributes) {\n this.queueRefreshPoints();\n }\n }\n\n private setTipo(value: string) {\n this.tipo = value.trim();\n this.tipoCode = this.normalizeTipo(this.tipo);\n this.updatePanelTitle();\n if (!this.isSyncingInitialAttributes) {\n this.queueRefreshPoints();\n }\n }\n\n private queueRefreshPoints() {\n if (this.refreshQueued) {\n return;\n }\n this.refreshQueued = true;\n queueMicrotask(() => {\n this.refreshQueued = false;\n void this.refreshPoints();\n });\n }\n\n get marcaFilter() {\n return this.marca;\n }\n\n get tipoFilter() {\n return this.tipo;\n }\n\n private updatePanelTitle() {\n if (!this.panelTitleEl) {\n return;\n }\n const label = this.getTipoLabel();\n this.panelTitleEl.textContent = label ?? 'Puntos del mapa';\n }\n\n private getTipoLabel() {\n if (this.tipoCode !== null && this.tipoCode in TYPE_LABELS) {\n return TYPE_LABELS[this.tipoCode];\n }\n const normalized = this.tipo.trim().toLowerCase();\n const normalizedCode = normalized && normalized in TYPE_CODES ? TYPE_CODES[normalized] : null;\n if (normalizedCode !== null && normalizedCode in TYPE_LABELS) {\n return TYPE_LABELS[normalizedCode];\n }\n return null;\n }\n\n private applyBrandColor() {\n const color = BRAND_COLORS[this.marcaKey] ?? DEFAULT_BRAND_COLOR;\n this.style.setProperty('--rs-map-accent', color);\n }\n\n private normalizeTipo(value: string): number | null {\n if (!value) {\n return null;\n }\n const normalized = value.trim().toLowerCase();\n if (normalized in TYPE_CODES) {\n return TYPE_CODES[normalized];\n }\n const numeric = Number(normalized);\n if (Number.isFinite(numeric) && (numeric === 0 || numeric === 1)) {\n return numeric;\n }\n return null;\n }\n\n private async refreshPoints() {\n if (!this.isConnected || !this.marca || this.tipoCode === null) {\n return;\n }\n\n if (!this.pointsApiUrl) {\n console.error('Falta la URL de la API de puntos. Define el atributo \"points-api-url\" en <rs-map>.');\n this.setComponentState('error');\n return;\n }\n\n this.pointsController?.abort();\n const controller = new AbortController();\n this.pointsController = controller;\n\n const params = new URLSearchParams({\n marca: this.marca,\n tipo: String(this.tipoCode)\n });\n\n const hasQuery = this.pointsApiUrl.includes('?');\n const needsAmp = hasQuery && !/[?&]$/.test(this.pointsApiUrl);\n const separator = hasQuery ? (needsAmp ? '&' : '') : '?';\n const requestUrl = `${this.pointsApiUrl}${separator}${params.toString()}`;\n const cacheKey = this.getPointsCacheKey(requestUrl);\n const cachedPayload = await this.readPointsCache(cacheKey);\n const hasFreshCache = cachedPayload && Date.now() - cachedPayload.timestamp < this.pointsCacheTtlMs;\n const localFallbackPayload = cachedPayload ? null : await this.getLocalPointsFallback(this.marca, this.tipoCode);\n\n if (cachedPayload) {\n this.applyPointsPayload(cachedPayload.data);\n this.setComponentState('ready');\n if (hasFreshCache) {\n return;\n }\n } else if (localFallbackPayload) {\n this.applyPointsPayload(localFallbackPayload);\n this.setComponentState('ready');\n } else {\n this.setComponentState('loading');\n }\n\n try {\n const response = await fetch(requestUrl, {\n signal: controller.signal\n });\n\n if (!response.ok) {\n throw new Error(`Respuesta ${response.status}`);\n }\n\n const payload = await response.json();\n if (!Array.isArray(payload)) {\n throw new Error('La respuesta de puntos no es valida.');\n }\n const typedPayload = payload as MapPointApi[];\n await this.writePointsCache(cacheKey, typedPayload);\n this.applyPointsPayload(typedPayload);\n this.setComponentState('ready');\n } catch (error) {\n if (error instanceof DOMException && error.name === 'AbortError') {\n return;\n }\n if (cachedPayload || localFallbackPayload) {\n console.warn('Se mantienen puntos locales por error al refrescar el mapa', error);\n return;\n }\n console.error('No se pudieron cargar los puntos del mapa', error);\n this.setComponentState('error');\n }\n }\n\n private applyPointsPayload(payload: MapPointApi[]) {\n this.points = this.transformPoints(payload);\n this.renderPoints(this.points);\n this.initialViewApplied = false;\n this.updateMarkers(this.points);\n }\n\n private getPointsCacheKey(requestUrl: string) {\n return `rs-map:points:${requestUrl}`;\n }\n\n private async getLocalPointsFallback(marca: string, tipoCode: number): Promise<MapPointApi[] | null> {\n const normalizedBrand = this.normalizeBrandKey(marca);\n const path = `../json/PuntosMapas_${normalizedBrand}_${tipoCode}.json`;\n const existingRequest = this.localPointsRequests.get(path);\n if (existingRequest) {\n return existingRequest;\n }\n\n const loader = LOCAL_POINTS_LOADERS[path];\n if (!loader) {\n return null;\n }\n\n const request = loader()\n .then((payload) => {\n const parsedPayload = this.parseLocalPointsPayload(payload);\n return parsedPayload?.length ? parsedPayload : null;\n })\n .catch(() => null);\n\n this.localPointsRequests.set(path, request);\n return request;\n }\n\n private parseLocalPointsPayload(value: unknown): MapPointApi[] | null {\n if (!Array.isArray(value)) {\n return null;\n }\n\n return value as MapPointApi[];\n }\n\n private async readPointsCache(cacheKey: string): Promise<PointsCacheEntry | null> {\n const dbEntry = await this.readPointsCacheFromIndexedDb(cacheKey);\n if (dbEntry) {\n return dbEntry;\n }\n\n try {\n const raw = window.localStorage.getItem(cacheKey);\n if (!raw) {\n return null;\n }\n const parsed = JSON.parse(raw) as PointsCacheEntry;\n if (!parsed || !Array.isArray(parsed.data) || !Number.isFinite(parsed.timestamp)) {\n window.localStorage.removeItem(cacheKey);\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n }\n\n private async writePointsCache(cacheKey: string, payload: MapPointApi[]) {\n const entry: PointsCacheEntry = {\n timestamp: Date.now(),\n data: payload\n };\n\n await this.writePointsCacheToIndexedDb(cacheKey, entry);\n\n try {\n window.localStorage.setItem(cacheKey, JSON.stringify(entry));\n } catch {\n // Ignore storage errors and keep runtime behavior.\n }\n }\n\n private async readPointsCacheFromIndexedDb(cacheKey: string): Promise<PointsCacheEntry | null> {\n const db = await RsMap.openPointsCacheDb();\n if (!db) {\n return null;\n }\n\n return new Promise((resolve) => {\n const transaction = db.transaction(POINTS_CACHE_STORE_NAME, 'readonly');\n const store = transaction.objectStore(POINTS_CACHE_STORE_NAME);\n const request = store.get(cacheKey);\n\n request.onsuccess = () => {\n const result = request.result as PointsCacheRecord | undefined;\n if (!result || !Array.isArray(result.data) || !Number.isFinite(result.timestamp)) {\n resolve(null);\n return;\n }\n resolve({\n timestamp: result.timestamp,\n data: result.data\n });\n };\n\n request.onerror = () => resolve(null);\n });\n }\n\n private async writePointsCacheToIndexedDb(cacheKey: string, entry: PointsCacheEntry) {\n const db = await RsMap.openPointsCacheDb();\n if (!db) {\n return;\n }\n\n await new Promise<void>((resolve) => {\n const transaction = db.transaction(POINTS_CACHE_STORE_NAME, 'readwrite');\n const store = transaction.objectStore(POINTS_CACHE_STORE_NAME);\n const request = store.put({\n key: cacheKey,\n timestamp: entry.timestamp,\n data: entry.data\n } satisfies PointsCacheRecord);\n\n request.onsuccess = () => resolve();\n request.onerror = () => resolve();\n });\n }\n\n private static openPointsCacheDb(): Promise<IDBDatabase | null> {\n if (typeof window === 'undefined' || !('indexedDB' in window)) {\n return Promise.resolve(null);\n }\n\n if (!RsMap.pointsCacheDbPromise) {\n RsMap.pointsCacheDbPromise = new Promise((resolve) => {\n const request = window.indexedDB.open(POINTS_CACHE_DB_NAME, 1);\n\n request.onupgradeneeded = () => {\n const db = request.result;\n if (!db.objectStoreNames.contains(POINTS_CACHE_STORE_NAME)) {\n db.createObjectStore(POINTS_CACHE_STORE_NAME, { keyPath: 'key' });\n }\n };\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => resolve(null);\n });\n }\n\n return RsMap.pointsCacheDbPromise;\n }\n\n private transformPoints(payload: MapPointApi[]): MapPoint[] {\n return payload.map((point) => ({\n ...point,\n zone: this.getZoneForPoint(point)\n }));\n }\n\n private renderPoints(points: MapPoint[]) {\n if (!this.zonesContainer) {\n return;\n }\n\n const grouped = this.groupPoints(points);\n this.pointsByZone = grouped;\n this.updateZoneButtonCounts();\n\n const fragment = document.createDocumentFragment();\n\n ZONE_ORDER.forEach((zoneKey) => {\n const section = document.createElement('section');\n section.className = 'zone-section';\n section.dataset.zoneSection = zoneKey;\n\n const header = document.createElement('div');\n header.className = 'zone-section__header';\n const title = document.createElement('span');\n title.textContent = ZONE_LABELS[zoneKey];\n header.appendChild(title);\n section.appendChild(header);\n\n if (grouped[zoneKey].length === 0) {\n const empty = document.createElement('p');\n empty.className = 'zone-section__empty';\n empty.textContent = 'Sin puntos en esta zona.';\n section.appendChild(empty);\n } else {\n const list = document.createElement('div');\n list.className = 'zone-section__list';\n grouped[zoneKey].forEach((point) => {\n list.appendChild(this.createPointCard(point));\n });\n section.appendChild(list);\n }\n\n fragment.appendChild(section);\n });\n\n this.zonesContainer.replaceChildren(fragment);\n this.updateZoneVisibility();\n }\n\n private groupPoints(points: MapPoint[]): Record<ZoneKey, MapPoint[]> {\n const grouped: Record<ZoneKey, MapPoint[]> = {\n norte: [],\n rm: [],\n centro: [],\n sur: []\n };\n points.forEach((point) => {\n grouped[point.zone].push(point);\n });\n return grouped;\n }\n\n private createPointCard(point: MapPoint) {\n const card = document.createElement('article');\n card.className = 'point-card';\n card.dataset.pointId = String(point.id);\n\n const title = document.createElement('h3');\n title.className = 'point-card__title';\n title.textContent = point.titulo || 'Sin nombre';\n card.appendChild(title);\n\n const addressBlock = document.createElement('div');\n addressBlock.className = 'point-card__address-block';\n\n const address = document.createElement('p');\n address.className = 'point-card__address';\n address.textContent = point.direccion || 'Sin direccion';\n addressBlock.appendChild(address);\n\n if (point.comuna_name) {\n const comuna = document.createElement('p');\n comuna.className = 'point-card__meta';\n comuna.textContent = point.comuna_name;\n addressBlock.appendChild(comuna);\n }\n\n if (point.provincia_name) {\n const provincia = document.createElement('p');\n provincia.className = 'point-card__meta';\n provincia.textContent = point.provincia_name;\n addressBlock.appendChild(provincia);\n }\n\n if (point.region_name) {\n const regionLine = document.createElement('p');\n regionLine.className = 'point-card__meta';\n regionLine.textContent = point.region_name;\n addressBlock.appendChild(regionLine);\n }\n\n card.appendChild(addressBlock);\n\n let focusButton: HTMLButtonElement | null = null;\n const lat = Number(point.lat);\n const lng = Number(point.lng);\n if (Number.isFinite(lat) && Number.isFinite(lng)) {\n focusButton = document.createElement('button');\n focusButton.type = 'button';\n focusButton.className = 'point-card__focus';\n const icon = this.createIconElement('fa-solid fa-location-crosshairs');\n focusButton.appendChild(icon);\n focusButton.appendChild(document.createTextNode(' Ver en el mapa'));\n focusButton.addEventListener('click', () => {\n void this.focusPointWithZoom(lat, lng);\n this.scrollToPointCard(point.id);\n });\n }\n\n const details = document.createElement('div');\n details.className = 'point-card__details';\n details.hidden = true;\n let hasDetails = false;\n\n const actions = document.createElement('div');\n actions.className = 'point-card__actions';\n let mapLinkElement: HTMLAnchorElement | null = null;\n\n if (point.url && point.url !== '#') {\n const siteLink = document.createElement('a');\n siteLink.href = point.url;\n siteLink.target = '_blank';\n siteLink.rel = 'noopener noreferrer';\n siteLink.className = 'point-card__action';\n const icon = this.createIconElement('fa-solid fa-globe');\n siteLink.appendChild(icon);\n siteLink.appendChild(document.createTextNode('Sitio web'));\n actions.appendChild(siteLink);\n }\n\n if (point.email) {\n const emailLink = document.createElement('a');\n emailLink.href = `mailto:${point.email}`;\n emailLink.target = '_blank';\n emailLink.rel = 'noopener noreferrer';\n emailLink.className = 'point-card__action point-card__action--text';\n const icon = this.createIconElement('fa-solid fa-envelope');\n emailLink.appendChild(icon);\n emailLink.appendChild(document.createTextNode(point.email));\n actions.appendChild(emailLink);\n }\n\n if (actions.childElementCount) {\n details.appendChild(actions);\n hasDetails = true;\n }\n\n if (point.telefonos?.length) {\n const contactSection = document.createElement('div');\n contactSection.className = 'point-card__contact';\n const contactTitle = document.createElement('div');\n contactTitle.className = 'point-card__contact-title';\n const icon = this.createIconElement('fa-solid fa-phone');\n contactTitle.appendChild(icon);\n contactTitle.appendChild(document.createTextNode('Telefonos'));\n contactSection.appendChild(contactTitle);\n\n const phoneList = document.createElement('ul');\n phoneList.className = 'point-card__phone-list';\n\n point.telefonos\n .slice()\n .sort((a, b) => a.orden - b.orden)\n .forEach((phone) => {\n const item = document.createElement('li');\n item.className = 'point-card__phone-item';\n\n const iconWrapper = document.createElement('span');\n iconWrapper.className = 'point-card__phone-icon';\n if (phone.whatsapp) {\n const whatsappIcon = this.createIconElement('fa-brands fa-whatsapp');\n iconWrapper.appendChild(whatsappIcon);\n } else {\n iconWrapper.textContent = '-';\n }\n item.appendChild(iconWrapper);\n\n const content = document.createElement('div');\n content.className = 'point-card__phone-content';\n\n const name = document.createElement('span');\n name.className = 'point-card__phone-name';\n name.textContent = phone.nombre;\n content.appendChild(name);\n\n const numberEl = phone.whatsapp ? document.createElement('a') : document.createElement('span');\n numberEl.className = 'point-card__phone-number';\n if (phone.whatsapp) {\n const link = this.getWhatsappLink(phone.telefono);\n if (link) {\n (numberEl as HTMLAnchorElement).href = link;\n (numberEl as HTMLAnchorElement).target = '_blank';\n (numberEl as HTMLAnchorElement).rel = 'noopener noreferrer';\n numberEl.classList.add('point-card__phone-number--link');\n }\n }\n numberEl.textContent = phone.telefono;\n content.appendChild(numberEl);\n\n item.appendChild(content);\n phoneList.appendChild(item);\n });\n\n contactSection.appendChild(phoneList);\n details.appendChild(contactSection);\n hasDetails = true;\n }\n\n if (point.adicional) {\n const extra = document.createElement('p');\n extra.className = 'point-card__extra';\n extra.innerHTML = point.adicional;\n extra.querySelectorAll('a').forEach((link) => {\n link.classList.add('point-card__extra-link');\n const icon = this.createIconElement('fa-solid fa-arrow-up-right-from-square');\n icon.classList.add('point-card__extra-icon');\n link.appendChild(icon);\n });\n details.appendChild(extra);\n hasDetails = true;\n }\n\n if (point.googlelink) {\n mapLinkElement = document.createElement('a');\n mapLinkElement.href = point.googlelink;\n mapLinkElement.target = '_blank';\n mapLinkElement.rel = 'noopener noreferrer';\n mapLinkElement.className = 'point-card__action';\n const icon = this.createIconElement('fa-solid fa-map-location-dot');\n mapLinkElement.appendChild(icon);\n mapLinkElement.appendChild(document.createTextNode('Google Maps'));\n }\n\n if (mapLinkElement) {\n const mapWrapper = document.createElement('div');\n mapWrapper.className = 'point-card__actions';\n mapWrapper.appendChild(mapLinkElement);\n details.appendChild(mapWrapper);\n hasDetails = true;\n }\n\n if (hasDetails) {\n const toggle = document.createElement('button');\n toggle.type = 'button';\n toggle.className = 'point-card__toggle';\n const toggleIcon = this.createIconElement('fa-solid fa-circle-info');\n const toggleText = document.createElement('span');\n toggleText.textContent = 'Mas informacion';\n toggle.appendChild(toggleIcon);\n toggle.appendChild(toggleText);\n toggle.addEventListener('click', () => {\n const isHidden = details.hidden;\n details.hidden = !isHidden;\n toggleText.textContent = isHidden ? 'Ocultar informacion' : 'Mas informacion';\n toggleIcon.className = isHidden ? 'fa-solid fa-circle-xmark' : 'fa-solid fa-circle-info';\n });\n card.appendChild(toggle);\n card.appendChild(details);\n }\n\n if (focusButton) {\n card.appendChild(focusButton);\n }\n\n return card;\n }\n\n private getZoneForPoint(point: MapPointApi): ZoneKey {\n const normalizedRegion = this.normalizeRegionName(point.region_name || '');\n if (normalizedRegion && normalizedRegion in REGION_ZONE_MAP) {\n return REGION_ZONE_MAP[normalizedRegion];\n }\n if (normalizedRegion.includes('metropolitana')) {\n return 'rm';\n }\n if (\n normalizedRegion.includes('araucania') ||\n normalizedRegion.includes('rios') ||\n normalizedRegion.includes('lagos') ||\n normalizedRegion.includes('aysen') ||\n normalizedRegion.includes('magallanes')\n ) {\n return 'sur';\n }\n if (\n normalizedRegion.includes('arica') ||\n normalizedRegion.includes('tarapaca') ||\n normalizedRegion.includes('antofagasta') ||\n normalizedRegion.includes('atacama') ||\n normalizedRegion.includes('coquimbo')\n ) {\n return 'norte';\n }\n return 'centro';\n }\n\n private normalizeRegionName(input: string) {\n return input\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .trim();\n }\n\n private normalizeBrandKey(value: string) {\n if (!value) {\n return 'default';\n }\n const normalized = value\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/[^a-z0-9]+/g, '');\n return normalized || 'default';\n }\n\n private getMarkerIcon() {\n const key = this.marcaKey || 'default';\n if (this.markerIconBaseUrl) {\n return `${this.markerIconBaseUrl}${key}.png`;\n }\n if (this.defaultMarkerIconUrl) {\n return this.defaultMarkerIconUrl;\n }\n return null;\n }\n\n private updateMarkers(points: MapPoint[]) {\n const g = (window as any).google;\n if (!g || !this.map) {\n return;\n }\n this.markers.forEach((marker) => marker.setMap(null));\n this.markers = [];\n\n const validPoints = points.filter((point) => {\n const lat = Number(point.lat);\n const lng = Number(point.lng);\n return Number.isFinite(lat) && Number.isFinite(lng);\n });\n\n if (!validPoints.length) {\n return;\n }\n\n const bounds = new g.maps.LatLngBounds();\n const iconUrl = this.getMarkerIcon();\n const icon =\n iconUrl && this.map\n ? {\n url: iconUrl,\n scaledSize: new g.maps.Size(36, 36),\n anchor: new g.maps.Point(18, 36)\n }\n : undefined;\n\n validPoints.forEach((point) => {\n const lat = Number(point.lat);\n const lng = Number(point.lng);\n const marker = new g.maps.Marker({\n map: this.map,\n position: { lat, lng },\n title: point.titulo,\n icon\n });\n this.markers.push(marker);\n const position = marker.getPosition();\n if (position) {\n bounds.extend(position);\n }\n });\n\n if (!this.initialViewApplied && this.markers.length) {\n const position = this.markers[0].getPosition();\n if (position) {\n this.map.setCenter(position);\n this.map.setZoom(14);\n this.initialViewApplied = true;\n return;\n }\n }\n\n if (this.markers.length === 1) {\n const position = this.markers[0].getPosition();\n if (position) {\n this.map.setCenter(position);\n }\n this.map.setZoom(14);\n } else {\n this.map.fitBounds(bounds);\n }\n }\n\n private handleZoneButtonClick = (event: Event) => {\n const button = event.currentTarget as HTMLButtonElement;\n const zone = button.dataset.zone as ZoneKey;\n if (!zone) {\n return;\n }\n this.setActiveZone(zone);\n this.scrollToZoneSection(zone);\n };\n\n private setActiveZone(_zone: ZoneFilter) {}\n\n private scrollToZoneSection(zone: ZoneKey) {\n if (!this.zonesContainer) {\n return;\n }\n const section = this.zonesContainer.querySelector<HTMLElement>(`[data-zone-section=\"${zone}\"]`);\n if (!section) {\n return;\n }\n section.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n\n private updateZoneButtons() {\n this.zoneButtons.forEach((btn) => {\n const zone = btn.dataset.zone as ZoneKey;\n const isActive = this.activeZone === zone;\n btn.classList.toggle('is-active', isActive);\n btn.setAttribute('aria-pressed', String(isActive));\n });\n }\n\n private updateZoneButtonCounts() {\n this.zoneButtons.forEach((btn) => {\n const zone = btn.dataset.zone as ZoneKey;\n const baseLabel = btn.dataset.label || btn.textContent || '';\n btn.textContent = baseLabel;\n });\n }\n\n private updateZoneVisibility() {\n if (!this.zonesContainer) {\n return;\n }\n const sections = this.zonesContainer.querySelectorAll<HTMLElement>('[data-zone-section]');\n sections.forEach((section) => {\n section.removeAttribute('hidden');\n });\n }\n\n private handleNearestClick = () => {\n if (!navigator.geolocation) {\n alert('La geolocalizacion no esta soportada en este navegador.');\n return;\n }\n navigator.geolocation.getCurrentPosition(\n (pos) => {\n const { latitude, longitude } = pos.coords;\n const nearest = this.findNearestPoint(latitude, longitude);\n if (nearest) {\n this.centerMapOnPoint(Number(nearest.lat), Number(nearest.lng));\n this.scrollToPointCard(nearest.id);\n } else {\n alert('No hay puntos disponibles para calcular la tienda cercana.');\n }\n },\n () => {\n alert('No se pudo obtener tu ubicacion.');\n }\n );\n };\n\n private findNearestPoint(lat: number, lng: number): MapPoint | null {\n if (!this.points.length) {\n return null;\n }\n let nearest: MapPoint | null = null;\n let bestDistance = Infinity;\n this.points.forEach((point) => {\n const pointLat = Number(point.lat);\n const pointLng = Number(point.lng);\n if (!Number.isFinite(pointLat) || !Number.isFinite(pointLng)) {\n return;\n }\n const distance = this.haversine(lat, lng, pointLat, pointLng);\n if (distance < bestDistance) {\n bestDistance = distance;\n nearest = point;\n }\n });\n return nearest;\n }\n\n private haversine(lat1: number, lon1: number, lat2: number, lon2: number) {\n const toRad = (deg: number) => (deg * Math.PI) / 180;\n const R = 6371e3;\n const dLat = toRad(lat2 - lat1);\n const dLon = toRad(lon2 - lon1);\n const a =\n Math.sin(dLat / 2) * Math.sin(dLat / 2) +\n Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) * Math.sin(dLon / 2) * Math.sin(dLon / 2);\n const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n return R * c;\n }\n\n private scrollToPointCard(pointId: number) {\n if (!this.zonesContainer) {\n return;\n }\n const card = this.zonesContainer.querySelector<HTMLElement>(`[data-point-id=\"${pointId}\"]`);\n if (!card) {\n return;\n }\n card.scrollIntoView({ behavior: 'smooth', block: 'center' });\n this.highlightPointCard(card);\n }\n\n private highlightPointCard(card: HTMLElement) {\n if (this.highlightTimeout !== null) {\n clearTimeout(this.highlightTimeout);\n this.highlightTimeout = null;\n }\n this.zonesContainer?.querySelectorAll('.point-card--highlight').forEach((el) => {\n el.classList.remove('point-card--highlight');\n });\n card.classList.add('point-card--highlight');\n this.highlightTimeout = window.setTimeout(() => {\n card.classList.remove('point-card--highlight');\n this.highlightTimeout = null;\n }, 3500);\n }\n\n private setComponentState(state: 'loading' | 'ready' | 'error') {\n if (!this.componentMessageEl || !this.mapLayoutEl) {\n return;\n }\n if (state === 'ready') {\n this.componentMessageEl.setAttribute('hidden', '');\n this.mapLayoutEl.removeAttribute('hidden');\n } else {\n const text = state === 'loading' ? 'Cargando puntos...' : 'Mapa temporalmente no disponible';\n this.componentMessageEl.textContent = text;\n this.componentMessageEl.removeAttribute('hidden');\n this.mapLayoutEl.setAttribute('hidden', '');\n }\n }\n\n private centerMapOnPoint(lat: number, lng: number, targetZoom = 14) {\n const g = (window as any).google;\n if (!g || !this.map || !Number.isFinite(lat) || !Number.isFinite(lng)) {\n return;\n }\n const currentZoom = typeof this.map.getZoom === 'function' ? this.map.getZoom() : null;\n const needsZoom = !currentZoom || currentZoom < targetZoom;\n this.animateMapPan(lat, lng, () => {\n if (needsZoom) {\n this.map.setZoom(targetZoom);\n }\n });\n }\n\n private async focusPointWithZoom(lat: number, lng: number) {\n const g = (window as any).google;\n if (!g || !this.map || !Number.isFinite(lat) || !Number.isFinite(lng)) {\n return;\n }\n\n await this.animateZoomTo(8, 800);\n await this.wait(500);\n await new Promise<void>((resolve) => {\n this.animateMapPan(lat, lng, resolve);\n });\n await this.wait(500);\n await this.animateZoomTo(18, 800);\n }\n\n private wait(ms: number) {\n return new Promise<void>((resolve) => {\n window.setTimeout(resolve, ms);\n });\n }\n\n private async animateZoomTo(targetZoom: number, duration = 600) {\n const g = (window as any).google;\n if (\n !g ||\n !this.map ||\n typeof this.map.getZoom !== 'function' ||\n typeof this.map.setZoom !== 'function'\n ) {\n return;\n }\n const startZoom = this.map.getZoom();\n if (!Number.isFinite(startZoom)) {\n this.map.setZoom(targetZoom);\n return;\n }\n const delta = targetZoom - startZoom;\n if (Math.abs(delta) < 0.01) {\n this.map.setZoom(targetZoom);\n return;\n }\n\n await new Promise<void>((resolve) => {\n const startTime = performance.now();\n const ease = (t: number) => 1 - Math.pow(1 - t, 3);\n\n const step = (now: number) => {\n const elapsed = now - startTime;\n const progress = Math.min(elapsed / duration, 1);\n const eased = ease(progress);\n const nextZoom = startZoom + delta * eased;\n this.map.setZoom(Math.round(nextZoom * 100) / 100);\n if (progress < 1) {\n requestAnimationFrame(step);\n } else {\n this.map.setZoom(targetZoom);\n resolve();\n }\n };\n\n requestAnimationFrame(step);\n });\n }\n\n private animateMapPan(targetLat: number, targetLng: number, onComplete?: () => void) {\n const g = (window as any).google;\n if (!g || !this.map) {\n return;\n }\n if (this.panAnimationFrame !== null) {\n cancelAnimationFrame(this.panAnimationFrame);\n this.panAnimationFrame = null;\n }\n const startCenter = this.map.getCenter();\n if (!startCenter) {\n this.map.setCenter({ lat: targetLat, lng: targetLng });\n onComplete?.();\n return;\n }\n const startLat = startCenter.lat();\n const startLng = startCenter.lng();\n const deltaLat = targetLat - startLat;\n const deltaLng = targetLng - startLng;\n const duration = 600;\n const startTime = performance.now();\n\n const ease = (t: number) => 1 - Math.pow(1 - t, 3);\n\n const step = (now: number) => {\n const elapsed = now - startTime;\n const progress = Math.min(elapsed / duration, 1);\n const eased = ease(progress);\n const nextLat = startLat + deltaLat * eased;\n const nextLng = startLng + deltaLng * eased;\n this.map.setCenter({ lat: nextLat, lng: nextLng });\n if (progress < 1) {\n this.panAnimationFrame = requestAnimationFrame(step);\n } else {\n this.panAnimationFrame = null;\n onComplete?.();\n }\n };\n\n this.panAnimationFrame = requestAnimationFrame(step);\n }\n\n private static ensureFontAwesome() {\n if (RsMap.fontAwesomeAttached) {\n return;\n }\n const existing = document.querySelector(`link[href=\"${FONT_AWESOME_LOCAL_PATH}\"]`);\n if (existing) {\n RsMap.fontAwesomeAttached = true;\n return;\n }\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = FONT_AWESOME_LOCAL_PATH;\n link.crossOrigin = 'anonymous';\n link.referrerPolicy = 'no-referrer';\n link.addEventListener('load', () => {\n RsMap.fontAwesomeAttached = true;\n });\n document.head.appendChild(link);\n }\n\n private createIconElement(className: string) {\n const icon = document.createElement('i');\n icon.className = className;\n icon.setAttribute('aria-hidden', 'true');\n return icon;\n }\n\n private getWhatsappLink(phone: string) {\n const digits = phone.replace(/\\D+/g, '');\n if (!digits) {\n return null;\n }\n return `https://wa.me/${digits}`;\n }\n}\n","import { safeDefine } from './utils/define';\nimport { RsMap } from './components/rs-map';\n\n\n// En dev, registramos directamente para probar en el navegador\nsafeDefine(RsMap.tag, RsMap);\n\nexport { RsMap, safeDefine };\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'rs-map': RsMap;\n }\n}\n"],"names":["safeDefine","tag","Ctor","LOCAL_POINTS_LOADERS","m","DEFAULT_BRAND_COLOR","FONT_AWESOME_LOCAL_PATH","DEFAULT_MARKER_ICON_BASE_URL","DEFAULT_POINTS_API_URL","BRAND_COLORS","TYPE_CODES","ZONE_ORDER","ZONE_LABELS","TYPE_LABELS","DEFAULT_POINTS_CACHE_TTL_MS","POINTS_CACHE_DB_NAME","POINTS_CACHE_STORE_NAME","REGION_ZONE_MAP","_RsMap","__publicField","event","zone","pos","latitude","longitude","nearest","btn","_a","name","_oldValue","newValue","resolve","reject","existingScript","script","params","error","g","initialCenter","firstPoint","point","lat","lng","_b","value","normalized","days","label","normalizedCode","color","numeric","controller","hasQuery","needsAmp","separator","requestUrl","cacheKey","cachedPayload","hasFreshCache","localFallbackPayload","response","payload","typedPayload","marca","tipoCode","path","existingRequest","loader","request","parsedPayload","dbEntry","raw","parsed","entry","db","result","points","grouped","fragment","zoneKey","section","header","title","empty","list","card","addressBlock","address","comuna","provincia","regionLine","focusButton","icon","details","hasDetails","actions","mapLinkElement","siteLink","emailLink","contactSection","contactTitle","phoneList","a","b","phone","item","iconWrapper","whatsappIcon","content","numberEl","link","extra","mapWrapper","toggle","toggleIcon","toggleText","isHidden","normalizedRegion","input","key","marker","validPoints","bounds","iconUrl","position","_zone","isActive","baseLabel","bestDistance","pointLat","pointLng","distance","lat1","lon1","lat2","lon2","toRad","deg","dLat","dLon","pointId","el","state","text","targetZoom","currentZoom","needsZoom","ms","duration","startZoom","delta","startTime","ease","t","step","now","elapsed","progress","eased","nextZoom","targetLat","targetLng","onComplete","startCenter","startLat","startLng","deltaLat","deltaLng","nextLat","nextLng","className","digits","RsMap"],"mappings":"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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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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"}
1
+ {"version":3,"file":"rs-components.es.js","sources":["../src/utils/define.ts","../src/pin/gasgas.png?url","../src/pin/gasgas_distribuidor.png?url","../src/pin/hqv.png?url","../src/pin/hqv_distribuidor.png?url","../src/pin/ktm.png?url","../src/pin/ktm_distribuidor.png?url","../src/pin/rs.png?url","../src/pin/rs_distribuidor.png?url","../src/pin/voge.png?url","../src/pin/voge_distribuidor.png?url","../src/components/rs-map.ts","../src/ws/gear.svg?raw","../src/ws/motorcycle.svg?raw","../src/components/rs-whatsapp.ts","../src/index.ts"],"sourcesContent":["// Registro seguro para evitar DOMException por doble definición\r\nexport function safeDefine(tag: string, Ctor: CustomElementConstructor) {\r\n if (!customElements.get(tag)) customElements.define(tag, Ctor);\r\n}\r\n","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABXFJREFUeNrUW0tsE0cY/u0aBC3YRtCSQBCO6COkUkuqAlEuJCggwQEw5EClKsR9obZAidQeWoRIyoGqqtQEEIgL4SWBxCuckJIUzAUoqIp7SVukCkuJUah4ODYvJelj/vHs4KSJ45mdmV3/0mjt9fze+b/5/sfM7nrAkFz1vx4kh0WkVZMWYJ+z5Qo7RkmLVaVuJU2My6PZ6BA5rCNt0xgGTyQIxFHS2nWC4dFo+C7SGhT8HRrfTlqjDiA8GmiOhm/XgCsa30pAaHIlAMR4pPh50kKa3TZGWpgAEVfxZ15FxiPVLxswHlgs6WaAO88AZnwbmBd0iRrChJhjADhovDIQPDZ9vhucFwShQjYmeCWNDzKfd4MEWfA1GgTb2IXdIovIpPxoxAXIhaplZ39q+TyY/+VWmFwyJ2+d/sPH4K9THfl2LxV1BZ+EHbtkjH9l40pYcGifsF6ovEwEAGRmjTYGyM7+pNkBqPjlJ3hh+nT6faDzEtw7cx6GBtJ56T+8eE3kckIsEGXAFzKzP2vtCm58/94DcHtnq854gAyNKGcAi/wPZUZUfuYgBFYsh7/TabhR8i49V3b4e5ixYe2Eutk6+aZFwoAZOhhQLWM80h+NR0l1XOLB0DL+6W9/wD+p1MjU5PfD1IVvjNARSYvoqgSEqGoAlsnS35K7pzPpuui99c9XNpVr/qfzautODsCDji6Zy1az/QSlAEgtPgKVS+hxqO8OD2Yz16/j9H6r4wT9PJxKQ0/dp5kprF3OfxfIANnytg4XkALAvzJjTLLrOZW9gUxAxMD40tLF9HP8qx2Z/lVvwiRWJ0jQn2dPHQBIVX5jBbBcQW3OR5v4Z0n6C02WDzQKBrtsf5+w/8IyHjDRZSTpLyQ+3Rco2vaZsA76/q2PtxhZRGgF4GlPL/y5eSsUfVCft84TkhYTh45QXRMiUgj9CwUkpA7wqGZAcrxAOJav9+0/Qo8lWxroEctfjPAzV9XyPsMDKeg/fo734SvAk+dg+H4qp651PsdYlbtAbLxqsPTbb2Ba5WJ4dP0m+PyZFOcjRrzWsoenOTQq1PQ1TCGru2c9v3O6L9izg6bKbN37F7vostmqFpNXb0Dxh/U0QD7++SY9N0iC5ARjVQ5APFep27f7Oyje/jnN7RjE5m5uoMZjqYtV3azVtbTYsYy3gEFAHpy9QIsfK//jTKPxlm6wagkMJu5w41Enj8lSviP061gnp71TTo+zI/XUODQe5eWG90fU+fi7NcPZNT8ChsYPJhJcFzOHpYvnsHJ8kZXG3H1SaeGx2g2C426CFn9SB1PmzeV+bUnvD238d+4aAT89PutNwL0LnXStMFoX+2AMGbo7wP8b+2f3w9iBv9vdExDdELkNZm5+2BG8s1yhwwVQ2gsgAx4V6ezV+ecOSbs2ANgdmJibjRfdFZa5L9DqYgCExyZ1a8ylwTBOZr9UVEn2zpAbY0Gz1sXQKAYEWU0QKuTZl2YAe1an2UWzH5FVtPt8QDdI7hUqlCiZkBpZZbuPyDS6YPZtjcEWAOzmg5PVYYvdR2S8imYg6YDxSuKQbQBY5eVEQIyoeHBS5XOCl0Hy/qHpwKfaBUwHxKSdtKcNABaMTLhCs6qnRJW6gKHaQBn1dbiAbldQSn1tALDaoMXt1NfJAGtlFldMfR2g6gGA5eeIQuqHdUVUXQxQ6QqRgntlRmFWwD2+sM7xeUG/RGxQP6J7cNoBYAWSTGoMm3h1zgQDgEXwqGDKi5oYmxEArBnNc9kcVf1mmCsAYHQO5+H3YYOTYpQBVmrMtWCqMfXKrCMAMBCaxokHjXa3twoCgKx4EB+V71ucGIgjAIyKB3ET+d6Vgu8dqnoDVFb+E2AAEkYQxr2UiokAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABG5JREFUeNrkW01ME0EUfm0UDxgoqOGgCa1EPWBiBZSDBwsoZxuNeNNe0JuSmBi8ABeBk3BS8EC44V9s4s2D1sQLEW09ikFqwsXESDV4QRN8L51Kf2bbnd2Z2dn4kkmbne523jff996b2d0AaLKtAQjhRxRbDFsj+15sr9lnClsm8BByOsYVUOx0GD/OYbvMcbiWERDz2JIqwQgodHwE2xUJlyPnk9iGVAARUEBzcvyGAlzJ+WkEYdRIANB5ovgzbGHFss1giyMQWRkXC0pynqj+SoPzwGJJmgHuPQOY83Og30gSPciEjGcAeOi8NBACLjWfBu+NQDjuNCYEHTofYpo3wUIs+GoNgnPsj02xKE7KXS0SwD+KGTT75RYRlYITBoyAuTanlAGGz74jFogy4DqYbyNKGMAi/7rIxb/8wBN+S4x0e+2lRWRAk91r7hD4/5jogDteAnzflON8F7r0tt9eWiSpIggp2QCcFhnwz18Aw4f5fSvYd3+18vi1CEBbPf+cMy1CeMXYfoJUACwXH7exEH1XtlI/uw/gZnteBoNF9WInCqmprvIazXjs3sn896cYwmbLwliknkngD8ClxUppPT4B0LAN3jEVEohazfT4x8rjk0fzjpDzBRkMHAC4g8f3PK/8/cX9285fWKzsv3UoD6aVrBpKmWN7VSqSBbiV3ywn4bTtBni0lnekMNjhIwALp9DBNb4DVw9aO18rpvS32GerGwZwbXy58tj6ZikrnnQDnA9XB2xlo7rzfW+s+0hunmyI0IzxZsQq8pNcXnzl91Vzvma2CXkEwMSyvd9RHCD9TnyyyAob7ljY2+IBAJlvAEucsogCHY8RROGZVXv5XqSP5ONGyCIAlCS6mc/8YLTQzR8ozXKtoohiRZcFnalGmGy3rf+cCgAyxVrmFTKD4fxskCPNdWIzUQiUSzl+H9UI7zl9naHqY5WZBf7F74ZdAOk+61q9tREH22t/HdC0M38O2YMO6z4CuLwijGoE4EPxWbUWJjToVskLHip2ovWCY5UogRT4x1LSAWBbz1kfOJ9RuSGS9AEA8yrrgHkfAJBUBgCTQcZk53XsCk8bDIDw2BzdGtsagFXQcydYxLI4+xFdawETY8GYk5OcMoDqr7RBLHA0+44ZwJ7VGTNo9hNOT3T7fACxIOqx8ymckB5PNkTQhgyYfVdjcAUAu/ngZXU45fYRmaAk/eU8cF5KHHINgIcBMSHjwUmZzwnSbfOYHwKfbAnoDog5N2lPGQAsGOmQwpisp0SlSkBTbSCN+iokoFoKUqmvDABWG0yZTn1lElC0WJJOfZUSKNQGCYnUj6uKqEFVF5YohYTvXpmRmBVojy+ucnxBUG8JF9RPqB6ccgBYgeQkNcZ1vDqngwEEAsWClGDKS2kZm66lG0uNtJtc64EWZSnPMwYUpca4Dd3HQaMFdf4Zo3W1BVOPrldmPQGAgTBqEQ+G3G5v+QKAQoSH0lvtSRYo4b8AoCweZHXkeyON3juU9QaoU/srwAB77Uga7jO8tAAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3hJREFUeNrkWv91sjAUTXv6v+0EuoFsIJ2gdgM2KE4gTsBxAusE6ATRCdAJaCdAJ+DLTX2U9tNWKCSB3HPeIUgE7s19+QHcMHW4F+GIcEX0TuUitqftRsROxIF1AAMRvohYRFYyuAjvJFwriS8qkD4X6elcrRACNxnWRPycEIHJ5JHTSUPkixGfHGYUvFMLZYoiPdOJaiWfaQgjRNBF3ggRHM3kiyIMdPT2qSECUMeoFJFB5ClCVeRdA8lTKEkFbrAA3ObWV+KCqAUCLMoQuqnQ85cbLu4/1jCHw8fq1nEc9vb2JrfngGMI13VlnMNms5FxAbjQQxOtP67SIlEUZYvFQpYFoQzAfhzH2SWMx+PsJwRB8Nt13SYEKLXKA0kiikA5SRJJLk3TzPO8//4ThmFOEMB+xTQItPb+IEtAq4s0kKQBYX0ZJMJgMJB1EHALOYDqX3LIL/cQNSFAei15EAE5AATpdzgA5LFPIvi+/4Us5zw/FwlDQalRrKNyZngVedgdhBAgXHQEEaU+gVoa5KhPOJcaFHDSlQJkygUAKSJebE2y9Xfgd+Q6iEMoOAVbcsUfO8GsiWHw4knFzTMhwOfj3e2W9Xq9fKjDsPb+/p4f7/f78j/AbreTQ+V6vZb1ptMp2+/3X+rgfLSP+vP5XNatg9tdHdagcXs2m7HRaJSP+SCGMsitVqvP3pTz/NhyuWQiFSQ57GP7/Pws64AsiQABUT4ej0y4hj081DPU39WZIyBPQpAIaLmnpye5j2Ovr6+yBeEO1Ad5YDgcSlFo4gRMJhN5vDhpgrN+mAQ1KsDhp0fTuKnHx0cm8lOSQGuBIAAHFGdvLy8vOSlKATgEZRCk3+ECAIKhDpwGAa+8V6tWgZVXhbdlUr1FL2Z2TQiwb5EAjdyr06IUaOyZQNIC8qWmwbclBVi1wP5LG94FaH0wGhtMPlJhMc9gAVxVeWZiZ5hUIXJrYkdTETOVF7s3zAWJDsU9G3PfxBGB68w7E16Vaf9KROfrstCE3lfXxxIpM+jbQV+DAGPTxmFuS8ene6Gk5aOoaxEoEMA3fT0e22Z9VXMDo63/HaGN1m9yscRZC+GyDk54dKTCmLUcfxkVItYBODZav461gss6hjJrhYB1ENcumznrMFyb8r7KgslhloC3fapb91Q5YhaC5geJDXl/CZ7uvP8nwAAeipVa4iJE4AAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABIlJREFUeNrkWs11ozAQlnf3bm8H7iD4treQCuKtIKSCcM0p5LgnXiqwOyCpAPu2NzsV4A5wKmD1sR4iE4k/I4HN9948jBlAM5o/jRgxc5hwsjjZnMaH3yLWh+OK05bTnl0AppxcThtOSU0KOTkHxZ2l4IsGQssoPjzrLBSBQfotCS5ThNf2gEctPgs+HRxmX81kWWw6naZHEdvtlu12u/RYAjD85rTr08w7hxmSzt58Pk8Wi0USx3FSBvCA17btMmuw+iS8dKCO4yRRFCVNgXuhvD4rQSo8N/EkDMOkLeBZeGbflGCpZr2KqdcFnqlwi7gs7uiK9rFMeN3AOyRK2JhWQNCF8CVK8E0Jb+dfDtM0CbgDT6MyJRhxhVB86WQyOSnSN8Vms1GVz2Zn3/f9pCt4nmfcCoJ8uusScAVYYE4BC12lMEX+DLxiYzwgFd603/9f1fKBZiUvSmFVyYtroNVqxdbrtZTn+vqa8biT/n5+fmbcEo5eyemnjtmf582tSr5HJUcZAgUNZQxFEEspCILChRFMX6wWJTy2DgX4+fq+LFWRoCD8hstAOJgt6v08XNfNBMQR51UgUaanPfoXBT8xT2PWRV9F9AaREjCD4AFR3U9KKrKQkmAY6FDAUeWnqvUhPK3+wEcpkiwAwlMag5BQpCisWFOQYojINfJ1h8RltFSGpf5PJg+BQJQlyCJIUIoJNNMQjsxY5hpi1JcpgGJLjvQqQCY8CS7Opmo5i/9huhAcioKl4EhWUTUIEpoqYFRTAZ8nyecpOjn39/ef1RJPUUh/lOootYn8IOoQgff29jblQVrDfyIPnkfnuPbw8HD0vFSQ0aiRbD9a6YAe8jbyMY7j8TirAZD/IRyf8Yz/5uYmu3Z3d8fe3t5S4XCOI3eNlIcUQe8gntlsxrg7fKk1mqCxAjCY/CxAeNDT01NW+IAPAuIchQ0Exgy+v7+nvLgG4Pzj4+NIGO4K7PX1Nb0mCktFkNhPNKGAvdiazisAg+LBKDVhDBLXISAAC8B1GvjLy0s26Kurq8wFyB3INWAFABSG/6E8WeUpsYC99jpAFoi6AhVQTVaF3+pYfVtm1zbI0nKt89bhNlkL6IZiLeDosIAval4ul53PPuJJlbG2hegM+gG1yuDvDTY9f4nRFwVIPi2ZwuPjo8z//3D6a2wvoGc9QSON0S97/ajnTQZEvEuxUxSYsDxHtSNkCgXdJGO+GHWhBMx8wWZpZDL+eKqlKpbAOtwBcaaoj1gn97e1NxipBoPAmG9bnQI0SYpaZKZnv/S7ANEaTtkmx70lH0oY9/3SjCAjmC66PFXSJdIbeBVRvvXtsFO/EbLrDgB9ASx16UgLK+ogNWhuzHQtfhpvlRskn/UA0o8lDFDMevTtoNuBAuasZwgNCh+yHsIyaPpT1lN4BhTgsp5jMzTTl9UGgzP9PPwhmn7lxdKlmr4uV+hVwdOFK8zZmeOUrBCwC4A1RNNvY61gswtDnbWCxy4QVZfNIbtg2EPy+yYLJosNBOG5l7ptl8oBGyCoPoiG4PcqOF37/T8BBgCThigH5VpvfwAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABJZJREFUeNrsW79PE1Ec/9ZWfoWDm4yLeOwidZaEDg4mLDiqgx1hsk7oRJmECV10BBZ0McUB49aSYOJgUrAOJg4t8Ae0iAFKgPN966Fce+/uvbt77+6on+RLmvbufd/3+76/7wBoc8Qk8VEJpQiNEkoapDZdUyO0YdAaoYLxXaSBQucI6S4pZ6wRScGLHgRvpnxUFKF6PHEWi1DDGgOSxgY1R/MY6QG1/xIkb/5hv/FVh9ruKRTW91n4VAjdM2JFaJAmVKWdnNqf0DOTffrGepeu18CW8Bq8Fu+xsYSqwTM0wlMFX3ytOApNI7zXQRGBKyFJO/n0A0WvbsddC39GuAauZWMJySADXtlqY15O3c4abJSgBqGAnCzhGZSQCyLPSxWeQQlS64S8lc+LFv6MKDGhLKsOSBkK+BcM+hNQLumg9p1AZacDtrYTtgtcHzgG7dqRa+3Xfsbh1kgCKtv15p+wPliR7vvnTX9+VnGs6DC1lUsdIlwhJyPym5hqA50taQu/c1ICqQY9uwKFD1dGSLgwf3MV9LCD/P1niugG+dU4cYMe24UeP9Uhxpm8ss8UmJ7aM/HOPm9xg3FCi6IsYL5Z4yzlrRWhCzhUeY5ug7wtrp0XaQHJ5uA3fOOQevH7D72wUYrZBsM0Nkaq7sx4SCeB85fpO+SNe6jtHlP36De4/JhyQiYaH+v1FAdwDxbrMiPOqYCsydnGuuHunTr14qtXjiEWU0ibS095338cEQtQoF5PwNbO5RbaJSkP16Fhs9QNn7+07GFGlAuYUwKD6WLQmp6i/772qQdSY3v0oDOr2LoZyx7scCnodnL09n5DSCsQ94DMxJ5Q/glZgmJAfPHqlPLrCZCcbqTUc6lych/CBk/FzPBQt21AXFnulR4EeV2gYBrObZ9w3byyfNJIW9TR0uQhLL1RGv0EKyz2UBCpgIqZeZ1rs9gAVbeOgZxcC5HavpHPM08PiJLYFIu8LRqiikgFrLWc6mqnL7716P4eZCb7iCK6GuU0k0VZ814TGQM0p2bISxnMO1OgNEOa6EBY9GMS1Nw2o0J4hqiUdrgoIxNk/LCC5gjOmwEop5+RoQDNKoWRVtW1K+CDEJ77kBcllWogCXm/8jjvZAh5AP0BqrRSeImWxze/dfGZE8dsENdGHjx7EokqbXDhxhJYTt5mgFJ2K0TcgwK6rUZkh/VTePvuqNEGp0aOfNH0zJwCE09+Ndam4CVvBShkQGqVHQqr7oefeC/DgDWwR2OIBZZ5HjZBmPdZAh5egzneqXE6R1kvAnh9QULj9T8iGAwOxP++HHEGfEmiTBqbzdIB1zMSQoMQ8MtUCyDulRihpy+0MJJAvvh+3AcF1AxXSklW/Byhj2GZFKlg846QACoHGfmZmySBlIaQoixB+DyEGCkJCkhCyCHyTdF5iAA0QQGxGsbAR0O2nQIf8+zwogY+GpI+mr4GEYUfrpCBiKPYbqbvlytE2vT9cIUMXDAU28303RZIkSp4eJFmUMA4XHAsRL3W92N4YhUPitBGaP5fowuV8tzEg8D8PhGgAhYJDRufV+A/gsFvAQYAGFubR/xBobMAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA9xJREFUeNrsWz124jAQHjY5gEtK7wkwJ1hKSvYGvkGcE4Qtt+JxAucGpkxn6NKZdOnMDUyZzqvhmd2gSLJk/dmw33vzSBxjSaOZb37kANw4Ro7GCYjMiPwgEjUSUPcciewb2RHZNtcGDVx0RqTuKFnzjEEuvNBYOC35UBQRaO64jEUEfeWAqJlg2GoesxkEQQBRFJ1+3+/3cDweYbvdyoxzIPKz4YreICZS8XaOLLZOkqQuiqJuA96D9+J3BJZQNWP2ZvHchadpWncFfrdFEd6VEPF2Po7juqqqWhf4DHyWwBIin4RXsiams+siaxAoIfChgMzV4iWUkPmI804XL6EEp3lCzvJ5V+BwQukqD5g1CvhHBiSml2V5+jwcDicRIQzDk3QF5gzT6ZQ1DuYHG+e+/9n0V6tVa0aHoY0ozIYrZC6Y/2JQspNfwhZea1MCyQa1XYEzjlJEuO9g/pdZUHyZi6Ab5Hne6gaPj48wGql54HK5hKenp4ux8RqFBZFnWxawojUuk96ygC7QkuW1ug2Ozbh3ZdMCInq3zwUNC5vNBt7e3oRkeC6M2jCZTL4QJ46N30VS5M3RNJT8mLNDF7JYLLR4AOfAeK407hQVcOFwZPIwn8+5N4/H45Ofi8rc9/f30y5+fHz8DaGfBXcXn8MDWtjr6yt9+ZcTCyAEpM3khDCFFoJhVQScg44FfPPeOyMcQBbJ/BtaWJIkVse/d7VQJMT1ei0kRDqkPjw89K7np5XMENYWmnuWZc5JUKsIorNA3dh/7iCppMmMbDC3qYCUnrRuTk/n9qgE2U4Sjs1QZGqTBHcs3zbSWCT+j4RHFCGVGAnG3tm0gLCtGNJxBdWeAqcYCm0TYWGiE0SXzSqmLyiHCxeRIDFhBTSDq0YAzu4nLhQQshi8S1Z4dgU8CFEBJ/tzYv7cnmDXOK4aRXAM4B+g+j0Nwt3s2h+QAT5bkEc4PyWqeEroYgkyOy9YfAkesBSltSYqRQmfP8vS19GYcGLI1Fju6pTKEg1Wb0djzNSYJVgEYdyXITy8B2N8W+FkavdHBkKikv9hHw9LX7qXiC9JYAcIP1XOSIh8B88vU6Vg75WYXvq+VGLkQIz4/p0BBRwbV5o5VvxvIi996RQFIHhHyIKUPplfukiyKDH0FKWDxefQY8wcKCCCnsPmm6IrGABCS4RY9ZH4OhVK10Z80r3DayU+btpv0PRDGChMuEICA0dxa6ZvyhUGbfomXCGBK0Nxa6bfNUEaVMKjilhCAQu4cqRDz/VNNE9YfFDADYH+X6OrCnld+MCb3997VMAzkUnz8wb+ww/+CDAA4q4zpysTtacAAAAASUVORK5CYII=\"","type ZoneKey = 'norte' | 'rm' | 'centro' | 'sur';\ntype ZoneFilter = ZoneKey | 'all';\n\nconst LOCAL_POINTS_LOADERS = import.meta.glob('../json/PuntosMapas_*.json', {\n import: 'default'\n}) as Record<string, () => Promise<unknown>>;\n\nconst LOCAL_MARKER_ICON_URLS = import.meta.glob('../pin/*.png', {\n eager: true,\n import: 'default',\n query: '?url'\n}) as Record<string, string>;\n\ninterface MapPointPhone {\n id: number;\n dist: number;\n telefono: string;\n nombre: string;\n whatsapp: number;\n watshapp?: number;\n orden: number;\n}\n\ninterface MapPointApi {\n id: number;\n titulo: string;\n rut: string;\n direccion: string;\n comuna: number;\n tipo: number;\n lat: string;\n lng: string;\n url: string;\n email: string;\n adicional: string;\n portada: string;\n googlelink: string;\n activo: number;\n marca: number;\n comuna_name: string;\n provincia_name: string;\n region_name: string;\n telefonos: MapPointPhone[];\n}\n\ninterface MapPoint extends MapPointApi {\n zone: ZoneKey;\n}\n\ninterface MapPosition {\n lat: number;\n lng: number;\n}\n\ninterface PointsCacheEntry {\n timestamp: number;\n data: MapPointApi[];\n}\n\ninterface PointsCacheRecord extends PointsCacheEntry {\n key: string;\n}\n\nconst DEFAULT_BRAND_COLOR = '#000000';\nconst FONT_AWESOME_LOCAL_PATH = '/assets/fontawesome/css/all.min.css';\nconst DEFAULT_POINTS_API_URL = 'https://ap2.rs-shop.cl/web/PuntosMapas';\nconst BRAND_COLORS: Record<string, string> = {\n gasgas: '#cb0d25',\n ktm: '#ff6600'\n};\nconst BRAND_ALIASES: Record<string, string> = {\n gas: 'gasgas',\n gasgas: 'gasgas',\n husqvarna: 'hqv'\n};\nconst TYPE_CODES: Record<string, number> = {\n sucursal: 0,\n distribuidor: 1\n};\nconst ZONE_ORDER: ZoneKey[] = ['norte', 'rm', 'centro', 'sur'];\nconst ZONE_LABELS: Record<ZoneKey, string> = {\n norte: 'Zona Norte',\n rm: 'RM',\n centro: 'Zona Centro',\n sur: 'Zona Sur'\n};\nconst TYPE_LABELS: Record<number, string> = {\n 0: 'Sucursales',\n 1: 'Distribuidores'\n};\nconst CONTINENTAL_CHILE_BOUNDS = {\n minLat: -56.5,\n maxLat: -17,\n minLng: -76,\n maxLng: -66\n};\nconst DEFAULT_POINTS_CACHE_TTL_MS = 30 * 24 * 60 * 60 * 1000;\nconst POINTS_CACHE_DB_NAME = 'rs-map-cache';\nconst POINTS_CACHE_STORE_NAME = 'points';\nconst REGION_ZONE_MAP: Record<string, ZoneKey> = {\n 'region de arica y parinacota': 'norte',\n 'arica y parinacota': 'norte',\n 'region de tarapaca': 'norte',\n tarapaca: 'norte',\n 'region de antofagasta': 'norte',\n antofagasta: 'norte',\n 'region de atacama': 'norte',\n atacama: 'norte',\n 'region de coquimbo': 'norte',\n coquimbo: 'norte',\n 'region de valparaiso': 'centro',\n valparaiso: 'centro',\n 'region del libertador general bernardo o higgins': 'centro',\n \"region del libertador general bernardo o'higgins\": 'centro',\n \"libertador bernardo o'higgins\": 'centro',\n ohiggins: 'centro',\n 'region del maule': 'centro',\n maule: 'centro',\n 'region de nuble': 'centro',\n nuble: 'centro',\n 'region del biobio': 'centro',\n biobio: 'centro',\n 'region metropolitana de santiago': 'rm',\n 'region metropolitana': 'rm',\n 'rm': 'rm',\n santiago: 'rm',\n 'region de la araucania': 'sur',\n araucania: 'sur',\n 'region de los rios': 'sur',\n 'los rios': 'sur',\n 'region de los lagos': 'sur',\n 'los lagos': 'sur',\n 'region de aysen del general carlos ibanez del campo': 'sur',\n 'region de aysen': 'sur',\n aysen: 'sur',\n 'region de magallanes y la antartica chilena': 'sur',\n magallanes: 'sur'\n};\n\nexport class RsMap extends HTMLElement {\n static tag = 'rs-map';\n private static googleMapsLoaderPromise: Promise<void> | null = null;\n private static pointsCacheDbPromise: Promise<IDBDatabase | null> | null = null;\n private root: ShadowRoot;\n private mapEl!: HTMLDivElement;\n private map: any;\n private pointModalOverlayEl!: HTMLElement;\n private pointModalTitleEl!: HTMLElement;\n private pointModalBodyEl!: HTMLElement;\n private pointModalCloseButton!: HTMLButtonElement;\n private markers: any[] = [];\n private marca = '';\n private marcaKey = 'default';\n private tipo = '';\n private tipoCode: number | null = null;\n private pointsController?: AbortController;\n private points: MapPoint[] = [];\n private pointsByZone: Record<ZoneKey, MapPoint[]> = {\n norte: [],\n rm: [],\n centro: [],\n sur: []\n };\n private initialViewApplied = false;\n private zonesContainer!: HTMLElement;\n private componentMessageEl!: HTMLElement;\n private mapLayoutEl!: HTMLElement;\n private zoneButtons: HTMLButtonElement[] = [];\n private nearestButton!: HTMLButtonElement;\n private panelTitleEl!: HTMLElement;\n private activeZone: ZoneFilter = 'all';\n private mapHeight = '';\n private googleMapsApiKey = '';\n private pointsApiUrl = DEFAULT_POINTS_API_URL;\n private markerIconBaseUrl = '';\n private defaultMarkerIconUrl = '';\n private pointsCacheTtlMs = DEFAULT_POINTS_CACHE_TTL_MS;\n private static fontAwesomeAttached = false;\n private panAnimationFrame: number | null = null;\n private highlightTimeout: number | null = null;\n private isSyncingInitialAttributes = false;\n private refreshQueued = false;\n private localPointsRequests = new Map<string, Promise<MapPointApi[] | null>>();\n\n static get observedAttributes() {\n return [\n 'marca',\n 'tipo',\n 'height',\n 'google-maps-key',\n 'points-api-url',\n 'cache-days',\n 'marker-icon-base',\n 'marker-icon-default'\n ];\n }\n\n constructor() {\n super();\n RsMap.ensureFontAwesome();\n this.root = this.attachShadow({ mode: 'open' });\n this.root.innerHTML = `\n <link rel=\"stylesheet\" href=\"${FONT_AWESOME_LOCAL_PATH}\" />\n <style>\n :host {\n display: block;\n position: relative;\n width: 100%;\n height: var(--map-height, 520px);\n --rs-map-accent: ${DEFAULT_BRAND_COLOR};\n }\n .map-layout {\n display: grid;\n grid-template-columns: minmax(0, 2.5fr) minmax(220px, 1fr);\n gap: 16px;\n width: 100%;\n height: 100%;\n }\n .map-panel,\n #map {\n width: 100%;\n height: 100%;\n animation: mapSlide 90s infinite;\n animation-timing-function: ease-in-out; \n }\n .map-panel {\n border-radius: 8px;\n overflow: hidden;\n border: 2px solid var(--rs-map-accent);\n }\n #map {\n background: #f5f5f5;\n }\n .component-shell {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n .component-message {\n margin: 0;\n font-size: 1rem;\n color: #555;\n text-align: center;\n padding: 24px 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 1;\n }\n .component-message[hidden] {\n display: none;\n }\n .map-layout[hidden] {\n display: none;\n }\n .points-panel {\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n border-top: 4px solid var(--rs-map-accent);\n padding: 16px;\n font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n background: #fff;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n .panel-message {\n margin: 0;\n font-size: 0.95rem;\n color: #555;\n text-align: center;\n padding: 32px 12px;\n }\n .panel-content[hidden] {\n display: none;\n }\n .points-panel h2 {\n margin: 0 0 8px;\n font-size: 1rem;\n color: var(--rs-map-accent);\n }\n .zone-filters {\n display: flex;\n gap: 8px;\n margin-bottom: 12px;\n overflow-x: auto;\n padding-bottom: 8px;\n flex-wrap: nowrap;\n }\n .zone-button {\n border: 1px solid var(--rs-map-accent);\n border-radius: 999px;\n padding: 6px 12px;\n font-size: 0.85rem;\n background: transparent;\n color: var(--rs-map-accent);\n cursor: pointer;\n transition: background 0.2s ease, color 0.2s ease;\n text-align: center;\n white-space: nowrap;\n }\n .zone-button:hover,\n .zone-button:focus-visible {\n background: var(--rs-map-accent);\n color: #fff;\n }\n .zone-button.is-active {\n background: var(--rs-map-accent);\n color: #fff;\n }\n .zone-button--secondary {\n flex-shrink: 0;\n border-color: #444;\n color: #444;\n }\n .zone-button--secondary i {\n margin-right: 6px;\n }\n .panel-header {\n margin-bottom: 12px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n }\n .panel-header h2[data-panel-title] {\n margin: 0;\n font-size: 1.25rem;\n }\n .zones-container {\n display: flex;\n flex-direction: column;\n gap: 16px;\n flex: 1;\n overflow-y: auto;\n }\n .zone-section {\n border-top: 2px solid #eee;\n padding-top: 12px;\n }\n .zone-section[hidden] {\n display: none;\n }\n .zone-section__header {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n margin: 0 0 8px;\n font-weight: 600;\n color: #333;\n }\n .zone-section__empty {\n margin: 0;\n font-size: 0.85rem;\n color: #777;\n }\n .zone-section__list {\n display: flex;\n flex-direction: column;\n gap: 10px;\n }\n .point-card {\n border: 1px solid #e6e6e6;\n border-radius: 8px;\n padding: 10px;\n background: #fff;\n display: flex;\n flex-direction: column;\n gap: 6px;\n overflow: hidden;\n transition: border 0.2s ease, box-shadow 0.2s ease;\n }\n .point-card--highlight {\n border: 2px solid var(--rs-map-accent);\n box-shadow: 0 0 0 2px rgba(30, 136, 229, 0.2);\n animation: highlightFade 3s forwards;\n }\n @keyframes highlightFade {\n 0% {\n border-color: var(--rs-map-accent);\n box-shadow: 0 0 0 2px rgba(30, 136, 229, 0.2);\n }\n 80% {\n border-color: #111;\n box-shadow: 0 0 0 2px rgba(17, 17, 17, 0.2);\n }\n 100% {\n border-color: #e6e6e6;\n box-shadow: none;\n }\n }\n .point-card__title {\n margin: -10px -10px 8px;\n padding: 10px;\n font-size: 0.95rem;\n font-weight: 600;\n text-align: center;\n color: #fff;\n background: var(--rs-map-accent);\n }\n .point-card__focus {\n border: 1px solid var(--rs-map-accent);\n border-radius: 999px;\n padding: 4px 12px;\n font-size: 0.8rem;\n background: transparent;\n color: var(--rs-map-accent);\n cursor: pointer;\n }\n .point-card__focus:hover,\n .point-card__focus:focus-visible {\n background: var(--rs-map-accent);\n color: #fff;\n }\n .point-card__map-actions {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 8px;\n align-self: flex-start;\n margin-top: 8px;\n }\n .point-card__mobile-navigation {\n display: none;\n align-items: center;\n flex-wrap: wrap;\n gap: 8px;\n }\n .point-card__mobile-nav-link {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n border: 1px solid var(--rs-map-accent);\n border-radius: 999px;\n padding: 4px 12px;\n background: var(--rs-map-accent);\n color: #fff;\n font-size: 0.8rem;\n text-decoration: none;\n }\n .point-card__mobile-nav-link:hover,\n .point-card__mobile-nav-link:focus-visible {\n filter: brightness(0.94);\n }\n .point-card__coordinate-warning {\n display: flex;\n align-items: center;\n gap: 6px;\n border: 1px solid #d6dbe3;\n border-radius: 999px;\n padding: 4px 12px;\n background: #f8fafc;\n color: #4b5563;\n font-size: 0.8rem;\n line-height: 1.35;\n align-self: flex-start;\n margin-top: 8px;\n }\n .point-card__coordinate-warning i {\n color: #6b7280;\n }\n @media (max-width: 768px) {\n .map-layout {\n grid-template-columns: 1fr;\n }\n .map-panel {\n display: none;\n }\n .panel-header {\n flex-direction: column;\n align-items: stretch;\n }\n .zone-filters {\n flex-wrap: wrap;\n }\n .point-card__focus {\n display: none;\n }\n .point-card__mobile-navigation {\n display: flex;\n }\n }\n .point-card__address,\n .point-card__meta,\n .point-card__contact {\n margin: 0;\n font-size: 0.85rem;\n color: #555;\n }\n .point-card__contact {\n margin: 0 0 6px;\n font-size: 0.85rem;\n color: #555;\n }\n .point-card__contact-title {\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: 600;\n color: #333;\n margin-bottom: 4px;\n }\n .point-card__phone-list {\n list-style: none;\n padding: 0;\n margin: 0;\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n .point-card__phone-item {\n display: flex;\n gap: 8px;\n align-items: flex-start;\n }\n .point-card__phone-icon {\n width: 16px;\n display: inline-flex;\n justify-content: center;\n color: var(--rs-map-accent);\n font-size: 0.85rem;\n }\n .point-card__phone-content {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n .point-card__phone-name {\n font-weight: 600;\n color: #333;\n }\n .point-card__phone-number {\n font-family: 'Segoe UI', system-ui, sans-serif;\n font-size: 0.85rem;\n }\n .point-card__phone-number--link {\n color: var(--rs-map-accent);\n text-decoration: none;\n }\n .point-card__phone-number--link:hover,\n .point-card__phone-number--link:focus-visible {\n text-decoration: underline;\n }\n .point-card__address-block {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n .point-card__details {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin-top: 6px;\n }\n .point-card__details[hidden] {\n display: none;\n }\n .point-card__toggle {\n border: 1px solid var(--rs-map-accent);\n border-radius: 16px;\n padding: 4px 10px;\n background: transparent;\n color: var(--rs-map-accent);\n font-size: 0.8rem;\n cursor: pointer;\n align-self: flex-start;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n }\n .point-card__toggle:hover,\n .point-card__toggle:focus-visible {\n background: var(--rs-map-accent);\n color: #fff;\n }\n .point-card__actions {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 6px;\n margin-top: 8px;\n }\n .point-card__action {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 0.8rem;\n }\n .point-card__actions a.point-card__action {\n color: var(--rs-map-accent);\n text-decoration: none;\n border-bottom: 1px solid transparent;\n }\n .point-card__actions a.point-card__action:hover,\n .point-card__actions a.point-card__action:focus-visible {\n border-color: currentColor;\n }\n .point-card__actions .point-card__action i {\n font-size: 0.85rem;\n }\n .point-card__actions .point-card__action--text {\n color: #444;\n }\n .point-card__extra {\n margin: 0;\n font-size: 0.8rem;\n color: #444;\n }\n .point-card__extra a {\n color: var(--rs-map-accent);\n text-decoration: none;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n }\n .point-card__extra a:hover,\n .point-card__extra a:focus-visible {\n color: #444;\n text-decoration: underline;\n }\n .point-card__extra-icon {\n font-size: 0.75rem;\n }\n .empty-state {\n margin: 0;\n font-size: 0.9rem;\n color: #777;\n text-align: center;\n }\n .points-panel p {\n margin: 0;\n color: #666;\n font-size: 0.9rem;\n }\n .point-modal-overlay {\n position: absolute;\n inset: 0;\n z-index: 30;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 16px;\n background: rgba(0, 0, 0, 0.48);\n font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n }\n .point-modal-overlay[hidden] {\n display: none;\n }\n .point-modal {\n width: min(560px, 100%);\n max-height: calc(100% - 16px);\n border-radius: 8px;\n overflow: hidden;\n background: #f7f7fb;\n color: #151515;\n box-shadow: 0 18px 48px rgba(0, 0, 0, 0.32);\n display: flex;\n flex-direction: column;\n }\n .point-modal__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 14px 18px;\n background: #000;\n color: #fff;\n }\n .point-modal__title {\n margin: 0;\n font-size: 1.15rem;\n font-weight: 700;\n line-height: 1.2;\n }\n .point-modal__close {\n border: 0;\n width: 34px;\n height: 34px;\n border-radius: 50%;\n background: transparent;\n color: #fff;\n cursor: pointer;\n font-size: 1.1rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n .point-modal__close:hover,\n .point-modal__close:focus-visible {\n background: rgba(255, 255, 255, 0.14);\n }\n .point-modal__body {\n padding: 20px 24px 24px;\n overflow-y: auto;\n line-height: 1.45;\n }\n .point-modal__cover {\n width: calc(100% + 48px);\n max-height: 300px;\n object-fit: cover;\n margin: -20px -24px 18px;\n display: block;\n background: #e5e7eb;\n }\n .point-modal__section {\n margin: 0 0 20px;\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n .point-modal__section:last-child {\n margin-bottom: 0;\n }\n .point-modal__line {\n margin: 0;\n font-size: 0.95rem;\n color: #242424;\n }\n .point-modal__label {\n font-weight: 700;\n }\n .point-modal__phone-list {\n list-style: none;\n padding: 0;\n margin: 4px 0 0;\n display: flex;\n flex-direction: column;\n gap: 3px;\n }\n .point-modal__phone-item {\n font-size: 0.94rem;\n color: #222;\n }\n .point-modal__extra {\n margin: 0;\n font-size: 0.94rem;\n color: #242424;\n }\n .point-modal__extra a,\n .point-modal__link {\n color: #111;\n font-weight: 600;\n text-decoration: none;\n border-bottom: 1px solid currentColor;\n }\n .point-modal__extra a:hover,\n .point-modal__extra a:focus-visible,\n .point-modal__link:hover,\n .point-modal__link:focus-visible {\n color: var(--rs-map-accent);\n }\n .point-modal__actions {\n display: flex;\n flex-wrap: wrap;\n gap: 10px;\n }\n @media (max-width: 768px) {\n .point-modal-overlay {\n position: fixed;\n }\n .point-modal {\n max-height: calc(100dvh - 24px);\n }\n .point-modal__body {\n padding: 16px 18px 20px;\n }\n .point-modal__cover {\n width: calc(100% + 36px);\n margin: -16px -18px 16px;\n }\n }\n </style>\n <div class=\"component-shell\">\n <p class=\"component-message\" data-component-message>Cargando puntos...</p>\n <div class=\"map-layout\" data-map-layout hidden>\n <div class=\"map-panel\">\n <div id=\"map\"></div>\n </div>\n <aside class=\"points-panel\" aria-live=\"polite\">\n <div class=\"zone-filters\" role=\"group\" aria-label=\"Filtrar por zona\">\n <button class=\"zone-button\" type=\"button\" data-zone=\"norte\" data-label=\"Zona Norte\" aria-pressed=\"false\">Zona Norte</button>\n <button class=\"zone-button\" type=\"button\" data-zone=\"rm\" data-label=\"RM\" aria-pressed=\"false\">RM</button>\n <button class=\"zone-button\" type=\"button\" data-zone=\"centro\" data-label=\"Zona Centro\" aria-pressed=\"false\">Zona Centro</button>\n <button class=\"zone-button\" type=\"button\" data-zone=\"sur\" data-label=\"Zona Sur\" aria-pressed=\"false\">Zona Sur</button>\n </div>\n <div class=\"panel-header\">\n <h2 data-panel-title>Puntos del mapa</h2>\n <button class=\"zone-button zone-button--secondary\" type=\"button\" data-action=\"nearest\">\n <i class=\"fa-solid fa-location-dot\" aria-hidden=\"true\"></i>\n Buscar tienda cercana\n </button>\n </div>\n <div class=\"zones-container\" data-zone-container></div>\n </aside>\n </div>\n </div>\n <div class=\"point-modal-overlay\" data-point-modal-overlay hidden>\n <section class=\"point-modal\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"rs-map-point-modal-title\">\n <header class=\"point-modal__header\">\n <h2 class=\"point-modal__title\" id=\"rs-map-point-modal-title\" data-point-modal-title></h2>\n <button class=\"point-modal__close\" type=\"button\" data-point-modal-close aria-label=\"Cerrar\">\n <i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"></i>\n </button>\n </header>\n <div class=\"point-modal__body\" data-point-modal-body></div>\n </section>\n </div>\n `;\n }\n\n connectedCallback() {\n this.mapEl = this.root.querySelector<HTMLDivElement>('#map')!;\n this.panelTitleEl = this.root.querySelector<HTMLElement>('[data-panel-title]')!;\n this.zonesContainer = this.root.querySelector<HTMLElement>('[data-zone-container]')!;\n this.componentMessageEl = this.root.querySelector<HTMLElement>('[data-component-message]')!;\n this.mapLayoutEl = this.root.querySelector<HTMLElement>('[data-map-layout]')!;\n this.pointModalOverlayEl = this.root.querySelector<HTMLElement>('[data-point-modal-overlay]')!;\n this.pointModalTitleEl = this.root.querySelector<HTMLElement>('[data-point-modal-title]')!;\n this.pointModalBodyEl = this.root.querySelector<HTMLElement>('[data-point-modal-body]')!;\n this.pointModalCloseButton = this.root.querySelector<HTMLButtonElement>('[data-point-modal-close]')!;\n this.zoneButtons = Array.from(this.root.querySelectorAll<HTMLButtonElement>('[data-zone]'));\n this.nearestButton = this.root.querySelector<HTMLButtonElement>('[data-action=\"nearest\"]')!;\n this.zoneButtons.forEach((btn) => btn.addEventListener('click', this.handleZoneButtonClick));\n if (this.nearestButton) {\n this.nearestButton.addEventListener('click', this.handleNearestClick);\n }\n this.pointModalOverlayEl.addEventListener('click', this.handlePointModalOverlayClick);\n this.pointModalCloseButton.addEventListener('click', this.closePointModal);\n window.addEventListener('keydown', this.handlePointModalKeydown);\n this.updateZoneButtons();\n this.setMapHeight(this.getAttribute('height'));\n this.setComponentState('loading');\n this.syncAttributesToState();\n }\n\n disconnectedCallback() {\n this.pointsController?.abort();\n this.zoneButtons.forEach((btn) => btn.removeEventListener('click', this.handleZoneButtonClick));\n if (this.nearestButton) {\n this.nearestButton.removeEventListener('click', this.handleNearestClick);\n }\n this.pointModalOverlayEl?.removeEventListener('click', this.handlePointModalOverlayClick);\n this.pointModalCloseButton?.removeEventListener('click', this.closePointModal);\n window.removeEventListener('keydown', this.handlePointModalKeydown);\n }\n\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null) {\n if (name === 'marca') {\n this.setMarca(newValue ?? '');\n } else if (name === 'tipo') {\n this.setTipo(newValue ?? '');\n } else if (name === 'height') {\n this.setMapHeight(newValue);\n } else if (name === 'google-maps-key') {\n this.setGoogleMapsKey(newValue);\n } else if (name === 'points-api-url') {\n this.setPointsApiUrl(newValue);\n } else if (name === 'cache-days') {\n this.setCacheDays(newValue);\n } else if (name === 'marker-icon-base') {\n this.setMarkerIconBase(newValue);\n } else if (name === 'marker-icon-default') {\n this.setDefaultMarkerIcon(newValue);\n }\n }\n\n private loadGoogleMaps() {\n if ((window as any)._rsGoogleMapsLoaded) {\n return Promise.resolve().then(() => {\n this.initMap();\n });\n }\n\n if (!this.googleMapsApiKey) {\n console.error('Falta la clave de Google Maps. Define el atributo \"google-maps-key\" en <rs-map>.');\n return Promise.resolve();\n }\n\n if (!RsMap.googleMapsLoaderPromise) {\n RsMap.googleMapsLoaderPromise = new Promise<void>((resolve, reject) => {\n const existingScript = document.querySelector<HTMLScriptElement>('script[data-rs-google-maps=\"true\"]');\n if (existingScript) {\n existingScript.addEventListener('load', () => resolve(), { once: true });\n existingScript.addEventListener(\n 'error',\n () => reject(new Error('Error al cargar la API de Google Maps')),\n { once: true }\n );\n return;\n }\n\n const script = document.createElement('script');\n const params = new URLSearchParams({\n key: this.googleMapsApiKey,\n v: 'weekly'\n });\n script.src = `https://maps.googleapis.com/maps/api/js?${params.toString()}`;\n script.async = true;\n script.defer = true;\n script.dataset.rsGoogleMaps = 'true';\n\n script.onload = () => {\n (window as any)._rsGoogleMapsLoaded = true;\n resolve();\n };\n\n script.onerror = () => {\n RsMap.googleMapsLoaderPromise = null;\n reject(new Error('Error al cargar la API de Google Maps'));\n };\n\n document.head.appendChild(script);\n });\n }\n\n return RsMap.googleMapsLoaderPromise\n .then(() => {\n (window as any)._rsGoogleMapsLoaded = true;\n this.initMap();\n })\n .catch((error) => {\n console.error(error instanceof Error ? error.message : 'Error al cargar la API de Google Maps');\n });\n }\n\n private initMap() {\n const g = (window as any).google;\n if (!g) {\n console.error('Google Maps aun no esta disponible.');\n return;\n }\n\n const initialCenter = this.getInitialCenter();\n this.map = new g.maps.Map(this.mapEl, {\n center: initialCenter,\n zoom: 14,\n mapTypeId: 'roadmap'\n });\n if (this.points.length) {\n this.updateMarkers(this.points);\n }\n }\n\n private getInitialCenter() {\n const firstPoint = this.getFirstValidPoint();\n if (firstPoint) {\n return firstPoint;\n }\n return { lat: -33.4489, lng: -70.6693 };\n }\n\n private getFirstValidPoint(): MapPosition | null {\n for (const point of this.points) {\n const position = this.getPointPosition(point);\n if (position) {\n return position;\n }\n }\n return null;\n }\n\n private syncAttributesToState() {\n this.isSyncingInitialAttributes = true;\n this.setMarca(this.getAttribute('marca') ?? '');\n this.setTipo(this.getAttribute('tipo') ?? '');\n this.setGoogleMapsKey(this.getAttribute('google-maps-key'));\n this.setPointsApiUrl(this.getAttribute('points-api-url'));\n this.setCacheDays(this.getAttribute('cache-days'));\n this.setMarkerIconBase(this.getAttribute('marker-icon-base'));\n this.setDefaultMarkerIcon(this.getAttribute('marker-icon-default'));\n this.isSyncingInitialAttributes = false;\n this.queueRefreshPoints();\n }\n\n private setMapHeight(value: string | null) {\n const normalized = (value ?? '').trim();\n if (!normalized) {\n this.mapHeight = '';\n this.style.removeProperty('--map-height');\n return;\n }\n this.mapHeight = normalized;\n this.style.setProperty('--map-height', normalized);\n }\n\n private setGoogleMapsKey(value: string | null) {\n this.googleMapsApiKey = (value ?? '').trim();\n if (this.googleMapsApiKey && this.isConnected) {\n void this.loadGoogleMaps();\n }\n }\n\n private setPointsApiUrl(value: string | null) {\n const normalized = (value ?? '').trim();\n this.pointsApiUrl = normalized || DEFAULT_POINTS_API_URL;\n if (this.pointsApiUrl && this.isConnected && !this.isSyncingInitialAttributes) {\n this.queueRefreshPoints();\n }\n }\n\n private setCacheDays(value: string | null) {\n const normalized = (value ?? '').trim();\n if (!normalized) {\n this.pointsCacheTtlMs = DEFAULT_POINTS_CACHE_TTL_MS;\n return;\n }\n\n const days = Number(normalized);\n if (!Number.isFinite(days) || days < 0) {\n this.pointsCacheTtlMs = DEFAULT_POINTS_CACHE_TTL_MS;\n return;\n }\n\n this.pointsCacheTtlMs = days * 24 * 60 * 60 * 1000;\n }\n\n private setMarkerIconBase(value: string | null) {\n const normalized = (value ?? '').trim();\n if (!normalized) {\n this.markerIconBaseUrl = '';\n return;\n }\n this.markerIconBaseUrl = normalized.endsWith('/') ? normalized : `${normalized}/`;\n }\n\n private setDefaultMarkerIcon(value: string | null) {\n this.defaultMarkerIconUrl = (value ?? '').trim();\n }\n\n private setMarca(value: string) {\n this.marca = value.trim();\n this.marcaKey = this.normalizeBrandKey(this.marca);\n this.applyBrandColor();\n if (!this.isSyncingInitialAttributes) {\n this.queueRefreshPoints();\n }\n }\n\n private setTipo(value: string) {\n this.tipo = value.trim();\n this.tipoCode = this.normalizeTipo(this.tipo);\n this.updatePanelTitle();\n if (!this.isSyncingInitialAttributes) {\n this.queueRefreshPoints();\n }\n }\n\n private queueRefreshPoints() {\n if (this.refreshQueued) {\n return;\n }\n this.refreshQueued = true;\n queueMicrotask(() => {\n this.refreshQueued = false;\n void this.refreshPoints();\n });\n }\n\n get marcaFilter() {\n return this.marca;\n }\n\n get tipoFilter() {\n return this.tipo;\n }\n\n private updatePanelTitle() {\n if (!this.panelTitleEl) {\n return;\n }\n const label = this.getTipoLabel();\n this.panelTitleEl.textContent = label ?? 'Puntos del mapa';\n }\n\n private getTipoLabel() {\n if (this.tipoCode !== null && this.tipoCode in TYPE_LABELS) {\n return TYPE_LABELS[this.tipoCode];\n }\n const normalized = this.tipo.trim().toLowerCase();\n const normalizedCode = normalized && normalized in TYPE_CODES ? TYPE_CODES[normalized] : null;\n if (normalizedCode !== null && normalizedCode in TYPE_LABELS) {\n return TYPE_LABELS[normalizedCode];\n }\n return null;\n }\n\n private applyBrandColor() {\n const color = BRAND_COLORS[this.marcaKey] ?? DEFAULT_BRAND_COLOR;\n this.style.setProperty('--rs-map-accent', color);\n }\n\n private normalizeTipo(value: string): number | null {\n if (!value) {\n return null;\n }\n const normalized = value.trim().toLowerCase();\n if (normalized in TYPE_CODES) {\n return TYPE_CODES[normalized];\n }\n const numeric = Number(normalized);\n if (Number.isFinite(numeric) && (numeric === 0 || numeric === 1)) {\n return numeric;\n }\n return null;\n }\n\n private async refreshPoints() {\n if (!this.isConnected || !this.marca || this.tipoCode === null) {\n return;\n }\n\n if (!this.pointsApiUrl) {\n console.error('Falta la URL de la API de puntos. Define el atributo \"points-api-url\" en <rs-map>.');\n this.setComponentState('error');\n return;\n }\n\n this.pointsController?.abort();\n const controller = new AbortController();\n this.pointsController = controller;\n\n const marcaRequestValue = this.getMarcaRequestValue();\n const params = new URLSearchParams({\n marca: marcaRequestValue,\n tipo: String(this.tipoCode)\n });\n\n const hasQuery = this.pointsApiUrl.includes('?');\n const needsAmp = hasQuery && !/[?&]$/.test(this.pointsApiUrl);\n const separator = hasQuery ? (needsAmp ? '&' : '') : '?';\n const requestUrl = `${this.pointsApiUrl}${separator}${params.toString()}`;\n const cacheKey = this.getPointsCacheKey(requestUrl);\n const cachedPayload = await this.readPointsCache(cacheKey);\n const hasFreshCache = cachedPayload && Date.now() - cachedPayload.timestamp < this.pointsCacheTtlMs;\n const localFallbackPayload = cachedPayload ? null : await this.getLocalPointsFallback(marcaRequestValue, this.tipoCode);\n\n if (cachedPayload) {\n this.applyPointsPayload(cachedPayload.data);\n this.setComponentState('ready');\n if (hasFreshCache) {\n return;\n }\n } else if (localFallbackPayload) {\n this.applyPointsPayload(localFallbackPayload);\n this.setComponentState('ready');\n } else {\n this.setComponentState('loading');\n }\n\n try {\n const response = await fetch(requestUrl, {\n signal: controller.signal\n });\n\n if (!response.ok) {\n throw new Error(`Respuesta ${response.status}`);\n }\n\n const payload = await response.json();\n if (!Array.isArray(payload)) {\n throw new Error('La respuesta de puntos no es valida.');\n }\n const typedPayload = payload as MapPointApi[];\n await this.writePointsCache(cacheKey, typedPayload);\n this.applyPointsPayload(typedPayload);\n this.setComponentState('ready');\n } catch (error) {\n if (error instanceof DOMException && error.name === 'AbortError') {\n return;\n }\n if (cachedPayload || localFallbackPayload) {\n console.warn('Se mantienen puntos locales por error al refrescar el mapa', error);\n return;\n }\n console.error('No se pudieron cargar los puntos del mapa', error);\n this.setComponentState('error');\n }\n }\n\n private applyPointsPayload(payload: MapPointApi[]) {\n this.points = this.transformPoints(payload);\n this.reportUnmappablePoints(this.points);\n this.renderPoints(this.points);\n this.initialViewApplied = false;\n this.updateMarkers(this.points);\n }\n\n private reportUnmappablePoints(points: MapPoint[]) {\n const unmappablePoints = points\n .filter((point) => !this.getPointPosition(point))\n .map((point) => ({\n id: point.id,\n titulo: point.titulo,\n direccion: point.direccion,\n lat: point.lat,\n lng: point.lng\n }));\n\n if (unmappablePoints.length) {\n console.warn('Puntos con coordenadas fuera de rango o invalidas; no se muestran como markers.', unmappablePoints);\n }\n }\n\n private getPointsCacheKey(requestUrl: string) {\n return `rs-map:points:${requestUrl}`;\n }\n\n private async getLocalPointsFallback(marca: string, tipoCode: number): Promise<MapPointApi[] | null> {\n const normalizedBrand = this.normalizeBrandKey(marca);\n const path = `../json/PuntosMapas_${normalizedBrand}_${tipoCode}.json`;\n const existingRequest = this.localPointsRequests.get(path);\n if (existingRequest) {\n return existingRequest;\n }\n\n const loader = LOCAL_POINTS_LOADERS[path];\n if (!loader) {\n return null;\n }\n\n const request = loader()\n .then((payload) => {\n const parsedPayload = this.parseLocalPointsPayload(payload);\n return parsedPayload?.length ? parsedPayload : null;\n })\n .catch(() => null);\n\n this.localPointsRequests.set(path, request);\n return request;\n }\n\n private parseLocalPointsPayload(value: unknown): MapPointApi[] | null {\n if (!Array.isArray(value)) {\n return null;\n }\n\n return value as MapPointApi[];\n }\n\n private async readPointsCache(cacheKey: string): Promise<PointsCacheEntry | null> {\n const dbEntry = await this.readPointsCacheFromIndexedDb(cacheKey);\n if (dbEntry) {\n return dbEntry;\n }\n\n try {\n const raw = window.localStorage.getItem(cacheKey);\n if (!raw) {\n return null;\n }\n const parsed = JSON.parse(raw) as PointsCacheEntry;\n if (!parsed || !Array.isArray(parsed.data) || !Number.isFinite(parsed.timestamp)) {\n window.localStorage.removeItem(cacheKey);\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n }\n\n private async writePointsCache(cacheKey: string, payload: MapPointApi[]) {\n const entry: PointsCacheEntry = {\n timestamp: Date.now(),\n data: payload\n };\n\n await this.writePointsCacheToIndexedDb(cacheKey, entry);\n\n try {\n window.localStorage.setItem(cacheKey, JSON.stringify(entry));\n } catch {\n // Ignore storage errors and keep runtime behavior.\n }\n }\n\n private async readPointsCacheFromIndexedDb(cacheKey: string): Promise<PointsCacheEntry | null> {\n const db = await RsMap.openPointsCacheDb();\n if (!db) {\n return null;\n }\n\n return new Promise((resolve) => {\n const transaction = db.transaction(POINTS_CACHE_STORE_NAME, 'readonly');\n const store = transaction.objectStore(POINTS_CACHE_STORE_NAME);\n const request = store.get(cacheKey);\n\n request.onsuccess = () => {\n const result = request.result as PointsCacheRecord | undefined;\n if (!result || !Array.isArray(result.data) || !Number.isFinite(result.timestamp)) {\n resolve(null);\n return;\n }\n resolve({\n timestamp: result.timestamp,\n data: result.data\n });\n };\n\n request.onerror = () => resolve(null);\n });\n }\n\n private async writePointsCacheToIndexedDb(cacheKey: string, entry: PointsCacheEntry) {\n const db = await RsMap.openPointsCacheDb();\n if (!db) {\n return;\n }\n\n await new Promise<void>((resolve) => {\n const transaction = db.transaction(POINTS_CACHE_STORE_NAME, 'readwrite');\n const store = transaction.objectStore(POINTS_CACHE_STORE_NAME);\n const request = store.put({\n key: cacheKey,\n timestamp: entry.timestamp,\n data: entry.data\n } satisfies PointsCacheRecord);\n\n request.onsuccess = () => resolve();\n request.onerror = () => resolve();\n });\n }\n\n private static openPointsCacheDb(): Promise<IDBDatabase | null> {\n if (typeof window === 'undefined' || !('indexedDB' in window)) {\n return Promise.resolve(null);\n }\n\n if (!RsMap.pointsCacheDbPromise) {\n RsMap.pointsCacheDbPromise = new Promise((resolve) => {\n const request = window.indexedDB.open(POINTS_CACHE_DB_NAME, 1);\n\n request.onupgradeneeded = () => {\n const db = request.result;\n if (!db.objectStoreNames.contains(POINTS_CACHE_STORE_NAME)) {\n db.createObjectStore(POINTS_CACHE_STORE_NAME, { keyPath: 'key' });\n }\n };\n\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => resolve(null);\n });\n }\n\n return RsMap.pointsCacheDbPromise;\n }\n\n private transformPoints(payload: MapPointApi[]): MapPoint[] {\n return payload.map((point) => ({\n ...point,\n zone: this.getZoneForPoint(point)\n }));\n }\n\n private renderPoints(points: MapPoint[]) {\n if (!this.zonesContainer) {\n return;\n }\n\n const grouped = this.groupPoints(points);\n this.pointsByZone = grouped;\n this.updateZoneButtonCounts();\n\n const fragment = document.createDocumentFragment();\n\n ZONE_ORDER.forEach((zoneKey) => {\n const section = document.createElement('section');\n section.className = 'zone-section';\n section.dataset.zoneSection = zoneKey;\n\n const header = document.createElement('div');\n header.className = 'zone-section__header';\n const title = document.createElement('span');\n title.textContent = ZONE_LABELS[zoneKey];\n header.appendChild(title);\n section.appendChild(header);\n\n if (grouped[zoneKey].length === 0) {\n const empty = document.createElement('p');\n empty.className = 'zone-section__empty';\n empty.textContent = 'Sin puntos en esta zona.';\n section.appendChild(empty);\n } else {\n const list = document.createElement('div');\n list.className = 'zone-section__list';\n grouped[zoneKey].forEach((point) => {\n list.appendChild(this.createPointCard(point));\n });\n section.appendChild(list);\n }\n\n fragment.appendChild(section);\n });\n\n this.zonesContainer.replaceChildren(fragment);\n this.updateZoneVisibility();\n }\n\n private groupPoints(points: MapPoint[]): Record<ZoneKey, MapPoint[]> {\n const grouped: Record<ZoneKey, MapPoint[]> = {\n norte: [],\n rm: [],\n centro: [],\n sur: []\n };\n points.forEach((point) => {\n grouped[point.zone].push(point);\n });\n return grouped;\n }\n\n private createPointCard(point: MapPoint) {\n const card = document.createElement('article');\n card.className = 'point-card';\n card.dataset.pointId = String(point.id);\n const coordinateWarning = this.getPointCoordinateWarning(point);\n\n const title = document.createElement('h3');\n title.className = 'point-card__title';\n title.textContent = point.titulo || 'Sin nombre';\n card.appendChild(title);\n\n const addressBlock = document.createElement('div');\n addressBlock.className = 'point-card__address-block';\n\n const address = document.createElement('p');\n address.className = 'point-card__address';\n address.textContent = point.direccion || 'Sin direccion';\n addressBlock.appendChild(address);\n\n if (point.comuna_name) {\n const comuna = document.createElement('p');\n comuna.className = 'point-card__meta';\n comuna.textContent = point.comuna_name;\n addressBlock.appendChild(comuna);\n }\n\n if (point.provincia_name) {\n const provincia = document.createElement('p');\n provincia.className = 'point-card__meta';\n provincia.textContent = point.provincia_name;\n addressBlock.appendChild(provincia);\n }\n\n if (point.region_name) {\n const regionLine = document.createElement('p');\n regionLine.className = 'point-card__meta';\n regionLine.textContent = point.region_name;\n addressBlock.appendChild(regionLine);\n }\n\n card.appendChild(addressBlock);\n\n let mapPositionElement: HTMLElement | null = null;\n const position = this.getPointPosition(point);\n if (position) {\n const mapActions = document.createElement('div');\n mapActions.className = 'point-card__map-actions';\n\n const focusButton = document.createElement('button');\n focusButton.type = 'button';\n focusButton.className = 'point-card__focus';\n const icon = this.createIconElement('fa-solid fa-location-crosshairs');\n focusButton.appendChild(icon);\n focusButton.appendChild(document.createTextNode(' Ver en el mapa'));\n focusButton.addEventListener('click', () => {\n void this.focusPointWithZoom(position.lat, position.lng);\n this.scrollToPointCard(point.id);\n });\n mapActions.appendChild(focusButton);\n mapActions.appendChild(this.createMobileNavigationActions(position));\n mapPositionElement = mapActions;\n } else if (coordinateWarning) {\n const warning = document.createElement('div');\n warning.className = 'point-card__coordinate-warning';\n const icon = this.createIconElement('fa-solid fa-circle-info');\n warning.appendChild(icon);\n const text = document.createElement('span');\n text.textContent = coordinateWarning;\n warning.appendChild(text);\n mapPositionElement = warning;\n }\n\n const details = document.createElement('div');\n details.className = 'point-card__details';\n details.hidden = true;\n let hasDetails = false;\n\n const actions = document.createElement('div');\n actions.className = 'point-card__actions';\n let mapLinkElement: HTMLAnchorElement | null = null;\n\n if (point.url && point.url !== '#') {\n const siteLink = document.createElement('a');\n siteLink.href = point.url;\n siteLink.target = '_blank';\n siteLink.rel = 'noopener noreferrer';\n siteLink.className = 'point-card__action';\n const icon = this.createIconElement('fa-solid fa-globe');\n siteLink.appendChild(icon);\n siteLink.appendChild(document.createTextNode('Sitio web'));\n actions.appendChild(siteLink);\n }\n\n if (point.email) {\n const emailLink = document.createElement('a');\n emailLink.href = `mailto:${point.email}`;\n emailLink.target = '_blank';\n emailLink.rel = 'noopener noreferrer';\n emailLink.className = 'point-card__action point-card__action--text';\n const icon = this.createIconElement('fa-solid fa-envelope');\n emailLink.appendChild(icon);\n emailLink.appendChild(document.createTextNode(point.email));\n actions.appendChild(emailLink);\n }\n\n if (actions.childElementCount) {\n details.appendChild(actions);\n hasDetails = true;\n }\n\n if (point.telefonos?.length) {\n const contactSection = document.createElement('div');\n contactSection.className = 'point-card__contact';\n const contactTitle = document.createElement('div');\n contactTitle.className = 'point-card__contact-title';\n const icon = this.createIconElement('fa-solid fa-phone');\n contactTitle.appendChild(icon);\n contactTitle.appendChild(document.createTextNode('Telefonos'));\n contactSection.appendChild(contactTitle);\n\n const phoneList = document.createElement('ul');\n phoneList.className = 'point-card__phone-list';\n\n point.telefonos\n .slice()\n .sort((a, b) => a.orden - b.orden)\n .forEach((phone) => {\n const item = document.createElement('li');\n item.className = 'point-card__phone-item';\n\n const iconWrapper = document.createElement('span');\n iconWrapper.className = 'point-card__phone-icon';\n const hasWhatsapp = this.isWhatsappPhone(phone);\n if (hasWhatsapp) {\n const whatsappIcon = this.createIconElement('fa-brands fa-whatsapp');\n iconWrapper.appendChild(whatsappIcon);\n } else {\n iconWrapper.textContent = '-';\n }\n item.appendChild(iconWrapper);\n\n const content = document.createElement('div');\n content.className = 'point-card__phone-content';\n\n const name = document.createElement('span');\n name.className = 'point-card__phone-name';\n name.textContent = phone.nombre;\n content.appendChild(name);\n\n const numberEl = hasWhatsapp ? document.createElement('a') : document.createElement('span');\n numberEl.className = 'point-card__phone-number';\n if (hasWhatsapp) {\n const link = this.getWhatsappLink(phone.telefono);\n if (link) {\n (numberEl as HTMLAnchorElement).href = link;\n (numberEl as HTMLAnchorElement).target = '_blank';\n (numberEl as HTMLAnchorElement).rel = 'noopener noreferrer';\n numberEl.classList.add('point-card__phone-number--link');\n }\n }\n numberEl.textContent = phone.telefono;\n content.appendChild(numberEl);\n\n item.appendChild(content);\n phoneList.appendChild(item);\n });\n\n contactSection.appendChild(phoneList);\n details.appendChild(contactSection);\n hasDetails = true;\n }\n\n if (point.adicional) {\n const extra = document.createElement('p');\n extra.className = 'point-card__extra';\n extra.innerHTML = point.adicional;\n extra.querySelectorAll('a').forEach((link) => {\n link.classList.add('point-card__extra-link');\n const icon = this.createIconElement('fa-solid fa-arrow-up-right-from-square');\n icon.classList.add('point-card__extra-icon');\n link.appendChild(icon);\n });\n details.appendChild(extra);\n hasDetails = true;\n }\n\n if (point.googlelink) {\n mapLinkElement = document.createElement('a');\n mapLinkElement.href = point.googlelink;\n mapLinkElement.target = '_blank';\n mapLinkElement.rel = 'noopener noreferrer';\n mapLinkElement.className = 'point-card__action';\n const icon = this.createIconElement('fa-solid fa-map-location-dot');\n mapLinkElement.appendChild(icon);\n mapLinkElement.appendChild(document.createTextNode('Google Maps'));\n }\n\n if (mapLinkElement) {\n const mapWrapper = document.createElement('div');\n mapWrapper.className = 'point-card__actions';\n mapWrapper.appendChild(mapLinkElement);\n details.appendChild(mapWrapper);\n hasDetails = true;\n }\n\n if (hasDetails) {\n const toggle = document.createElement('button');\n toggle.type = 'button';\n toggle.className = 'point-card__toggle';\n const toggleIcon = this.createIconElement('fa-solid fa-circle-info');\n const toggleText = document.createElement('span');\n toggleText.textContent = 'Mas informacion';\n toggle.appendChild(toggleIcon);\n toggle.appendChild(toggleText);\n toggle.addEventListener('click', () => {\n const isHidden = details.hidden;\n details.hidden = !isHidden;\n toggleText.textContent = isHidden ? 'Ocultar informacion' : 'Mas informacion';\n toggleIcon.className = isHidden ? 'fa-solid fa-circle-xmark' : 'fa-solid fa-circle-info';\n });\n card.appendChild(toggle);\n card.appendChild(details);\n }\n\n if (mapPositionElement) {\n card.appendChild(mapPositionElement);\n }\n\n return card;\n }\n\n private createMobileNavigationActions(position: MapPosition) {\n const actions = document.createElement('div');\n actions.className = 'point-card__mobile-navigation';\n actions.appendChild(\n this.createMobileNavigationLink(\n `https://www.google.com/maps/dir/?api=1&destination=${position.lat},${position.lng}&travelmode=driving`,\n 'Ir con Google Maps',\n 'fa-brands fa-google'\n )\n );\n actions.appendChild(\n this.createMobileNavigationLink(\n `https://waze.com/ul?ll=${position.lat},${position.lng}&navigate=yes`,\n 'Ir con Waze',\n 'fa-brands fa-waze'\n )\n );\n return actions;\n }\n\n private createMobileNavigationLink(url: string, label: string, iconClass: string) {\n const link = document.createElement('a');\n link.href = url;\n link.target = '_blank';\n link.rel = 'noopener noreferrer';\n link.className = 'point-card__mobile-nav-link';\n link.appendChild(this.createIconElement(iconClass));\n link.appendChild(document.createTextNode(label));\n return link;\n }\n\n private getZoneForPoint(point: MapPointApi): ZoneKey {\n const normalizedRegion = this.normalizeRegionName(point.region_name || '');\n if (normalizedRegion && normalizedRegion in REGION_ZONE_MAP) {\n return REGION_ZONE_MAP[normalizedRegion];\n }\n if (normalizedRegion.includes('metropolitana')) {\n return 'rm';\n }\n if (\n normalizedRegion.includes('araucania') ||\n normalizedRegion.includes('rios') ||\n normalizedRegion.includes('lagos') ||\n normalizedRegion.includes('aysen') ||\n normalizedRegion.includes('magallanes')\n ) {\n return 'sur';\n }\n if (\n normalizedRegion.includes('arica') ||\n normalizedRegion.includes('tarapaca') ||\n normalizedRegion.includes('antofagasta') ||\n normalizedRegion.includes('atacama') ||\n normalizedRegion.includes('coquimbo')\n ) {\n return 'norte';\n }\n return 'centro';\n }\n\n private normalizeRegionName(input: string) {\n return input\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .trim();\n }\n\n private getMarcaRequestValue() {\n const normalized = this.normalizeBrandToken(this.marca);\n return BRAND_ALIASES[normalized] ?? this.marca;\n }\n\n private normalizeBrandKey(value: string) {\n const normalized = this.normalizeBrandToken(value);\n if (!normalized) {\n return 'default';\n }\n return BRAND_ALIASES[normalized] ?? normalized;\n }\n\n private normalizeBrandToken(value: string) {\n const normalized = value\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/[^a-z0-9]+/g, '');\n return normalized;\n }\n\n private getMarkerIcon(point?: Pick<MapPointApi, 'tipo'>) {\n const key = this.marcaKey || 'default';\n const localIconUrl = this.getLocalMarkerIconUrl(key, point);\n if (localIconUrl) {\n return localIconUrl;\n }\n if (this.markerIconBaseUrl) {\n return `${this.markerIconBaseUrl}${key}.png`;\n }\n if (this.defaultMarkerIconUrl) {\n return this.defaultMarkerIconUrl;\n }\n return null;\n }\n\n private getLocalMarkerIconUrl(key: string, point?: Pick<MapPointApi, 'tipo'>) {\n const pointTipoCode = point ? Number(point.tipo) : NaN;\n const tipoCode = Number.isFinite(pointTipoCode) ? pointTipoCode : this.tipoCode;\n const fileName = tipoCode === 1 ? `${key}_distribuidor.png` : `${key}.png`;\n return LOCAL_MARKER_ICON_URLS[`../pin/${fileName}`] ?? null;\n }\n\n private getPointCoordinateWarning(point: Pick<MapPointApi, 'lat' | 'lng'>) {\n if (this.getPointPosition(point)) {\n return null;\n }\n\n const lat = Number(point.lat);\n const lng = Number(point.lng);\n const rawCoordinates = `lat ${point.lat || 'sin dato'}, lng ${point.lng || 'sin dato'}`;\n if (!Number.isFinite(lat) || !Number.isFinite(lng)) {\n return `Ubicacion por revisar: ${rawCoordinates}.`;\n }\n return `Ubicacion por revisar: ${rawCoordinates}.`;\n }\n\n private getPointPosition(point: Pick<MapPointApi, 'lat' | 'lng'>): MapPosition | null {\n const lat = Number(point.lat);\n const lng = Number(point.lng);\n if (!this.isMappableCoordinate(lat, lng)) {\n return null;\n }\n return { lat, lng };\n }\n\n private isMappableCoordinate(lat: number, lng: number) {\n return (\n Number.isFinite(lat) &&\n Number.isFinite(lng) &&\n lat >= CONTINENTAL_CHILE_BOUNDS.minLat &&\n lat <= CONTINENTAL_CHILE_BOUNDS.maxLat &&\n lng >= CONTINENTAL_CHILE_BOUNDS.minLng &&\n lng <= CONTINENTAL_CHILE_BOUNDS.maxLng\n );\n }\n\n private updateMarkers(points: MapPoint[]) {\n const g = (window as any).google;\n if (!g || !this.map) {\n return;\n }\n this.markers.forEach((marker) => marker.setMap(null));\n this.markers = [];\n\n const validPoints: Array<{ point: MapPoint; position: MapPosition }> = [];\n points.forEach((point) => {\n const position = this.getPointPosition(point);\n if (position) {\n validPoints.push({ point, position });\n }\n });\n\n if (!validPoints.length) {\n return;\n }\n\n const bounds = new g.maps.LatLngBounds();\n\n validPoints.forEach(({ point, position }) => {\n const { lat, lng } = position;\n const iconUrl = this.getMarkerIcon(point);\n const icon =\n iconUrl && this.map\n ? {\n url: iconUrl,\n scaledSize: new g.maps.Size(64, 64),\n anchor: new g.maps.Point(32, 64)\n }\n : undefined;\n const marker = new g.maps.Marker({\n map: this.map,\n position: { lat, lng },\n title: point.titulo,\n icon\n });\n marker.addListener('click', () => {\n this.openPointModal(point);\n this.scrollToPointCard(point.id);\n });\n this.markers.push(marker);\n const markerPosition = marker.getPosition();\n if (markerPosition) {\n bounds.extend(markerPosition);\n }\n });\n\n if (!this.initialViewApplied && this.markers.length) {\n const position = this.markers[0].getPosition();\n if (position) {\n this.map.setCenter(position);\n this.map.setZoom(14);\n this.initialViewApplied = true;\n return;\n }\n }\n\n if (this.markers.length === 1) {\n const position = this.markers[0].getPosition();\n if (position) {\n this.map.setCenter(position);\n }\n this.map.setZoom(14);\n } else {\n this.map.fitBounds(bounds);\n }\n }\n\n private openPointModal(point: MapPoint) {\n if (!this.pointModalOverlayEl || !this.pointModalTitleEl || !this.pointModalBodyEl) {\n return;\n }\n this.pointModalTitleEl.textContent = point.titulo || 'Sin nombre';\n this.pointModalBodyEl.replaceChildren(this.createPointModalContent(point));\n this.pointModalOverlayEl.removeAttribute('hidden');\n this.pointModalCloseButton?.focus();\n }\n\n private closePointModal = () => {\n if (!this.pointModalOverlayEl) {\n return;\n }\n this.pointModalOverlayEl.setAttribute('hidden', '');\n this.pointModalBodyEl?.replaceChildren();\n };\n\n private handlePointModalOverlayClick = (event: Event) => {\n if (event.target === this.pointModalOverlayEl) {\n this.closePointModal();\n }\n };\n\n private handlePointModalKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && this.pointModalOverlayEl && !this.pointModalOverlayEl.hasAttribute('hidden')) {\n this.closePointModal();\n }\n };\n\n private createPointModalContent(point: MapPoint) {\n const fragment = document.createDocumentFragment();\n\n if (point.portada) {\n const cover = document.createElement('img');\n cover.className = 'point-modal__cover';\n cover.src = point.portada;\n cover.alt = point.titulo || 'Imagen del punto';\n cover.loading = 'lazy';\n cover.addEventListener('error', () => cover.remove(), { once: true });\n fragment.appendChild(cover);\n }\n\n const locationSection = this.createPointModalSection();\n this.appendPointModalLine(locationSection, 'Direccion', point.direccion);\n this.appendPointModalLine(locationSection, 'Comuna', point.comuna_name);\n this.appendPointModalLine(locationSection, 'Provincia', point.provincia_name);\n this.appendPointModalLine(locationSection, 'Region', point.region_name);\n this.appendPointModalLine(locationSection, 'RUT', point.rut);\n if (locationSection.childElementCount) {\n fragment.appendChild(locationSection);\n }\n\n const contactSection = this.createPointModalSection();\n this.appendPointModalLine(contactSection, 'Correo', point.email);\n if (point.telefonos?.length) {\n const label = document.createElement('p');\n label.className = 'point-modal__line';\n const strong = document.createElement('span');\n strong.className = 'point-modal__label';\n strong.textContent = 'Telefonos:';\n label.appendChild(strong);\n contactSection.appendChild(label);\n\n const phoneList = document.createElement('ul');\n phoneList.className = 'point-modal__phone-list';\n point.telefonos\n .slice()\n .sort((a, b) => a.orden - b.orden)\n .forEach((phone) => {\n phoneList.appendChild(this.createPointModalPhoneItem(phone));\n });\n contactSection.appendChild(phoneList);\n }\n if (contactSection.childElementCount) {\n fragment.appendChild(contactSection);\n }\n\n if (point.adicional) {\n const extraSection = this.createPointModalSection();\n const extra = document.createElement('div');\n extra.className = 'point-modal__extra';\n extra.innerHTML = point.adicional;\n extra.querySelectorAll('a').forEach((link) => {\n link.target = '_blank';\n link.rel = 'noopener noreferrer';\n });\n extraSection.appendChild(extra);\n fragment.appendChild(extraSection);\n }\n\n const actions = this.createPointModalActions(point);\n if (actions.childElementCount) {\n fragment.appendChild(actions);\n }\n\n return fragment;\n }\n\n private createPointModalSection() {\n const section = document.createElement('div');\n section.className = 'point-modal__section';\n return section;\n }\n\n private appendPointModalLine(section: HTMLElement, label: string, value: string) {\n const normalized = (value ?? '').trim();\n if (!normalized || normalized === '#') {\n return;\n }\n const line = document.createElement('p');\n line.className = 'point-modal__line';\n const strong = document.createElement('span');\n strong.className = 'point-modal__label';\n strong.textContent = `${label}: `;\n line.appendChild(strong);\n line.appendChild(document.createTextNode(normalized));\n section.appendChild(line);\n }\n\n private createPointModalPhoneItem(phone: MapPointPhone) {\n const item = document.createElement('li');\n item.className = 'point-modal__phone-item';\n\n const label = document.createElement('span');\n label.className = 'point-modal__label';\n label.textContent = `${phone.nombre || 'Telefono'}: `;\n item.appendChild(label);\n\n const phoneNumber = (phone.telefono ?? '').trim();\n const whatsappLink = this.isWhatsappPhone(phone) ? this.getWhatsappLink(phoneNumber) : null;\n if (whatsappLink) {\n const link = document.createElement('a');\n link.href = whatsappLink;\n link.target = '_blank';\n link.rel = 'noopener noreferrer';\n link.className = 'point-modal__link';\n link.textContent = phoneNumber;\n item.appendChild(link);\n } else {\n item.appendChild(document.createTextNode(phoneNumber));\n }\n\n return item;\n }\n\n private createPointModalActions(point: MapPoint) {\n const actions = document.createElement('div');\n actions.className = 'point-modal__section point-modal__actions';\n\n if (point.url && point.url !== '#') {\n actions.appendChild(this.createPointModalLink(point.url, 'Sitio web'));\n }\n if (point.googlelink) {\n actions.appendChild(this.createPointModalLink(point.googlelink, 'Google Maps'));\n }\n if (point.email) {\n actions.appendChild(this.createPointModalLink(`mailto:${point.email}`, 'Enviar correo', false));\n }\n\n return actions;\n }\n\n private createPointModalLink(href: string, text: string, external = true) {\n const link = document.createElement('a');\n link.href = href;\n link.className = 'point-modal__link';\n link.textContent = text;\n if (external) {\n link.target = '_blank';\n link.rel = 'noopener noreferrer';\n }\n return link;\n }\n\n private handleZoneButtonClick = (event: Event) => {\n const button = event.currentTarget as HTMLButtonElement;\n const zone = button.dataset.zone as ZoneKey;\n if (!zone) {\n return;\n }\n this.setActiveZone(zone);\n this.scrollToZoneSection(zone);\n };\n\n private setActiveZone(_zone: ZoneFilter) {}\n\n private scrollToZoneSection(zone: ZoneKey) {\n if (!this.zonesContainer) {\n return;\n }\n const section = this.zonesContainer.querySelector<HTMLElement>(`[data-zone-section=\"${zone}\"]`);\n if (!section) {\n return;\n }\n section.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n\n private updateZoneButtons() {\n this.zoneButtons.forEach((btn) => {\n const zone = btn.dataset.zone as ZoneKey;\n const isActive = this.activeZone === zone;\n btn.classList.toggle('is-active', isActive);\n btn.setAttribute('aria-pressed', String(isActive));\n });\n }\n\n private updateZoneButtonCounts() {\n this.zoneButtons.forEach((btn) => {\n const zone = btn.dataset.zone as ZoneKey;\n const baseLabel = btn.dataset.label || btn.textContent || '';\n btn.textContent = baseLabel;\n });\n }\n\n private updateZoneVisibility() {\n if (!this.zonesContainer) {\n return;\n }\n const sections = this.zonesContainer.querySelectorAll<HTMLElement>('[data-zone-section]');\n sections.forEach((section) => {\n section.removeAttribute('hidden');\n });\n }\n\n private handleNearestClick = () => {\n if (!navigator.geolocation) {\n alert('La geolocalizacion no esta soportada en este navegador.');\n return;\n }\n navigator.geolocation.getCurrentPosition(\n (pos) => {\n const { latitude, longitude } = pos.coords;\n const nearest = this.findNearestPoint(latitude, longitude);\n if (nearest) {\n const nearestPosition = this.getPointPosition(nearest);\n if (nearestPosition) {\n this.centerMapOnPoint(nearestPosition.lat, nearestPosition.lng);\n }\n this.scrollToPointCard(nearest.id);\n } else {\n alert('No hay puntos disponibles para calcular la tienda cercana.');\n }\n },\n () => {\n alert('No se pudo obtener tu ubicacion.');\n }\n );\n };\n\n private findNearestPoint(lat: number, lng: number): MapPoint | null {\n if (!this.points.length) {\n return null;\n }\n let nearest: MapPoint | null = null;\n let bestDistance = Infinity;\n this.points.forEach((point) => {\n const position = this.getPointPosition(point);\n if (!position) {\n return;\n }\n const distance = this.haversine(lat, lng, position.lat, position.lng);\n if (distance < bestDistance) {\n bestDistance = distance;\n nearest = point;\n }\n });\n return nearest;\n }\n\n private haversine(lat1: number, lon1: number, lat2: number, lon2: number) {\n const toRad = (deg: number) => (deg * Math.PI) / 180;\n const R = 6371e3;\n const dLat = toRad(lat2 - lat1);\n const dLon = toRad(lon2 - lon1);\n const a =\n Math.sin(dLat / 2) * Math.sin(dLat / 2) +\n Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) * Math.sin(dLon / 2) * Math.sin(dLon / 2);\n const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n return R * c;\n }\n\n private scrollToPointCard(pointId: number) {\n if (!this.zonesContainer) {\n return;\n }\n const card = this.zonesContainer.querySelector<HTMLElement>(`[data-point-id=\"${pointId}\"]`);\n if (!card) {\n return;\n }\n card.scrollIntoView({ behavior: 'smooth', block: 'center' });\n this.highlightPointCard(card);\n }\n\n private highlightPointCard(card: HTMLElement) {\n if (this.highlightTimeout !== null) {\n clearTimeout(this.highlightTimeout);\n this.highlightTimeout = null;\n }\n this.zonesContainer?.querySelectorAll('.point-card--highlight').forEach((el) => {\n el.classList.remove('point-card--highlight');\n });\n card.classList.add('point-card--highlight');\n this.highlightTimeout = window.setTimeout(() => {\n card.classList.remove('point-card--highlight');\n this.highlightTimeout = null;\n }, 3500);\n }\n\n private setComponentState(state: 'loading' | 'ready' | 'error') {\n if (!this.componentMessageEl || !this.mapLayoutEl) {\n return;\n }\n if (state === 'ready') {\n this.componentMessageEl.setAttribute('hidden', '');\n this.mapLayoutEl.removeAttribute('hidden');\n } else {\n const text = state === 'loading' ? 'Cargando puntos...' : 'Mapa temporalmente no disponible';\n this.componentMessageEl.textContent = text;\n this.componentMessageEl.removeAttribute('hidden');\n this.mapLayoutEl.setAttribute('hidden', '');\n }\n }\n\n private centerMapOnPoint(lat: number, lng: number, targetZoom = 14) {\n const g = (window as any).google;\n if (!g || !this.map || !Number.isFinite(lat) || !Number.isFinite(lng)) {\n return;\n }\n const currentZoom = typeof this.map.getZoom === 'function' ? this.map.getZoom() : null;\n const needsZoom = !currentZoom || currentZoom < targetZoom;\n this.animateMapPan(lat, lng, () => {\n if (needsZoom) {\n this.map.setZoom(targetZoom);\n }\n });\n }\n\n private async focusPointWithZoom(lat: number, lng: number) {\n const g = (window as any).google;\n if (!g || !this.map || !Number.isFinite(lat) || !Number.isFinite(lng)) {\n return;\n }\n\n await this.animateZoomTo(8, 800);\n await this.wait(500);\n await new Promise<void>((resolve) => {\n this.animateMapPan(lat, lng, resolve);\n });\n await this.wait(500);\n await this.animateZoomTo(18, 800);\n }\n\n private wait(ms: number) {\n return new Promise<void>((resolve) => {\n window.setTimeout(resolve, ms);\n });\n }\n\n private async animateZoomTo(targetZoom: number, duration = 600) {\n const g = (window as any).google;\n if (\n !g ||\n !this.map ||\n typeof this.map.getZoom !== 'function' ||\n typeof this.map.setZoom !== 'function'\n ) {\n return;\n }\n const startZoom = this.map.getZoom();\n if (!Number.isFinite(startZoom)) {\n this.map.setZoom(targetZoom);\n return;\n }\n const delta = targetZoom - startZoom;\n if (Math.abs(delta) < 0.01) {\n this.map.setZoom(targetZoom);\n return;\n }\n\n await new Promise<void>((resolve) => {\n const startTime = performance.now();\n const ease = (t: number) => 1 - Math.pow(1 - t, 3);\n\n const step = (now: number) => {\n const elapsed = now - startTime;\n const progress = Math.min(elapsed / duration, 1);\n const eased = ease(progress);\n const nextZoom = startZoom + delta * eased;\n this.map.setZoom(Math.round(nextZoom * 100) / 100);\n if (progress < 1) {\n requestAnimationFrame(step);\n } else {\n this.map.setZoom(targetZoom);\n resolve();\n }\n };\n\n requestAnimationFrame(step);\n });\n }\n\n private animateMapPan(targetLat: number, targetLng: number, onComplete?: () => void) {\n const g = (window as any).google;\n if (!g || !this.map) {\n return;\n }\n if (this.panAnimationFrame !== null) {\n cancelAnimationFrame(this.panAnimationFrame);\n this.panAnimationFrame = null;\n }\n const startCenter = this.map.getCenter();\n if (!startCenter) {\n this.map.setCenter({ lat: targetLat, lng: targetLng });\n onComplete?.();\n return;\n }\n const startLat = startCenter.lat();\n const startLng = startCenter.lng();\n const deltaLat = targetLat - startLat;\n const deltaLng = targetLng - startLng;\n const duration = 600;\n const startTime = performance.now();\n\n const ease = (t: number) => 1 - Math.pow(1 - t, 3);\n\n const step = (now: number) => {\n const elapsed = now - startTime;\n const progress = Math.min(elapsed / duration, 1);\n const eased = ease(progress);\n const nextLat = startLat + deltaLat * eased;\n const nextLng = startLng + deltaLng * eased;\n this.map.setCenter({ lat: nextLat, lng: nextLng });\n if (progress < 1) {\n this.panAnimationFrame = requestAnimationFrame(step);\n } else {\n this.panAnimationFrame = null;\n onComplete?.();\n }\n };\n\n this.panAnimationFrame = requestAnimationFrame(step);\n }\n\n private static ensureFontAwesome() {\n if (RsMap.fontAwesomeAttached) {\n return;\n }\n const existing = document.querySelector(`link[href=\"${FONT_AWESOME_LOCAL_PATH}\"]`);\n if (existing) {\n RsMap.fontAwesomeAttached = true;\n return;\n }\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = FONT_AWESOME_LOCAL_PATH;\n link.crossOrigin = 'anonymous';\n link.referrerPolicy = 'no-referrer';\n link.addEventListener('load', () => {\n RsMap.fontAwesomeAttached = true;\n });\n document.head.appendChild(link);\n }\n\n private createIconElement(className: string) {\n const icon = document.createElement('i');\n icon.className = className;\n icon.setAttribute('aria-hidden', 'true');\n return icon;\n }\n\n private isWhatsappPhone(phone: MapPointPhone) {\n return Boolean(phone.whatsapp || phone.watshapp);\n }\n\n private getWhatsappLink(phone: string) {\n const digits = phone.replace(/\\D+/g, '');\n if (!digits) {\n return null;\n }\n return `https://wa.me/${digits}`;\n }\n}\n","export default \"<?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\"?>\\r\\n<!-- Svg Vector Icons : http://www.onlinewebfonts.com/icon -->\\r\\n<!DOCTYPE svg PUBLIC \\\"-//W3C//DTD SVG 1.1//EN\\\" \\\"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\\\">\\r\\n<svg version=\\\"1.1\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\" xmlns:xlink=\\\"http://www.w3.org/1999/xlink\\\" x=\\\"0px\\\" y=\\\"0px\\\" viewBox=\\\"0 0 1000 1000\\\" enable-background=\\\"new 0 0 1000 1000\\\" xml:space=\\\"preserve\\\" style=\\\"fill: #ffffff;\\\">\\r\\n<metadata> Svg Vector Icons : http://www.onlinewebfonts.com/icon </metadata>\\r\\n<g><path d=\\\"M965.1,437.2c-24.9-8.4-52.2-8.7-78.1-13.5c-41.3-8.3-45.5-55.5-61.6-87c-17.4-27.9-1.8-58.7,17.9-80.2c16.7-22.2,45.4-50.8,21.8-78.9c-22.1-17.9-37.3-48.8-67.4-53.1c-30.2,2.7-50,30-74.7,45.2c-33.8,26.5-71.6-3.8-105.1-14.8c-30.2-6.9-45.2-36.2-45.6-65.2c-5.5-27.6-1.1-66.3-34.8-76.6c-36.1-3.3-99-13.6-104.1,37.7c-7.8,33.8-0.3,78.4-36.1,97.9c-30.8,10.5-59.5,30.1-92.3,31.9c-38.2-5.7-59.8-46-96.2-55.8c-32.6-2.2-48.3,31.8-70.7,49.7c-23.6,20.9-7.6,51.7,9.9,70.3c18.9,24.9,47.2,54.4,28.4,87.8c-16.4,31.3-19.6,75.8-57,89.7c-29.6,7.7-62.6,3.9-89.8,18.5c-25.6,30-28.1,94.8,5.4,120.4c36.3,14.9,84.8,0.8,111.7,35.3c13.3,29.6,28.4,59.5,35.6,91.1c-0.7,43.9-48.4,67.1-58.2,107.8c9.5,38.8,52.5,81.3,96.4,74.3c33.2-16.3,57.3-56.9,98.4-51.3c30.2,11.8,62.2,21.7,89.5,39.2c29.7,30.2,13.4,78.3,33.4,112.9c29.9,25.7,94.7,28.3,120.1-5.4c14.8-36.3,0.9-84.9,35.2-111.8c29.5-13.3,59.5-28.4,91-35.6c42.3,0,64.7,46,103.3,56c32.5,2.2,48.3-31.8,70.7-49.7c24.5-22.1,6.1-53.2-11.6-72.5c-18.9-24-45-53.3-26.7-85.6c16.4-31.3,19.6-75.7,57-89.6c29.6-7.7,62.6-4,89.8-18.5C996.1,527.5,998.6,462.7,965.1,437.2z M577.6,593.4c-21.6,18-49.5,28-77.5,27.9c-79.1,3-142.8-83.6-116.4-158.4c20.6-76,121.1-111.4,184.6-64.9C634.9,439.4,640,545.6,577.6,593.4z\\\"/></g>\\r\\n</svg>\"","export default \"<?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\"?>\\r\\n<!-- Svg Vector Icons : http://www.onlinewebfonts.com/icon -->\\r\\n<!DOCTYPE svg PUBLIC \\\"-//W3C//DTD SVG 1.1//EN\\\" \\\"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\\\">\\r\\n<svg version=\\\"1.1\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\" xmlns:xlink=\\\"http://www.w3.org/1999/xlink\\\" x=\\\"0px\\\" y=\\\"0px\\\" viewBox=\\\"0 0 1000 1000\\\" enable-background=\\\"new 0 0 1000 1000\\\" xml:space=\\\"preserve\\\" style=\\\"fill: #ffffff;\\\">\\r\\n<metadata> Svg Vector Icons : http://www.onlinewebfonts.com/icon </metadata>\\r\\n<g><g><g><path d=\\\"M171.2,451.6c-89,0-161.2,72.2-161.2,161.2c0,89,72.2,161.2,161.2,161.2c65,0,120.9-38.6,146.4-94l38.3,29.5c0,0,281.5,2,296.9-6.7c0,0-34.9-95.4,9.4-135.7c4.7-4.2,10.5-9.1,17-14.2c-7.4,18.5-11.6,38.7-11.6,59.9c0,89,72.2,161.2,161.2,161.2c89,0,161.2-72.2,161.2-161.2c0-89.1-72.2-161.2-161.2-161.2c-1.5,0-2.9,0.2-4.3,0.2c11.6-7.6,19.1-12.3,19.1-12.3l-12.1-10.8c0,0,34.9-8,26.9-25.5c-8.1-17.5-92.7-122.3-92.7-122.3s15-32.2-16-55.1l-14.9,32.2c0,0-38-26.2-53.1-21.2c-15.1,5-37.8,7.6-44.8,18.6l-7,6.6c0,0-2,11.6,9.6,28.7c0,0,116.4,35.8,121.9,62c0,0,8.1,16.6-26.7,20.6l-7,9.1l-18.7,1l-33.7-77.1c0,0-32.3,8.6-48.9,21.7l2.5,13.1c0,0-135.5-92.2-263,44.3c0,0-94.2,27.2-160.2-56.4c0,0-1-27.2-160.2-22.2l11.1,11.6c0,0-11.1,1-15.6,8.1c-4.5,7,2.5,14.6,38.8,14.6c0,0,82.1,93.7,145.1,88.2l89.7,43.3l39.8,68c0,0,0.1,5.8,0.5,14.8c-9.2,2-19.6,4.2-30.6,6.5C302.9,497.9,242.5,451.6,171.2,451.6z M828.8,501c61.7,0,111.8,50.2,111.8,111.8c0,61.7-50.2,111.8-111.8,111.8c-61.7,0-111.8-50.2-111.8-111.8C717,551.2,767.1,501,828.8,501z M171.2,724.7c-61.6,0-111.8-50.2-111.8-111.8c0-61.7,50.2-111.8,111.8-111.8c47.4,0,87.9,29.7,104.1,71.4c-59.3,12.6-118.1,25.2-118.1,25.2l7.6,41.8l116.1-5.1C270.9,685.7,225.5,724.7,171.2,724.7z M364.8,630.6c3.3,11.2,7.6,20.1,13.2,23.9l-51.8,2c2.2-7.9,3.9-16.1,4.9-24.5L364.8,630.6z\\\"/></g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g><g></g></g>\\r\\n</svg>\"","const DEFAULT_LABEL = 'WhatsApp';\nconst DEFAULT_ARIA_LABEL = 'Contactar por WhatsApp';\nconst DEFAULT_MENU_LABEL = 'compra de motos';\nconst DEFAULT_CLOSED_MESSAGE = 'En este momento no es posible atender su solicitud. Le invitamos a contactarnos dentro de nuestro horario de atencion.';\nconst DEFAULT_WHATSAPP_COLOR = '#25d366';\nconst DEFAULT_BRAND_COLOR = '#000000';\nconst DEFAULT_OPTION_ICON = 'motorcycle';\nconst WHATSAPP_BASE_URL = 'https://wa.me/';\nconst OPTION_ICON_SVGS = import.meta.glob('../ws/*.svg', {\n eager: true,\n import: 'default',\n query: '?raw'\n}) as Record<string, string>;\nconst BRAND_COLORS: Record<string, string> = {\n gasgas: '#cb0d25',\n hqv: '#002550',\n ktm: '#ff6600',\n rs: '#000000',\n voge: '#000000'\n};\nconst BRAND_ALIASES: Record<string, string> = {\n gas: 'gasgas',\n gasgas: 'gasgas',\n husqvarna: 'hqv'\n};\nconst DAY_ALIASES: Record<string, number> = {\n '0': 0,\n '7': 0,\n dom: 0,\n domingo: 0,\n sun: 0,\n sunday: 0,\n '1': 1,\n lun: 1,\n lunes: 1,\n mon: 1,\n monday: 1,\n '2': 2,\n mar: 2,\n martes: 2,\n tue: 2,\n tuesday: 2,\n '3': 3,\n mie: 3,\n miercoles: 3,\n wed: 3,\n wednesday: 3,\n '4': 4,\n jue: 4,\n jueves: 4,\n thu: 4,\n thursday: 4,\n '5': 5,\n vie: 5,\n viernes: 5,\n fri: 5,\n friday: 5,\n '6': 6,\n sab: 6,\n sabado: 6,\n sat: 6,\n saturday: 6\n};\nconst WEEKDAY_SHORT_BY_ENGLISH: Record<string, number> = {\n sun: 0,\n mon: 1,\n tue: 2,\n wed: 3,\n thu: 4,\n fri: 5,\n sat: 6\n};\nconst OPTION_ICON_SVGS_BY_KEY = Object.fromEntries(\n Object.entries(OPTION_ICON_SVGS).map(([path, svg]) => {\n const name = path.split('/').pop()?.replace(/\\.svg$/i, '') ?? '';\n return [normalizeToken(name), normalizeIconSvg(svg)];\n })\n);\n\ninterface WhatsappMenuOption {\n label: string;\n telefono: string;\n mensaje: string;\n target: string;\n icon: string;\n}\n\nfunction normalizeIconSvg(svg: string) {\n return svg\n .replace(/<\\?xml[\\s\\S]*?\\?>\\s*/i, '')\n .replace(/<!DOCTYPE[\\s\\S]*?>\\s*/i, '')\n .replace(/<metadata>[\\s\\S]*?<\\/metadata>\\s*/i, '')\n .replace(/<svg\\b/i, '<svg class=\"menu-link-icon\" aria-hidden=\"true\" focusable=\"false\"')\n .replace(/style=\"fill:\\s*#ffffff;?\"/i, 'style=\"fill: currentColor;\"');\n}\n\nfunction normalizeToken(value: string) {\n return value\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '');\n}\n\nexport class RsWhatsapp extends HTMLElement {\n static tag = 'rs-whatsapp';\n\n private root: ShadowRoot;\n private buttonEl!: HTMLButtonElement;\n private menuEl!: HTMLElement;\n private generatedOptionsEl!: HTMLElement;\n private customMenuSlotEl!: HTMLSlotElement;\n private closedMessageEl!: HTMLElement;\n private closedMessageTextEl!: HTMLElement;\n private labelEl!: HTMLSpanElement;\n private childrenObserver?: MutationObserver;\n\n static get observedAttributes() {\n return [\n 'telefono',\n 'mensaje',\n 'label',\n 'menu-label',\n 'aria-label',\n 'position',\n 'show-label',\n 'target',\n 'marca',\n 'icon',\n 'horario',\n 'fuera-horario',\n 'mensaje-fuera-horario',\n 'time-zone'\n ];\n }\n\n constructor() {\n super();\n this.root = this.attachShadow({ mode: 'open' });\n this.root.innerHTML = `\n <style>\n :host {\n position: fixed;\n right: var(--rs-whatsapp-right, 24px);\n bottom: var(--rs-whatsapp-bottom, 24px);\n z-index: var(--rs-whatsapp-z-index, 9999);\n display: inline-block;\n --rs-whatsapp-brand-color: ${DEFAULT_WHATSAPP_COLOR};\n font-family: var(--rs-whatsapp-font-family, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif);\n }\n :host([position=\"bottom-left\"]) {\n right: auto;\n left: var(--rs-whatsapp-left, 24px);\n bottom: var(--rs-whatsapp-bottom, 24px);\n top: auto;\n }\n :host([position=\"top-right\"]) {\n right: var(--rs-whatsapp-right, 24px);\n left: auto;\n bottom: auto;\n top: var(--rs-whatsapp-top, 24px);\n }\n :host([position=\"top-left\"]) {\n right: auto;\n left: var(--rs-whatsapp-left, 24px);\n bottom: auto;\n top: var(--rs-whatsapp-top, 24px);\n }\n .button {\n box-sizing: border-box;\n border: 0;\n width: var(--rs-whatsapp-size, 60px);\n min-width: var(--rs-whatsapp-size, 60px);\n height: var(--rs-whatsapp-size, 60px);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n border-radius: 999px;\n background: var(--rs-whatsapp-bg, ${DEFAULT_WHATSAPP_COLOR});\n color: var(--rs-whatsapp-color, #ffffff);\n box-shadow: var(--rs-whatsapp-shadow, 0 10px 24px rgb(0 0 0 / 22%));\n cursor: pointer;\n font: inherit;\n transition: transform 0.2s ease, box-shadow 0.2s ease, filter 0.2s ease;\n outline: none;\n }\n .button:hover,\n .button:focus-visible {\n transform: translateY(-2px);\n filter: brightness(1.03);\n box-shadow: var(--rs-whatsapp-shadow-hover, 0 14px 28px rgb(0 0 0 / 26%));\n }\n .button:active {\n transform: translateY(0);\n }\n .icon-stack {\n width: calc(var(--rs-whatsapp-size, 60px) * 0.52);\n height: calc(var(--rs-whatsapp-size, 60px) * 0.52);\n position: relative;\n flex: 0 0 auto;\n display: block;\n }\n .icon-stack svg {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n display: block;\n transition: opacity 0.18s ease, transform 0.22s ease;\n }\n .whatsapp-icon {\n opacity: 1;\n transform: rotate(0deg) scale(1);\n }\n .close-icon {\n opacity: 0;\n transform: rotate(-90deg) scale(0.72);\n }\n :host([open]) .whatsapp-icon {\n opacity: 0;\n transform: rotate(90deg) scale(0.72);\n }\n :host([open]) .close-icon {\n opacity: 1;\n transform: rotate(0deg) scale(1);\n }\n .label {\n display: none;\n max-width: 180px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: 0.95rem;\n font-weight: 700;\n line-height: 1;\n }\n :host([show-label]) .button {\n width: auto;\n min-width: var(--rs-whatsapp-size, 60px);\n padding: 0 20px 0 16px;\n }\n :host([show-label]) .label {\n display: inline;\n }\n .menu {\n box-sizing: border-box;\n position: absolute;\n right: 0;\n bottom: calc(var(--rs-whatsapp-size, 60px) + 12px);\n width: min(var(--rs-whatsapp-menu-width, 280px), calc(100vw - 32px));\n padding: 8px;\n border: 1px solid var(--rs-whatsapp-menu-border, #e5e7eb);\n border-radius: var(--rs-whatsapp-menu-radius, 8px);\n background: var(--rs-whatsapp-menu-bg, #ffffff);\n color: var(--rs-whatsapp-menu-color, #111827);\n box-shadow: var(--rs-whatsapp-menu-shadow, 0 18px 38px rgb(0 0 0 / 18%));\n transform-origin: bottom right;\n }\n .menu[hidden] {\n display: none;\n }\n .menu-heading {\n padding: 10px 12px 12px;\n border-bottom: 1px solid var(--rs-whatsapp-menu-border, #e5e7eb);\n margin-bottom: 6px;\n text-align: center;\n }\n .menu-welcome,\n .menu-question {\n display: block;\n margin: 0;\n font-size: 0.92rem;\n font-weight: 600;\n line-height: 1.35;\n color: var(--rs-whatsapp-menu-muted, #4b5563);\n }\n .menu-brand {\n display: block;\n margin: 2px 0;\n font-size: 1.2rem;\n font-weight: 800;\n line-height: 1.2;\n color: var(--rs-whatsapp-menu-brand, #111827);\n }\n .menu-options {\n display: grid;\n gap: 2px;\n }\n .menu-options[hidden] {\n display: none;\n }\n .closed-message {\n margin: 0;\n padding: 14px 12px;\n border-radius: 6px;\n background: var(--rs-whatsapp-closed-bg, #f3f4f6);\n color: var(--rs-whatsapp-closed-color, #374151);\n font-size: 0.95rem;\n font-weight: 600;\n line-height: 1.35;\n text-align: center;\n white-space: pre-line;\n }\n .closed-message[hidden],\n slot[hidden] {\n display: none;\n }\n :host([position=\"bottom-left\"]) .menu {\n right: auto;\n left: 0;\n transform-origin: bottom left;\n }\n :host([position=\"top-right\"]) .menu {\n top: calc(var(--rs-whatsapp-size, 60px) + 12px);\n bottom: auto;\n transform-origin: top right;\n }\n :host([position=\"top-left\"]) .menu {\n top: calc(var(--rs-whatsapp-size, 60px) + 12px);\n right: auto;\n bottom: auto;\n left: 0;\n transform-origin: top left;\n }\n .menu-link,\n ::slotted(a),\n ::slotted(button) {\n box-sizing: border-box;\n width: 100%;\n min-height: 44px;\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 14px;\n border: 0;\n border-radius: 6px;\n background: transparent;\n color: inherit;\n font: inherit;\n font-size: 0.95rem;\n font-weight: 700;\n line-height: 1.2;\n text-align: left;\n text-decoration: none;\n cursor: pointer;\n }\n .menu-link:hover,\n .menu-link:focus-visible,\n ::slotted(a:hover),\n ::slotted(a:focus-visible),\n ::slotted(button:hover),\n ::slotted(button:focus-visible) {\n background: var(--rs-whatsapp-menu-hover-bg, #f3f4f6);\n outline: none;\n }\n .menu-link[aria-disabled=\"true\"] {\n cursor: not-allowed;\n opacity: 0.62;\n }\n .menu-link-icon {\n width: 44px;\n height: 32px;\n flex: 0 0 auto;\n color: var(--rs-whatsapp-menu-icon-color, var(--rs-whatsapp-brand-color));\n }\n @media (max-width: 640px) {\n :host {\n right: var(--rs-whatsapp-mobile-right, 16px);\n bottom: var(--rs-whatsapp-mobile-bottom, 16px);\n }\n :host([position=\"bottom-left\"]) {\n left: var(--rs-whatsapp-mobile-left, 16px);\n }\n :host([position=\"top-right\"]) {\n top: var(--rs-whatsapp-mobile-top, 16px);\n }\n :host([position=\"top-left\"]) {\n left: var(--rs-whatsapp-mobile-left, 16px);\n top: var(--rs-whatsapp-mobile-top, 16px);\n }\n :host([show-label]) .label {\n max-width: 120px;\n }\n }\n @media (prefers-reduced-motion: reduce) {\n .button,\n .icon-stack svg {\n transition: none;\n }\n }\n </style>\n <div class=\"menu\" role=\"dialog\" aria-labelledby=\"rs-whatsapp-menu-title\" hidden>\n <div class=\"menu-heading\" id=\"rs-whatsapp-menu-title\">\n <span class=\"menu-welcome\">Bienvenido a</span>\n <span class=\"menu-brand\">RS-SHOP</span>\n <span class=\"menu-question\">¿En que te podemos ayudar?</span>\n </div>\n <div class=\"closed-message\" data-closed-message hidden>\n <slot name=\"fuera-horario\">\n <span data-closed-message-text></span>\n </slot>\n </div>\n <div class=\"menu-options\" data-generated-options></div>\n <slot name=\"menu\"></slot>\n </div>\n <button class=\"button\" type=\"button\" aria-haspopup=\"dialog\" aria-expanded=\"false\">\n <span class=\"icon-stack\" aria-hidden=\"true\">\n <svg class=\"whatsapp-icon\" viewBox=\"0 0 448 512\" focusable=\"false\">\n <path fill=\"currentColor\" d=\"M380.9 97.1c-41.9-42-97.7-65.1-157-65.1-122.4 0-222 99.6-222 222 0 39.1 10.2 77.3 29.6 111L0 480l117.7-30.9c32.4 17.7 68.9 27 106.1 27h.1c122.3 0 224.1-99.6 224.1-222 0-59.3-25.2-115-67.1-157zm-157 341.6c-33.2 0-65.7-8.9-94-25.7l-6.7-4-69.8 18.3 18.6-68.1-4.4-7c-18.5-29.4-28.2-63.3-28.2-98.2 0-101.7 82.8-184.5 184.6-184.5 49.3 0 95.6 19.2 130.4 54.1s56.2 81.2 56.1 130.5c0 101.8-84.9 184.6-186.6 184.6zM325.1 300.5c-5.5-2.8-32.8-16.2-37.9-18-5.1-1.9-8.8-2.8-12.5 2.8s-14.3 18-17.6 21.8c-3.2 3.7-6.5 4.2-12 1.4-32.6-16.3-54-29.1-75.5-66-5.7-9.8 5.7-9.1 16.3-30.3 1.8-3.7.9-6.9-.5-9.7s-12.5-30.1-17.1-41.2c-4.5-10.8-9.1-9.3-12.5-9.5-3.2-.2-6.9-.2-10.6-.2s-9.7 1.4-14.8 6.9c-5.1 5.6-19.4 19-19.4 46.3s19.9 53.7 22.6 57.4c2.8 3.7 39.1 59.7 94.8 83.8 35.2 15.2 49 16.5 66.6 13.9 10.7-1.6 32.8-13.4 37.4-26.4s4.6-24.1 3.2-26.4c-1.3-2.5-5-3.9-10.5-6.6z\" />\n </svg>\n <svg class=\"close-icon\" viewBox=\"0 0 24 24\" focusable=\"false\">\n <path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.6\" d=\"M6 6l12 12M18 6L6 18\" />\n </svg>\n </span>\n <span class=\"label\"></span>\n </button>\n `;\n }\n\n connectedCallback() {\n this.buttonEl = this.root.querySelector<HTMLButtonElement>('button')!;\n this.menuEl = this.root.querySelector<HTMLElement>('.menu')!;\n this.generatedOptionsEl = this.root.querySelector<HTMLElement>('[data-generated-options]')!;\n this.customMenuSlotEl = this.root.querySelector<HTMLSlotElement>('slot[name=\"menu\"]')!;\n this.closedMessageEl = this.root.querySelector<HTMLElement>('[data-closed-message]')!;\n this.closedMessageTextEl = this.root.querySelector<HTMLElement>('[data-closed-message-text]')!;\n this.labelEl = this.root.querySelector<HTMLSpanElement>('.label')!;\n this.buttonEl.addEventListener('click', this.handleButtonClick);\n this.menuEl.addEventListener('click', this.handleMenuClick);\n this.customMenuSlotEl.addEventListener('slotchange', this.handleCustomMenuSlotChange);\n document.addEventListener('click', this.handleDocumentClick);\n document.addEventListener('keydown', this.handleDocumentKeydown);\n this.childrenObserver = new MutationObserver(this.handleChildrenMutation);\n this.childrenObserver.observe(this, {\n childList: true,\n subtree: true,\n characterData: true,\n attributes: true,\n attributeFilter: ['label', 'telefono', 'mensaje', 'target', 'icon', 'dias', 'desde', 'hasta']\n });\n this.syncAttributesToState();\n }\n\n disconnectedCallback() {\n this.buttonEl?.removeEventListener('click', this.handleButtonClick);\n this.menuEl?.removeEventListener('click', this.handleMenuClick);\n this.customMenuSlotEl?.removeEventListener('slotchange', this.handleCustomMenuSlotChange);\n document.removeEventListener('click', this.handleDocumentClick);\n document.removeEventListener('keydown', this.handleDocumentKeydown);\n this.childrenObserver?.disconnect();\n }\n\n attributeChangedCallback() {\n if (this.isConnected) {\n this.syncAttributesToState();\n }\n }\n\n private syncAttributesToState() {\n const label = (this.getAttribute('label') ?? '').trim() || DEFAULT_LABEL;\n const menuLabel = (this.getAttribute('menu-label') ?? '').trim() || DEFAULT_MENU_LABEL;\n const ariaLabel = (this.getAttribute('aria-label') ?? '').trim() || DEFAULT_ARIA_LABEL;\n const target = (this.getAttribute('target') ?? '_blank').trim() || '_blank';\n const icon = (this.getAttribute('icon') ?? DEFAULT_OPTION_ICON).trim() || DEFAULT_OPTION_ICON;\n const isClosed = this.isOutsideBusinessHours();\n\n this.labelEl.textContent = label;\n this.buttonEl.setAttribute('aria-label', ariaLabel);\n this.buttonEl.setAttribute('title', ariaLabel);\n this.syncBrandVariant();\n\n this.closedMessageTextEl.textContent = this.getClosedMessage();\n this.closedMessageEl.hidden = !isClosed;\n this.customMenuSlotEl.hidden = isClosed;\n\n if (isClosed) {\n this.generatedOptionsEl.hidden = true;\n this.generatedOptionsEl.replaceChildren();\n return;\n }\n\n this.renderMenuOptions(menuLabel, target, icon);\n }\n\n private buildWhatsappUrl(telefonoValue: string | null, mensajeValue: string | null) {\n const telefono = this.sanitizePhone(telefonoValue);\n\n if (!telefono) {\n return '';\n }\n\n const mensaje = (mensajeValue ?? '').trim();\n const query = mensaje ? `?text=${encodeURIComponent(mensaje)}` : '';\n\n return `${WHATSAPP_BASE_URL}${telefono}${query}`;\n }\n\n private sanitizePhone(value: string | null) {\n return (value ?? '').replace(/[^\\d]/g, '');\n }\n\n private syncBrandVariant() {\n const marca = (this.getAttribute('marca') ?? '').trim();\n\n if (!marca) {\n this.style.setProperty('--rs-whatsapp-brand-color', DEFAULT_WHATSAPP_COLOR);\n return;\n }\n\n const brandKey = this.normalizeBrandKey(marca);\n const color = BRAND_COLORS[brandKey] ?? DEFAULT_BRAND_COLOR;\n this.style.setProperty('--rs-whatsapp-brand-color', color);\n }\n\n private normalizeBrandKey(value: string) {\n const normalized = normalizeToken(value);\n return BRAND_ALIASES[normalized] ?? normalized;\n }\n\n private renderMenuOptions(fallbackLabel: string, fallbackTarget: string, fallbackIcon: string) {\n const hasCustomMenu = this.customMenuSlotEl.assignedElements({ flatten: true }).length > 0;\n\n if (hasCustomMenu) {\n this.generatedOptionsEl.hidden = true;\n this.generatedOptionsEl.replaceChildren();\n return;\n }\n\n const options = this.getWhatsappOptions(fallbackLabel, fallbackTarget, fallbackIcon).filter((option) => {\n return this.sanitizePhone(option.telefono);\n });\n const links = options.map((option) => this.createMenuLink(option));\n\n this.generatedOptionsEl.replaceChildren(...links);\n this.generatedOptionsEl.hidden = false;\n }\n\n private getWhatsappOptions(fallbackLabel: string, fallbackTarget: string, fallbackIcon: string): WhatsappMenuOption[] {\n const optionElements = Array.from(this.querySelectorAll<RsWhatsappOption>(RsWhatsappOption.tag));\n\n if (optionElements.length) {\n return optionElements.map((optionEl) => ({\n label: (optionEl.getAttribute('label') ?? optionEl.textContent ?? '').trim() || fallbackLabel,\n telefono: (optionEl.getAttribute('telefono') ?? '').trim(),\n mensaje: (optionEl.getAttribute('mensaje') ?? '').trim(),\n target: (optionEl.getAttribute('target') ?? fallbackTarget).trim() || fallbackTarget,\n icon: (optionEl.getAttribute('icon') ?? fallbackIcon).trim() || fallbackIcon\n }));\n }\n\n return [\n {\n label: fallbackLabel,\n telefono: (this.getAttribute('telefono') ?? '').trim(),\n mensaje: (this.getAttribute('mensaje') ?? '').trim(),\n target: fallbackTarget,\n icon: fallbackIcon\n }\n ];\n }\n\n private createMenuLink(option: WhatsappMenuOption) {\n const linkEl = document.createElement('a');\n const labelEl = document.createElement('span');\n const href = this.buildWhatsappUrl(option.telefono, option.mensaje);\n\n linkEl.className = 'menu-link';\n linkEl.rel = 'noopener noreferrer';\n linkEl.target = option.target;\n labelEl.className = 'menu-label';\n labelEl.textContent = option.label;\n const iconEl = this.createOptionIcon(option.icon);\n\n if (iconEl) {\n linkEl.append(iconEl);\n }\n\n linkEl.append(labelEl);\n\n if (href) {\n linkEl.href = href;\n linkEl.tabIndex = 0;\n return linkEl;\n }\n\n linkEl.setAttribute('aria-disabled', 'true');\n linkEl.tabIndex = -1;\n return linkEl;\n }\n\n private createOptionIcon(icon: string) {\n const iconKey = normalizeToken(icon);\n const iconSvg = iconKey === 'none' ? '' : OPTION_ICON_SVGS_BY_KEY[iconKey || DEFAULT_OPTION_ICON];\n\n if (!iconSvg) {\n return null;\n }\n\n const template = document.createElement('template');\n template.innerHTML = iconSvg;\n return template.content.firstElementChild?.cloneNode(true) ?? document.createElement('span');\n }\n\n private getClosedMessage() {\n const message = (this.getAttribute('mensaje-fuera-horario') ?? '').trim() || DEFAULT_CLOSED_MESSAGE;\n const scheduleSummary = this.getScheduleSummary();\n\n return scheduleSummary ? `${message}\\nHorario de atencion:\\n${scheduleSummary}` : message;\n }\n\n private isOutsideBusinessHours() {\n const manualClosedValue = this.getAttribute('fuera-horario');\n\n if (manualClosedValue !== null) {\n const normalized = normalizeToken(manualClosedValue);\n return normalized !== 'false' && normalized !== '0' && normalized !== 'no';\n }\n\n const schedule = this.getScheduleSegments().join(';');\n\n if (!schedule) {\n return false;\n }\n\n return !this.isWithinBusinessHours(schedule);\n }\n\n private getScheduleSegments() {\n const scheduleElements = Array.from(this.querySelectorAll<RsWhatsappSchedule>(RsWhatsappSchedule.tag));\n\n if (scheduleElements.length) {\n return scheduleElements\n .map((scheduleEl) => {\n const days = (scheduleEl.getAttribute('dias') ?? '').trim();\n const start = (scheduleEl.getAttribute('desde') ?? '').trim();\n const end = (scheduleEl.getAttribute('hasta') ?? '').trim();\n\n if (!days || !start || !end) {\n return '';\n }\n\n return `${days} ${start}-${end}`;\n })\n .filter(Boolean);\n }\n\n return (this.getAttribute('horario') ?? '')\n .split(';')\n .map((segment) => segment.trim())\n .filter(Boolean);\n }\n\n private getScheduleSummary() {\n const scheduleElements = Array.from(this.querySelectorAll<RsWhatsappSchedule>(RsWhatsappSchedule.tag));\n\n if (scheduleElements.length) {\n return scheduleElements\n .map((scheduleEl) => {\n const days = (scheduleEl.getAttribute('dias') ?? '').trim();\n const start = (scheduleEl.getAttribute('desde') ?? '').trim();\n const end = (scheduleEl.getAttribute('hasta') ?? '').trim();\n\n if (!days || !start || !end) {\n return '';\n }\n\n return `${days} ${start}-${end}`;\n })\n .filter(Boolean)\n .join('\\n');\n }\n\n return (this.getAttribute('horario') ?? '')\n .split(';')\n .map((segment) => segment.trim())\n .filter(Boolean)\n .join('\\n');\n }\n\n private isWithinBusinessHours(schedule: string) {\n const currentTime = this.getCurrentTimeParts();\n\n return schedule.split(';').some((segment) => {\n return this.isScheduleSegmentActive(segment, currentTime.day, currentTime.minutes);\n });\n }\n\n private getCurrentTimeParts() {\n const timeZone = (this.getAttribute('time-zone') ?? '').trim();\n\n if (!timeZone) {\n const now = new Date();\n return {\n day: now.getDay(),\n minutes: now.getHours() * 60 + now.getMinutes()\n };\n }\n\n try {\n const now = new Date();\n const weekday = new Intl.DateTimeFormat('en-US', {\n timeZone,\n weekday: 'short'\n })\n .format(now)\n .toLowerCase();\n const timeParts = new Intl.DateTimeFormat('en-US', {\n timeZone,\n hour12: false,\n hour: '2-digit',\n minute: '2-digit'\n }).formatToParts(now);\n const hour = Number(timeParts.find((part) => part.type === 'hour')?.value ?? 0) % 24;\n const minute = Number(timeParts.find((part) => part.type === 'minute')?.value ?? 0);\n\n return {\n day: WEEKDAY_SHORT_BY_ENGLISH[weekday] ?? now.getDay(),\n minutes: hour * 60 + minute\n };\n } catch {\n const now = new Date();\n return {\n day: now.getDay(),\n minutes: now.getHours() * 60 + now.getMinutes()\n };\n }\n }\n\n private isScheduleSegmentActive(segment: string, currentDay: number, currentMinutes: number) {\n const match = segment\n .trim()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n .match(/^(.+?)\\s+(\\d{1,2}:\\d{2})\\s*-\\s*(\\d{1,2}:\\d{2})$/);\n\n if (!match) {\n return false;\n }\n\n const days = this.parseScheduleDays(match[1]);\n const startMinutes = this.parseScheduleTime(match[2]);\n const endMinutes = this.parseScheduleTime(match[3]);\n\n if (!days.includes(currentDay) || startMinutes === null || endMinutes === null) {\n return false;\n }\n\n if (startMinutes <= endMinutes) {\n return currentMinutes >= startMinutes && currentMinutes <= endMinutes;\n }\n\n return currentMinutes >= startMinutes || currentMinutes <= endMinutes;\n }\n\n private parseScheduleDays(value: string) {\n const normalized = value\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n .replace(/\\s+/g, '');\n\n if (normalized === '*' || normalized === 'todos' || normalized === 'all') {\n return [0, 1, 2, 3, 4, 5, 6];\n }\n\n return normalized.split(',').flatMap((part) => {\n const [startToken, endToken] = part.split('-');\n const startDay = this.parseScheduleDay(startToken);\n const endDay = endToken ? this.parseScheduleDay(endToken) : startDay;\n\n if (startDay === null || endDay === null) {\n return [];\n }\n\n if (startDay === endDay) {\n return [startDay];\n }\n\n const days: number[] = [];\n let currentDay = startDay;\n\n while (true) {\n days.push(currentDay);\n\n if (currentDay === endDay) {\n return days;\n }\n\n currentDay = (currentDay + 1) % 7;\n }\n });\n }\n\n private parseScheduleDay(value: string | undefined) {\n if (!value) {\n return null;\n }\n\n const key = normalizeToken(value);\n return DAY_ALIASES[key] ?? null;\n }\n\n private parseScheduleTime(value: string) {\n const [hourValue, minuteValue] = value.split(':');\n const hour = Number(hourValue);\n const minute = Number(minuteValue);\n\n if (!Number.isInteger(hour) || !Number.isInteger(minute) || hour < 0 || hour > 23 || minute < 0 || minute > 59) {\n return null;\n }\n\n return hour * 60 + minute;\n }\n\n private setMenuOpen(isOpen: boolean) {\n this.menuEl.hidden = !isOpen;\n this.buttonEl.setAttribute('aria-expanded', String(isOpen));\n this.toggleAttribute('open', isOpen);\n }\n\n private handleButtonClick = () => {\n if (this.menuEl.hidden) {\n this.syncAttributesToState();\n }\n\n this.setMenuOpen(this.menuEl.hidden);\n };\n\n private handleMenuClick = (event: MouseEvent) => {\n const path = event.composedPath();\n const disabledLink = path.find((node) => {\n return node instanceof HTMLAnchorElement && node.getAttribute('aria-disabled') === 'true';\n });\n\n if (disabledLink) {\n event.preventDefault();\n return;\n }\n\n const interactiveElement = path.find((node) => {\n return node instanceof HTMLAnchorElement || node instanceof HTMLButtonElement;\n });\n\n if (interactiveElement) {\n this.setMenuOpen(false);\n }\n };\n\n private handleCustomMenuSlotChange = () => {\n this.syncAttributesToState();\n };\n\n private handleChildrenMutation = () => {\n this.syncAttributesToState();\n };\n\n private handleDocumentClick = (event: MouseEvent) => {\n if (this.menuEl.hidden || event.composedPath().includes(this)) {\n return;\n }\n\n this.setMenuOpen(false);\n };\n\n private handleDocumentKeydown = (event: KeyboardEvent) => {\n if (this.menuEl.hidden || event.key !== 'Escape') {\n return;\n }\n\n this.setMenuOpen(false);\n this.buttonEl.focus();\n };\n}\n\nexport class RsWhatsappOption extends HTMLElement {\n static tag = 'rs-whatsapp-option';\n}\n\nexport class RsWhatsappSchedule extends HTMLElement {\n static tag = 'rs-whatsapp-schedule';\n}\n","import { safeDefine } from './utils/define';\nimport { RsMap } from './components/rs-map';\nimport { RsWhatsapp, RsWhatsappOption, RsWhatsappSchedule } from './components/rs-whatsapp';\n\n\n// En dev, registramos directamente para probar en el navegador\nsafeDefine(RsMap.tag, RsMap);\nsafeDefine(RsWhatsappOption.tag, RsWhatsappOption);\nsafeDefine(RsWhatsappSchedule.tag, RsWhatsappSchedule);\nsafeDefine(RsWhatsapp.tag, RsWhatsapp);\n\nexport { RsMap, RsWhatsapp, RsWhatsappOption, RsWhatsappSchedule, safeDefine };\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'rs-map': RsMap;\n 'rs-whatsapp': RsWhatsapp;\n 'rs-whatsapp-option': RsWhatsappOption;\n 'rs-whatsapp-schedule': RsWhatsappSchedule;\n }\n}\n"],"names":["safeDefine","tag","Ctor","__vite_glob_1_0","__vite_glob_1_1","__vite_glob_1_2","__vite_glob_1_3","__vite_glob_1_4","__vite_glob_1_5","__vite_glob_1_6","__vite_glob_1_7","__vite_glob_1_8","__vite_glob_1_9","LOCAL_POINTS_LOADERS","m","LOCAL_MARKER_ICON_URLS","DEFAULT_BRAND_COLOR","FONT_AWESOME_LOCAL_PATH","DEFAULT_POINTS_API_URL","BRAND_COLORS","BRAND_ALIASES","TYPE_CODES","ZONE_ORDER","ZONE_LABELS","TYPE_LABELS","CONTINENTAL_CHILE_BOUNDS","DEFAULT_POINTS_CACHE_TTL_MS","POINTS_CACHE_DB_NAME","POINTS_CACHE_STORE_NAME","REGION_ZONE_MAP","_RsMap","__publicField","_a","event","zone","pos","latitude","longitude","nearest","nearestPosition","btn","_b","_c","name","_oldValue","newValue","resolve","reject","existingScript","script","params","error","g","initialCenter","firstPoint","point","position","value","normalized","days","label","normalizedCode","color","numeric","controller","marcaRequestValue","hasQuery","needsAmp","separator","requestUrl","cacheKey","cachedPayload","hasFreshCache","localFallbackPayload","response","payload","typedPayload","points","unmappablePoints","marca","tipoCode","path","existingRequest","loader","request","parsedPayload","dbEntry","raw","parsed","entry","db","result","grouped","fragment","zoneKey","section","header","title","empty","list","card","coordinateWarning","addressBlock","address","comuna","provincia","regionLine","mapPositionElement","mapActions","focusButton","icon","warning","text","details","hasDetails","actions","mapLinkElement","siteLink","emailLink","contactSection","contactTitle","phoneList","a","b","phone","item","iconWrapper","hasWhatsapp","whatsappIcon","content","numberEl","link","extra","mapWrapper","toggle","toggleIcon","toggleText","isHidden","url","iconClass","normalizedRegion","input","key","localIconUrl","pointTipoCode","fileName","lat","lng","rawCoordinates","marker","validPoints","bounds","iconUrl","markerPosition","cover","locationSection","strong","extraSection","line","phoneNumber","whatsappLink","href","external","_zone","isActive","baseLabel","bestDistance","distance","lat1","lon1","lat2","lon2","toRad","deg","dLat","dLon","pointId","el","state","targetZoom","currentZoom","needsZoom","ms","duration","startZoom","delta","startTime","ease","t","step","now","elapsed","progress","eased","nextZoom","targetLat","targetLng","onComplete","startCenter","startLat","startLng","deltaLat","deltaLng","nextLat","nextLng","className","digits","RsMap","__vite_glob_0_0","__vite_glob_0_1","DEFAULT_LABEL","DEFAULT_ARIA_LABEL","DEFAULT_MENU_LABEL","DEFAULT_CLOSED_MESSAGE","DEFAULT_WHATSAPP_COLOR","DEFAULT_OPTION_ICON","WHATSAPP_BASE_URL","OPTION_ICON_SVGS","DAY_ALIASES","WEEKDAY_SHORT_BY_ENGLISH","OPTION_ICON_SVGS_BY_KEY","svg","normalizeToken","normalizeIconSvg","RsWhatsapp","node","_d","_e","menuLabel","ariaLabel","target","isClosed","telefonoValue","mensajeValue","telefono","mensaje","query","brandKey","fallbackLabel","fallbackTarget","fallbackIcon","links","option","optionElements","RsWhatsappOption","optionEl","_f","linkEl","labelEl","iconEl","iconKey","iconSvg","template","message","scheduleSummary","manualClosedValue","schedule","scheduleElements","RsWhatsappSchedule","scheduleEl","start","end","segment","currentTime","timeZone","weekday","timeParts","hour","part","minute","currentDay","currentMinutes","match","startMinutes","endMinutes","startToken","endToken","startDay","endDay","hourValue","minuteValue","isOpen"],"mappings":";;;AACO,SAASA,EAAWC,GAAaC,GAAgC;AACtE,EAAK,eAAe,IAAID,CAAG,KAAG,eAAe,OAAOA,GAAKC,CAAI;AAC/D;ACHA,MAAAC,IAAe,8hFCAfC,IAAe,09DCAfC,IAAe,s9ECAfC,IAAe,0hECAfC,IAAe,siECAfC,KAAe,koDCAfC,KAAe,0zCCAfC,KAAe,sqDCAfC,KAAe,srDCAfC,KAAe,87CCGTC,KAAuB,uBAAA,OAAA;AAAA,EAAA,qCAAA,MAAA,OAAA,oCAAA,EAAA,KAAA,CAAAC,MAAAA,EAAA,OAAA;AAAA,EAAA,qCAAA,MAAA,OAAA,oCAAA,EAAA,KAAA,CAAAA,MAAAA,EAAA,OAAA;AAAA,EAAA,kCAAA,MAAA,OAAA,iCAAA,EAAA,KAAA,CAAAA,MAAAA,EAAA,OAAA;AAAA,EAAA,kCAAA,MAAA,OAAA,iCAAA,EAAA,KAAA,CAAAA,MAAAA,EAAA,OAAA;AAAA,EAAA,kCAAA,MAAA,OAAA,iCAAA,EAAA,KAAA,CAAAA,MAAAA,EAAA,OAAA;AAAA,EAAA,kCAAA,MAAA,OAAA,iCAAA,EAAA,KAAA,CAAAA,MAAAA,EAAA,OAAA;AAAA,EAAA,mCAAA,MAAA,OAAA,kCAAA,EAAA,KAAA,CAAAA,MAAAA,EAAA,OAAA;AAAA,EAAA,mCAAA,MAAA,OAAA,kCAAA,EAAA,KAAA,CAAAA,MAAAA,EAAA,OAAA;AAAA,CAAA,GAIvBC,KAAyB,uBAAA,OAAA;AAAA,EAAA,qBAAAZ;AAAA,EAAA,kCAAAC;AAAA,EAAA,kBAAAC;AAAA,EAAA,+BAAAC;AAAA,EAAA,kBAAAC;AAAA,EAAA,+BAAAC;AAAA,EAAA,iBAAAC;AAAA,EAAA,8BAAAC;AAAA,EAAA,mBAAAC;AAAA,EAAA,gCAAAC;AAAA,CAAA,GAwDzBI,IAAsB,WACtBC,IAA0B,uCAC1BC,IAAyB,0CACzBC,KAAuC;AAAA,EAC3C,QAAQ;AAAA,EACR,KAAK;AACP,GACMC,IAAwC;AAAA,EAC5C,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,WAAW;AACb,GACMC,IAAqC;AAAA,EACzC,UAAU;AAAA,EACV,cAAc;AAChB,GACMC,KAAwB,CAAC,SAAS,MAAM,UAAU,KAAK,GACvDC,KAAuC;AAAA,EAC3C,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,KAAK;AACP,GACMC,IAAsC;AAAA,EAC1C,GAAG;AAAA,EACH,GAAG;AACL,GACMC,IAA2B;AAAA,EAC/B,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AACV,GACMC,IAA8B,MAAU,KAAK,KAAK,KAClDC,KAAuB,gBACvBC,IAA0B,UAC1BC,IAA2C;AAAA,EAC/C,gCAAgC;AAAA,EAChC,sBAAsB;AAAA,EACtB,sBAAsB;AAAA,EACtB,UAAU;AAAA,EACV,yBAAyB;AAAA,EACzB,aAAa;AAAA,EACb,qBAAqB;AAAA,EACrB,SAAS;AAAA,EACT,sBAAsB;AAAA,EACtB,UAAU;AAAA,EACV,wBAAwB;AAAA,EACxB,YAAY;AAAA,EACZ,oDAAoD;AAAA,EACpD,oDAAoD;AAAA,EACpD,iCAAiC;AAAA,EACjC,UAAU;AAAA,EACV,oBAAoB;AAAA,EACpB,OAAO;AAAA,EACP,mBAAmB;AAAA,EACnB,OAAO;AAAA,EACP,qBAAqB;AAAA,EACrB,QAAQ;AAAA,EACR,oCAAoC;AAAA,EACpC,wBAAwB;AAAA,EACxB,IAAM;AAAA,EACN,UAAU;AAAA,EACV,0BAA0B;AAAA,EAC1B,WAAW;AAAA,EACX,sBAAsB;AAAA,EACtB,YAAY;AAAA,EACZ,uBAAuB;AAAA,EACvB,aAAa;AAAA,EACb,uDAAuD;AAAA,EACvD,mBAAmB;AAAA,EACnB,OAAO;AAAA,EACP,+CAA+C;AAAA,EAC/C,YAAY;AACd,GAEaC,IAAN,MAAMA,UAAc,YAAY;AAAA,EA0DrC,cAAc;AACZ,UAAA;AAvDM,IAAAC,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,iBAAiB,CAAA;AACjB,IAAAA,EAAA,eAAQ;AACR,IAAAA,EAAA,kBAAW;AACX,IAAAA,EAAA,cAAO;AACP,IAAAA,EAAA,kBAA0B;AAC1B,IAAAA,EAAA;AACA,IAAAA,EAAA,gBAAqB,CAAA;AACrB,IAAAA,EAAA,sBAA4C;AAAA,MAClD,OAAO,CAAA;AAAA,MACP,IAAI,CAAA;AAAA,MACJ,QAAQ,CAAA;AAAA,MACR,KAAK,CAAA;AAAA,IAAC;AAEA,IAAAA,EAAA,4BAAqB;AACrB,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,qBAAmC,CAAA;AACnC,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,oBAAyB;AACzB,IAAAA,EAAA,mBAAY;AACZ,IAAAA,EAAA,0BAAmB;AACnB,IAAAA,EAAA,sBAAeb;AACf,IAAAa,EAAA,2BAAoB;AACpB,IAAAA,EAAA,8BAAuB;AACvB,IAAAA,EAAA,0BAAmBL;AAEnB,IAAAK,EAAA,2BAAmC;AACnC,IAAAA,EAAA,0BAAkC;AAClC,IAAAA,EAAA,oCAA6B;AAC7B,IAAAA,EAAA,uBAAgB;AAChB,IAAAA,EAAA,iDAA0B,IAAA;AAupD1B,IAAAA,EAAA,yBAAkB,MAAM;AX50D3B,UAAAC;AW60DH,MAAK,KAAK,wBAGV,KAAK,oBAAoB,aAAa,UAAU,EAAE,IAClDA,IAAA,KAAK,qBAAL,QAAAA,EAAuB;AAAA,IACzB;AAEQ,IAAAD,EAAA,sCAA+B,CAACE,MAAiB;AACvD,MAAIA,EAAM,WAAW,KAAK,uBACxB,KAAK,gBAAA;AAAA,IAET;AAEQ,IAAAF,EAAA,iCAA0B,CAACE,MAAyB;AAC1D,MAAIA,EAAM,QAAQ,YAAY,KAAK,uBAAuB,CAAC,KAAK,oBAAoB,aAAa,QAAQ,KACvG,KAAK,gBAAA;AAAA,IAET;AAmJQ,IAAAF,EAAA,+BAAwB,CAACE,MAAiB;AAEhD,YAAMC,IADSD,EAAM,cACD,QAAQ;AAC5B,MAAKC,MAGL,KAAK,cAAcA,CAAI,GACvB,KAAK,oBAAoBA,CAAI;AAAA,IAC/B;AA0CQ,IAAAH,EAAA,4BAAqB,MAAM;AACjC,UAAI,CAAC,UAAU,aAAa;AAC1B,cAAM,yDAAyD;AAC/D;AAAA,MACF;AACA,gBAAU,YAAY;AAAA,QACpB,CAACI,MAAQ;AACP,gBAAM,EAAE,UAAAC,GAAU,WAAAC,EAAA,IAAcF,EAAI,QAC9BG,IAAU,KAAK,iBAAiBF,GAAUC,CAAS;AACzD,cAAIC,GAAS;AACX,kBAAMC,IAAkB,KAAK,iBAAiBD,CAAO;AACrD,YAAIC,KACF,KAAK,iBAAiBA,EAAgB,KAAKA,EAAgB,GAAG,GAEhE,KAAK,kBAAkBD,EAAQ,EAAE;AAAA,UACnC;AACE,kBAAM,4DAA4D;AAAA,QAEtE;AAAA,QACA,MAAM;AACJ,gBAAM,kCAAkC;AAAA,QAC1C;AAAA,MAAA;AAAA,IAEJ;AAp3DE,IAAAR,EAAM,kBAAA,GACN,KAAK,OAAO,KAAK,aAAa,EAAE,MAAM,QAAQ,GAC9C,KAAK,KAAK,YAAY;AAAA,qCACWb,CAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAO/BD,CAAmB;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;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;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,EAulB9C;AAAA,EAhnBA,WAAW,qBAAqB;AAC9B,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA,EAumBA,oBAAoB;AAClB,SAAK,QAAQ,KAAK,KAAK,cAA8B,MAAM,GAC3D,KAAK,eAAe,KAAK,KAAK,cAA2B,oBAAoB,GAC7E,KAAK,iBAAiB,KAAK,KAAK,cAA2B,uBAAuB,GAClF,KAAK,qBAAqB,KAAK,KAAK,cAA2B,0BAA0B,GACzF,KAAK,cAAc,KAAK,KAAK,cAA2B,mBAAmB,GAC3E,KAAK,sBAAsB,KAAK,KAAK,cAA2B,4BAA4B,GAC5F,KAAK,oBAAoB,KAAK,KAAK,cAA2B,0BAA0B,GACxF,KAAK,mBAAmB,KAAK,KAAK,cAA2B,yBAAyB,GACtF,KAAK,wBAAwB,KAAK,KAAK,cAAiC,0BAA0B,GAClG,KAAK,cAAc,MAAM,KAAK,KAAK,KAAK,iBAAoC,aAAa,CAAC,GAC1F,KAAK,gBAAgB,KAAK,KAAK,cAAiC,yBAAyB,GACzF,KAAK,YAAY,QAAQ,CAACwB,MAAQA,EAAI,iBAAiB,SAAS,KAAK,qBAAqB,CAAC,GACvF,KAAK,iBACP,KAAK,cAAc,iBAAiB,SAAS,KAAK,kBAAkB,GAEtE,KAAK,oBAAoB,iBAAiB,SAAS,KAAK,4BAA4B,GACpF,KAAK,sBAAsB,iBAAiB,SAAS,KAAK,eAAe,GACzE,OAAO,iBAAiB,WAAW,KAAK,uBAAuB,GAC/D,KAAK,kBAAA,GACL,KAAK,aAAa,KAAK,aAAa,QAAQ,CAAC,GAC7C,KAAK,kBAAkB,SAAS,GAChC,KAAK,sBAAA;AAAA,EACP;AAAA,EAEA,uBAAuB;AXl0BlB,QAAAR,GAAAS,GAAAC;AWm0BH,KAAAV,IAAA,KAAK,qBAAL,QAAAA,EAAuB,SACvB,KAAK,YAAY,QAAQ,CAACQ,MAAQA,EAAI,oBAAoB,SAAS,KAAK,qBAAqB,CAAC,GAC1F,KAAK,iBACP,KAAK,cAAc,oBAAoB,SAAS,KAAK,kBAAkB,IAEzEC,IAAA,KAAK,wBAAL,QAAAA,EAA0B,oBAAoB,SAAS,KAAK,gCAC5DC,IAAA,KAAK,0BAAL,QAAAA,EAA4B,oBAAoB,SAAS,KAAK,kBAC9D,OAAO,oBAAoB,WAAW,KAAK,uBAAuB;AAAA,EACpE;AAAA,EAEA,yBAAyBC,GAAcC,GAA0BC,GAAyB;AACxF,IAAIF,MAAS,UACX,KAAK,SAASE,KAAA,OAAAA,IAAY,EAAE,IACnBF,MAAS,SAClB,KAAK,QAAQE,KAAA,OAAAA,IAAY,EAAE,IAClBF,MAAS,WAClB,KAAK,aAAaE,CAAQ,IACjBF,MAAS,oBAClB,KAAK,iBAAiBE,CAAQ,IACrBF,MAAS,mBAClB,KAAK,gBAAgBE,CAAQ,IACpBF,MAAS,eAClB,KAAK,aAAaE,CAAQ,IACjBF,MAAS,qBAClB,KAAK,kBAAkBE,CAAQ,IACtBF,MAAS,yBAClB,KAAK,qBAAqBE,CAAQ;AAAA,EAEtC;AAAA,EAEQ,iBAAiB;AACvB,WAAK,OAAe,sBACX,QAAQ,UAAU,KAAK,MAAM;AAClC,WAAK,QAAA;AAAA,IACP,CAAC,IAGE,KAAK,oBAKLf,EAAM,4BACTA,EAAM,0BAA0B,IAAI,QAAc,CAACgB,GAASC,MAAW;AACrE,YAAMC,IAAiB,SAAS,cAAiC,oCAAoC;AACrG,UAAIA,GAAgB;AAClB,QAAAA,EAAe,iBAAiB,QAAQ,MAAMF,EAAA,GAAW,EAAE,MAAM,IAAM,GACvEE,EAAe;AAAA,UACb;AAAA,UACA,MAAMD,EAAO,IAAI,MAAM,uCAAuC,CAAC;AAAA,UAC/D,EAAE,MAAM,GAAA;AAAA,QAAK;AAEf;AAAA,MACF;AAEA,YAAME,IAAS,SAAS,cAAc,QAAQ,GACxCC,IAAS,IAAI,gBAAgB;AAAA,QACjC,KAAK,KAAK;AAAA,QACV,GAAG;AAAA,MAAA,CACJ;AACD,MAAAD,EAAO,MAAM,2CAA2CC,EAAO,SAAA,CAAU,IACzED,EAAO,QAAQ,IACfA,EAAO,QAAQ,IACfA,EAAO,QAAQ,eAAe,QAE9BA,EAAO,SAAS,MAAM;AACnB,eAAe,sBAAsB,IACtCH,EAAA;AAAA,MACF,GAEAG,EAAO,UAAU,MAAM;AACrB,QAAAnB,EAAM,0BAA0B,MAChCiB,EAAO,IAAI,MAAM,uCAAuC,CAAC;AAAA,MAC3D,GAEA,SAAS,KAAK,YAAYE,CAAM;AAAA,IAClC,CAAC,IAGInB,EAAM,wBACV,KAAK,MAAM;AACT,aAAe,sBAAsB,IACtC,KAAK,QAAA;AAAA,IACP,CAAC,EACA,MAAM,CAACqB,MAAU;AAChB,cAAQ,MAAMA,aAAiB,QAAQA,EAAM,UAAU,uCAAuC;AAAA,IAChG,CAAC,MAhDD,QAAQ,MAAM,kFAAkF,GACzF,QAAQ,QAAA;AAAA,EAgDnB;AAAA,EAEQ,UAAU;AAChB,UAAMC,IAAK,OAAe;AAC1B,QAAI,CAACA,GAAG;AACN,cAAQ,MAAM,qCAAqC;AACnD;AAAA,IACF;AAEA,UAAMC,IAAgB,KAAK,iBAAA;AAC3B,SAAK,MAAM,IAAID,EAAE,KAAK,IAAI,KAAK,OAAO;AAAA,MACpC,QAAQC;AAAA,MACR,MAAM;AAAA,MACN,WAAW;AAAA,IAAA,CACZ,GACG,KAAK,OAAO,UACd,KAAK,cAAc,KAAK,MAAM;AAAA,EAElC;AAAA,EAEQ,mBAAmB;AACzB,UAAMC,IAAa,KAAK,mBAAA;AACxB,WAAIA,KAGG,EAAE,KAAK,UAAU,KAAK,SAAA;AAAA,EAC/B;AAAA,EAEQ,qBAAyC;AAC/C,eAAWC,KAAS,KAAK,QAAQ;AAC/B,YAAMC,IAAW,KAAK,iBAAiBD,CAAK;AAC5C,UAAIC;AACF,eAAOA;AAAA,IAEX;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,wBAAwB;AXh8B3B,QAAAxB,GAAAS;AWi8BH,SAAK,6BAA6B,IAClC,KAAK,UAAST,IAAA,KAAK,aAAa,OAAO,MAAzB,OAAAA,IAA8B,EAAE,GAC9C,KAAK,SAAQS,IAAA,KAAK,aAAa,MAAM,MAAxB,OAAAA,IAA6B,EAAE,GAC5C,KAAK,iBAAiB,KAAK,aAAa,iBAAiB,CAAC,GAC1D,KAAK,gBAAgB,KAAK,aAAa,gBAAgB,CAAC,GACxD,KAAK,aAAa,KAAK,aAAa,YAAY,CAAC,GACjD,KAAK,kBAAkB,KAAK,aAAa,kBAAkB,CAAC,GAC5D,KAAK,qBAAqB,KAAK,aAAa,qBAAqB,CAAC,GAClE,KAAK,6BAA6B,IAClC,KAAK,mBAAA;AAAA,EACP;AAAA,EAEQ,aAAagB,GAAsB;AACzC,UAAMC,KAAcD,KAAA,OAAAA,IAAS,IAAI,KAAA;AACjC,QAAI,CAACC,GAAY;AACf,WAAK,YAAY,IACjB,KAAK,MAAM,eAAe,cAAc;AACxC;AAAA,IACF;AACA,SAAK,YAAYA,GACjB,KAAK,MAAM,YAAY,gBAAgBA,CAAU;AAAA,EACnD;AAAA,EAEQ,iBAAiBD,GAAsB;AAC7C,SAAK,oBAAoBA,KAAA,OAAAA,IAAS,IAAI,KAAA,GAClC,KAAK,oBAAoB,KAAK,eAC3B,KAAK,eAAA;AAAA,EAEd;AAAA,EAEQ,gBAAgBA,GAAsB;AAC5C,UAAMC,KAAcD,KAAA,OAAAA,IAAS,IAAI,KAAA;AACjC,SAAK,eAAeC,KAAcxC,GAC9B,KAAK,gBAAgB,KAAK,eAAe,CAAC,KAAK,8BACjD,KAAK,mBAAA;AAAA,EAET;AAAA,EAEQ,aAAauC,GAAsB;AACzC,UAAMC,KAAcD,KAAA,OAAAA,IAAS,IAAI,KAAA;AACjC,QAAI,CAACC,GAAY;AACf,WAAK,mBAAmBhC;AACxB;AAAA,IACF;AAEA,UAAMiC,IAAO,OAAOD,CAAU;AAC9B,QAAI,CAAC,OAAO,SAASC,CAAI,KAAKA,IAAO,GAAG;AACtC,WAAK,mBAAmBjC;AACxB;AAAA,IACF;AAEA,SAAK,mBAAmBiC,IAAO,KAAK,KAAK,KAAK;AAAA,EAChD;AAAA,EAEQ,kBAAkBF,GAAsB;AAC9C,UAAMC,KAAcD,KAAA,OAAAA,IAAS,IAAI,KAAA;AACjC,QAAI,CAACC,GAAY;AACf,WAAK,oBAAoB;AACzB;AAAA,IACF;AACA,SAAK,oBAAoBA,EAAW,SAAS,GAAG,IAAIA,IAAa,GAAGA,CAAU;AAAA,EAChF;AAAA,EAEQ,qBAAqBD,GAAsB;AACjD,SAAK,wBAAwBA,KAAA,OAAAA,IAAS,IAAI,KAAA;AAAA,EAC5C;AAAA,EAEQ,SAASA,GAAe;AAC9B,SAAK,QAAQA,EAAM,KAAA,GACnB,KAAK,WAAW,KAAK,kBAAkB,KAAK,KAAK,GACjD,KAAK,gBAAA,GACA,KAAK,8BACR,KAAK,mBAAA;AAAA,EAET;AAAA,EAEQ,QAAQA,GAAe;AAC7B,SAAK,OAAOA,EAAM,KAAA,GAClB,KAAK,WAAW,KAAK,cAAc,KAAK,IAAI,GAC5C,KAAK,iBAAA,GACA,KAAK,8BACR,KAAK,mBAAA;AAAA,EAET;AAAA,EAEQ,qBAAqB;AAC3B,IAAI,KAAK,kBAGT,KAAK,gBAAgB,IACrB,eAAe,MAAM;AACnB,WAAK,gBAAgB,IAChB,KAAK,cAAA;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,IAAI,cAAc;AAChB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,aAAa;AACf,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,mBAAmB;AACzB,QAAI,CAAC,KAAK;AACR;AAEF,UAAMG,IAAQ,KAAK,aAAA;AACnB,SAAK,aAAa,cAAcA,KAAA,OAAAA,IAAS;AAAA,EAC3C;AAAA,EAEQ,eAAe;AACrB,QAAI,KAAK,aAAa,QAAQ,KAAK,YAAYpC;AAC7C,aAAOA,EAAY,KAAK,QAAQ;AAElC,UAAMkC,IAAa,KAAK,KAAK,KAAA,EAAO,YAAA,GAC9BG,IAAiBH,KAAcA,KAAcrC,IAAaA,EAAWqC,CAAU,IAAI;AACzF,WAAIG,MAAmB,QAAQA,KAAkBrC,IACxCA,EAAYqC,CAAc,IAE5B;AAAA,EACT;AAAA,EAEQ,kBAAkB;AX7jCrB,QAAA7B;AW8jCH,UAAM8B,KAAQ3C,IAAAA,GAAa,KAAK,QAAQ,MAA1BA,OAAAA,IAA+BH;AAC7C,SAAK,MAAM,YAAY,mBAAmB8C,CAAK;AAAA,EACjD;AAAA,EAEQ,cAAcL,GAA8B;AAClD,QAAI,CAACA;AACH,aAAO;AAET,UAAMC,IAAaD,EAAM,KAAA,EAAO,YAAA;AAChC,QAAIC,KAAcrC;AAChB,aAAOA,EAAWqC,CAAU;AAE9B,UAAMK,IAAU,OAAOL,CAAU;AACjC,WAAI,OAAO,SAASK,CAAO,MAAMA,MAAY,KAAKA,MAAY,KACrDA,IAEF;AAAA,EACT;AAAA,EAEA,MAAc,gBAAgB;AXjlCzB,QAAA/B;AWklCH,QAAI,CAAC,KAAK,eAAe,CAAC,KAAK,SAAS,KAAK,aAAa;AACxD;AAGF,QAAI,CAAC,KAAK,cAAc;AACtB,cAAQ,MAAM,oFAAoF,GAClG,KAAK,kBAAkB,OAAO;AAC9B;AAAA,IACF;AAEA,KAAAA,IAAA,KAAK,qBAAL,QAAAA,EAAuB;AACvB,UAAMgC,IAAa,IAAI,gBAAA;AACvB,SAAK,mBAAmBA;AAExB,UAAMC,IAAoB,KAAK,qBAAA,GACzBf,IAAS,IAAI,gBAAgB;AAAA,MACjC,OAAOe;AAAA,MACP,MAAM,OAAO,KAAK,QAAQ;AAAA,IAAA,CAC3B,GAEKC,IAAW,KAAK,aAAa,SAAS,GAAG,GACzCC,IAAWD,KAAY,CAAC,QAAQ,KAAK,KAAK,YAAY,GACtDE,IAAYF,IAAYC,IAAW,MAAM,KAAM,KAC/CE,IAAa,GAAG,KAAK,YAAY,GAAGD,CAAS,GAAGlB,EAAO,SAAA,CAAU,IACjEoB,IAAW,KAAK,kBAAkBD,CAAU,GAC5CE,IAAgB,MAAM,KAAK,gBAAgBD,CAAQ,GACnDE,IAAgBD,KAAiB,KAAK,QAAQA,EAAc,YAAY,KAAK,kBAC7EE,IAAuBF,IAAgB,OAAO,MAAM,KAAK,uBAAuBN,GAAmB,KAAK,QAAQ;AAEtH,QAAIM;AAGF,UAFA,KAAK,mBAAmBA,EAAc,IAAI,GAC1C,KAAK,kBAAkB,OAAO,GAC1BC;AACF;AAAA,WAEOC,KACT,KAAK,mBAAmBA,CAAoB,GAC5C,KAAK,kBAAkB,OAAO,KAE9B,KAAK,kBAAkB,SAAS;AAGlC,QAAI;AACF,YAAMC,IAAW,MAAM,MAAML,GAAY;AAAA,QACvC,QAAQL,EAAW;AAAA,MAAA,CACpB;AAED,UAAI,CAACU,EAAS;AACZ,cAAM,IAAI,MAAM,aAAaA,EAAS,MAAM,EAAE;AAGhD,YAAMC,IAAU,MAAMD,EAAS,KAAA;AAC/B,UAAI,CAAC,MAAM,QAAQC,CAAO;AACxB,cAAM,IAAI,MAAM,sCAAsC;AAExD,YAAMC,IAAeD;AACrB,YAAM,KAAK,iBAAiBL,GAAUM,CAAY,GAClD,KAAK,mBAAmBA,CAAY,GACpC,KAAK,kBAAkB,OAAO;AAAA,IAChC,SAASzB,GAAO;AACd,UAAIA,aAAiB,gBAAgBA,EAAM,SAAS;AAClD;AAEF,UAAIoB,KAAiBE,GAAsB;AACzC,gBAAQ,KAAK,8DAA8DtB,CAAK;AAChF;AAAA,MACF;AACA,cAAQ,MAAM,6CAA6CA,CAAK,GAChE,KAAK,kBAAkB,OAAO;AAAA,IAChC;AAAA,EACF;AAAA,EAEQ,mBAAmBwB,GAAwB;AACjD,SAAK,SAAS,KAAK,gBAAgBA,CAAO,GAC1C,KAAK,uBAAuB,KAAK,MAAM,GACvC,KAAK,aAAa,KAAK,MAAM,GAC7B,KAAK,qBAAqB,IAC1B,KAAK,cAAc,KAAK,MAAM;AAAA,EAChC;AAAA,EAEQ,uBAAuBE,GAAoB;AACjD,UAAMC,IAAmBD,EACtB,OAAO,CAACtB,MAAU,CAAC,KAAK,iBAAiBA,CAAK,CAAC,EAC/C,IAAI,CAACA,OAAW;AAAA,MACf,IAAIA,EAAM;AAAA,MACV,QAAQA,EAAM;AAAA,MACd,WAAWA,EAAM;AAAA,MACjB,KAAKA,EAAM;AAAA,MACX,KAAKA,EAAM;AAAA,IAAA,EACX;AAEJ,IAAIuB,EAAiB,UACnB,QAAQ,KAAK,mFAAmFA,CAAgB;AAAA,EAEpH;AAAA,EAEQ,kBAAkBT,GAAoB;AAC5C,WAAO,iBAAiBA,CAAU;AAAA,EACpC;AAAA,EAEA,MAAc,uBAAuBU,GAAeC,GAAiD;AAEnG,UAAMC,IAAO,uBADW,KAAK,kBAAkBF,CAAK,CACD,IAAIC,CAAQ,SACzDE,IAAkB,KAAK,oBAAoB,IAAID,CAAI;AACzD,QAAIC;AACF,aAAOA;AAGT,UAAMC,IAAStE,GAAqBoE,CAAI;AACxC,QAAI,CAACE;AACH,aAAO;AAGT,UAAMC,IAAUD,EAAA,EACb,KAAK,CAACR,MAAY;AACjB,YAAMU,IAAgB,KAAK,wBAAwBV,CAAO;AAC1D,aAAOU,KAAA,QAAAA,EAAe,SAASA,IAAgB;AAAA,IACjD,CAAC,EACA,MAAM,MAAM,IAAI;AAEnB,gBAAK,oBAAoB,IAAIJ,GAAMG,CAAO,GACnCA;AAAA,EACT;AAAA,EAEQ,wBAAwB3B,GAAsC;AACpE,WAAK,MAAM,QAAQA,CAAK,IAIjBA,IAHE;AAAA,EAIX;AAAA,EAEA,MAAc,gBAAgBa,GAAoD;AAChF,UAAMgB,IAAU,MAAM,KAAK,6BAA6BhB,CAAQ;AAChE,QAAIgB;AACF,aAAOA;AAGT,QAAI;AACF,YAAMC,IAAM,OAAO,aAAa,QAAQjB,CAAQ;AAChD,UAAI,CAACiB;AACH,eAAO;AAET,YAAMC,IAAS,KAAK,MAAMD,CAAG;AAC7B,aAAI,CAACC,KAAU,CAAC,MAAM,QAAQA,EAAO,IAAI,KAAK,CAAC,OAAO,SAASA,EAAO,SAAS,KAC7E,OAAO,aAAa,WAAWlB,CAAQ,GAChC,QAEFkB;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAc,iBAAiBlB,GAAkBK,GAAwB;AACvE,UAAMc,IAA0B;AAAA,MAC9B,WAAW,KAAK,IAAA;AAAA,MAChB,MAAMd;AAAA,IAAA;AAGR,UAAM,KAAK,4BAA4BL,GAAUmB,CAAK;AAEtD,QAAI;AACF,aAAO,aAAa,QAAQnB,GAAU,KAAK,UAAUmB,CAAK,CAAC;AAAA,IAC7D,QAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEA,MAAc,6BAA6BnB,GAAoD;AAC7F,UAAMoB,IAAK,MAAM5D,EAAM,kBAAA;AACvB,WAAK4D,IAIE,IAAI,QAAQ,CAAC5C,MAAY;AAG9B,YAAMsC,IAFcM,EAAG,YAAY9D,GAAyB,UAAU,EAC5C,YAAYA,CAAuB,EACvC,IAAI0C,CAAQ;AAElC,MAAAc,EAAQ,YAAY,MAAM;AACxB,cAAMO,IAASP,EAAQ;AACvB,YAAI,CAACO,KAAU,CAAC,MAAM,QAAQA,EAAO,IAAI,KAAK,CAAC,OAAO,SAASA,EAAO,SAAS,GAAG;AAChF,UAAA7C,EAAQ,IAAI;AACZ;AAAA,QACF;AACA,QAAAA,EAAQ;AAAA,UACN,WAAW6C,EAAO;AAAA,UAClB,MAAMA,EAAO;AAAA,QAAA,CACd;AAAA,MACH,GAEAP,EAAQ,UAAU,MAAMtC,EAAQ,IAAI;AAAA,IACtC,CAAC,IArBQ;AAAA,EAsBX;AAAA,EAEA,MAAc,4BAA4BwB,GAAkBmB,GAAyB;AACnF,UAAMC,IAAK,MAAM5D,EAAM,kBAAA;AACvB,IAAK4D,KAIL,MAAM,IAAI,QAAc,CAAC5C,MAAY;AAGnC,YAAMsC,IAFcM,EAAG,YAAY9D,GAAyB,WAAW,EAC7C,YAAYA,CAAuB,EACvC,IAAI;AAAA,QACxB,KAAK0C;AAAA,QACL,WAAWmB,EAAM;AAAA,QACjB,MAAMA,EAAM;AAAA,MAAA,CACe;AAE7B,MAAAL,EAAQ,YAAY,MAAMtC,EAAA,GAC1BsC,EAAQ,UAAU,MAAMtC,EAAA;AAAA,IAC1B,CAAC;AAAA,EACH;AAAA,EAEA,OAAe,oBAAiD;AAC9D,WAAI,OAAO,UAAW,eAAe,EAAE,eAAe,UAC7C,QAAQ,QAAQ,IAAI,KAGxBhB,EAAM,yBACTA,EAAM,uBAAuB,IAAI,QAAQ,CAACgB,MAAY;AACpD,YAAMsC,IAAU,OAAO,UAAU,KAAKzD,IAAsB,CAAC;AAE7D,MAAAyD,EAAQ,kBAAkB,MAAM;AAC9B,cAAMM,IAAKN,EAAQ;AACnB,QAAKM,EAAG,iBAAiB,SAAS9D,CAAuB,KACvD8D,EAAG,kBAAkB9D,GAAyB,EAAE,SAAS,OAAO;AAAA,MAEpE,GAEAwD,EAAQ,YAAY,MAAMtC,EAAQsC,EAAQ,MAAM,GAChDA,EAAQ,UAAU,MAAMtC,EAAQ,IAAI;AAAA,IACtC,CAAC,IAGIhB,EAAM;AAAA,EACf;AAAA,EAEQ,gBAAgB6C,GAAoC;AAC1D,WAAOA,EAAQ,IAAI,CAACpB,OAAW;AAAA,MAC7B,GAAGA;AAAA,MACH,MAAM,KAAK,gBAAgBA,CAAK;AAAA,IAAA,EAChC;AAAA,EACJ;AAAA,EAEQ,aAAasB,GAAoB;AACvC,QAAI,CAAC,KAAK;AACR;AAGF,UAAMe,IAAU,KAAK,YAAYf,CAAM;AACvC,SAAK,eAAee,GACpB,KAAK,uBAAA;AAEL,UAAMC,IAAW,SAAS,uBAAA;AAE1B,IAAAvE,GAAW,QAAQ,CAACwE,MAAY;AAC9B,YAAMC,IAAU,SAAS,cAAc,SAAS;AAChD,MAAAA,EAAQ,YAAY,gBACpBA,EAAQ,QAAQ,cAAcD;AAE9B,YAAME,IAAS,SAAS,cAAc,KAAK;AAC3C,MAAAA,EAAO,YAAY;AACnB,YAAMC,IAAQ,SAAS,cAAc,MAAM;AAK3C,UAJAA,EAAM,cAAc1E,GAAYuE,CAAO,GACvCE,EAAO,YAAYC,CAAK,GACxBF,EAAQ,YAAYC,CAAM,GAEtBJ,EAAQE,CAAO,EAAE,WAAW,GAAG;AACjC,cAAMI,IAAQ,SAAS,cAAc,GAAG;AACxC,QAAAA,EAAM,YAAY,uBAClBA,EAAM,cAAc,4BACpBH,EAAQ,YAAYG,CAAK;AAAA,MAC3B,OAAO;AACL,cAAMC,IAAO,SAAS,cAAc,KAAK;AACzC,QAAAA,EAAK,YAAY,sBACjBP,EAAQE,CAAO,EAAE,QAAQ,CAACvC,MAAU;AAClC,UAAA4C,EAAK,YAAY,KAAK,gBAAgB5C,CAAK,CAAC;AAAA,QAC9C,CAAC,GACDwC,EAAQ,YAAYI,CAAI;AAAA,MAC1B;AAEA,MAAAN,EAAS,YAAYE,CAAO;AAAA,IAC9B,CAAC,GAED,KAAK,eAAe,gBAAgBF,CAAQ,GAC5C,KAAK,qBAAA;AAAA,EACP;AAAA,EAEQ,YAAYhB,GAAiD;AACnE,UAAMe,IAAuC;AAAA,MAC3C,OAAO,CAAA;AAAA,MACP,IAAI,CAAA;AAAA,MACJ,QAAQ,CAAA;AAAA,MACR,KAAK,CAAA;AAAA,IAAC;AAER,WAAAf,EAAO,QAAQ,CAACtB,MAAU;AACxB,MAAAqC,EAAQrC,EAAM,IAAI,EAAE,KAAKA,CAAK;AAAA,IAChC,CAAC,GACMqC;AAAA,EACT;AAAA,EAEQ,gBAAgBrC,GAAiB;AXl4CpC,QAAAvB;AWm4CH,UAAMoE,IAAO,SAAS,cAAc,SAAS;AAC7C,IAAAA,EAAK,YAAY,cACjBA,EAAK,QAAQ,UAAU,OAAO7C,EAAM,EAAE;AACtC,UAAM8C,IAAoB,KAAK,0BAA0B9C,CAAK,GAExD0C,IAAQ,SAAS,cAAc,IAAI;AACzC,IAAAA,EAAM,YAAY,qBAClBA,EAAM,cAAc1C,EAAM,UAAU,cACpC6C,EAAK,YAAYH,CAAK;AAEtB,UAAMK,IAAe,SAAS,cAAc,KAAK;AACjD,IAAAA,EAAa,YAAY;AAEzB,UAAMC,IAAU,SAAS,cAAc,GAAG;AAK1C,QAJAA,EAAQ,YAAY,uBACpBA,EAAQ,cAAchD,EAAM,aAAa,iBACzC+C,EAAa,YAAYC,CAAO,GAE5BhD,EAAM,aAAa;AACrB,YAAMiD,IAAS,SAAS,cAAc,GAAG;AACzC,MAAAA,EAAO,YAAY,oBACnBA,EAAO,cAAcjD,EAAM,aAC3B+C,EAAa,YAAYE,CAAM;AAAA,IACjC;AAEA,QAAIjD,EAAM,gBAAgB;AACxB,YAAMkD,IAAY,SAAS,cAAc,GAAG;AAC5C,MAAAA,EAAU,YAAY,oBACtBA,EAAU,cAAclD,EAAM,gBAC9B+C,EAAa,YAAYG,CAAS;AAAA,IACpC;AAEA,QAAIlD,EAAM,aAAa;AACrB,YAAMmD,IAAa,SAAS,cAAc,GAAG;AAC7C,MAAAA,EAAW,YAAY,oBACvBA,EAAW,cAAcnD,EAAM,aAC/B+C,EAAa,YAAYI,CAAU;AAAA,IACrC;AAEA,IAAAN,EAAK,YAAYE,CAAY;AAE7B,QAAIK,IAAyC;AAC7C,UAAMnD,IAAW,KAAK,iBAAiBD,CAAK;AAC5C,QAAIC,GAAU;AACZ,YAAMoD,IAAa,SAAS,cAAc,KAAK;AAC/C,MAAAA,EAAW,YAAY;AAEvB,YAAMC,IAAc,SAAS,cAAc,QAAQ;AACnD,MAAAA,EAAY,OAAO,UACnBA,EAAY,YAAY;AACxB,YAAMC,IAAO,KAAK,kBAAkB,iCAAiC;AACrE,MAAAD,EAAY,YAAYC,CAAI,GAC5BD,EAAY,YAAY,SAAS,eAAe,iBAAiB,CAAC,GAClEA,EAAY,iBAAiB,SAAS,MAAM;AAC1C,QAAK,KAAK,mBAAmBrD,EAAS,KAAKA,EAAS,GAAG,GACvD,KAAK,kBAAkBD,EAAM,EAAE;AAAA,MACjC,CAAC,GACDqD,EAAW,YAAYC,CAAW,GAClCD,EAAW,YAAY,KAAK,8BAA8BpD,CAAQ,CAAC,GACnEmD,IAAqBC;AAAA,IACvB,WAAWP,GAAmB;AAC5B,YAAMU,IAAU,SAAS,cAAc,KAAK;AAC5C,MAAAA,EAAQ,YAAY;AACpB,YAAMD,IAAO,KAAK,kBAAkB,yBAAyB;AAC7D,MAAAC,EAAQ,YAAYD,CAAI;AACxB,YAAME,IAAO,SAAS,cAAc,MAAM;AAC1C,MAAAA,EAAK,cAAcX,GACnBU,EAAQ,YAAYC,CAAI,GACxBL,IAAqBI;AAAA,IACvB;AAEA,UAAME,IAAU,SAAS,cAAc,KAAK;AAC5C,IAAAA,EAAQ,YAAY,uBACpBA,EAAQ,SAAS;AACjB,QAAIC,IAAa;AAEjB,UAAMC,IAAU,SAAS,cAAc,KAAK;AAC5C,IAAAA,EAAQ,YAAY;AACpB,QAAIC,IAA2C;AAE/C,QAAI7D,EAAM,OAAOA,EAAM,QAAQ,KAAK;AAClC,YAAM8D,IAAW,SAAS,cAAc,GAAG;AAC3C,MAAAA,EAAS,OAAO9D,EAAM,KACtB8D,EAAS,SAAS,UAClBA,EAAS,MAAM,uBACfA,EAAS,YAAY;AACrB,YAAMP,IAAO,KAAK,kBAAkB,mBAAmB;AACvD,MAAAO,EAAS,YAAYP,CAAI,GACzBO,EAAS,YAAY,SAAS,eAAe,WAAW,CAAC,GACzDF,EAAQ,YAAYE,CAAQ;AAAA,IAC9B;AAEA,QAAI9D,EAAM,OAAO;AACf,YAAM+D,IAAY,SAAS,cAAc,GAAG;AAC5C,MAAAA,EAAU,OAAO,UAAU/D,EAAM,KAAK,IACtC+D,EAAU,SAAS,UACnBA,EAAU,MAAM,uBAChBA,EAAU,YAAY;AACtB,YAAMR,IAAO,KAAK,kBAAkB,sBAAsB;AAC1D,MAAAQ,EAAU,YAAYR,CAAI,GAC1BQ,EAAU,YAAY,SAAS,eAAe/D,EAAM,KAAK,CAAC,GAC1D4D,EAAQ,YAAYG,CAAS;AAAA,IAC/B;AAOA,QALIH,EAAQ,sBACVF,EAAQ,YAAYE,CAAO,GAC3BD,IAAa,MAGXlF,IAAAuB,EAAM,cAAN,QAAAvB,EAAiB,QAAQ;AAC3B,YAAMuF,IAAiB,SAAS,cAAc,KAAK;AACnD,MAAAA,EAAe,YAAY;AAC3B,YAAMC,IAAe,SAAS,cAAc,KAAK;AACjD,MAAAA,EAAa,YAAY;AACzB,YAAMV,IAAO,KAAK,kBAAkB,mBAAmB;AACvD,MAAAU,EAAa,YAAYV,CAAI,GAC7BU,EAAa,YAAY,SAAS,eAAe,WAAW,CAAC,GAC7DD,EAAe,YAAYC,CAAY;AAEvC,YAAMC,IAAY,SAAS,cAAc,IAAI;AAC7C,MAAAA,EAAU,YAAY,0BAEtBlE,EAAM,UACH,MAAA,EACA,KAAK,CAACmE,GAAGC,MAAMD,EAAE,QAAQC,EAAE,KAAK,EAChC,QAAQ,CAACC,MAAU;AAClB,cAAMC,IAAO,SAAS,cAAc,IAAI;AACxC,QAAAA,EAAK,YAAY;AAEjB,cAAMC,IAAc,SAAS,cAAc,MAAM;AACjD,QAAAA,EAAY,YAAY;AACxB,cAAMC,IAAc,KAAK,gBAAgBH,CAAK;AAC9C,YAAIG,GAAa;AACf,gBAAMC,IAAe,KAAK,kBAAkB,uBAAuB;AACnE,UAAAF,EAAY,YAAYE,CAAY;AAAA,QACtC;AACE,UAAAF,EAAY,cAAc;AAE5B,QAAAD,EAAK,YAAYC,CAAW;AAE5B,cAAMG,IAAU,SAAS,cAAc,KAAK;AAC5C,QAAAA,EAAQ,YAAY;AAEpB,cAAMtF,IAAO,SAAS,cAAc,MAAM;AAC1C,QAAAA,EAAK,YAAY,0BACjBA,EAAK,cAAciF,EAAM,QACzBK,EAAQ,YAAYtF,CAAI;AAExB,cAAMuF,IAAWH,IAAc,SAAS,cAAc,GAAG,IAAI,SAAS,cAAc,MAAM;AAE1F,YADAG,EAAS,YAAY,4BACjBH,GAAa;AACf,gBAAMI,IAAO,KAAK,gBAAgBP,EAAM,QAAQ;AAChD,UAAIO,MACDD,EAA+B,OAAOC,GACtCD,EAA+B,SAAS,UACxCA,EAA+B,MAAM,uBACtCA,EAAS,UAAU,IAAI,gCAAgC;AAAA,QAE3D;AACA,QAAAA,EAAS,cAAcN,EAAM,UAC7BK,EAAQ,YAAYC,CAAQ,GAE5BL,EAAK,YAAYI,CAAO,GACxBR,EAAU,YAAYI,CAAI;AAAA,MAC5B,CAAC,GAEHN,EAAe,YAAYE,CAAS,GACpCR,EAAQ,YAAYM,CAAc,GAClCL,IAAa;AAAA,IACf;AAEA,QAAI3D,EAAM,WAAW;AACnB,YAAM6E,IAAQ,SAAS,cAAc,GAAG;AACxC,MAAAA,EAAM,YAAY,qBAClBA,EAAM,YAAY7E,EAAM,WACxB6E,EAAM,iBAAiB,GAAG,EAAE,QAAQ,CAACD,MAAS;AAC5C,QAAAA,EAAK,UAAU,IAAI,wBAAwB;AAC3C,cAAMrB,IAAO,KAAK,kBAAkB,wCAAwC;AAC5E,QAAAA,EAAK,UAAU,IAAI,wBAAwB,GAC3CqB,EAAK,YAAYrB,CAAI;AAAA,MACvB,CAAC,GACDG,EAAQ,YAAYmB,CAAK,GACzBlB,IAAa;AAAA,IACf;AAEA,QAAI3D,EAAM,YAAY;AACpB,MAAA6D,IAAiB,SAAS,cAAc,GAAG,GAC3CA,EAAe,OAAO7D,EAAM,YAC5B6D,EAAe,SAAS,UACxBA,EAAe,MAAM,uBACrBA,EAAe,YAAY;AAC3B,YAAMN,IAAO,KAAK,kBAAkB,8BAA8B;AAClE,MAAAM,EAAe,YAAYN,CAAI,GAC/BM,EAAe,YAAY,SAAS,eAAe,aAAa,CAAC;AAAA,IACnE;AAEA,QAAIA,GAAgB;AAClB,YAAMiB,IAAa,SAAS,cAAc,KAAK;AAC/C,MAAAA,EAAW,YAAY,uBACvBA,EAAW,YAAYjB,CAAc,GACrCH,EAAQ,YAAYoB,CAAU,GAC9BnB,IAAa;AAAA,IACf;AAEA,QAAIA,GAAY;AACd,YAAMoB,IAAS,SAAS,cAAc,QAAQ;AAC9C,MAAAA,EAAO,OAAO,UACdA,EAAO,YAAY;AACnB,YAAMC,IAAa,KAAK,kBAAkB,yBAAyB,GAC7DC,IAAa,SAAS,cAAc,MAAM;AAChD,MAAAA,EAAW,cAAc,mBACzBF,EAAO,YAAYC,CAAU,GAC7BD,EAAO,YAAYE,CAAU,GAC7BF,EAAO,iBAAiB,SAAS,MAAM;AACrC,cAAMG,IAAWxB,EAAQ;AACzB,QAAAA,EAAQ,SAAS,CAACwB,GAClBD,EAAW,cAAcC,IAAW,wBAAwB,mBAC5DF,EAAW,YAAYE,IAAW,6BAA6B;AAAA,MACjE,CAAC,GACDrC,EAAK,YAAYkC,CAAM,GACvBlC,EAAK,YAAYa,CAAO;AAAA,IAC1B;AAEA,WAAIN,KACFP,EAAK,YAAYO,CAAkB,GAG9BP;AAAA,EACT;AAAA,EAEQ,8BAA8B5C,GAAuB;AAC3D,UAAM2D,IAAU,SAAS,cAAc,KAAK;AAC5C,WAAAA,EAAQ,YAAY,iCACpBA,EAAQ;AAAA,MACN,KAAK;AAAA,QACH,sDAAsD3D,EAAS,GAAG,IAAIA,EAAS,GAAG;AAAA,QAClF;AAAA,QACA;AAAA,MAAA;AAAA,IACF,GAEF2D,EAAQ;AAAA,MACN,KAAK;AAAA,QACH,0BAA0B3D,EAAS,GAAG,IAAIA,EAAS,GAAG;AAAA,QACtD;AAAA,QACA;AAAA,MAAA;AAAA,IACF,GAEK2D;AAAA,EACT;AAAA,EAEQ,2BAA2BuB,GAAa9E,GAAe+E,GAAmB;AAChF,UAAMR,IAAO,SAAS,cAAc,GAAG;AACvC,WAAAA,EAAK,OAAOO,GACZP,EAAK,SAAS,UACdA,EAAK,MAAM,uBACXA,EAAK,YAAY,+BACjBA,EAAK,YAAY,KAAK,kBAAkBQ,CAAS,CAAC,GAClDR,EAAK,YAAY,SAAS,eAAevE,CAAK,CAAC,GACxCuE;AAAA,EACT;AAAA,EAEQ,gBAAgB5E,GAA6B;AACnD,UAAMqF,IAAmB,KAAK,oBAAoBrF,EAAM,eAAe,EAAE;AACzE,WAAIqF,KAAoBA,KAAoB/G,IACnCA,EAAgB+G,CAAgB,IAErCA,EAAiB,SAAS,eAAe,IACpC,OAGPA,EAAiB,SAAS,WAAW,KACrCA,EAAiB,SAAS,MAAM,KAChCA,EAAiB,SAAS,OAAO,KACjCA,EAAiB,SAAS,OAAO,KACjCA,EAAiB,SAAS,YAAY,IAE/B,QAGPA,EAAiB,SAAS,OAAO,KACjCA,EAAiB,SAAS,UAAU,KACpCA,EAAiB,SAAS,aAAa,KACvCA,EAAiB,SAAS,SAAS,KACnCA,EAAiB,SAAS,UAAU,IAE7B,UAEF;AAAA,EACT;AAAA,EAEQ,oBAAoBC,GAAe;AACzC,WAAOA,EACJ,YAAA,EACA,UAAU,KAAK,EACf,QAAQ,oBAAoB,EAAE,EAC9B,KAAA;AAAA,EACL;AAAA,EAEQ,uBAAuB;AX7qD1B,QAAA7G;AW8qDH,UAAM0B,IAAa,KAAK,oBAAoB,KAAK,KAAK;AACtD,YAAOtC,IAAAA,EAAcsC,CAAU,MAAxBtC,OAAAA,IAA6B,KAAK;AAAA,EAC3C;AAAA,EAEQ,kBAAkBqC,GAAe;AXlrDpC,QAAAzB;AWmrDH,UAAM0B,IAAa,KAAK,oBAAoBD,CAAK;AACjD,WAAKC,KAGEtC,IAAAA,EAAcsC,CAAU,MAAxBtC,OAAAA,IAA6BsC,IAF3B;AAAA,EAGX;AAAA,EAEQ,oBAAoBD,GAAe;AAMzC,WALmBA,EAChB,YAAA,EACA,UAAU,KAAK,EACf,QAAQ,oBAAoB,EAAE,EAC9B,QAAQ,eAAe,EAAE;AAAA,EAE9B;AAAA,EAEQ,cAAcF,GAAmC;AACvD,UAAMuF,IAAM,KAAK,YAAY,WACvBC,IAAe,KAAK,sBAAsBD,GAAKvF,CAAK;AAC1D,WAAIwF,MAGA,KAAK,oBACA,GAAG,KAAK,iBAAiB,GAAGD,CAAG,SAEpC,KAAK,uBACA,KAAK,uBAEP;AAAA,EACT;AAAA,EAEQ,sBAAsBA,GAAavF,GAAmC;AXltDzE,QAAAvB;AWmtDH,UAAMgH,IAAgBzF,IAAQ,OAAOA,EAAM,IAAI,IAAI,KAE7C0F,KADW,OAAO,SAASD,CAAa,IAAIA,IAAgB,KAAK,cACzC,IAAI,GAAGF,CAAG,sBAAsB,GAAGA,CAAG;AACpE,YAAO9G,IAAAjB,GAAuB,UAAUkI,CAAQ,EAAE,MAA3C,OAAAjH,IAAgD;AAAA,EACzD;AAAA,EAEQ,0BAA0BuB,GAAyC;AACzE,QAAI,KAAK,iBAAiBA,CAAK;AAC7B,aAAO;AAGT,UAAM2F,IAAM,OAAO3F,EAAM,GAAG,GACtB4F,IAAM,OAAO5F,EAAM,GAAG,GACtB6F,IAAiB,OAAO7F,EAAM,OAAO,UAAU,SAASA,EAAM,OAAO,UAAU;AACrF,WAAI,CAAC,OAAO,SAAS2F,CAAG,KAAK,CAAC,OAAO,SAASC,CAAG,IACxC,0BAA0BC,CAAc,MAE1C,0BAA0BA,CAAc;AAAA,EACjD;AAAA,EAEQ,iBAAiB7F,GAA6D;AACpF,UAAM2F,IAAM,OAAO3F,EAAM,GAAG,GACtB4F,IAAM,OAAO5F,EAAM,GAAG;AAC5B,WAAK,KAAK,qBAAqB2F,GAAKC,CAAG,IAGhC,EAAE,KAAAD,GAAK,KAAAC,EAAA,IAFL;AAAA,EAGX;AAAA,EAEQ,qBAAqBD,GAAaC,GAAa;AACrD,WACE,OAAO,SAASD,CAAG,KACnB,OAAO,SAASC,CAAG,KACnBD,KAAOzH,EAAyB,UAChCyH,KAAOzH,EAAyB,UAChC0H,KAAO1H,EAAyB,UAChC0H,KAAO1H,EAAyB;AAAA,EAEpC;AAAA,EAEQ,cAAcoD,GAAoB;AACxC,UAAMzB,IAAK,OAAe;AAC1B,QAAI,CAACA,KAAK,CAAC,KAAK;AACd;AAEF,SAAK,QAAQ,QAAQ,CAACiG,MAAWA,EAAO,OAAO,IAAI,CAAC,GACpD,KAAK,UAAU,CAAA;AAEf,UAAMC,IAAiE,CAAA;AAQvE,QAPAzE,EAAO,QAAQ,CAACtB,MAAU;AACxB,YAAMC,IAAW,KAAK,iBAAiBD,CAAK;AAC5C,MAAIC,KACF8F,EAAY,KAAK,EAAE,OAAA/F,GAAO,UAAAC,EAAA,CAAU;AAAA,IAExC,CAAC,GAEG,CAAC8F,EAAY;AACf;AAGF,UAAMC,IAAS,IAAInG,EAAE,KAAK,aAAA;AA8B1B,QA5BAkG,EAAY,QAAQ,CAAC,EAAE,OAAA/F,GAAO,UAAAC,QAAe;AAC3C,YAAM,EAAE,KAAA0F,GAAK,KAAAC,EAAA,IAAQ3F,GACfgG,IAAU,KAAK,cAAcjG,CAAK,GAClCuD,IACJ0C,KAAW,KAAK,MACZ;AAAA,QACE,KAAKA;AAAA,QACL,YAAY,IAAIpG,EAAE,KAAK,KAAK,IAAI,EAAE;AAAA,QAClC,QAAQ,IAAIA,EAAE,KAAK,MAAM,IAAI,EAAE;AAAA,MAAA,IAEjC,QACAiG,IAAS,IAAIjG,EAAE,KAAK,OAAO;AAAA,QAC/B,KAAK,KAAK;AAAA,QACV,UAAU,EAAE,KAAA8F,GAAK,KAAAC,EAAA;AAAA,QACjB,OAAO5F,EAAM;AAAA,QACb,MAAAuD;AAAA,MAAA,CACD;AACD,MAAAuC,EAAO,YAAY,SAAS,MAAM;AAChC,aAAK,eAAe9F,CAAK,GACzB,KAAK,kBAAkBA,EAAM,EAAE;AAAA,MACjC,CAAC,GACD,KAAK,QAAQ,KAAK8F,CAAM;AACxB,YAAMI,IAAiBJ,EAAO,YAAA;AAC9B,MAAII,KACFF,EAAO,OAAOE,CAAc;AAAA,IAEhC,CAAC,GAEG,CAAC,KAAK,sBAAsB,KAAK,QAAQ,QAAQ;AACnD,YAAMjG,IAAW,KAAK,QAAQ,CAAC,EAAE,YAAA;AACjC,UAAIA,GAAU;AACZ,aAAK,IAAI,UAAUA,CAAQ,GAC3B,KAAK,IAAI,QAAQ,EAAE,GACnB,KAAK,qBAAqB;AAC1B;AAAA,MACF;AAAA,IACF;AAEA,QAAI,KAAK,QAAQ,WAAW,GAAG;AAC7B,YAAMA,IAAW,KAAK,QAAQ,CAAC,EAAE,YAAA;AACjC,MAAIA,KACF,KAAK,IAAI,UAAUA,CAAQ,GAE7B,KAAK,IAAI,QAAQ,EAAE;AAAA,IACrB;AACE,WAAK,IAAI,UAAU+F,CAAM;AAAA,EAE7B;AAAA,EAEQ,eAAehG,GAAiB;AXl0DnC,QAAAvB;AWm0DH,IAAI,CAAC,KAAK,uBAAuB,CAAC,KAAK,qBAAqB,CAAC,KAAK,qBAGlE,KAAK,kBAAkB,cAAcuB,EAAM,UAAU,cACrD,KAAK,iBAAiB,gBAAgB,KAAK,wBAAwBA,CAAK,CAAC,GACzE,KAAK,oBAAoB,gBAAgB,QAAQ,IACjDvB,IAAA,KAAK,0BAAL,QAAAA,EAA4B;AAAA,EAC9B;AAAA,EAsBQ,wBAAwBuB,GAAiB;AXh2D5C,QAAAvB;AWi2DH,UAAM6D,IAAW,SAAS,uBAAA;AAE1B,QAAItC,EAAM,SAAS;AACjB,YAAMmG,IAAQ,SAAS,cAAc,KAAK;AAC1C,MAAAA,EAAM,YAAY,sBAClBA,EAAM,MAAMnG,EAAM,SAClBmG,EAAM,MAAMnG,EAAM,UAAU,oBAC5BmG,EAAM,UAAU,QAChBA,EAAM,iBAAiB,SAAS,MAAMA,EAAM,UAAU,EAAE,MAAM,IAAM,GACpE7D,EAAS,YAAY6D,CAAK;AAAA,IAC5B;AAEA,UAAMC,IAAkB,KAAK,wBAAA;AAC7B,SAAK,qBAAqBA,GAAiB,aAAapG,EAAM,SAAS,GACvE,KAAK,qBAAqBoG,GAAiB,UAAUpG,EAAM,WAAW,GACtE,KAAK,qBAAqBoG,GAAiB,aAAapG,EAAM,cAAc,GAC5E,KAAK,qBAAqBoG,GAAiB,UAAUpG,EAAM,WAAW,GACtE,KAAK,qBAAqBoG,GAAiB,OAAOpG,EAAM,GAAG,GACvDoG,EAAgB,qBAClB9D,EAAS,YAAY8D,CAAe;AAGtC,UAAMpC,IAAiB,KAAK,wBAAA;AAE5B,QADA,KAAK,qBAAqBA,GAAgB,UAAUhE,EAAM,KAAK,IAC3DvB,IAAAuB,EAAM,cAAN,QAAAvB,EAAiB,QAAQ;AAC3B,YAAM4B,IAAQ,SAAS,cAAc,GAAG;AACxC,MAAAA,EAAM,YAAY;AAClB,YAAMgG,IAAS,SAAS,cAAc,MAAM;AAC5C,MAAAA,EAAO,YAAY,sBACnBA,EAAO,cAAc,cACrBhG,EAAM,YAAYgG,CAAM,GACxBrC,EAAe,YAAY3D,CAAK;AAEhC,YAAM6D,IAAY,SAAS,cAAc,IAAI;AAC7C,MAAAA,EAAU,YAAY,2BACtBlE,EAAM,UACH,MAAA,EACA,KAAK,CAACmE,GAAGC,MAAMD,EAAE,QAAQC,EAAE,KAAK,EAChC,QAAQ,CAACC,MAAU;AAClB,QAAAH,EAAU,YAAY,KAAK,0BAA0BG,CAAK,CAAC;AAAA,MAC7D,CAAC,GACHL,EAAe,YAAYE,CAAS;AAAA,IACtC;AAKA,QAJIF,EAAe,qBACjB1B,EAAS,YAAY0B,CAAc,GAGjChE,EAAM,WAAW;AACnB,YAAMsG,IAAe,KAAK,wBAAA,GACpBzB,IAAQ,SAAS,cAAc,KAAK;AAC1C,MAAAA,EAAM,YAAY,sBAClBA,EAAM,YAAY7E,EAAM,WACxB6E,EAAM,iBAAiB,GAAG,EAAE,QAAQ,CAACD,MAAS;AAC5C,QAAAA,EAAK,SAAS,UACdA,EAAK,MAAM;AAAA,MACb,CAAC,GACD0B,EAAa,YAAYzB,CAAK,GAC9BvC,EAAS,YAAYgE,CAAY;AAAA,IACnC;AAEA,UAAM1C,IAAU,KAAK,wBAAwB5D,CAAK;AAClD,WAAI4D,EAAQ,qBACVtB,EAAS,YAAYsB,CAAO,GAGvBtB;AAAA,EACT;AAAA,EAEQ,0BAA0B;AAChC,UAAME,IAAU,SAAS,cAAc,KAAK;AAC5C,WAAAA,EAAQ,YAAY,wBACbA;AAAA,EACT;AAAA,EAEQ,qBAAqBA,GAAsBnC,GAAeH,GAAe;AAC/E,UAAMC,KAAcD,KAAA,OAAAA,IAAS,IAAI,KAAA;AACjC,QAAI,CAACC,KAAcA,MAAe;AAChC;AAEF,UAAMoG,IAAO,SAAS,cAAc,GAAG;AACvC,IAAAA,EAAK,YAAY;AACjB,UAAMF,IAAS,SAAS,cAAc,MAAM;AAC5C,IAAAA,EAAO,YAAY,sBACnBA,EAAO,cAAc,GAAGhG,CAAK,MAC7BkG,EAAK,YAAYF,CAAM,GACvBE,EAAK,YAAY,SAAS,eAAepG,CAAU,CAAC,GACpDqC,EAAQ,YAAY+D,CAAI;AAAA,EAC1B;AAAA,EAEQ,0BAA0BlC,GAAsB;AX17DnD,QAAA5F;AW27DH,UAAM6F,IAAO,SAAS,cAAc,IAAI;AACxC,IAAAA,EAAK,YAAY;AAEjB,UAAMjE,IAAQ,SAAS,cAAc,MAAM;AAC3C,IAAAA,EAAM,YAAY,sBAClBA,EAAM,cAAc,GAAGgE,EAAM,UAAU,UAAU,MACjDC,EAAK,YAAYjE,CAAK;AAEtB,UAAMmG,MAAe/H,IAAA4F,EAAM,aAAN,OAAA5F,IAAkB,IAAI,KAAA,GACrCgI,IAAe,KAAK,gBAAgBpC,CAAK,IAAI,KAAK,gBAAgBmC,CAAW,IAAI;AACvF,QAAIC,GAAc;AAChB,YAAM7B,IAAO,SAAS,cAAc,GAAG;AACvC,MAAAA,EAAK,OAAO6B,GACZ7B,EAAK,SAAS,UACdA,EAAK,MAAM,uBACXA,EAAK,YAAY,qBACjBA,EAAK,cAAc4B,GACnBlC,EAAK,YAAYM,CAAI;AAAA,IACvB;AACE,MAAAN,EAAK,YAAY,SAAS,eAAekC,CAAW,CAAC;AAGvD,WAAOlC;AAAA,EACT;AAAA,EAEQ,wBAAwBtE,GAAiB;AAC/C,UAAM4D,IAAU,SAAS,cAAc,KAAK;AAC5C,WAAAA,EAAQ,YAAY,6CAEhB5D,EAAM,OAAOA,EAAM,QAAQ,OAC7B4D,EAAQ,YAAY,KAAK,qBAAqB5D,EAAM,KAAK,WAAW,CAAC,GAEnEA,EAAM,cACR4D,EAAQ,YAAY,KAAK,qBAAqB5D,EAAM,YAAY,aAAa,CAAC,GAE5EA,EAAM,SACR4D,EAAQ,YAAY,KAAK,qBAAqB,UAAU5D,EAAM,KAAK,IAAI,iBAAiB,EAAK,CAAC,GAGzF4D;AAAA,EACT;AAAA,EAEQ,qBAAqB8C,GAAcjD,GAAckD,IAAW,IAAM;AACxE,UAAM/B,IAAO,SAAS,cAAc,GAAG;AACvC,WAAAA,EAAK,OAAO8B,GACZ9B,EAAK,YAAY,qBACjBA,EAAK,cAAcnB,GACfkD,MACF/B,EAAK,SAAS,UACdA,EAAK,MAAM,wBAENA;AAAA,EACT;AAAA,EAYQ,cAAcgC,GAAmB;AAAA,EAAC;AAAA,EAElC,oBAAoBjI,GAAe;AACzC,QAAI,CAAC,KAAK;AACR;AAEF,UAAM6D,IAAU,KAAK,eAAe,cAA2B,uBAAuB7D,CAAI,IAAI;AAC9F,IAAK6D,KAGLA,EAAQ,eAAe,EAAE,UAAU,UAAU,OAAO,SAAS;AAAA,EAC/D;AAAA,EAEQ,oBAAoB;AAC1B,SAAK,YAAY,QAAQ,CAACvD,MAAQ;AAChC,YAAMN,IAAOM,EAAI,QAAQ,MACnB4H,IAAW,KAAK,eAAelI;AACrC,MAAAM,EAAI,UAAU,OAAO,aAAa4H,CAAQ,GAC1C5H,EAAI,aAAa,gBAAgB,OAAO4H,CAAQ,CAAC;AAAA,IACnD,CAAC;AAAA,EACH;AAAA,EAEQ,yBAAyB;AAC/B,SAAK,YAAY,QAAQ,CAAC5H,MAAQ;AACnB,MAAAA,EAAI,QAAQ;AACzB,YAAM6H,IAAY7H,EAAI,QAAQ,SAASA,EAAI,eAAe;AAC1D,MAAAA,EAAI,cAAc6H;AAAA,IACpB,CAAC;AAAA,EACH;AAAA,EAEQ,uBAAuB;AAC7B,QAAI,CAAC,KAAK;AACR;AAGF,IADiB,KAAK,eAAe,iBAA8B,qBAAqB,EAC/E,QAAQ,CAACtE,MAAY;AAC5B,MAAAA,EAAQ,gBAAgB,QAAQ;AAAA,IAClC,CAAC;AAAA,EACH;AAAA,EA2BQ,iBAAiBmD,GAAaC,GAA8B;AAClE,QAAI,CAAC,KAAK,OAAO;AACf,aAAO;AAET,QAAI7G,IAA2B,MAC3BgI,IAAe;AACnB,gBAAK,OAAO,QAAQ,CAAC/G,MAAU;AAC7B,YAAMC,IAAW,KAAK,iBAAiBD,CAAK;AAC5C,UAAI,CAACC;AACH;AAEF,YAAM+G,IAAW,KAAK,UAAUrB,GAAKC,GAAK3F,EAAS,KAAKA,EAAS,GAAG;AACpE,MAAI+G,IAAWD,MACbA,IAAeC,GACfjI,IAAUiB;AAAA,IAEd,CAAC,GACMjB;AAAA,EACT;AAAA,EAEQ,UAAUkI,GAAcC,GAAcC,GAAcC,GAAc;AACxE,UAAMC,IAAQ,CAACC,MAAiBA,IAAM,KAAK,KAAM,KAE3CC,IAAOF,EAAMF,IAAOF,CAAI,GACxBO,IAAOH,EAAMD,IAAOF,CAAI,GACxB/C,IACJ,KAAK,IAAIoD,IAAO,CAAC,IAAI,KAAK,IAAIA,IAAO,CAAC,IACtC,KAAK,IAAIF,EAAMJ,CAAI,CAAC,IAAI,KAAK,IAAII,EAAMF,CAAI,CAAC,IAAI,KAAK,IAAIK,IAAO,CAAC,IAAI,KAAK,IAAIA,IAAO,CAAC;AAExF,WAAO,UADG,IAAI,KAAK,MAAM,KAAK,KAAKrD,CAAC,GAAG,KAAK,KAAK,IAAIA,CAAC,CAAC;AAAA,EAEzD;AAAA,EAEQ,kBAAkBsD,GAAiB;AACzC,QAAI,CAAC,KAAK;AACR;AAEF,UAAM5E,IAAO,KAAK,eAAe,cAA2B,mBAAmB4E,CAAO,IAAI;AAC1F,IAAK5E,MAGLA,EAAK,eAAe,EAAE,UAAU,UAAU,OAAO,UAAU,GAC3D,KAAK,mBAAmBA,CAAI;AAAA,EAC9B;AAAA,EAEQ,mBAAmBA,GAAmB;AXxmEzC,QAAApE;AWymEH,IAAI,KAAK,qBAAqB,SAC5B,aAAa,KAAK,gBAAgB,GAClC,KAAK,mBAAmB,QAE1BA,IAAA,KAAK,mBAAL,QAAAA,EAAqB,iBAAiB,0BAA0B,QAAQ,CAACiJ,MAAO;AAC9E,MAAAA,EAAG,UAAU,OAAO,uBAAuB;AAAA,IAC7C,IACA7E,EAAK,UAAU,IAAI,uBAAuB,GAC1C,KAAK,mBAAmB,OAAO,WAAW,MAAM;AAC9C,MAAAA,EAAK,UAAU,OAAO,uBAAuB,GAC7C,KAAK,mBAAmB;AAAA,IAC1B,GAAG,IAAI;AAAA,EACT;AAAA,EAEQ,kBAAkB8E,GAAsC;AAC9D,QAAI,GAAC,KAAK,sBAAsB,CAAC,KAAK;AAGtC,UAAIA,MAAU;AACZ,aAAK,mBAAmB,aAAa,UAAU,EAAE,GACjD,KAAK,YAAY,gBAAgB,QAAQ;AAAA,WACpC;AACL,cAAMlE,IAAOkE,MAAU,YAAY,uBAAuB;AAC1D,aAAK,mBAAmB,cAAclE,GACtC,KAAK,mBAAmB,gBAAgB,QAAQ,GAChD,KAAK,YAAY,aAAa,UAAU,EAAE;AAAA,MAC5C;AAAA,EACF;AAAA,EAEQ,iBAAiBkC,GAAaC,GAAagC,IAAa,IAAI;AAElE,QAAI,CADO,OAAe,UAChB,CAAC,KAAK,OAAO,CAAC,OAAO,SAASjC,CAAG,KAAK,CAAC,OAAO,SAASC,CAAG;AAClE;AAEF,UAAMiC,IAAc,OAAO,KAAK,IAAI,WAAY,aAAa,KAAK,IAAI,QAAA,IAAY,MAC5EC,IAAY,CAACD,KAAeA,IAAcD;AAChD,SAAK,cAAcjC,GAAKC,GAAK,MAAM;AACjC,MAAIkC,KACF,KAAK,IAAI,QAAQF,CAAU;AAAA,IAE/B,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,mBAAmBjC,GAAaC,GAAa;AAEzD,IAAI,CADO,OAAe,UAChB,CAAC,KAAK,OAAO,CAAC,OAAO,SAASD,CAAG,KAAK,CAAC,OAAO,SAASC,CAAG,MAIpE,MAAM,KAAK,cAAc,GAAG,GAAG,GAC/B,MAAM,KAAK,KAAK,GAAG,GACnB,MAAM,IAAI,QAAc,CAACrG,MAAY;AACnC,WAAK,cAAcoG,GAAKC,GAAKrG,CAAO;AAAA,IACtC,CAAC,GACD,MAAM,KAAK,KAAK,GAAG,GACnB,MAAM,KAAK,cAAc,IAAI,GAAG;AAAA,EAClC;AAAA,EAEQ,KAAKwI,GAAY;AACvB,WAAO,IAAI,QAAc,CAACxI,MAAY;AACpC,aAAO,WAAWA,GAASwI,CAAE;AAAA,IAC/B,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,cAAcH,GAAoBI,IAAW,KAAK;AAE9D,QACE,CAFS,OAAe,UAGxB,CAAC,KAAK,OACN,OAAO,KAAK,IAAI,WAAY,cAC5B,OAAO,KAAK,IAAI,WAAY;AAE5B;AAEF,UAAMC,IAAY,KAAK,IAAI,QAAA;AAC3B,QAAI,CAAC,OAAO,SAASA,CAAS,GAAG;AAC/B,WAAK,IAAI,QAAQL,CAAU;AAC3B;AAAA,IACF;AACA,UAAMM,IAAQN,IAAaK;AAC3B,QAAI,KAAK,IAAIC,CAAK,IAAI,MAAM;AAC1B,WAAK,IAAI,QAAQN,CAAU;AAC3B;AAAA,IACF;AAEA,UAAM,IAAI,QAAc,CAACrI,MAAY;AACnC,YAAM4I,IAAY,YAAY,IAAA,GACxBC,IAAO,CAACC,MAAc,IAAI,KAAK,IAAI,IAAIA,GAAG,CAAC,GAE3CC,IAAO,CAACC,MAAgB;AAC5B,cAAMC,IAAUD,IAAMJ,GAChBM,IAAW,KAAK,IAAID,IAAUR,GAAU,CAAC,GACzCU,IAAQN,EAAKK,CAAQ,GACrBE,IAAWV,IAAYC,IAAQQ;AACrC,aAAK,IAAI,QAAQ,KAAK,MAAMC,IAAW,GAAG,IAAI,GAAG,GAC7CF,IAAW,IACb,sBAAsBH,CAAI,KAE1B,KAAK,IAAI,QAAQV,CAAU,GAC3BrI,EAAA;AAAA,MAEJ;AAEA,4BAAsB+I,CAAI;AAAA,IAC5B,CAAC;AAAA,EACH;AAAA,EAEQ,cAAcM,GAAmBC,GAAmBC,GAAyB;AAEnF,QAAI,CADO,OAAe,UAChB,CAAC,KAAK;AACd;AAEF,IAAI,KAAK,sBAAsB,SAC7B,qBAAqB,KAAK,iBAAiB,GAC3C,KAAK,oBAAoB;AAE3B,UAAMC,IAAc,KAAK,IAAI,UAAA;AAC7B,QAAI,CAACA,GAAa;AAChB,WAAK,IAAI,UAAU,EAAE,KAAKH,GAAW,KAAKC,GAAW,GACrDC,KAAA,QAAAA;AACA;AAAA,IACF;AACA,UAAME,IAAWD,EAAY,IAAA,GACvBE,IAAWF,EAAY,IAAA,GACvBG,IAAWN,IAAYI,GACvBG,IAAWN,IAAYI,GACvBjB,IAAW,KACXG,IAAY,YAAY,IAAA,GAExBC,IAAO,CAACC,MAAc,IAAI,KAAK,IAAI,IAAIA,GAAG,CAAC,GAE3CC,IAAO,CAACC,MAAgB;AAC5B,YAAMC,IAAUD,IAAMJ,GAChBM,IAAW,KAAK,IAAID,IAAUR,GAAU,CAAC,GACzCU,IAAQN,EAAKK,CAAQ,GACrBW,IAAUJ,IAAWE,IAAWR,GAChCW,IAAUJ,IAAWE,IAAWT;AACtC,WAAK,IAAI,UAAU,EAAE,KAAKU,GAAS,KAAKC,GAAS,GAC7CZ,IAAW,IACb,KAAK,oBAAoB,sBAAsBH,CAAI,KAEnD,KAAK,oBAAoB,MACzBQ,KAAA,QAAAA;AAAA,IAEJ;AAEA,SAAK,oBAAoB,sBAAsBR,CAAI;AAAA,EACrD;AAAA,EAEA,OAAe,oBAAoB;AACjC,QAAI/J,EAAM;AACR;AAGF,QADiB,SAAS,cAAc,cAAcb,CAAuB,IAAI,GACnE;AACZ,MAAAa,EAAM,sBAAsB;AAC5B;AAAA,IACF;AACA,UAAMqG,IAAO,SAAS,cAAc,MAAM;AAC1C,IAAAA,EAAK,MAAM,cACXA,EAAK,OAAOlH,GACZkH,EAAK,cAAc,aACnBA,EAAK,iBAAiB,eACtBA,EAAK,iBAAiB,QAAQ,MAAM;AAClC,MAAArG,EAAM,sBAAsB;AAAA,IAC9B,CAAC,GACD,SAAS,KAAK,YAAYqG,CAAI;AAAA,EAChC;AAAA,EAEQ,kBAAkB0E,GAAmB;AAC3C,UAAM/F,IAAO,SAAS,cAAc,GAAG;AACvC,WAAAA,EAAK,YAAY+F,GACjB/F,EAAK,aAAa,eAAe,MAAM,GAChCA;AAAA,EACT;AAAA,EAEQ,gBAAgBc,GAAsB;AAC5C,WAAO,GAAQA,EAAM,YAAYA,EAAM;AAAA,EACzC;AAAA,EAEQ,gBAAgBA,GAAe;AACrC,UAAMkF,IAASlF,EAAM,QAAQ,QAAQ,EAAE;AACvC,WAAKkF,IAGE,iBAAiBA,CAAM,KAFrB;AAAA,EAGX;AACF;AAzpEE/K,EADWD,GACJ,OAAM,WACbC,EAFWD,GAEI,2BAAgD,OAC/DC,EAHWD,GAGI,wBAA2D,OAmC1EC,EAtCWD,GAsCI,uBAAsB;AAtChC,IAAMiL,IAANjL;AC3IP,MAAAkL,KAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SCAfC,KAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SCATC,KAAgB,YAChBC,KAAqB,0BACrBC,KAAqB,mBACrBC,KAAyB,0HACzBC,IAAyB,WACzBtM,KAAsB,WACtBuM,IAAsB,cACtBC,KAAoB,kBACpBC,KAAmB,uBAAA,OAAA;AAAA,EAAA,kBAAAT;AAAA,EAAA,wBAAAC;AAAA,CAAA,GAKnB9L,KAAuC;AAAA,EAC3C,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,MAAM;AACR,GACMC,KAAwC;AAAA,EAC5C,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,WAAW;AACb,GACMsM,KAAsC;AAAA,EAC1C,GAAK;AAAA,EACL,GAAK;AAAA,EACL,KAAK;AAAA,EACL,SAAS;AAAA,EACT,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,GAAK;AAAA,EACL,KAAK;AAAA,EACL,OAAO;AAAA,EACP,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,GAAK;AAAA,EACL,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,SAAS;AAAA,EACT,GAAK;AAAA,EACL,KAAK;AAAA,EACL,WAAW;AAAA,EACX,KAAK;AAAA,EACL,WAAW;AAAA,EACX,GAAK;AAAA,EACL,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,UAAU;AAAA,EACV,GAAK;AAAA,EACL,KAAK;AAAA,EACL,SAAS;AAAA,EACT,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,GAAK;AAAA,EACL,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,UAAU;AACZ,GACMC,KAAmD;AAAA,EACvD,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACP,GACMC,KAA0B,OAAO;AAAA,EACrC,OAAO,QAAQH,EAAgB,EAAE,IAAI,CAAC,CAACxI,GAAM4I,CAAG,MAAM;AdxEjD,QAAA7L,GAAAS;AcyEH,UAAME,KAAOF,KAAAT,IAAAiD,EAAK,MAAM,GAAG,EAAE,UAAhB,gBAAAjD,EAAuB,QAAQ,WAAW,QAA1C,OAAAS,IAAiD;AAC9D,WAAO,CAACqL,EAAenL,CAAI,GAAGoL,GAAiBF,CAAG,CAAC;AAAA,EACrD,CAAC;AACH;AAUA,SAASE,GAAiBF,GAAa;AACrC,SAAOA,EACJ,QAAQ,yBAAyB,EAAE,EACnC,QAAQ,0BAA0B,EAAE,EACpC,QAAQ,sCAAsC,EAAE,EAChD,QAAQ,WAAW,kEAAkE,EACrF,QAAQ,8BAA8B,6BAA6B;AACxE;AAEA,SAASC,EAAerK,GAAe;AACrC,SAAOA,EACJ,UAAU,KAAK,EACf,QAAQ,oBAAoB,EAAE,EAC9B,KAAA,EACA,YAAA,EACA,QAAQ,eAAe,EAAE;AAC9B;AAEO,MAAMuK,UAAmB,YAAY;AAAA,EAgC1C,cAAc;AACZ,UAAA;AA9BM,IAAAjM,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAmsBA,IAAAA,EAAA,2BAAoB,MAAM;AAChC,MAAI,KAAK,OAAO,UACd,KAAK,sBAAA,GAGP,KAAK,YAAY,KAAK,OAAO,MAAM;AAAA,IACrC;AAEQ,IAAAA,EAAA,yBAAkB,CAACE,MAAsB;AAC/C,YAAMgD,IAAOhD,EAAM,aAAA;AAKnB,UAJqBgD,EAAK,KAAK,CAACgJ,MACvBA,aAAgB,qBAAqBA,EAAK,aAAa,eAAe,MAAM,MACpF,GAEiB;AAChB,QAAAhM,EAAM,eAAA;AACN;AAAA,MACF;AAMA,MAJ2BgD,EAAK,KAAK,CAACgJ,MAC7BA,aAAgB,qBAAqBA,aAAgB,iBAC7D,KAGC,KAAK,YAAY,EAAK;AAAA,IAE1B;AAEQ,IAAAlM,EAAA,oCAA6B,MAAM;AACzC,WAAK,sBAAA;AAAA,IACP;AAEQ,IAAAA,EAAA,gCAAyB,MAAM;AACrC,WAAK,sBAAA;AAAA,IACP;AAEQ,IAAAA,EAAA,6BAAsB,CAACE,MAAsB;AACnD,MAAI,KAAK,OAAO,UAAUA,EAAM,eAAe,SAAS,IAAI,KAI5D,KAAK,YAAY,EAAK;AAAA,IACxB;AAEQ,IAAAF,EAAA,+BAAwB,CAACE,MAAyB;AACxD,MAAI,KAAK,OAAO,UAAUA,EAAM,QAAQ,aAIxC,KAAK,YAAY,EAAK,GACtB,KAAK,SAAS,MAAA;AAAA,IAChB;AA/tBE,SAAK,OAAO,KAAK,aAAa,EAAE,MAAM,QAAQ,GAC9C,KAAK,KAAK,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uCAQaqL,CAAsB;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,8CAgCfA,CAAsB;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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+OlE;AAAA,EA7SA,WAAW,qBAAqB;AAC9B,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA,EA8RA,oBAAoB;AAClB,SAAK,WAAW,KAAK,KAAK,cAAiC,QAAQ,GACnE,KAAK,SAAS,KAAK,KAAK,cAA2B,OAAO,GAC1D,KAAK,qBAAqB,KAAK,KAAK,cAA2B,0BAA0B,GACzF,KAAK,mBAAmB,KAAK,KAAK,cAA+B,mBAAmB,GACpF,KAAK,kBAAkB,KAAK,KAAK,cAA2B,uBAAuB,GACnF,KAAK,sBAAsB,KAAK,KAAK,cAA2B,4BAA4B,GAC5F,KAAK,UAAU,KAAK,KAAK,cAA+B,QAAQ,GAChE,KAAK,SAAS,iBAAiB,SAAS,KAAK,iBAAiB,GAC9D,KAAK,OAAO,iBAAiB,SAAS,KAAK,eAAe,GAC1D,KAAK,iBAAiB,iBAAiB,cAAc,KAAK,0BAA0B,GACpF,SAAS,iBAAiB,SAAS,KAAK,mBAAmB,GAC3D,SAAS,iBAAiB,WAAW,KAAK,qBAAqB,GAC/D,KAAK,mBAAmB,IAAI,iBAAiB,KAAK,sBAAsB,GACxE,KAAK,iBAAiB,QAAQ,MAAM;AAAA,MAClC,WAAW;AAAA,MACX,SAAS;AAAA,MACT,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,iBAAiB,CAAC,SAAS,YAAY,WAAW,UAAU,QAAQ,QAAQ,SAAS,OAAO;AAAA,IAAA,CAC7F,GACD,KAAK,sBAAA;AAAA,EACP;AAAA,EAEA,uBAAuB;Ad5blB,QAAAtL,GAAAS,GAAAC,GAAAwL;Ac6bH,KAAAlM,IAAA,KAAK,aAAL,QAAAA,EAAe,oBAAoB,SAAS,KAAK,qBACjDS,IAAA,KAAK,WAAL,QAAAA,EAAa,oBAAoB,SAAS,KAAK,mBAC/CC,IAAA,KAAK,qBAAL,QAAAA,EAAuB,oBAAoB,cAAc,KAAK,6BAC9D,SAAS,oBAAoB,SAAS,KAAK,mBAAmB,GAC9D,SAAS,oBAAoB,WAAW,KAAK,qBAAqB,IAClEwL,IAAA,KAAK,qBAAL,QAAAA,EAAuB;AAAA,EACzB;AAAA,EAEA,2BAA2B;AACzB,IAAI,KAAK,eACP,KAAK,sBAAA;AAAA,EAET;AAAA,EAEQ,wBAAwB;Ad3c3B,QAAAlM,GAAAS,GAAAC,GAAAwL,GAAAC;Ac4cH,UAAMvK,MAAS5B,IAAA,KAAK,aAAa,OAAO,MAAzB,OAAAA,IAA8B,IAAI,UAAUkL,IACrDkB,MAAa3L,IAAA,KAAK,aAAa,YAAY,MAA9B,OAAAA,IAAmC,IAAI,UAAU2K,IAC9DiB,MAAa3L,IAAA,KAAK,aAAa,YAAY,MAA9B,OAAAA,IAAmC,IAAI,UAAUyK,IAC9DmB,MAAUJ,IAAA,KAAK,aAAa,QAAQ,MAA1B,OAAAA,IAA+B,UAAU,UAAU,UAC7DpH,MAAQqH,IAAA,KAAK,aAAa,MAAM,MAAxB,OAAAA,IAA6BZ,GAAqB,UAAUA,GACpEgB,IAAW,KAAK,uBAAA;AAWtB,QATA,KAAK,QAAQ,cAAc3K,GAC3B,KAAK,SAAS,aAAa,cAAcyK,CAAS,GAClD,KAAK,SAAS,aAAa,SAASA,CAAS,GAC7C,KAAK,iBAAA,GAEL,KAAK,oBAAoB,cAAc,KAAK,iBAAA,GAC5C,KAAK,gBAAgB,SAAS,CAACE,GAC/B,KAAK,iBAAiB,SAASA,GAE3BA,GAAU;AACZ,WAAK,mBAAmB,SAAS,IACjC,KAAK,mBAAmB,gBAAA;AACxB;AAAA,IACF;AAEA,SAAK,kBAAkBH,GAAWE,GAAQxH,CAAI;AAAA,EAChD;AAAA,EAEQ,iBAAiB0H,GAA8BC,GAA6B;AAClF,UAAMC,IAAW,KAAK,cAAcF,CAAa;AAEjD,QAAI,CAACE;AACH,aAAO;AAGT,UAAMC,KAAWF,KAAA,OAAAA,IAAgB,IAAI,KAAA,GAC/BG,IAAQD,IAAU,SAAS,mBAAmBA,CAAO,CAAC,KAAK;AAEjE,WAAO,GAAGnB,EAAiB,GAAGkB,CAAQ,GAAGE,CAAK;AAAA,EAChD;AAAA,EAEQ,cAAcnL,GAAsB;AAC1C,YAAQA,KAAA,OAAAA,IAAS,IAAI,QAAQ,UAAU,EAAE;AAAA,EAC3C;AAAA,EAEQ,mBAAmB;AdtftB,QAAAzB,GAAAS;AcufH,UAAMsC,MAAS/C,IAAA,KAAK,aAAa,OAAO,MAAzB,OAAAA,IAA8B,IAAI,KAAA;AAEjD,QAAI,CAAC+C,GAAO;AACV,WAAK,MAAM,YAAY,6BAA6BuI,CAAsB;AAC1E;AAAA,IACF;AAEA,UAAMuB,IAAW,KAAK,kBAAkB9J,CAAK,GACvCjB,KAAQrB,IAAAtB,GAAa0N,CAAQ,MAArB,OAAApM,IAA0BzB;AACxC,SAAK,MAAM,YAAY,6BAA6B8C,CAAK;AAAA,EAC3D;AAAA,EAEQ,kBAAkBL,GAAe;AdngBpC,QAAAzB;AcogBH,UAAM0B,IAAaoK,EAAerK,CAAK;AACvC,YAAOzB,IAAAZ,GAAcsC,CAAU,MAAxB,OAAA1B,IAA6B0B;AAAA,EACtC;AAAA,EAEQ,kBAAkBoL,GAAuBC,GAAwBC,GAAsB;AAG7F,QAFsB,KAAK,iBAAiB,iBAAiB,EAAE,SAAS,GAAA,CAAM,EAAE,SAAS,GAEtE;AACjB,WAAK,mBAAmB,SAAS,IACjC,KAAK,mBAAmB,gBAAA;AACxB;AAAA,IACF;AAKA,UAAMC,IAHU,KAAK,mBAAmBH,GAAeC,GAAgBC,CAAY,EAAE,OAAO,CAACE,MACpF,KAAK,cAAcA,EAAO,QAAQ,CAC1C,EACqB,IAAI,CAACA,MAAW,KAAK,eAAeA,CAAM,CAAC;AAEjE,SAAK,mBAAmB,gBAAgB,GAAGD,CAAK,GAChD,KAAK,mBAAmB,SAAS;AAAA,EACnC;AAAA,EAEQ,mBAAmBH,GAAuBC,GAAwBC,GAA4C;Ad1hBjH,QAAAhN,GAAAS;Ac2hBH,UAAM0M,IAAiB,MAAM,KAAK,KAAK,iBAAmCC,EAAiB,GAAG,CAAC;AAE/F,WAAID,EAAe,SACVA,EAAe,IAAI,CAACE,MAAA;Ad9hB1B,UAAArN,GAAAS,GAAAC,GAAAwL,GAAAC,GAAAmB;Ac8hBwC;AAAA,QACvC,SAAQ7M,KAAAT,IAAAqN,EAAS,aAAa,OAAO,MAA7B,OAAArN,IAAkCqN,EAAS,gBAA3C,OAAA5M,IAA0D,IAAI,KAAA,KAAUqM;AAAA,QAChF,YAAWpM,IAAA2M,EAAS,aAAa,UAAU,MAAhC,OAAA3M,IAAqC,IAAI,KAAA;AAAA,QACpD,WAAUwL,IAAAmB,EAAS,aAAa,SAAS,MAA/B,OAAAnB,IAAoC,IAAI,KAAA;AAAA,QAClD,UAASC,IAAAkB,EAAS,aAAa,QAAQ,MAA9B,OAAAlB,IAAmCY,GAAgB,UAAUA;AAAA,QACtE,QAAOO,IAAAD,EAAS,aAAa,MAAM,MAA5B,OAAAC,IAAiCN,GAAc,UAAUA;AAAA,MAAA;AAAA,KAChE,IAGG;AAAA,MACL;AAAA,QACE,OAAOF;AAAA,QACP,YAAW9M,IAAA,KAAK,aAAa,UAAU,MAA5B,OAAAA,IAAiC,IAAI,KAAA;AAAA,QAChD,WAAUS,IAAA,KAAK,aAAa,SAAS,MAA3B,OAAAA,IAAgC,IAAI,KAAA;AAAA,QAC9C,QAAQsM;AAAA,QACR,MAAMC;AAAA,MAAA;AAAA,IACR;AAAA,EAEJ;AAAA,EAEQ,eAAeE,GAA4B;AACjD,UAAMK,IAAS,SAAS,cAAc,GAAG,GACnCC,IAAU,SAAS,cAAc,MAAM,GACvCvF,IAAO,KAAK,iBAAiBiF,EAAO,UAAUA,EAAO,OAAO;AAElE,IAAAK,EAAO,YAAY,aACnBA,EAAO,MAAM,uBACbA,EAAO,SAASL,EAAO,QACvBM,EAAQ,YAAY,cACpBA,EAAQ,cAAcN,EAAO;AAC7B,UAAMO,IAAS,KAAK,iBAAiBP,EAAO,IAAI;AAQhD,WANIO,KACFF,EAAO,OAAOE,CAAM,GAGtBF,EAAO,OAAOC,CAAO,GAEjBvF,KACFsF,EAAO,OAAOtF,GACdsF,EAAO,WAAW,GACXA,MAGTA,EAAO,aAAa,iBAAiB,MAAM,GAC3CA,EAAO,WAAW,IACXA;AAAA,EACT;AAAA,EAEQ,iBAAiBzI,GAAc;Ad/kBlC,QAAA9E,GAAAS;AcglBH,UAAMiN,IAAU5B,EAAehH,CAAI,GAC7B6I,IAAUD,MAAY,SAAS,KAAK9B,GAAwB8B,KAAWnC,CAAmB;AAEhG,QAAI,CAACoC;AACH,aAAO;AAGT,UAAMC,IAAW,SAAS,cAAc,UAAU;AAClD,WAAAA,EAAS,YAAYD,IACdlN,KAAAT,IAAA4N,EAAS,QAAQ,sBAAjB,gBAAA5N,EAAoC,UAAU,QAA9C,OAAAS,IAAuD,SAAS,cAAc,MAAM;AAAA,EAC7F;AAAA,EAEQ,mBAAmB;Ad5lBtB,QAAAT;Ac6lBH,UAAM6N,MAAW7N,IAAA,KAAK,aAAa,uBAAuB,MAAzC,OAAAA,IAA8C,IAAI,UAAUqL,IACvEyC,IAAkB,KAAK,mBAAA;AAE7B,WAAOA,IAAkB,GAAGD,CAAO;AAAA;AAAA,EAA2BC,CAAe,KAAKD;AAAA,EACpF;AAAA,EAEQ,yBAAyB;AAC/B,UAAME,IAAoB,KAAK,aAAa,eAAe;AAE3D,QAAIA,MAAsB,MAAM;AAC9B,YAAMrM,IAAaoK,EAAeiC,CAAiB;AACnD,aAAOrM,MAAe,WAAWA,MAAe,OAAOA,MAAe;AAAA,IACxE;AAEA,UAAMsM,IAAW,KAAK,oBAAA,EAAsB,KAAK,GAAG;AAEpD,WAAKA,IAIE,CAAC,KAAK,sBAAsBA,CAAQ,IAHlC;AAAA,EAIX;AAAA,EAEQ,sBAAsB;AdpnBzB,QAAAhO;AcqnBH,UAAMiO,IAAmB,MAAM,KAAK,KAAK,iBAAqCC,EAAmB,GAAG,CAAC;AAErG,WAAID,EAAiB,SACZA,EACJ,IAAI,CAACE,MAAe;AdznBtB,UAAAnO,GAAAS,GAAAC;Ac0nBG,YAAMiB,MAAQ3B,IAAAmO,EAAW,aAAa,MAAM,MAA9B,OAAAnO,IAAmC,IAAI,KAAA,GAC/CoO,MAAS3N,IAAA0N,EAAW,aAAa,OAAO,MAA/B,OAAA1N,IAAoC,IAAI,KAAA,GACjD4N,MAAO3N,IAAAyN,EAAW,aAAa,OAAO,MAA/B,OAAAzN,IAAoC,IAAI,KAAA;AAErD,aAAI,CAACiB,KAAQ,CAACyM,KAAS,CAACC,IACf,KAGF,GAAG1M,CAAI,IAAIyM,CAAK,IAAIC,CAAG;AAAA,IAChC,CAAC,EACA,OAAO,OAAO,MAGXrO,IAAA,KAAK,aAAa,SAAS,MAA3B,OAAAA,IAAgC,IACrC,MAAM,GAAG,EACT,IAAI,CAACsO,MAAYA,EAAQ,KAAA,CAAM,EAC/B,OAAO,OAAO;AAAA,EACnB;AAAA,EAEQ,qBAAqB;Ad7oBxB,QAAAtO;Ac8oBH,UAAMiO,IAAmB,MAAM,KAAK,KAAK,iBAAqCC,EAAmB,GAAG,CAAC;AAErG,WAAID,EAAiB,SACZA,EACJ,IAAI,CAACE,MAAe;AdlpBtB,UAAAnO,GAAAS,GAAAC;AcmpBG,YAAMiB,MAAQ3B,IAAAmO,EAAW,aAAa,MAAM,MAA9B,OAAAnO,IAAmC,IAAI,KAAA,GAC/CoO,MAAS3N,IAAA0N,EAAW,aAAa,OAAO,MAA/B,OAAA1N,IAAoC,IAAI,KAAA,GACjD4N,MAAO3N,IAAAyN,EAAW,aAAa,OAAO,MAA/B,OAAAzN,IAAoC,IAAI,KAAA;AAErD,aAAI,CAACiB,KAAQ,CAACyM,KAAS,CAACC,IACf,KAGF,GAAG1M,CAAI,IAAIyM,CAAK,IAAIC,CAAG;AAAA,IAChC,CAAC,EACA,OAAO,OAAO,EACd,KAAK;AAAA,CAAI,MAGNrO,IAAA,KAAK,aAAa,SAAS,MAA3B,OAAAA,IAAgC,IACrC,MAAM,GAAG,EACT,IAAI,CAACsO,MAAYA,EAAQ,MAAM,EAC/B,OAAO,OAAO,EACd,KAAK;AAAA,CAAI;AAAA,EACd;AAAA,EAEQ,sBAAsBN,GAAkB;AAC9C,UAAMO,IAAc,KAAK,oBAAA;AAEzB,WAAOP,EAAS,MAAM,GAAG,EAAE,KAAK,CAACM,MACxB,KAAK,wBAAwBA,GAASC,EAAY,KAAKA,EAAY,OAAO,CAClF;AAAA,EACH;AAAA,EAEQ,sBAAsB;AdhrBzB,QAAAvO,GAAAS,GAAAC,GAAAwL,GAAAC,GAAAmB;AcirBH,UAAMkB,MAAYxO,IAAA,KAAK,aAAa,WAAW,MAA7B,OAAAA,IAAkC,IAAI,KAAA;AAExD,QAAI,CAACwO,GAAU;AACb,YAAM1E,wBAAU,KAAA;AAChB,aAAO;AAAA,QACL,KAAKA,EAAI,OAAA;AAAA,QACT,SAASA,EAAI,SAAA,IAAa,KAAKA,EAAI,WAAA;AAAA,MAAW;AAAA,IAElD;AAEA,QAAI;AACF,YAAMA,wBAAU,KAAA,GACV2E,IAAU,IAAI,KAAK,eAAe,SAAS;AAAA,QAC/C,UAAAD;AAAA,QACA,SAAS;AAAA,MAAA,CACV,EACE,OAAO1E,CAAG,EACV,YAAA,GACG4E,IAAY,IAAI,KAAK,eAAe,SAAS;AAAA,QACjD,UAAAF;AAAA,QACA,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,QAAQ;AAAA,MAAA,CACT,EAAE,cAAc1E,CAAG,GACd6E,IAAO,QAAOjO,KAAAD,IAAAiO,EAAU,KAAK,CAACE,MAASA,EAAK,SAAS,MAAM,MAA7C,gBAAAnO,EAAgD,UAAhD,OAAAC,IAAyD,CAAC,IAAI,IAC5EmO,IAAS,QAAO1C,KAAAD,IAAAwC,EAAU,KAAK,CAACE,MAASA,EAAK,SAAS,QAAQ,MAA/C,gBAAA1C,EAAkD,UAAlD,OAAAC,IAA2D,CAAC;AAElF,aAAO;AAAA,QACL,MAAKmB,IAAA3B,GAAyB8C,CAAO,MAAhC,OAAAnB,IAAqCxD,EAAI,OAAA;AAAA,QAC9C,SAAS6E,IAAO,KAAKE;AAAA,MAAA;AAAA,IAEzB,QAAQ;AACN,YAAM/E,wBAAU,KAAA;AAChB,aAAO;AAAA,QACL,KAAKA,EAAI,OAAA;AAAA,QACT,SAASA,EAAI,SAAA,IAAa,KAAKA,EAAI,WAAA;AAAA,MAAW;AAAA,IAElD;AAAA,EACF;AAAA,EAEQ,wBAAwBwE,GAAiBQ,GAAoBC,GAAwB;AAC3F,UAAMC,IAAQV,EACX,KAAA,EACA,UAAU,KAAK,EACf,QAAQ,oBAAoB,EAAE,EAC9B,YAAA,EACA,MAAM,iDAAiD;AAE1D,QAAI,CAACU;AACH,aAAO;AAGT,UAAMrN,IAAO,KAAK,kBAAkBqN,EAAM,CAAC,CAAC,GACtCC,IAAe,KAAK,kBAAkBD,EAAM,CAAC,CAAC,GAC9CE,IAAa,KAAK,kBAAkBF,EAAM,CAAC,CAAC;AAElD,WAAI,CAACrN,EAAK,SAASmN,CAAU,KAAKG,MAAiB,QAAQC,MAAe,OACjE,KAGLD,KAAgBC,IACXH,KAAkBE,KAAgBF,KAAkBG,IAGtDH,KAAkBE,KAAgBF,KAAkBG;AAAA,EAC7D;AAAA,EAEQ,kBAAkBzN,GAAe;AACvC,UAAMC,IAAaD,EAChB,UAAU,KAAK,EACf,QAAQ,oBAAoB,EAAE,EAC9B,YAAA,EACA,QAAQ,QAAQ,EAAE;AAErB,WAAIC,MAAe,OAAOA,MAAe,WAAWA,MAAe,QAC1D,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,IAGtBA,EAAW,MAAM,GAAG,EAAE,QAAQ,CAACkN,MAAS;AAC7C,YAAM,CAACO,GAAYC,CAAQ,IAAIR,EAAK,MAAM,GAAG,GACvCS,IAAW,KAAK,iBAAiBF,CAAU,GAC3CG,IAASF,IAAW,KAAK,iBAAiBA,CAAQ,IAAIC;AAE5D,UAAIA,MAAa,QAAQC,MAAW;AAClC,eAAO,CAAA;AAGT,UAAID,MAAaC;AACf,eAAO,CAACD,CAAQ;AAGlB,YAAM1N,IAAiB,CAAA;AACvB,UAAImN,IAAaO;AAEjB,iBAAa;AAGX,YAFA1N,EAAK,KAAKmN,CAAU,GAEhBA,MAAeQ;AACjB,iBAAO3N;AAGT,QAAAmN,KAAcA,IAAa,KAAK;AAAA,MAClC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,iBAAiBrN,GAA2B;Ad3xB/C,QAAAzB;Ac4xBH,QAAI,CAACyB;AACH,aAAO;AAGT,UAAMqF,IAAMgF,EAAerK,CAAK;AAChC,YAAOzB,IAAA0L,GAAY5E,CAAG,MAAf,OAAA9G,IAAoB;AAAA,EAC7B;AAAA,EAEQ,kBAAkByB,GAAe;AACvC,UAAM,CAAC8N,GAAWC,CAAW,IAAI/N,EAAM,MAAM,GAAG,GAC1CkN,IAAO,OAAOY,CAAS,GACvBV,IAAS,OAAOW,CAAW;AAEjC,WAAI,CAAC,OAAO,UAAUb,CAAI,KAAK,CAAC,OAAO,UAAUE,CAAM,KAAKF,IAAO,KAAKA,IAAO,MAAME,IAAS,KAAKA,IAAS,KACnG,OAGFF,IAAO,KAAKE;AAAA,EACrB;AAAA,EAEQ,YAAYY,GAAiB;AACnC,SAAK,OAAO,SAAS,CAACA,GACtB,KAAK,SAAS,aAAa,iBAAiB,OAAOA,CAAM,CAAC,GAC1D,KAAK,gBAAgB,QAAQA,CAAM;AAAA,EACrC;AAsDF;AAjwBE1P,EADWiM,GACJ,OAAM;AAmwBR,MAAMoB,UAAyB,YAAY;AAElD;AADErN,EADWqN,GACJ,OAAM;AAGR,MAAMc,UAA2B,YAAY;AAEpD;AADEnO,EADWmO,GACJ,OAAM;AC52BflQ,EAAW+M,EAAM,KAAKA,CAAK;AAC3B/M,EAAWoP,EAAiB,KAAKA,CAAgB;AACjDpP,EAAWkQ,EAAmB,KAAKA,CAAkB;AACrDlQ,EAAWgO,EAAW,KAAKA,CAAU;"}