// ==UserScript== // @name BRUHN MEDIA | LSS – Tools Manager // @namespace https://github.com/bruhnmedia/lss-tools-releases // @version 1.4.0 // @description BRUHN MEDIA | Acht modulare Tools für Leitstellenspiel – jetzt mit Leitstellenstatus. // @author BRUHN MEDIA // @match https://www.leitstellenspiel.de/* // @match https://leitstellenspiel.de/* // @run-at document-idle // @grant unsafeWindow // @grant GM_xmlhttpRequest // @grant GM_getValue // @grant GM_setValue // @connect * // @updateURL https://raw.githubusercontent.com/bruhnmedia/lss-tools-releases/main/BRUHN_MEDIA_LSS_Tools_Manager.meta.js // @downloadURL https://raw.githubusercontent.com/bruhnmedia/lss-tools-releases/main/BRUHN_MEDIA_LSS_Tools_Manager.user.js // @noframes // @license BRUHN MEDIA Personal Use – siehe LIZENZ.md // ==/UserScript== /*! * © 2026 BRUHN MEDIA | Alle Rechte vorbehalten. * Nutzung nach LIZENZ.md: https://github.com/bruhnmedia/lss-tools-releases * OSM-Daten: (c) OpenStreetMap-Mitwirkende, ODbL 1.0. */ const e=new Map;async function t(t,n){const o=()=>Object.assign(new Error("Abfrage abgebrochen."),{name:"AbortError"});if(n?.aborted)throw o();const a=new URL(t,location.origin);if(a.origin!==location.origin||!/^\/api\//.test(a.pathname))throw new Error("Ung\xfcltige Spiel-API-Adresse.");const r=a.pathname+a.search;let i=e.get(r);if(!i){const t=new AbortController;i={controller:t,users:new Set,done:false,timer:null};e.set(r,i);i.timer=setTimeout(()=>t.abort(),2e4);i.promise=Promise.resolve().then(async()=>{const e=await fetch(r,{credentials:"same-origin",cache:"no-store",headers:{Accept:"application/json"},signal:t.signal});if(!e.ok)throw new Error("Spiel-API: HTTP "+e.status);if(!String(e.headers.get("content-type")||"").includes("json"))throw new Error("Spiel-API hat keine JSON-Daten geliefert.");return await e.json()}).finally(()=>{i.done=true;clearTimeout(i.timer);if(e.get(r)===i)e.delete(r)})}return new Promise((t,a)=>{const s={};i.users.add(s);let l=false;function d(e,o){if(l)return;l=true;n?.removeEventListener("abort",c);i.users.delete(s);if(e)a(e);else t(o)}function c(){d(o());if(!i.done&&!i.users.size){if(e.get(r)===i)e.delete(r);clearTimeout(i.timer);i.controller.abort()}}n?.addEventListener("abort",c,{once:true});i.promise.then(e=>{if(l)return;try{d(null,JSON.parse(JSON.stringify(e)))}catch(e){d(e)}},e=>d(e))})}const n="bruhnmedia_suite_modules_v1";const o={planner:true,share:true,fleet:true,dashboard:false,alliance:false,centermap:false,layouts:false,leitstellen:false};function a(){let e;try{e=JSON.parse(String(GM_getValue(n,"{}")))}catch{e={}}if(!e||typeof e!=="object"||Array.isArray(e))e={};return Object.fromEntries(Object.entries(o).map(([t,n])=>[t,typeof e[t]==="boolean"?e[t]:t==="planner"&&typeof e.bos==="boolean"?e.bos:n]))}const r=a();const i=Object.freeze({planner:"M3 6v15l6-3 6 3 6-3V3l-6 3-6-3-6 3Z M9 3v15 M15 6v15 M12 10a2 2 0 1 0 0 4a2 2 0 0 0 0-4Z",share:"M18 8a3 3 0 1 0 0-6a3 3 0 0 0 0 6Z M6 15a3 3 0 1 0 0-6a3 3 0 0 0 0 6Z M18 22a3 3 0 1 0 0-6a3 3 0 0 0 0 6Z M8.7 13.5l6.6 4 M15.3 6.5l-6.6 4",fleet:"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10Z M8.5 12l2.5 2.5 5-5",dashboard:"M3 3h8v8H3z M15 3h6v5h-6z M15 12h6v9h-6z M3 15h8v6H3z",alliance:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2 M9 11a4 4 0 1 0 0-8a4 4 0 0 0 0 8Z M22 21v-2a4 4 0 0 0-3-3.87 M16 3.13a4 4 0 0 1 0 7.75",centermap:"M12 2v4 M12 18v4 M2 12h4 M18 12h4 M12 16a4 4 0 1 0 0-8a4 4 0 0 0 0 8Z",layouts:"M3 3h18v18H3z M7.5 3v18 M12 3v18 M16.5 3v18",leitstellen:"M4 4h16v16H4z M8 12l2.5 2.5L16 9 M8 7h8 M8 17h8",appstore:"M3 3h7v7H3z M14 3h7v7h-7z M3 14h7v7H3z M14 14h7v7h-7z",open:"M7 17L17 7 M8 7h9v9"});function s(e){const t="http://www.w3.org/2000/svg";const n=document.createElementNS(t,"svg");for(const[e,t]of Object.entries({viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.9","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true",focusable:"false"}))n.setAttribute(e,t);const o=document.createElementNS(t,"path");o.setAttribute("d",i[e]||i.appstore);n.appendChild(o);return n}(()=>{"use strict";const e="bm-suite-appstore",t="bm-lss-navbar-tools";const o=[{id:"planner",icon:"\u25a3",svg:"planner",name:"BOS Ausbauplaner",version:"1.2.4-beta.1",desc:"Abgleich realer BOS-Standorte mit Spielwachen \u2013 Niedersachsen."},{id:"share",icon:"\u{1f517}",svg:"share",name:"Verbandsfreigabe",version:"0.1.3",desc:"Passende Eins\xe4tze finden und gezielt im Verband teilen."},{id:"fleet",icon:"\u{1f527}",svg:"fleet",name:"Fuhrpark-T\xdcV",version:"0.1.0-beta.5",desc:"Fahrzeuge, Personal und Ausbildungen der Wachen pr\xfcfen."},{id:"dashboard",icon:"\u25a4",svg:"dashboard",name:"Dashboard",version:"0.1.0-beta.2",desc:"Geb\xe4ude, Fahrzeuge und Wachen nach Typ auswerten."},{id:"alliance",icon:"\u25a5",svg:"alliance",name:"Verbandsverwaltung",version:"0.1.0-beta.2",desc:"Mitglieder, Credits und Verbandsstatistiken einsehen."},{id:"centermap",icon:"\u2316",svg:"centermap",name:"Kartensteuerung",version:"0.2.0-beta.2",desc:"Karte dynamisch oder auf einer gespeicherten Position zentrieren."},{id:"layouts",icon:"\u25a5",svg:"layouts",name:"Karten-Layouts",version:"0.1.0-beta.4",desc:"Anordnung von Karte, Eins\xe4tzen, Wachen, Chat und Funk individuell w\xe4hlen."},{id:"leitstellen",icon:"\u2611",svg:"leitstellen",name:"Leitstellenstatus",version:"0.1.0-beta.2",desc:"Leitstellen in der Wachenliste einzeln aktivieren oder deaktivieren."}];let a={...r},i=null,l="",d=null;function c(e,t,n,o){const a=document.createElement(e);if(t)a.className=t;if(n!==void 0&&n!==null)a.textContent=String(n);if(o)o.append(a);return a}function p(){GM_setValue(n,JSON.stringify(a))}function u(){return o.some(e=>a[e.id]!==r[e.id])}function m(){if(document.getElementById("bm-suite-appstore-css"))return;const e=["#bm-lss-navbar-tools{position:relative!important;display:flex!important;align-items:center!important;float:left!important;list-style:none!important;z-index:12000!important;height:42px!important;top:5px!important;margin:0 2px!important;padding:0 3px!important;font:12px Arial,sans-serif}","#bm-lss-navbar-tools [hidden]{display:none!important}","#bm-lss-navbar-tools>.bm-tools-trigger{display:inline-flex!important;align-items:center!important;gap:6px!important;height:22px!important;padding:0 9px!important;color:#fff!important;background:rgba(92,14,17,.3)!important;border:1px solid #ffffff55!important;border-radius:4px!important;font:700 11px Arial!important;cursor:pointer}","#bm-lss-navbar-tools .bm-tools-dropdown{position:absolute!important;right:0!important;top:calc(100% + 2px)!important;width:296px!important;max-width:calc(100vw - 20px)!important;background:#fff!important;color:#333!important;border:1px solid #ddd!important;box-shadow:0 7px 18px #0004!important;z-index:12001!important;border-radius:0 0 5px 5px!important;font:12px Arial}","#bm-lss-navbar-tools .bm-tools-heading{padding:11px 13px;background:#fafafa;border-bottom:1px solid #eee;font:700 11px Arial;color:#444}","#bm-lss-navbar-tools .bm-tools-row{display:flex;align-items:center;gap:7px;min-height:55px;padding:8px 10px;border-bottom:1px solid #eee;background:#fff}","#bm-lss-navbar-tools .bm-tools-option{flex:1;min-width:0;display:flex;align-items:center;gap:9px;cursor:pointer;border:0;background:transparent;text-align:left;font:12px Arial;color:#333;padding:4px}","#bm-lss-navbar-tools .bm-lss-dock-icon{display:grid!important;place-items:center!important;width:27px!important;height:27px!important;flex:0 0 27px!important;color:#b82d34!important;background:#fff0f1!important;border-radius:7px!important;font-size:0!important}","#bm-lss-navbar-tools .bm-lss-dock-icon svg{display:block;width:18px;height:18px;pointer-events:none}","#bm-lss-navbar-tools .bm-tools-brandicon{display:grid;place-items:center}","#bm-lss-navbar-tools .bm-tools-brandicon svg{display:block;width:15px;height:15px;pointer-events:none}","#bm-lss-navbar-tools .bm-tools-texts{display:flex;flex-direction:column;gap:4px;min-width:0}","#bm-lss-navbar-tools .bm-tools-state{font:10px Arial;color:#777}","#bm-lss-navbar-tools button.bm-tools-power{display:block!important;position:relative!important;flex:0 0 43px!important;box-sizing:border-box!important;min-width:43px!important;max-width:43px!important;width:43px!important;min-height:23px!important;max-height:23px!important;height:23px!important;margin:0!important;padding:0!important;appearance:none!important;-webkit-appearance:none!important;border:1px solid #b5b5b5!important;border-radius:12px!important;background:#bdbdbd!important;box-shadow:none!important;cursor:pointer!important;transition:background .12s!important}",'#bm-lss-navbar-tools button.bm-tools-power::after{content:""!important;display:block!important;position:absolute!important;left:2px!important;top:2px!important;width:17px!important;height:17px!important;border-radius:50%!important;background:#fff!important;box-shadow:0 1px 3px #0004!important;transform:translateX(0)!important;transition:transform .12s!important;pointer-events:none!important}','#bm-lss-navbar-tools button.bm-tools-power[aria-checked="true"]{background:#37bd50!important;border-color:#2b9f42!important}','#bm-lss-navbar-tools button.bm-tools-power[aria-checked="true"]::after{transform:translateX(19px)!important}',"#bm-suite-appstore[hidden]{display:none!important}","#bm-suite-appstore{position:fixed!important;inset:0!important;display:flex!important;justify-content:center!important;align-items:center!important;z-index:20050!important;background:#0009!important;padding:15px!important;font:12px/1.5 Arial,sans-serif!important;color:#333!important}","#bm-suite-appstore *{box-sizing:border-box}","#bm-suite-appstore .bmsa-panel{width:min(100%,980px);max-height:94vh;display:flex;flex-direction:column;overflow:hidden;background:#fff;border-radius:8px;box-shadow:0 18px 42px #0005}","#bm-suite-appstore .bmsa-header{background:#cd3036;color:#fff;display:flex;gap:10px;align-items:center;justify-content:space-between;padding:18px 22px}","#bm-suite-appstore .bmsa-title{font:bold 19px Arial;color:#fff}","#bm-suite-appstore .bmsa-tagline{font:11px Arial;color:#fff;margin-top:5px;opacity:.85}","#bm-suite-appstore .bmsa-close{font:700 25px Arial;color:#fff;background:transparent;border:0;cursor:pointer}","#bm-suite-appstore .bmsa-main{overflow:auto;padding:17px 22px}","#bm-suite-appstore .bmsa-sub{font-size:12px;color:#555;margin:0 0 14px}","#bm-suite-appstore .bmsa-search{display:flex;gap:10px;align-items:center;margin-bottom:15px}","#bm-suite-appstore input{flex:1;min-width:120px;padding:9px;border:1px solid #ccc;border-radius:4px;color:#333;background:#fff}","#bm-suite-appstore .bmsa-count{color:#777;font-size:11px}","#bm-suite-appstore .bmsa-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,240px),1fr));gap:13px}","#bm-suite-appstore .bmsa-card{border:1px solid #e1e4e9;border-radius:10px;padding:16px;background:#fff;display:flex;flex-direction:column;min-height:204px;transition:border-color .15s ease,box-shadow .15s ease}","#bm-suite-appstore .bmsa-card:hover{border-color:#d9b0b3;box-shadow:0 4px 15px #2d35400b}","#bm-suite-appstore .bmsa-cardhead{display:flex;align-items:center;gap:11px;min-width:0}","#bm-suite-appstore .bmsa-icon{display:grid;place-items:center;flex:0 0 46px;width:46px;height:46px;border-radius:11px;background:#fff0f1;color:#b92c34}","#bm-suite-appstore .bmsa-icon svg{display:block;width:24px;height:24px}","#bm-suite-appstore .bmsa-meta{flex:1;min-width:0}","#bm-suite-appstore .bmsa-name{font:bold 13px Arial}","#bm-suite-appstore .bmsa-version{font:10px Arial;color:#777;margin-top:4px}","#bm-suite-appstore .bmsa-desc{margin:14px 0 11px;font-size:12px;line-height:1.5;color:#5d626b;min-height:42px;flex:1}","#bm-suite-appstore .bmsa-status{display:inline-flex;align-items:center;gap:6px;font-size:11px;color:#60666e}",'#bm-suite-appstore .bmsa-status::before{content:"";display:inline-block;width:7px;height:7px;flex:0 0 7px;border-radius:50%;background:#a3a9b1}',"#bm-suite-appstore .bmsa-status.bmsa-active::before{background:#2fa44f}","#bm-suite-appstore .bmsa-status.bmsa-pending::before{background:#cb8a12}","#bm-suite-appstore .bmsa-cardactions{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:8px;margin-top:12px;padding-top:12px;border-top:1px solid #f0f1f3}","#bm-suite-appstore .bmsa-open{display:inline-flex;align-items:center;justify-content:center;gap:7px;border:1px solid #dcafb2;background:#fff;color:#a9282c;border-radius:6px;padding:7px 10px;font:700 11px Arial;cursor:pointer}","#bm-suite-appstore .bmsa-open svg{display:block;width:14px;height:14px}","#bm-suite-appstore .bmsa-open:hover{background:#fff3f3}","#bm-suite-appstore .bmsa-switch{flex:0 0 44px;width:44px;height:24px;border:0;border-radius:12px;background:#aaa;position:relative;cursor:pointer}",'#bm-suite-appstore .bmsa-switch:after{content:"";position:absolute;left:3px;top:3px;width:18px;height:18px;background:white;border-radius:50%;box-shadow:0 1px 3px #0004}',"#bm-suite-appstore .bmsa-switch[aria-checked=true]{background:#32b856}","#bm-suite-appstore .bmsa-switch[aria-checked=true]:after{left:23px}","#bm-suite-appstore button:focus-visible,#bm-lss-navbar-tools .bm-tools-option:focus-visible{outline:2px solid #c72c35!important;outline-offset:3px!important}","@media(prefers-reduced-motion:reduce){#bm-suite-appstore .bmsa-card,#bm-suite-appstore .bmsa-switch{transition:none!important}}","#bm-suite-appstore .bmsa-footer{border-top:1px solid #eee;background:#fafafa;display:flex;flex-wrap:wrap;gap:9px;align-items:center;padding:14px 22px}","#bm-suite-appstore .bmsa-button{padding:9px 11px;background:white;border:1px solid #ccc;border-radius:4px;font:700 11px Arial;cursor:pointer;color:#333}","#bm-suite-appstore .bmsa-button.bmsa-primary{background:#cf3036;border-color:#bd252c;color:white}","#bm-suite-appstore .bmsa-button:disabled{opacity:.45;cursor:default}","#bm-suite-appstore .bmsa-footnote{flex:1;min-width:160px;font:11px Arial;color:#555}","@media(max-width:600px){#bm-suite-appstore{padding:6px!important}#bm-suite-appstore .bmsa-main,#bm-suite-appstore .bmsa-header,#bm-suite-appstore .bmsa-footer{padding:12px}}","#bm-suite-appstore{background:rgba(18,24,34,.58)!important;backdrop-filter:blur(3px);font-family:Arial,sans-serif!important}","#bm-suite-appstore .bmsa-panel{width:min(100%,1040px);max-height:92vh;border:1px solid #ffffff70;border-radius:18px;box-shadow:0 24px 80px #10182855}","#bm-suite-appstore .bmsa-header{background:linear-gradient(115deg,#a61e2c,#d12e3b);padding:24px 28px;gap:18px;position:relative}","#bm-suite-appstore .bmsa-brand{font-size:10px;font-weight:700;letter-spacing:2px;color:#ffdae0;margin-bottom:7px}","#bm-suite-appstore .bmsa-title{font:700 26px/1.15 Arial;letter-spacing:-.5px}","#bm-suite-appstore .bmsa-tagline{font:12px/1.5 Arial;opacity:1;color:#ffe4e7;margin-top:8px}","#bm-suite-appstore .bmsa-close{display:grid;place-items:center;width:36px;height:36px;padding:0;border:1px solid #ffffff45;border-radius:10px;background:#ffffff12;font-size:24px;flex:0 0 36px}","#bm-suite-appstore .bmsa-close:hover{background:#ffffff25}","#bm-suite-appstore .bmsa-main{background:#f5f6f9;padding:22px 28px}","#bm-suite-appstore .bmsa-sub{font-size:12px;line-height:1.6;color:#667085;margin-bottom:16px}","#bm-suite-appstore .bmsa-search{gap:12px;margin-bottom:18px}","#bm-suite-appstore input{padding:12px 14px;border:1px solid #dce1e9;border-radius:10px;box-shadow:0 1px 2px #10182805;font:13px Arial}","#bm-suite-appstore input:focus-visible{outline:2px solid #bf2634;outline-offset:2px}","#bm-suite-appstore .bmsa-count{white-space:nowrap;color:#475467;background:#fff;border:1px solid #dce1e9;padding:10px 12px;border-radius:10px;font-weight:700}","#bm-suite-appstore .bmsa-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:14px}","#bm-suite-appstore .bmsa-card{padding:16px;min-height:174px;border-radius:13px;border-color:#e0e4ec;box-shadow:0 2px 4px #10182803}",'#bm-suite-appstore .bmsa-card[data-state="active"]{border-color:#d9a3aa;box-shadow:inset 0 3px #c62b39}','#bm-suite-appstore .bmsa-card[data-state="pending"]{border-color:#dfbf7a;box-shadow:inset 0 3px #c38b22}',"#bm-suite-appstore .bmsa-card:hover{border-color:#b98d94;box-shadow:0 5px 16px #25324a0c}","#bm-suite-appstore .bmsa-cardhead{gap:10px}","#bm-suite-appstore .bmsa-icon{width:40px;height:40px;flex-basis:40px;border-radius:11px;background:#fff0f2;color:#bd2534}","#bm-suite-appstore .bmsa-icon svg{width:22px;height:22px}","#bm-suite-appstore .bmsa-name{font:700 13px/1.35 Arial;color:#253044}","#bm-suite-appstore .bmsa-version{font:10px/1.4 Arial;color:#7a8493;margin-top:3px}","#bm-suite-appstore .bmsa-desc{margin:13px 0 9px;min-height:36px;font-size:12px;line-height:1.55;color:#667085}","#bm-suite-appstore .bmsa-cardactions{margin-top:5px;padding-top:10px;border-color:#edf0f5;min-height:42px}","#bm-suite-appstore .bmsa-status{font-size:10px;gap:5px;padding:4px 7px;border-radius:6px;background:#f2f4f7;color:#667085}","#bm-suite-appstore .bmsa-status.bmsa-active{background:#eaf7ee;color:#237743}","#bm-suite-appstore .bmsa-status.bmsa-pending{background:#fff5df;color:#8e5f12}","#bm-suite-appstore .bmsa-open{border:0;border-radius:7px;background:#fff0f2;color:#ab2130;padding:7px 9px}","#bm-suite-appstore .bmsa-open:hover{background:#fce0e5}","#bm-suite-appstore .bmsa-switch{width:38px;height:22px;flex-basis:38px;background:#b6bdc8;padding:0;transition:background .15s}","#bm-suite-appstore .bmsa-switch:after{width:16px;height:16px;top:3px;left:3px}","#bm-suite-appstore .bmsa-switch[aria-checked=true]{background:#c52a38}","#bm-suite-appstore .bmsa-switch[aria-checked=true]:after{left:19px}","#bm-suite-appstore .bmsa-footer{padding:16px 28px;background:#fff;border-color:#e5e8ee;gap:10px}","#bm-suite-appstore .bmsa-button{padding:10px 12px;border-radius:8px;border-color:#dce1e9;color:#475467}","#bm-suite-appstore .bmsa-button:hover:not(:disabled){background:#f5f6f9}","#bm-suite-appstore .bmsa-button.bmsa-primary{background:#bf2836;border-color:#bf2836;color:#fff;box-shadow:0 2px 4px #bf28361a}","#bm-suite-appstore .bmsa-button.bmsa-primary:hover:not(:disabled){background:#a51e2b}","#bm-suite-appstore .bmsa-button:disabled{opacity:1;background:#eef0f4;border-color:#eef0f4;color:#8a93a2;box-shadow:none}","#bm-suite-appstore .bmsa-footnote{font:11px/1.5 Arial;color:#667085}","#bm-suite-appstore .bmsa-empty{grid-column:1/-1;padding:32px 16px;text-align:center;color:#667085;background:#fff;border:1px dashed #d5dbe5;border-radius:12px}","@media(max-width:900px){#bm-suite-appstore .bmsa-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}","@media(max-width:600px){#bm-suite-appstore .bmsa-grid{grid-template-columns:1fr}#bm-suite-appstore .bmsa-header,#bm-suite-appstore .bmsa-main,#bm-suite-appstore .bmsa-footer{padding:16px}#bm-suite-appstore .bmsa-title{font-size:23px}#bm-suite-appstore .bmsa-search{flex-wrap:wrap}#bm-suite-appstore .bmsa-search input{width:100%}#bm-suite-appstore .bmsa-footer .bmsa-primary{width:100%}#bm-suite-appstore .bmsa-panel{max-height:96vh}}"].join("\n");c("style","",e,document.head).id="bm-suite-appstore-css"}function b(){if(i?.isConnected)return i;m();i=c("div","",null,document.body);i.id=e;i.hidden=true;const t=c("section","bmsa-panel",null,i);t.setAttribute("role","dialog");t.setAttribute("aria-modal","true");t.setAttribute("aria-labelledby","bmsa-heading");const n=c("div","bmsa-header",null,t),r=c("div","",null,n);c("div","bmsa-brand","BRUHN MEDIA",r);c("div","bmsa-title","Dein Appstore",r).id="bmsa-heading";c("div","bmsa-tagline","Made to Work | Ein Script, deine Tools.",r);const s=c("button","bmsa-close","\xd7",n);s.type="button";s.setAttribute("aria-label","Schlie\xdfen");s.addEventListener("click",h);const d=c("div","bmsa-main",null,t);c("p","bmsa-sub","W\xe4hle die Tools f\xfcr deinen Spielalltag. \xc4nderungen an den Schaltern werden nach dem Neuladen aktiv.",d);const u=c("div","bmsa-search",null,d);const b=c("input","",null,u);b.type="search";b.placeholder="Tools suchen \u2026";b.setAttribute("aria-label","Tools durchsuchen");b.addEventListener("input",()=>{l=b.value.trim().toLocaleLowerCase("de-DE");g()});c("span","bmsa-count","",u).id="bmsa-count";c("div","bmsa-grid",null,d).id="bmsa-grid";const f=c("div","bmsa-footer",null,t);const x=c("button","bmsa-button","Alle aktivieren",f);x.type="button";x.addEventListener("click",()=>{for(const e of o)a[e.id]=true;p();g()});const v=c("button","bmsa-button","Alle deaktivieren",f);v.type="button";v.addEventListener("click",()=>{for(const e of o)a[e.id]=false;p();g()});c("span","bmsa-footnote","",f).id="bmsa-note";const y=c("button","bmsa-button bmsa-primary","\xc4nderungen anwenden (F5)",f);y.type="button";y.id="bmsa-apply";y.addEventListener("click",()=>location.reload());i.addEventListener("click",e=>{if(e.target===i)h()});document.addEventListener("keydown",e=>{if(e.key==="Escape"&&i&&!i.hidden){e.preventDefault();h()}});g();return i}function f(e){const n={planner:"#bm-lss-dock-bos",share:"#bm-share-menu-row .bm-tools-option",fleet:"#bmft-dock-row .bm-tools-option",dashboard:"#bm-extra-row-dashboard .bm-tools-option",alliance:"#bm-extra-row-alliance .bm-tools-option",centermap:"#bm-extra-row-centermap .bm-tools-option",layouts:"#bm-map-layout-menu-row .bm-tools-option",leitstellen:"#bm-leitstellenstatus-menu-row .bm-tools-option"};if(!a[e]||!r[e])return;const o=document.querySelector("#"+t+" "+n[e]);if(!o){const e=i?.querySelector("#bmsa-note");if(e)e.textContent="Modulstart nicht verf\xfcgbar. Pr\xfcfe, ob das Modul geladen wurde.";return}h();o.click()}function g(){if(!i)return;const e=i.querySelector("#bmsa-grid");e.replaceChildren();const t=o.filter(e=>(e.name+" "+e.desc).toLocaleLowerCase("de-DE").includes(l));if(!t.length)c("div","bmsa-empty","Keine Tools gefunden. Versuche einen anderen Suchbegriff.",e);for(const n of t){const o=c("article","bmsa-card",null,e),l=c("div","bmsa-cardhead",null,o);o.dataset.state=a[n.id]!==r[n.id]?"pending":a[n.id]?"active":"inactive";const d=c("span","bmsa-icon",null,l);d.appendChild(s(n.svg));const u=c("div","bmsa-meta",null,l);c("div","bmsa-name",n.name,u);c("div","bmsa-version","Version "+n.version,u);const m=c("button","bmsa-switch",null,l);m.type="button";m.setAttribute("role","switch");m.setAttribute("aria-label",n.name+" ein- oder ausschalten");m.setAttribute("aria-checked",String(a[n.id]));m.addEventListener("click",()=>{a[n.id]=!a[n.id];p();g();i.querySelectorAll(".bmsa-switch")[t.indexOf(n)]?.focus()});c("div","bmsa-desc",n.desc,o);const b=c("div","bmsa-cardactions",null,o);const h=a[n.id]!==r[n.id];c("div","bmsa-status "+(h?"bmsa-pending":a[n.id]?"bmsa-active":"bmsa-inactive"),h?"\xc4nderung vorgemerkt \xb7 F5 n\xf6tig":a[n.id]?"Aktiv":"Inaktiv",b);if(a[n.id]&&r[n.id]){const e=c("button","bmsa-open","\xd6ffnen",b);e.appendChild(s("open"));e.type="button";e.setAttribute("aria-label",n.name+" \xf6ffnen");e.addEventListener("click",()=>f(n.id))}}i.querySelector("#bmsa-count").textContent=o.filter(e=>a[e.id]).length+"/"+o.length+" aktiv";i.querySelector("#bmsa-note").textContent=u()?"Einstellungen gespeichert; Neuladen erforderlich.":"Alle Einstellungen angewendet.";i.querySelector("#bmsa-apply").disabled=!u()}function h(){if(!i)return;i.hidden=true;if(d?.isConnected)d.focus()}function x(e){d=e?.currentTarget||document.activeElement;b().hidden=false;i.querySelector(".bmsa-switch")?.focus()}function v(e){const t=e.querySelector(".bm-tools-brandicon");if(t&&t.dataset.bmIcon!=="appstore"){t.replaceChildren(s("appstore"));t.dataset.bmIcon="appstore"}const n=[["#bmsa-launch-row","appstore"],["#bm-lss-dock-bos","planner"],["#bm-share-menu-row","share"],["#bmft-dock-row","fleet"],["#bm-extra-row-dashboard","dashboard"],["#bm-extra-row-alliance","alliance"],["#bm-extra-row-centermap","centermap"],["#bm-map-layout-menu-row","layouts"],["#bm-leitstellenstatus-menu-row","leitstellen"]];for(const[t,o]of n){const n=e.querySelector(t+" .bm-lss-dock-icon");if(!n||n.dataset.bmIcon===o)continue;n.replaceChildren(s(o));n.dataset.bmIcon=o}}function y(){for(const e of["#navbar-main-collapse ul.navbar-right","nav.navbar ul.navbar-right","#navbar-main-collapse ul.navbar-nav","nav.navbar ul.navbar-nav"]){const t=document.querySelector(e);if(t&&t.tagName==="UL")return t}return document.querySelector("#menu_profile")?.closest("ul")||null}function w(){let e=document.getElementById(t);if(!e){const n=y();if(n){e=c("li","",null,n);e.id=t;const o=c("button","bm-tools-trigger",null,e);o.type="button";const a=c("span","bm-tools-brandicon",null,o);a.appendChild(s("appstore"));a.dataset.bmIcon="appstore";c("span","bm-tools-name","BRUHN MEDIA",o);c("span","bm-tools-caret","\u25bc",o);o.setAttribute("aria-expanded","false");const r=c("div","bm-tools-dropdown",null,e);r.hidden=true;c("div","bm-tools-heading","BRUHN MEDIA | LSS Tools",r);o.addEventListener("click",e=>{e.preventDefault();e.stopPropagation();r.hidden=!r.hidden;o.setAttribute("aria-expanded",String(!r.hidden))});document.addEventListener("pointerdown",t=>{if(!e.isConnected||e.contains(t.target))return;r.hidden=true;o.setAttribute("aria-expanded","false")})}}if(e){const t=e.querySelector(".bm-tools-dropdown");if(t&&!t.querySelector("#bmsa-launch-row")){const n=c("div","bm-tools-row",null,t);n.id="bmsa-launch-row";const o=c("button","bm-tools-option",null,n);o.type="button";c("span","bm-lss-dock-icon","\u25a6",o);const a=c("span","bm-tools-texts",null,o);c("strong","","Appstore \xb7 Tools verwalten",a);c("small","bm-tools-state","Module zentral aktivieren",a);o.addEventListener("click",n=>{n.preventDefault();n.stopPropagation();t.hidden=true;e.querySelector(".bm-tools-trigger")?.setAttribute("aria-expanded","false");x(n)})}v(e);document.getElementById("bmsa-fallback")?.remove()}else if(document.body&&!document.getElementById("bmsa-fallback")){const e=c("button","","\u25a6 BRUHN MEDIA | Appstore",document.body);e.id="bmsa-fallback";e.type="button";e.style.cssText="position:fixed;left:12px;bottom:32px;z-index:13000;padding:8px 11px;background:#be3035;color:#fff;border:1px solid #aa292e;border-radius:4px;cursor:pointer;font:bold 11px Arial";e.addEventListener("click",x)}}function k(){m();w();setInterval(w,2500)}if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",k,{once:true});else k()})();if(r.planner)(()=>{"use strict";if(window.__bruhnBosPlannerLoaded)return;window.__bruhnBosPlannerLoaded=true;const e="https://bruhnmedia.github.io/lss-reale-standorte/";const t="bm-bos-planner";const n="bruhn_bos_planer_v1";const o="bruhnmedia_bos_active";const a=.25;const r=11;const i=36;const s=750;const l=4*60*60*1e3;const d=[{id:"reference/ihlienworth",name:"Freiwillige Feuerwehr Ihlienworth",category:"fire",lat:53.73923,lon:8.91587,approximate:true,address:"Meisterstra\xdfe 3, Ihlienworth (ungef\xe4hre Lage)",sourceUrl:"https://bos-fahrzeuge.info/D22555"}];const c={fire:{label:"Feuerwehr",types:[0,18],color:"#dd3933",short:"FW"},police:{label:"Polizei",types:[6,11,17,19,29],color:"#2757a3",short:"POL"},hospital:{label:"Krankenhaus",types:[4],color:"#317dc5",short:"KH"},rescue:{label:"Rettungsdienst",types:[2,12,20],color:"#667786",short:"RD"},drk:{label:"DRK",types:[2,12,20],color:"#c02b38",short:"DRK"},asb:{label:"ASB",types:[2,12,20],color:"#c28a19",short:"ASB"},juh:{label:"Johanniter",types:[2,12,20],color:"#16835d",short:"JUH"},mhd:{label:"Malteser",types:[2,12,20],color:"#a83762",short:"MHD"},thw:{label:"THW",types:[9],color:"#24629e",short:"THW"},dlrg:{label:"DLRG",types:[15],color:"#b08a20",short:"DLRG"},wasser:{label:"Wasserwacht",types:[15],color:"#2091aa",short:"WW"},berg:{label:"Bergwacht",types:[25],color:"#8850ad",short:"BW"}};const p=[["Einsatzkr\xe4fte & Versorgung",["fire","police","hospital","rescue"]],["Hilfsorganisationen",["drk","asb","juh","mhd","thw","dlrg","wasser","berg"]]];const u={categories:Object.fromEntries(Object.keys(c).map(e=>[e,true])),show:{missing:true,review:true,matched:true},radius:300,expanded:true,position:null};function m(){try{const e=JSON.parse(GM_getValue(n,"{}"));return{categories:Object.fromEntries(Object.keys(c).map(t=>[t,typeof e?.categories?.[t]==="boolean"?e.categories[t]:u.categories[t]])),show:Object.fromEntries(Object.keys(u.show).map(t=>[t,typeof e?.show?.[t]==="boolean"?e.show[t]:u.show[t]])),radius:[150,300,500,800].includes(Number(e?.radius))?Number(e.radius):u.radius,expanded:typeof e?.expanded==="boolean"?e.expanded:true,position:e?.position&&Number.isFinite(e.position.x)&&Number.isFinite(e.position.y)?e.position:null}}catch(e){return structuredClone(u)}}const b=m();const f={map:null,L:null,layer:null,panel:null,dockButton:null,timer:null,seq:0,abort:null,ownRequest:null,manifest:null,manifestAt:0,tileCache:new Map,real:[],own:null,ownAt:0,analyzed:[],markers:new Map,loadedTiles:0,processing:false,lastError:"",loadingOwn:false,readyReal:false,toolActive:String(GM_getValue(o,"true"))!=="false"};const g=()=>GM_setValue(n,JSON.stringify(b));const h="bruhnmedia_bos_planner_migrated_show_matched_v1";if(String(GM_getValue(h,"false"))!=="true"){b.show.matched=true;g();GM_setValue(h,"true")}const x=(e,t,n="",o="")=>{const a=document.createElement(t);if(n)a.className=n;if(o)a.textContent=o;e.appendChild(a);return a};function v(e){return e&&/^(node|way|relation)\/\d+$/.test(String(e.id||""))&&c[e.category]&&Number.isFinite(e.lat)&&Number.isFinite(e.lon)&&Math.abs(e.lat)<=90&&Math.abs(e.lon)<=180}function y(e){const t=Number(e?.building_type);const n=Number(e?.id);const o=Number(e?.latitude);const a=Number(e?.longitude);if(!Number.isInteger(n)||n<=0||!Number.isInteger(t)||!Number.isFinite(o)||!Number.isFinite(a)||Math.abs(o)>90||Math.abs(a)>180)return null;return{id:n,type:t,lat:o,lon:a,name:String(e.caption||`Geb\xe4ude ${n}`).slice(0,160)}}const w=Math.PI/180;function k(e,t){const n=(t.lat-e.lat)*w;const o=(t.lon-e.lon)*w;const a=Math.sin(n/2);const r=Math.sin(o/2);const i=a*a+Math.cos(e.lat*w)*Math.cos(t.lat*w)*r*r;return 12742e3*Math.asin(Math.min(1,Math.sqrt(i)))}function A(e){const t=new Map;for(const n of e){const e=Math.floor(n.lon/.02);const o=Math.floor(n.lat/.02);const a=`${o}:${e}`;if(!t.has(a))t.set(a,[]);t.get(a).push(n)}return t}function S(e){const t=[...e];for(const n of d){const o=e.some(e=>e.category===n.category&&(k(e,n)<=350||/ihlienworth/i.test(String(e.name||""))&&k(e,n)<=2500));if(!o)t.push(n)}return t}function E(e,t,n){const o=A(t);const a=[];const r=[];const i=Math.max(750,n*2);const s=12e3;e.forEach((e,t)=>{const i=Math.floor(e.lat/.02);const l=Math.floor(e.lon/.02);let d=null;const p=new Set(c[e.category].types);for(let a=-6;a<=6;a++)for(let c=-10;c<=10;c++)for(const u of o.get(`${i+a}:${l+c}`)||[]){if(!p.has(u.type))continue;const o=k(e,u);if(o<=s&&(!d||d.distance>o))d={building:u,distance:o};if(o<=n)r.push({siteIndex:t,building:u,distance:o})}a.push(d)});r.sort((e,t)=>e.distance-t.distance);const l=new Map,d=new Set;for(const e of r){if(l.has(e.siteIndex)||d.has(e.building.id))continue;l.set(e.siteIndex,e);d.add(e.building.id)}return e.map((e,t)=>{const n=l.get(t);const o=a[t];if(n)return{site:e,kind:"matched",building:n.building,meters:Math.round(n.distance)};if(o&&o.distance<=i)return{site:e,kind:"review",building:o.building,meters:Math.round(o.distance)};return{site:e,kind:"missing",building:o?.building||null,meters:o?Math.round(o.distance):null}})}function z(){return Object.assign(Error("Abfrage abgebrochen."),{name:"AbortError"})}function $(e){if(e?.aborted)throw z()}function M(){clearTimeout(f.timer);f.timer=null;++f.seq;f.abort?.abort();f.abort=null;f.processing=false;f.loadingOwn=false;f.ownRequest=null}function L(e,t=18e3,n){return new Promise((o,a)=>{if(n?.aborted){a(z());return}let r,i=false;const s=(e,t)=>{if(i)return;i=true;n?.removeEventListener("abort",l);if(e)a(e);else o(t)};const l=()=>{s(z());r?.abort()};n?.addEventListener("abort",l,{once:true});try{r=GM_xmlhttpRequest({method:"GET",url:e,timeout:t,headers:{Accept:"application/json"},onload(e){if(e.status!==200){s(Error("Datenserver: HTTP "+e.status));return}try{s(null,JSON.parse(e.responseText))}catch{s(Error("Antwort ist kein g\xfcltiges JSON"))}},onerror:()=>s(Error("Datenserver nicht erreichbar")),ontimeout:()=>s(Error("Zeit\xfcberschreitung beim Datenserver")),onabort:()=>s(z())})}catch(e){s(e)}})}async function _(e=false,t){$(t);if(f.own&&!e&&Date.now()-f.ownAtn.abort();t?.addEventListener("abort",o,{once:true});const a=setTimeout(o,25e3);f.loadingOwn=true;f.ownRequest=n;try{const e=await fetch("/api/buildings",{credentials:"same-origin",cache:"no-store",signal:n.signal});if(!e.ok)throw Error("Spiel-Geb\xe4ude: HTTP "+e.status);const t=await e.json();$(n.signal);const o=Array.isArray(t)?t:Array.isArray(t?.result)?t.result:null;if(!o)throw Error("Unbekanntes Format der Spielgeb\xe4ude");const a=o.map(y).filter(Boolean);if(o.length&&!a.length)throw Error("Keine verwertbaren Koordinaten im Geb\xe4udeabruf");f.own=a;f.ownAt=Date.now();return a}finally{clearTimeout(a);t?.removeEventListener("abort",o);if(f.ownRequest===n){f.loadingOwn=false;f.ownRequest=null}}}async function F(t=false,n){$(n);if(!t&&f.manifest&&Date.now()-f.manifestAtObject.hasOwn(n.tiles,e));const r=a.filter(e=>!f.tileCache.has(`${n.generatedAt}:${e}`));const i=Array.from({length:Math.min(4,r.length)},async()=>{while(r.length){$(o);const t=r.shift();const a=await L(`${e}tiles/${t}.json`,18e3,o);$(o);if(!Array.isArray(a))throw new Error(`Ung\xfcltige Standortdatei ${t}`);f.tileCache.set(`${n.generatedAt}:${t}`,a.filter(v))}});await Promise.all(i);$(o);const s=new Map;for(const e of a)for(const t of f.tileCache.get(`${n.generatedAt}:${e}`)||[])if(!s.has(t.id))s.set(t.id,t);f.loadedTiles=a.length;return[...s.values()]}function B(){if(document.getElementById("bm-bos-style"))return;const e=document.createElement("style");document.head.appendChild(e);e.id="bm-bos-style";e.textContent=`\n#${t}{position:absolute;z-index:1210;top:12px;left:52px;width:302px;max-width:100%;max-height:100%;background:#fff;border:1px solid #c9c9c9;border-radius:4px;box-shadow:0 3px 12px #0003;display:flex;flex-direction:column;overflow:hidden;box-sizing:border-box;color:#333;font:12px/1.4 Arial,Helvetica,sans-serif;pointer-events:auto}\n#${t} *{box-sizing:border-box}\n#${t} .bm-head{display:flex;align-items:center;gap:7px;background:#d73530;color:#fff;padding:0 8px;min-height:36px;cursor:grab;touch-action:none;user-select:none}\n#${t} .bm-head.dragging{cursor:grabbing}\n#${t} .bm-title{font-weight:700;flex:1;white-space:nowrap}\n#${t} .bm-head small{font-size:9px;opacity:.9}\n#${t} .bm-toggle{background:transparent;color:white;border:0;border-radius:3px;cursor:pointer;font-size:18px;padding:3px 7px}\n#${t} .bm-toggle:hover{background:#ffffff29}\n#${t} .bm-body{padding:10px;overflow:auto;max-height:min(72vh,650px);scrollbar-width:thin}\n#${t} .bm-body[hidden]{display:none}\n#${t} .bm-sub{color:#777;font-size:10px;margin-bottom:8px;display:flex;justify-content:space-between;gap:8px;align-items:center}\n#${t} .bm-sub b{color:#317948;background:#eef9f0;border:1px solid #c4e2cd;padding:2px 5px;border-radius:3px}\n#${t} .bm-section{border-top:1px solid #e8e8e8;padding-top:7px;margin-top:8px}\n#${t} .bm-label{font-size:9px;color:#666;font-weight:700;text-transform:uppercase;letter-spacing:.4px;margin-bottom:5px}\n#${t} .bm-grid{display:grid;grid-template-columns:1fr 1fr;gap:4px 6px}\n#${t} .bm-choice{font-size:11px;display:flex;align-items:center;gap:5px;cursor:pointer;min-width:0}\n#${t} .bm-choice input{accent-color:#d9534f;margin:0;flex-shrink:0}\n#${t} .bm-dot{width:7px;height:7px;border-radius:2px;flex-shrink:0}\n#${t} .bm-legend{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:5px}\n#${t} .bm-legend label{display:flex;align-items:center;gap:4px;cursor:pointer;font-size:10px;line-height:1.2}\n#${t} .bm-legend input{margin:0;accent-color:#d9534f}\n#${t} .bm-statusdot{display:inline-block;width:9px;height:9px;border-radius:50%;flex-shrink:0}\n#${t} .bm-select{width:100%;padding:6px;border:1px solid #ccc;background:white;border-radius:4px;font:11px Arial}\n#${t} .bm-actions{display:flex;gap:6px;margin:9px 0}\n#${t} .bm-btn{padding:7px 8px;background:#fff;border:1px solid #ccc;border-radius:4px;cursor:pointer;color:#333;font:bold 11px Arial}\n#${t} .bm-btn:hover{background:#eee}\n#${t} .bm-btn.primary{background:#d9534f;color:white;border-color:#d43f3a}\n#${t} .bm-btn.primary:hover{background:#c9302c}\n#${t} .bm-actions button{flex:1}\n#${t} .bm-info{background:#f6f6f6;border:1px solid #e3e3e3;border-radius:4px;padding:7px;font-size:11px;line-height:1.5;color:#444}\n#${t} .bm-info[data-error='true']{color:#a52824;border-color:#edd0ce;background:#fff5f4}\n#${t} .bm-counts{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px;margin:8px 0}\n#${t} .bm-count{border:1px solid #e5e5e5;border-radius:4px;text-align:center;padding:6px 3px}\n#${t} .bm-count strong{display:block;font-size:18px;line-height:1.2}\n#${t} .bm-count span{font-size:9px;color:#666}\n#${t} .bm-list{max-height:155px;overflow:auto;border:1px solid #e6e6e6;border-radius:4px}\n#${t} .bm-place{background:#fff;border:0;border-bottom:1px solid #eee;width:100%;padding:7px 8px;text-align:left;cursor:pointer;display:flex;align-items:center;gap:7px;color:#333;font:11px Arial}\n#${t} .bm-place:last-child{border-bottom:0}\n#${t} .bm-place:hover{background:#f5f5f5}\n#${t} .bm-place span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}\n#${t} .bm-foot{border-top:1px solid #eee;margin-top:8px;padding-top:6px;font-size:9px;color:#777}\n#${t} .bm-foot a{color:#337ab7}\n.bm-bos-pin{min-width:31px;height:29px;padding:0 5px;background:white;border:3px solid var(--bm-color);border-radius:14px;color:#333;display:flex;justify-content:center;align-items:center;font:bold 10px Arial;box-shadow:0 2px 7px #0005;white-space:nowrap}\n.bm-bos-popup{font:12px/1.55 Arial;min-width:205px}.bm-bos-popup b{display:block;margin-bottom:3px;font-size:13px}.bm-bos-popup a{color:#337ab7}\n\n/* BRUHN MEDIA: einheitliches, kompaktes Kartenfenster */\n#${t}{width:310px;max-width:min(310px,100%);box-shadow:0 3px 12px rgba(0,0,0,.24)}\n#${t}.bm-docked,#${t}.bm-off{display:none!important}\n#${t} .bm-head{min-height:32px;padding:0 5px 0 10px;gap:6px;border-bottom:1px solid #bf201d;background:#df302d}\n#${t} .bm-title{font-size:12px;overflow:hidden;text-overflow:ellipsis}\n#${t} .bm-head small{font-size:9px;font-weight:400;white-space:nowrap}\n\n#${t} .bm-grip{opacity:.85;font-size:15px;line-height:1}\n\n#${t} .bm-toggle{min-width:27px;min-height:27px;display:flex;align-items:center;justify-content:center;font-size:15px;font-weight:700;padding:0}\n#${t} .bm-body{display:flex;flex-direction:column;gap:0;max-height:min(72vh,630px);padding:0 10px 10px}\n#${t} .bm-sub{order:0;padding:8px 0 7px;margin:0;border-bottom:1px solid #e5e5e5}\n#${t} .bm-info{order:1;margin:9px 0 1px;padding:8px;overflow-wrap:anywhere}\n#${t} .bm-counts{order:2;margin:9px 0 8px}\n#${t} .bm-count{padding:8px 3px}\n#${t} .bm-count strong{font-size:20px}\n#${t} .bm-results{order:3;margin:0 0 7px;padding-top:7px}\n#${t} .bm-list{max-height:min(30vh,245px);min-height:50px}\n#${t} .bm-place{min-height:48px;gap:8px;padding:8px;border-left:3px solid transparent}\n#${t} .bm-place:hover{background:#f5f7f9}\n#${t} .bm-place[data-kind='missing']{border-left-color:#d9534f}\n#${t} .bm-place[data-kind='review']{border-left-color:#e5a52f}\n#${t} .bm-place-text{display:flex;flex-direction:column;gap:3px;min-width:0;flex:1}\n#${t} .bm-place-name{font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}\n#${t} .bm-place-detail{color:#707070;font-size:10px;line-height:1.3;white-space:normal}\n#${t} .bm-actions{order:4;margin:7px 0 10px}\n#${t} .bm-filters{order:5;margin:0;border:1px solid #e1e1e1;border-radius:4px}\n#${t} .bm-filter-title{padding:9px 8px;cursor:pointer;background:#f7f7f7;color:#555;font-size:11px;font-weight:700;list-style-position:inside}\n#${t} .bm-filters[open] .bm-filter-title{border-bottom:1px solid #e6e6e6}\n#${t} .bm-filters>.bm-section{margin:0 8px 8px;padding-top:7px}\n#${t} .bm-foot{order:6;margin-top:8px}\n#${t} .bm-choice span:last-child{overflow-wrap:anywhere}\n#${t} .bm-legend{grid-template-columns:1fr;gap:7px}\n#${t} .bm-legend label{font-size:11px}\n#${t} .bm-body[hidden]{display:none!important}\n@media(max-width:480px){#${t}{width:270px}}\n\n#${t}{width:360px;max-width:min(360px,100%);border:1px solid #e0e4ec;border-radius:14px;box-shadow:0 12px 36px #17243b35;color:#253044}\n#${t} .bm-head{min-height:72px;padding:14px 16px;gap:10px;background:linear-gradient(115deg,#a61e2c,#d12e3b);border-bottom:0}\n#${t} .bm-title{font-size:17px;line-height:1.4;white-space:normal}\n#${t} .bm-title small{display:block;font:10px/1.5 Arial;color:#ffe4e7;opacity:1;margin-top:3px}\n#${t} .bm-toggle{width:30px;height:30px;flex:0 0 30px;background:#ffffff12;border:1px solid #ffffff45;border-radius:8px;font-size:18px}\n#${t} .bm-grip{color:#ffe4e7}\n#${t} .bm-body{background:#f5f6f9;padding:0 14px 14px;max-height:min(72vh,700px)}\n#${t} .bm-sub{padding:12px 0;gap:10px;font-size:11px;line-height:1.55;color:#667085;border-color:#e0e4ec}\n#${t} .bm-sub b{white-space:nowrap;border:0;border-radius:6px;padding:5px 7px;background:#eaf7ee;color:#237743;font-size:10px}\n#${t} .bm-info{margin-top:12px;background:#fff;border-color:#e0e4ec;border-radius:9px;padding:11px;line-height:1.6;color:#667085}\n#${t} .bm-info[data-error='true']{background:#fff0f2;border-color:#edc3c7;color:#a32231}\n#${t} .bm-counts{gap:8px;margin:12px 0}\n#${t} .bm-count{padding:12px 4px;border-radius:10px;background:#fff;border-color:#e0e4ec}\n#${t} .bm-count strong{font-size:23px;margin-bottom:4px}\n#${t} .bm-count span{font-size:10px;line-height:1.4;color:#667085}\n#${t} .bm-results{border-top:0;padding-top:2px}\n#${t} .bm-label{font-size:10px;letter-spacing:.5px;color:#667085;margin-bottom:8px}\n#${t} .bm-list{border-color:#e0e4ec;border-radius:10px;max-height:min(30vh,260px);background:#fff}\n#${t} .bm-place{min-height:54px;padding:10px;gap:9px;color:#253044}\n#${t} .bm-place:hover{background:#fff4f6}\n#${t} .bm-place-name{font-size:12px}\n#${t} .bm-place-detail{font-size:11px;line-height:1.5;color:#667085}\n#${t} .bm-actions{gap:8px;margin:10px 0 14px;flex-wrap:wrap}\n#${t} .bm-btn{padding:10px;border-radius:8px;border-color:#dce1e9;color:#475467}\n#${t} .bm-btn.primary{background:#bf2836;border-color:#bf2836;color:#fff}\n#${t} .bm-btn.primary:hover{background:#a51e2b}\n#${t} .bm-filters{border-color:#e0e4ec;background:#fff;border-radius:10px;overflow:hidden}\n#${t} .bm-filter-title{padding:12px;background:#fff;font-size:12px;color:#253044}\n#${t} .bm-filters>.bm-section{margin:0 12px 12px;padding-top:10px}\n#${t} .bm-grid{gap:9px}\n#${t} .bm-choice{font-size:11px;line-height:1.5}\n#${t} .bm-choice input,#${t} .bm-legend input{accent-color:#bf2836}\n#${t} .bm-select{padding:9px;border-radius:8px;border-color:#dce1e9;font-size:12px}\n#${t} .bm-foot{font-size:10px;line-height:1.6;color:#667085;margin-top:12px;padding-top:10px;border-color:#e0e4ec}\n#${t} button:focus-visible,#${t} input:focus-visible,#${t} select:focus-visible,#${t} summary:focus-visible{outline:2px solid #bf2836;outline-offset:2px}\n@media(max-width:480px){#${t}{width:310px;max-width:100%}#${t} .bm-head{padding:12px}#${t} .bm-body{padding:0 10px 10px}}\n\n\n`}function W(e,t,n,o,a,r){const i="bm-lss-navbar-tools";const s="bm-lss-navbar-tools-style";if(!document.getElementById(s)){const e=document.createElement("style");e.id=s;e.textContent=`\n #${i}{position:relative!important;display:flex!important;align-items:center!important;float:left!important;list-style:none!important;z-index:12000;height:42px!important;top:5px!important;margin:0 2px!important;padding:0 3px!important;font:12px Arial,Helvetica,sans-serif}\n #${i} [hidden]{display:none!important}\n #${i}>.bm-tools-trigger{display:inline-flex!important;align-items:center!important;justify-content:center!important;gap:6px!important;height:22px!important;margin:0!important;padding:0 9px!important;white-space:nowrap;cursor:pointer;border:1px solid rgba(255,255,255,.32)!important;border-radius:4px!important;background:rgba(92,14,17,.30)!important;color:#fff!important;font:700 11px Arial,Helvetica,sans-serif!important;line-height:1!important;box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}\n #${i}>.bm-tools-trigger:hover,#${i}>.bm-tools-trigger[aria-expanded='true']{background:rgba(85,12,15,.6)!important;border-color:rgba(255,255,255,.52)!important}\n #${i} button:focus-visible{outline:2px solid #337ab7!important;outline-offset:2px}\n #${i} .bm-tools-brandicon{font-size:12px;line-height:1;opacity:.94}\n #${i} .bm-tools-caret{font-size:9px;line-height:1;opacity:.8}\n #${i} .bm-tools-dropdown{position:absolute!important;right:0!important;top:calc(100% + 2px)!important;width:296px;min-width:0;max-width:calc(100vw - 20px);padding:0;background:#fff;border:1px solid #d5d5d5;border-radius:0 0 5px 5px;box-shadow:0 7px 18px rgba(0,0,0,.24);z-index:12001;color:#333;font:12px Arial,Helvetica,sans-serif}\n #${i} .bm-tools-heading{padding:11px 13px;background:#fafafa;border-bottom:1px solid #ececec;color:#444;font:700 11px Arial,Helvetica,sans-serif;letter-spacing:.15px}\n #${i} .bm-tools-row{display:flex;align-items:center;gap:7px;min-height:56px;padding:8px 10px;border-bottom:1px solid #eee;background:#fff}\n #${i} .bm-tools-row:last-child{border-bottom:0}\n #${i} .bm-tools-option{flex:1;min-width:0;padding:4px 3px;display:flex;align-items:center;gap:8px;cursor:pointer;border:0;border-radius:3px;background:transparent;text-align:left;color:#333;font:12px Arial,Helvetica,sans-serif}\n #${i} .bm-tools-option:hover{background:#f5f5f5;color:#c9302c}\n #${i} .bm-lss-dock-icon{width:20px;flex:0 0 20px;text-align:center;font-size:14px;line-height:1}\n #${i} .bm-tools-texts{display:flex;flex-direction:column;gap:4px;min-width:0}\n #${i} .bm-tools-texts strong{font-size:12px;font-weight:700;white-space:nowrap}\n #${i} .bm-tools-state{color:#777;font:10px Arial,Helvetica,sans-serif}\n @media(max-width:1050px){#${i}>.bm-tools-trigger{padding:0 7px!important}}\n @media(max-width:740px){#${i} .bm-tools-name{display:none}}\n `;document.head.appendChild(e)}function l(){const e=document.querySelector("#menu_profile");const t=["#navbar-main-collapse > ul.navbar-right","#navbar-main-collapse ul.navbar-right","#navbar-main-collapse > ul.navbar-nav","#navbar-main-collapse ul.navbar-nav","nav.navbar ul.navbar-right","nav.navbar ul.navbar-nav","#navigation_top","#menu_profile"];for(const e of t){const t=document.querySelector(e);const n=t?.tagName==="UL"?t:t?.closest("ul");if(n&&n.closest("nav, .navbar, #navbar-main-collapse, #navigation_top, #header"))return n}return e?.closest("ul")||null}const d=l();let c=document.getElementById(i);if(!c&&d){c=document.createElement("li");c.id=i;const e=document.createElement("button");e.type="button";e.className="bm-tools-trigger";e.setAttribute("aria-label","BRUHN MEDIA Tools \xf6ffnen");e.setAttribute("aria-expanded","false");const t=document.createElement("span");t.className="bm-tools-brandicon";t.textContent="\u25a6";e.appendChild(t);const n=document.createElement("span");n.className="bm-tools-name";n.textContent="BRUHN MEDIA";e.appendChild(n);const o=document.createElement("span");o.className="bm-tools-caret";o.textContent="\u25bc";e.appendChild(o);const a=document.createElement("div");a.className="bm-tools-dropdown";a.hidden=true;const r=document.createElement("div");r.className="bm-tools-heading";r.textContent="BRUHN MEDIA | LSS Tools";a.appendChild(r);c.append(e,a);const s=Array.from(d.children).find(e=>/LSS[\s-]?Manager/i.test(e.textContent||""));if(s)d.insertBefore(c,s);else d.appendChild(c);e.addEventListener("click",t=>{t.preventDefault();t.stopPropagation();const n=a.hidden;a.hidden=!n;e.setAttribute("aria-expanded",String(n))});document.addEventListener("pointerdown",t=>{if(!c.isConnected||c.contains(t.target))return;a.hidden=true;e.setAttribute("aria-expanded","false")});document.addEventListener("keydown",t=>{if(t.key!=="Escape"||a.hidden)return;a.hidden=true;e.setAttribute("aria-expanded","false");e.focus()})}if(!c)return null;c.hidden=false;if(d){const e=Array.from(d.children).find(e=>e!==c&&/LSS[\s-]?Manager/i.test(e.textContent||""));if(e&&c.nextElementSibling!==e)d.insertBefore(c,e);else if(c.parentElement!==d)d.appendChild(c)}const p=c.querySelector(".bm-tools-dropdown");let u=document.getElementById(e);if(!u){const o=document.createElement("div");o.className="bm-tools-row";u=document.createElement("button");u.id=e;u.className="bm-tools-option";u.type="button";const a=document.createElement("span");a.className="bm-lss-dock-icon";a.textContent=t;const r=document.createElement("span");r.className="bm-tools-texts";const i=document.createElement("strong");i.textContent=n;const s=document.createElement("small");s.className="bm-tools-state";r.append(i,s);u.append(a,r);const l=document.createElement("button");l.type="button";l.className="bm-tools-power";l.setAttribute("role","switch");l.setAttribute("aria-label",n+" ein- oder ausschalten");o.append(u,l);p.appendChild(o)}const m=u.closest(".bm-tools-row");const b=m.querySelector(".bm-tools-power");const f=m.querySelector(".bm-tools-state");const g=()=>{const e=Boolean(r());b.setAttribute("aria-checked",String(e));b.title=e?n+" ausschalten":n+" einschalten";f.textContent=e?"Aktiv \xb7 Fenster \xf6ffnen":"Inaktiv"};u.bmSync=g;u.onclick=e=>{e.preventDefault();e.stopPropagation();if(!r())a(true);p.hidden=true;c.querySelector(".bm-tools-trigger").setAttribute("aria-expanded","false");o();g()};b.onclick=e=>{e.preventDefault();e.stopPropagation();a(!r());g()};g();return u}const D=(e,t)=>Math.max(0,Math.min(e,t));function T(){const e=f.map?.getContainer();return{x:Math.max(0,(e?.clientWidth||0)-(f.panel?.offsetWidth||0)),y:Math.max(0,(e?.clientHeight||0)-(f.panel?.offsetHeight||0))}}function P(e,t){if(!f.panel)return;const n=T();f.panel.style.left=`${Math.round(D(e,n.x))}px`;f.panel.style.top=`${Math.round(D(t,n.y))}px`}function I(){const e=T();b.position={x:e.x?(parseFloat(f.panel.style.left)||0)/e.x:0,y:e.y?(parseFloat(f.panel.style.top)||0)/e.y:0};g()}function K(){if(!f.panel)return;const e=T();P(b.position?D(b.position.x,1)*e.x:Math.min(54,e.x),b.position?D(b.position.y,1)*e.y:Math.min(13,e.y))}function q(e,t=false){const n=f.panel?.querySelector(".bm-info");if(n){n.textContent=e;n.dataset.error=String(t)}}function G(){const e=f.map;const n=f.L;const o=document.createElement("div");o.id=t;if(!b.expanded)o.classList.add("bm-docked");if(!f.toolActive)o.classList.add("bm-off");const a=x(o,"div","bm-head");const r=x(a,"span","bm-title","BOS Ausbauplaner");x(r,"small","","BRUHN MEDIA | Made to Work");x(a,"span","bm-grip","\u283f").title="Fenster verschieben";const i=x(a,"button","bm-toggle",b.expanded?"\u2212":"+");i.type="button";i.title="Fenster einklappen und Abfragen pausieren";i.setAttribute("aria-label","Ausbauplaner einklappen und Abfragen pausieren");const s=x(o,"div","bm-body");s.hidden=!b.expanded;const l=x(s,"div","bm-sub");x(l,"span","","Alle Standorte pr\xfcfen \u2013 vorhanden, ungekl\xe4rt und noch nicht nachgebaut");x(l,"b","","NDS \xb7 OSM");const d=x(s,"div","bm-section");x(d,"div","bm-label","Standortarten");for(const[e,t]of p){const n=x(d,"div","bm-label",e);n.style.marginTop="7px";const o=x(d,"div","bm-grid");for(const e of t){const t=c[e];const n=x(o,"label","bm-choice");const a=x(n,"input");a.type="checkbox";a.checked=b.categories[e];a.addEventListener("change",()=>{b.categories[e]=a.checked;g();V()});const r=x(n,"i","bm-dot");r.style.backgroundColor=t.color;x(n,"span","",t.label)}}const u=x(s,"div","bm-section");x(u,"div","bm-label","Abgleich anzeigen");const m=x(u,"div","bm-legend");const h=[["missing","#d9534f","Ohne Zuordnung"],["review","#e5a52f","Pr\xfcfen"],["matched","#3c995c","Wahrscheinlich da"]];for(const[e,t,n]of h){const o=x(m,"label");const a=x(o,"input");a.type="checkbox";a.checked=b.show[e];a.addEventListener("change",()=>{b.show[e]=a.checked;g();R()});const r=x(o,"i","bm-statusdot");r.style.background=t;x(o,"span","",n)}const v=x(s,"div","bm-section");x(v,"div","bm-label","Suchradius f\xfcr wahrscheinliche Treffer");const y=x(v,"select","bm-select");for(const e of[150,300,500,800]){const t=x(y,"option","",`${e} m`);t.value=String(e)}y.value=String(b.radius);y.addEventListener("change",()=>{b.radius=Number(y.value);g();V()});const w=x(s,"div","bm-actions");const k=x(w,"button","bm-btn primary","\u21bb Daten aktualisieren");k.type="button";k.onclick=()=>H(true);const A=x(w,"button","bm-btn","Position zur\xfcck");A.type="button";A.onclick=()=>{b.position=null;g();K()};const S=x(s,"div","bm-info","Pr\xfcfe Kartendaten \u2026");S.setAttribute("role","status");S.setAttribute("aria-live","polite");const E=x(s,"div","bm-counts");for(const[e,t,n]of[["matched","#3c995c","Wahrscheinlich da"],["review","#bd8321","Pr\xfcfen"],["missing","#d9534f","Ohne Zuordnung"]]){const o=x(E,"div","bm-count");const a=x(o,"strong",`bm-stat-${e}`,"\u2013");a.style.color=t;x(o,"span","",n)}const z=x(s,"div","bm-section");x(z,"div","bm-label","Offene Standorte & Pr\xfcff\xe4lle");x(z,"div","bm-list");const $=x(s,"div","bm-foot");x($,"span","","Planungshilfe \xb7 Kein automatischer Bau \xb7 ");const L=x($,"a","","\xa9 OpenStreetMap-Mitwirkende");L.href="https://www.openstreetmap.org/copyright";L.target="_blank";L.rel="noopener noreferrer";z.classList.add("bm-results");const _=x(s,"details","bm-filters");x(_,"summary","bm-filter-title","Filter & Suchradius");_.appendChild(d);_.appendChild(u);_.appendChild(v);i.setAttribute("aria-expanded",String(b.expanded));function F(e){if(e===!b.expanded&&f.dockButton)return;if(e){I();M();q("Pausiert. Beim \xd6ffnen wird der aktuelle Kartenausschnitt gepr\xfcft.")}b.expanded=!e;g();s.hidden=e;o.classList.toggle("bm-docked",e);i.setAttribute("aria-expanded",String(!e));i.textContent=e?"+":"\u2212";f.dockButton?.bmSync?.();if(!e){K();H()}}i.addEventListener("click",()=>F(true));let C=null;a.addEventListener("pointerdown",e=>{if(e.button!==0||i.contains(e.target))return;C={id:e.pointerId,x:e.clientX,y:e.clientY,left:parseFloat(o.style.left)||0,top:parseFloat(o.style.top)||0};a.classList.add("dragging");a.setPointerCapture?.(e.pointerId);e.preventDefault();e.stopPropagation()});a.addEventListener("pointermove",e=>{if(!C||C.id!==e.pointerId)return;P(C.left+e.clientX-C.x,C.top+e.clientY-C.y);e.preventDefault();e.stopPropagation()});const N=e=>{if(!C||C.id!==e.pointerId)return;if(a.hasPointerCapture?.(e.pointerId))a.releasePointerCapture(e.pointerId);C=null;a.classList.remove("dragging");I();e.stopPropagation()};a.addEventListener("pointerup",N);a.addEventListener("pointercancel",N);n.DomEvent.disableClickPropagation(o);n.DomEvent.disableScrollPropagation(o);e.getContainer().appendChild(o);f.panel=o;f.reopen=()=>F(false);f.dockButton=W("bm-lss-dock-bos","\u25a3","BOS Ausbauplaner",f.reopen,Z,()=>f.toolActive);K()}function O(e){const t=document.createElement("div");t.className="bm-bos-popup";const n=e.site;x(t,"b","",n.name||c[n.category].label);x(t,"div","",c[n.category].label);const o={matched:"Wahrscheinlich bereits nachgebaut",review:"Zuordnung manuell pr\xfcfen",missing:"Kein passendes Spielgeb\xe4ude in der N\xe4he ermittelt"};x(t,"div","",o[e.kind]);if(e.building){x(t,"div","",`${e.kind==="missing"?"N\xe4chstes vergleichbares Spielgeb\xe4ude":"Zugeordnetes Spielgeb\xe4ude"}: ${e.building.name} (${e.meters} m)`);const n=x(t,"a","","Spielgeb\xe4ude \xf6ffnen \u2197");n.href=`/buildings/${e.building.id}`;n.target="_blank";n.rel="noopener noreferrer";x(t,"span",""," \xb7 ")}if(n.approximate){x(t,"div","","Referenz: Feuerwehr best\xe4tigt, Lage nur n\xe4herungsweise. Bitte den Standort manuell pr\xfcfen.");const e=x(t,"a","","Nachweis der Ortsfeuerwehr \u2197");e.href=n.sourceUrl;e.target="_blank";e.rel="noopener noreferrer"}else{const e=x(t,"a","","OSM-Eintrag \u2197");e.href=`https://www.openstreetmap.org/${n.id}`;e.target="_blank";e.rel="noopener noreferrer"}return t}function R(){if(!f.map||!f.layer||!f.toolActive||!b.expanded)return;M();f.layer.clearLayers();f.markers.clear();if(!f.own||!f.readyReal)return;const e=f.map.getBounds();let t=0;const n={matched:0,review:0,missing:0};const o=[];for(const e of f.analyzed){n[e.kind]++;if(e.kind!=="matched")o.push(e);if(!b.show[e.kind])continue;if(t>=s)continue;const a=e.site;const r={missing:"#d9534f",review:"#e6a229",matched:"#449c63"}[e.kind];const i=`${c[a.category].short}`;const l=f.L.divIcon({className:"",html:i,iconSize:[36,33],iconAnchor:[18,16]});const d=f.L.marker([a.lat,a.lon],{icon:l,keyboard:true,riseOnHover:true}).bindPopup(O(e)).addTo(f.layer);f.markers.set(a.id,d);t++}const a=[["matched","Wahrscheinlich da"],["review","Pr\xfcfen"],["missing","Ohne Zuordnung"]];for(const[e]of a){const t=f.panel?.querySelector(`.bm-stat-${e}`);if(t)t.textContent=String(n[e])}const r=f.panel?.querySelector(".bm-list");if(r){r.replaceChildren();if(!o.length)x(r,"div","","Keine offenen Standorte im sichtbaren Ausschnitt.").style.padding="8px";o.sort((e,t)=>(e.kind==="missing"?0:1)-(t.kind==="missing"?0:1));for(const e of o.slice(0,80)){const t=x(r,"button","bm-place");t.type="button";t.dataset.kind=e.kind;const n=x(t,"i","bm-statusdot");n.style.background=e.kind==="missing"?"#d9534f":"#e5a52f";const o=x(t,"span","bm-place-text");x(o,"span","bm-place-name",(e.site.name||c[e.site.category].label)+(e.site.approximate?" \xb7 Lage ungef\xe4hr":""));const a=e.building?`${e.building.name} \xb7 ${e.meters} m`:"Kein vergleichbares Spielgeb\xe4ude im Umkreis von 12 km";x(o,"span","bm-place-detail",`${e.kind==="missing"?"Ohne Zuordnung":"Bitte pr\xfcfen"} \xb7 ${a}`);t.title=`${c[e.site.category].label}: Standort auf der Karte \xf6ffnen`;t.onclick=()=>{if(!b.show[e.kind]){b.show[e.kind]=true;const t=f.panel.querySelectorAll(".bm-legend input");const n=e.kind==="missing"?0:e.kind==="review"?1:2;if(t[n])t[n].checked=true;g();R()}f.map.setView([e.site.lat,e.site.lon],Math.max(f.map.getZoom(),15));setTimeout(()=>f.markers.get(e.site.id)?.openPopup(),80)}}}q(`${f.analyzed.length} reale Standorte im Kartenausschnitt \xb7 ${f.own.length} eigene Spielgeb\xe4ude geladen \xb7 ${f.loadedTiles} Datenkacheln \xb7 ${t} Marker angezeigt${t===s?" (Limit erreicht)":""}`)}function V(){if(!f.map||!f.own||!f.readyReal)return;const e=f.map.getBounds();const t=f.real.filter(t=>b.categories[t.category]&&e.contains([t.lat,t.lon]));f.analyzed=E(t,f.own,b.radius).map(e=>e.site.approximate?{...e,kind:"review"}:e);R()}async function j(e=false){if(!f.map||!f.layer||!f.toolActive)return;const t=++f.seq;if(f.map.getZoom()i){f.layer.clearLayers();f.readyReal=false;q(`Kartenausschnitt zu gro\xdf (${n.length} Rasterfelder). Bitte n\xe4her heranzoomen.`);return}const o=new AbortController;f.abort=o;f.processing=true;q("Lade reale Standorte und deine Spielgeb\xe4ude \u2026");try{const[a,r]=await Promise.all([F(e,o.signal),_(e,o.signal)]);if(t!==f.seq)return;const i=await N(n,a,o.signal);if(t!==f.seq)return;f.real=S(i);f.own=r;f.readyReal=true;f.processing=false;f.lastError="";V()}catch(e){if(t!==f.seq)return;o.abort();f.readyReal=false;f.processing=false;f.layer.clearLayers();f.lastError=e?.message||String(e);q(`Vergleich nicht verf\xfcgbar: ${f.lastError}. Es werden keine fehlenden Wachen behauptet.`,true)}}function H(e=false){M();if(!f.toolActive||!b.expanded)return;const t=++f.seq;f.timer=setTimeout(()=>{if(t===f.seq)j(e)},e?0:400)}function U(){if(!f.toolActive||!b.expanded)return;if(f.readyReal)V();H()}function Z(e){e=Boolean(e);if(f.toolActive===e)return;f.toolActive=e;GM_setValue(o,String(e));if(!e){M();f.layer?.clearLayers();f.markers.clear();f.panel?.classList.add("bm-off")}else{f.panel?.classList.remove("bm-off");f.reopen?.();H(true)}f.dockButton?.bmSync?.()}function J(){const e=typeof unsafeWindow==="undefined"?window:unsafeWindow;const t=e.map,n=e.L;if(!t||!n||typeof t.getBounds!=="function"||typeof t.getContainer!=="function"||typeof n.layerGroup!=="function"||typeof n.divIcon!=="function")return;if(t===f.map){if(!f.dockButton?.isConnected&&f.reopen)f.dockButton=W("bm-lss-dock-bos","\u25a3","BOS Ausbauplaner",f.reopen,Z,()=>f.toolActive);return}M();if(f.map)try{f.map.off("moveend zoomend",U);f.map.off("resize",K);f.map.removeLayer(f.layer);f.panel?.remove()}catch(e){}f.map=t;f.L=n;B();f.layer=n.layerGroup().addTo(t);G();t.on("moveend zoomend",U);t.on("resize",K);if(f.toolActive)H()}J();setInterval(J,3500)})();if(r.share)(()=>{"use strict";if(window.__bmLssAllianceShareV1)return;window.__bmLssAllianceShareV1=true;const e="bruhnmedia_alliance_share_enabled";const t="bruhnmedia_alliance_share_min_credits";const n="bruhnmedia_alliance_share_requested_v1";const o=72*60*60*1e3;const a=1e3;const r="bm-lss-navbar-tools";const i="bm-share-action";const s=new Intl.NumberFormat("de-DE");const l=new Set;const d=E();const c=new Set;const p=new Map;let u=false;let m=null;let b=String(GM_getValue(e,"true"))!=="false";let f=$(GM_getValue(t,6e3));let g=null;let h=null;let x=null;let v=null;let y=null;let w=null;let k=null;let A=null;let S=0;function E(){let e;try{e=JSON.parse(String(GM_getValue(n,"{}")))}catch{e={}}if(!e||typeof e!=="object"||Array.isArray(e))e={};const t=Date.now();const r=Object.entries(e).filter(([e,n])=>/^\d+$/.test(e)&&typeof n==="number"&&Number.isFinite(n)&&n<=t&&n>t-o).sort((e,t)=>t[1]-e[1]).slice(0,a);return new Map(r)}function z(e){if(!/^\d+$/.test(e))return;const t=Date.now();d.set(e,t);const r=[...d.entries()].filter(([e,n])=>/^\d+$/.test(e)&&Number.isFinite(n)&&n<=t&&n>t-o).sort((e,t)=>t[1]-e[1]).slice(0,a);d.clear();for(const[e,t]of r)d.set(e,t);GM_setValue(n,JSON.stringify(Object.fromEntries(r)))}function $(e){if(e===null||e===void 0||String(e).trim()==="")return 6e3;const t=Number(e);return Number.isFinite(t)?Math.max(0,Math.min(1e6,Math.round(t))):6e3}function M(){if(document.getElementById("bm-share-css"))return;const e=document.createElement("style");e.id="bm-share-css";e.textContent=`\n #mission_list .bm-share-action {display:flex;align-items:center;justify-content:flex-end;gap:7px;flex-wrap:wrap;padding:5px 8px;margin:3px 0 0;border-top:1px solid #edf0f5;background:#f8f9fb;font:11px/1.4 Arial,Helvetica,sans-serif;color:#555}\n #mission_list .bm-share-value {white-space:nowrap;font-size:10px;color:#666}\n #mission_list .bm-share-button {background:#bf2836;color:#fff;border:1px solid #bf2836;border-radius:7px;padding:6px 10px;cursor:pointer;font:600 11px Arial,Helvetica,sans-serif;line-height:1.3;white-space:nowrap}\n #mission_list .bm-share-button:hover {background:#a51e2b;border-color:#a51e2b}\n #mission_list .bm-share-button:focus-visible {outline:2px solid #bf2836;outline-offset:2px}\n #mission_list .bm-share-button:disabled {background:#ddd;border-color:#ccc;color:#777;cursor:default}\n #mission_list .bm-share-message {flex:1 1 100%;font-size:10px;color:#666;text-align:right}\n #mission_list .bm-share-message[data-error='true'] {color:#b52b27}\n #${r} .bm-share-config {background:#f5f6f9;padding:14px;border-top:1px solid #e0e4ec;font:11px Arial,sans-serif;color:#444}\n #${r} .bm-share-config[hidden] {display:none!important}\n #${r} .bm-share-config label {display:block;margin-bottom:6px;font-size:11px;font-weight:700}\n #${r} .bm-share-config input {box-sizing:border-box;width:100%;height:38px;padding:8px 10px;border:1px solid #dce1e9;border-radius:8px;background:white;color:#333;font:12px Arial,sans-serif}\n #${r} .bm-share-config p {margin:7px 0 0;font-size:10px;color:#777;line-height:1.4}\n #${r} .bm-share-option strong {white-space:nowrap}\n `;document.head.append(e)}function L(e,t){if(e&&e.textContent!==t)e.textContent=t}function _(e,t,n=false){const o=e?.querySelector(".bm-share-message");if(!o)return;o.textContent=t;o.dataset.error=String(n);o.hidden=false}function F(e){const t=e.getAttribute("data-sortable-by");if(t)try{const e=Number(JSON.parse(t).average_credits);if(Number.isFinite(e)&&e>=0)return e}catch{}const n=Number(e.getAttribute("mission_type_id"));return p.has(n)?p.get(n):null}function C(e){const t=e.getAttribute("mission_id")||(e.id||"").replace(/^mission_/,"");return/^\d+$/.test(t)?t:null}function N(e){if(e.classList.contains("panel-success")||e.classList.contains("mission_deleted"))return false;if(e.closest(".panel-success")||e.closest(".mission_deleted"))return false;const t=(e.getAttribute("data-mission-type-filter")||"").toLowerCase();if(t==="alliance"||t==="alliance_mission")return false;const n=(e.getAttribute("data-mission-state-filter")||"").toLowerCase();if(n==="finished"||n==="completed")return false;return Boolean(C(e))}async function B(){if(u)return;u=true;m=(async()=>{try{const e=new AbortController;const t=setTimeout(()=>e.abort(),12e3);let n;try{n=await fetch("/einsaetze.json",{credentials:"same-origin",signal:e.signal})}finally{clearTimeout(t)}if(!n.ok)return;const o=await n.json();const a=Array.isArray(o)?o:Object.values(o||{});for(const e of a){const t=Number(e?.id);const n=Number(e?.average_credits);if(Number.isInteger(t)&&Number.isFinite(n)&&n>=0)p.set(t,n)}G()}catch{}})();await m}function W(e,t,n){const o=document.createElement("div");o.className=i;o.dataset.missionId=t;const a=document.createElement("span");a.className="bm-share-value";const r=document.createElement("button");r.type="button";r.className="bm-share-button";r.textContent="Im Verband teilen";r.addEventListener("click",e=>{e.preventDefault();e.stopPropagation();if(!b||c.has(t)||l.has(t)||d.has(t))return;if(o.dataset.openManually==="true"){window.location.assign("/missions/"+t);return}void I(t,o,r)});const s=document.createElement("span");s.className="bm-share-message";s.hidden=true;o.append(a,r,s);e.append(o);D(o,t,n)}function D(e,t,n){L(e.querySelector(".bm-share-value"),`${s.format(n)} \xd8 Credits`);const o=e.querySelector(".bm-share-button");if(l.has(t)||d.has(t)){o.disabled=true;L(o,"Freigabe gesendet");o.title="Freigabe angefordert. Den tats\xe4chlichen Status bitte im Einsatz kontrollieren.";if(!l.has(t))_(e,"Freigabe nach Neuladen lokal vorgemerkt. Status im Einsatz kontrollieren.")}else if(c.has(t)){o.title="";o.disabled=true;L(o,"Wird gepr\xfcft \u2026")}else{o.title="";o.disabled=false;L(o,e.dataset.openManually==="true"?"Einsatz \xf6ffnen":"Im Verband teilen")}}function T(e,t){const n=e?.getAttribute("href")||e?.getAttribute("data-url")||e?.getAttribute("data-href");if(!n)return null;let o;try{o=new URL(n,location.origin)}catch{return null}if(o.origin!==location.origin||!o.pathname.startsWith("/missions/"+t+"/"))return null;const a=(e.getAttribute("data-turbo-method")||e.getAttribute("data-method")||"GET").toUpperCase();if(a!=="GET"&&a!=="POST")return null;return{url:o,method:a}}async function P(e,t=false){const n={Accept:"text/html"};if(t)n["X-Requested-With"]="XMLHttpRequest";const o=await fetch("/missions/"+e,{method:"GET",credentials:"same-origin",redirect:"follow",headers:n});if(!o.ok||/\/(users\/sign_in|login|sessions)(\/|$)/i.test(new URL(o.url).pathname))throw new Error("Die Einsatzansicht konnte nicht geladen werden.");return(new DOMParser).parseFromString(await o.text(),"text/html")}async function I(e,t,n){if(!/^\d+$/.test(e)||!b)return;c.add(e);n.disabled=true;n.textContent="Wird gepr\xfcft \u2026";_(t,"Freigabe wird gepr\xfcft.");try{let o=null;let a=null;for(const t of[false,true]){a=await P(e,t);const n=a.querySelector("#mission_alliance_share_btn");o=T(n,e);if(o)break}if(!o){t.dataset.openManually="true";_(t,"Freigabe nicht direkt verf\xfcgbar. Bitte Einsatz \xf6ffnen.",true);return}if(!b)return;n.textContent="Wird geteilt \u2026";_(t,"Verbandsfreigabe wird gesendet.");const r={Accept:"text/html, application/xhtml+xml"};const i={method:o.method,credentials:"same-origin",redirect:"follow",headers:r};if(o.method==="POST"){const e=a.querySelector('meta[name="csrf-token"]')?.content||document.querySelector('meta[name="csrf-token"]')?.content;if(!e)throw new Error("Sicherheitsbest\xe4tigung fehlt. Einsatz \xf6ffnen.");r["X-CSRF-Token"]=e;r["Content-Type"]="application/x-www-form-urlencoded; charset=UTF-8";i.body=new URLSearchParams({authenticity_token:e}).toString()}const s=await fetch(o.url.pathname+o.url.search,i);if(!s.ok||/\/(users\/sign_in|login|sessions)(\/|$)/i.test(new URL(s.url).pathname))throw new Error("Freigabe nicht best\xe4tigt. Bitte Einsatz \xf6ffnen.");l.add(e);z(e);_(t,"Freigabe angefordert und gespeichert. Status im Einsatz kontrollieren.")}catch(e){t.dataset.openManually="true";_(t,e instanceof Error?e.message:"Freigabe fehlgeschlagen.",true)}finally{c.delete(e);D(t,e,Number(t.querySelector(".bm-share-value").textContent.replace(/[^\d]/g,""))||0)}}function K(){if(y)y.textContent=b?`${S} passende Eins\xe4tze \xb7 ab ${s.format(f)} \xd8 Credits`:"Inaktiv";if(v){v.setAttribute("aria-checked",String(b));v.title=b?"Erkennung deaktivieren":"Erkennung aktivieren"}}function q(){g=null;const e=document.querySelector("#mission_list");if(!e)return;S=0;const t=e.querySelectorAll('[mission_id][mission_type_id], [id^="mission_"][mission_type_id]');let n=false;t.forEach(e=>{const t=e.querySelector(`:scope > .${i}`);const o=C(e);const a=F(e);if(a===null)n=true;if(!b||!N(e)||a===null||a{t.preventDefault();t.stopPropagation();b=!b;GM_setValue(e,String(b));K();G()});o.append(a,c);const p=document.createElement("div");p.className="bm-share-config";p.hidden=true;const u=document.createElement("label");u.textContent="Mindestverdienst (\xd8 Credits)";u.htmlFor="bm-share-minimum";const m=document.createElement("input");m.id="bm-share-minimum";m.type="number";m.min="0";m.max="1000000";m.step="100";m.value=String(f);m.addEventListener("click",e=>e.stopPropagation());m.addEventListener("change",()=>{f=$(m.value);m.value=String(f);GM_setValue(t,f);G();K()});const g=document.createElement("p");g.textContent="Passende Eins\xe4tze werden markiert. Jede Freigabe erfolgt einzeln per Klick.";p.append(u,m,g);a.addEventListener("click",e=>{e.preventDefault();e.stopPropagation();p.hidden=!p.hidden;if(!p.hidden)m.focus()});n.append(o,p);v=c;y=d;w=m;k=p;A=a;K()}function R(){const e=document.querySelector("#mission_list");if(!e||h===e)return;if(x)x.disconnect();h=e;x=new MutationObserver(G);x.observe(e,{childList:true,subtree:true,attributes:true,attributeFilter:["data-sortable-by","class"]});G()}M();O();R();setInterval(()=>{O();R()},2500)})();if(r.fleet)(()=>{"use strict";if(window.__bruhnMediaFleetAuditBeta3)return;window.__bruhnMediaFleetAuditBeta3=true;const e="bm-fuhrpark-tuev",n="bm-lss-navbar-tools";const o="bm_fleet_audit_position_v1";const a=8e3,r=30,i=150,s=20,l=15;const d={vehicles:[],buildings:new Map,loadedAt:0,loading:false,abort:null,complete:false,findings:[],filter:"all",query:"",shown:i,ui:null,lastError:"",notice:"",totalExpected:null,epoch:0,trainingAbort:null,compareAbort:null,catalog:null,trainingChecks:new Map,trainingBusy:false,trainingCancel:false,trainingMessage:"",trainingError:"",buildingRows:[],buildingChecks:new Map,buildingBusy:false,buildingCancel:false,buildingAbort:null,buildingMessage:"",buildingFilter:"trained",buildingQuery:"",buildingShown:40,vehiclesByBuilding:new Map,compareBusy:false,compareError:""};function c(){++d.epoch;d.abort?.abort();d.trainingAbort?.abort();d.buildingAbort?.abort();d.compareAbort?.abort();if(d.loading)d.notice="Fuhrparkpr\xfcfung angehalten. Erneut starten, um aktuelle Daten zu laden.";if(d.trainingBusy)d.trainingMessage="Ausbildungspr\xfcfung angehalten. Gepr\xfcfte Ergebnisse bleiben erhalten.";if(d.buildingBusy)d.buildingMessage="Wachenpr\xfcfung angehalten. Gepr\xfcfte Ergebnisse bleiben erhalten.";if(d.compareBusy)d.compareError="Abgleich angehalten.";d.loading=false;d.trainingBusy=false;d.buildingBusy=false;d.compareBusy=false;d.abort=null;d.trainingAbort=null;d.buildingAbort=null;d.compareAbort=null;d.trainingCancel=true;d.buildingCancel=true;B()}function p(){c();if(d.ui)d.ui.hidden=true}const u=new Intl.NumberFormat("de-DE");const m=`\n #${e}{position:fixed;top:165px;left:70px;width:495px;max-width:calc(100vw - 14px);height:min(70vh,670px);max-height:calc(100vh - 16px);z-index:11050;background:#fff;color:#333;border:1px solid #cfcfcf;box-shadow:0 7px 25px #0004;border-radius:5px;display:flex;flex-direction:column;font:12px/1.45 Arial,sans-serif}\n #${e}[hidden]{display:none!important}\n #${e} *,#${e} *:before,#${e} *:after{box-sizing:border-box}\n #${e} .bmft-head{background:#d53132;color:#fff;padding:9px 12px;display:flex;gap:10px;align-items:center;justify-content:space-between;cursor:move;user-select:none;touch-action:none}\n #${e} .bmft-head strong{font-size:13px}#${e} .bmft-head small{font-size:10px;opacity:.9}\n #${e} .bmft-close{font:700 19px Arial;background:transparent;border:0;color:#fff;cursor:pointer;padding:0 5px}\n #${e} .bmft-body{overflow:auto;flex:1;min-height:0;padding:13px;overscroll-behavior:contain}\n #${e} .bmft-intro{color:#555;font-size:11px;margin:0 0 10px}\n #${e} .bmft-actions{display:flex;gap:6px;flex-wrap:wrap;align-items:center;margin-bottom:9px}\n #${e} button.bmft-btn{background:#d43c3c;color:white;border:1px solid #c13434;padding:7px 12px;border-radius:3px;font:700 11px Arial;cursor:pointer}\n #${e} button.bmft-btn:disabled{background:#c1c1c1;border-color:#aaa;cursor:default}\n #${e} button.bmft-btn-secondary{background:#fff;color:#333;border:1px solid #bbb}\n #${e} .bmft-status{margin:8px 0;padding:8px 9px;background:#f3f5f7;border-radius:4px;color:#555;font-size:11px}\n #${e} .bmft-status[data-error=true]{background:#fff0ef;color:#8e2a28}\n #${e} .bmft-cards{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:7px;margin:8px 0 12px}\n #${e} .bmft-card{border:1px solid #e0e0e0;border-radius:4px;padding:9px;background:#fafafa}\n #${e} .bmft-card strong{font-size:21px;display:block;color:#333}\n #${e} .bmft-card span{font-size:10px;color:#686868}\n #${e} .bmft-filterline{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:9px}\n #${e} input,#${e} select{min-width:0;flex:1;padding:7px;border:1px solid #ccc;border-radius:3px;background:#fff;color:#333;font:11px Arial}\n #${e} select{flex:0 1 190px}\n #${e} .bmft-results{display:flex;flex-direction:column;gap:6px}\n #${e} .bmft-item{border:1px solid #e5e5e5;border-left:3px solid #d8a039;padding:8px 10px;background:#fff}\n #${e} .bmft-item[data-kind=ok]{border-left-color:#4d9866}\n #${e} .bmft-item[data-kind=critical]{border-left-color:#cc3030;background:#fff6f4}\n #${e} .bmft-item[data-kind=verified]{border-left-color:#3b9869}\n #${e} .bmft-item[data-kind=unknown]{border-left-color:#bbb}\n #${e} .bmft-item strong{font-size:12px}#${e} .bmft-item a{color:#116baa;text-decoration:none}\n #${e} .bmft-item a:hover{text-decoration:underline}\n #${e} .bmft-tags{font-size:10px;color:#665632;margin-top:3px}\n #${e} .bmft-training{font-size:10px;margin-top:5px;color:#555}\n #${e} .bmft-training[data-status=missing]{color:#a32e2e;font-weight:700}\n #${e} .bmft-training[data-status=ok]{color:#247444}\n #${e} .bmft-training[data-status=unknown]{color:#826627}\n #${e} .bmft-sub{font-size:10px;color:#666;margin-top:3px}\n #${e} .bmft-station-panel{margin-top:16px;border-top:2px solid #e9e9e9;padding-top:8px}\n #${e} .bmft-station-panel summary{font-size:13px;font-weight:700;color:#bc2e30;cursor:pointer;padding:8px 0}\n #${e} .bmft-station-item{border:1px solid #ddd;border-left:3px solid #3a9364;padding:8px;margin:6px 0}\n #${e} .bmft-station-item[data-status=unknown]{border-left-color:#c99b47}\n #${e} .bmft-station-item[data-status=none]{border-left-color:#aaa}\n #${e} .bmft-station-item[data-gap=true]{border-left-color:#c63a3a;background:#fff8f7}\n #${e} .bmft-need{border:1px solid #dedede;border-radius:3px;padding:6px 8px;margin-top:6px;background:#f7f8fa;color:#555;font-size:10px}\n #${e} .bmft-need[data-result=gap]{background:#fff0ee;border-color:#dfb1ac;color:#982e29}\n #${e} .bmft-need[data-result=covered]{background:#eef8ef;border-color:#b9dcc0;color:#236d37}\n #${e} .bmft-need[data-result=unclear]{background:#fff9ed;border-color:#e5d0a0;color:#81621d}\n #${e} .bmft-need a{font-weight:normal}\n\n #${e} .bmft-station-item a{color:#116baa;font-weight:700}\n #${e} .bmft-courses{font-size:11px;margin-top:5px;overflow-wrap:anywhere}\n #${e} .bmft-foot{font-size:10px;color:#777;border-top:1px solid #eee;margin-top:11px;padding-top:7px}\n #bmft-fallback{position:fixed;left:11px;bottom:33px;z-index:11049;background:#b42b2f;color:#fff;border:1px solid #fff8;border-radius:4px;padding:8px 11px;font:700 11px Arial;cursor:pointer;box-shadow:0 3px 10px #0004}\n #${n} #bmft-dock-row{cursor:pointer}\n #${n} #bmft-dock-row .bm-tools-option{cursor:pointer}\n @media(max-width:650px){#${e}{width:calc(100vw - 16px);left:8px;top:70px;height:min(78vh,670px)}#${e} .bmft-cards{gap:5px}}\n\n #${e}{width:620px;height:min(78vh,800px);border:1px solid #e0e4ec;border-radius:16px;overflow:hidden;box-shadow:0 18px 55px #17243b40;color:#253044}\n #${e} .bmft-head{padding:18px 20px;background:linear-gradient(115deg,#a61e2c,#d12e3b);gap:14px}\n #${e} .bmft-head strong{display:block;font-size:22px;letter-spacing:-.3px}\n #${e} .bmft-head small{display:block;font-size:11px;color:#ffe4e7;margin-top:5px;opacity:1}\n #${e} .bmft-close{width:34px;height:34px;flex:0 0 34px;border:1px solid #ffffff45;border-radius:9px;background:#ffffff12;font-size:23px}\n #${e} .bmft-close:hover{background:#ffffff25}\n #${e} .bmft-body{padding:18px 20px;background:#f5f6f9}\n #${e} .bmft-intro{font-size:12px;line-height:1.65;color:#667085;margin-bottom:16px}\n #${e} .bmft-actions{gap:8px;margin-bottom:12px}\n #${e} button.bmft-btn{padding:10px 12px;border-radius:8px;background:#bf2836;border-color:#bf2836;font-size:11px}\n #${e} button.bmft-btn:hover:not(:disabled){filter:brightness(.96)}\n #${e} button.bmft-btn-secondary{background:#fff;color:#475467;border-color:#dce1e9}\n #${e} button.bmft-btn:disabled{background:#e9ecf2;color:#8a93a2;border-color:#e9ecf2}\n #${e} button:focus-visible,#${e} input:focus-visible,#${e} select:focus-visible,#${e} summary:focus-visible{outline:2px solid #bf2836;outline-offset:3px}\n #${e} .bmft-status{padding:11px 12px;background:#fff;border:1px solid #e0e4ec;border-radius:9px;line-height:1.6;color:#667085}\n #${e} .bmft-status[data-error=true]{border-color:#edc3c7;background:#fff0f2;color:#a32231}\n #${e} .bmft-cards{grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;margin:16px 0}\n #${e} .bmft-card{background:#fff;border-color:#e0e4ec;border-radius:11px;padding:13px}\n #${e} .bmft-card:first-child{grid-column:span 2;background:#fff0f2;border-color:#efd2d7}\n #${e} .bmft-card strong{font-size:26px;line-height:1.2;color:#253044;margin-bottom:6px}\n #${e} .bmft-card:first-child strong{color:#b52332}\n #${e} .bmft-card span{font-size:11px;color:#667085;line-height:1.5}\n #${e} input,#${e} select{border-color:#dce1e9;border-radius:8px;padding:10px;font-size:12px}\n #${e} .bmft-filterline{gap:8px;margin-bottom:12px}\n #${e} .bmft-results{gap:9px}\n #${e} .bmft-item,#${e} .bmft-station-item{border-radius:10px;padding:12px;background:#fff;border-top-color:#e0e4ec;border-right-color:#e0e4ec;border-bottom-color:#e0e4ec}\n #${e} .bmft-item strong{font-size:13px}\n #${e} .bmft-tags,#${e} .bmft-training,#${e} .bmft-sub{font-size:11px;line-height:1.6;margin-top:6px}\n #${e} .bmft-item[data-kind=critical]{background:#fff3f4}\n #${e} .bmft-station-panel{margin-top:20px;border-top:1px solid #dce1e9}\n #${e} .bmft-station-panel summary{font-size:15px;padding:14px 0;color:#253044}\n #${e} .bmft-need{border-radius:7px;padding:9px 10px;line-height:1.6}\n #${e} .bmft-foot{font-size:11px;line-height:1.6;color:#667085}\n @media(max-width:650px){#${e}{width:calc(100vw - 16px);height:80vh}#${e} .bmft-head,#${e} .bmft-body{padding:14px}#${e} .bmft-cards{grid-template-columns:repeat(2,minmax(0,1fr))}}\n `;function b(e,t,n,o){const a=document.createElement(e);if(t)a.className=t;if(n!==void 0&&n!==null)a.textContent=String(n);if(o)o.append(a);return a}function f(e){if(e===null||e===void 0||e==="")return null;const t=Number(e);return Number.isFinite(t)&&t>=0?t:null}function g(e){const t=String(e??"");return/^\d+$/.test(t)?t:null}function h(e){return String(e.caption||e.name||"Fahrzeug #"+e.id).trim().slice(0,150)}function x(e){const t=g(e.vehicle_type??e.type);const n=t!==null?d.catalog?.[t]:null;const o=n?.staff?.training;if(!o||typeof o!=="object")return[];const a=new Map;for(const e of Object.values(o)){if(!e||typeof e!=="object")continue;for(const[t,n]of Object.entries(e)){if(!t||!n||typeof n!=="object")continue;const e=n.all===true;const o=e?0:f(n.min);if(!e&&!(o>0))continue;const r=a.get(t);a.set(t,{slug:t,all:e||Boolean(r?.all),min:Math.max(r?.min||0,o||0)})}}return[...a.values()]}function v(e){return String(e).replace(/[_-]/g," ").trim()}function y(e,t){const n=(new DOMParser).parseFromString(e,"text/html");if(!n.querySelector("#personal_table"))throw new Error("Personal-Tabelle nicht erkennbar.");const o=[...n.querySelectorAll("#personal_table tr[data-filterable-by]")];const a=o.filter(e=>e.querySelector("a.btn-assigned"));const r=f(t.assigned_personnel_count);if(r!==null&&a.length!==r)throw new Error("Personalz\xe4hlung widerspr\xfcchlich ("+a.length+"/"+r+").");return a.map(e=>{let t;try{t=JSON.parse(e.getAttribute("data-filterable-by")||"[]")}catch{throw new Error("Ausbildungsdaten konnten nicht gelesen werden.")}if(!Array.isArray(t))throw new Error("Unbekanntes Ausbildungsformat.");return{slugs:t.map(String),inTraining:/Im Unterricht/i.test(e.textContent||"")}})}function w(e,t,n){const o=d.catalog?.[String(e.vehicle_type??e.type)];const a=f(o?.staff?.min);const r=[];for(const e of n){const n=t.filter(t=>!t.inTraining&&t.slugs.includes(e.slug)).length;const o=e.all?Math.max(1,t.length,a||0):e.min;if(nObject.assign(Error("Pr\xfcfung abgebrochen."),{name:"AbortError"});if(e?.aborted)throw t();if(d.catalog)return d.catalog;const n=await new Promise((n,o)=>{let a,r=false;const i=(t,a)=>{if(r)return;r=true;e?.removeEventListener("abort",s);if(t)o(t);else n(a)};const s=()=>{i(t());a?.abort()};e?.addEventListener("abort",s,{once:true});try{a=GM_xmlhttpRequest({method:"GET",url:"https://api.lss-manager.de/de_DE/vehicles",timeout:12e3,onload:e=>{if(e.status<200||e.status>=300){i(Error("Fahrzeugkatalog: HTTP "+e.status));return}try{i(null,JSON.parse(e.responseText))}catch{i(Error("Fahrzeugkatalog ist kein g\xfcltiges JSON."))}},ontimeout:()=>i(Error("Zeit\xfcberschreitung beim Fahrzeugkatalog.")),onerror:()=>i(Error("Fahrzeugkatalog nicht erreichbar.")),onabort:()=>i(t())})}catch(e){i(e)}});if(e?.aborted)throw t();if(!n||typeof n!=="object"||Array.isArray(n)||Object.keys(n).length<10)throw Error("Fahrzeugkatalog hat ein unbekanntes Format.");d.catalog=n;return n}const A=e=>new Promise(t=>setTimeout(t,e));async function S(){if(d.loading||d.trainingBusy||d.buildingBusy||!d.loadedAt)return;const e=d.epoch,t=new AbortController;d.trainingAbort=t;d.trainingBusy=true;d.trainingCancel=false;d.trainingError="";d.trainingMessage="Lade Ausbildungsanforderungen \u2026";B();try{await k(t.signal);if(e!==d.epoch||t.signal.aborted)return;const n=d.vehicles.filter(e=>g(e.id)!==null&&!d.trainingChecks.has(String(e.id))&&x(e).length>0);if(!n.length){d.trainingMessage="Keine weiteren Spezialfahrzeuge f\xfcr diese Pr\xfcfung gefunden.";return}let o=0;for(const a of n.slice(0,s)){if(e!==d.epoch||t.signal.aborted)return;if(d.trainingCancel)break;try{const n=await fetch("/vehicles/"+a.id+"/zuweisung",{credentials:"same-origin",redirect:"follow",signal:t.signal,headers:{Accept:"text/html"}});const o=new URL(n.url);if(!n.ok||o.origin!==location.origin||!/^\/vehicles\/\d+\/zuweisung\/?$/.test(o.pathname))throw new Error("Zuweisungsseite nicht verf\xfcgbar.");const r=y(await n.text(),a);if(e!==d.epoch||t.signal.aborted)return;d.trainingChecks.set(String(a.id),w(a,r,x(a)))}catch(n){if(e!==d.epoch||t.signal.aborted)return;d.trainingChecks.set(String(a.id),{status:"unknown",text:"Nicht verl\xe4sslich pr\xfcfbar: "+(n instanceof Error?n.message:"Unbekannter Fehler")})}o++;d.trainingMessage=u.format(d.trainingChecks.size)+" Spezialfahrzeuge gepr\xfcft \xb7 aktueller Durchgang: "+o+"/"+Math.min(s,n.length)+".";d.findings=d.vehicles.map(_);B();if(!d.trainingCancel)await A(300)}if(e!==d.epoch||t.signal.aborted)return;if(d.trainingCancel)d.trainingMessage="Ausbildungspr\xfcfung angehalten.";else if(n.length>s)d.trainingMessage+=" Zum Fortsetzen erneut klicken.";else d.trainingMessage="Alle erkannten Spezialfahrzeuge gepr\xfcft."}catch(n){if(e!==d.epoch||t.signal.aborted)return;d.trainingError=n instanceof Error?n.message:"Ausbildungspr\xfcfung fehlgeschlagen."}finally{if(e===d.epoch){d.trainingBusy=false;d.trainingCancel=false;d.trainingAbort=null;B()}}}function E(e,t){const n=(new DOMParser).parseFromString(e,"text/html");const o=n.querySelector("#personal_table");if(!o)throw new Error("Personaltabelle nicht erkennbar.");const a=[...o.querySelectorAll("tr[data-filterable-by]")];const r=f(t?.personnel_count??t?.personal_count);if(r!==null&&a.length!==r)throw new Error("Personalliste unvollst\xe4ndig ("+a.length+"/"+r+").");if(!a.length&&r===null)throw new Error("Keine \xfcberpr\xfcfbaren Personalzeilen.");const i=new Map;let s=0;for(const e of a){let t;try{t=JSON.parse(e.getAttribute("data-filterable-by")??"null")}catch{throw new Error("Ausbildungsdaten unlesbar.")}if(!Array.isArray(t))throw new Error("Unbekanntes Ausbildungsformat.");if(e.querySelector("span[data-education-key]")||/im Unterricht/i.test(e.textContent||"")){s++;continue}for(const e of new Set(t)){if(typeof e!=="string"||!e||e.length>90||!/^[a-z0-9:_-]+$/i.test(e))throw new Error("Ausbildungsk\xfcrzel nicht eindeutig.");i.set(e,(i.get(e)||0)+1)}}return{status:i.size?"trained":"none",courses:i,count:a.length,inProgress:s}}function z(e,t){if(!t||!["trained","none"].includes(t.status))return{status:"unknown",needs:[],message:"Wache nicht verl\xe4sslich gepr\xfcft."};if(!d.catalog)return{status:"unknown",needs:[],message:"Fahrzeugkatalog noch nicht geladen."};const n=d.vehiclesByBuilding.get(e)||[];const o=new Map;let a=0;let r=0;for(const e of n){const t=x(e);if(!t.length)continue;r++;const n=d.catalog[String(e.vehicle_type??e.type)];for(const r of t){const t=r.all?f(n?.staff?.min):f(r.min);if(!(t>0)){a++;continue}if(!o.has(r.slug))o.set(r.slug,{slug:r.slug,required:0,vehicles:[]});const i=o.get(r.slug);i.required+=t;i.vehicles.push({id:g(e.id),name:h(e)})}}const i=[...o.values()].map(e=>{const n=t.courses instanceof Map?t.courses.get(e.slug)||0:0;const o=Math.max(0,e.required-n);return{...e,existing:n,gap:o,status:o?"gap":"covered"}}).sort((e,t)=>t.gap-e.gap||e.slug.localeCompare(t.slug,"de"));return{status:i.some(e=>e.gap)?"gap":a?"unknown":"covered",needs:i,unquantifiable:a,specialists:r,message:!r?"Keine Spezialfahrzeuge mit bekannten Ausbildungsanforderungen.":!i.length?"Mindestbedarf der Spezialfahrzeuge nicht sicher bezifferbar.":""}}async function $(){if(!d.loadedAt||d.loading||d.trainingBusy||d.buildingBusy||d.compareBusy||!d.buildingChecks.size)return;const e=d.epoch,t=new AbortController;d.compareAbort=t;d.compareBusy=true;d.compareError="";M();try{await k(t.signal)}catch(n){if(e!==d.epoch||t.signal.aborted)return;d.compareError="Fahrzeugkatalog nicht verf\xfcgbar: "+(n instanceof Error?n.message:"Unbekannter Fehler")}finally{if(e===d.epoch){d.compareBusy=false;d.compareAbort=null;M()}}}function M(){if(!d.ui)return;const e=d.ui.querySelector("#bmft-building-status");if(!e)return;e.textContent=d.buildingMessage||"Erst Fuhrpark laden, danach Wachen pr\xfcfen.";const t=d.ui.querySelector("#bmft-building-scan");t.disabled=!d.loadedAt||d.loading||d.trainingBusy||d.buildingBusy||!d.buildingRows.length;t.textContent=d.buildingBusy?"\u{1f393} Wachen werden gepr\xfcft \u2026":"\u{1f393} N\xe4chste 15 Wachen pr\xfcfen";const n=d.ui.querySelector("#bmft-building-compare");if(n){n.disabled=!d.loadedAt||d.loading||d.trainingBusy||d.buildingBusy||d.compareBusy||!d.buildingChecks.size;n.textContent=d.compareBusy?"\u{1f517} Vergleich l\xe4uft \u2026":"\u{1f517} Ausbildungsbedarf abgleichen"}const o=d.ui.querySelector("#bmft-building-compare-status");if(o){o.textContent=d.compareError||(d.catalog?"Fahrzeugbedarf mit den gepr\xfcften Wachen abgeglichen.":"Zum Vergleichen \u201eAusbildungsbedarf abgleichen\u201c w\xe4hlen.");o.dataset.error=String(Boolean(d.compareError))}const a=[...d.buildingChecks].map(([e,t])=>({id:e,...t,name:d.buildings.get(e)||"Wache #"+e}));const r=a.filter(e=>e.status==="trained").length;const i=a.map(e=>({...e,comparison:z(e.id,e)}));const s=i.filter(e=>e.comparison.status==="gap").length;d.ui.querySelector("#bmft-building-summary").textContent=a.length+" von "+d.buildingRows.length+" Wachen gepr\xfcft \xb7 "+r+" mit Ausbildungen"+(d.catalog?" \xb7 "+s+" mit theoretischem Ausbildungsfehlbedarf":"")+(a.length(d.buildingFilter==="all"||d.buildingFilter===e.status||d.buildingFilter==="gaps"&&e.comparison.status==="gap")&&(!d.buildingQuery||(e.name+" "+(e.courses?[...e.courses.keys()].join(" "):"")+" "+e.comparison.needs.map(e=>e.slug).join(" ")).toLocaleLowerCase("de-DE").includes(d.buildingQuery))).sort((e,t)=>Number(t.comparison.status==="gap")-Number(e.comparison.status==="gap")||(t.status==="trained")-(e.status==="trained")||(t.courses?.size||0)-(e.courses?.size||0)||e.name.localeCompare(t.name,"de"));const c=d.ui.querySelector("#bmft-building-results");c.replaceChildren();if(!l.length)b("div","bmft-status","Noch keine passenden gepr\xfcften Wachen.",c);for(const e of l.slice(0,d.buildingShown)){const t=b("div","bmft-station-item",null,c);t.dataset.status=e.status;t.dataset.gap=String(e.comparison.status==="gap");const n=b("a","",e.name,t);n.href="/buildings/"+e.id;n.target="_blank";n.rel="noopener noreferrer";const o=e.status==="unknown"?"Nicht auswertbar: "+e.error:e.status==="none"?"Keine abgeschlossene Sonderausbildung nachgewiesen.":e.count+" Personen gepr\xfcft \xb7 "+e.courses.size+" Ausbildungsarten"+(e.inProgress?" \xb7 "+e.inProgress+" in Ausbildung nicht mitgez\xe4hlt":"");b("div","bmft-sub",o,t);if(e.status==="trained"){const n=[...e.courses].sort((e,t)=>t[1]-e[1]).map(([e,t])=>v(e)+": "+t).join(" \xb7 ");b("div","bmft-courses",n,t)}if(d.catalog&&["trained","none"].includes(e.status)){if(e.comparison.message)b("div","bmft-sub",e.comparison.message,t);for(const n of e.comparison.needs){const e=b("div","bmft-need",null,t);e.dataset.result=n.status;b("strong","",(n.gap?"\u26a0 Theoretischer Fehlbedarf: ":"\u2713 Bedarf rechnerisch gedeckt: ")+v(n.slug)+" \xb7 "+n.existing+" vorhanden / "+n.required+" ben\xf6tigt"+(n.gap?" \xb7 Differenz "+n.gap:""),e);const o=b("div","bmft-sub","Fahrzeuge: ",e);for(const[e,t]of n.vehicles.slice(0,4).entries()){if(e)b("span",""," \xb7 ",o);if(t.id){const e=b("a","",t.name,o);e.href="/vehicles/"+t.id;e.target="_blank";e.rel="noopener noreferrer"}else b("span","",t.name,o)}if(n.vehicles.length>4)b("span",""," \xb7 +"+(n.vehicles.length-4)+" weitere",o)}if(e.comparison.unquantifiable){const n=b("div","bmft-need","Bei "+e.comparison.unquantifiable+" Anforderungen ist die Mindestzahl nicht eindeutig.",t);n.dataset.result="unclear"}}}const p=d.ui.querySelector("#bmft-building-more");p.hidden=l.length<=d.buildingShown;p.textContent="Weitere Wachen anzeigen ("+(l.length-d.buildingShown)+")"}async function L(){if(d.loading||d.trainingBusy||d.buildingBusy||!d.loadedAt)return;const e=d.epoch;d.buildingBusy=true;d.buildingCancel=false;const t=d.buildingRows.filter(e=>g(e.id)&&!d.buildingChecks.has(String(e.id))).slice(0,l);if(!t.length){d.buildingBusy=false;d.buildingMessage="Alle verf\xfcgbaren Wachen gepr\xfcft.";M();return}const n=new AbortController;d.buildingAbort=n;let o=0;try{for(const a of t){if(e!==d.epoch||n.signal.aborted)return;if(d.buildingCancel)break;const r=String(a.id);try{const t=await fetch("/buildings/"+r+"/personals",{credentials:"same-origin",redirect:"follow",signal:n.signal,headers:{Accept:"text/html"}});if(!t.ok||new URL(t.url).pathname!=="/buildings/"+r+"/personals")throw new Error("Personalansicht nicht verf\xfcgbar.");const o=await t.text();if(e!==d.epoch||n.signal.aborted)return;d.buildingChecks.set(r,E(o,a))}catch(t){if(e!==d.epoch)return;if(n.signal.aborted)break;d.buildingChecks.set(r,{status:"unknown",error:t instanceof Error?t.message:"Abruf fehlgeschlagen."})}o++;d.buildingMessage="Wachenpr\xfcfung: "+o+"/"+t.length+" in diesem Durchgang.";M();if(!d.buildingCancel)await A(450)}if(e!==d.epoch)return;d.buildingMessage=d.buildingCancel?"Wachenpr\xfcfung abgebrochen.":"Wachenpr\xfcfung abgeschlossen. F\xfcr weitere Wachen erneut klicken."}finally{if(e===d.epoch){d.buildingBusy=false;d.buildingCancel=false;d.buildingAbort=null;M()}}}function _(e){const t=f(e.assigned_personnel_count);const n=f(e.alarm_delay);const o=[];if(t===0)o.push("Keine fest zugewiesenen Kr\xe4fte");if(e.ignore_aao===true)o.push("In AAO ausgeschlossen");if(n!==null&&n>0)o.push("Alarmverz\xf6gerung: "+u.format(n)+" s");const a=d.trainingChecks.get(String(e.id))||null;if(a?.status==="missing")o.push("Ausbildung fehlt an der Fahrzeugbesatzung");return{id:g(e.id),buildingId:g(e.building_id),name:h(e),type:String(e.vehicle_type_caption||e.vehicle_type||"Typ unbekannt"),personnel:t,delay:n,flags:o,training:a,kind:a?.status==="missing"?"critical":o.length?"check":a?.status==="ok"?"verified":t===null?"unknown":"ok"}}function F(e){const t=new URL(e,location.origin);if(t.origin!==location.origin||!/^\/api\/v2\/(?:vehicles|buildings)\/?$/.test(t.pathname))throw new Error("API hat eine unerwartete Folgeseite zur\xfcckgegeben.");return t.pathname+t.search}async function C(e,n){return t(e,n)}async function N(e,t,n){const o=[],i=new Set,s=new Set;let l="/api/v2/"+e+"?limit="+a;let d=null;let c=false;for(let a=0;l&&a=d}return{rows:o,expected:d,complete:c}}function B(){if(!d.ui)return;const e=d.ui.querySelector(".bmft-status");e.textContent=d.lastError||d.notice||"Klicke auf \u201eFuhrpark pr\xfcfen\u201c. Es werden nur lesende API-Anfragen ausgef\xfchrt.";e.dataset.error=String(Boolean(d.lastError));M();const t=d.ui.querySelector("#bmft-check");t.disabled=d.loading;t.textContent=d.loading?"Pr\xfcfung l\xe4uft \u2026":"\u21bb Fuhrpark pr\xfcfen";const n=d.ui.querySelector("#bmft-training-check");if(n){n.disabled=d.loading||d.trainingBusy||d.buildingBusy||!d.loadedAt;n.textContent=d.trainingBusy?"\u{1f393} Pr\xfcfe Ausbildungen \u2026":"\u{1f393} Weitere Ausbildungen pr\xfcfen"}const o=d.ui.querySelector("#bmft-training-status");if(o){o.textContent=d.trainingError||d.trainingMessage||"Ausbildungspr\xfcfung separat starten: maximal 20 Spezialfahrzeuge pro Klick.";o.dataset.error=String(Boolean(d.trainingError))}const a={all:d.vehicles.length,personnel:d.findings.filter(e=>e.personnel===0).length,aao:d.vehicles.filter(e=>e.ignore_aao===true).length,delay:d.findings.filter(e=>e.delay!==null&&e.delay>0).length,training:d.findings.filter(e=>e.training?.status==="missing").length};for(const[e,t]of Object.entries(a)){const n=d.ui.querySelector('[data-counter="'+e+'"]');if(n)n.textContent=u.format(t)}const r=d.findings.filter(e=>{const t=d.filter;if(t==="personnel"&&e.personnel!==0)return false;if(t==="aao"&&!e.flags.includes("In AAO ausgeschlossen"))return false;if(t==="delay"&&!(e.delay!==null&&e.delay>0))return false;if(t==="unknown"&&e.personnel!==null)return false;if(t==="training"&&e.training?.status!=="missing")return false;if(t==="check"&&e.flags.length===0)return false;if(d.query&&!(e.name+" "+e.type+" "+(d.buildings.get(e.buildingId)||"")).toLocaleLowerCase("de-DE").includes(d.query))return false;return true});const s=d.ui.querySelector(".bmft-results");s.replaceChildren();if(d.loadedAt&&!r.length)b("div","bmft-status","Keine Fahrzeuge f\xfcr diesen Filter gefunden.",s);for(const e of r.slice(0,d.shown)){const t=b("div","bmft-item",null,s);t.dataset.kind=e.kind;const n=b("strong","",null,t);if(e.id){const t=b("a","",e.name,n);t.href="/vehicles/"+e.id;t.target="_blank";t.rel="noopener noreferrer"}else n.textContent=e.name;const o=d.buildings.get(e.buildingId);const a=b("div","bmft-sub",e.type+" \xb7 Personal fest zugewiesen: "+(e.personnel===null?"nicht \xfcbermittelt":u.format(e.personnel)),t);if(o&&e.buildingId){a.append(document.createTextNode(" \xb7 "));const t=b("a","",o,a);t.href="/buildings/"+e.buildingId;t.target="_blank";t.rel="noopener noreferrer"}b("div","bmft-tags",e.flags.length?"Pr\xfcfen: "+e.flags.join(" \xb7 "):e.kind==="unknown"?"Keine verl\xe4ssliche Personalangabe \u2013 nicht bewertet":"Keine Auff\xe4lligkeit nach diesen Pr\xfcfkriterien",t);if(e.training){const n=b("div","bmft-training",e.training.text,t);n.dataset.status=e.training.status}}const l=d.ui.querySelector("#bmft-more");l.hidden=r.length<=d.shown;l.textContent="Weitere anzeigen ("+Math.min(i,Math.max(0,r.length-d.shown))+" von "+u.format(r.length-d.shown)+")";const c=d.ui.querySelector("#bmft-filter-count");c.textContent=d.loadedAt?u.format(r.length)+" von "+u.format(d.vehicles.length)+" Fahrzeugen"+(d.complete?"":" \xb7 unvollst\xe4ndige Daten"):"Noch keine Daten geladen"}async function W(){if(d.loading||d.trainingBusy||d.buildingBusy)return;const e=d.epoch;d.loading=true;d.lastError="";d.notice="Lade Fahrzeugliste \u2026";d.shown=i;const t=new AbortController;d.abort=t;B();try{const n=await N("vehicles",t.signal,(e,t)=>{d.notice=u.format(e)+(t===null?"":" von "+u.format(t))+" Fahrzeugen eingelesen \u2026";B()});if(e!==d.epoch||t.signal.aborted)return;let o={rows:[],complete:false};try{o=await N("buildings",t.signal)}catch(e){if(t.signal.aborted)throw e;d.notice="Geb\xe4udenamen konnten nicht geladen werden; Fahrzeugpr\xfcfung bleibt m\xf6glich."}if(e!==d.epoch||t.signal.aborted)return;const a=new Map;for(const e of o.rows){const t=g(e.id);if(t)a.set(t,String(e.caption||e.name||"Wache #"+t).slice(0,130))}d.vehicles=n.rows;d.trainingChecks.clear();d.trainingMessage="";d.trainingError="";d.buildingChecks.clear();d.buildingMessage="";d.buildingShown=40;d.compareError="";d.vehiclesByBuilding=new Map;for(const e of n.rows){const t=g(e.building_id);if(t){if(!d.vehiclesByBuilding.has(t))d.vehiclesByBuilding.set(t,[]);d.vehiclesByBuilding.get(t).push(e)}}d.buildingRows=o.rows.filter(e=>g(e.id)!==null&&f(e.personnel_count??e.personal_count)!==0);d.buildings=a;d.findings=n.rows.map(_);d.totalExpected=n.expected;d.complete=n.complete;d.loadedAt=Date.now();d.notice=(n.complete?"Pr\xfcfung abgeschlossen: ":"Teilpr\xfcfung: ")+u.format(n.rows.length)+" Fahrzeuge erfasst."+(!n.complete?" Achtung: Die API-Liste ist nicht vollst\xe4ndig; Ergebnis nicht als Gesamtbestand werten.":"")+(!o.complete?" Nicht alle Geb\xe4udenamen verf\xfcgbar.":"")+" Keine \xc4nderungen im Spiel vorgenommen."}catch(n){if(e!==d.epoch)return;d.lastError=n instanceof Error?n.message:"Abruf fehlgeschlagen.";if(t.signal.aborted)d.lastError="Pr\xfcfung abgebrochen."}finally{if(e===d.epoch){d.loading=false;d.abort=null;B()}}}function D(){if(d.ui)return d.ui;const t=b("section","",null,document.body);t.id=e;t.hidden=true;t.setAttribute("aria-label","BRUHN MEDIA Fuhrpark-T\xdcV");const n=b("div","bmft-head",null,t);const a=b("div","bmft-heading",null,n);b("strong","","Fuhrpark-T\xdcV",a);b("small","","BRUHN MEDIA | Made to Work",a);const r=b("button","bmft-close","\xd7",n);r.type="button";r.title="Schlie\xdfen";r.addEventListener("click",p);const s=b("div","bmft-body",null,t);b("p","bmft-intro","Fuhrpark-Audit: Personal, AAO, Alarmverz\xf6gerung und eine separate Ausbildungspr\xfcfung f\xfcr Spezialfahrzeuge. Keine Spielaktionen.",s);const l=b("div","bmft-actions",null,s);const u=b("button","bmft-btn","\u21bb Fuhrpark pr\xfcfen",l);u.id="bmft-check";u.type="button";u.addEventListener("click",W);const m=b("button","bmft-btn bmft-btn-secondary","Abbrechen",l);m.type="button";m.addEventListener("click",c);const f=b("button","bmft-btn bmft-btn-secondary","\u{1f393} Weitere Ausbildungen pr\xfcfen",l);f.id="bmft-training-check";f.type="button";f.addEventListener("click",S);const g=b("button","bmft-btn bmft-btn-secondary","\u{1f393} Wachen-Ausbildungen",l);g.type="button";g.addEventListener("click",()=>{A.open=true;A.scrollIntoView({block:"nearest"})});b("div","bmft-status","Bereit f\xfcr die erste Pr\xfcfung.",s).setAttribute("role","status");const h=b("div","bmft-status","Ausbildungen noch nicht gepr\xfcft.",s);h.id="bmft-training-status";h.setAttribute("role","status");const x=b("div","bmft-cards",null,s);for(const[e,t]of[["all","Fahrzeuge geladen"],["personnel","Ohne feste Personalzuweisung"],["aao","In AAO ausgeschlossen"],["delay","Mit Alarmverz\xf6gerung"],["training","Ausbildungsdefizite am Fahrzeug"]]){const n=b("div","bmft-card",null,x);const o=b("strong","","0",n);o.dataset.counter=e;b("span","",t,n)}const v=b("div","bmft-filterline",null,s);const y=b("select","",null,v);for(const[e,t]of[["all","Alle Fahrzeuge"],["check","Auff\xe4lligkeiten"],["personnel","Keine Personalzuweisung"],["aao","AAO-Ausschluss"],["delay","Alarmverz\xf6gerung"],["training","Ausbildungsdefizit"],["unknown","Personalangabe unbekannt"]]){const n=b("option","",t,y);n.value=e}y.addEventListener("change",()=>{d.filter=y.value;d.shown=i;B()});const w=b("input","",null,v);w.type="search";w.placeholder="Fahrzeug oder Wache suchen \u2026";w.setAttribute("aria-label","Fuhrpark durchsuchen");w.addEventListener("input",()=>{d.query=w.value.trim().toLocaleLowerCase("de-DE");d.shown=i;B()});b("div","bmft-intro","Noch keine Daten geladen",s).id="bmft-filter-count";b("div","bmft-results",null,s);const k=b("button","bmft-btn bmft-btn-secondary","Weitere anzeigen",s);k.type="button";k.id="bmft-more";k.hidden=true;k.addEventListener("click",()=>{d.shown+=i;B()});b("div","bmft-foot","Ausbildungscheck: Der \xf6ffentliche LSS-Manager-Katalog liefert Fahrzeuganforderungen. Eigene Personalzuweisungen werden nur auf Klick und maximal 20 Fahrzeuge pro Durchgang gelesen. Fehlende Ausbildung bezieht sich auf die feste Fahrzeugbesatzung, nicht auf alle Kr\xe4fte der Wache. Die Spiel-Daten werden nicht an externe Dienste \xfcbertragen.",s);const A=b("details","bmft-station-panel",null,s);b("summary","","\u{1f393} Wachen & Ausbildungen",A);b("p","bmft-intro","Vorhandene Ausbildungen mit dem theoretischen Bedarf Deiner Spezialfahrzeuge vergleichen. Zuerst Wachen pr\xfcfen, dann abgleichen.",A);const E=b("div","bmft-actions",null,A);const z=b("button","bmft-btn","\u{1f393} N\xe4chste 15 Wachen pr\xfcfen",E);z.type="button";z.id="bmft-building-scan";z.addEventListener("click",L);const _=b("button","bmft-btn bmft-btn-secondary","\u{1f517} Ausbildungsbedarf abgleichen",E);_.type="button";_.id="bmft-building-compare";_.addEventListener("click",$);const F=b("button","bmft-btn bmft-btn-secondary","Abbrechen",E);F.type="button";F.addEventListener("click",()=>{d.buildingCancel=true;d.buildingAbort?.abort()});b("div","bmft-status","Noch keine Wachen gepr\xfcft.",A).id="bmft-building-status";b("div","bmft-status","Ausbildungsbedarf noch nicht verglichen.",A).id="bmft-building-compare-status";b("div","bmft-intro","Noch keine Daten geladen.",A).id="bmft-building-summary";const C=b("div","bmft-filterline",null,A);const N=b("select","",null,C);for(const[e,t]of[["trained","Mit Ausbildungen"],["all","Alle gepr\xfcften"],["none","Keine nachgewiesen"],["gaps","Theoretischer Fehlbedarf"],["unknown","Nicht auswertbar"]]){const n=b("option","",t,N);n.value=e}N.addEventListener("change",()=>{d.buildingFilter=N.value;M()});const D=b("input","",null,C);D.type="search";D.placeholder="Wache oder Ausbildung suchen \u2026";D.addEventListener("input",()=>{d.buildingQuery=D.value.trim().toLocaleLowerCase("de-DE");M()});b("div","bmft-results",null,A).id="bmft-building-results";const P=b("button","bmft-btn bmft-btn-secondary","Weitere Wachen",A);P.type="button";P.id="bmft-building-more";P.addEventListener("click",()=>{d.buildingShown+=40;M()});b("div","bmft-foot","Der Abgleich summiert die Ausbildungsmindestzahlen aller erfassten Spezialfahrzeuge einer Wache als theoretischen gleichzeitigen Bedarf pro Lehrgang. Keine Aussage \xfcber tats\xe4chliche Einsatzbereitschaft, Schichten, feste Fahrzeugbesetzung oder die kombinierte Verf\xfcgbarkeit mehrerer Qualifikationen. Noch nicht gepr\xfcfte Wachen bleiben unbewertet. Keine Spiel\xe4nderungen.",A);d.ui=t;T(t,n);let I;try{I=JSON.parse(String(GM_getValue(o,"null")))}catch{I=null}if(I&&Number.isFinite(I.left)&&Number.isFinite(I.top)){t.style.left=Math.max(0,Math.min(window.innerWidth-70,I.left))+"px";t.style.top=Math.max(0,Math.min(window.innerHeight-70,I.top))+"px"}B();return t}function T(e,t){let n=null;t.addEventListener("pointerdown",o=>{if(o.button!==0||o.target.closest("button"))return;n={x:o.clientX,y:o.clientY,left:e.getBoundingClientRect().left,top:e.getBoundingClientRect().top};t.setPointerCapture(o.pointerId)});t.addEventListener("pointermove",t=>{if(!n)return;const o=Math.max(0,Math.min(window.innerWidth-65,n.left+t.clientX-n.x));const a=Math.max(0,Math.min(window.innerHeight-65,n.top+t.clientY-n.y));e.style.left=Math.round(o)+"px";e.style.top=Math.round(a)+"px"});const a=()=>{if(!n)return;n=null;GM_setValue(o,JSON.stringify({left:parseFloat(e.style.left)||e.offsetLeft,top:parseFloat(e.style.top)||e.offsetTop}))};t.addEventListener("pointerup",a);t.addEventListener("pointercancel",a)}function P(){D().hidden=false}function I(){const e=document.querySelector("#"+n+" .bm-tools-dropdown");let t=document.getElementById("bmft-fallback");if(e){if(!document.getElementById("bmft-dock-row")){const t=b("div","bm-tools-row",null,e);t.id="bmft-dock-row";const n=b("button","bm-tools-option",null,t);n.type="button";b("span","bm-lss-dock-icon","\u{1f527}",n);const o=b("span","bm-tools-texts",null,n);b("strong","","Fuhrpark-T\xdcV",o);b("small","bm-tools-state","Fahrzeuge pr\xfcfen \xb7 Beta",o);n.addEventListener("click",e=>{e.preventDefault();e.stopPropagation();P()})}if(t)t.remove()}else if(!t){t=b("button","","\u{1f527} Fuhrpark-T\xdcV",document.body);t.type="button";t.id="bmft-fallback";t.addEventListener("click",P)}}const K=b("style","",m,document.head);K.id="bmft-css";I();setInterval(I,3e3)})();if(r.dashboard||r.alliance||r.centermap)(()=>{"use strict";const e="bm-extra-tools-panel";const n="bruhnmedia_centermap_v1";const o="bm-map-reset-control";const a=new Intl.NumberFormat("de-DE");const i=[{id:"dashboard",title:"Dashboard",icon:"\u25a4"},{id:"alliance",title:"Verbandsverwaltung",icon:"\u25a5"},{id:"centermap",title:"Kartensteuerung",icon:"\u2316"}].filter(e=>r[e.id]);let s=null;let l=null;let d=null;let c=null;function p(){c?.abort();c=null}function u(){p();const e=new AbortController;c=e;return e}function m(e){return c===e&&!e.signal.aborted&&s&&!s.hidden}const b=(e,t,n,o)=>{const a=document.createElement(t);if(n)a.className=n;if(o!==void 0&&o!==null)a.textContent=String(o);if(e)e.appendChild(a);return a};const f=(e,t)=>b(e,"p","bmex-note",t);const g=(e,t,n)=>{const o=b(e,"button","bmex-button",t);o.type="button";o.addEventListener("click",n);return o};const h=()=>{try{return typeof unsafeWindow!=="undefined"?unsafeWindow:window}catch{return window}};function x(){if(document.getElementById("bm-extra-styles"))return;const t=["#"+e+"[hidden]{display:none!important}","#"+e+"{position:fixed;inset:0;z-index:20055;background:#0009;display:flex;justify-content:center;align-items:center;padding:14px;font:13px/1.5 Arial,sans-serif;color:#333}","#"+e+" *{box-sizing:border-box}","#"+e+" .bmex-panel{background:#fff;border-radius:7px;width:min(100%,860px);max-height:92vh;overflow:hidden;display:flex;flex-direction:column;box-shadow:0 16px 40px #0005}","#"+e+" .bmex-header{padding:14px 19px;background:#c93035;color:#fff;display:flex;justify-content:space-between;align-items:center;gap:12px}","#"+e+" .bmex-header strong{font-size:17px}","#"+e+" .bmex-close{border:0;background:transparent;color:#fff;font:bold 22px Arial;cursor:pointer}","#"+e+" .bmex-body{padding:17px 20px;overflow:auto}","#"+e+" .bmex-actions{display:flex;gap:8px;flex-wrap:wrap;margin:12px 0}","#"+e+" .bmex-button{padding:7px 12px;border:1px solid #c9c9c9;border-radius:4px;background:#fff;cursor:pointer;color:#333;font:12px Arial,sans-serif}","#"+e+" .bmex-button:hover{background:#f5f5f5;border-color:#c93035}","#"+e+" .bmex-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(145px,1fr));gap:10px;margin:13px 0}","#"+e+" .bmex-kpi{padding:12px;border:1px solid #e4e4e4;border-radius:5px;min-width:0}","#"+e+" .bmex-kpi strong{display:block;font-size:23px;color:#c93035;overflow-wrap:anywhere}","#"+e+" .bmex-kpi span{font-size:11px;color:#555}","#"+e+" .bmex-note{font-size:12px;color:#666;line-height:1.55;margin:10px 0}","#"+e+" .bmex-error{color:#9c2424;background:#fff4f4;border-left:3px solid #c93035;padding:9px 11px}","#"+e+" .bmex-table{width:100%;border-collapse:collapse;margin:12px 0;font-size:12px}","#"+e+" .bmex-table th,#"+e+" .bmex-table td{padding:7px 9px;border-bottom:1px solid #eee;text-align:left}","#"+e+" .bmex-table th{background:#f5f5f5}","#"+e+" .bmex-controls{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:12px 0}","#"+e+" .bmex-controls label{font-size:12px}","#"+e+" .bmex-controls select{padding:7px;border:1px solid #bbb;border-radius:4px;background:#fff;color:#333}","#"+e+" .bmex-footer{padding:10px 19px;background:#fafafa;border-top:1px solid #eee;font-size:10px;color:#666}","#"+o+"{position:relative}","#"+o+" a{display:flex!important;align-items:center!important;justify-content:center!important;width:30px!important;height:30px!important;line-height:1!important}","#"+o+" a svg{display:block;width:20px;height:20px;pointer-events:none}","#"+o+"{display:flex!important;flex-direction:column!important}","#"+o+" a{border-bottom:0!important;border-radius:0!important}","#"+o+" a:first-child{border-radius:4px 4px 0 0!important}","#"+o+" a:last-child{border-left:0!important;border-top:1px solid #ccc;border-radius:0 0 4px 4px!important}","#"+o+' a[aria-disabled="true"]{opacity:.45}',"#"+o+" a:focus-visible{outline:2px solid #c93035;outline-offset:2px}","#"+e+" .bmcf-add,#"+e+" .bmcf-edit{display:flex;align-items:flex-end;gap:10px;flex-wrap:wrap}","#"+e+" .bmcf-add label{flex:1;min-width:180px;font-weight:700}","#"+e+" .bmcf-name{display:block;width:100%;box-sizing:border-box;padding:10px;border:1px solid #b9bec6;border-radius:5px;font:13px Arial;background:#fff;color:#333;margin-top:7px}","#"+e+" .bmcf-edit .bmcf-name{flex:1;min-width:160px}","#"+e+" .bmcf-primary{background:#c93035;color:#fff;border-color:#c93035}","#"+e+" .bmcf-primary:hover{background:#ab242a;color:#fff}","#"+e+" .bmcf-row{border:1px solid #e1e4e9;border-radius:8px;padding:14px 16px;margin:12px 0;background:#fff}","#"+e+" .bmcf-heading{display:flex;align-items:center;gap:10px;flex-wrap:wrap;overflow-wrap:anywhere}","#"+e+" .bmcf-heading strong{font-size:15px}","#"+e+" .bmcf-badge{font-size:11px;border-radius:12px;padding:3px 9px;background:#fff0f1;color:#a5262c}","#"+e+" .bmcf-actions{display:flex;gap:7px;flex-wrap:wrap}","#"+e+" .bmex-button:disabled{opacity:.5;cursor:default}","#"+e+" input:focus-visible,#"+e+" button:focus-visible{outline:2px solid #c93035;outline-offset:2px}","@media(pointer:coarse){#"+o+" a{width:44px!important;height:44px!important}#"+e+" .bmcf-actions button{min-height:44px}}","@media(max-width:600px){#"+e+"{padding:5px}#"+e+" .bmex-body{padding:12px}}",'#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]){background:rgba(18,24,34,.58);backdrop-filter:blur(3px)}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmex-panel{width:min(100%,1060px);border:1px solid #ffffff70;border-radius:18px;box-shadow:0 24px 80px #10182855}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmex-header{padding:22px 26px;background:linear-gradient(115deg,#a61e2c,#d12e3b)}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmex-header strong{font:700 25px/1.3 Arial;letter-spacing:-.4px}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmex-header strong::before{content:"BRUHN MEDIA";display:block;font:700 10px/1.4 Arial;letter-spacing:2px;color:#ffdae0;margin-bottom:6px}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmex-header strong::after{content:"Made to Work | Dein Spiel im \xdcberblick";display:block;font:12px/1.5 Arial;letter-spacing:0;color:#ffe4e7;margin-top:6px}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmex-close{width:36px;height:36px;flex:0 0 36px;border:1px solid #ffffff45;border-radius:9px;background:#ffffff12}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmex-body{padding:20px 26px;background:#f5f6f9}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmex-note{color:#667085;line-height:1.6}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmd-nav{padding:5px;background:#e9edf3;border-radius:11px;gap:5px;align-items:center}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmd-nav .bmex-button{border:0!important;border-radius:8px;padding:10px 13px;color:#667085;background:transparent;font-weight:700!important}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmd-nav .bmex-button[aria-pressed=true]{background:#fff;color:#a51e2b;box-shadow:0 1px 4px #25304414}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmd-nav .bmd-refresh{margin-left:auto;background:#bf2836;color:#fff}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmd-nav .bmd-refresh:hover{background:#a51e2b}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmd-status{padding:10px 12px;background:#fff;border:1px solid #e0e4ec;border-radius:9px;font-size:11px}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmex-kpis{gap:12px;margin:18px 0}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmex-kpi{padding:17px;border-color:#e0e4ec;border-radius:12px;background:#fff}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmex-kpi:first-child{background:#fff0f2;border-color:#efd2d7}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmex-kpi strong{font-size:29px;line-height:1.25;color:#253044;font-variant-numeric:tabular-nums}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmex-kpi:first-child strong{color:#b52332}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmex-kpi span{display:block;margin-top:7px;font-size:12px;color:#667085}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmd-columns{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;align-items:start}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmd-section{min-width:0}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) h3{font:700 15px/1.4 Arial;color:#253044;margin:15px 0 10px}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmd-table-wrap{width:100%;overflow:auto;max-height:430px;background:#fff;border:1px solid #e0e4ec;border-radius:11px;margin:12px 0}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmex-table{margin:0;font-size:12px;width:100%}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmex-table th{position:sticky;top:0;z-index:1;background:#edf0f5;color:#475467;font-size:11px;white-space:nowrap}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmex-table th,#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmex-table td{padding:11px 12px;border-color:#edf0f5}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmex-table td{color:#475467;overflow-wrap:anywhere}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmex-table tbody tr:nth-child(even){background:#fafbfc}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmex-table tbody tr:hover{background:#fff4f6}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmex-table .bmd-number{text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmex-controls{padding:13px;background:#fff;border:1px solid #e0e4ec;border-radius:11px;align-items:flex-end}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmex-controls label{color:#667085;display:flex;flex-direction:column;gap:6px;margin:0}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmex-controls input,#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmex-controls select{padding:10px;border:1px solid #dce1e9;border-radius:8px;font:12px Arial;background:#fff;color:#253044;min-width:0;box-sizing:border-box;height:38px;margin:0}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmex-controls input{flex:1;min-width:160px}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmex-button{border-color:#dce1e9;border-radius:8px;padding:9px 12px}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmex-footer{padding:12px 26px;background:#fff;border-color:#e0e4ec;color:#667085}','#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) button:focus-visible,#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) input:focus-visible,#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) select:focus-visible,#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmd-table-wrap:focus-visible{outline:2px solid #bf2836;outline-offset:2px}','@media(max-width:760px){#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmd-columns{grid-template-columns:1fr}#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmex-header,#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmex-body{padding:16px}#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmd-nav .bmd-refresh{margin-left:0}#bm-extra-tools-panel:is([data-module="dashboard"],[data-module="alliance"],[data-module="centermap"],[data-module="favorites"]) .bmex-kpis{grid-template-columns:repeat(2,minmax(0,1fr))}}'].join("\n");const n=['#bm-extra-tools-panel[data-module="alliance"] .bmex-header strong::after{content:"Made to Work | Dein Verband im \xdcberblick"}','#bm-extra-tools-panel[data-module="alliance"] .bma-refresh{background:#bf2836;color:#fff;border-color:#bf2836}','#bm-extra-tools-panel[data-module="alliance"] .bma-refresh:hover{background:#a51e2b}','#bm-extra-tools-panel[data-module="alliance"] .bma-history-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}','#bm-extra-tools-panel[data-module="alliance"] .bma-history-card{min-width:0;padding:16px;background:#fff;border:1px solid #e0e4ec;border-radius:12px}','#bm-extra-tools-panel[data-module="alliance"] .bma-history-card strong{display:block;color:#475467;font-size:12px;margin-bottom:12px}','#bm-extra-tools-panel[data-module="alliance"] .bma-history-card svg{display:block;background:#fff7f8;border-radius:7px}','#bm-extra-tools-panel[data-module="alliance"] .bma-empty{padding:20px;background:#fff;border:1px dashed #dce1e9;border-radius:12px}','@media(max-width:760px){#bm-extra-tools-panel[data-module="alliance"] .bma-history-grid{grid-template-columns:1fr}}'].join("");const a=['#bm-extra-tools-panel[data-module="centermap"] .bmex-header strong::after{content:"Made to Work | Deine Karte, dein \xdcberblick"}','#bm-extra-tools-panel[data-module="favorites"] .bmex-header strong::after{content:"Made to Work | Deine Lieblingsorte auf einen Klick"}','#bm-extra-tools-panel:is([data-module="centermap"],[data-module="favorites"]) .bmex-panel{width:min(100%,900px)}','#bm-extra-tools-panel[data-module="centermap"] .bmex-controls{display:grid;grid-template-columns:1fr;gap:0;padding:0;overflow:hidden}','#bm-extra-tools-panel[data-module="centermap"] .bmex-controls label{padding:16px 18px;gap:9px}','#bm-extra-tools-panel[data-module="centermap"] .bmex-controls select{width:100%;max-width:100%;height:42px}','#bm-extra-tools-panel[data-module="centermap"] .bmex-controls .bmc-check{display:flex;flex-direction:row;align-items:center;border-top:1px solid #edf0f5;cursor:pointer;gap:12px;color:#344054}','#bm-extra-tools-panel[data-module="centermap"] .bmex-controls input[type="checkbox"]{flex:0 0 18px;width:18px;height:18px;min-width:18px;padding:0;margin:0;accent-color:#bf2836}','#bm-extra-tools-panel[data-module="centermap"] .bmc-position{padding:16px 18px;border:1px solid #ead6da;border-radius:12px;background:#fff0f2}','#bm-extra-tools-panel[data-module="centermap"] .bmc-position strong{color:#a51e2b;font-size:14px;overflow-wrap:anywhere}','#bm-extra-tools-panel[data-module="centermap"] .bmc-position .bmex-note{margin-bottom:0;font-variant-numeric:tabular-nums}','#bm-extra-tools-panel:is([data-module="centermap"],[data-module="favorites"]) .bmc-primary,#bm-extra-tools-panel[data-module="favorites"] .bmcf-primary{background:#bf2836;color:#fff;border-color:#bf2836;min-height:40px}','#bm-extra-tools-panel:is([data-module="centermap"],[data-module="favorites"]) .bmc-primary:hover,#bm-extra-tools-panel[data-module="favorites"] .bmcf-primary:hover{background:#a51e2b;color:#fff}','#bm-extra-tools-panel[data-module="favorites"] .bmcf-add{padding:18px;background:#fff;border:1px solid #e0e4ec;border-radius:12px;margin:16px 0;align-items:flex-end}','#bm-extra-tools-panel[data-module="favorites"] .bmcf-add label{margin:0;font-size:12px;color:#475467}','#bm-extra-tools-panel[data-module="favorites"] .bmcf-name{margin:8px 0 0;border-color:#dce1e9;border-radius:8px;height:40px}','#bm-extra-tools-panel[data-module="favorites"] .bmcf-row{border-color:#e0e4ec;border-radius:12px;padding:18px;margin:12px 0;box-shadow:0 2px 5px #10182804}','#bm-extra-tools-panel[data-module="favorites"] .bmcf-row[data-default="true"]{border-color:#de8d98;box-shadow:inset 0 3px #bf2836}','#bm-extra-tools-panel[data-module="favorites"] .bmcf-heading{justify-content:space-between;color:#253044}','#bm-extra-tools-panel[data-module="favorites"] .bmcf-actions{border-top:1px solid #edf0f5;padding-top:12px;margin-top:14px}','#bm-extra-tools-panel[data-module="favorites"] .bmcf-go{background:#fff0f2;color:#b52332;border-color:#f1d5da;font-weight:700}','#bm-extra-tools-panel[data-module="favorites"] .bmcf-delete{margin-left:auto;color:#a51e2b}','#bm-extra-tools-panel[data-module="favorites"] .bmcf-edit{margin-top:12px}','@media(max-width:600px){#bm-extra-tools-panel[data-module="favorites"] .bmcf-add{padding:14px}#bm-extra-tools-panel[data-module="favorites"] .bmcf-add label{min-width:0;flex-basis:100%}#bm-extra-tools-panel[data-module="favorites"] .bmcf-add .bmcf-primary{width:100%}#bm-extra-tools-panel[data-module="favorites"] .bmcf-delete{margin-left:0}}'].join("");b(document.head,"style","",t+n+a).id="bm-extra-styles"}function v(){p();if(s)s.hidden=true;const e=d?.isConnected?d:document.querySelector(".bm-map-favorites-link");e?.focus()}function y(t,n){p();d=document.activeElement;x();if(!s){s=b(document.body,"div","");s.id=e;s.hidden=true;s.addEventListener("click",e=>{if(e.target===s)v()});const t=b(s,"section","bmex-panel");t.setAttribute("role","dialog");t.setAttribute("aria-modal","true");t.setAttribute("aria-labelledby","bmex-title");const n=b(t,"header","bmex-header");b(n,"strong","").id="bmex-title";g(n,"\xd7",v).className="bmex-close";l=b(t,"div","bmex-body");b(t,"footer","bmex-footer","\xa9 2026 BRUHN MEDIA | Alle Rechte vorbehalten.");document.addEventListener("keydown",e=>{if(e.key==="Escape"&&s&&!s.hidden){e.preventDefault();v()}if(e.key==="Tab"&&s&&!s.hidden&&s.dataset.module==="favorites"){const t=[...s.querySelectorAll("button, input, select, a[href]")].filter(e=>!e.disabled);const n=t[0],o=t[t.length-1];if(e.shiftKey&&document.activeElement===n){e.preventDefault();o?.focus()}else if(!e.shiftKey&&document.activeElement===o){e.preventDefault();n?.focus()}}})}s.querySelector("#bmex-title").textContent=n;s.dataset.module=t;l.replaceChildren();s.hidden=false;return l}function w(e,t,n){let o=e.querySelector(".bmex-kpis");if(!o)o=b(e,"div","bmex-kpis");const a=b(o,"div","bmex-kpi");b(a,"strong","",n);b(a,"span","",t)}function k(e,t,n){const o=b(e,"table","bmex-table");const a=b(o,"thead");const r=b(a,"tr");t.forEach(e=>b(r,"th","",e));const i=b(o,"tbody");for(const e of n){const t=b(i,"tr");e.forEach(e=>b(t,"td","",e))}return o}async function A(e,n){return t(e,n)}async function S(e,t,n){const o=new Set,a=new Set,r=[];let i="/api/v2/"+e+"?limit=250",s=null,l=false;for(let d=0;i&&d<100;d++){if(o.has(i))throw new Error("Wiederholte API-Seite erkannt.");o.add(i);const d=await A(i,n);if(n?.aborted)throw Object.assign(Error("Abfrage abgebrochen."),{name:"AbortError"});if(!Array.isArray(d?.result))throw new Error("Unerwartetes Format der "+e+"-API.");const c=Number(d.paging?.count_total);if(Number.isFinite(c)&&c>=0)s=c;for(const e of d.result){const t=Number(e?.id);if(Number.isSafeInteger(t)&&t>0&&!a.has(t)){a.add(t);r.push(e)}}if(t)t(r.length,s);if(d.paging?.next_page){const t=new URL(d.paging.next_page,location.origin);if(t.origin!==location.origin||t.pathname!=="/api/v2/"+e)throw new Error("Ung\xfcltige Folgeseite.");i=t.pathname+t.search}else{l=s===null||r.length>=s;i=null}}return{records:r,count:s,complete:l}}const E={0:"Feuerwehr",1:"Feuerwehrschule",2:"Rettungsdienst",3:"Rettungsdienstschule",4:"Krankenhaus",5:"Rettungshubschrauber",6:"Polizei",7:"Polizeischule",8:"Polizeihubschrauber",9:"THW",10:"THW-Bundesschule",11:"Bereitschaftspolizei",12:"Schnelleinsatzgruppe",15:"Wasserrettung",18:"Feuerwehr (Kleinwache)"};const z={0:"LF 20",1:"LF 10",2:"DLK 23",3:"ELW 1",4:"RW",5:"GW-A",6:"LF 8/6",7:"LF 20/16",8:"LF 10/6",9:"LF 16-TS",10:"GW-\xd6l",11:"GW-L2-Wasser",12:"GW-Messtechnik",13:"SW 1000",14:"SW 2000",15:"SW 2000-Tr",16:"SW Kats",17:"TLF 2000",18:"TLF 3000",19:"TLF 8/8",20:"TLF 8/18",21:"TLF 16/24-Tr",22:"TLF 16/25",23:"TLF 16/45",24:"TLF 20/40",25:"TLF 20/40-SL",26:"TLF 16",27:"GW-Gefahrgut",28:"RTW",29:"NEF",30:"HLF 20",31:"RTH",32:"FuStW",33:"GW-H\xf6henrettung",34:"ELW 2",35:"leBefKw",36:"MTW",37:"TSF-W",38:"KTW",39:"GKW",40:"MTW-TZ",41:"MzGW (FGr N)",42:"LKW K 9",43:"BRmG R",44:"Anh DLE",45:"MLW 5",46:"WLF",47:"AB-R\xfcst",48:"AB-Atemschutz",49:"AB-\xd6l",50:"GruKw",51:"F\xfcKW (Polizei)",52:"GefKw",53:"Dekon-P",54:"AB-Dekon-P",55:"KdoW-LNA",56:"KdoW-OrgL",57:"FwK",58:"KTW Typ B",59:"ELW 1 (SEG)",60:"GW-San",61:"Polizeihubschrauber",62:"AB-Schlauch",63:"GW-Taucher",64:"GW-Wasserrettung",65:"LKW 7 Lkr 19 tm",66:"Anh MzB",67:"Anh SchlB",68:"Anh MzAB",69:"Tauchkraftwagen",70:"MZB",71:"AB-MZB",72:"WaWe 10",73:"GRTW",74:"NAW",75:"FLF",76:"Rettungstreppe",77:"AB-Gefahrgut",78:"AB-Einsatzleitung",79:"SEK - ZF",80:"SEK - MTF",81:"MEK - ZF",82:"MEK - MTF",83:"GW-Werkfeuerwehr",84:"ULF mit L\xf6scharm",85:"TM 50",86:"Turbol\xf6scher",87:"TLF 4000",88:"KLF",89:"MLF",90:"HLF 10",91:"Rettungshundefahrzeug",92:"Anh Hund",93:"MTW-O",94:"DHuF\xfcKW",95:"Polizeimotorrad",96:"Au\xdfenlastbeh\xe4lter (allgemein)",97:"ITW",98:"Zivilstreifenwagen",100:"MLW 4",101:"Anh SwPu",102:"Anh 7",103:"FuStW (DGL)",104:"GW-L1",105:"GW-L2",106:"MTF-L",107:"LF-L",108:"AB-L",109:"MzGW SB",110:"NEA50",111:"NEA50",112:"NEA200",113:"NEA200",114:"GW-L\xfcfter",115:"Anh L\xfcfter",116:"AB-L\xfcfter",117:"AB-Tank",118:"Kleintankwagen",119:"AB-L\xf6sch",120:"Tankwagen",121:"GTLF",122:"LKW 7 Lbw (FGr E)",123:"LKW 7 Lbw (FGr WP)",124:"MTW-OV",125:"MTW-Tr UL",126:"MTF Drohne",127:"GW UAS",128:"ELW Drohne",129:"ELW2 Drohne",130:"GW-Bt",131:"Bt-Kombi",132:"FKH",133:"Bt LKW",134:"Pferdetransporter klein",135:"Pferdetransporter gro\xdf",136:"Anh Pferdetransport",137:"Zugfahrzeug Pferdetransport",138:"GW-Verpflegung",139:"GW-K\xfcche",140:"MTW-Verpflegung",141:"FKH",142:"AB-K\xfcche",143:"Anh Schlauch",144:"F\xfcKW (THW)",145:"F\xfcKomKW",146:"Anh F\xfcLa",147:"FmKW",148:"MTW-FGr K",149:"GW-Bergrettung (NEF)",150:"GW-Bergrettung",151:"ELW Bergrettung",152:"ATV",153:"Hundestaffel (Bergrettung)",154:"Schneefahrzeug",155:"Anh H\xf6henrettung (Bergrettung)",156:"Polizeihubschrauber mit verbauter Winde",157:"RTH Winde",158:"GW-H\xf6henrettung (Bergrettung)",159:"Seenotrettungskreuzer",160:"Seenotrettungsboot",161:"Hubschrauber (Seenotrettung)",162:"RW-Schiene",163:"HLF Schiene",164:"AB-Schiene",165:"LauKw",166:"PTLF 4000",167:"SLF",168:"Anh Sonderl\xf6schmittel",169:"AB-Sonderl\xf6schmittel",170:"AB-Wasser/Schaum",171:"GW TeSi",172:"LKW Technik (Notstrom)",173:"MTW TeSi",174:"Anh TeSi",175:"NEA50",176:"LKW 7 Lbw (FGr Log-V)",177:"MTW-FGr Log-V",178:"Anh 12 Lbw (FGr Log-V)",179:"AB-NEA50",180:"AB-NEA200",181:"MzGW (FGr BrB)",182:"Mobilkran",183:"Anh Plattform (FGr BrB)",184:"FuStW (AP)",185:"GW-Tierrettung"};function $(e){const t=Number(e?.vehicle_type);if(Number.isSafeInteger(t)&&t>=0&&z[t])return z[t];const n=e?.vehicle_type_caption;if(typeof n==="string"&&n.trim())return n.trim();return Number.isSafeInteger(t)&&t>=0?"Unbekannter Fahrzeugtyp (ID "+t+")":"Fahrzeugtyp unbekannt"}function M(){const e=y("dashboard","Dashboard");f(e,"\xdcbersicht, Fahrzeugstatus und Wachenplanung. Alle Angaben stammen aus Deiner Spiel-API. Es werden keine \xc4nderungen im Spiel vorgenommen.");const t=b(e,"div","bmex-actions bmd-nav");const n=f(e,"Noch keine Daten geladen.");n.className+=" bmd-status";n.setAttribute("role","status");const o=b(e,"div");const r=[{key:"overview",label:"\xdcbersicht"},{key:"vehicles",label:"Fahrzeugstatus"},{key:"stations",label:"Wachenplanung"}];let i="overview",s=null,l="",d="all",c=50;const p=new Map;function h(e){const t=Number(e);return Number.isFinite(t)&&t>=0?a.format(t):"\u2013"}function x(e){return Number.isSafeInteger(Number(e))&&Number(e)>0?String(e):null}function v(e){return String(e?.caption||e?.name||e?.vehicle_type_caption||"Ohne Bezeichnung").slice(0,140)}function A(e){const t=Number(e.fms_real??e.fms??e.fms_status);if(!Number.isFinite(t)||e.fms_real===void 0&&e.fms===void 0&&e.fms_status===void 0)return"Unbekannt";if([3,4,8].includes(t))return"Im Einsatz";if(t===5)return"Sprechwunsch";if(t===6)return"Status 6";if(t===7)return"Transport";if([1,2,9].includes(t))return"Verf\xfcgbar";return"Sonstiger Status "+t}function z(){for(const[e,t]of p){t.setAttribute("aria-pressed",String(e===i));t.style.borderColor=e===i?"#c93035":"#c9c9c9";t.style.fontWeight=e===i?"700":"400"}}function M(e){i=e;c=50;z();N()}for(const e of r){const n=g(t,e.label,()=>M(e.key));n.setAttribute("aria-pressed",String(e.key==="overview"));p.set(e.key,n)}g(t,"Daten neu laden",()=>{void B()}).className+=" bmd-refresh";function L(e,t,n,o,a=1){const r=b(e,"div","bmd-table-wrap");r.setAttribute("tabindex","0");r.setAttribute("role","region");r.setAttribute("aria-label",o);const i=k(r,t,n);for(const e of i.querySelectorAll("th"))e.setAttribute("scope","col");for(const e of i.querySelectorAll("tr"))[...e.children].forEach((e,t)=>{if(t>=a)e.className="bmd-number"})}function _(e,t){w(o,"Geb\xe4ude",h(e.length));w(o,"Fahrzeuge",h(t.length));const n=new Map,a=new Map;for(const t of e){const e=Number(t.building_type);const o=E[e]||"Geb\xe4udetyp "+e;n.set(o,(n.get(o)||0)+1)}for(const e of t){const t=$(e);a.set(t,(a.get(t)||0)+1)}const r=e=>[...e].sort((e,t)=>t[1]-e[1]||e[0].localeCompare(t[0],"de")).map(([e,t])=>[e,h(t)]);const i=b(o,"div","bmd-columns");const s=b(i,"section","bmd-section");b(s,"h3","","Geb\xe4ude nach Typ");L(s,["Geb\xe4udetyp","Anzahl"],r(n),"Geb\xe4ude nach Typ");const l=b(i,"section","bmd-section");b(l,"h3","","Fahrzeuge nach Typ");L(l,["Fahrzeugtyp","Anzahl"],r(a),"Fahrzeuge nach Typ")}function F(e){w(o,"Fahrzeuge gesamt",h(e.length));const t=new Map;for(const n of e){const e=$(n);if(!t.has(e))t.set(e,{name:e,all:0,available:0,onMission:0,request:0,transport:0,fms6:0,other:0});const o=t.get(e);o.all++;const a=A(n);if(a==="Verf\xfcgbar")o.available++;else if(a==="Im Einsatz")o.onMission++;else if(a==="Sprechwunsch")o.request++;else if(a==="Transport")o.transport++;else if(a==="Status 6")o.fms6++;else o.other++}const n=[...t.values()].sort((e,t)=>t.all-e.all||e.name.localeCompare(t.name,"de")).map(e=>[e.name,h(e.available),h(e.onMission),h(e.request),h(e.transport),h(e.fms6),h(e.other),h(e.all)]);const a=[...t.values()];w(o,"Verf\xfcgbar",h(a.reduce((e,t)=>e+t.available,0)));w(o,"Im Einsatz",h(a.reduce((e,t)=>e+t.onMission,0)));w(o,"Sprechwunsch",h(a.reduce((e,t)=>e+t.request,0)));L(o,["Fahrzeugtyp","Verf\xfcgbar","Im Einsatz","Sprechwunsch","Transport","Status 6","Unbekannt / Andere","Gesamt"],n,"Fahrzeugstatus nach Typ");f(o,"Fahrzeugstatus nach den vom Spiel gelieferten FMS-Werten. Unbekannte Angaben werden nicht als verf\xfcgbar gez\xe4hlt.")}function C(e,t){const n=new Map;for(const e of t){const t=x(e.building_id);if(t)n.set(t,(n.get(t)||0)+1)}w(o,"Wachen / Geb\xe4ude",h(e.length));const a=b(o,"div","bmex-controls");const r=b(a,"label","","Geb\xe4udetyp: ");const i=b(r,"select");const s=b(i,"option","","Alle Typen");s.value="all";const p=new Map;for(const t of e){const e=String(t.building_type);p.set(e,E[Number(e)]||"Geb\xe4udetyp "+e)}for(const[e,t]of[...p].sort((e,t)=>e[1].localeCompare(t[1],"de"))){const n=b(i,"option","",t);n.value=e}i.value=d;i.addEventListener("change",()=>{d=i.value;c=50;N()});const u=b(a,"input");u.type="search";u.placeholder="Wache suchen";u.value=l;u.setAttribute("aria-label","Wachen durchsuchen");u.addEventListener("change",()=>{l=u.value.trim().toLocaleLowerCase("de-DE");c=50;N()});const m=e.filter(e=>(d==="all"||String(e.building_type)===d)&&(!l||v(e).toLocaleLowerCase("de-DE").includes(l)));f(o,h(m.length)+" von "+h(e.length)+" Wachen / Geb\xe4uden");const y=m.slice(0,c).map(e=>{const t=x(e.id);const o=Number(e.personnel_count??e.personal_count);return[v(e),E[Number(e.building_type)]||"Typ "+e.building_type,h(e.level),h(Number.isFinite(o)?o:NaN),h(n.get(t)||0)]});L(o,["Wache","Typ","Stufe","Personal","Fahrzeuge"],y,"Wachenplanung",2);if(m.length>c)g(o,"Weitere 50 anzeigen",()=>{c+=50;N()});f(o,"Fahrzeuge je Wache anhand der Geb\xe4ude-ID zugeordnet. Personal- und Ausbaustufen werden nur angezeigt, soweit die Spiel-API sie liefert.")}function N(){o.replaceChildren();if(!s){f(o,"\xdcber \u201eDaten neu laden\u201c erh\xe4ltst Du die aktuelle \xdcbersicht.");return}if(i==="overview")_(s.buildings,s.vehicles);if(i==="vehicles")F(s.vehicles);if(i==="stations")C(s.buildings,s.vehicles)}async function B(){const e=u();n.textContent="Geb\xe4ude und Fahrzeuge werden eingelesen \u2026";s=null;N();try{const[t,o]=await Promise.all([S("buildings",null,e.signal),S("vehicles",null,e.signal)]);if(!m(e))return;if(!t.complete||!o.complete)throw new Error("Spiel-API hat nur einen Teil der Datens\xe4tze geliefert. Keine unvollst\xe4ndigen Summen anzeigen.");s={buildings:t.records,vehicles:o.records};n.textContent="Stand: "+(new Date).toLocaleString("de-DE")+" | "+h(s.buildings.length)+" Geb\xe4ude | "+h(s.vehicles.length)+" Fahrzeuge.";N()}catch(t){if(!m(e))return;e.abort();n.textContent="Dashboard-Daten nicht verf\xfcgbar.";o.replaceChildren();f(o,t.message).className="bmex-error"}}z();void B()}const L=()=>{const e=Number(h().alliance_id);const t=Number(h().user_id);return e>0&&t>0?"bruhnmedia_alliance_stats_"+t+"_"+e:null};function _(){const e=y("alliance","Verbandsverwaltung");f(e,"Verbandskasse, Credits, Mitglieder und Rang mit lokalem Verlauf der letzten 24 Stunden. Deine Verbandsentwicklung auf einen Blick.");const t=b(e,"div","bmex-actions");const n=f(e,"Noch keine Verbandsdaten geladen.");n.className+=" bmd-status";n.setAttribute("role","status");const o=b(e,"div");const r=b(e,"div");const i=L();const s=[["user_count","Mitglieder"],["user_online_count","Mitglieder online"],["credits_current","Verbandskasse"],["credits_total","Verdiente Credits"],["rank","Verbandsrang"]];function l(e){if(e===null||e===void 0||e==="")return null;const t=Number(e);return Number.isFinite(t)&&t>=0?t:null}function d(e){if(!e||typeof e!=="object"||Array.isArray(e))throw new Error("Keine g\xfcltige Antwort der Spiel-API.");const t={user_count:l(e.user_count),user_online_count:l(e.user_online_count),credits_current:l(e.credits_current),credits_total:l(e.credits_total),rank:l(e.rank),finance_active:e.finance_active===true};if(t.user_count===null&&t.user_online_count===null&&t.credits_total===null&&t.rank===null)throw new Error("Die Spiel-API liefert keine passenden Verbandsstatistiken.");return t}function c(){if(!i)return[];try{const e=JSON.parse(localStorage.getItem(i)||"[]");if(!Array.isArray(e))return[];const t=Date.now();return e.filter(e=>e&&Number.isFinite(e.time)&&e.time<=t&&e.time>=t-864e5&&e.data&&typeof e.data==="object").slice(-48)}catch{return[]}}function p(e){if(!i)return;const t=c();const n=Date.now();if(t.length&&n-t[t.length-1].time<30*60*1e3)t.pop();t.push({time:n,data:e});try{localStorage.setItem(i,JSON.stringify(t.slice(-48)))}catch{}}function h(e,t,n){const o=t.map(e=>[e.time,l(e.data[n])]).filter(e=>e[1]!==null);if(o.length<2){f(e,"Noch nicht gen\xfcgend Messpunkte.");return}const a=620,r=85,i=7;let d=Math.min(...o.map(e=>e[1])),c=Math.max(...o.map(e=>e[1]));if(c===d){c+=1;d-=1}const p=o[0][0],u=Math.max(1,o[o.length-1][0]-p);const m=o.map(([e,t])=>{const n=i+(e-p)/u*(a-i*2);const o=r-i-(t-d)/(c-d)*(r-i*2);return n.toFixed(1)+","+o.toFixed(1)}).join(" ");const b=document.createElementNS("http://www.w3.org/2000/svg","svg");b.setAttribute("viewBox","0 0 "+a+" "+r);b.setAttribute("width","100%");b.setAttribute("height","85");b.setAttribute("role","img");b.setAttribute("aria-label","Verlauf "+(s.find(e=>e[0]===n)?.[1]||n));const g=document.createElementNS("http://www.w3.org/2000/svg","polyline");g.setAttribute("points",m);g.setAttribute("fill","none");g.setAttribute("stroke","#c93035");g.setAttribute("stroke-width","2.5");g.setAttribute("stroke-linejoin","round");b.appendChild(g);e.appendChild(b)}function x(e,t){r.replaceChildren();if(e.length<2){f(r,"Dein Verlauf entsteht mit der Zeit. F\xfcr die erste Kurve sind zwei Messpunkte im Abstand von mindestens 30 Minuten erforderlich.").className+=" bma-empty";return}b(r,"h3","","Verlauf der letzten 24 Stunden");const n=b(r,"div","bma-history-grid");for(const[o,a]of s){if(o==="credits_current"&&!t.finance_active)continue;if(l(t[o])===null)continue;const r=b(n,"div","bma-history-card");b(r,"strong","",a);h(r,e,o)}f(r,a.format(e.length)+" Messpunkte. Speicherung nur in diesem Browser, maximal 24 Stunden.")}function v(e,t,r=false){o.replaceChildren();for(const[t,n]of s){if(t==="credits_current"&&!e.finance_active)continue;if(e[t]!==null)w(o,n,a.format(e[t]))}if(e.rank!==null){const t=Math.ceil(e.rank/20);f(o,"Ranglisten-Seite: "+a.format(t))}if(e.user_count>0&&e.user_online_count!==null)f(o,"Mitglieder online: "+Math.round(100*e.user_online_count/e.user_count)+" %");if(!o.children.length)f(o,"Keine auswertbaren Verbandszahlen vorhanden.");n.textContent=(r?"Lokal gespeicherter Stand: ":"Zuletzt aktualisiert: ")+new Date(t).toLocaleString("de-DE");x(c(),e)}async function k(){const e=u();n.textContent="Verbandsdaten werden abgefragt \u2026";try{const t=d(await A("/api/allianceinfo",e.signal));if(!m(e))return;p(t);v(t,Date.now())}catch(t){if(!m(e))return;n.textContent="Aktuelle Verbandsdaten nicht verf\xfcgbar.";o.replaceChildren();r.replaceChildren();f(o,"Die Schnittstelle /api/allianceinfo stammt aus dem urspr\xfcnglichen LSS-Manager-Modul und ist ohne dieses m\xf6glicherweise nicht nutzbar. "+t.message).className="bmex-error"}}g(t,"Verbandsdaten aktualisieren",()=>{void k()}).className+=" bma-refresh";const S=c();if(S.length){const e=S[S.length-1];const t=e.data;if(t&&typeof t==="object")v(t,e.time,true)}}function F(){const e=h();const t=e.map;return t&&typeof t.getCenter==="function"&&typeof t.setView==="function"&&typeof t.fitBounds==="function"?t:null}function C(e){return Boolean(e&&Number.isFinite(e.lat)&&Number.isFinite(e.lng)&&Number.isFinite(e.zoom)&&Math.abs(e.lat)<=90&&Math.abs(e.lng)<=180&&e.zoom>=0&&e.zoom<=22)}function N(){const e={mode:"default",alliance:false,auto:true,point:null,favorites:[],defaultFavoriteId:null};try{const t=JSON.parse(String(GM_getValue(n,"{}")));if(!t||typeof t!=="object"||Array.isArray(t))return e;const o=[],a=new Set;if(Array.isArray(t.favorites))for(const e of t.favorites){if(o.length>=30)break;if(!e||typeof e.id!=="string"||!/^[a-zA-Z0-9_-]{1,80}$/.test(e.id)||a.has(e.id)||typeof e.name!=="string"||!e.name.trim()||e.name.trim().length>80||!C(e.point))continue;a.add(e.id);o.push({id:e.id,name:e.name.trim(),point:{lat:e.point.lat,lng:e.point.lng,zoom:e.point.zoom}})}else if(t.favorites===void 0&&C(t.point))o.push({id:"legacy",name:"Bisherige Kartenposition",point:{lat:t.point.lat,lng:t.point.lng,zoom:t.point.zoom}});const r=o.find(e=>e.id===t.defaultFavoriteId)||o[0]||null;return{mode:["default","dynamic","custom"].includes(t.mode)?t.mode:"default",alliance:t.alliance===true,auto:t.auto!==false,favorites:o,defaultFavoriteId:r?.id||null,point:r?{...r.point}:null}}catch{return e}}function B(e){const t=e.favorites.find(t=>t.id===e.defaultFavoriteId)||e.favorites[0]||null;e.defaultFavoriteId=t?.id||null;e.point=t?{...t.point}:null;GM_setValue(n,JSON.stringify(e));W()}function W(){const e=document.querySelector(".bm-map-reset-link");if(e)e.setAttribute("aria-disabled",String(!N().point))}function D(e){const t=Number(e?.latitude??e?.lat),n=Number(e?.longitude??e?.lng);if(Number.isFinite(t)&&Number.isFinite(n)&&Math.abs(t)<=90&&Math.abs(n)<=180)return[t,n];return null}let T=0;let P="Noch keine Kartenzentrierung ausgef\xfchrt.";function I(){const e=F();if(!e||typeof e.getZoom!=="function")return false;try{const t=e.getCenter();return Boolean(t&&Number.isFinite(t.lat)&&Number.isFinite(t.lng)&&Number.isFinite(e.getZoom()))}catch{return false}}function K(){if(!I())throw Error("Die Spielkarte ist noch nicht bereit.");const e=F(),t=e.getCenter();const n=Math.abs(t.lng)<=180?t.lng:((t.lng+180)%360+360)%360-180;const o={lat:t.lat,lng:n,zoom:e.getZoom()};if(!C(o))throw Error("Diese Kartenposition kann nicht gespeichert werden.");return o}function q(e,t,n=null){const o=String(e||"").trim();if(!o)throw Error("Bitte einen Namen eingeben.");if(o.length>80)throw Error("Bitte h\xf6chstens 80 Zeichen verwenden.");if(t.some(e=>e.id!==n&&e.name.toLocaleLowerCase("de-DE")===o.toLocaleLowerCase("de-DE")))throw Error("Ein Favorit mit diesem Namen ist bereits vorhanden.");return o}function G(e){let t;do{t="favorite-"+Date.now().toString(36)+"-"+Math.random().toString(36).slice(2,9)}while(e.some(e=>e.id===t));return t}function O(){const e=y("favorites","Kartenfavoriten");f(e,"Speichere Kartenausschnitte mit Position und Zoom. Mit dem Zielkreuz w\xe4hlst du deinen Standardfavoriten aus.");const t=b(e,"form","bmcf-add");const n=b(t,"label","","Aktuelle Kartenposition speichern");const o=b(n,"input","bmcf-name");o.type="text";o.maxLength=80;o.value="";o.placeholder="Zum Beispiel: Heimatgebiet";o.setAttribute("aria-label","Name des neuen Favoriten");const a=b(t,"button","bmex-button bmcf-primary","Favorit speichern");a.type="submit";const r=f(e,"");r.setAttribute("role","status");r.setAttribute("aria-live","polite");const i=b(e,"div","bmcf-list");let s=null,l=null;function d(e,t=false){r.textContent=e;r.className=t?"bmex-error":"bmex-note"}function c(e,t){try{const n=N();e(n);B(n);s=null;l=null;p();d(t);o.focus();return true}catch(e){d(e.message||"Die \xc4nderung konnte nicht gespeichert werden.",true);return false}}function p(){i.replaceChildren();const e=N();a.disabled=e.favorites.length>=30;if(!e.favorites.length){f(i,"Noch keine Favoriten. Speichere oben deinen ersten Kartenausschnitt.");return}f(i,e.favorites.length+" von 30 Favoriten \xb7 lokal in diesem Browser gespeichert");for(const t of e.favorites){const n=b(i,"article","bmcf-row");n.dataset.favoriteId=t.id;n.dataset.default=String(e.defaultFavoriteId===t.id);const a=b(n,"div","bmcf-heading");b(a,"strong","",t.name);if(e.defaultFavoriteId===t.id)b(a,"span","bmcf-badge","Standard");f(n,t.point.lat.toFixed(5)+", "+t.point.lng.toFixed(5)+" \xb7 Zoom "+t.point.zoom);if(s===t.id){const e=b(n,"form","bmcf-edit");const o=b(e,"input","bmcf-name");o.type="text";o.maxLength=80;o.value=t.name;o.setAttribute("aria-label","Neuer Name f\xfcr "+t.name);const a=b(e,"button","bmex-button","Namen speichern");a.type="submit";g(e,"Abbrechen",()=>{s=null;p();i.querySelector(".bmcf-rename")?.focus()});e.addEventListener("submit",e=>{e.preventDefault();c(e=>{const n=e.favorites.find(e=>e.id===t.id);if(!n)throw Error("Dieser Favorit wurde bereits entfernt.");n.name=q(o.value,e.favorites,t.id)},"Name gespeichert.")});o.focus();continue}if(l===t.id){f(n,"\u201e"+t.name+"\u201c wirklich l\xf6schen?"+(e.defaultFavoriteId===t.id?e.favorites.length>1?" Der n\xe4chste Favorit wird automatisch zum Standard.":" Danach ist kein Standard gespeichert.":""));const a=b(n,"div","bmcf-actions");g(a,"Ja, l\xf6schen",()=>{if(c(e=>{e.favorites=e.favorites.filter(e=>e.id!==t.id);if(e.defaultFavoriteId===t.id)e.defaultFavoriteId=null},"Favorit gel\xf6scht."))o.focus()});const r=g(a,"Abbrechen",()=>{l=null;p();o.focus()});r.focus();continue}const r=b(n,"div","bmcf-actions");const u=g(r,"Ausw\xe4hlen",()=>{try{if(!I())throw Error("Die Spielkarte ist noch nicht bereit.");const e=N().favorites.find(e=>e.id===t.id);if(!e)throw Error("Dieser Favorit wurde bereits entfernt.");++T;F().setView([e.point.lat,e.point.lng],e.point.zoom,{animate:false});v()}catch(e){d(e.message,true)}});u.className+=" bmcf-go";const m=g(r,e.defaultFavoriteId===t.id?"Standard gew\xe4hlt":"Als Standard",()=>{if(c(e=>{if(!e.favorites.some(e=>e.id===t.id))throw Error("Dieser Favorit wurde bereits entfernt.");e.defaultFavoriteId=t.id},"Standardfavorit ausgew\xe4hlt."))++T});m.disabled=e.defaultFavoriteId===t.id;m.className+=" bmcf-default";g(r,"Umbenennen",()=>{s=t.id;l=null;p()}).className+=" bmcf-rename";g(r,"L\xf6schen",()=>{l=t.id;s=null;p()}).className+=" bmcf-delete"}}t.addEventListener("submit",e=>{e.preventDefault();if(c(e=>{if(e.favorites.length>=30)throw Error("Es sind bereits 30 Favoriten gespeichert.");const t={id:G(e.favorites),name:q(o.value,e.favorites),point:K()};e.favorites.push(t);if(!e.defaultFavoriteId)e.defaultFavoriteId=t.id},"Kartenfavorit gespeichert.")){o.value="";o.focus()}});p();o.focus()}async function R(e,t,n,o){const r=e=>{if(o?.aborted)return;P=e;if(typeof t==="function")t(e)};if(!I()){r("Die Spielkarte ist noch nicht bereit.");return}const i=F();if(e.mode==="default"){r("Standardmodus: Keine Karten\xe4nderung.");return}if(e.mode==="custom"){if(!e.point){r("Bitte zuerst die aktuelle Position speichern.");return}if(n!==T)return;i.setView([e.point.lat,e.point.lng],e.point.zoom);r("Gespeicherte Kartenposition wiederhergestellt.");return}r("Wachen werden f\xfcr die Kartenzentrierung geladen \u2026");try{const t=await S("buildings",null,o);if(o?.aborted||n!==T)return;if(!t.complete)throw Error("Wachenliste ist unvollst\xe4ndig.");const s=t.records.map(D).filter(Boolean);const l=h().mission_markers;const d=Array.isArray(l)?l:l&&typeof l==="object"?Object.values(l):[];let c=0;for(const t of d){if(!t||!e.alliance&&!t.involved)continue;const n=t._latlng||(typeof t.getLatLng==="function"?t.getLatLng():null);if(n&&Number.isFinite(n.lat)&&Number.isFinite(n.lng)){s.push([n.lat,n.lng]);c++}}if(!s.length)throw Error("Keine g\xfcltigen Kartenpositionen vorhanden.");if(n!==T)return;if(s.length===1)i.setView(s[0],Math.max(10,i.getZoom()));else i.fitBounds(s,{padding:[30,30],maxZoom:13});r(a.format(t.records.length)+" Wachen und "+a.format(c)+" Eins\xe4tze ber\xfccksichtigt.")}catch(e){if(n===T)r("Kartenzentrierung fehlgeschlagen: "+(e instanceof Error?e.message:"Unbekannter Fehler"))}}let V=null;function j(){if(!r.centermap||typeof location==="undefined"||location.pathname!=="/")return;const e=F();if(!e)return;if(V===e){W();return}const t=h().L;if(!t||typeof t.control!=="function"||!t.DomUtil||typeof t.DomUtil.create!=="function")return;const n=t.control({position:"topleft"});n.onAdd=()=>{x();const n=t.DomUtil.create("div","leaflet-bar leaflet-control");n.id=o;const a=t.DomUtil.create("a","bm-map-reset-link",n);a.href="#";a.setAttribute("role","button");a.setAttribute("aria-label","Karte auf gespeicherte Position zur\xfccksetzen");const r="http://www.w3.org/2000/svg";const i=document.createElementNS(r,"svg");for(const[e,t]of Object.entries({viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.9","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true",focusable:"false"}))i.setAttribute(e,t);const s=document.createElementNS(r,"path");s.setAttribute("d","M12 2v4 M12 18v4 M2 12h4 M18 12h4 M16 12a4 4 0 1 1-8 0a4 4 0 0 1 8 0Z");i.appendChild(s);a.appendChild(i);a.addEventListener("click",t=>{t.preventDefault();t.stopPropagation();if(!I())return;const n=N();if(!n.point)return;++T;e.setView([n.point.lat,n.point.lng],n.point.zoom,{animate:false})});a.addEventListener("keydown",e=>{if(e.key===" "){e.preventDefault();a.click()}});const l=t.DomUtil.create("a","bm-map-favorites-link",n);l.href="#";l.setAttribute("role","button");l.setAttribute("aria-label","Kartenfavoriten \xf6ffnen");l.setAttribute("aria-haspopup","dialog");l.title="Kartenfavoriten";const d=document.createElementNS(r,"svg");for(const[e,t]of Object.entries({viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.9","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true",focusable:"false"}))d.setAttribute(e,t);const c=document.createElementNS(r,"path");c.setAttribute("d","m12 3 2.8 5.7 6.3.9-4.6 4.4 1.1 6.3-5.6-3-5.6 3 1.1-6.3L3 9.6l6.2-.9Z");d.appendChild(c);l.appendChild(d);l.addEventListener("click",e=>{e.preventDefault();e.stopPropagation();l.focus();O()});l.addEventListener("keydown",e=>{if(e.key===" "){e.preventDefault();l.click()}});if(typeof t.DomEvent?.disableClickPropagation==="function")t.DomEvent.disableClickPropagation(n);if(typeof t.DomEvent?.disableScrollPropagation==="function")t.DomEvent.disableScrollPropagation(n);return n};try{n.addTo(e);V=e;W()}catch{}}async function H(){if(!r.centermap||typeof location==="undefined"||location.pathname!=="/")return;const e=N();if(!e.auto||e.mode==="default")return;for(let e=0;e<60&&!I();e++)await new Promise(e=>setTimeout(e,500));if(!I()||T!==0)return;await new Promise(e=>setTimeout(e,1200));if(!I()||T!==0)return;const t=N();if(!t.auto||t.mode==="default")return;const n=++T;await R(t,null,n)}function U(){const e=y("centermap","Kartensteuerung");const t=N();f(e,"W\xe4hle, wie deine Karte zentriert wird. \xc4nderungen an diesen Einstellungen werden sofort gespeichert.");const n=b(e,"div","bmex-controls");const o=b(n,"label","","Modus:");const a=b(o,"select");[["default","Standard (keine \xc4nderung)"],["dynamic","Dynamisch (Wachen und Eins\xe4tze)"],["custom","Gespeicherte Position"]].forEach(([e,t])=>{const n=b(a,"option","",t);n.value=e});a.value=t.mode;const r=b(n,"label","bmc-check");const i=b(r,"input");i.type="checkbox";i.checked=t.alliance;b(r,"span",""," Verbandseins\xe4tze ber\xfccksichtigen");const s=b(n,"label","bmc-check");const l=b(s,"input");l.type="checkbox";l.checked=t.auto;b(s,"span",""," Beim Laden automatisch zentrieren");const d=b(e,"div","bmc-position");function c(){d.replaceChildren();const e=N();const t=e.favorites.find(t=>t.id===e.defaultFavoriteId);b(d,"strong","",t?"Standard: "+t.name:"Noch kein Standardfavorit");f(d,e.point?e.point.lat.toFixed(5)+", "+e.point.lng.toFixed(5)+" \xb7 Zoom "+e.point.zoom:"Speichere deine aktuelle Kartenposition oder w\xe4hle einen Favoriten als Standard.")}c();const p=f(e,P);p.className+=" bmd-status";p.setAttribute("role","status");const h=b(e,"div","bmex-actions");function x(){const e=N();e.mode=a.value;e.alliance=i.checked;e.auto=l.checked;B(e)}a.addEventListener("change",x);i.addEventListener("change",x);l.addEventListener("change",x);g(h,"Kartenfavoriten verwalten",O);g(h,"Standardposition aktualisieren",()=>{try{const e=N(),t=K();const n=e.favorites.find(t=>t.id===e.defaultFavoriteId);if(n)n.point=t;else e.favorites.push({id:G(e.favorites),name:"Gespeicherte Kartenposition",point:t});e.mode=a.value;e.alliance=i.checked;e.auto=l.checked;B(e);++T;c();p.textContent="Position und Zoom des Standards gespeichert."}catch(e){p.textContent=e.message}});g(h,"Karte jetzt zentrieren",()=>{x();const e=++T;const t=u();void R(N(),e=>{if(m(t))p.textContent=e},e,t.signal)}).className+=" bmc-primary"}const Z={dashboard:M,alliance:_,centermap:U};function J(){j();const e=document.querySelector("#bm-lss-navbar-tools .bm-tools-dropdown");if(!e)return;for(const t of i){const n="bm-extra-row-"+t.id;if(document.getElementById(n))continue;const o=b(e,"div","bm-tools-row");o.id=n;const a=b(o,"button","bm-tools-option");a.type="button";b(a,"span","bm-lss-dock-icon",t.icon);const r=b(a,"span","bm-tools-texts");b(r,"strong","",t.title);b(r,"small","bm-tools-state","Fenster \xf6ffnen");a.addEventListener("click",n=>{n.preventDefault();n.stopPropagation();e.hidden=true;document.querySelector("#bm-lss-navbar-tools .bm-tools-trigger")?.setAttribute("aria-expanded","false");Z[t.id]()})}}if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",J,{once:true});else J();setInterval(J,3e3);void H()})();if(r.layouts)(()=>{"use strict";const e="bruhnmedia_map_layout_v1";const t="bm-map-layout-css",n="bm-map-layout-dialog";const o="bm-map-layout-toolbar",a="bm-map-layout-menu-row";const r=[{id:"standard",name:"Standard",description:"Originalansicht von Leitstellenspiel."},{id:"sidebar",name:"Gro\xdfe Karte mit Seitenleiste",description:"Karte links, rechts umschaltbar: Eins\xe4tze, Wachen, Chat, Funk."},{id:"top",name:"Karte oben",description:"Gro\xdfe Karte \xfcber vier nebeneinanderliegenden Bereichen."},{id:"columns",name:"Vier-Spalten-Ansicht",description:"Eins\xe4tze, Wachen, Chat und Funk nebeneinander, ohne Karte."},{id:"split",name:"Kompakte Karte links",description:"Karte links, Eins\xe4tze rechts oben, weitere Bereiche darunter."}];const i=[{id:"missions",name:"Eins\xe4tze",path:"M12 3c1 3.8 5 5.6 5 9.3 0 1.2-.4 2.2-1 3.1.1-2.7-1.5-4.4-3.4-5.7.1 3-3.6 4.2-3.6 7a3 3 0 0 0 6 0 M8 6.5C7.8 10 4 12 4 16a8 8 0 0 0 16 0c0-5.8-4-8.7-8-13"},{id:"buildings",name:"Wachen",path:"M3 10 12 4l9 6 M5 9v12h14V9 M3 21h18 M8 21v-7h8v7 M8 17h8 M10 10h4"},{id:"chat",name:"Chat",path:"M7 4h10a4 4 0 0 1 4 4v7a4 4 0 0 1-4 4H9l-5 3v-4.5A4 4 0 0 1 3 15V8a4 4 0 0 1 4-4Z M7.5 9h9 M7.5 13h6"},{id:"radio",name:"Funk",path:"M7 7V3 M6 7h8a2 2 0 0 1 2 2v11a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2Z M8 11h4 M8 14h4 M9 18h2 M19 5a4 4 0 0 1 0 6 M21 2a8 8 0 0 1 0 12"}];const s=new Set(r.map(e=>e.id));const l=()=>{const t=String(GM_getValue(e,"standard"));return s.has(t)?t:"standard"};let d=l(),c="missions",p=null,u=null;const m=(e,t,n,o)=>{const a=document.createElement(t);if(n)a.className=n;if(o!==void 0)a.textContent=o;if(e)e.appendChild(a);return a};const b=(e,t)=>'body[data-bm-map-layout="'+e+'"] #'+t;const f=e=>i.map(t=>b(e,t.id+"_outer")).join(",");function g(){if(document.getElementById(t))return;const e=m(document.head,"style");e.id=t;e.textContent=["#"+n+"[hidden],#"+o+"[hidden]{display:none!important}","#"+n+"{position:fixed;inset:0;z-index:20100;background:#0009;display:flex;justify-content:center;align-items:center;padding:12px;color:#333;font:13px Arial,sans-serif}","#"+n+" *{box-sizing:border-box}","#"+n+" .bml-dialog{width:min(100%,620px);max-height:92vh;overflow:auto;background:white;border-radius:8px;box-shadow:0 12px 35px #0005}","#"+n+" header{background:#c93035;padding:15px 18px;color:white;display:flex;align-items:center;justify-content:space-between}","#"+n+" header strong{font-size:17px}","#"+n+" .bml-close{background:transparent;color:white;border:0;font-size:24px;cursor:pointer}","#"+n+" .bml-main{padding:15px 18px}","#"+n+" .bml-option{display:block;text-align:left;width:100%;padding:12px;border:1px solid #ddd;border-radius:4px;margin-bottom:9px;background:white;color:#333;cursor:pointer}","#"+n+" .bml-option strong{display:block;font-size:13px}","#"+n+" .bml-option span{display:block;font-size:11px;color:#666;margin-top:5px}","#"+n+" .bml-option[aria-pressed=true]{border-color:#c93035;background:#fff4f4}","#"+n+" .bml-note{color:#666;font-size:11px;line-height:1.6}","#"+n+" footer{background:#fafafa;color:#777;padding:10px 18px;border-top:1px solid #eee;font-size:10px}","#bm-map-layout-dialog{background:rgba(18,24,34,.58);backdrop-filter:blur(3px)}","#bm-map-layout-dialog .bml-dialog{width:min(100%,760px);border:1px solid #ffffff70;border-radius:18px;box-shadow:0 24px 80px #10182855}","#bm-map-layout-dialog header{background:linear-gradient(115deg,#a61e2c,#d12e3b);padding:22px 26px;gap:16px}","#bm-map-layout-dialog header strong{font:700 25px/1.3 Arial;letter-spacing:-.4px}",'#bm-map-layout-dialog header strong::before{content:"BRUHN MEDIA";display:block;font:700 10px/1.4 Arial;letter-spacing:2px;color:#ffdae0;margin-bottom:6px}','#bm-map-layout-dialog header strong::after{content:"Made to Work | Dein Spiel, deine Ansicht";display:block;font:12px/1.5 Arial;letter-spacing:0;color:#ffe4e7;margin-top:6px}',"#bm-map-layout-dialog .bml-close{width:36px;height:36px;flex:0 0 36px;border:1px solid #ffffff45;border-radius:9px;background:#ffffff12}","#bm-map-layout-dialog .bml-main{padding:20px 26px;background:#f5f6f9}","#bm-map-layout-dialog .bml-option{position:relative;padding:16px 18px;border:1px solid #e0e4ec;border-radius:12px;margin:10px 0;background:#fff;color:#253044}","#bm-map-layout-dialog .bml-option strong{font-size:14px;padding-right:64px}","#bm-map-layout-dialog .bml-option span{font-size:12px;line-height:1.6;color:#667085}","#bm-map-layout-dialog .bml-option:hover{border-color:#de8d98;background:#fffafb}","#bm-map-layout-dialog .bml-option[aria-pressed=true]{border-color:#de8d98;background:#fff0f2;box-shadow:inset 3px 0 #bf2836}",'#bm-map-layout-dialog .bml-option[aria-pressed=true]::after{content:"Aktiv";position:absolute;top:14px;right:14px;padding:4px 9px;border-radius:20px;background:#bf2836;color:#fff;font:700 10px Arial}',"#bm-map-layout-dialog .bml-note{color:#667085;font-size:12px;line-height:1.6}","#bm-map-layout-dialog footer{padding:12px 26px;background:#fff;border-color:#e0e4ec;color:#667085}","#bm-map-layout-dialog button:focus-visible{outline:2px solid #bf2836;outline-offset:2px}","@media(max-width:600px){#bm-map-layout-dialog header,#bm-map-layout-dialog .bml-main{padding:16px}}","#"+o+"{position:fixed!important;right:8px!important;top:50%!important;transform:translateY(-50%)!important;z-index:20!important;display:flex!important;flex-direction:column!important;align-items:center!important;gap:5px!important;padding:7px 5px!important;width:50px!important;box-sizing:border-box!important;max-height:calc(100vh - 190px);overflow-y:auto!important;overflow-x:hidden!important;background:rgba(255,255,255,.97)!important;border:1px solid #d9dce1!important;border-radius:11px!important;box-shadow:0 4px 16px #0002!important}","#"+o+" button{display:grid!important;place-items:center!important;flex:0 0 38px!important;width:38px!important;height:38px!important;box-sizing:border-box!important;padding:0!important;border:1px solid transparent!important;border-radius:8px!important;background:#f6f7f8!important;color:#424a53!important;cursor:pointer!important;transition:background .14s ease,border-color .14s ease,color .14s ease!important}","#"+o+" button:hover{background:#eceff2!important;border-color:#d0d5db!important;color:#262d35!important}","#"+o+" button[aria-pressed=true]{background:#fff0f1!important;border-color:#dca3a6!important;color:#b72d34!important}","#"+o+" button:focus-visible{outline:2px solid #b72d34!important;outline-offset:2px!important}","#"+o+" button svg{pointer-events:none;display:block;width:22px;height:22px}","@media(min-width:961px){",b("sidebar","map_outer")+"{display:block!important;float:left!important;box-sizing:border-box!important;width:63%!important;height:calc(100vh - 102px)!important;margin:0 1% 0 0!important;padding:0!important}",b("sidebar","map")+"{height:100%!important}",f("sidebar")+"{display:none!important;float:left!important;box-sizing:border-box!important;min-width:0!important;width:calc(36% - 63px)!important;height:calc(100vh - 102px)!important;margin:0 63px 0 0!important;padding:0!important;overflow:hidden!important}",...i.map(e=>'body[data-bm-map-layout="sidebar"][data-bm-map-tab="'+e.id+'"] #'+e.id+"_outer{display:flex!important;flex-direction:column!important;min-height:0!important}"),'body[data-bm-map-layout="sidebar"] #missions_outer > .panel,body[data-bm-map-layout="sidebar"] #missions_outer > div{display:flex!important;flex-direction:column!important;flex:1 1 auto!important;min-height:0!important;height:100%!important;max-height:100%!important;margin-bottom:0!important}','body[data-bm-map-layout="sidebar"] #missions_outer #missions{display:flex!important;flex-direction:column!important;flex:1 1 auto!important;min-height:0!important;height:100%!important;max-height:100%!important;overflow:hidden!important}','body[data-bm-map-layout="sidebar"] #missions_outer #missions-panel-body{display:block!important;flex:1 1 auto!important;min-height:0!important;height:var(--bm-layout-missions-height,100%)!important;max-height:none!important;overflow-y:auto!important;overflow-x:hidden!important;padding-bottom:10px!important}','body[data-bm-map-layout="sidebar"] #missions_outer .missions-panel-head{flex:0 0 auto!important}','body[data-bm-map-layout="sidebar"] #buildings_outer{overflow-y:auto!important;overflow-x:hidden!important;scrollbar-gutter:stable!important}','body[data-bm-map-layout="sidebar"] #buildings_outer > div,body[data-bm-map-layout="sidebar"] #buildings_outer .panel{display:block!important;flex:none!important;height:auto!important;min-height:100%!important;max-height:none!important;overflow:visible!important;margin:0!important}','body[data-bm-map-layout="sidebar"] #buildings_outer .panel-body{display:block!important;flex:none!important;height:auto!important;max-height:none!important;overflow:visible!important}','body[data-bm-map-layout="sidebar"] #radio_outer > div,body[data-bm-map-layout="sidebar"] #radio_outer .panel{display:flex!important;flex-direction:column!important;flex:1 1 auto!important;min-height:0!important;height:100%!important;max-height:100%!important;overflow:hidden!important;margin:0!important}','body[data-bm-map-layout="sidebar"] #radio_outer .panel-body,body[data-bm-map-layout="sidebar"] #radio_outer #radio-panel-body{display:block!important;flex:1 1 auto!important;min-height:0!important;height:auto!important;max-height:none!important;overflow-y:auto!important;overflow-x:hidden!important;padding:8px 10px!important}','body[data-bm-map-layout="sidebar"] #radio_outer #radio{flex:1 1 auto!important;min-height:0!important;max-height:none!important;overflow-y:auto!important}','body[data-bm-map-layout="sidebar"] #chat_outer > div{display:flex!important;flex-direction:column!important;flex:1 1 auto!important;min-height:0!important;height:100%!important;max-height:100%!important;margin:0!important}','body[data-bm-map-layout="sidebar"] #chat_outer .panel-body{flex:1 1 auto!important;min-height:0!important;height:auto!important;max-height:none!important;overflow-y:auto!important}',b("top","map_outer")+"{display:block!important;float:none!important;box-sizing:border-box!important;width:100%!important;height:48vh!important;max-width:none!important;margin:0 0 10px!important;padding:0!important}",b("top","map")+"{height:100%!important}",f("top")+"{display:block!important;float:left!important;box-sizing:border-box!important;width:24%!important;height:calc(52vh - 115px)!important;margin:0 .5%!important;padding:0!important;overflow:auto!important}",b("columns","map_outer")+"{display:none!important}",f("columns")+"{display:flex!important;flex-direction:column!important;float:left!important;box-sizing:border-box!important;width:24%!important;height:var(--bm-layout-columns-height,calc(100vh - 170px))!important;margin:0 .5%!important;padding:0!important;overflow:hidden!important}",'body[data-bm-map-layout="columns"] #missions_outer > div,body[data-bm-map-layout="columns"] #missions_outer #missions{display:flex!important;flex-direction:column!important;flex:1 1 auto!important;min-height:0!important;height:100%!important;overflow:hidden!important}','body[data-bm-map-layout="columns"] #missions_outer #missions-panel-body{flex:1 1 auto!important;min-height:0!important;height:100%!important;max-height:none!important;overflow-y:auto!important;overflow-x:hidden!important}','body[data-bm-map-layout="columns"] #buildings_outer > div,body[data-bm-map-layout="columns"] #chat_outer > div,body[data-bm-map-layout="columns"] #radio_outer > div{display:flex!important;flex-direction:column!important;flex:1 1 auto!important;min-height:0!important;height:100%!important;overflow:hidden!important}','body[data-bm-map-layout="columns"] #buildings_outer .panel,body[data-bm-map-layout="columns"] #chat_outer .panel,body[data-bm-map-layout="columns"] #radio_outer .panel{display:flex!important;flex-direction:column!important;flex:1 1 auto!important;min-height:0!important;height:100%!important;overflow:hidden!important}','body[data-bm-map-layout="columns"] #buildings_outer .panel-body,body[data-bm-map-layout="columns"] #chat_outer .panel-body,body[data-bm-map-layout="columns"] #radio_outer .panel-body{flex:1 1 auto!important;min-height:0!important;height:auto!important;max-height:none!important;overflow-y:auto!important;overflow-x:hidden!important}',b("split","map_outer")+"{display:block!important;float:left!important;box-sizing:border-box!important;width:35%!important;height:calc(100vh - 102px)!important;margin:0 1% 0 0!important;padding:0!important}",b("split","map")+"{height:100%!important}",b("split","missions_outer")+"{display:block!important;float:left!important;box-sizing:border-box!important;width:64%!important;height:49vh!important;margin:0 0 10px!important;padding:0!important;overflow:auto!important}",[b("split","buildings_outer"),b("split","chat_outer"),b("split","radio_outer")].join(",")+"{display:block!important;float:left!important;box-sizing:border-box!important;width:20.8%!important;height:calc(51vh - 112px)!important;margin:0 .2%!important;padding:0!important;overflow:auto!important}","}","@media(max-width:960px){#"+o+"{display:none!important}}"].join("\n")}function h(){if(!document.body||!document.body.style)return;const e="--bm-layout-missions-height";if(d!=="sidebar"||location.pathname!=="/"){document.body.style.removeProperty(e);return}const t=document.getElementById("missions-panel-body");if(!t||typeof window==="undefined"||typeof t.getBoundingClientRect!=="function")return;const n=t.getBoundingClientRect().top;const o=window.innerHeight-n-12;if(Number.isFinite(o)&&o>150)document.body.style.setProperty(e,Math.floor(o)+"px")}function x(){const e="--bm-layout-columns-height",t=document.body?.style;if(!t)return;if(d!=="columns"||location.pathname!=="/"){t.removeProperty(e);return}const n=document.getElementById("missions_outer");if(!n||typeof n.getBoundingClientRect!=="function")return;const o=window.innerHeight-n.getBoundingClientRect().top-12;if(Number.isFinite(o)&&o>180)t.setProperty(e,Math.floor(o)+"px")}function v(){for(const e of[80,300,800])setTimeout(()=>{h();x()},e)}function y(){for(const e of[100,500])setTimeout(()=>{try{const e=typeof unsafeWindow!=="undefined"?unsafeWindow:window;if(e.map&&typeof e.map.invalidateSize==="function")e.map.invalidateSize(true)}catch{}},e)}function w(){if(u)return;u=m(document.body,"div");u.id=o;u.setAttribute("role","toolbar");u.setAttribute("aria-label","BRUHN MEDIA | Layout-Seitenleiste");for(const e of i){const t=m(u,"button");t.type="button";t.dataset.tab=e.id;t.title=e.name;t.setAttribute("aria-label",e.name);const n="http://www.w3.org/2000/svg";const o=document.createElementNS(n,"svg");for(const[e,t]of Object.entries({viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"1.9","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true",focusable:"false"}))o.setAttribute(e,t);const a=document.createElementNS(n,"path");a.setAttribute("d",e.path);o.appendChild(a);t.appendChild(o);t.addEventListener("click",()=>k(e.id))}}function k(e){if(!i.some(t=>t.id===e))return;c=e;if(location.pathname==="/"&&document.body&&d==="sidebar")document.body.dataset.bmMapTab=e;if(u)for(const t of u.querySelectorAll("button[data-tab]"))t.setAttribute("aria-pressed",String(t.dataset.tab===e));h();x();v();y()}function A(t){d=s.has(t)?t:"standard";GM_setValue(e,d);if(location.pathname!=="/"||!document.body)return;g();if(d==="standard"){delete document.body.dataset.bmMapLayout;delete document.body.dataset.bmMapTab}else{document.body.dataset.bmMapLayout=d;if(d==="sidebar")document.body.dataset.bmMapTab=c}w();u.hidden=d!=="sidebar";k(c);h();x();v();y()}function S(){if(!p)return;for(const e of p.querySelectorAll("button[data-layout]"))e.setAttribute("aria-pressed",String(e.dataset.layout===d))}function E(){g();if(!p){p=m(document.body,"div");p.id=n;p.hidden=true;p.addEventListener("click",e=>{if(e.target===p)p.hidden=true});const e=m(p,"section","bml-dialog");e.setAttribute("role","dialog");e.setAttribute("aria-modal","true");const t=m(e,"header");m(t,"strong","","Karten-Layouts").id="bml-dialog-title";e.setAttribute("aria-labelledby","bml-dialog-title");const o=m(t,"button","bml-close","\xd7");o.type="button";o.setAttribute("aria-label","Schlie\xdfen");o.addEventListener("click",()=>{p.hidden=true});const a=m(e,"div","bml-main");m(a,"p","bml-note","W\xe4hle das Layout. \xc4nderungen werden sofort gespeichert und nach F5 wiederhergestellt.");for(const e of r){const t=m(a,"button","bml-option");t.type="button";t.dataset.layout=e.id;m(t,"strong","",e.name);m(t,"span","",e.description);t.addEventListener("click",()=>{A(e.id);S()})}m(a,"p","bml-note","Layouts gelten f\xfcr die Hauptkarte auf Desktop-Bildschirmen ab 961 px. Die separate Kartensteuerung bleibt unver\xe4ndert.");m(e,"footer","","\xa9 2026 BRUHN MEDIA | Alle Rechte vorbehalten.");document.addEventListener("keydown",e=>{if(e.key==="Escape"&&p&&!p.hidden)p.hidden=true})}S();p.hidden=false}function z(){const e=document.querySelector("#bm-lss-navbar-tools .bm-tools-dropdown");if(!e||document.getElementById(a))return;const t=m(e,"div","bm-tools-row");t.id=a;const n=m(t,"button","bm-tools-option");n.type="button";m(n,"span","bm-lss-dock-icon","\u25a5");const o=m(n,"span","bm-tools-texts");m(o,"strong","","Karten-Layouts");m(o,"small","bm-tools-state","Layout ausw\xe4hlen");n.addEventListener("click",t=>{t.preventDefault();t.stopPropagation();e.hidden=true;document.querySelector("#bm-lss-navbar-tools .bm-tools-trigger")?.setAttribute("aria-expanded","false");E()})}function $(){z();if(location.pathname==="/")A(d);if(typeof window!=="undefined"&&typeof window.addEventListener==="function")window.addEventListener("resize",()=>{h();x();y()});setInterval(z,3e3)}if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",$,{once:true});else $()})();if(r.leitstellen)(()=>{"use strict";if(window.top!==window||location.pathname!=="/"||window.__bruhnLeitstellenBeta)return;window.__bruhnLeitstellenBeta=true;const e="bm-lst-beta";const t="7";const n=new Set;let o=null;let a=false;const r=document.createElement("style");r.textContent="#building_list ."+e+"{display:inline-flex;align-items:center;margin-right:5px;padding:2px 7px;border:1px solid transparent;border-radius:4px;color:#fff;font:bold 11px/1.5 Arial;cursor:pointer;white-space:nowrap}"+"#building_list ."+e+'[data-enabled="true"]{background:#218451;border-color:#17643d}'+"#building_list ."+e+'[data-enabled="false"]{background:#b52635;border-color:#8d1e2a}'+"#building_list ."+e+'[data-enabled="unknown"]{background:#667085}'+"#building_list ."+e+":disabled{opacity:.7;cursor:wait}"+".bm-lst-beta-toast{position:fixed;z-index:2147483600;right:18px;bottom:18px;max-width:400px;background:#172333;color:#fff;border-left:4px solid #d43a48;border-radius:6px;padding:12px 16px;font:13px/1.5 Arial;box-shadow:0 8px 30px #0004}";document.head.append(r);function i(e){const t=document.querySelector(".bm-lst-beta-toast");if(t)t.remove();const n=document.createElement("div");n.className="bm-lst-beta-toast";n.setAttribute("role","status");n.textContent=e;document.body.append(n);setTimeout(()=>{if(n.isConnected)n.remove()},8e3)}function s(e){const t=e.querySelector("img[building_id]");const n=t&&t.getAttribute("building_id");if(n&&/^\d+$/.test(n))return n;const o=e.querySelector('a[href*="/buildings/"]');if(!o)return null;try{const e=new URL(o.href,location.origin);const t=e.origin===location.origin&&e.pathname.match(/^\/buildings\/(\d+)\/?$/);return t?t[1]:null}catch(e){return null}}function l(e){const t=e.querySelector("img[building_id]");if(!t)return null;const n=(t.getAttribute("src")||"").toLowerCase();if(n.includes("building_leitstelle_deactivated"))return false;if(n.includes("building_leitstelle"))return true;return null}function d(e,t){for(const n of e.querySelectorAll("a.btn[href]"))try{const e=new URL(n.href,location.origin);if(e.origin===location.origin&&e.pathname==="/buildings/"+t)return n}catch(e){}return null}async function c(e,t,o){if(n.has(e))return;const a=Array.from(document.querySelectorAll('#building_list li[building_type_id="7"]')).find(t=>s(t)===e);if(!a||l(a)!==t){i("Status unklar. Bitte Seite neu laden und erneut pr\xfcfen.");return}if(t===true&&!confirm("Leitstelle \u201e"+o+"\u201c deaktivieren?\n\n"+"Die zugeh\xf6rigen Wachen generieren danach keine neuen Eins\xe4tze."))return;n.add(e);u();try{const t="/buildings/"+encodeURIComponent(e)+"/active";const n=await fetch(t,{method:"GET",credentials:"same-origin",cache:"no-store",headers:{"X-Requested-With":"XMLHttpRequest"}});const o=new URL(n.url,location.origin);if(!n.ok||o.origin!==location.origin||/\/(login|users\/sign_in)/.test(o.pathname))throw new Error("Spielaktion fehlgeschlagen (HTTP "+n.status+").");i("Statuswechsel angefordert. Leitstellenliste wird zur Kontrolle neu geladen.");location.reload()}catch(t){console.warn("[BRUHN MEDIA Leitstellenstatus Beta]",t);i("Leitstellenstatus: "+(t.message||"Umschalten fehlgeschlagen."));n.delete(e);u()}}function p(){if(!o||!o.isConnected)return;for(const a of o.querySelectorAll('li[building_type_id="'+t+'"]')){const t=s(a);if(!t)continue;const o=d(a,t);if(!o)continue;let r=a.querySelector("."+e);if(r&&r.dataset.id!==t){r.remove();r=null}if(!r){r=document.createElement("button");r.type="button";r.className=e;r.dataset.id=t;r.addEventListener("click",e=>{e.preventDefault();e.stopPropagation();const n=e.currentTarget;const o=l(n.closest('li[building_type_id="7"]'));if(o===null){i("Status unbekannt. Bitte \xfcber \u201eDetails\u201c pr\xfcfen.");return}void c(n.dataset.id,o,a.querySelector('a[href*="/buildings/"]')?.textContent.trim()||t)});o.before(r)}const p=l(a);const u=n.has(t)?"\u2026":p===true?"\u25cf Aktiv":p===false?"\u25cf Inaktiv":"? Status";if(r.textContent!==u)r.textContent=u;r.dataset.enabled=p===null?"unknown":String(p);r.disabled=n.has(t)||p===null;r.title=p===true?"Leitstelle deaktivieren":p===false?"Leitstelle aktivieren":"Status nicht erkennbar";r.setAttribute("aria-label",r.title)}}function u(){if(a)return;a=true;Promise.resolve().then(()=>{a=false;p()})}function m(){const e=document.querySelector("#building_list");if(!e)return false;if(o===e)return true;o=e;new MutationObserver(u).observe(o,{childList:true,subtree:true,attributes:true,attributeFilter:["src","building_id","building_type_id","href"]});u();return true}if(!m()){const e=new MutationObserver(()=>{if(m())e.disconnect()});e.observe(document.body||document.documentElement,{childList:true,subtree:true})}function b(){const e=document.getElementById("buildings");if(!e){i("Wachenliste ist derzeit nicht verf\xfcgbar.");return}const t=[...e.querySelectorAll("a,button")];const n=t.find(e=>(e.textContent||"").trim()==="Leitstelle"&&!e.closest("#building_list"));if(n)n.click();e.scrollIntoView?.({block:"nearest"});if(!n)i("Bitte in der Wachenliste den Reiter \u201eLeitstelle\u201c ausw\xe4hlen.")}function f(){const e=document.getElementById("bm-lss-navbar-tools");const t=e?.querySelector(".bm-tools-dropdown");if(!t||t.querySelector("#bm-leitstellenstatus-menu-row"))return;const n=document.createElement("div");n.className="bm-tools-row";n.id="bm-leitstellenstatus-menu-row";const o=document.createElement("button");o.type="button";o.className="bm-tools-option";const a=document.createElement("span");a.className="bm-lss-dock-icon";a.textContent="\u2611";const r=document.createElement("span");r.className="bm-tools-texts";const i=document.createElement("strong");i.textContent="Leitstellenstatus";const s=document.createElement("small");s.className="bm-tools-state";s.textContent="Aktiv / Inaktiv umschalten";r.append(i,s);o.append(a,r);o.addEventListener("click",n=>{n.preventDefault();n.stopPropagation();t.hidden=true;e.querySelector(".bm-tools-trigger")?.setAttribute("aria-expanded","false");b()});n.append(o);t.append(n)}if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",f,{once:true});else f();setInterval(f,3e3)})();