PageSourceSearch

https://openfiremap.org/assets/index-Bpcv38cX.js

js openfiremap.org collected 2026-09-24 19:11:55 UTC 106,098 bytes, 12 lines download raw bytes

1(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))r(o);new MutationObserver(o=>{for(const a of o)if(a.type==="childList")for(const s of a.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&r(s)}).observe(document,{childList:!0,subtree:!0});function n(o){const a={};return o.integrity&&(a.integrity=o.integrity),o.referrerPolicy&&(a.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?a.credentials="include":o.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function r(o){if(o.ep)return;o.ep=!0;const a=n(o);fetch(o.href,a)}})();const Zn="modulepreload",Gn=function(e,t){return new URL(e,t).href},qt={},V=function(t,n,r){let o=Promise.resolve();if(n&&n.length>0){let f=function(u){return Promise.all(u.map(h=>Promise.resolve(h).then(m=>({status:"fulfilled",value:m}),m=>({status:"rejected",reason:m}))))};const s=document.getElementsByTagName("link"),i=document.querySelector("meta[property=csp-nonce]"),c=i?.nonce||i?.getAttribute("nonce");o=f(n.map(u=>{if(u=Gn(u,r),u in qt)return;qt[u]=!0;const h=u.endsWith(".css"),m=h?'[rel="stylesheet"]':"";if(r)for(let g=s.length-1;g>=0;g--){const y=s[g];if(y.href===u&&(!h||y.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${u}"]${m}`))return;const d=document.createElement("link");if(d.rel=h?"stylesheet":Zn,h||(d.as="script"),d.crossOrigin="",d.href=u,c&&d.setAttribute("nonce",c),document.head.appendChild(d),h)return new Promise((g,y)=>{d.addEventListener("load",g),d.addEventListener("error",()=>y(new Error(`Unable to preload CSS for ${u}`)))})}))}function a(s){const i=new Event("vite:preloadError",{cancelable:!0});if(i.payload=s,window.dispatchEvent(i),!i.defaultPrevented)throw s}return o.then(s=>{for(const i of s||[])i.status==="rejected"&&a(i.reason);return t().catch(a)})},l={map:null,userMarker:null,userLocationTimer:null,markerLayer:null,boundaryLayer:null,rangeLayerGroup:null,cachedElements:[],cachedPoiElements:[],cachedBoundaryElements:[],loadedPoiBounds:null,loadedBoundaryBounds:null,loadedPoiMode:null,isFetchingData:!1,queryBounds:null,activeLayerKey:"voyager",exportFormat:"free",exportZoomLevel:18,selection:{active:!1,rect:null,startPoint:null,finalBounds:null},controllers:{fetch:null,boundaryFetch:null,export:null}},K={defaultCenter:[49.555,11.35],defaultZoom:14,searchZoom:16,locateZoom:17,overpassEndpoints:["https://overpass-api.de/api/interpreter","https://lz4.overpass-api.de/api/interpreter","https://z.overpass-api.de/api/interpreter","https://overpass.kumi.systems/api/interpreter"],nominatimUrl:"https://nominatim.openstreetmap.org",pipeline:{enabled:!0,url:"http://192.168.178.152:8080",usePmtiles:!0,pmtilesFile:"openfiremap.pmtiles",bounds:{south:49,west:10.1,north:50,east:11.9}},cartoApiKey:"cb1_3rhl_1_c46f6032a1460d7cdb99badc",layers:{voyager:{url:"https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png?key=cb1_3rhl_1_c46f6032a1460d7cdb99badc",attr:'&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors &copy; <a href="https://carto.com/attributions" target="_blank" rel="noopener noreferrer">CARTO</a>',textAttr:"© OpenStreetMap contributors, © CARTO",maxZoom:18},positron:{url:"https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png?key=cb1_3rhl_1_c46f6032a1460d7cdb99badc",attr:'&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors &copy; <a href="https://carto.com/attributions" target="_blank" rel="noopener noreferrer">CARTO</a>',textAttr:"© OpenStreetMap contributors, © CARTO",maxZoom:18},dark:{url:"https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png?key=cb1_3rhl_1_c46f6032a1460d7cdb99badc",attr:'&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors &copy; <a href="https://carto.com/attributions" target="_blank" rel="noopener noreferrer">CARTO</a>',textAttr:"© OpenStreetMap contributors, © CARTO",maxZoom:18},satellite:{url:"https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",attr:"Tiles © Esri — Source: Esri, i-cubed, USDA, USGS, AEX, GeoEye, Getmapping, Aerogrid, IGN, IGP, UPR-EGP, and the GIS User Community",maxZoom:18,maxNativeZoom:17},topo:{url:"https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png",attr:'Daten: &copy; <a href="https://openstreetmap.org/copyright" target="_blank" rel="noopener noreferrer">OpenStreetMap</a>-Mitwirkende, SRTM | Darstellung: &copy; <a href="http://opentopomap.org">OpenTopoMap</a> (<a href="https://creativecommons.org/licenses/by-sa/3.0/">CC-BY-SA</a>)',textAttr:"Daten: © OpenStreetMap-Mitwirkende, SRTM | Darstellung: © OpenTopoMap (CC-BY-SA)",maxZoom:17},osm:{url:"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",attr:'&copy; <a href="https://www.openstreetmap.org/copyright" target="_blank" rel="noopener noreferrer">OpenStreetMap</a> contributors',textAttr:"© OpenStreetMap contributors",maxZoom:18},osmde:{url:"https://tile.openstreetmap.de/{z}/{x}/{y}.png",attr:'&copy; <a href="https://www.openstreetmap.org/copyright" target="_blank" rel="noopener noreferrer">OpenStreetMap</a> contributors',textAttr:"© OpenStreetMap contributors",maxZoom:18},bayern:{url:"https://wmtsod{s}.bayernwolke.de/wmts/by_webkarte/smerc/{z}/{x}/{y}",subdomains:["1","2","3","4"],attr:"Kartendaten: &copy; Bayerische Vermessungsverwaltung (OpenData)",textAttr:"© Bayerische Vermessungsverwaltung",maxZoom:19},bayern_dop:{url:"https://wmtsod{s}.bayernwolke.de/wmts/by_dop/smerc/{z}/{x}/{y}",subdomains:["1","2","3","4"],attr:"Kartendaten: &copy; Bayerische Vermessungsverwaltung (DOP)",textAttr:"© Bayerische Vermessungsverwaltung",maxZoom:19}},exportZoomLimitsKm:{12:30,13:25,14:20,15:15,16:10,17:8,18:5},colors:{station:"#ef4444",hydrant:"#ef4444",water:"#3b82f6",defib:"#16a34a",rangeCircle:"#f97316",selection:"#3b82f6",bounds:"#333333",boundsSatellite:"#ffff00",textMain:"#0f172a",textSub:"#334155",bgHeader:"rgba(255, 255, 255, 0.98)"},performance:{overpassTimeoutMs:25e3,overpassMaxRetries:2,moveDebounceMs:400,hydrantStatusShowDelayMs:500,hydrantStatusSlowAfterMs:6e3,hydrantStatusSuccessDurationMs:1600,cacheTtlMs:300*1e3}},zn=(e,t,n)=>{const r=e[t];return r?typeof r=="function"?r():Promise.resolve(r):new Promise((o,a)=>{(typeof queueMicrotask=="function"?queueMicrotask:setTimeout)(a.bind(null,new Error("Unknown variable dynamic import: "+t+(t.split("/").length!==n?". Note that variables only represent file names one level deep.":""))))})},Pe="de",ut="en";let ke=Pe,Ze=null,Lt=null;function Hn(){const e=new URLSearchParams(window.location.search).get("lang");if(e)return ze(e);const t=localStorage.getItem("ofm_lang");if(t)return ze(t);const n=(navigator.language||navigator.userLanguage||Pe).toLowerCase();return ze(n)}function ze(e){const t=String(e||"").trim().toLowerCase();if(!t)return Pe;if(t==="de-de"||t.startsWith("de-"))return"de";const n=t.split("-")[0]||Pe;return/^[a-z]+$/.test(n)?n:Pe}async function dt(e){const t=ze(e);try{const n=await zn(Object.assign({
1"./lang/ar.js":()=>V(()=>import("./ar-DJ1uo4hV.js"),[],import.meta.url),
1"./lang/bn.js":()=>V(()=>import("./bn-Co4cblXH.js"),[],import.meta.url),
1"./lang/cs.js":()=>V(()=>import("./cs-CZEmEhEn.js"),[],import.meta.url),
1"./lang/da.js":()=>V(()=>import("./da-B0Jm3VAL.js"),[],import.meta.url),
1"./lang/de.js":()=>V(()=>import("./de-CMlH67vz.js"),[],import.meta.url),
1"./lang/en.js":()=>V(()=>import("./en-CGMiaFBW.js"),[],import.meta.url),
1"./lang/es.js":()=>V(()=>import("./es-BoNA4wGp.js"),[],import.meta.url),
1"./lang/fi.js":()=>V(()=>import("./fi-DtJmjG34.js"),[],import.meta.url),
1"./lang/fl.js":()=>V(()=>import("./fl-CsjSa2M-.js"),[],import.meta.url),
1"./lang/fr.js":()=>V(()=>import("./fr-CSt97mDH.js"),[],import.meta.url),
1"./lang/hi.js":()=>V(()=>import("./hi-CRdW-OEU.js"),[],import.meta.url),
1"./lang/id.js":()=>V(()=>import("./id-D9eVS0bQ.js"),[],import.meta.url),
1"./lang/it.js":()=>V(()=>import("./it-LAeOqld-.js"),[],import.meta.url),
1"./lang/ja.js":()=>V(()=>import("./ja-DZrK9soa.js"),[],import.meta.url),
1"./lang/ko.js":()=>V(()=>import("./ko-r-zTm3YJ.js"),[],import.meta.url),
1"./lang/lb.js":()=>V(()=>import("./lb-CkJmjRzm.js"),[],import.meta.url),
1"./lang/ms.js":()=>V(()=>import("./ms-Kl39a9dU.js"),[],import.meta.url),
1"./lang/nl.js":()=>V(()=>import("./nl-BRLrfrYG.js"),[],import.meta.url),
1"./lang/no.js":()=>V(()=>import("./no-DBHhKSmn.js"),[],import.meta.url),
1"./lang/pl.js":()=>V(()=>import("./pl-YKUSNLnU.js"),[],import.meta.url),
1"./lang/pt.js":()=>V(()=>import("./pt-CNU94AtR.js"),[],import.meta.url),
1"./lang/ru.js":()=>V(()=>import("./ru-dtRG9Cvv.js"),[],import.meta.url),
1"./lang/sv.js":()=>V(()=>import("./sv-beWQ6yNS.js"),[],import.meta.url),
1"./lang/th.js":()=>V(()=>import("./th-DsfEukJC.js"),[],import.meta.url),
1"./lang/tr.js":()=>V(()=>import("./tr-cBVSJZJV.js"),[],import.meta.url),
1"./lang/tw.js":()=>V(()=>import("./tw-D-seH_I8.js"),[],import.meta.url),
1"./lang/ur.js":()=>V(()=>import("./ur-B6WA82Si.js"),[],import.meta.url),
1"./lang/vi.js":()=>V(()=>import("./vi-BmohbuHY.js"),[],import.meta.url),
1"./lang/yue.js":()=>V(()=>import("./yue-BjILi6iy.js"),[],import.meta.url),
1"./lang/zh.js":()=>V(()=>import("./zh-CLoWyNht.js"),[],import.meta.url)
1}),`./lang/${t}.js`,3);return n.strings||n.default||null}catch{}return null}async function qn(){Lt=await dt(ut);const e=Hn(),t=await dt(e);t?(ke=ze(e),Ze=t):(ke=Pe,Ze=await dt(Pe)),Ze||(ke=ut,Ze=Lt||{}),console.log(`Sprache: app='${ke}' (fallback='${ut}')`)}function M(e){return e?Ze?.[e]??Lt?.[e]??e:""}function Kn(){document.documentElement.lang=ke,["zh","ja","ko","th","tw","yue"].includes(ke)?document.body.classList.add("asian-font"):document.body.classList.remove("asian-font"),document.querySelectorAll("[data-i18n]").forEach(e=>{e.innerText=M(e.getAttribute("data-i18n"))}),document.querySelectorAll("[data-i18n-title]").forEach(e=>{e.title=M(e.getAttribute("data-i18n-title"))}),document.querySelectorAll("[data-i18n-placeholder]").forEach(e=>{e.placeholder=M(e.getAttribute("data-i18n-placeholder"))})}function Bo(){return ke}const Wn="0.6.12";let ft=null;async function Fe(){return ft||(ft=await V(()=>import("./export-BmRm4Lb9.js").then(e=>e.a),[],import.meta.url)),ft}const Ke=e=>()=>Xn(e);let Mt=null;function Xn(e){if(!l.cachedElements||l.cachedElements.length===0){H(M("no_objects"),3e3);return}Mt=async()=>{(await Fe())[e]()};const t=document.getElementById("export-menu");t&&t.classList.add("hidden");const n=document.getElementById("export-title-modal");if(n){n.classList.remove("hidden");const r=document.getElementById("export-confirm-title");if(r){r.value="",r.placeholder="Lade Ortsnamen...";let o=0,a=0;if(l.selection.finalBounds){const s=l.selection.finalBounds.getCenter();o=s.lat,a=s.lng}else if(l.map){const s=l.map.getCenter();o=s.lat,a=s.lng}o&&a&&Fe().then(s=>{s.fetchLocationTitle(o,a).then(i=>{i?r.value=`Ort- und Hydrantenplan ${i}`:r.placeholder="Titel eingeben"})}),r.focus()}}}function Q(e,t){const n=document.getElementById(e);n?n.addEventListener("click",r=>{r.stopPropagation(),t(r)}):console.warn(`Warnung: Button mit ID '${e}' fehlt im HTML.`)}function Jn(){const e=Array.from(document.querySelectorAll("[data-cache-duration-select]"));if(!e.length)return;const t=n=>{e.forEach(r=>{r.value=n,r.value||(r.value="168")})};t(localStorage.getItem("ofm_cache_hours")||"168"),e.forEach(n=>{n.__ofmCacheBound||(n.__ofmCacheBound=!0,n.addEventListener("change",()=>{const r=n.value||"168";localStorage.setItem("ofm_cache_hours",r),t(r),H(M("cache_saved"),2500)}))})}function H(e,t=3e3){const n=document.getElementById("notification-box");n&&(n.innerText=e,n.style.display="block",n.hideTimeout&&clearTimeout(n.hideTimeout),n.hideTimeout=setTimeout(()=>{n.style.display="none"},t))}function Ae(){["layer-menu","export-menu"].forEach(r=>{const o=document.getElementById(r);o&&o.classList.add("hidden")});const e=document.getElementById("legal-modal");e&&(e.style.display="none");const t=document.getElementById("layer-btn-trigger");t&&(t.setAttribute("aria-expanded","false"),t.setAttribute("aria-label",M("menu_layers_open")));const n=document.getElementById("export-btn-trigger");n&&(n.setAttribute("aria-expanded","false"),n.setAttribute("aria-label",M("menu_export_open")))}function Yn(){const e=document.getElementById("layer-btn-trigger"),t=document.getElementById("layer-menu");if(!e||!t){console.warn("Fehler: Layer-Button oder Menü nicht gefunden.");return}const r=!(e.getAttribute("aria-expanded")==="true");r?(Ae(),t.classList.remove("hidden")):t.classList.add("hidden"),e.setAttribute("aria-expanded",r);const o=M(r?"menu_layers_close":"menu_layers_open");e.setAttribute("aria-label",o)}function Kt(){const e=document.getElementById("export-menu");if(!e)return;const t=e.classList.contains("hidden");Ae(),t&&(e.classList.remove("hidden"),document.getElementById("export-btn-trigger")?.setAttribute("aria-expanded","true"),document.getElementById("export-setup")?.classList.remove("hidden"),document.getElementById("export-progress")?.classList.add("hidden"))}function ht(){const e=document.getElementById("legal-modal");if(!e)return;const t=e.style.display==="flex";Ae(),t||(e.style.display="flex")}function Wt(){const e=document.getElementById("search-input");if(!e||!e.value)return;const t=e.value;fetch(`${K.nominatimUrl}/search?format=json&q=${encodeURIComponent(t)}`).then(n=>n.json()).then(n=>
1{n.length>0&&l.map?(l.map.flyTo([n[0].lat,n[0].lon],K.searchZoom),e.blur()):H(M("no_results"))}).catch(n=>{console.error("Suchfehler:",n),H("Suche fehlgeschlagen")})}let Ce=!1;function cn(e=!0){if(!navigator.geolocation){H("GPS nicht unterstützt");return}if(Ce&&e)return;Ce=!0;const t=document.getElementById("locate-btn"),n=t?t.querySelector("svg"):null;n&&e&&n.classList.add("animate-spin");const r=setTimeout(()=>{Ce&&(Ce=!1,n&&n.classList.remove("animate-spin"),console.warn("[GPS] Safety timeout triggered. Browser did not fire callback."))},12e3);navigator.geolocation.getCurrentPosition(o=>{clearTimeout(r);const a=o.coords.latitude,s=o.coords.longitude;if(l.map){const c=l.map.getZoom(),f=K.locateZoom,u=c>=18?c:f;l.map.flyTo([a,s],u)}l.userMarker&&(l.map.removeLayer(l.userMarker),ot());const i=L.divIcon({className:"user-location-wrapper",html:'<div class="user-location-inner"></div>',iconSize:[20,20],iconAnchor:[10,10]});l.userMarker=L.marker([a,s],{icon:i}).addTo(l.map),ko(),l.userLocationTimer&&clearTimeout(l.userLocationTimer),l.userLocationTimer=setTimeout(()=>{l.userMarker&&(l.map.removeLayer(l.userMarker),l.userMarker=null,ot())},25e3),n&&n.classList.remove("animate-spin"),H(M("geo_found")||"Standort gefunden!"),Ce=!1},o=>{if(clearTimeout(r),e&&(o.code===2||o.code===3||o.code===1)){console.warn(`[GPS Fallback] HighAccuracy failed (Code ${o.code}). Retrying with low accuracy...`),cn(!1);return}n&&n.classList.remove("animate-spin"),console.error("[GPS Error]",o);const a=M("gps_error")||"Standort konnte nicht ermittelt werden.",s=o.message?`: ${o.message}`:"";H(`${a} (${o.code}${s})`,5e3),Ce=!1},{enableHighAccuracy:e,timeout:e?6e3:1e4,maximumAge:1e4})}function Qn(){const e=document.getElementById("app-version");e&&(e.textContent=`v${Wn}`),Q("layer-btn-trigger",Yn),Q("export-btn-trigger",Kt),Q("share-btn-trigger",_o),Q("btn-legal-trigger",ht),Q("mobile-open-legal",()=>{Ae(),ht()}),Q("legal-close-btn",ht),Q("export-close-btn",Kt),Jn();const t=document.getElementById("search-input");t&&t.addEventListener("keypress",n=>{n.key==="Enter"&&Wt()}),Q("search-btn",Wt),Q("locate-btn",cn),["voyager","positron","dark","satellite","topo","osm","osmde","bayern","bayern_dop"].forEach(n=>{Q(`btn-${n}`,()=>It(n))}),["free","a4l","a4p"].forEach(n=>{Q(`fmt-${n}`,async()=>{(await Fe()).setExportFormat(n)})}),[15,16,17,18].forEach(n=>{Q(`zoom-${n}`,async()=>{(await Fe()).setExportZoom(n)})}),Q("select-btn",async()=>{(await Fe()).startSelection()}),Q("png-btn",Ke("exportAsPNG")),Q("pdf-btn",Ke("exportAsPDF")),Q("gpx-btn",Ke("exportAsGPX")),Q("csv-btn",Ke("exportAsCSV")),Q("cancel-export-btn",async()=>{(await Fe()).cancelExport()}),Q("export-confirm-cancel",()=>{document.getElementById("export-title-modal")?.classList.add("hidden"),document.getElementById("export-btn-trigger")?.focus()}),Q("export-confirm-ok",()=>{const n=document.getElementById("export-title-modal");n&&n.classList.add("hidden"),Mt&&Mt()}),er(),document.addEventListener("keydown",n=>{if(n.key==="Escape"){const r=document.getElementById("export-title-modal");if(r&&!r.classList.contains("hidden")){r.classList.add("hidden"),document.getElementById("export-btn-trigger")?.focus();return}const o=document.getElementById("layer-menu");if(o&&!o.classList.contains("hidden")){Ae(),document.getElementById("layer-btn-trigger")?.focus();return}const a=document.getElementById("export-menu");if(a&&!a.classList.contains("hidden")){Ae(),document.getElementById("export-btn-trigger")?.focus();return}const s=document.getElementById("legal-modal");if(s&&s.style.display!=="none"&&s.style.display!==""){Ae(),document.getElementById("btn-legal-trigger")?.focus();return}}})}function er(){["layer-menu","export-menu","legal-modal"].forEach(e=>{const t=document.getElementById(e);t&&(t._closeTimer=null,t.addEventListener("mouseleave",()=>{(e==="legal-modal"?t.style.display==="none"||t.style.display==="":t.classList.contains("hidden"))||(t._closeTimer=setTimeout(()=>{e==="legal-modal"?t.style.display="none":t.classList.add("hidden");const r=e==="layer-menu"?"layer-btn-trigger":e==="export-menu"?"export-btn-trigger":"btn-legal-trigger";
1document.getElementById(r)?.setAttribute("aria-expanded","false")},1e4))}),t.addEventListener("mouseenter",()=>{t._closeTimer&&(clearTimeout(t._closeTimer),t._closeTimer=null)}))})}class Le extends Error{constructor(t,{status:n,url:r,body:o}={}){super(t),this.name="HttpError",this.status=n,this.url=r,this.body=o}}async function tr(e,{method:t="GET",headers:n={},body:r,timeoutMs:o=8e3,signal:a}={}){const s=new AbortController,i=()=>s.abort();a&&(a.aborted?i():a.addEventListener("abort",i,{once:!0}));const c=setTimeout(()=>s.abort(),o);try{const f=await fetch(e,{method:t,headers:{Accept:"application/json",...n},body:r,signal:s.signal});if(!f.ok){const u=await f.text().catch(()=>"");throw new Le(`HTTP ${f.status}`,{status:f.status,url:e,body:u.slice(0,500)})}return await f.json()}finally{clearTimeout(c),a&&a.removeEventListener?.("abort",i)}}var ne=Uint8Array,oe=Uint16Array,$t=Int32Array,at=new ne([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),st=new ne([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),Tt=new ne([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),un=function(e,t){for(var n=new oe(31),r=0;r<31;++r)n[r]=t+=1<<e[r-1];for(var o=new $t(n[30]),r=1;r<30;++r)for(var a=n[r];a<n[r+1];++a)o[a]=a-n[r]<<5|r;return{b:n,r:o}},dn=un(at,2),fn=dn.b,kt=dn.r;fn[28]=258,kt[258]=28;var hn=un(st,0),nr=hn.b,Xt=hn.r,At=new oe(32768);for(var q=0;q<32768;++q){var we=(q&43690)>>1|(q&21845)<<1;we=(we&52428)>>2|(we&13107)<<2,we=(we&61680)>>4|(we&3855)<<4,At[q]=((we&65280)>>8|(we&255)<<8)>>1}var me=(function(e,t,n){for(var r=e.length,o=0,a=new oe(t);o<r;++o)e[o]&&++a[e[o]-1];var s=new oe(t);for(o=1;o<t;++o)s[o]=s[o-1]+a[o-1]<<1;var i;if(n){i=new oe(1<<t);var c=15-t;for(o=0;o<r;++o)if(e[o])for(var f=o<<4|e[o],u=t-e[o],h=s[e[o]-1]++<<u,m=h|(1<<u)-1;h<=m;++h)i[At[h]>>c]=f}else for(i=new oe(r),o=0;o<r;++o)e[o]&&(i[o]=At[s[e[o]-1]++]>>15-e[o]);return i}),Me=new ne(288);for(var q=0;q<144;++q)Me[q]=8;for(var q=144;q<256;++q)Me[q]=9;for(var q=256;q<280;++q)Me[q]=7;for(var q=280;q<288;++q)Me[q]=8;var qe=new ne(32);for(var q=0;q<32;++q)qe[q]=5;var rr=me(Me,9,0),or=me(Me,9,1),ar=me(qe,5,0),sr=me(qe,5,1),mt=function(e){for(var t=e[0],n=1;n<e.length;++n)e[n]>t&&(t=e[n]);return t},ue=function(e,t,n){var r=t/8|0;return(e[r]|e[r+1]<<8)>>(t&7)&n},pt=function(e,t){var n=t/8|0;return(e[n]|e[n+1]<<8|e[n+2]<<16)>>(t&7)},Ft=function(e){return(e+7)/8|0},mn=function(e,t,n){return(n==null||n>e.length)&&(n=e.length),new ne(e.subarray(t,n))}
vendor: 7,749 bytes, line 1
1,ir=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],re=function(e,t,n){var r=new Error(t||ir[e]);if(r.code=e,Error.captureStackTrace&&Error.captureStackTrace(r,re),!n)throw r;return r},Dt=function(e,t,n,r){var o=e.length,a=0;if(!o||t.f&&!t.l)return n||new ne(0);var s=!n,i=s||t.i!=2,c=t.i;s&&(n=new ne(o*3));var f=function(de){var ce=n.length;if(de>ce){var X=new ne(Math.max(ce*2,de));X.set(n),n=X}},u=t.f||0,h=t.p||0,m=t.b||0,d=t.l,g=t.d,y=t.m,x=t.n,b=o*8;do{if(!d){u=ue(e,h,1);var k=ue(e,h+1,3);if(h+=3,k)if(k==1)d=or,g=sr,y=9,x=5;else if(k==2){var O=ue(e,h,31)+257,$=ue(e,h+10,15)+4,I=O+ue(e,h+5,31)+1;h+=14;for(var P=new ne(I),U=new ne(19),R=0;R<$;++R)U[Tt[R]]=ue(e,h+R*3,7);h+=$*3;for(var v=mt(U),S=(1<<v)-1,C=me(U,v,1),R=0;R<I;){var E=C[ue(e,h,S)];h+=E&15;var T=E>>4;if(T<16)P[R++]=T;else{var B=0,p=0;for(T==16?(p=3+ue(e,h,3),h+=2,B=P[R-1]):T==17?(p=3+ue(e,h,7),h+=3):T==18&&(p=11+ue(e,h,127),h+=7);p--;)P[R++]=B}}var _=P.subarray(0,O),A=P.subarray(O);y=mt(_),x=mt(A),d=me(_,y,1),g=me(A,x,1)}else re(1);else{var T=Ft(h)+4,w=e[T-4]|e[T-3]<<8,F=T+w;if(F>o){c&&re(0);break}i&&f(m+w),n.set(e.subarray(T,F),m),t.b=m+=w,t.p=h=F*8,t.f=u;continue}if(h>b){c&&re(0);break}}i&&f(m+131072);for(var Z=(1<<y)-1,J=(1<<x)-1,W=h;;W=h){var B=d[pt(e,h)&Z],G=B>>4;if(h+=B&15,h>b){c&&re(0);break}if(B||re(2),G<256)n[m++]=G;else if(G==256){W=h,d=null;break}else{var Y=G-254;if(G>264){var R=G-257,j=at[R];Y=ue(e,h,(1<<j)-1)+fn[R],h+=j}var D=g[pt(e,h)&J],se=D>>4;D||re(3),h+=D&15;var A=nr[se];if(se>3){var j=st[se];A+=pt(e,h)&(1<<j)-1,h+=j}if(h>b){c&&re(0);break}i&&f(m+131072);var ie=m+Y;if(m<A){var ee=a-A,le=Math.min(A,ie);for(ee+m<0&&re(3);m<le;++m)n[m]=r[ee+m]}for(;m<ie;++m)n[m]=n[m-A]}}t.l=d,t.p=W,t.b=m,t.f=u,d&&(u=1,t.m=y,t.d=g,t.n=x)}while(!u);return m!=n.length&&s?mn(n,0,m):n.subarray(0,m)},pe=function(e,t,n){n<<=t&7;var r=t/8|0;e[r]|=n,e[r+1]|=n>>8},Ne=function(e,t,n){n<<=t&7;var r=t/8|0;e[r]|=n,e[r+1]|=n>>8,e[r+2]|=n>>16},gt=function(e,t){for(var n=[],r=0;r<e.length;++r)e[r]&&n.push({s:r,f:e[r]});var o=n.length,a=n.slice();if(!o)return{t:gn,l:0};if(o==1){var s=new ne(n[0].s+1);return s[n[0].s]=1,{t:s,l:1}}n.sort(function(F,O){return F.f-O.f}),n.push({s:-1,f:25001});var i=n[0],c=n[1],f=0,u=1,h=2;for(n[0]={s:-1,f:i.f+c.f,l:i,r:c};u!=o-1;)i=n[n[f].f<n[h].f?f++:h++],c=n[f!=u&&n[f].f<n[h].f?f++:h++],n[u++]={s:-1,f:i.f+c.f,l:i,r:c};for(var m=a[0].s,r=1;r<o;++r)a[r].s>m&&(m=a[r].s);var d=new oe(m+1),g=Pt(n[u-1],d,0);if(g>t){var r=0,y=0,x=g-t,b=1<<x;for(a.sort(function(O,$){return d[$.s]-d[O.s]||O.f-$.f});r<o;++r){var k=a[r].s;if(d[k]>t)y+=b-(1<<g-d[k]),d[k]=t;else break}for(y>>=x;y>0;){var T=a[r].s;d[T]<t?y-=1<<t-d[T]++-1:++r}for(;r>=0&&y;--r){var w=a[r].s;d[w]==t&&(--d[w],++y)}g=t}return{t:new ne(d),l:g}},Pt=function(e,t,n){return e.s==-1?Math.max(Pt(e.l,t,n+1),Pt(e.r,t,n+1)):t[e.s]=n},Jt=function(e){for(var t=e.length;t&&!e[--t];);for(var n=new oe(++t),r=0,o=e[0],a=1,s=function(c){n[r++]=c},i=1;i<=t;++i)if(e[i]==o&&i!=t)++a;else{if(!o&&a>2){for(;a>138;a-=138)s(32754);a>2&&(s(a>10?a-11<<5|28690:a-3<<5|12305),a=0)}else if(a>3){for(s(o),--a;a>6;a-=6)s(8304);a>2&&(s(a-3<<5|8208),a=0)}for(;a--;)s(o);a=1,o=e[i]}return{c:n.subarray(0,r),n:t}},je=function(e,t){for(var n=0,r=0;r<t.length;++r)n+=e[r]*t[r];return n},pn=function(e,t,n){var r=n.length,o=Ft(t+2);e[o]=r&255,e[o+1]=r>>8,e[o+2]=e[o]^255,e[o+3]=e[o+1]^255;for(var a=0;a<r;++a)e[o+a+4]=n[a];return(o+4+r)*8},Yt=function(e,t,n,r,o,a,s,i,c,f,u){pe(t,u++,n),++o[256];for(var h=gt(o,15),m=h.t,d=h.l,g=gt(a,15),y=g.t,x=g.l,b=Jt(m),k=b.c,T=b.n,w=Jt(y),F=w.c,O=w.n,$=new oe(19),I=0;I<k.length;++I)++$[k[I]&31];for(var I=0;I<F.length;++I)++$[F[I]&31];for(var P=gt($,7),U=P.t,R=P.l,v=19;v>4&&!U[Tt[v-1]];--v);var S=f+5<<3,C=je(o,Me)+je(a,qe)+s,E=je(o,m)+je(a,y)+s+14+3*v+je($,U)+2*$[16]+3*$[17]+7*$[18];if(c>=0&&S<=C&&S<=E)return pn(t,u,e.subarray(c,c+f));var B,p,_,A;if(pe(t,u,1+(E<C)),u+=2,E<C){B=me(m,d,0),p=m,_=me(y,x,0),A=y;var Z=me(U,R,0);pe(t,u,T-257),pe(t,u+5,O-1),pe(t,u+10,v-4),u+=14;for(var I=0;I<v;++I)pe(t,u+3*I,U[Tt[I]]);u+=3*v;for(var J=[k,F],W=0;W<2;++W)for(var G=J[W],I=0;I<G.length;++I){var Y=G[I]&31;pe(t,u,Z[Y]),u+=U[Y],Y>15&&(pe(t,u,G[I]>>5&127),u+=G[I]>>12)}}else B=rr,p=Me,_=ar,A=qe;for(var I=0;I<i;++I){var j=r[I];if(j>255){var Y=j>>18&31;Ne(t,u,B[Y+257]),u+=p[Y+257],Y>7&&(pe(t,u,j>>23&31),u+=at[Y]);var D=j&31;Ne(t,u,_[D]),u+=A[D],D>3&&(Ne(t,u,j>>5&8191),u+=st[D])}else Ne(t,u,B[j]),u+=p[j]}return Ne(t,u,B[256]),u+p[256]},lr=new $t([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),gn=new ne(0),cr=function(e,t,n,r,o,a){var s=a.z||e.length,i=new ne(r+s+5*(1+Math.ceil(s/7e3))+o),c=i.subarray(r,i.length-o),f=a.l,u=(a.r||0)&7;if(t){u&&(c[0]=a.r>>3);for(var h=lr[t-1],m=h>>13,d=h&8191,g=(1<<n)-1,y=a.p||new oe(32768),x=a.h||new oe(g+1),b=Math.ceil(n/3),k=2*b,T=function(Se){return(e[Se]^e[Se+1]<<b^e[Se+2]<<k)&g},w=new $t(25e3),F=new oe(288),O=new oe(32),$=0,I=0,P=a.i||0,U=0,R=a.w||0,v=0;P+2<s;++P){var S=T(P),C=P&32767,E=x[S];if(y[C]=E,x[S]=C,R<=P){var B=s-P;if(($>7e3||U>24576)&&(B>423||!f)){u=Yt(e,c,0,w,F,O,I,U,v,P-v,u),U=$=I=0,v=P;for(var p=0;p<286;++p)F[p]=0;for(var p=0;p<30;++p)O[p]=0}var _=2,A=0,Z=d,J=C-E&32767;if(B>2&&S==T(P-J))for(var W=Math.min(m,B)-1,G=Math.min(32767,P),Y=Math.min(258,B);J<=G&&--Z&&C!=E;){if(e[P+_]==e[P+_-J]){for(var j=0;j<Y&&e[P+j]==e[P+j-J];++j);if(j>_){if(_=j,A=J,j>W)break;for(var D=Math.min(J,j-2),se=0,p=0;p<D;++p){var ie=P-J+p&32767,ee=y[ie],le=ie-ee&32767;le>se&&(se=le,E=ie)}}}C=E,E=y[C],J+=C-E&32767}if(A){w[U++]=268435456|kt[_]<<18|Xt[A];var de=kt[_]&31,ce=Xt[A]&31;I+=at[de]+st[ce],++F[257+de],++O[ce],R=P+_,++$}else w[U++]=e[P],++F[e[P]]}}for(P=Math.max(P,R);P<s;++P)w[U++]=e[P],++F[e[P]];u=Yt(e,c,f,w,F,O,I,U,v,P-v,u),f||(a.r=u&7|c[u/8|0]<<3,u-=7,a.h=x,a.p=y,a.i=P,a.w=R)}else{for(var P=a.w||0;P<s+f;P+=65535){var X=P+65535;X>=s&&(c[u/8|0]=f,X=s),u=pn(c,u+1,e.subarray(P,X))}a.i=s}return mn(i,0,r+Ft(u)+o)},yn=function(){var e=1,t=0;return{p:function(n){for(var r=e,o=t,a=n.length|0,s=0;s!=a;){for(var i=Math.min(s+2655,a);s<i;++s)o+=r+=n[s];r=(r&65535)+15*(r>>16),o=(o&65535)+15*(o>>16)}e=r,t=o},d:function(){return e%=65521,t%=65521,(e&255)<<24|(e&65280)<<8|(t&255)<<8|t>>8}}},ur=function(e,t,n,r,o){if(!o&&(o={l:1},t.dictionary)){var a=t.dictionary.subarray(-32768),s=new ne(a.length+e.length);s.set(a),s.set(e,a.length),e=s,o.w=a.length}return cr(e,t.level==null?6:t.level,t.mem==null?o.l?Math.ceil(Math.max(8,Math.min(13,Math.log(e.length)))*1.5):20:12+t.mem,n,r,o)},vn=function(e,t,n){for(;n;++t)e[t]=n,n>>>=8},dr=function(e){(e[0]!=31||e[1]!=139||e[2]!=8)&&re(6,"invalid gzip data");var t=e[3],n=10;t&4&&(n+=(e[10]|e[11]<<8)+2);for(var r=(t>>3&1)+(t>>4&1);r>0;r-=!e[n++]);return n+(t&2)},fr=function(e){var t=e.length;return(e[t-4]|e[t-3]<<8|e[t-2]<<16|e[t-1]<<24)>>>0},hr=function(e,t){var n=t.level,r=n==0?0:n<6?1:n==9?3:2;if(e[0]=120,e[1]=r<<6|(t.dictionary&&32),e[1]|=31-(e[0]<<8|e[1])%31,t.dictionary){var o=yn();o.p(t.dictionary),vn(e,2,o.d())}},mr=function(e,t){return((e[0]&15)!=8||e[0]>>4>7||(e[0]<<8|e[1])%31)&&re(6,"invalid zlib data"),(e[1]>>5&1)==1&&re(6,"invalid zlib data: "+(e[1]&32?"need":"unexpected")+" dictionary"),(e[1]>>3&4)+2};function pr(e,t){return Dt(e,{i:2},t,t)}function gr(e,t){var n=dr(e);return n+8>e.length&&re(6,"invalid gzip data"),Dt(e.subarray(n,-8),{i:2},new ne(fr(e)),t)}function So(e,t){t||(t={});var n=yn();n.p(e);var r=ur(e,t,t.dictionary?6:2,4);return hr(r,t),vn(r,r.length-4,n.d()),r}function yr(e,t){return Dt(e.subarray(mr(e),-4),{i:2},t,t)}function vr(e,t){return e[0]==31&&e[1]==139&&e[2]==8?gr(e,t):(e[0]&15)!=8||e[0]>>4>
vendor: 4,315 bytes, line 1
17||(e[0]<<8|e[1])%31?pr(e,t):yr(e,t)}var wr=typeof TextDecoder<"u"&&new TextDecoder,br=0;try{wr.decode(gn,{stream:!0}),br=1}catch{}var _r=Object.defineProperty,xr=Math.pow,z=(e,t)=>_r(e,"name",{value:t,configurable:!0}),te=(e,t,n)=>new Promise((r,o)=>{var a=c=>{try{i(n.next(c))}catch(f){o(f)}},s=c=>{try{i(n.throw(c))}catch(f){o(f)}},i=c=>c.done?r(c.value):Promise.resolve(c.value).then(a,s);i((n=n.apply(e,t)).next())});z((e,t)=>{let n=!1,r="",o=L.GridLayer.extend({createTile:z((a,s)=>{let i=document.createElement("img"),c=new AbortController,f=c.signal;return i.cancel=()=>{c.abort()},n||(e.getHeader().then(u=>{u.tileType===1||u.tileType===6?console.error("Error: archive contains vector tiles, but leafletRasterLayer is for displaying raster tiles. See https://github.com/protomaps/PMTiles/tree/main/js for details."):u.tileType===2?r="image/png":u.tileType===3?r="image/jpeg":u.tileType===4?r="image/webp":u.tileType===5&&(r="image/avif")}),n=!0),e.getZxy(a.z,a.x,a.y,f).then(u=>{if(u){let h=new Blob([u.data],{type:r}),m=window.URL.createObjectURL(h);i.src=m}else i.style.display="none";i.cancel=void 0,s(void 0,i)}).catch(u=>{if(u.name!=="AbortError")throw u}),i},"createTile"),_removeTile:z(function(a){let s=this._tiles[a];s&&(s.el.cancel&&s.el.cancel(),s.el.src&&window.URL.revokeObjectURL(s.el.src),s.el.width=0,s.el.height=0,s.el.deleted=!0,L.DomUtil.remove(s.el),delete this._tiles[a],this.fire("tileunload",{tile:s.el,coords:this._keyToTileCoords(a)}))},"_removeTile")});return new o(t)},"leafletRasterLayer");var Er=z(e=>(t,n)=>{if(n instanceof AbortController)return e(t,n);let r=new AbortController;return e(t,r).then(o=>n(void 0,o.data,o.cacheControl||"",o.expires||""),o=>n(o)).catch(o=>n(o)),{cancel:z(()=>r.abort(),"cancel")}},"v3compat"),Lr=class{constructor(t){this.tilev4=z((n,r)=>te(this,null,function*(){if(n.type==="json"){let d=n.url.substr(10),g=this.tiles.get(d);if(g||(g=new St(d),this.tiles.set(d,g)),this.metadata){let x=yield g.getTileJson(n.url);return r.signal.throwIfAborted(),{data:x}}let y=yield g.getHeader();return r.signal.throwIfAborted(),(y.minLon>=y.maxLon||y.minLat>=y.maxLat)&&console.error(`Bounds of PMTiles archive ${y.minLon},${y.minLat},${y.maxLon},${y.maxLat} are not valid.`),{data:{tiles:[`${n.url}/{z}/{x}/{y}`],minzoom:y.minZoom,maxzoom:y.maxZoom,bounds:[y.minLon,y.minLat,y.maxLon,y.maxLat]}}}let o=new RegExp(/pmtiles:\/\/(.+)\/(\d+)\/(\d+)\/(\d+)/),a=n.url.match(o);if(!a)throw new Error("Invalid PMTiles protocol URL");let s=a[1],i=this.tiles.get(s);i||(i=new St(s),this.tiles.set(s,i));let c=a[2],f=a[3],u=a[4],h=yield i?.getZxy(+c,+f,+u,r.signal);if(r.signal.throwIfAborted(),h)return{data:new Uint8Array(h.data),cacheControl:h.cacheControl,expires:h.expires};let m=yield i.getHeader();if(m.tileType===1||m.tileType===6){if(this.errorOnMissingTile)throw new Error("Tile not found.");return{data:new Uint8Array}}return{data:null}}),"tilev4"),this.tile=Er(this.tilev4),this.tiles=new Map,this.metadata=t?.metadata||!1,this.errorOnMissingTile=t?.errorOnMissingTile||!1}add(t){this.tiles.set(t.source.getKey(),t)}get(t){return this.tiles.get(t)}};z(Lr,"Protocol");function wn(e,t){return(t>>>0)*4294967296+(e>>>0)}z(wn,"toNum");function bn(e,t){let n=t.buf,r=n[t.pos++],o=(r&112)>>4;if(r<128||(r=n[t.pos++],o|=(r&127)<<3,r<128)||(r=n[t.pos++],o|=(r&127)<<10,r<128)||(r=n[t.pos++],o|=(r&127)<<17,r<128)||(r=n[t.pos++],o|=(r&127)<<24,r<128)||(r=n[t.pos++],o|=(r&1)<<31,r<128))return wn(e,o);throw new Error("Expected varint not more than 10 bytes")}z(bn,"readVarintRemainder");function $e(e){let t=e.buf,n=t[e.pos++],r=n&127;return n<128||(n=t[e.pos++],r|=(n&127)<<7,n<128)||(n=t[e.pos++],r|=(n&127)<<14,n<128)||(n=t[e.pos++],r|=(n&127)<<21,n<128)?r:(n=t[e.pos],r|=(n&15)<<28,bn(r,e))}z($e,"readVarint");function Ot(e,t,n,r,o){return o===0?r!==0?[e-1-n,e-1-t]:[n,t]:[t,n]}z(Ot,"rotate");function _n(e,t,n){if(e>26)throw new Error("Tile zoom level exceeds max safe number limit (26)");if(t>=1<<e||n>=1<<e)throw new Error("tile x/y outside zoom level bounds");let r=((1<<e)*(1<<e)-1)/3,o=e-1,[a,s]=[t,n];for(let i=1<<o;i>0;i>>=1){let c=a&i,f=s&i;r+=(3*c^f)*(1<<o),[a,s]=Ot(i,a,s,c,f),o--}return r}z(_n,"zxyToTileId");function xn(e){let t=3*e+1;return t<4294967296?31-Math.clz32(t):63-Math.clz32(t/4294967296)}z(xn,"tileIdToZ");function Mr(e){let t=xn(e)>>1;
vendor: 4,670 bytes, line 1
1if(t>26)throw new Error("Tile zoom level exceeds max safe number limit (26)");let n=((1<<t)*(1<<t)-1)/3,r=e-n,o=0,a=0,s=1<<t;for(let i=1;i<s;i<<=1){let c=i&r/2,f=i&(r^c);[o,a]=Ot(i,o,a,c,f),r=r/2,o+=c,a+=f}return[t,o,a]}z(Mr,"tileIdToZxy");var Tr=(e=>(e[e.Unknown=0]="Unknown",e[e.None=1]="None",e[e.Gzip=2]="Gzip",e[e.Brotli=3]="Brotli",e[e.Zstd=4]="Zstd",e))(Tr||{});function it(e,t){return te(this,null,function*(){if(t===1||t===0)return e;if(t===2){if(typeof globalThis.DecompressionStream>"u")return vr(new Uint8Array(e));let n=new Response(e).body;if(!n)throw new Error("Failed to read response stream");let r=n.pipeThrough(new globalThis.DecompressionStream("gzip"));return new Response(r).arrayBuffer()}throw new Error("Compression method not supported")})}z(it,"defaultDecompress");var kr=(e=>(e[e.Unknown=0]="Unknown",e[e.Mvt=1]="Mvt",e[e.Png=2]="Png",e[e.Jpeg=3]="Jpeg",e[e.Webp=4]="Webp",e[e.Avif=5]="Avif",e[e.Mlt=6]="Mlt",e))(kr||{});function En(e){return e===1?".mvt":e===2?".png":e===3?".jpg":e===4?".webp":e===5?".avif":e===6?".mlt":""}z(En,"tileTypeExt");var Ar=127;function Ln(e,t){let n=0,r=e.length-1;for(;n<=r;){let o=r+n>>1,a=t-e[o].tileId;if(a>0)n=o+1;else if(a<0)r=o-1;else return e[o]}return r>=0&&(e[r].runLength===0||t-e[r].tileId<e[r].runLength)?e[r]:null}z(Ln,"findTile");var Pr=class{constructor(t){this.file=t}getKey(){return this.file.name}getBytes(t,n){return te(this,null,function*(){return{data:yield this.file.slice(t,t+n).arrayBuffer()}})}};z(Pr,"FileSource");var Mn=class{constructor(t,n=new Headers,r=void 0){var o,a;this.url=t,this.customHeaders=n,this.credentials=r,this.mustReload=!1;let s="";"navigator"in globalThis&&(s=(a=(o=globalThis.navigator)==null?void 0:o.userAgent)!=null?a:"");let i=s.indexOf("Windows")>-1,c=/Chrome|Chromium|Edg|OPR|Brave/.test(s);this.chromeWindowsNoCache=!1,i&&c&&(this.chromeWindowsNoCache=!0)}getKey(){return this.url}setHeaders(t){this.customHeaders=t}getBytes(t,n,r,o){return te(this,null,function*(){let a,s;r?s=r:(a=new AbortController,s=a.signal);let i=new Headers(this.customHeaders);i.set("range",`bytes=${t}-${t+n-1}`);let c;this.mustReload?c="reload":this.chromeWindowsNoCache&&(c="no-store");let f=yield fetch(this.url,{signal:s,cache:c,headers:i,credentials:this.credentials});if(t===0&&f.status===416){let m=f.headers.get("Content-Range");if(!m||!m.startsWith("bytes */"))throw new Error("Missing content-length on 416 response");let d=+m.substr(8);i.set("range",`bytes=0-${d-1}`),f=yield fetch(this.url,{signal:s,cache:"reload",headers:i,credentials:this.credentials})}let u=f.headers.get("Etag");if(u!=null&&u.startsWith("W/")&&(u=null),f.status===416||o&&u&&u!==o)throw this.mustReload=!0,new Bt(`Server returned non-matching ETag ${o} after one retry. Check browser extensions and servers for issues that may affect correct ETag headers.`);if(f.status>=300)throw new Error(`Bad response code: ${f.status}`);let h=f.headers.get("Content-Length");if(f.status===200&&(!h||+h>n))throw a&&a.abort(),new Error("Server returned no content-length header or content-length exceeding request. Check that your storage backend supports HTTP Byte Serving.");return{data:yield f.arrayBuffer(),etag:u||void 0,cacheControl:f.headers.get("Cache-Control")||void 0,expires:f.headers.get("Expires")||void 0}})}};z(Mn,"FetchSource");var Br=Mn;function ae(e,t){let n=e.getUint32(t+4,!0),r=e.getUint32(t+0,!0);return n*xr(2,32)+r}z(ae,"getUint64");function Tn(e,t){let n=new DataView(e),r=n.getUint8(7);if(r>3)throw new Error(`Archive is spec version ${r} but this library supports up to spec version 3`);return{specVersion:r,rootDirectoryOffset:ae(n,8),rootDirectoryLength:ae(n,16),jsonMetadataOffset:ae(n,24),jsonMetadataLength:ae(n,32),leafDirectoryOffset:ae(n,40),leafDirectoryLength:ae(n,48),tileDataOffset:ae(n,56),tileDataLength:ae(n,64),numAddressedTiles:ae(n,72),numTileEntries:ae(n,80),numTileContents:ae(n,88),clustered:n.getUint8(96)===1,internalCompression:n.getUint8(97),tileCompression:n.getUint8(98),tileType:n.getUint8(99),minZoom:n.getUint8(100),maxZoom:n.getUint8(101),minLon:n.getInt32(102,!0)/1e7,minLat:n.getInt32(106,!0)/1e7,maxLon:n.getInt32(110,!0)/1e7,maxLat:n.getInt32(114,!0)/1e7,centerZoom:n.getUint8(118),centerLon:n.getInt32(119,!0)/1e7,centerLat:n.getInt32(123,!0)/1e7,etag:t}}z(Tn,"bytesToHeader");function Rt(e){let t={buf:new Uint8Array(e),pos:0},n=$e(t),r=[],o=0;for(let a=0;a<n;a++){let s=$e(t);r.push({tileId:o+s,offset:0,length:0,runLength:1}),o+=s}for(let a=0;a<n;a++)r[a].runLength=$e(t);for(let a=0;a<n;a++)r[a].length=$e(t);for(let a=0;a<n;a++){let s=$e(t);s===0&&a>0?r[a].offset=r[a-1].offset+r[a-1].length:r[a].offset=s-1}return r}z(Rt,"deserializeIndex");
vendor: 4,257 bytes, line 1
1var kn=class extends Error{};z(kn,"EtagMismatch");var Bt=kn;function Vt(e,t){return te(this,null,function*(){let n=yield e.getBytes(0,16384);if(new DataView(n.data).getUint16(0,!0)!==19792)throw new Error("Wrong magic number for PMTiles archive");let r=n.data.slice(0,Ar),o=Tn(r,n.etag),a=n.data.slice(o.rootDirectoryOffset,o.rootDirectoryOffset+o.rootDirectoryLength),s=`${e.getKey()}|${o.etag||""}|${o.rootDirectoryOffset}|${o.rootDirectoryLength}`,i=Rt(yield t(a,o.internalCompression));return[o,[s,i.length,i]]})}z(Vt,"getHeaderAndRoot");function Nt(e,t,n,r,o,a){return te(this,null,function*(){let s=yield e.getBytes(n,r,a,o.etag),i=yield t(s.data,o.internalCompression),c=Rt(i);if(c.length===0)throw new Error("Empty directory is invalid");return c})}z(Nt,"getDirectory");var Sr=class{constructor(t=100,n=!0,r=it){this.cache=new Map,this.maxCacheEntries=t,this.counter=1,this.decompress=r}getHeader(t){return te(this,null,function*(){let n=t.getKey(),r=this.cache.get(n);if(r)return r.lastUsed=this.counter++,r.data;let o=yield Vt(t,this.decompress);return o[1]&&this.cache.set(o[1][0],{lastUsed:this.counter++,data:o[1][2]}),this.cache.set(n,{lastUsed:this.counter++,data:o[0]}),this.prune(),o[0]})}getDirectory(t,n,r,o,a){return te(this,null,function*(){let s=`${t.getKey()}|${o.etag||""}|${n}|${r}`,i=this.cache.get(s);if(i)return i.lastUsed=this.counter++,i.data;let c=yield Nt(t,this.decompress,n,r,o,a);return this.cache.set(s,{lastUsed:this.counter++,data:c}),this.prune(),c})}prune(){if(this.cache.size>this.maxCacheEntries){let t=1/0,n;this.cache.forEach((r,o)=>{r.lastUsed<t&&(t=r.lastUsed,n=o)}),n&&this.cache.delete(n)}}invalidate(t){return te(this,null,function*(){this.cache.delete(t.getKey())})}};z(Sr,"ResolvedValueCache");var An=class{constructor(t=100,n=!0,r=it){this.cache=new Map,this.invalidations=new Map,this.pendingFetches=new Map,this.maxCacheEntries=t,this.counter=1,this.decompress=r}getHeader(t){return te(this,null,function*(){let n=t.getKey(),r=this.cache.get(n);if(r)return r.lastUsed=this.counter++,yield r.data;let o=new Promise((a,s)=>{Vt(t,this.decompress).then(i=>{i[1]&&this.cache.set(i[1][0],{lastUsed:this.counter++,data:Promise.resolve(i[1][2])}),a(i[0]),this.prune()}).catch(i=>{s(i)})});return this.cache.set(n,{lastUsed:this.counter++,data:o}),o})}trackSignal(t,n,r){n.refs++,r.addEventListener("abort",()=>{--n.refs<=0&&this.pendingFetches.get(t)===n&&(n.controller.abort(),this.cache.delete(t),this.pendingFetches.delete(t))},{once:!0})}getDirectory(t,n,r,o,a){return te(this,null,function*(){let s=`${t.getKey()}|${o.etag||""}|${n}|${r}`,i=this.cache.get(s);if(i){i.lastUsed=this.counter++;let h=this.pendingFetches.get(s);return h&&this.trackSignal(s,h,a??new AbortController().signal),yield i.data}let c=new AbortController,f={controller:c,refs:0};this.trackSignal(s,f,a??new AbortController().signal),this.pendingFetches.set(s,f);let u=new Promise((h,m)=>{Nt(t,this.decompress,n,r,o,c.signal).then(d=>{this.pendingFetches.delete(s),h(d),this.prune()}).catch(d=>{m(d)})});return this.cache.set(s,{lastUsed:this.counter++,data:u}),u})}prune(){if(this.cache.size>=this.maxCacheEntries){let t=1/0,n;this.cache.forEach((r,o)=>{r.lastUsed<t&&(t=r.lastUsed,n=o)}),n&&this.cache.delete(n)}}invalidate(t){return te(this,null,function*(){let n=t.getKey();if(this.invalidations.get(n))return yield this.invalidations.get(n);this.cache.delete(t.getKey());let r=new Promise((o,a)=>{this.getHeader(t).then(s=>{o(),this.invalidations.delete(n)}).catch(s=>{a(s)})});this.invalidations.set(n,r)})}};z(An,"SharedPromiseCache");var Cr=An,Pn=class{constructor(t,n,r){typeof t=="string"?this.source=new Br(t):this.source=t,r?this.decompress=r:this.decompress=it,n?this.cache=n:this.cache=new Cr}getHeader(){return te(this,null,function*(){return yield this.cache.getHeader(this.source)})}getZxyAttempt(t,n,r,o){return te(this,null,function*(){let a=_n(t,n,r),s=yield this.cache.getHeader(this.source);if(o?.throwIfAborted(),t<s.minZoom||t>s.maxZoom)return;let i=s.rootDirectoryOffset,c=s.rootDirectoryLength;for(let f=0;f<=3;f++){let u=yield this.cache.getDirectory(this.source,i,c,s,o);o?.throwIfAborted();let h=Ln(u,a);if(h){if(h.runLength>0){let m=yield this.source.getBytes(s.tileDataOffset+h.offset,h.length,o,s.etag);
1return{data:yield this.decompress(m.data,s.tileCompression),cacheControl:m.cacheControl,expires:m.expires}}i=s.leafDirectoryOffset+h.offset,c=h.length}else return}throw new Error("Maximum directory depth exceeded")})}getZxy(t,n,r,o){return te(this,null,function*(){try{return yield this.getZxyAttempt(t,n,r,o)}catch(a){if(a instanceof Bt)return this.cache.invalidate(this.source),yield this.getZxyAttempt(t,n,r,o);throw a}})}getMetadataAttempt(){return te(this,null,function*(){let t=yield this.cache.getHeader(this.source),n=yield this.source.getBytes(t.jsonMetadataOffset,t.jsonMetadataLength,void 0,t.etag),r=yield this.decompress(n.data,t.internalCompression),o=new TextDecoder("utf-8");return JSON.parse(o.decode(r))})}getMetadata(){return te(this,null,function*(){try{return yield this.getMetadataAttempt()}catch(t){if(t instanceof Bt)return this.cache.invalidate(this.source),yield this.getMetadataAttempt();throw t}})}getTileJson(t){return te(this,null,function*(){let n=yield this.getHeader(),r=yield this.getMetadata(),o=En(n.tileType);return{tilejson:"3.0.0",scheme:"xyz",tiles:[`${t}/{z}/{x}/{y}${o}`],vector_layers:r.vector_layers,attribution:r.attribution,description:r.description,name:r.name,version:r.version,bounds:[n.minLon,n.minLat,n.maxLon,n.maxLat],center:[n.centerLon,n.centerLat,n.centerZoom],minzoom:n.minZoom,maxzoom:n.maxZoom}})}};z(Pn,"PMTiles");var St=Pn;function ye(e,t){this.x=e,this.y=t}ye.prototype={clone(){return new ye(this.x,this.y)},add(e){return this.clone()._add(e)},sub(e){return this.clone()._sub(e)},multByPoint(e){return this.clone()._multByPoint(e)},divByPoint(e){return this.clone()._divByPoint(e)},mult(e){return this.clone()._mult(e)},div(e){return this.clone()._div(e)},rotate(e){return this.clone()._rotate(e)},rotateAround(e,t){return this.clone()._rotateAround(e,t)},matMult(e){return this.clone()._matMult(e)},unit(){return this.clone()._unit()},perp(){return this.clone()._perp()},round(){return this.clone()._round()},mag(){return Math.sqrt(this.x*this.x+this.y*this.y)},equals(e){return this.x===e.x&&this.y===e.y},dist(e){return Math.sqrt(this.distSqr(e))},distSqr(e){const t=e.x-this.x,n=e.y-this.y;return t*t+n*n},angle(){return Math.atan2(this.y,this.x)},angleTo(e){return Math.atan2(this.y-e.y,this.x-e.x)},angleWith(e){return this.angleWithSep(e.x,e.y)},angleWithSep(e,t){return Math.atan2(this.x*t-this.y*e,this.x*e+this.y*t)},_matMult(e){const t=e[0]*this.x+e[1]*this.y,n=e[2]*this.x+e[3]*this.y;return this.x=t,this.y=n,this},_add(e){return this.x+=e.x,this.y+=e.y,this},_sub(e){return this.x-=e.x,this.y-=e.y,this},_mult(e){return this.x*=e,this.y*=e,this},_div(e){return this.x/=e,this.y/=e,this},_multByPoint(e){return this.x*=e.x,this.y*=e.y,this},_divByPoint(e){return this.x/=e.x,this.y/=e.y,this},_unit(){return this._div(this.mag()),this},_perp(){const e=this.y;return this.y=this.x,this.x=-e,this},_rotate(e){const t=Math.cos(e),n=Math.sin(e),r=t*this.x-n*this.y,o=n*this.x+t*this.y;return this.x=r,this.y=o,this},_rotateAround(e,t){const n=Math.cos(e),r=Math.sin(e),o=t.x+n*(this.x-t.x)-r*(this.y-t.y),a=t.y+r*(this.x-t.x)+n*(this.y-t.y);return this.x=o,this.y=a,this},_round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this},constructor:ye};ye.convert=function(e){if(e instanceof ye)return e;if(Array.isArray(e))return new ye(+e[0],+e[1]);if(e.x!==void 0&&e.y!==void 0)return new ye(+e.x,+e.y);throw new Error("Expected [x, y] or {x, y} point format")};class Bn{constructor(t,n,r,o,a){for(this.properties=Object.create(null),this.extent=r,this.type=0,this.id=void 0,this._pbf=t,this._geometry=-1,this._keys=o,this._values=a;t.pos<n;){const s=t.readVarint();if(s===8)this.id=t.readVarint();else if(s===18){const i=t.readVarint()+t.pos;for(;t.pos<i;){const c=o[t.readVarint()],f=a[t.readVarint()];this.properties[c]=f}}else s===24?this.type=t.readVarint():(s===34&&(this._geometry=t.pos),t.skip(s))}}loadGeometry(){if(this._geometry<0)throw new Error("feature has no geometry");const t=this._pbf;t.pos=this._geometry;const n=t.readVarint()+t.pos,r=[];let o,a=1,s=0,i=0,c=0;for(;t.pos<n;){if(s<=0){const f=t.readVarint();if(a=f&7,s=f>>3,s===0)continue}if(s--,a===1)i+=t.readSVarint(),c+=t.readSVarint(),o&&r.push(o),o=[new ye(i,c)];else if(a===2)i+=t.readSVarint(),c+=t.readSVarint(),o&&o.push(new ye(i,c));else if(a===7)o&&o.push(o[0].clone());else throw new Error(`unknown command ${a}`)}return o&&r.push(o),r}bbox(){if(this._geometry<0)throw new Error("feature has no geometry");const t=this._pbf;t.pos=this._geometry;const n=t.readVarint()+t.pos;let r=1,o=0,a=0,s=0,i=1/0,c=-1/0,f=1/0,u=-1/0;for(;t.pos<n;){if(o<=0){const h=t.readVarint();if(r=h&7,o=h>>3,o===0)continue}if(o--,r===1||r===2)a+=t.readSVarint(),s+=t.readSVarint(),a<i&&(i=a),a>c&&(c=a),s<f&&(f=s),s>u&&(u=s);else if(r!==7)throw new Error(`unknown command ${r}`)}return[i,f,c,u]}toGeoJSON(t,n,r){const o=this.extent*Math.pow(2,r),a=this.extent*t,s=this.extent*n,i=this.loadGeometry();function c(m){return[(m.x+a)*360/o-180,360/Math.PI*Math.atan(Math.exp((1-(m.y+s)*2/o)*Math.PI))-90]}function f(m){return m.map(c)}let u;
1if(this.type===1){const m=[];for(const g of i)m.push(g[0]);const d=f(m);u=m.length===1?{type:"Point",coordinates:d[0]}:{type:"MultiPoint",coordinates:d}}else if(this.type===2){const m=i.map(f);u=m.length===1?{type:"LineString",coordinates:m[0]}:{type:"MultiLineString",coordinates:m}}else if(this.type===3){const m=Ir(i),d=[];for(const g of m)d.push(g.map(f));u=d.length===1?{type:"Polygon",coordinates:d[0]}:{type:"MultiPolygon",coordinates:d}}else throw new Error("unknown feature type");const h={type:"Feature",geometry:u,properties:this.properties};return this.id!=null&&(h.id=this.id),h}}Bn.types=["Unknown","Point","LineString","Polygon"];function Ir(e){const t=e.length;if(t<=1)return[e];const n=[];let r,o;for(let a=0;a<t;a++){const s=$r(e[a]);s!==0&&(o===void 0&&(o=s<0),o===s<0?(r&&n.push(r),r=[e[a]]):r&&r.push(e[a]))}return r&&n.push(r),n}function $r(e){let t=0;for(let n=0,r=e.length,o=r-1,a,s;n<r;o=n++)a=e[n],s=e[o],t+=(s.x-a.x)*(a.y+s.y);return t}class Fr{constructor(t,n){for(this.version=1,this.name="",this.extent=4096,this.length=0,this._pbf=t,this._keys=[],this._values=[],this._features=[],n===void 0&&(n=t.length);t.pos<n;){const r=t.readVarint();r===10?this.name=t.readString():r===18?(this._features.push(t.pos),t.skip(r)):r===26?this._keys.push(t.readString()):r===34?this._values.push(Dr(t)):r===40?this.extent=t.readVarint():r===120?this.version=t.readVarint():t.skip(r)}this.length=this._features.length}feature(t){if(t<0||t>=this._features.length)throw new Error("feature index out of bounds");this._pbf.pos=this._features[t];const n=this._pbf.readVarint()+this._pbf.pos;return new Bn(this._pbf,n,this.extent,this._keys,this._values)}}function Dr(e){let t=null;const n=e.readVarint()+e.pos;for(;e.pos<n;){const r=e.readVarint();t=r===10?e.readString():r===21?e.readFloat():r===25?e.readDouble():r===32?e.readVarint(!0):r===40?e.readVarint():r===48?e.readSVarint():r===56?e.readBoolean():(e.skip(r),null)}if(t==null)throw new Error("unknown feature value");return t}class Sn{constructor(t,n=t.length){const r=Object.create(null);for(;t.pos<n;){const o=t.readVarint();if(o===26){const a=new Fr(t,t.readVarint()+t.pos);a.length&&(r[a.name]=a)}else t.skip(o)}this.layers=r}}const Qt=65536*65536,Or=12,en=typeof TextDecoder>"u"?null:new TextDecoder("utf-8"),Rr=0,Vr=1,tn=2,Nr=5;class Cn{constructor(t){this.buf=ArrayBuffer.isView(t)?t:new Uint8Array(t),this.dataView=new DataView(this.buf.buffer,this.buf.byteOffset,this.buf.byteLength),this.pos=0,this.type=0,this._valueStart=-1,this.length=this.buf.length}readFields(t,n,r=this.length){let o;for(;o=this.nextField(r);)t(o,n,this);return n}readMessage(t,n){return this.readFields(t,n,this.readVarint()+this.pos)}readFixed32(){const t=this.dataView.getUint32(this.pos,!0);return this.pos+=4,t}readSFixed32(){const t=this.dataView.getInt32(this.pos,!0);return this.pos+=4,t}readFixed64(){const t=this.dataView.getUint32(this.pos,!0)+this.dataView.getUint32(this.pos+4,!0)*Qt;return this.pos+=8,t}readSFixed64(){const t=this.dataView.getUint32(this.pos,!0)+this.dataView.getInt32(this.pos+4,!0)*Qt;return this.pos+=8,t}readFloat(){const t=this.dataView.getFloat32(this.pos,!0);return this.pos+=4,t}readDouble(){const t=this.dataView.getFloat64(this.pos,!0);return this.pos+=8,t}readVarint(t){const n=this.buf,r=n[this.pos++];if(r<128)return r;let o=r&127,a;return a=n[this.pos++],o|=(a&127)<<7,a<128||(a=n[this.pos++],o|=(a&127)<<14,a<128)||(a=n[this.pos++],o|=(a&127)<<21,a<128)?o:(a=n[this.pos],o|=(a&15)<<28,jr(o,t,this))}readSVarint(){const t=this.readVarint();return t%2===1?(t+1)/-2:t/2}readBoolean(){return!!this.readVarint()}readString(){const t=this.readVarint()+this.pos,n=this.pos;return this.pos=t,t-n>=Or&&en?en.decode(this.buf.subarray(n,t)):Ur(this.buf,n,t)}readBytes(){const t=this.readVarint()+this.pos,n=this.buf.subarray(this.pos,t);return this.pos=t,n}readPackedVarint(t=[],n){const r=this.readPackedEnd();for(;this.pos<r;)t.push(this.readVarint(n));return t}readPackedSVarint(t=[]){const n=this.readPackedEnd();for(;this.pos<n;)t.push(this.readSVarint());return t}readPackedBoolean(t=[]){const n=this.readPackedEnd();for(;this.pos<n;)t.push(this.readBoolean());return t}readPackedFloat(t=[]){const n=this.readPackedEnd();for(;this.pos<n;)t.push(this.readFloat());return t}readPackedDouble(t=[]){const n=this.readPackedEnd();for(;this.pos<n;)t.push(this.readDouble());return t}readPackedFixed32(t=[]){const n=this.readPackedEnd();for(;this.pos<n;)t.push(this.readFixed32());return t}readPackedSFixed32(t=[]){const n=this.readPackedEnd();for(;this.pos<n;)t.push(this.readSFixed32());return t}readPackedFixed64(t=[]){const n=this.readPackedEnd();for(;this.pos<n;)t.push(this.readFixed64());return t}readPackedSFixed64(t=[]){const n=this.readPackedEnd();for(;this.pos<n;)t.push(this.readSFixed64());return t}readPackedEnd(){return this.type===tn?this.readVarint()+this.pos:this.pos+1}nextField(t=this.length){if(this.pos===this._valueStart&&this.skip(this.type),this.pos>=t)return 0;const n=this.readVarint();return this.type=n&7,this._valueStart=this.pos,n>>>3}skip(t){const n=t&7;if(n===Rr)for(;this.buf[this.pos++]>127;);else if(n===tn)this.pos=this.readVarint()+this.pos;else if(n===Nr)this.pos+=4;else if(n===Vr)this.pos+=8;else throw new Error(`Unimplemented type: ${n}`)}}function jr(e,t,n){const r=n.buf;let o,a;if(a=r[n.pos++],o=(a&112)>>4,a<128||(a=r[n.pos++],o|=(a&127)<<3,a<128)||(a=r[n.pos++],o|=(a&127)<<10,a<128)||(a=r[n.pos++],o|=(a&127)<<17,a<128)||(a=r[n.pos++],o|=(a&127)<<24,a<128)||(a=r[n.pos++],o|=(a&1)<<31,a<128))return Ie(e,o,t);throw new Error("Expected varint not more than 10 bytes")}function Ie(e,t,n){return n?t*4294967296+(e>>>0):(t>>>0)*4294967296+(e>>>0)}function Ur(e,t,n){let r="",o=t;for(;o<n;){const a=e[o];let s=null,i=a>239?4:a>223?3:a>191?2:1;if(o+i>n)break;let c,f,u;i===1?a<128&&(s=a):i===2?(c=e[o+1],(c&192)===128&&(s=(a&31)<<6|c&63,s<=127&&(s=null))):i===3?(c=e[o+1],f=e[o+2],(c&192)===128&&(f&192)===128&&(s=(a&15)<<12|(c&63)<<6|f&63,(s<=2047||s>=55296&&s<=57343)&&(s=null))):i===4&&(c=e[o+1],f=e[o+2],u=e[o+3],(c&192)===128&&(f&192)===128&&(u&192)===128&&(s=(a&15)<<18|(c&63)<<12|(f&63)<<6|u&63,(s<=65535||s>=1114112)&&(s=null))),s===null?(s=65533,i=1):s>65535&&(s-=65536,r+=String.fromCharCode(s>>>10&1023|55296),s=56320|s&1023),r+=String.fromCharCode(s),o+=i}return r}let Ue={stations:null,all:null,timestamp:0},yt=null,nn=null,ve=null;function Oe(e,t){return Math.floor((e+180)/360*Math.pow(2,t))}function Re(e,t){const n=e*Math.PI/180;return Math.floor((1-Math.log(Math.tan(n)+1/Math.cos(n))/Math.PI)/2*Math.pow(2,t))}function rn(e,t){return e/Math.pow(2,t)*360-180}function on(e,t){const n=Math.PI-2*Math.PI*e/Math.pow(2,t);return 180/Math.PI*Math.atan(.5*(Math.exp(n)-Math.exp(-n)))}function In(e){return(!yt||nn!==e)&&(nn=e,yt=new St(e),ve=null),yt}function Qe(e,t){if(!e||t<12)return!1;const n=K.pipeline.bounds;if(!n)return!1;const r=typeof e.getCenter=="function"?e.getCenter():null;if(!r)return!1;const o=r.lat,a=r.lng??r.lon;return o==null||a==null?!1:o>=n.south&&o<=n.north&&a>=n.west&&a<=n.east}function Zr(e){if(!e||!e.type)return null;if(e.type==="Point"&&Array.isArray(e.coordinates)&&e.coordinates.length>
1=2)return{lon:e.coordinates[0],lat:e.coordinates[1]};let t=null;if(e.type==="Polygon"&&Array.isArray(e.coordinates?.[0])?t=e.coordinates[0]:e.type==="MultiPolygon"&&Array.isArray(e.coordinates?.[0]?.[0])?t=e.coordinates[0][0]:e.type==="LineString"&&Array.isArray(e.coordinates)?t=e.coordinates:e.type==="MultiLineString"&&Array.isArray(e.coordinates?.[0])&&(t=e.coordinates[0]),!Array.isArray(t)||t.length===0)return null;let n=0,r=0,o=0;for(const a of t)if(Array.isArray(a)&&a.length>=2){const s=a[0],i=a[1];typeof s=="number"&&typeof i=="number"&&!Number.isNaN(s)&&!Number.isNaN(i)&&(n+=s,r+=i,o++)}return o===0?null:{lon:n/o,lat:r/o}}function $n(e,t){if(!e||!e.geometry)return null;const n=Zr(e.geometry);if(!n)return null;const{lat:r,lon:o}=n,a=e.properties||{},s=`${Math.round(r*1e6)}_${Math.round(o*1e6)}`,i=e.id??a["@id"]??a.id??`${t}_${s}`,c=a["@type"]||(e.geometry.type==="Point"?"node":"way");return{id:i,type:c,lat:r,lon:o,tags:a}}async function Gr(e,t,{signal:n,zoom:r}={}){const o=K.pipeline?.url,a=K.pipeline?.pmtilesFile,s=`${o.replace(/\/+$/,"")}/${a}`,i=In(s);ve||(ve=await i.getHeader());const c=ve.maxZoom||14,f=ve.minZoom||12,h=Math.min(Math.max(typeof r=="number"?r:14,f),c),m=typeof e.getSouth=="function"?e.getSouth():e.south,d=typeof e.getNorth=="function"?e.getNorth():e.north,g=typeof e.getWest=="function"?e.getWest():e.west,y=typeof e.getEast=="function"?e.getEast():e.east;let x=Oe(g,h),b=Oe(y,h),k=Re(d,h),T=Re(m,h);(b-x+3)*(T-k+3)<=150&&(x-=1,b+=1,k-=1,T+=1);const w=(b-x+1)*(T-k+1);if(w>300)throw new Error(`Tile-Ausschnitt zu groß (${w} Kacheln), wechsle auf Fallback.`);const F=t==="stations"?["fire_stations"]:["fire_stations","hydrants","water_points","defibrillators"],O=new Map,$=[];for(let S=x;S<=b;S++)for(let C=k;C<=T;C++)$.push(i.getZxy(h,S,C,n).then(E=>{if(!E||!E.data)return;const B=new Cn(new Uint8Array(E.data)),p=new Sn(B);for(const _ of F){const A=p.layers[_];if(A)for(let Z=0;Z<A.length;Z++){const W=A.feature(Z).toGeoJSON(S,C,h),G=$n(W,_);if(!G)continue;const Y=String(G.id);O.has(Y)||O.set(Y,G)}}}));await Promise.all($);const I=on(T+1,h),P=on(k,h),U=rn(x,h),R=rn(b+1,h),v=Array.from(O.values());return v.loadedBounds=typeof L<"u"&&L.latLngBounds?L.latLngBounds([I,U],[P,R]):{south:I,north:P,west:U,east:R},v}async function zr(e,t,{signal:n}={}){const r=[];t==="stations"?r.push({name:"fire_stations",file:"fire_stations.geojson"}):r.push({name:"fire_stations",file:"fire_stations.geojson"},{name:"hydrants",file:"hydrants.geojson"},{name:"water_points",file:"water_points.geojson"},{name:"defibrillators",file:"defibrillators.geojson"});const o=r.map(async s=>{const i=`${e.replace(/\/+$/,"")}/${s.file}`,c=await fetch(i,{signal:n,cache:"no-cache"});if(!c.ok)throw new Error(`Pipeline-Abruf fehlgeschlagen: ${s.file} (HTTP ${c.status})`);const f=await c.json(),u=Array.isArray(f?.features)?f.features:[],h=[];for(let m=0;m<u.length;m++){const d=$n(u[m],s.name);d&&h.push(d)}return h});return(await Promise.all(o)).flat()}async function Hr(e,t,{signal:n,zoom:r}={}){const o=K.pipeline?.url;try{const g=await Gr(e,t,{signal:n,zoom:r});if(Array.isArray(g))return g}catch(g){if(g?.name==="AbortError")throw g;console.warn("[Pipeline] PMTiles-Abruf fehlgeschlagen, wechsle auf GeoJSON-Fallback:",g.message)}const a=Date.now(),s=t==="stations"?"stations":"all";if(!(Ue[s]&&a-Ue.timestamp<600*1e3)){const g=await zr(o,t,{signal:n});Ue[s]=g,Ue.timestamp=a}const c=Ue[s]||[];if(!e||typeof e.getSouth!="function")return c;const f=.02,u=e.getSouth()-f,h=e.getNorth()+f,m=e.getWest()-f,d=e.getEast()+f;return c.filter(g=>g.lat>=u&&g.lat<=h&&g.lon>=m&&g.lon<=d)}async function qr(e,{signal:t,zoom:n}={}){const r=K.pipeline?.url;try{const o=K.pipeline?.pmtilesFile||"openfiremap.pmtiles",a=`${r.replace(/\/+$/,"")}/${o}`,s=In(a);ve||(ve=await s.getHeader());const i=ve.maxZoom||16,c=ve.minZoom||12,u=Math.min(Math.max(typeof n=="number"?n:14,c),i),h=typeof e.getSouth=="function"?e.getSouth():e.south,m=typeof e.getNorth=="function"?e.getNorth():e.north,d=typeof e.getWest=="function"?e.getWest():e.west,g=typeof e.getEast=="function"?e.getEast():e.east;let y=Oe(d,u),x=Oe(g,u),b=Re(m,u),k=Re(h,u);(x-y+3)*(k-b+3)<=150&&(y-=1,x+=1,b-=1,k+=1);const T=new Map,w=[];for(let O=y;O<=x;O++)for(let $=b;$<=k;$++)w.push(s.getZxy(u,O,$,t).then(I=>
1{if(!I||!I.data)return;const P=new Cn(new Uint8Array(I.data)),R=new Sn(P).layers.boundaries;if(R)for(let v=0;v<R.length;v++){const S=R.feature(v),C=S.toGeoJSON(O,$,u),E=C.geometry?.coordinates;if(!Array.isArray(E)||E.length===0)continue;const B=E[0],p=E[E.length-1],_=S.id??`${Math.round(B[1]*1e5)}_${Math.round(B[0]*1e5)}_${Math.round(p[1]*1e5)}_${Math.round(p[0]*1e5)}`;T.has(_)||T.set(_,{id:_,type:"way",tags:{boundary:"administrative",...C.properties||{}},geometry:E.map(A=>({lat:A[1],lon:A[0]}))})}}));await Promise.all(w);const F=Array.from(T.values());if(F.length>0)return F}catch(o){if(o?.name==="AbortError")throw o;console.warn("[Pipeline] PMTiles-Boundary-Abruf fehlgeschlagen, wechsle auf GeoJSON:",o.message)}try{const o=`${r.replace(/\/+$/,"")}/boundaries.geojson`,a=await fetch(o,{signal:t,cache:"no-cache"});if(a.ok){const s=await a.json(),i=Array.isArray(s?.features)?s.features:[],c=[];for(let f=0;f<i.length;f++){const u=i[f],h=u.geometry?.coordinates;!Array.isArray(h)||h.length===0||c.push({id:u.id||`boundary_${f}`,type:"way",tags:{boundary:"administrative",...u.properties||{}},geometry:h.map(m=>({lat:m[1],lon:m[0]}))})}return c}}catch(o){if(o?.name==="AbortError")throw o;console.warn("[Pipeline] GeoJSON-Boundary-Abruf fehlgeschlagen:",o.message)}return[]}const Kr="OFM_DB",Te="keyval",Wr=1,ge=2,jt=3,Fn=3600*1e3,fe=24*Fn;function Ut(e="default"){let t=null;try{const r=localStorage.getItem("ofm_cache_hours");if(r!=null){const o=Number(r);Number.isFinite(o)&&(t=o*Fn)}}catch{}if(t===0)return{dataClass:e,version:ge,ttlMs:0,staleTtlMs:0};let n;switch(e){case"boundaries":n={dataClass:e,version:ge,ttlMs:30*fe,staleTtlMs:120*fe};break;case"fire_stations":n={dataClass:e,version:ge,ttlMs:14*fe,staleTtlMs:45*fe};break;case"aed":n={dataClass:e,version:ge,ttlMs:2*fe,staleTtlMs:10*fe};break;case"hydrants_and_water_points":n={dataClass:e,version:ge,ttlMs:3*fe,staleTtlMs:14*fe};break;default:n={dataClass:e,version:ge,ttlMs:7*fe,staleTtlMs:21*fe};break}if(t!=null&&t>0){const r=e==="boundaries"?Math.max(n.ttlMs,t):t,o=r*jt;return{dataClass:e,version:ge,ttlMs:r,staleTtlMs:o}}return n}function Xr(e){if(!e)return null;const t=e.createdAt??e.ts??0,n=e.data;if(!t||!n)return null;const r=Number(e.ttlMs??0)||null,o=Number(e.staleTtlMs??0)||(r?r*jt:null);return{createdAt:t,data:n,dataClass:e.dataClass||"legacy",ttlMs:r,staleTtlMs:o,version:e.version||1}}function Dn(e,t=null){return Number(t??e?.ttlMs??0)||0}function Jr(e,t=Date.now()){if(!e?.createdAt)return!1;const n=Dn(e);return n?t-e.createdAt<=n:!1}function Yr(e,t=Date.now()){if(!e?.createdAt)return!1;const n=Number(e.staleTtlMs??0)||Dn(e)*jt;return n?t-e.createdAt<=n:!1}function Zt(){return new Promise((e,t)=>{const n=indexedDB.open(Kr,Wr);n.onerror=()=>t(n.error),n.onupgradeneeded=()=>{const r=n.result;r.objectStoreNames.contains(Te)||r.createObjectStore(Te)},n.onsuccess=()=>e(n.result)})}async function Qr(e,t){console.log("[Cache] getCache",e);try{const n=await On(e);if(!n)return null;const r=Date.now()-n.createdAt;return console.log("[Cache] Found entry, age:",Math.round(r/1e3),"sec, maxAge:",Math.round(t/1e3),"sec"),t&&r>t?(console.log("[Cache] Entry EXPIRED, deleting"),Gt(e).catch(console.warn),null):(console.log("[Cache] Returning cached data"),n.data)}catch(n){return console.warn("[Cache] Read error",n),null}}async function On(e){try{const t=await Zt();return new Promise((n,r)=>{const s=t.transaction(Te,"readonly").objectStore(Te).get(e);s.onerror=()=>r(s.error),s.onsuccess=()=>{const i=Xr(s.result);if(!i){n(null);return}if(i.version!==ge){Gt(e).catch(console.warn),n(null);return}n(i)}})}catch(t){return console.warn("[Cache] Entry read error",t),null}}async function Gt(e){try{(await Zt()).transaction(Te,"readwrite").objectStore(Te).delete(e)}catch{}}async function eo(e,t,n={}){console.log("[Cache] setCache",e,t?.elements?.length);try{const r=n?.dataClass?Ut(n.dataClass):{},o={createdAt:Date.now(),ttlMs:Number(n.ttlMs??r.ttlMs??0)||null,staleTtlMs:Number(n.staleTtlMs??r.staleTtlMs??0)||null,dataClass:n.dataClass??r.dataClass??"default",version:n.version??r.version??ge,data:t},a=await Zt();return new Promise(s=>{const f=a.transaction(Te,"readwrite").objectStore(Te).put(o,e);f.onerror=()=>{console.warn("[Cache] Write error",f.error),s()},f.onsuccess=()=>s()})}catch(r){console.warn("[Cache] Write error",r)}}const to=()=>localStorage.getItem("OFM_DEBUG")==="1",N=e=>{try{window.dispatchEvent(new CustomEvent("ofm:overpass",{detail:e}))}catch{}to()&&console.log("[OFM]",e)};let no=0,be=null,We=0,_e=null,Xe=0,De=0,et=0;function lt(){return new DOMException("The operation was aborted.","AbortError")}function Ct(e){if(e?.aborted)throw lt()}function Ge(e,t=null){return t?(Ct(t),new Promise((n,r)=>{let o;const a=()=>{clearTimeout(o),s(),r(lt())},s=()=>t.removeEventListener("abort",a);o=setTimeout(()=>{s(),n()},e),t.addEventListener("abort",a,{once:!0})})):new Promise(n=>setTimeout(n,e))}async function ro(e,t=null){const n=Date.now();if(et>n){const r=et-n;N({phase:"backoff_wait",reqId:e,ms:r});const o=Math.ceil(r/1e3);H(`${M("status_waiting")} (${o}${M("seconds_short")})...`,Math.min(r,5e3)),await Ge(r,t)}}function an({minMs:e,maxMs:t}){const n=De?Math.min(De*2,t):e,r=Math.floor(Math.random()*1500);De=n+r,et=Date.now()+De}const vt=new Map;function Be(e){return vt.has(e)||vt.set(e,{failUntil:0,lastOkTs:0,lastFailTs:0,lastStatus:null}),vt.get(e)}function oo(e,t=200){const n=Be(e);n.lastOkTs=Date.now(),n.lastStatus=t,n.failUntil=0}function wt(e,t,n){const r=Be(e);r.lastFailTs=Date.now(),r.lastStatus=t,r.failUntil=Math.max(r.failUntil,Date.now()+n)}function ao(e){return e?.name==="AbortError"?"status_waiting":e instanceof Le&&e.status===429?"err_ratelimit":e instanceof Le&&e.status>=500?"err_server":e?.message==="err_offline"?"err_offline":"err_generic"}function Je(e,t=.005){return Math.floor(Number(e)/t)*t}function Ye(e,t=4){const n=10**t;return Math.round(Number(e)*n)/n}function so(e){const n=Ye(Je(e.getSouth(),.005)),r=Ye(Je(e.getWest(),.005)),o=Ye(Je(e.getNorth(),.005)+.005),a=Ye(Je(e.getEast(),.005)+.005);return`${n},${r},${o},${a}`}function io({zoom:e,bboxKey:t,queryKind:n}){let r=e;return e>=15?r="15+":e>=12&&e<14&&(r="12-13"),`overpass:v3:${n}:z${r}:bbox:${t}`}function lo({bboxKey:e}){return`overpass:v3:boundaries:bbox:${e}`}
1function tt(e){return e?L.latLngBounds(e.getSouthWest(),e.getNorthEast()):null}function he(){l.cachedElements=[...l.cachedPoiElements||[],...l.cachedBoundaryElements||[]]}function Rn(){const e=l.map?.getBounds?.()||l.queryBounds;return{bbox:`${e.getSouth()},${e.getWest()},${e.getNorth()},${e.getEast()}`,bboxKey:l.queryMeta?.bbox?l.queryMeta.bbox:so(e)}}function co(e,t){const n=[];if(e>=12&&(n.push('nwr["amenity"="fire_station"];'),n.push('nwr["building"="fire_station"];')),e>=15&&(n.push('nwr["emergency"~"fire_hydrant|water_tank|suction_point|fire_water_pond|cistern"];'),n.push('node["emergency"="defibrillator"];')),n.length===0)return{query:"",queryKind:"none",dataClass:"default"};const r=e>=15?"pois":"stations",o=e>=15?"hydrants_and_water_points":"fire_stations";return{query:`[out:json][timeout:25][bbox:${t}];(${n.join("")})->.pois;.pois out center;`,queryKind:r,dataClass:o}}function uo(e,t){return e<14?"":`[out:json][timeout:25][bbox:${t}];(way["boundary"="administrative"]["admin_level"="8"];)->.boundaries;.boundaries out geom;`}function fo(e){return!e||typeof e!="object"?[]:Object.entries(e).sort(([t],[n])=>t.localeCompare(n))}function ho(e){if(!e||typeof e!="object")return"";const t=fo(e.tags).map(([a,s])=>`${a}:${String(s)}`).join("|"),n=Number(e.center?.lat??e.lat??0).toFixed(5),r=Number(e.center?.lon??e.lon??0).toFixed(5),o=Array.isArray(e.geometry)?e.geometry.map(a=>`${Number(a.lat).toFixed(5)},${Number(a.lon).toFixed(5)}`).join(";"):"";return[e.type||"node",e.id??"",n,r,t,o].join("#")}function nt(e){return!Array.isArray(e)||e.length===0?"empty":e.map(ho).sort().join("||")}function rt(e,t=.5,n=1){const r=Number.isFinite(e)?e:0;return Math.max(n,Math.floor(r*t))}async function Vn(e,t){const n=await On(e);if(!n)return{entry:null,freshData:null,staleData:null};const r={...n,dataClass:n.dataClass||t.dataClass,ttlMs:n.ttlMs??t.ttlMs,staleTtlMs:n.staleTtlMs??t.staleTtlMs},o=Jr(r),a=Yr(r);if(!o&&!a){try{await Gt(e)}catch{}return{entry:null,freshData:null,staleData:null}}return{entry:r,freshData:o?r.data:null,staleData:!o&&a?r.data:null}}function mo(e){const t=Date.now(),n=[],r=[];for(const o of e)Be(o).failUntil>t?r.push(o):n.push(o);for(let o=n.length-1;o>0;o--){const a=Math.floor(Math.random()*(o+1));[n[o],n[a]]=[n[a],n[o]]}return r.sort((o,a)=>Be(o).failUntil-Be(a).failUntil),[...n,...r]}async function Ve(e,{cacheKey:t,cacheTtlMs:n,cacheMeta:r=null,reqId:o,skipCache:a=!1,signal:s=null,minElementCount:i=null,silent:c=!1}){if(Ct(s),!navigator.onLine)throw new Error("err_offline");if(t&&!a){const d=await Qr(t,n);if(d)return N({phase:"cache_hit",reqId:o,cacheKey:t}),d;N({phase:"cache_miss",reqId:o,cacheKey:t})}const f=mo(K.overpassEndpoints||[]);if(f.length===0)throw new Error("err_generic");await ro(o,s);let u=null;for(let d=0;d<f.length;d++){Ct(s);const g=f[d],y=Be(g),x=Date.now();if(y.failUntil>x){const b=Math.ceil((y.failUntil-x)/1e3);N({phase:"skip_endpoint",reqId:o,endpoint:g,untilMs:y.failUntil-x,lastStatus:y.lastStatus}),!c&&d===f.length-1&&H(`${M("server_overloaded_wait")} ${b}${M("seconds_short")}...`,3e3);continue}try{if(!c&&d>0){const I=g.includes("overpass-api.de")?"Server 1":g.includes("z.overpass-api.de")?"Server 2":g.includes("lz4.overpass-api.de")?"Server 3":"Alternativ-Server";H(`${M("trying_server")} ${I}...`,6e4)}N({phase:"try",reqId:o,endpoint:g,attemptNum:d});const b=performance.now(),k=new URLSearchParams({data:e}).toString(),T=await tr(g,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"},body:k,timeoutMs:25e3,signal:s||l.controllers.fetch.signal});if(!T||typeof T!="object")throw new Error("err_generic");oo(g,200);const w=Array.isArray(T?.elements)?T.elements.length:0,F=i==null||w>=i;t&&F?await eo(t,T,r||(n?{ttlMs:n}:{})):t&&N({phase:"cache_skip_degraded",reqId:o,elements:w,minRequired:i});const O=Math.round(performance.now()-b),$=Array.isArray(T?.elements)?T.elements.length:null;return N({phase:"net_ok",reqId:o,endpoint:g,ms:O,elements:$}),De=0,et=0,T}catch(b){if(b?.name==="AbortError")throw b;u=b;const k=b instanceof Le?b.status:null;if(N({phase:"net_err",reqId:o,endpoint:g,status:k,message:String(b?.message||b)}),b instanceof Le){if(b.status===429){wt(g,429,9e4),an({minMs:8e3,maxMs:3e4}),N({phase:"ratelimit",reqId:o,endpoint:g,backoffMs:De}),c||(d<f.length-1?H(M("server_ratelimit_retry"),4e3):H(M("all_servers_busy"),6e3)),await Ge(300,s);continue}if(b.status>=500){wt(g,b.status,3e4),an({minMs:1200,maxMs:8e3}),!c&&d<f.length-1&&H(M("server_error_retry"),4e3),await Ge(400,s);continue}}wt(g,k,2e4),await Ge(300,s);continue}}const h=Date.now(),m=f.map(d=>{const g=Be(d);return g.failUntil>h?g.failUntil-h:0}).filter(d=>d>0);if(m.length===f.length){const d=Math.min(...m);if(d<=15e3){const y=Math.ceil(d/1e3);
1return N({phase:"wait_for_cooldown",reqId:o,waitMs:d}),c||H(`${M("server_overloaded_wait")} ${y}${M("seconds_short")}...`,d),await Ge(d+500,s),N({phase:"retry_after_cooldown",reqId:o}),Ve(e,{cacheKey:t,cacheTtlMs:n,cacheMeta:r,reqId:o,skipCache:a,signal:s,minElementCount:i,silent:c})}}throw u||new Error("err_generic")}function po(e){return Array.isArray(e)?e.filter(t=>t?.tags?.emergency==="fire_hydrant").length:0}function xe(e,t,n=[]){typeof e=="function"&&e({state:t,count:po(n)})}async function go(e=null,t=null){const n=Math.random().toString(36).substring(2,7),r=l.map.getZoom(),o=tt(l.queryBounds||l.map.getBounds()),a=r>=15?"all":"stations",s=r>=15?t:null;if(r<12)return l.cachedPoiElements=[],l.loadedPoiBounds=null,l.loadedPoiMode=null,he(),N({phase:"skip",reqId:n,reason:"zoom<12",zoom:r}),[];const{bbox:i,bboxKey:c}=Rn(),{query:f,queryKind:u,dataClass:h}=co(r,i);if(!f)return N({phase:"skip",reqId:n,reason:"no_query_parts",zoom:r}),[];const m=Ut(h),d=io({zoom:r,bboxKey:c,queryKind:u});l.isFetchingData=!0,N({phase:"load_start",reqId:n,zoom:r,bboxKey:c,dataset:"poi",dataClass:h}),xe(s,"loading"),l.controllers.fetch&&l.controllers.fetch.abort();const g=new AbortController;l.controllers.fetch=g;const y=()=>l.controllers.fetch===g,x=()=>{if(!y())throw lt()};be&&be.cacheKey!==d&&(be.controller.abort(),++We,be=null),console.log("[API] Cache Key:",d),console.log("[API] queryKind:",u,"| zoom:",r,"| bboxKey:",c);let b=!1;try{const k=tt(l.map?.getBounds?.()||o);if(Qe(k,r))try{console.log("[API] Verwende lokale Pipeline für Mittelfranken...");const w=await Hr(k,a,{signal:g.signal,zoom:r});if(x(),Array.isArray(w)){if(l.cachedPoiElements=w,l.loadedPoiBounds=w.loadedBounds||k,l.loadedPoiMode=a,he(),N({phase:"pipeline_hit",reqId:n,zoom:r,dataset:"poi",elements:w.length}),xe(s,"success",w),typeof e=="function")try{e(w)}catch(O){console.warn("[API] Fehler beim Rendern der Pipeline-POIs:",O)}const F=document.getElementById("data-status");return F&&(F.innerText=`${M("status_current")} (Lokal)`,F.className="text-green-400 font-bold"),w}}catch(w){if(w.name==="AbortError")throw w;console.warn("[API] Pipeline-Abruf fehlgeschlagen, wechsle auf Overpass-Fallback:",w.message),N({phase:"pipeline_fallback_to_overpass",reqId:n,error:w.message})}try{const{freshData:w,staleData:F}=await Vn(d,m);x();const O=w||F;if(O?.elements){b=!0;const $=!!w;if(l.cachedPoiElements=O.elements||[],l.loadedPoiBounds=o,l.loadedPoiMode=a,he(),console.log("[API] CACHE HIT!",l.cachedPoiElements.length,"elements"),N({phase:$?"swr_hit":"swr_stale_hit",reqId:n,cacheKey:d,dataset:"poi",dataClass:h,elements:l.cachedPoiElements.length}),xe(s,"refreshing",l.cachedPoiElements),typeof e=="function"&&l.cachedPoiElements.length>0&&e(l.cachedPoiElements),!be){const I=new AbortController,P=++We;be={controller:I,cacheKey:d};const U=l.cachedPoiElements.length,R=nt(l.cachedPoiElements);Ve(f,{cacheKey:d,cacheTtlMs:m.ttlMs,cacheMeta:m,reqId:n+"_bg",skipCache:!0,signal:I.signal,minElementCount:rt(U,.5,1),silent:!0}).then(v=>{if(We!==P)return;be=null;const S=v?.elements||[],C=rt(U,.5,1);if(U>0&&S.length<C){N({phase:"swr_refresh_skip_degraded",reqId:n,dataset:"poi",elements:S.length,minRequired:C}),xe(s,"success",l.cachedPoiElements);return}const E=nt(S)!==R;N({phase:"swr_refresh_ok",reqId:n,dataset:"poi",elements:S.length,changed:E}),E&&(l.cachedPoiElements=S,l.loadedPoiBounds=o,l.loadedPoiMode=a,he(),typeof e=="function"&&e(S)),xe(s,"success",S)}).catch(v=>{We===P&&(be=null,N({phase:"swr_refresh_err",reqId:n,dataset:"poi",err:v?.name}),v?.name!=="AbortError"&&xe(s,"error"))})}return l.cachedPoiElements}}catch(w){console.log("[API] CACHE MISS or error:",w?.message||"no data")}const T=performance.now();try{const w=await Ve(f,{cacheKey:d,cacheTtlMs:m.ttlMs,cacheMeta:m,reqId:n,skipCache:!0,signal:g.signal});x(),l.cachedPoiElements=w.elements||[],l.loadedPoiBounds=o,l.loadedPoiMode=a,he();const F=Math.round(performance.now()-T);return N({phase:"load_ok",reqId:n,zoom:r,totalMs:F,dataset:"poi",elements:l.cachedPoiElements.length,dataClass:h}),xe(s,"success",l.cachedPoiElements),l.cachedPoiElements}catch(w){if(w?.name==="AbortError")throw N({phase:"aborted",reqId:n,zoom:r}),w;
1if(b){console.warn("Background fetch failed, using stale data.",w);const F=w instanceof Le&&w.status===429?M("server_error_type_overload"):w instanceof Le&&w.status>=500?M("server_error_type_server"):M("server_error_type_connection");return H(`${F} - ${M("showing_cached")}`,4e3),l.cachedPoiElements}else{const F=ao(w);throw N({phase:"load_fail",reqId:n,zoom:r,code:F,status:w instanceof Le?w.status:null,message:String(w?.message||w)}),H(M(F),5e3),xe(s,"error"),w}}}finally{y()&&(l.isFetchingData=!1)}}async function yo(e=null){const t=Math.random().toString(36).substring(2,7),n=l.map.getZoom(),r=tt(l.queryBounds||l.map.getBounds());if(n<14)return l.cachedBoundaryElements=[],l.loadedBoundaryBounds=null,he(),N({phase:"skip_boundary",reqId:t,reason:"zoom<14",zoom:n,dataset:"boundary"}),[];const{bbox:o,bboxKey:a}=Rn(),s=uo(n,o),i=Ut("boundaries"),c=lo({bboxKey:a});if(!s)return[];l.controllers.boundaryFetch&&l.controllers.boundaryFetch.abort();const f=new AbortController;l.controllers.boundaryFetch=f;const u=()=>{if(l.controllers.boundaryFetch!==f)throw lt()};_e&&_e.cacheKey!==c&&(_e.controller.abort(),++Xe,_e=null);const h=tt(l.map?.getBounds?.()||r);if(Qe(h,n))try{console.log("[API] Verwende lokale Pipeline für Gemeindegrenzen...");const d=await qr(h,{signal:f.signal,zoom:n});if(u(),Array.isArray(d)&&d.length>0)return l.cachedBoundaryElements=d,l.loadedBoundaryBounds=h,he(),N({phase:"boundary_pipeline_hit",reqId:t,zoom:n,dataset:"boundary",elements:d.length}),typeof e=="function"&&e(d),d}catch(d){if(d.name==="AbortError")throw d;console.warn("[API] Pipeline Boundary-Abruf fehlgeschlagen, wechsle auf Overpass-Fallback:",d.message)}let m=!1;try{const{freshData:d,staleData:g}=await Vn(c,i);u();const y=d||g;if(y?.elements){m=!0;const x=!!d;if(l.cachedBoundaryElements=y.elements||[],l.loadedBoundaryBounds=r,he(),N({phase:x?"boundary_cache_hit":"boundary_stale_hit",reqId:t,cacheKey:c,dataset:"boundary",elements:l.cachedBoundaryElements.length}),typeof e=="function"&&e(l.cachedBoundaryElements),!_e){const b=new AbortController,k=++Xe,T=l.cachedBoundaryElements.length,w=nt(l.cachedBoundaryElements);_e={controller:b,cacheKey:c},Ve(s,{cacheKey:c,cacheTtlMs:i.ttlMs,cacheMeta:i,reqId:t+"_bg_boundary",skipCache:!0,signal:b.signal,minElementCount:rt(T,.5,1),silent:!0}).then(F=>{if(Xe!==k)return;_e=null;const O=F?.elements||[],$=rt(T,.5,1);if(T>0&&O.length<$){N({phase:"boundary_refresh_skip_degraded",reqId:t,dataset:"boundary",elements:O.length,minRequired:$});return}const I=nt(O)!==w;N({phase:"boundary_refresh_ok",reqId:t,dataset:"boundary",elements:O.length,changed:I}),I&&(l.cachedBoundaryElements=O,l.loadedBoundaryBounds=r,he(),typeof e=="function"&&e(O))}).catch(F=>{Xe===k&&(_e=null,N({phase:"boundary_refresh_err",reqId:t,dataset:"boundary",err:F?.name}))})}return l.cachedBoundaryElements}}catch(d){console.log("[API] Boundary cache miss or error:",d?.message||"no data")}try{const d=await Ve(s,{cacheKey:c,cacheTtlMs:i.ttlMs,cacheMeta:i,reqId:t,skipCache:!0,signal:f.signal,silent:!0});return u(),l.cachedBoundaryElements=d?.elements||[],l.loadedBoundaryBounds=r,he(),N({phase:"boundary_load_ok",reqId:t,zoom:n,dataset:"boundary",elements:l.cachedBoundaryElements.length}),l.cachedBoundaryElements}catch(d){if(d?.name==="AbortError")throw d;if(m)return N({phase:"boundary_stale_if_error",reqId:t,zoom:n,dataset:"boundary"}),l.cachedBoundaryElements;throw d}}async function Vo(e,t,n){const r=++no,o=e.getSouth(),a=e.getWest(),s=e.getNorth(),i=e.getEast(),c=`${o},${a},${s},${i}`,f=[];t>=12&&(f.push('nwr["amenity"="fire_station"];'),f.push('nwr["building"="fire_station"];')),f.push('nwr["emergency"~"fire_hydrant|water_tank|suction_point|fire_water_pond|cistern"];'),f.push('node["emergency"="defibrillator"];');const u=t>=14?'(way["boundary"="administrative"]["admin_level"="8"];)->.boundaries;
1 .boundaries out geom;':"",h=`[out:json][timeout:25][bbox:${c}];(${f.join("")})->.pois;.pois out center;${u}`,m=`export_v2:${t}:${c}`;return await Ve(h,{cacheKey:m,cacheTtlMs:1e3*60*60,reqId:r,skipCache:!1,signal:n})}function bt(e,t={}){return e.replace(/\{(\w+)\}/g,(n,r)=>t[r]??"")}function vo(e){const t=Number.isFinite(e.count)?e.count:0;switch(e.state){case"loading":return M("hydrant_load_started");case"refreshing":return bt(M("hydrant_load_more"),{count:t});case"slow":return bt(M("hydrant_load_slow"),{count:t});case"success":return bt(M("hydrant_load_success"),{count:t});case"error":return M("hydrant_load_error");default:return""}}function wo(e,{onRetry:t=null,showDelayMs:n=K.performance.hydrantStatusShowDelayMs,slowAfterMs:r=K.performance.hydrantStatusSlowAfterMs,successDurationMs:o=K.performance.hydrantStatusSuccessDurationMs}={}){if(!e)throw new Error("Hydranten-Status benötigt ein Container-Element.");const a=document.createElement("div");a.className="hydrant-download-status hidden",a.setAttribute("role","status"),a.setAttribute("aria-live","polite"),e.replaceChildren(a);let s=null,i=null,c=null,f=null,u=0;const h=()=>{for(const y of[s,i,c])y!==null&&clearTimeout(y);s=null,i=null,c=null},m=()=>{a.replaceChildren(),a.dataset.state="",a.classList.add("hidden")},d=(y,x=!1)=>{const b=vo(y);if(a.replaceChildren(),a.dataset.state=y.state||"",a.classList.toggle("hidden",!b),!b)return;const k=document.createElement("span");k.className="hydrant-download-status__indicator",k.setAttribute("aria-hidden","true");const T=document.createElement("span");if(T.textContent=b,a.append(k,T),x&&typeof t=="function"){const w=document.createElement("button");w.id="hydrant-data-retry",w.type="button",w.className="hydrant-download-status__retry",w.textContent="↻",w.setAttribute("aria-label",M("hydrant_load_error")),w.title=M("hydrant_load_error"),w.addEventListener("click",t),a.append(w)}},g=y=>{h(),f=y;const x=++u;m(),s=setTimeout(()=>{u===x&&d(f)},n),i=setTimeout(()=>{u===x&&d({state:"slow",count:f.count})},r)};return{update(y){if(y.state==="loading"||y.state==="refreshing"){g(y);return}const x=!a.classList.contains("hidden");if(h(),++u,f=y,y.state==="success"){if(!x)return m();d(y),c=setTimeout(m,o)}else y.state==="error"?d(y,!0):m()}
1,clear(){h(),++u,f=null,m()},destroy(){this.clear(),e.replaceChildren()},element:a}}function bo(){const e=window.location.hash.replace(/^#/,"");if(!e)return null;const t=e.split("/");if(t.length<3)return null;const n=Number(t[0]),r=Number(t[1]),o=Number(t[2]),a=t[3]||null;return!Number.isFinite(n)||!Number.isFinite(r)||!Number.isFinite(o)||n<1||n>22||r<-90||r>90||o<-180||o>180?null:{lat:r,lon:o,zoom:Math.round(n),layer:a}}let _t=null;function Nn(){_t&&clearTimeout(_t),_t=setTimeout(()=>{if(!l.map)return;const e=l.map.getCenter(),t=Math.round(l.map.getZoom()),n=l.activeLayerKey||"voyager",r=`#${t}/${e.lat.toFixed(5)}/${e.lng.toFixed(5)}/${n}`;window.location.hash!==r&&window.history.replaceState(null,"",r)},300)}async function _o(){if(!l.map)return;const e=l.map.getCenter(),t=Math.round(l.map.getZoom()),n=l.activeLayerKey||"voyager",r=`${window.location.origin}${window.location.pathname}#${t}/${e.lat.toFixed(5)}/${e.lng.toFixed(5)}/${n}`;if(navigator.share)try{await navigator.share({title:"OpenFireMap.org",text:M("share_map")||"Kartenansicht teilen",url:r});return}catch(o){if(o.name==="AbortError")return;console.warn("[Share] Web Share fehlgeschlagen, Fallback auf Clipboard",o)}try{await navigator.clipboard.writeText(r),H(M("link_copied")||"Link kopiert!",3e3)}catch{window.prompt(M("link_copied")||"Link kopiert!",r)}}function xo(){l.markerLayer=L.layerGroup(),l.boundaryLayer=L.layerGroup(),l.rangeLayerGroup=L.layerGroup(),l.distanceLayerGroup=L.layerGroup(),l.markerCache=new Map,l.openTooltipMarker=null;let e=K.defaultCenter,t=K.defaultZoom,n="voyager";const r=bo();if(r)e=[r.lat,r.lon],t=r.zoom,r.layer&&K.layers[r.layer]&&(n=r.layer),console.log("[Permalink] Starte mit Hash-Position:",r);else try{const v=localStorage.getItem("ofm_last_view");if(v){const S=JSON.parse(v);Array.isArray(S.center)&&S.center.length===2&&typeof S.center[0]=="number"&&typeof S.center[1]=="number"&&typeof S.zoom=="number"&&(e=S.center,t=S.zoom)}}catch(v){console.warn("Fehler beim Laden der letzten Position:",v)}l.map=L.map("map",{zoomControl:!1,preferCanvas:!0,center:e,zoom:t}),l.boundaryLayer.addTo(l.map),l.rangeLayerGroup.addTo(l.map),l.distanceLayerGroup.addTo(l.map),l.markerLayer.addTo(l.map),It(n);let o,a=!0,s=null,i=null,c=0,f=0,u=0,h=0,m=null,d=null;const g=1200,y=900,x=wo(document.getElementById("hydrant-download-status"),{onRetry:()=>{i=null,l.map.fire("moveend")}}),b=localStorage.getItem("OFM_DEBUG")==="1",k=(...v)=>{b&&console.debug("[OFM]",...v)};if(b){const v=document.createElement("div");v.id="ofm-debug",v.style.cssText="position:fixed;bottom:10px;left:10px;z-index:9999;background:rgba(0,0,0,0.7);color:#fff;padding:8px 10px;border-radius:8px;font:12px/1.3 monospace;max-width:40vw;pointer-events:none;",v.textContent="OFM_DEBUG=1",document.body.appendChild(v);const S=C=>{const E=document.getElementById("ofm-debug");E&&(E.textContent=C)};window.addEventListener("ofm:overpass",C=>{const E=C.detail||{},B=l.map?.getZoom?.()??"?",p=l.queryMeta?` pad=${l.queryMeta.padMeters}m snap=${l.queryMeta.snapMeters}m`:"",A=[`${E.phase||"evt"} z=${B}${p}`,E.dataset?`ds=${E.dataset}`:"",E.endpoint?`ep=${E.endpoint.replace("https://","")}`:"",Number.isFinite(E.elements)?`el=${E.elements}`:"",E.ms?`${E.ms}ms`:"",E.status?`HTTP ${E.status}`:""].filter(Boolean).join(" ");S(A)}),l.map?.on?.("zoomstart movestart",()=>{c=Date.now(),f+=1,m&&(clearTimeout(m),m=null),d&&(clearTimeout(d),d=null);const C=l.map.getZoom();S(`move/zoom… z=${C}`)})}b||l.map.on("zoomstart movestart",()=>{c=Date.now(),f+=1,m&&(clearTimeout(m),m=null),d&&(clearTimeout(d),d=null)});const T=v=>v<12?"none":v<15?"stations":"all",w=v=>v<12?"z<12":v<15?"z12-14":v<17?"z15-16":v<18?"z17":"z18+",F=v=>!v||typeof v!="object"?[]:Object.entries(v).sort(([S],[C])=>S.localeCompare(C)),O=v=>{if(!v||typeof v!="object")return"";const S=F(v.tags).map(([p,_])=>`${p}:${String(_)}`).join("|"),C=Number(v.center?.lat??v.lat??0).toFixed(5),E=Number(v.center?.lon??v.lon??0).toFixed(5),B=Array.isArray(v.geometry)?v.geometry.map(p=>`${Number(p.lat).toFixed(5)},${Number(p.lon).toFixed(5)}`).join(";"):"";return[v.type||"node",v.id??"",C,E,S,B].join("#")},$=v=>!Array.isArray(v)||v.length===0?"empty":v.map(O).sort().join("||"),I=v=>{if(!l.loadedPoiBounds||!l.map)return!1;const S=l.map.getBounds();return l.loadedPoiBounds.contains(S)?v==="all"?l.loadedPoiMode==="all":v==="stations"?l.loadedPoiMode==="stations"||l.loadedPoiMode==="all":!1:!1},P=v=>v<14?!0:!l.loadedBoundaryBounds||!l.map?!1:l.loadedBoundaryBounds.contains(l.map.getBounds()),U=()=>{const v=l.map.getZoom(),S=l.map.getCenter();let C,E;v>=15?(C=2500,E=1e3):v>=12?(C=15e3,E=1e3):(C=5e4,E=5e3);const B=111320,p=E/B,_=(le,de)=>Math.round(le/de)*de,A=_(S.lat,p),Z=111320*Math.cos(A*Math.PI/180),J=C/B,W=C/Z,G=E/Z,Y=_(S.lng,G),j=A-J,D=A+J,se=Y-W,ie=Y+W;l.queryBounds=L.latLngBounds([[j,se],[D,ie]]);const ee=`${j.toFixed(5)},${se.toFixed(5)},${D.toFixed(5)},${ie.toFixed(5)}`;return l.queryMeta={zoom:v,bbox:ee,snapMeters:E},ee},R=v=>{if(!l.map)return"";const S=l.map.getBounds(),C=Math.min(Math.max(v,12),14),E=Oe(S.getWest(),C),B=Oe(S.getEast(),C),p=Re(S.getNorth(),C),_=Re(S.getSouth(),C);return`pl:${C}:${E}_${B}_${p}_${_}`};l.map.on("moveend zoomend",()=>{Nn();const v=l.map.getCenter(),S=L.latLngBounds([47.27,8.97],[50.56,13.84]),C=document.getElementById("btn-bayern"),E=document.getElementById("btn-bayern_dop");S.contains(v)?(C&&(C.style.display=""),E&&(E.style.display="")):(C&&(C.style.display="none"),E&&(E.style.display="none"),(l.activeLayerKey==="bayern"||l.activeLayerKey==="bayern_dop")&&It("voyager"));const B=l.map.getZoom();B<17?l.distanceLayerGroup&&l.distanceLayerGroup.clearLayers():l.distanceTarget&&l.userMarker&&zt(l.distanceTarget.lat,l.distanceTarget.lon,!0);const p=w(B);
1if(l.cachedPoiElements&&p!==s&&(s=p,xt(l.cachedPoiElements,B),Et(l.cachedBoundaryElements,B)),B<18&&l.openTooltipMarker){try{l.openTooltipMarker.closeTooltip()}catch{}l.openTooltipMarker=null}const _=T(B);if(_==="none"){const D=document.getElementById("data-status");D&&(D.innerText=M("status_standby"),D.className="text-green-400"),l.markerLayer.clearLayers(),l.boundaryLayer.clearLayers(),l.cachedPoiElements=[],l.cachedBoundaryElements=[],l.cachedElements=[],l.loadedPoiBounds=null,l.loadedBoundaryBounds=null,l.loadedPoiMode=null;return}if(I(_)&&P(B)){const D=document.getElementById("data-status");D&&(D.innerText=M("status_current"),D.className="text-green-400"),window.dispatchEvent(new CustomEvent("ofm:overpass",{detail:{phase:"covered_by_loaded_bounds",dataset:"view",mode:_,zoom:B}}));return}const A=Qe(l.map.getBounds(),B),Z=A?R(B):U();k("gate",{zoom:B,mode:_,bboxKey:Z,queryMeta:l.queryMeta});const J=B>=14?"b1":"b0",W=`${_}|${J}|${Z}`,G=++f;o&&clearTimeout(o);const Y=A?100:B<=15?200:B===16?300:B===17?250:200;if(a){a=!1,o&&clearTimeout(o),j();return}o=setTimeout(j,Y);async function j(){const D=document.getElementById("data-status"),se=!A&&Date.now()-c<g,ie=l.cachedPoiElements?.length||l.cachedBoundaryElements?.length;if(W===i&&I(_)){D&&(D.innerText=A?`${M("status_current")} (Lokal)`:M("status_current"),D.className="text-green-400 font-bold");return}if(se&&ie){D&&(D.innerText=M("status_current"),D.className="text-green-400"),window.dispatchEvent(new CustomEvent("ofm:overpass",{detail:{phase:"hold_stale_while_moving",dataset:"view",fetchKey:W}})),m&&clearTimeout(m),m=setTimeout(()=>{G===f&&j()},y);return}D&&(D.innerText=M("status_waiting"),D.className="text-amber-400 font-bold"),i=W,k("fetchOSMData()",{fetchKey:W}),window.dispatchEvent(new CustomEvent("ofm:overpass",{detail:{phase:"trigger",dataset:"view",fetchKey:W}}));try{D&&(D.innerText=M("status_loading"),D.className="text-blue-400"),H(M("loading_data"),3e4);let ee=0,le="empty";const de=go(X=>{ee=X?.length||0,le=$(X),ee>0&&H(`${ee} ${M("cached_objects")} – ${M("refreshing")}`,3e4),xt(X,B)},X=>x.update(X));yo(X=>{G>=h&&Et(X,B)}).then(X=>{G>=h&&X&&(h=G,Et(X,B))}).catch(X=>{X?.name!=="AbortError"&&console.warn("[Map] Gemeindegrenzen konnten nicht geladen werden (nicht kritisch):",X?.message)});const ce=await de;if(G<u)return;if(u=G,ce){const X=ce.length||0,Se=$(ce)!==le;Se&&xt(ce,B);const Ht=Qe(l.map?.getBounds?.(),B);if(D&&(D.innerText=Ht?`${M("status_current")} (Lokal)`:M("status_current"),D.className="text-green-400 font-bold"),ee>0&&!Se)H(`${M("from_cache")} (${ee} ${M("objects")})`,3e3);else if(ee>0)H(`${M("data_updated")} (${ee} → ${X})`,2500);else{const Un=Ht?" – Lokal":"";H(`${M("data_complete")} (${X} ${M("objects")}${Un})`,2e3)}}else ce===null&&D&&(D.innerText=M("status_waiting"),D.className="text-amber-400 font-bold")}catch(ee){if(ee?.name==="AbortError"||G<u)return;if(D){const le=ee?.status===429?"err_ratelimit":ee?.status>=500?"err_server":"status_error";D.innerText=M(le),D.className="text-red-500 font-bold"}i=null,d&&clearTimeout(d),d=setTimeout(()=>{d=null,G===f&&j()},8e3)}}}),l.map.on("click",()=>{l.selection.active||(l.rangeLayerGroup.clearLayers(),ot())}),l.map.on("zoom",()=>{const v=document.getElementById("zoom-val");v&&(v.innerText=l.map.getZoom().toFixed(1))}),l.map.fire("moveend")}function It(e){l.activeLayerKey=e,l.map.eachLayer(i=>{i instanceof L.TileLayer&&l.map.removeLayer(i)});const t=K.layers[e],n={attribution:t.attr,maxZoom:t.maxZoom};t.subdomains&&(n.subdomains=t.subdomains),t.maxNativeZoom&&(n.maxNativeZoom=t.maxNativeZoom),L.tileLayer(t.url,n).addTo(l.map),document.querySelectorAll(".layer-btn").forEach(i=>i.classList.remove("active"));const r=document.getElementById(`btn-${e}`);r&&r.classList.add("active");const o=e==="satellite",a=o?K.colors.boundsSatellite:K.colors.bounds,s=o?3:1;l.boundaryLayer.eachLayer(i=>{i instanceof L.Polyline&&i.setStyle({color:a,weight:s})}),Nn()}function Eo(e,t=28,n=2){const r=K.colors;if(e==="defibrillator")return`<svg width="${t}px" height="${t}px" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
2            <circle cx="50" cy="50" r="45" fill="${r.defib}" stroke="white" stroke-width="5"/>
3            <path d="M50 80 C10 40 10 10 50 35 C90 10 90 40 50 80 Z" fill="white"/>
4            <path d="M55 45 L45 55 L55 55 L45 65" stroke="${r.defib}" stroke-width="3" fill="none"/>
5        </svg>`;const a=["water_tank","cistern","fire_water_pond","suction_point"].includes(e)?r.water:r.hydrant;if(e==="wall")return`<svg width="${t}px" height="${t}px" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
6            <circle cx="50" cy="50" r="45" fill="${a}" stroke="white" stroke-width="5"/>
7            <circle cx="42" cy="52" r="18" fill="none" stroke="white" stroke-width="6" />
8            <line x1="64" y1="34" x2="64" y2="70" stroke="white" stroke-width="6" stroke-linecap="round" />
9        </svg>`;let s;switch(e){case"underground":s="U";break;case"wsh":s="W";break;case"pillar":s="O";break;case"pipe":s="I";break;case"dry_barrel":s="Ø";break;default:s=""}return e==="station"?`<svg width="${t}px" height="${t}px" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path d="M10 40 L50 5 L90 40 L90 90 L10 90 Z" fill="${r.station}" stroke="white" stroke-width="4"/><rect x="30" y="55" width="40" height="35" rx="2" fill="white" opacity="0.9"/></svg>`:e==="cluster_badge"?`<svg width="${t}px" height="${t}px" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
10            <circle cx="50" cy="50" r="45" fill="${a}" stroke="white" stroke-width="5"/>
11            <text x="50" y="70" font-family="Arial" font-weight="bold" font-size="52" text-anchor="middle" fill="white">${n}</text>
12        </svg>`:`<svg width="${t}px" height="${t}px" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><circle cx="50" cy="50" r="45" fill="${a}" stroke="white" stroke-width="5"/>${e==="wsh"?'<circle cx="50" cy="50" r="36" fill="none" stroke="white" stroke-dasharray="6 4" stroke-width="4"/>':""}${s?`<text x="50" y="72" font-family="Arial" font-weight="bold" font-size="50" text-anchor="middle" fill="white">${s}</text>`:""}</svg>`}function jn(e){if(!e||!e.tags)return!1;const t=e.tags;return t.amenity==="fire_station"||t.building==="fire_station"}function He(e){const t=e.lat??e.center?.lat,n=e.lon??e.center?.lon;return typeof t!="number"||typeof n!="number"?null:{lat:t,lon:n}}function ct(e,t){const r=h=>
12h*Math.PI/180,o=r(t.lat-e.lat),a=r(t.lon-e.lon),s=r(e.lat),i=r(t.lat),c=Math.sin(o/2),f=Math.sin(a/2),u=c*c+Math.cos(s)*Math.cos(i)*f*f;return 2*6371e3*Math.asin(Math.min(1,Math.sqrt(u)))}function sn(e){return e?Object.keys(e).length:0}function Lo(e,t=150){if(!Array.isArray(e)||e.length===0)return e;const n=[],r=[];for(const s of e)jn(s)?n.push(s):r.push(s);if(n.length<2)return e;n.sort((s,i)=>sn(i.tags)-sn(s.tags));const o=new Set,a=[];for(const s of n){if(!s||o.has(s.id))continue;const i=He(s);if(!i){a.push(s),o.add(s.id);continue}let c=i.lat,f=i.lon,u=1;s.tags=s.tags||{};for(const d of n){if(!d||d.id===s.id||o.has(d.id))continue;const g=He(d);if(g&&ct(i,g)<t){if(o.add(d.id),d.tags)for(const[y,x]of Object.entries(d.tags))(s.tags[y]===void 0||s.tags[y]==="")&&(s.tags[y]=x);c+=g.lat,f+=g.lon,u+=1}}const h=c/u,m=f/u;s.lat=h,s.lon=m,s.center&&typeof s.center=="object"&&(s.center.lat=h,s.center.lon=m),o.add(s.id),a.push(s)}return a.concat(r)}function Mo(e,t,n=5){if(t<17||t>=19||!Array.isArray(e)||e.length===0)return e;const r=[],o=[];for(const i of e)jn(i)||i.tags&&i.tags.emergency==="defibrillator"?o.push(i):He(i)?r.push(i):o.push(i);if(r.length<2)return e;const a=new Set,s=[];r.sort((i,c)=>typeof i.id=="number"&&typeof c.id=="number"?i.id-c.id:String(i.id||"").localeCompare(String(c.id||"")));for(const i of r){if(a.has(i.id))continue;const c=He(i);let f=c.lat,u=c.lon,h=1;const m=[i];for(const d of r){if(d.id===i.id||a.has(d.id))continue;const g=He(d);ct(c,g)<n&&(a.add(d.id),m.push(d),f+=g.lat,u+=g.lon,h++)}if(h>1){const d={...i,isHydrantCluster:!0,clusterCount:h,clusterMembers:m,lat:f/h,lon:u/h};d.center&&(d.center={...d.center,lat:d.lat,lon:d.lon}),s.push(d)}else s.push({...i,isHydrantCluster:!1,clusterCount:1,clusterMembers:[]});a.add(i.id)}return s.concat(o)}function To(e,t){if(!t||t.length===0){const r=e||{};let a=`<div class="p-2 min-w-[180px]"><div class="font-bold text-sm border-b border-white/20 pb-1 mb-1 text-blue-400">${Ee(r.name||M("details_hydrant"))}</div>`;r["fire_hydrant:style"]?.toLowerCase()==="wsh"&&(a+=`<div class="text-[11px] text-orange-400 font-bold mb-2 pb-1 border-b border-white/10 italic">${Ee(M("wsh_hint")||"Württembergischer Schachthydrant")}</div>`),a+='<div class="text-[10px] font-mono grid grid-cols-[auto_1fr] gap-x-2 gap-y-1">';for(const[s,i]of Object.entries(r))a+=`<div class="text-slate-400 text-right">${Ee(s)}:</div><div class="text-slate-200 break-words">${Ee(i)}</div>`;return a+"</div></div>"}let n=`<div class="p-2 min-w-[200px]"><div class="font-bold text-sm border-b border-white/20 pb-1 mb-2 text-blue-400">${t.length} ${M("cluster_info")}</div><div class="flex flex-col gap-3">`;return t.forEach((r,o)=>{const a=r.tags||{},s=Ee(a.name||M("details_hydrant"));n+=`<div class="text-[10px] bg-white/5 rounded p-1"><div class="font-bold text-slate-300 mb-1 border-b border-white/10 pb-0.5">${o+1}. ${s}</div>`,a["fire_hydrant:style"]?.toLowerCase()==="wsh"&&(n+=`<div class="text-[11px] text-orange-400 font-bold mb-1 pb-1 border-b border-white/10 italic">${Ee(M("wsh_hint")||"Württembergischer Schachthydrant")}</div>`),n+='<div class="font-mono grid grid-cols-[auto_1fr] gap-x-2 gap-y-1">';for(const[i,c]of Object.entries(a))n+=`<div class="text-slate-400 text-right">${Ee(i)}:</div><div class="text-slate-200 break-words">${Ee(c)}</div>`;n+="</div></div>"}),n+="</div></div>",n}function ln(e,t){l.rangeLayerGroup.clearLayers();const n=l.map.getZoom();if(!(n<16)&&(L.circle([e,t],{color:K.colors.rangeCircle,fillColor:K.colors.rangeCircle,fillOpacity:.15,radius:100,weight:2,dashArray:"5, 8",interactive:!1}).addTo(l.rangeLayerGroup),n>=17)){const r=e*(Math.PI/180),o=111320,a=111320*Math.cos(r),s=86.6/o,i=-50/a;L.marker([e+s,t+i],{opacity:0,interactive:!1}).addTo(l.rangeLayerGroup).bindTooltip("100 m",{permanent:!0,direction:"center",className:"range-label",offset:[0,0]}).openTooltip()}}function ot(){l.distanceLayerGroup&&l.distanceLayerGroup.clearLayers(),l.distanceTarget=null}function zt(e,t,n=!1){if(!l.userMarker){ot();return}const r=l.map.getZoom();if(n||(l.distanceTarget={lat:e,lon:t}),r<17){l.distanceLayerGroup&&l.distanceLayerGroup.clearLayers();return}const{lat:o,lng:a}=l.userMarker.getLatLng();if(!l.map.getBounds().contains([o,a])){l.distanceLayerGroup&&l.distanceLayerGroup.clearLayers();return}l.distanceLayerGroup&&l.distanceLayerGroup.clearLayers();const s=Math.round(ct({lat:o,lon:a},{lat:e,lon:t}));
12L.polyline([[o,a],[e,t]],{color:"#3b82f6",weight:3,dashArray:"5, 8",interactive:!1}).addTo(l.distanceLayerGroup);const i=(o+e)/2,c=(a+t)/2,f=L.divIcon({className:"distance-label-icon",html:`<div style="padding: 2px 6px; font-size: 13px; font-weight: 800; color: #3b82f6; white-space: nowrap; transform: translate(-50%, -120%); text-shadow: -1px -1px 0 #fff, 1px -1px 0 #fff, -1px 1px 0 #fff, 1px 1px 0 #fff; pointer-events: none;">${s} m</div>`,iconSize:[0,0]});L.marker([i,c],{icon:f,interactive:!1}).addTo(l.distanceLayerGroup)}function ko(){if(!l.userMarker)return;let e=null,t=1/0;const{lat:n,lng:r}=l.userMarker.getLatLng();for(const o of l.markerCache.values())if(o.marker&&!o.isStation&&!o.isDefib){const a=o.marker.getLatLng(),s=ct({lat:n,lon:r},{lat:a.lat,lon:a.lng});s<t&&(t=s,e={lat:a.lat,lon:a.lng})}e&&zt(e.lat,e.lon)}function xt(e,t){const n=Lo(e,150),r=Mo(n,t,5),o=new Set,a=[];r.forEach(s=>{const i=s.tags||{},c=`${s.type||"node"}:${s.id}`,f=s.lat||s.center?.lat,u=s.lon||s.center?.lon;if(!f||!u)return;const h=i.amenity==="fire_station"||i.building==="fire_station",m=i.emergency==="defibrillator";let d=h?"station":m?"defibrillator":i["fire_hydrant:type"]||i.emergency;if(d==="underground"&&i["fire_hydrant:style"]?.toLowerCase()==="wsh"&&(d="wsh"),h&&t<12||!h&&!m&&t<15||m&&t<15)return;const g=a.some(b=>Math.abs(b.lat-f)<1e-4&&Math.abs(b.lon-u)<1e-4);if(h&&g)return;h&&a.push({lat:f,lon:u});let y;h?y=t<14?"dot":"svg":y=t<17?"dot":"svg",o.add(c),s.isHydrantCluster&&s.clusterMembers&&s.clusterMembers.forEach(b=>{const k=`${b.type||"node"}:${b.id}`;if(o.add(k),k!==c&&l.markerCache.has(k)){const T=l.markerCache.get(k);l.markerLayer.removeLayer(T.marker),l.markerCache.delete(k)}});const x=l.markerCache.get(c);x&&x.mode===y&&x.isHydrantCluster===s.isHydrantCluster&&x.clusterCount===s.clusterCount||(x&&(x.mode!==y||x.isHydrantCluster!==s.isHydrantCluster||x.clusterCount!==s.clusterCount)&&(l.markerLayer.removeLayer(x.marker),l.markerCache.delete(c)),Ao(c,f,u,d,i,y,t,h,m,s.isHydrantCluster,s.clusterCount,s.clusterMembers))});for(const[s,i]of l.markerCache)o.has(s)||(l.markerLayer.removeLayer(i.marker),l.markerCache.delete(s))}function Et(e,t){if(l.boundaryLayer.clearLayers(),!Array.isArray(e)||e.length===0||t<14)return;const n=l.activeLayerKey==="satellite",r=n?K.colors.boundsSatellite:K.colors.bounds,o=n?3:1;for(const a of e){if(a?.tags?.boundary!=="administrative"||!Array.isArray(a.geometry))continue;const s=a.geometry.map(i=>[i.lat,i.lon]);L.polyline(s,{color:r,weight:o,dashArray:"10, 10",opacity:.7}).addTo(l.boundaryLayer)}}function Ao(e,t,n,r,o,a,s,i,c,f,u,h){let m,d,g="",y=[28,28],x;if(a==="dot"?i?m=L.marker([t,n],{icon:L.divIcon({html:'<div class="station-square"></div>',iconSize:[10,10]})}):c?m=L.marker([t,n],{icon:L.divIcon({className:"defib-dot",iconSize:[10,10]})}):(g=["water_tank","cistern","fire_water_pond","suction_point"].includes(r)?"tank-dot":"hydrant-dot",m=L.marker([t,n],{icon:L.divIcon({className:g,iconSize:[10,10]})})):(i?(y=[32,32],x=1e3):c?(y=[28,28],x=2e3):x=0,d=Eo(f?"cluster_badge":r,y[0],u),g="icon-container",m=L.marker([t,n],{icon:L.divIcon({className:g,html:d,iconSize:y}),zIndexOffset:x}),!i&&!c&&m.on("click",k=>{L.DomEvent.stopPropagation(k),ln(t,n)})),m&&g==="icon-container"){m.unbindTooltip(),m.bindTooltip(To(o,h),{interactive:!0,permanent:!1,direction:"top",opacity:.95});let b=null;const k=T=>{const w=l.openTooltipMarker;if(w&&w!==T){try{w.closeTooltip()}catch{}l.openTooltipMarker=null}};m.off("mouseover"),m.off("mouseout"),m.off("tooltipopen"),m.off("tooltipclose"),m.off("click"),!i&&!c&&m.on("click",T=>{L.DomEvent.stopPropagation(T),zt(t,n),ln(t,n)}),m.on("mouseover",function(){l.map.getZoom()<18||(b&&(clearTimeout(b),b=null),k(this),this.openTooltip(),l.openTooltipMarker=this)}),m.on("mouseout",function(){l.map.getZoom()<18||(b=setTimeout(()=>{this.closeTooltip()},3e3))}),m.on("tooltipopen",function(T){if(l.map.getZoom()<18){try{m.closeTooltip()}catch{}return}k(m),l.openTooltipMarker=m;const w=T?.tooltip?._container;w&&(w.__ofmBound||(w.__ofmBound=!0,L.DomEvent.on(w,"mouseenter",()=>{b&&(clearTimeout(b),b=null)}),L.DomEvent.on(w,"mouseleave",()=>{b=setTimeout(()=>{m.closeTooltip()},3e3)})))}),m.on("tooltipclose",function(){l.openTooltipMarker===m&&(l.openTooltipMarker=null),b&&(clearTimeout(b),b=null)})}m&&(m.addTo(l.markerLayer),l.markerCache.set(e,{marker:m,mode:a,type:r,tags:o,lat:t,lon:n,isStation:i,isDefib:c,isHydrantCluster:f,clusterCount:u}))}function Ee(e){return e==null?"":String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}typeof window<"u"&&(window.State=l);async function Po({timeoutMs:e=8e3,intervalMs:t=50}={}){const n=Date.now();for(;Date.now()-n<e;){if(window.L&&typeof window.L.map=="function")return!0;await new Promise(r=>setTimeout(r,t))}return!1}document.addEventListener("DOMContentLoaded",async()=>{try{if(console.log("[OpenFireMapV2] App startet..."),await qn(),Kn(),Qn(),!await Po()){const t="Leaflet wurde nicht geladen. Prüfe index.html (leaflet.js) und den Pfad unter assets/vendor/leaflet/.";console.error("[OpenFireMapV2]",t),H(t,8e3);return}if(xo(),l.map)(await V(()=>import("./export-BmRm4Lb9.js").then(n=>n.a),[],import.meta.url)).initSelectionLogic();else{const t="Karte wurde nicht initialisiert (State.map ist leer).";console.error("[OpenFireMapV2]",t),H(t,8e3)}}catch(e){console.error("[OpenFireMapV2] Fataler Fehler beim Start:",e),H(`Startfehler: ${e?.message??String(e)}`,8e3)}
12if("serviceWorker"in navigator)try{await navigator.serviceWorker.register("/sw.js"),console.log("[SW] Service Worker registriert")}catch(e){console.warn("[SW] Fehler bei Registrierung:",e)}navigator.storage&&typeof navigator.storage.persist=="function"&&navigator.storage.persist().then(e=>{console.log("[Storage] Persistent storage granted:",e)}).catch(e=>{console.warn("[Storage] persist() nicht verfügbar:",e)})});(function(){if(!(window.matchMedia?.("(pointer: coarse)").matches||navigator.maxTouchPoints>0||window.innerWidth<1370))return;const n=p=>document.getElementById(p),r=p=>p&&p.classList.remove("hidden"),o=p=>p&&p.classList.add("hidden"),a=p=>!p||p.classList.contains("hidden");function s(p){const _=n(p);return _?(_.click(),!0):!1}function i(){const p=n("layer-menu"),_=n("export-menu"),A=n("legal-modal");p&&!a(p)&&o(p),_&&!a(_)&&o(_),A&&!a(A)&&o(A),n("layer-btn-trigger")?.setAttribute("aria-expanded","false"),n("export-btn-trigger")?.setAttribute("aria-expanded","false"),n("btn-legal-trigger")?.setAttribute("aria-expanded","false")}function c(){const p=n("mobile-controls");p&&(p.classList.remove("md:hidden"),p.classList.remove("hidden")),["mobile-menu","mobile-search-modal"].forEach(A=>{const Z=n(A);Z&&Z.classList.remove("md:hidden")})}function f(){const p=n("layer-menu");if(!p)return;p.querySelectorAll("button").forEach(Z=>{Z.__ofmMobileCloseBound||(Z.__ofmMobileCloseBound=!0,Z.addEventListener("click",()=>{setTimeout(()=>{i()},0)},{passive:!0}))});const A=Z=>{if(a(p))return;const J=Z.target,W=n("layer-btn-trigger");p.contains(J)||W&&W.contains(J)||i()};document.__ofmMobileLayerOutsideBound||(document.__ofmMobileLayerOutsideBound=!0,document.addEventListener("pointerdown",A,!0))}const u=n("desktop-controls"),h=n("btn-legal-trigger"),m=n("mobile-controls"),d=n("mobile-menu"),g=n("mobile-burger-btn"),y=n("mobile-locate-btn"),x=n("mobile-open-layers"),b=n("mobile-open-share"),k=n("mobile-open-search"),T=n("mobile-open-legal"),w=n("mobile-close-menu");if(!m||!g||!y||!d)return;function F(){const p=y;if(!p)return;let _=document.getElementById("mobile-locate-dock");_||(_=document.createElement("div"),_.id="mobile-locate-dock",_.style.position="fixed",_.style.left="50%",_.style.bottom="32px",_.style.transform="translateX(-50%)",_.style.zIndex="2500",_.style.pointerEvents="auto",document.body.appendChild(_)),_.appendChild(p)}function O(){const p=document.getElementById("mobile-burger-btn"),_=document.getElementById("status-box")||document.getElementById("status-panel")||document.getElementById("status")||document.querySelector("[data-ofm-status]");if(!p||!_)return;const A="18px",Z="18px";p.style.position="fixed",p.style.top=A,p.style.left=Z,p.style.marginTop="0",p.style.zIndex="3500",_.style.position="fixed",_.style.top=A,_.style.bottom="auto",_.style.right=Z,_.style.marginTop="0",_.style.zIndex="3500"}o(u),h&&o(h.parentElement||h),c(),r(m),F(),O(),w&&o(w);function $(){o(d),g.setAttribute("aria-expanded","false")}function I(){const p=a(d);p?r(d):o(d),g.setAttribute("aria-expanded",String(p))}g.addEventListener("click",p=>{p.preventDefault(),p.stopPropagation(),I()}),w&&w.addEventListener("click",p=>{p.preventDefault(),$()}),document.addEventListener("click",p=>{if(a(d))return;const _=p.target;d.contains(_)||g.contains(_)||$()}),document.addEventListener("keydown",p=>{p.key==="Escape"&&$()}),y.addEventListener("click",p=>{p.preventDefault(),$(),i(),s("locate-btn")}),x&&x.addEventListener("click",p=>{p.preventDefault(),$(),i(),s("layer-btn-trigger"),setTimeout(()=>{f()},0)}),b&&b.addEventListener("click",p=>{p.preventDefault(),$(),i(),s("share-btn-trigger")});const P=document.getElementById("mobile-search-modal"),U=document.getElementById("mobile-search-backdrop"),R=document.getElementById("mobile-search-close"),v=document.getElementById("mobile-search-input"),S=document.getElementById("mobile-search-go");function C(){P&&(P.classList.remove("hidden"),setTimeout(()=>v?.focus(),0))}function E(){P&&P.classList.add("hidden")}k&&!k.__bound&&(k.__bound=!0,k.addEventListener("click",p=>{p.preventDefault(),typeof $=="function"&&$(),typeof $=="function"&&$(),C()})),R?.addEventListener("click",E),U?.addEventListener("click",E);function B(){const p=(v?.value||"").trim();if(!p)return;const _=document.getElementById("search-input"),A=document.getElementById("search-btn");_&&(_.value=p,A?A.click():(_.dispatchEvent(new KeyboardEvent("keydown",{key:"Enter",bubbles:!0})),_.dispatchEvent(new KeyboardEvent("keyup",{key:"Enter",bubbles:!0})))),E()}S?.addEventListener("click",B),v?.addEventListener("keydown",p=>{p.key==="Enter"&&B()}),T&&T.addEventListener("click",p=>{p.preventDefault(),$(),i(),s("btn-legal-trigger")}),window.addEventListener("resize",()=>{if(!(window.matchMedia?.("(pointer: coarse)").matches||navigator.maxTouchPoints>0||window.innerWidth<1370)){r(u),h&&r(h.parentElement||h),o(m),["mobile-control
12s","mobile-menu","mobile-search-modal"].forEach(Z=>n(Z)?.classList.add("md:hidden")),$(),i();const A=document.getElementById("status-box");A&&(A.style.top="",A.style.bottom="",A.style.right="",A.style.position="",A.style.marginTop="")}})})();export{K as C,l as S,V as _,Kt as a,Vo as f,Bo as g,H as s,M as t,So as z};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.