From 9add795d6b74a84675c5408055e361bc3e21846c Mon Sep 17 00:00:00 2001 From: Umut Kantarci Date: Mon, 9 Nov 2026 08:02:38 +0100 Subject: [PATCH] Add the Luximmo site build Co-Authored-By: Claude Opus 5.5 --- .claude/launch.json | 20 + README.md | 4 + docs/STATUS.md | 36 + public/assets/fonts/fonts.css | 4 + .../fonts/instrument-sans-400-latin-ext.woff2 | Bin 0 -> 11144 bytes .../fonts/instrument-sans-400-latin.woff2 | Bin 0 -> 30092 bytes .../fonts/instrument-sans-500-latin-ext.woff2 | Bin 0 -> 11144 bytes .../fonts/instrument-sans-500-latin.woff2 | Bin 0 -> 30092 bytes .../fonts/instrument-sans-600-latin-ext.woff2 | Bin 0 -> 11144 bytes .../fonts/instrument-sans-600-latin.woff2 | Bin 0 -> 30092 bytes scripts/build-luximmo-assets.php | 147 +++ scripts/build-luximmo-poster.mjs | 37 + scripts/reset-luximmo.sh | 34 + scripts/seed-luximmo.php | 1125 +++++++++++++++++ 14 files changed, 1407 insertions(+) create mode 100644 public/assets/fonts/instrument-sans-400-latin-ext.woff2 create mode 100644 public/assets/fonts/instrument-sans-400-latin.woff2 create mode 100644 public/assets/fonts/instrument-sans-500-latin-ext.woff2 create mode 100644 public/assets/fonts/instrument-sans-500-latin.woff2 create mode 100644 public/assets/fonts/instrument-sans-600-latin-ext.woff2 create mode 100644 public/assets/fonts/instrument-sans-600-latin.woff2 create mode 100644 scripts/build-luximmo-assets.php create mode 100644 scripts/build-luximmo-poster.mjs create mode 100644 scripts/reset-luximmo.sh create mode 100644 scripts/seed-luximmo.php diff --git a/.claude/launch.json b/.claude/launch.json index fbfe8a4..a9b3341 100644 --- a/.claude/launch.json +++ b/.claude/launch.json @@ -229,6 +229,26 @@ ], "port": 8107 }, + { + "name": "luximmo", + "runtimeExecutable": "powershell", + "runtimeArgs": [ + "-NoProfile", + "-Command", + "$env:APP_ENV='dev'; $env:DATABASE_URL='sqlite:///C:/Django Project/KantSites/var/luximmo.db'; $env:MEDIA_DIRECTORY='C:/Django Project/KantSites/var/luximmo-media'; $env:SITE_ORIGIN='http://127.0.0.1:8108'; & C:/php84/php.exe -d upload_max_filesize=8M -d post_max_size=10M -d memory_limit=256M -S 127.0.0.1:8108 -t public bin/dev-router.php" + ], + "port": 8108 + }, + { + "name": "luximmo-prod", + "runtimeExecutable": "powershell", + "runtimeArgs": [ + "-NoProfile", + "-Command", + "$env:APP_ENV='prod'; $env:APP_DEBUG='0'; $env:DATABASE_URL='sqlite:///C:/Django Project/KantSites/var/luximmo.db'; $env:MEDIA_DIRECTORY='C:/Django Project/KantSites/var/luximmo-media'; $env:SITE_ORIGIN='http://127.0.0.1:8109'; & C:/php84/php.exe -d upload_max_filesize=8M -d post_max_size=10M -d memory_limit=256M -S 127.0.0.1:8109 -t public bin/dev-router.php" + ], + "port": 8109 + }, { "name": "zentrale", "runtimeExecutable": "C:/php84/php.exe", diff --git a/README.md b/README.md index ef61bbe..ec0572c 100644 --- a/README.md +++ b/README.md @@ -407,6 +407,10 @@ Die Website der Garten- und Landschaftsbau Hüfner GmbH (Iffezheim) liegt in `va Der Nachbau von www.ebi-immobilien.de liegt in `var/ebi-immobilien.db` mit Medien in `var/ebi-immobilien-media`; die Startkonfiguration `ebi-immobilien` nutzt Port 8106, `ebi-immobilien-prod` denselben Bestand im Produktionsmodus auf Port 8107 zum Messen. Die Originalbilder der alten Website liegen in `var/ebi-immobilien-quelle`; eine Datei `startbild.jpg/.png/.webp` dort ersetzt das Startbild. `sh scripts/reset-ebi-immobilien.sh [Quellordner]` bereitet die Bilder vor (`scripts/build-ebi-immobilien-assets.php`, ohne Argument nimmt es die schon vorbereiteten aus `var/ebi-immobilien-assets`), wirft die Installation weg, baut mit `scripts/seed-ebi-immobilien.php` Gestaltung, Kopf- und Fußbereich, Startseite, Suchauftrag, Immobilienbewertung, Kontakt, Impressum, Datenschutz, 404, Weiterleitungen der alten Adressen, Menü und die Formulare `suchauftrag`, `bewertung`, `kontakt` auf, holt Manrope und Lora auf den eigenen Server und schreibt das Inhaltspaket `var/ebi-immobilien-paket.zip`. Das Passwort für „umut“ steht nach jedem Reset in `var/ebi-immobilien-zugang.txt`. Gemessen mit `MSYS_NO_PATHCONV=1 CMS_URL=http://127.0.0.1:8107 CMS_PATHS=/,/suchauftrag,/immobilienbewertung,/kontakt CMS_AUDIT_DIR=reports/lighthouse-ebi-immobilien node scripts/audit.mjs`. Die bewussten Abweichungen vom Original stehen im Kopf des Seed-Skripts. +### Luximmo Hausverwaltung (Gaggenau) + +Der Nachbau des Entwurfs `luximmo-website.zip` liegt in `var/luximmo.db` mit Medien in `var/luximmo-media`; die Startkonfiguration `luximmo` nutzt Port 8108, `luximmo-prod` denselben Bestand im Produktionsmodus auf Port 8109. `sh scripts/reset-luximmo.sh [assets-Ordner des Pakets]` holt ein Standbild aus dem Hero-Video (`scripts/build-luximmo-poster.mjs`, Playwright), bereitet Logo, Seitensymbol und Fotos vor (`scripts/build-luximmo-assets.php`; ohne Argument nimmt es `var/luximmo-assets`), baut mit `scripts/seed-luximmo.php` Startseite (Hintergrundvideo im Hero), Verwaltungsanfrage, Impressum, Datenschutz, 404, Menü und die Formulare `kontakt`, `verwaltungsanfrage` und `bewertung` (je drei Schritte mit Bildkarten und Zusammenfassung; Bewertung auf `/immobilienbewertung`) auf, holt Instrument Sans auf den eigenen Server und schreibt `var/luximmo-paket.zip`. Formulare gehen an info@lux-immo.net (abweichend per `LUXIMMO_MAIL`). Passwort für „umut“ in `var/luximmo-zugang.txt`. Gemessen mit `MSYS_NO_PATHCONV=1 CMS_URL=http://127.0.0.1:8109 CMS_PATHS=/,/verwaltungsanfrage,/impressum CMS_AUDIT_DIR=reports/lighthouse-luximmo node scripts/audit.mjs`. + Zusätzliche Prüfung mit den lokalen Kant-IT-Inhalten: `node scripts/admin-quality-check.mjs` (PHP über `PHP_BINARY` wählbar). Das Skript benötigt `var/kantit.db` und `var/kantit-media`, erstellt eine eigene Datenbankkopie und ein zufälliges Testkonto darin; es ändert die Pilotdatenbank nicht. Screenshots und Bericht landen in `reports/admin-quality/`. Die Livesuche prüft `npm run test:search` mit derselben isolierten Pilotkopie: Eingabe ohne Enter, langsame Antworten, Fehler/Wiederholen, Filter, Browserhistorie, Mediathek, Tastaturfokus, mobile Ansicht und axe. Ergebnisse stehen in `reports/live-search/`. Die allgemeine Verwaltungsprüfung ohne erneuten öffentlichen Bewegungstest startet `npm run test:admin -- --admin-only`. diff --git a/docs/STATUS.md b/docs/STATUS.md index abce9d4..2264bc2 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -1,5 +1,41 @@ # Projektstatus +## Kern: Unternehmensart, Standort und Logo in den strukturierten Daten (09.11.2026) + +**Anlass:** SEO-Durchsicht bei Luximmo. Neu unter Einstellungen (ADR 126): Art des Unternehmens, Breiten-/Längengrad, Logo aus der Mediathek. Ohne Angaben bleibt die Ausgabe wie bisher, keine Migration. + +**Luximmo:** RealEstateAgent, Koordinaten aus OpenStreetMap (Gebäudetreffer), Logo-Bild für die Daten, Seitentitel „Hausverwaltung & Immobilienverkauf in Gaggenau | LUXIMMO“, Paket neu gebaut. + +**Geprüft:** PHPUnit 687 grün (PHP 8.4, neu `testBusinessTypeLocationAndLogoReachTheStructuredData`), `npm test` 41, Twig-Lint, php-cs-fixer, Felder in der Verwaltung per Playwright (Laden, Logo entfernen und wählen, Speichern, Ausgabe auf der Website), Paketimport. Lighthouse nach dieser Änderung nicht erneut gelaufen. + +Die Ausgabe auf einer Live-Seite braucht mindestens Fassung 1.38.0; 1.37.0 ignoriert die Werte. + +## Neue Installation „Luximmo Hausverwaltung“, Gaggenau (06.11.2026) + +**Anlass:** Umut lieferte `luximmo-website.zip` (Onepager der Luximmo UG, Eslem Kurt, Hauptstr. 169, 76571 Gaggenau): „in KantSites nachbauen und wie die anderen Ablagen, gerne etwas ausbauen, und wie bei Immo DEEG ein Formular für Immo auf einer separaten Seite“. + +**Erledigt (nur Inhalt, kein Kerncode):** Datenbank `var/luximmo.db`, Medien `var/luximmo-media`, Bildquellen `var/luximmo-assets`, Startkonfigurationen `luximmo` (8108) und `luximmo-prod` (8109), Inhaltspaket `var/luximmo-paket.zip`. Aufbau nur per `sh scripts/reset-luximmo.sh [assets-Ordner]` (Standbild aus dem Video: `build-luximmo-poster.mjs`; Logo, Seitensymbol aus dem goldenen Zeichen, WebP: `build-luximmo-assets.php`; Inhalte: `seed-luximmo.php`). + +- **Startseite wie die Vorlage:** Kopf mit Menü links, Logo mittig, Knopf rechts; Hero mit dem Video als Hintergrundvideo der Sektion (ADR 125, WebM, Standbild als Hintergrundbild, Anhalten-Knopf oben rechts), gerundet; Intro mit Etikett und drei Kärtchen; drei Leistungen mit Foto; Über uns; Kontakt mit Formular `kontakt`. Farben, Instrument Sans (eigener Server) und Texte übernommen. +- **Ausgebaut:** je Leistung „Was dazugehört“ zum Aufklappen, „So einfach wechseln Sie zu uns“ in vier Schritten, häufige Fragen (FAQ-Auszeichnung), Fuß mit Logo, Anschrift und Leistungen; Impressum, Datenschutz, 404. +- **Separate Seite `/verwaltungsanfrage`** nach dem Muster des DEEG-Preisfinders: Formular `verwaltungsanfrage` in drei Schritten – Verwaltungsart als Bildkarten (die drei Leistungsfotos) und heutige Verwaltung; Objekt mit Feldern je Art (Einheiten/Stellplätze bei Miet- und WEG-Verwaltung, Beschluss nur bei WEG, Wohnungen/Vermietung nur bei Sondereigentum), Fläche, Baujahr, Ausstattung, Beginn; Lage und Kontakt; Zusammenfassung. Seitenspalte mit Ablauf und Karte der Ansprechpartnerin. Hero-Knopf, Menü „Anfrage“, Ablauf und FAQ verlinken darauf. + +**Geprüft:** Bildschirmfotos 1440 und 390 px (kein waagrechtes Scrollen, keine Konsolenfehler, Klappmenü). Formular per Playwright durchgespielt: WEG blendet Einheiten und Beschluss ein, Sondereigentum-Felder aus; Zusammenfassung vollständig; Absenden mit Erfolgsmeldung und Eingang in `form_submission` (danach per Reset entfernt). `test:links` (4 Seiten, 24 Adressen, kein toter Verweis), `test:browser` gegen 8108 grün (axe, Tastatur, ohne JS; HTML 70 KB, 3 Skripte). Lighthouse (`audit.mjs`, je drei Läufe) auf 8109 für `/`, `/verwaltungsanfrage`, `/impressum`: mobil und Desktop überall 100 (`reports/lighthouse-luximmo`). php-cs-fixer auf den beiden neuen PHP-Skripten angewandt. Nicht geprüft: Mailversand, Safari/iOS (Video nur als WebM, kein ffmpeg zum Umwandeln in MP4), Editor auf diesen Dokumenten. + +**Nachtrag (06.11.2026):** Domain lux-immo.net, E-Mail info@lux-immo.net (Umut). Beide Formulare gehen an info@, die Adresse steht im Kontaktbereich, im Fuß, in der Seitenspalte der Anfrage, in Impressum, Datenschutz und den strukturierten Daten. `test:links` und `test:browser` danach erneut grün. + +**Nachtrag 2 (06.11.2026):** Umut: „Das Menü springt nicht zu den Bereichen“ und „ein Formular ‚Was ist Ihre Immobilie wert?‘“. *Menü:* Das eigene Menü-CSS setzte das Klappmenü auf `z-index:20`, die Klick-daneben-Fläche des Kerns (`.menu-burger[open]>summary::before`, z-index 29) lag darüber und fing jeden Klick ab – auf Tablet und Telefon kam kein Link an. Jetzt `z-index:30` wie im Kern. Per Playwright auf 1440 px, 900 px und iPhone 13 geprüft: Leistungen, Über uns und Bewertung springen bzw. öffnen, das Menü schließt. *Bewertung:* neue Seite `/immobilienbewertung` mit Formular `bewertung` (Objektart Wohnung/Haus/Mehrfamilienhaus/Grundstück als Bildkarten mit goldenen Piktogrammen aus `build-luximmo-assets.php`, Anlass; Eckdaten je Objektart – Grundstück ohne Wohnfläche/Zimmer mit Nutzbarkeit, Mehrfamilienhaus mit Einheiten und Jahresmiete, Wohnung mit Etage; Lage und Kontakt; Zusammenfassung; an info@lux-immo.net). Auf der Startseite ein dunkles Band „Was ist Ihre Immobilie wert?“ mit den vier Objektarten (Anker `#wert`), Menüpunkt „Bewertung“, Link im Fuß, Datenschutz ergänzt. Geprüft: Bedingungen für Grundstück und Mehrfamilienhaus, Absenden mit Eingang (danach per Reset entfernt), `test:links` (5 Seiten, 29 Adressen), `test:browser` grün (HTML 83 KB), Lighthouse `/` und `/immobilienbewertung` mobil und Desktop überall 100. + +**Nachtrag 3 (09.11.2026):** Umuts Korrekturen und der Flyer. Linie unter dem Kopf abgedeckt (Kopfsektion `margin-bottom:-1px`, die Linie zeichnet der Kern an `.site-header`). „So einfach wechseln“ und „Was ist Ihre Immobilie wert?“ sind jetzt Karten in einer normalen Sektion, gleiche Breite wie die Leistungen (bei 2000 px gemessen: 200–1800). Abstand zwischen Sektionen 112 statt 180 px, mobil 64 statt 88 px. Optionsfelder der Bildkarten rund (die Feldregeln gaben ihnen Polster und Mindesthöhe). Vom Flyer: Slogan „Ein Lichtblick für Ihre Immobilie.“ als H1 (ersetzt „Hausverwaltung, die man nicht merkt.“), „Ihr neuer Immobilienpartner vor Ort“, Immobilienverkauf als erste Leistung (Foto: Standbild des Videos, ein eigenes fehlt), WEG-Text, Regionsband, Telefon 07225 5080756, Hauptstraße 169. Das erfundene Zitat auf der Monogramm-Karte ist durch den Slogan ersetzt, „feste Preise je Einheit“ aus der FAQ entfernt. Noch vom Kunden zu bestätigen: „kostenlos“ bei der Bewertung, die Aussage zur Erlaubnis nach § 34c GewO. + +**Livegang-Paket (09.11.2026):** `var/luximmo-paket.zip` (Fassung 1.37.0, 6 Seiten, 26 Mediendateien, Video, 3 Formulare, ohne Konten und Anfragen). In eine frische Testdatenbank importiert (braucht wie jede Installation den Website-Eintrag des Installers; nur migriert scheitert der Import am Fremdschlüssel, ohne etwas zu ändern). Darauf geprüft: alle Seiten, sitemap.xml, llms.txt und Video 200, `test:links` ohne toten Verweis, `test:browser` im Entwicklungsmodus grün (im Produktionsmodus nicht möglich, die Prüfung braucht `X-Kant-Queries`), Lighthouse für `/`, `/immobilienbewertung`, `/verwaltungsanfrage`, `/impressum` mobil und Desktop überall 100. Nicht geprüft: Hosting, Mailversand, Schriftenabruf auf dem Server, Safari/iOS. + +**Logo als SVG (09.11.2026):** Kundendatei `var/luximmo-assets/logo-original.svg`; `seed-luximmo.php` schneidet sie zu (ohne weiße Fläche und IDs) und setzt sie als „Eigenes HTML“ in Kopf und Fuß, die Mediathek nimmt keine SVGs an. Das Seitensymbol bleibt PNG. Tausch künftig im Baustein (nur Administrator). Paket neu gebaut. + +**Offen (von Umut/Kunde):** im Impressum Geschäftsführung, Register, USt-ID, § 34c-Aufsicht und Bildnachweis als „NOCH ZU ERGÄNZEN“, ein Portrait von Eslem Kurt (jetzt Monogramm-Karte), eine MP4-Fassung des Videos für ältere Safari. + +**Nächster Schritt:** Impressum vervollständigen, dann Livegang nach `docs/LIVEGANG.md`. + ## Videos: Mediathek, Video-Baustein, Sektionshintergrund (04.11.2026) **Anlass:** Umut: Hero-Video für kant-it.de, „baust du video embedding gleich ein“. diff --git a/public/assets/fonts/fonts.css b/public/assets/fonts/fonts.css index 58e5952..56e6dfd 100644 --- a/public/assets/fonts/fonts.css +++ b/public/assets/fonts/fonts.css @@ -46,3 +46,7 @@ @font-face{font-family:'Lora';font-style:normal;font-weight:500 600;font-display:swap;src:url(/assets/fonts/lora-500-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF} /* latin */ @font-face{font-family:'Lora';font-style:normal;font-weight:500 600;font-display:swap;src:url(/assets/fonts/lora-500-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD} +/* latin-ext */ +@font-face{font-family:'Instrument Sans';font-style:normal;font-weight:400 600;font-display:swap;src:url(/assets/fonts/instrument-sans-400-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF} +/* latin */ +@font-face{font-family:'Instrument Sans';font-style:normal;font-weight:400 600;font-display:swap;src:url(/assets/fonts/instrument-sans-400-latin.woff2) format('woff2');unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD} diff --git a/public/assets/fonts/instrument-sans-400-latin-ext.woff2 b/public/assets/fonts/instrument-sans-400-latin-ext.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..0ea0da04cb2bdacb918460c16ca2863138a19f4d GIT binary patch literal 11144 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

;7&cRT>@vBgT`qml^v#W*W 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 literal 0 HcmV?d00001 diff --git a/public/assets/fonts/instrument-sans-600-latin-ext.woff2 b/public/assets/fonts/instrument-sans-600-latin-ext.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..0ea0da04cb2bdacb918460c16ca2863138a19f4d GIT binary patch literal 11144 zcmV;3D|gg)Pew8T0RR9104s<96aWAK0A3gX04o^)0RR9100000000000000000000 z0000Qf^r+SP#l4LKS)+VQh{#?Rsb-kOaV3m zBm;#g1Rw>5DhG-O3#1?!nE2-Du0*tTnC{Al%P_H=LRGrh+$F;s<{vY-4vH7?&aGZ~t>p#$( zzJGVQgb*T5ut3oe0tC^vNH8s>qKFO>ifGl>I%buLGiU0|x|%Q%1BmbU`|X}{-}{Dm z!V}XqBpO4=-y)_-G$kUH>5ys727a48S8ljnbf_}}1f|5lsA6>;{Z-Fb)$ngl^yw>! zdu{J*OHRB|Hi!l=74aWq|J!rF7~;vjifMA6t|5^bQfE3thK`3sV&47VGv6DHc2l2^ zMx)UvR2r2^qfn?6DwRHkLZ3pR(I^xOl}e@3j^oIY&T?eNC-4&m5XvrVUkJ*SUsUOU z@K9&7ETdKkyE@9Ps(2>^3kiu6aUg^+Yo@OkBd`5D@Aq|7)%MZ@~PweF285Xd-ve z)63veDZg!JbeJ6JL?Io#@8l&)_Ff<4ga$OB0VVJ$pah~QiVi5CBa9mAWWrJM^*;cn z%>wvuKmjX&XyM7F@;LIr_jS|%rdc>%Ozwl|-As0tC21azB_2c+aUh!gr>eC8=@dex zzT2HoSQsoJEeX*N;CBjKgNl%2C^}c}x{xk~>dO9jsNeg}zMYf))Xo(up)|!r8JxUH zzq1tmi!hY#hzbfLFalvgb|?5hon<@UV?7xH_M*eyB!2M)4|`kTP6~6K${wvOk7dPP zKm~lfKGYuij;)YSA*Q(vc>@U5y;S$o-CiA{5{s%zMP-VzPaT_*;||y82Uq1+#iowS z)RkS)im5)aX^K)#D8eWnpKz1}j47@BuQgYHPrm|OSO^w^;Emt-*>q9atuReaRIET$ zASw`u3Iqay7(qUWKZC$RDfnl<0g1uD4}k|k1ThFMkb)qmLeS777A+zNzM)*`G|i%_o~p@9QogBFB# z9SB`|5H{J0u-y)XUG^aya2Vl;qX@^HMCjFvMZWi?#p2;$Y1_7XYxh zShLqh04%Q6%oD4<3<1Eu3iv6&-wXIrz@JJV+}i{Zh#x;U!tm)x&@>XSycN9wLfk4q zBqoeiTS){=;r`->oCVxvW_UecJRUyIGT6v*3~+m)&9thX^;uf5qO$~Gk*^HMgP+;| z{1?9BI-mG$FkTFKLidkxpx1l7lRQzo0fkD>#I$B0o~Tm{F#qrqU(~C57ZknBQ+X9I z4>GBKj%YU2BbFbGzxRnBLWW#`S-Yr8QuC3&D}uoeQ9WCo-2mVD$5b z9cxQ%3qPB*)8o%vqI&GRRjbY&kD!hTthO0uS6x2F*)3ZG+iPYSxTteOesOc?N?yfz z2{W7fMf#@dCLX<&&#S(g9!;Q?aSl53Urw%}#YOxD^lA@xs?NjB^qcN(w&Rz@=6Kvzar>T#i(v6&>$LK_xVZJ`TE^R~-9o$z?p&)K-E<|^&$G=fLu=+UN+~;fU_Pw)W%`7Famtvm zrD|q_dCJ1Q@zvS$O=dY|x3zv%x~!&oTy}I4dfy+%DEo=lXFq z>MW)KxT~tXV!-JW>py5VDmr@Z zym<2!NPUv&1Vp5iG<0AjiVefXD<~`>Q#mJtw$Oznru_`NFMnD=NvvS0;61q7z763|FhJH4HOIIa`VnnOb(D}xCdJ}A_ zb1EM`e99ZwweI3-VSdqk7@JSdcE0h#z>MZ^yd$Dm($U5e*%p|GC?h6`MxkNVqAb&V zyqcwm|0-1;l_Gmb9njamF*8EQ&_$#gH7aW-ZnXo*84axtZ>c9Qrd-b)>lR*MjH?f} zmALIAle18vG&6Ro{vDk4!6cL(aU%^WCkx%Azn(=c_I7mEu!=G+=*#eu*}uQC2&Ikb zXvKhl^0e5;k?*w3w_L_0c}+jklMz-xb!1bc7p7ar`0H6R4NLiUGVG~~@g;X6EV>YW z7_9@|?MB;UJot}nU6tWOv8%{FyWx)2RI_`^`rxh7p<#7QLa#S<=S>+rP2%;+BLg>Q zPV>FRwbeTDI&*6}copln;~wu!L7TQ_`=TZ99ZeA)t4DSEr3e&RGn*t>k?xXArc07D z`=1i6S`nLcnX7OsROU={I9h2wGK-97%OPWV3Q5*?2xB*xa?wM93gcjRpYs6J+ z)25?K1|=Ed*a9B7XeDZA_IRYKdTX2cCf0zl&H-o`Dwl990am&ff(=I7EEecC z_{YbOR$SJ~dVCOw?Tgi9z(#(fqZT8)0gu}W+)Hry7$n5CS~Q;INXG!F>K5D*UBxz>5=+Aq(zals7@Ax6ZQLxP7pi6k#Bmu(@0FA{xAD#0XprELe=q@{g|-~q zGyS#0(91iKk_bMYdql-K_VEQHiRNLzfDU<~Ky(Lz0$3~n1scb*Cay)38WMB4gJzhn zCkh>AXPEBeU5OX?b55|8Wi}^bgHP2LRWGgS*E-R1CEye++(?s}yxiQoM53q~aQ3*VaO>iAbx zh_IXblBKjAO?8=(yPYs65<9>0BDI>ff>|5Yd5B9GlW~qANMsI2k_PMzabkG}jUicV ziBKy9#8_HP@C558Q9A(mVR2Ea*DKOo$R_L*6)andc4l{(3ZP*?Wx4R7<>xUz%3N!( zfn?SLVTet2dYvClW%v zCz>mRJ9`?3xq@aQSVem1#DOrk%5X$-&bQ%@EyS{OV?6PI;7grSFxeV9W~!1z`Jh!3 z4}Clna>67DSA9i|o)#@EW%R49Z2EOCML?~=j_>FaOy7xCl6!1pr~yhq#p6#bx&Y1G zh@>o`q%Y1^oGW20J6wAA32Oghg(<&XV#f=bZ2&AY)1)+MCe}?hq%J7s?D#Yp)8?#W zEtHo^vO6}m>37CxT(8ySl=I)$q2UMn9~ykIem`VXWL@BuUowTetM+;>wDc{BFKqH1 z2C7SvcA%%AuHuDa3r$KhW3GFpHwVBCoGJecm!6TFL@S40jDx6m1~=ANqh2Ui6{sO% z^p=;w3(lJR*)*kb#XZVQ)oSHVp}H%^<#?&^G?_3@Ebv8UC?wXU)cs<%nq|RRfzSPR z=)#RMG{5qp<;#yw029~SZXUe&@E0gVxJWS)EQ+L7!**}3Ms|6vRY5M%lS^$@YK2wS ztGu@wko*>vxFp(QX;Lk;2yhrq5+sSCz!GsrG+YQNg^9F)Zjz7rbV4csc?uUQm>-Kc zQLG}Eg@`4gVhFbt1M_Cb2h&_Y=s^Ys?kH&Gi~1Y|)4~ub4G|?-sGb*bMlnMByo3Nt zyA-0d1UV2~M+&hz1z3|ptbJI3^~%XrrW2}CuO?a4f6StR9h)bd7D99(ozPuu&ZHAI zQP2@{A$h6BAlMUZI6o?dz9jnqj$62PO;>*9;}0%GEu4}I0|6Cjsdoi@$UD=^iV}K4 z!$`A`p#sP0Xw`(g7w#I7UhH2AS&4l}51T{VnG5VlPrFN)4hqaO-6NwUn7u^%2~Y{6eB1Q80fh(id1Z^G8O7IaOl!)lg(Ioa3&s0DXCQxV>`g> zEx@6KhJWH88*RYDu&Mg>FyQ+Z08A0o54o@172w0S<~GCoIg4UAEY`vw`wni@`0`i^ z?O>Xpx>%iPg|yX)UaM|5T)$1IXo9?yY~`TjH>FEprF5nxZtl`6(C{$Lf1;)r6M{A1 zuJY5CxnmL29~o7&Xnk&(nm+so@wFJ4?C;e!t?vY4^7eA|--h#Ko)L1GpBDfa?isy% z3xCX3^c$OCd{U@rfMMzSd$&#YDu-xBVu<;ooLKQ7`P(R4Fr~3RM7JuP!(U~PE!`qM z@I-FqG0mNsE;#g}=#gd7=%BTLA(D7BkC`i^Je@QexI206n-kTtU5}+*2+Ac|fLF&}4Nw8|kHSmjNgoT4ca-hZ~ZC zDvaZVAn1`VTRG!T{r9I|EJA_dL{4Ifd`7F&8$3L{e0=@Q;ns*8>l@U^=9s0fLjW-Q zwHzQPynb4Xe?nlpHG%{A-$1?KMaIRyM&B+Pu$P;D;P_b3oMwhJ*3b}v?N;Cyy&2On zXsxA2pyPgRD|H3cos~6EUl-NDBZE00IG|h-p$QkL7t8{RWyqv{EIzCe7M)>bBD{z51Q^ zpod*_8T=Fb1aK7~KoJ%NcoY+%gczlqu#^jylVSy>H567;SxasejrDZOX_e8d;I5j7 z8g2}#7}fL9z?axFrJ;HR0ut}6HB5f9DyG8a$v`dnG z7TRsGy;2>N;fPE*j>~gWt`j&Eindj}9nu_@;sBdNvK&PKHSdoB=*Dc|rykdcukMS;nJ}7H> z&9M_K6p7>`5<{`SuARQaGB#1u#5s=GH$x6C8_6|N3|rvw1 zMUPlj3-E=$qWb?#fLYa;Q3xY>5osqCM!GP3Km5qz5^vEAviWA=P$1`bYU^3+cIgXLt~a8<^pYfNfn2l-_RWr+c-p{{ou$q1WjE5$ zx4JYrbF{6;OsrTW8lgtWU_6QsOrfr_qP2zo)mPT)yJ5mE3tD13AVvprFw#G0#N0Z9 z!uK@=>$O9Z${enlNiELooXmV^iT1~z!9D<+MY2U7wQu7CcRdCxUIDE>#gXM9qr`_) z+Ta?EV5E#iW^;(0|r(KSXP+FW$#qE?wUUOCWesBtnk_97Q}RZhl&55AW0=T>{*f(L z3$5EO{v0X1WqW=9mv)`95ncY`SFJEdfVvp|e^YY|Dc2Wv> z{)`>E$C+)~*~pu}tNTg9C(bz@{`jtxW?E*+X`Xnk2FyDiyp{c@Zo1^C{V{XcXw%q$ zF@0Y^y1npiw-@lfFLW8zinIbtK+`OdC(K)7vDj00hi8dQmU&vb1tjSPXEpA@D<<_K zr&D70?wGGR!DZ+|vZYuaSc=?t&qttzj02iG5Axi9{=O_7b$a(@v%UjI+{K@3bPa$F zZH6BqIdxnWD98pJMTbL-jldLBCvV3BiClV*XS^Ho%H8JXrSk4ID3 zclpi-iDk0Vf5^vkf7^J{}eW#fjv{igpos!hdJuo+kenrDeTQT|d(hB>^$7l~Qy zp3PePpC?abw#bCyRZP2-acCA+QG%$T>IIBbv!sFnjv5!w@FY&9QsU0=@#n}BiiVU5 zi{5g1nQczAxFQOm^>a4OY%Eh;I$`w^giOkFEohzS8P2$2nbek=4rk{V!35Q4q96<* zrNXJ~!Ff}xL#$!U-5v(^)K4^mZTL!K<0QtW)@uA@e%O)^x=rfiAFa$6ip2}`g$=v5 zY_-ms@n-Fxx7tRw&tjBvdua+Vc-ilW2KjxNFt}jdp0%gwbJ zZXpO&b4hD5CY6!`#_cfZu)eyddTr}#N@ao3pt%I8 zS}|PB7WHP#aw-)^-X5}M3>y@O)Yc2lvC~+F@E$v?gd?DaT{BEYCL+yz=gQB zM^}t+1OFI*!BI!zL8Cw+ygGJJzbTeJP*2Fzqzhp-Yl7s!c=Bxl&o*jM>>aW%+{=iI z^)VALxZaLo=ojSBE@fTthgJRR4szV){j#mdhTkWwyAy)5c@0iAz*&30+F>&Sa$Y4*?Aod*2J@(LpO@~t=2iLa_7MN)K zcgv+*BphBnSh@-1oZMTO#ap>Dmdshbb-1}dG<%#WgP%MlJS;TaoWc*zK>cxUtL1u# z`MSmOzB%Om5B0b7I&F8orNh&N?X2gdiBrxz>lN?+YJ#`diGOArn#b4U`w! zA?aX2xV0b&$hz{|D9d+k&9q2+e{I@P_U3vs7 z`{IV3wGlLUNK|xL1(YP1xX+E+3G0bDw&`ly_&io0d?qT1jK~YYu7;;MaJsr^RK9ki zxAHvBeS%ASDSQ2Zy?q0%s~8$eHXse~r%r#DSruwW^bo-R;9&otr(}>F<5AtBhNn3T zUcy=MN4k~a2RN&4W5ku`>?_WSU(sXbxImAU;P-KYf7Ffy6AwBrp3t+_x#&>qW3l7p z(+}h%h=*eq_r_M)pDdg%9=1l@tF5wMH_jFhxL-UXwX)CqkUx>f=z5Uakp=KhELR-) z0q9F2=yx-@WyxxRug@b0>17$=Eq!{W+_9BgS@JB3FtM}loL8vvI?w2Cye>599w18S zaRjY$Y0kbGK!94`OVGcVAtvx%mCG6J_{`Ped%3%iq~Qsu64Kanru3#%;OCu9`XwUk z;@7n{!SMz!pl4zS?yMa+fn`U&tC7+hrJ1`Z!pMK`+1-jM-l=bk+xS%?UoXL1(>qg| zIZQ+tyzHIWt@L+kKts>i8-2fP{98RQ9(F+7YofB>dF^hk;|yGEH{V=?=w6r{V{VMPxz!#V)e&GGq~{v2wYp3kv@Pl?0zBYN)dw=SUFEwuPfJ^LP?4pD zF+|Y~m2wyd-Yj}O7xi2*Q z-_->k{Dg?IP?|<tvOaQUO%oE8 zvpF5?zV{k!)@`aYmn<;~V>2<6Gv^sQ<73*G`SPZGARo$2`B=V|pOb$lcarm@l(bT8 zSVJmuP>gzLA3BaOWJ7+GKov9>Z3=IO->3da4N^*)H%m5U^TPlP5C|uLiXjn^+SR^q z%_F+{D*y%vloJ4DV|?V`*TQ*mu~2yegmN~FpML7V00MLZU>GJKlu{vINELE<-EpdG zH82&N%E@NHu$@-xzplWP<0&bhG|0C*`^Sw24J`7SVPO#YCUFd7`JaSM+*oCvUw^Yy z5=tOSr3h>Sg;snQrp$Vp{nG~jvHzh)bNpXIP}l-J?)O_hkSMa(B_GyczFVB7T_OZy z`lbf#XSFh1Q#4J1Uf|ikmJn=P(8A7VCe(y^<*wZzqRR4!@fNgH-#8LzI$hTi9$6#V z6jJbYhP&2gWwW|jSVqBBs7~Qma4N8DMTJy;0av=Bz?3n|s4j2~P5tG6A?(qVFoM#y zFAtCD^*@Cf1jj5GBc~!-TY(=0wqeZvL)h3!)V(Y`X%Pev;|mlD99xuHFt+0=f zKe-KVZu`GA&eSmHQzx45pwI|JKef%~-kpAi-Bey+$gsmln_Lv>uLdO<84*d#o3-=v zNAGXgE9GLIOXPG!HwcdM5^w*}I{$6(oDUW{bx@7LDy{EZ1GF}CxPz-mZBVHJo}fY; zzYX5&2LqLlS%ZP`dVVz{$#xSE5|5X#e`uF=fk34d0 z$7AtamPF6n%@{v`-Otoy*=OXhe=F6#_D|R!rR8M84fcNjZS<+sM(`Hh1KzM^%@jk( zujOfqG*;EH8WqkA^Agzmu5Hq2qSCV&Zb&@+F=fY0orIL^;w%Yx5XsG=MM8CMgem#;34rjLx#9`Wg$=dac>4t`1YyD&|AKK6}TA3*suVbX63H zY5{Cs`q%{TDZ2g`w}&H=8sC9lID4s_+T8&Pu{W ziCJFp@E>JNyxE^$d`^UPOVI!QFIE45+^y&evql1mTr;Fsy16hMiCNbib-Mqbqj8?ATzrwHRcpt4~R0>J1;c?xBP6cXP{3bfY7GN1U%#5ak zL^GGWRidWx2sa0ZFFO{6WFdj~zW%puJ9mPQA{ZbCJOKkEX$ZcZf;M=NO13g1;Y+cR36pC?L+OELT2SO zEJKK*V!U9j+^{GR!}8k7vGQ^p*9cQ7@}22KD#H|KV%O2BSz3Y6E=7e({4qE-%t=qQ zqY68Gi++~BTiO{p-Km9XlU-jduVvv5ne7}>^w(+nmZr`B3F|5}=NDJht5vIGk`gfO zT*|NERMzE~6GTZ|$FVS3R#qdPznE6n#yLA5?8YMn&_oe=K5g4D1gyZ~(D=eFg*d@K z$pr%Z8Rg@;vzTYFAxpR4)e1U)w`}B#&@g~G);ug145+QV>IZE z>F9)Q0C#pNS~jfqrh#u_LC9vu@HYagmyE9{A*7PsGMcmF=tgtlF)PcBRPDCD3adQV z!>wdVl!D7K$6f5yD(i{6b3S-x*NgMT*?xrSfJap53RH^RvyE}(2*S=gWcc~V8k*jaO`8$BzI4eIJh9h0A4EBOkUT3(5^Nq^;!Ybp$>oF=oMjkUZ z*WVWwT&YTRknLoORrP$&$ZsuHr|d?FdeI;$R=?IPFK1=lWjoHdd@tF^nPLs?_R;`ab`BMyyav6TRH2rL?q&=U-w6U& z8Ida+I;cu%Dc-8P?LOu#3KILVmn z2TpS2n1K@3I#Y2=HxSlvz~9odiyRN|O5H`Qm|dFUta?rHG$iTXy0i2^&0c-<*s@(c z0DW=2d?jWvZ0@r&X&U-=aVBKpwF=CxNxJ9t@9-T0h!Td^4$eSP6z_o422tySdJWNw zW%c`paW*`8+O|Oxd{t;uNk>CwCfA!oSX zWKq-@Z@h%mRCtiQ6}AGxevZfsALG>m>BiTut&=H!QY`xw0B%hF_YVL!ulT+<|J~pX zQpR2e;K2X@2w>kX8gR)agq;Zp!Ck+%CMm5q@I~q8Sp7dynn4JgEkXJ(*8EL?xoPq- z0_GIC`=desu{TiH6r~sgOM>{p+_ZvKhk9Y%ejTB7i-VZxTYAVcd|^x9q;Lm^wOF@b zljx-m61Pl)B|0#;7E>LNLmEjdl%WV%%K&~-n0Lv(_tWqA2|wmq=_mxRpNznGKt45{ zfu?;S)*u9~k`4;NbB|N=CIK~FD0aN^$ll`rVZO#0%I)PRqF3@JY?DADPFBE`VRs%` zdIaEJAvh!v=n$5Z$S3*wvryqXgvMDR>|h=G)9Lo8AnFe(# z|?ov}%ac%ee?`3lYIjPvQ4XKN(-eO~T z5C*}X&gb&?Z_~X1UvGsWmN*i?-~Z<6LV&L$BoPARL}GF#2~7Tq3rR@^bL9LJg-SwL zq9QbEHEOvnJUaEdYQP#d-HD2ao_Y}-BeVXEw?4#Vfxg7XPk#dpG>G_^4AyK2iLvl( zLRpwFzDPK>@QpCiDALUZ6ir6N5;7w(&Uh2Z_IDCp=psJLVw2RWBR_fyVh|GMj-nVv zL^V+yvlvT*OGr{0iqHL*B9?{L%JSH>>yXjO%D8mv(aY-i^s^=bzRY@9Dl=@vs4?Rv zOqw!n#;iH>7A#ughFhb_z2>U+Dj|DN7Z#ps5Nh|!Dw-X3q4u!GVXwMNtRFa9%PK0W z?5(_^U)Jof^M-!2qpa0o9Efk@Lb8@RXcbPVe$}J-e6F!(duJs4etbvNREIW+LURHU z2ivr>)!0prpp;hWI7B2-*d*)(jv8CmWTm(sS}rdB3PrEV{rIoaLypM9it2LCUE@m5#$kvmDE@n02;9w(u>^ zmdG||o3ov7mt!zyXlI1gf*Fz~G1#j3ziesXIN=mYv#uc=ub&pmRx5NqaC%O316r_} a%0^YvO`!7{w(v#3iD!~r>+pXXomT_Q*+)Ip@(dh?5I;y(K~jQX24Fu^R6$gM2qzW*g#s@`5eN$P9NiuZgK7XU)_4In z0we>6Py`?ahAIb#ISdCIdFVB4cLBN+#Pc<8pW>Pwh(ULF_=8d#KMR440|*d(R?h!_ zT7v%(V}7VTfb-NWb!`?*WO!7M(xR+h8mOw#%qp0@Fw4;Ew(mpxt0!~yUzklC?^2d{ z*XT{5Perkw*BCwYTIed1t4i&z=IYQfOez(^1SU#xXDUMnpf=zpfxwK+{N#q&^gH*% z$*;nGEts@nu~;mYdf+ev^d<~EFmM6`&K2RbaN;%y?{@F2G`Mb!a~-WRe=fM-f_vgF zUY_yD^y;U?|M@1SiRXPRcCS>5XRHEa*F#i|b?WuudENYT-^(TmD?osNVMrn%(Z~p6 ziVzp1fJkYiLKFcPg`l{>1Ok>W^g}8w^&_^0Vm^+>$#P-oN@GB37oQ*b*fH&x43Bg6 zZ|rsum?%C&szSw*#@nP#%_(ufNC=BF|-wo}>sRK|VP6O;SbS1L%ye|aD!a2bF8p{x+eJZDSX1hsWiDC^USH$kV4 zU->Kf2Ysy+%AETt75s%$J5vgM+aa^E0o|&K?mN-eTeqS;6Pa1jIawc7+y}FuA&@vp z2qc6A2x6ydr9H($PFn~p7J{&FvGP6uLP5OksworJ@JcnHKppc9=~2r2|(3p%M* zrOHuG>$FfI$f3NVmXoj!l`2&t{>N&=%C2w~!C(l{_Ky<6vzWT52WbaBDWz<28RQ?H zv3GA9BGS|wQ8k(*5pN3>jl~l2hlHKZ+4bdodrAuu_2Z^xIt%6&N}&h5&CKA~r;5!+ zmM}0p%Tr?;U*}FJb$;|)SrrngM=wb(s?tr*4m)Bn@^|L^GT*1>+y?6RiQ2>A{!fO6 zN(h7PpBL@UkT#%z6+oE6fqoUj8_+~y`<2Zy-M)ShyzT2J*2#1)(;D)pAhCnYUi*fV3WscJoKl!kBWNWc!>k{CI4Cl0wRS3PXwBAEGCDH_^%;q>oVTb^$E2 z4q?%yN}4iFow5m6DcUY&^!w>-|D`Pu$5@_7jF0q;F{OBiMk<8Ts7s)I(!u!&Pmx1{ z6bX`PbaZskclM&l&bVg(jQz7kaMC4;C_bp5g9xu6iaIR3zUTiY12XSBaA09zA+WG8 z5EvK;1R5F&8VU*;0t-*=%hj)Ya(ImP$fih^AdZO0QvU5;}jg z%ds7`MU;a?s89skJ{xSb$!512K`@Z?p?F}S$M(4rpt%F+8o~mk-2nsxov2uVm3>)w zNo>3-n{wibfz(6XGyhslcEt$JC>Nezp)u|TlvssOfPoj*NDess-aB9}2IeQ3t)R#;kA*GpSZ;CB(RUU0W0=``V z1jfH+fqbD@Dp#Ot4MtE5CrGMJGi-xvws>ODv}`9ro*&>aijy?U2}Q<*RQluGfpo`j zwzG0=&hvvXij%b2YUiC^e>$6Aie{*As_+Q8- zeAhP5yRQ&vmR?1)oA$~^UZ>vW6uHqCep0mdK0ZxRzwx&ybk>7%)Cb^OP*-cv+}G=s zYA3fa{k_!T(pOb&uEJVJ&fs9GMJ;rGa~li2GdysFH1{m&pdmw&QYludK@>d6wP zueS6r;>MW<#xIj9EBE{K-JP2LC1l8AzYq2N`5)r`#`}(U!8`KSNByA{M0Xc0ne*m5 za|`VaAdNVav1Zl(&7Gc>+&K3CRmoq&kNIO0p90T0ZoRtX?ZNk2I$k&UEL|Qso=IhF z_(BgaVtl-uy0~U;!aibL^7h1CN>6;^QbvJk%5;^f!54wtnNQr&78DY`*#D@FR(jPk83X$$NM$Vgbk@X zy54@W+AaB@UjUHo={t7+)ne_#0M_pyR#QBJlRzCg=#FCa!w`%>3HG1?t>{EA`Y?bo z8UKjO&A@PqAR59!>UcvnPyTt72e7`Q%4mz|+leU6Nu`0;{U5QTu0Q9E}HKnalr zRSWX!m}u<$Y?v#E8!3U%GrErVb>cCD|5e%~-%Fw7lNp%I9C@o}ff8B)N4ux&s}%+YQm z(7|JaA6pA+oLaRap7Y!H+dG}L`smyO=|MF_kR+41V7yuy{U51priYR2TUDPcbDp&Y z3ss2Uw`*vy;Gkh!DrMPfM5>80L8*5#rbE-YQAOIf2}ai6Hk6y_C6j@Fa-N1Mo(EFx z0!EEPrsnsPT-_0pwNll6;NLs54l7Ng4(po#4 zZMr^a+!tJ6E>kY91ZMMTlR0EASL6V6$Gl{r6@eo<3^<@^0T%V|GBv{oX?4JL#1lAF zj>ZMMB2JUNelA3y-c4D@zr97f-x#cHQg0<1 z_-Z-m(Mpc^$Dr2_{|c?H{R3G`dxrBMgGjZy$&AEV-r&(mBHJCfV_|I_oJJ zK}^Uq33ty)AS^Bq@08|%qwMoy*b?ZRLwW9ESkl^2M;KC= zabkzG>Tfbu?>~^n|Fp5%By~{7VBLO?VqCV`n$@52XXa`3W~CJm+O{lpn2#Toh1^f$ z@}!`ZQJLkpb!QDb7zJYk2u~<#v~;LbRFEOv+DrvV%QlsHCU)t#!r@M8fj3j~Iqn=v zQ3j`x!#-iVf|T`sZTLF#%JVr$*COr=IdlZjpKgNZ%rz+kMv+z*se2QY4#J-{HsQPT z?P;|W5cmmsL=H`fQdZC6At^hp9#Tpm`yn#ROs5gRcsxIi==7SPFF+QBITETDa0mc5 zcBHuw!{<(M>Q{kEP#1bw@&HW5++Iin9Pdyf+clybaJ2bWD`&QYkeJAb`0iez)NI1m z8JfC_5CW!j>sCvl188_hAV#GqSM`5yd{*jUdNXyy;5=wjIYf^132;lxp|44;+F>

;7&cRT>@vBgT`qml^v#W*W zk*y;-tGgD88nGITaTr3OgeaCB+3tmTN$nKaK;z<%^TG+2A`MTEraop@Z))#+eDDi< zx<5ZP<8_ropdbQHYj7tA)mil-BVfgyYu1<|(+teh@mS454NWkP5? zoz*44G;9zdj|OTDQPe|-5}2X+*kqUnan{3GFt<)fHtuxTYoban2g)n$9X$_XtqsC@ zY-h{rk6O>KAgRP>Ght^cMrMVuE2svb@5xI2*h?1_XW~M@0uZ#|ttmIw@pj%qSN+)E zwIEkF!Zs1O7ph8}%x0GceQTOXwd!Q^86Ddpf=y*s#5Bj9EsjVqZ|iS%6|!zidxr6n z3Vb&1`dD|Jw7uAv>m<5A=(C-oG)e2wgdiqDu_I@Fd8RZp-tRttlQkrAhZ=8?XyPUr z#Y%Np0He31n=5-0QAv}yDkL5uE(6L3hsv20?gdB%OJ9NlbF^=V^@;xjhoYn*s;grK z#2EXS)v4K^0r=};N~sRKA2O3#OHvWoR2s{P$m6VoD&W}6%$3w)6DAHilwD1tu>!Lr z)6sSzn4PROQ6nIaNp*O*sZ3`8ai(EqkhIftZBD? zeVU@LTOGU4uSn>lx&U)3)Vnm%vOpb-S0<&YH&l**gDM~SLwADZQ$qsDi zm=PZZv*_6k`_E{Sx}PFadU4yVtwNinCo!D|+%6#ziw`YUS;EZ5D19WuV6}8KF?+3gD3Uh2Lq!luXS7xND1%IRNZGX(B^$wngzZ0y$!qxHF}QAA8nu^; zg5yMI+Gp7AYn^H~peSIOWv#;<6jBa?tQc9Emh>igyof}c7KUcuq+RJrX0KLV=Ns_a zI)IG4eYo~^4jaLxgTJe@ImrSHlJB5_z|i6EPBSn;#!-kmeMktq8xlei+!^;+^FBj_ zSH2gJ`&l45|A;^N_TvFz?SoI_sLTs6>Op^UQKQog4#%NBE~5r0?TwQw`34Kut5*&|T(0VU*!%Dqfp*VPHBx zvm8v#Nxl_QYr_rz|0VJc&tDViprZ>sYk^RFvxhgKy^C4T8WB6%9YJQ{Q_L>IhdDqy zm`8+YR~O-p>q@UvwK87FmFxl=mekxouSJk;i|d*Z5RgD7uJ@=4Ac$#!Tsu+wHPkX{ zNYV(|_;ZP^yd{~@c0j?ZV5^py@c0dNBm1^=0s%MG)Q5iBG+yU>DIW2`H6`@V;cnUx z&|*@Y!#oP;L(TYH=enHpt88viq2}FFvTSyoz2xwB+9 z$8||e@*li|q2ZxP- zwy5F<#($9QpwPTG%y-T(Ii|JCM|%8y{5L)t?`UHG9)A%Se_Ry)MiFH^b4i-ZGa?Wgmi# z&PIq$#X^!U6>wS`I@2?Y4UPBL z3)n7goF!M|2YLxa#=IyEuYI&4G+xy@R(r1&q|QZ;tPPwxslhM;qd2 zxeU~XL!hVm$Ne9E-E1^pVOD&)*UGG1i6`2a(1)LSo%kxhQH88W+}fY^p&wkQ*9EbT z4~%#xKHhBVkI$dMz!tKe;sBNWX$kVStoZ$S6zq905hk9@50{&Y^EiiGq93$ZQ`<^A z;Zm`Pcvr7qX94BrnD7m7r_sT(mY~!#`n(Iq>iAYZwm*$d*vkY`Q@E72$ot_!ice}-I@J-*8W6&? z;=t9Q4)!!+>>72bcRN6*vz9dO9)2@#<_jzyMi9E<&a1qSOU-b8C11724pmbS>{FaI z;Pw}>I*;GJmZO%k`)Hl_J=N(b#w<-iMvLW1v&4g*1{X9laycEi3bBPCm^retp!AqC zZ6nb!Id$Jp<+2(^00yje4&Aoa#&7iFfoRgQLv=tQbXhV?REb6O%*jQ}+gMpvE)5Uj zCYTg@Gf(d$Wv55as`?LK(?X%MHK$lw%{E(^cx`_(;zfZ0XrC?uusUc6%E6;RJcvmW zk|_tu2fBf1L?%E3bO2@t_fiS&aNM!c=2TRDouSHQ3u)Hih0J2O6_+*5y;SQlBEnWv z$Tko5AIv7#<1(x3zB)rAZ zowL~oTaY3FZxIs0E(i%gm*xP6u(cAl0oY)syy=jVQl&6=4}y^e`BZAsl;g(GSb;Om z`K_i@_6_HCQVHma%S-(qlQ%8Ufco_%cfD_$I_vTqc(M&S#PNE&(6f;Uieg+SM*`A|HO@{IG{AI=KcT$bd(QY)(2Uff%Co&N&wHBh;c(M`7Y8Ck% zS)@A-xnWu8h%6zj&=Ji!hnqM44d6~N0t%%Kq=QF|m+`9jU@%OOFu|H*{U1SYQnBu` zJN5HfXVX1=bWcDa7~%$W**3jdq?8y`R}F=wlUWDm1Gy0JNYaOB<3k*m3<{@Pr|Mux z!kmu)4=p@Oq@}yp*SrXcBO748=Q+%#kjgpPsA@pfxbA8$vmRv1_`vDOz_4ebG%((tS%69|sA#snjt7iDV z7btFVhuX!;n#X~*HDm2*$oJ{Ju%RwaKwmH?n;Z}Uo&p&p#G_>_SI)=B7VMhs%w4wh z$EJ}FXJ}g&8gW+1cZhH{ z@`=c@xtZn2@gW?n6>Nn4vkL8H3szLFG)aO!`sPU;Hgy0UU9x(pk_vM$ys=2U{q|QH z``pn}v-$lH<49r3LxdHl(FO*f*=!`%Cd0B2qBQf+RpXn}kXmiZQxx#di(y*K-*YS5 zQ(_~;8kT1nbfuQU_;iqwq-eGjt)WxEPujzsBkN+5Cn&uA;*eK^YAgX~yM(PDJ~^3vO4z2q{ghbuuisc5Ew}_% zAQTW%NR4nfqCDM;mf~lnr?Um<+ba<1LCc$J9xWj7F);H65ndZQnG^=cxCzvOCzUJB z6y6JzmcB6^8*P9k8*4np+p{yZx`Qhhp(KvV3Ukh2`$4e&h_#`4Gjyucp7uIRj!r4> zWSw(%RV+p_!eu1+K%H6PKz@UhFj6iOLqILdnTtF}w49=&VRMPKs<>vuv(f;OjRX(E zUzoNR)2b!xpViH)~#Adw6xya2EbsCr9#PE=%hMzr05Bwy4k!fD*J#&*gH(pccf8 zcbm-_pUSMrOtPRD<(&5`wR;gZ3fnLQ2WG{uLuZrf#&471CAG$B&-(69uwwky=J8E* zF4(hT1-zFNQx}3Ckqbg%X;mM_n^2iMoHII!s8NT8EK1OF2K#`r3|ft(7D=8^Dw5ji z{Ep+3>A+x784Kl(eu9Eg9+Z0E90loB^E;Q66 zy`&n`d9K7XQZ%eM4f{3?LcQ?D34j9Uz+|vE-r+)0Ma@7S&uU#xDCxH*oi9)**XbZR zE8CgKEXjzUl8RzFg-0abw?)K(Osd^!MkOhz#j)mxxJRllE#N{4KsE7<5eAnV zqbRprv~Zge2tI`q8{&!hLtF@T1lKhiI$)hv=B_Edhh7OaGKI-zO;T>zqu_#jnDL*~ zruvlcRM&E~(`+2LBjc=~(FKXiL0i&QvCJsk{g|AEr5vnfV~0m%Cvk#ElPE--j_W&7 z4d@cujrCseG;Qg~seny-;EoQBp6VIXx&$h20F0*acw5U9$sRTnKoGlQpm!<<9x_Pc zNBJ%Jj2E&^>BppXU7wee)rpS302ZVjr#J~D_%^~>I2Fs8+5du`&5<1 zKS&@d*o8u7G(#71*@C=6w5s;u4wgg%Z!74C@%?&&Pl>7hXvmPrS{nOH^|yt1(~zpj#eI zvwNu{fD~Lx^azY{JOCxPQI{e}h{5Jz#1fi?nY6VFEaf|{5k}|TTc(!X=Bh4{tl{kY zp~h0i=};H3Mc}os9RdzTHHt1iIj`bB4$4;m1$+Kb^6L)hQmjjMSulG_kos%R$%Y=O zMyJ^WWNW8AZ22eCs3R>S$rN3RU0Ix}fMCyeej6m6krtHI^!^UBm@LIkljRa2p;6$@ z;VPLxWV#CL>}nL~MdidIfk17i*o*S-APCadlVfrJv9iM!L8sMAZ2LS0XOmL&E^Ce$ z_zgLpC|aS+)X2D5vPjF-Li-`F*DP_N2fA7~GYv2$X&))d;p-BeyU`iaAsmj0n@wJ8 z#g|V6qyu~;{Hw+GEW6{g*HK`J@Q~JYUPunio?V>D>#y6Z&+3&<_$*k@G_z-&RS&)X zwR(ukQJCvErlT_qr=+tm9--lsQd*lmp7`VHsh<-Ymvc;b6q!zc`MWe77KL$FR8oG7 zE6?qf1P%h1-wH4Vup$uJl*)YYVL0pd!AJQ>bF~ zfwhz$=;kbzTNmO<|2ZM2vpzh&%2*R#0X$EZKGt0h>qoDpi~^?xwIUwKpK0a1`)s76 zu~{>pt9&Qs+*U%wK(OuDN@wGaT5ge47eFO4rbg`LD(XjzO^r_@UXklSCVSqXcIg_Q zK|9mB>8}SLKemZ!@AFb>yO2!rLSt(xDD%YPmSiyBd7vj^-rL|iM4%zs3#@IAS&Vmj z>bTe4>nzm4%j`u&iEB-*e$hlA%3vAK@)}UB%B`}t_8+yj`IGAm=(g_t+*89&0!B(Q zA(>AqH}oc08tPZzMm%0$zy%J}IkM%S!uxOtCr4@g1C^xiSZ%GRL;2%#@M97*xMg{o zh$bFrcv#>NO)wbKdJQ})Pe#**q#7o!A9%k~kpeh{=GHXz@Csw^-}Xiyk{nLOHePC< z`3Sppxxg4Z?v0UVkUhJ5joh`j+Em-fg?nOlK&_F)Q06@xZ@w!PPzn3744BQr zdC~Qjk48q-l+)j;eb^DJC;fC(j?z7eZRjoilrWXa=^fnxD2G%;n zLa!25=iSDlCMIcN5bB(nj81}!xW68%F~^oEB~>{| z^_G_hQeA-BG3ip6-MT|XEd%VV(==(S|sVU1UVlNGFh(T)NHz}P|c3tXZDnRr&vzY#_<2Ixa>qbuS4SWO*O0zz&8#BwC&2{x5eC40 zv338Ty?p|}tCuHWletEE7y8&tEktfRQIK`_69c42p`5kzxPq$PNNS6}Vt693UN>9% zvTK>)m3aK*;yXEdx_!X=ENa|zXx=+f9#mmtJ4_P8?1aB4F`7g}+3PbVq+G~wiC=aT z(e=G~t9{d~t5cjlg7~H0PGMFypiJ3-j}AzS0zAplrJz=7 zhq(|P;sqqsEs%zo$HYryQY;91Z zq}i4Z)4o<}NcwCskY>0O!L09qKB%a`1(g4yFEqH&DwyBFu-;_yF5M{^xY{`B8ffgy z;RBhXFw7&;b9}hr%hZj&l;1UuCfY~4t1?+4-iGze{j&3sE`fzwyOMGR6nZKJs7jyO z5t?9gXk;^h%K9%B%yM@gFL2^`vZz0?h9G`G)3obMdo0WH8Y1f#@JkhbvdKwebYM;S zV;6rradl1^khs!j{5q>OzG(9Wd1L-uxkxC9_%Bw*j{V%Tx|Lfm6ukQk+8IgHU!D1W zNOiuF*nhXS{k+m%%fZ=@GOe&2FR{cDi*;5Z1zm_>h0g?6 znSf!D!_!_r6>%}Lp%x}0(CplAR1KuKSg|KFtn$_ySb~6im~IGBN9weM^<96~vAQ>) zK|t8l&x1PX8A_V0M`pS0RQ@Fn`14Y=y9-gN?nQhiSkO9{+L3BW9xuMl>0xb`$2~KJcLvKC0be(tVu(_7ebf1h*o=r;&lh$io~g z!wslK3fCbEo?^m%-^U_?LX0L^&{={YEDPwSa25#2&V(y(9B3`$NzRQ#e8##Yd;rWW zLnk(NZ9aEE5H8v>%h50v4|1(-kg(GL?S?(-e>C@dyDMZG}44p zP8Ktk=oR=l%OIPg`SUfpIhcVaVwSYC2LV4!)H;qQ72&BwX`)?8;wgY#4ZQSXX|dr< zl@XI18G-FAnz7Hv@-)EX64^~byp7;aluB_|pvLndBOm>Po~9kX%P7oE3WSRX{c+!V&-h5*V;0LA*78;C4KT z=qd!#nwEZSoo}6N?P*PKjcCni>2FbJNw-w{{%)RYHflQ6glmdws`j~5LP|BIykbr< ztMF#QzrYb4%&*Bk&Y5$Wx#*mGF7~+julbc@wz##g?{WkB3lkTZ~X=68P{u+4(=hA#IWm7QG@W&N8ad-Q0Cp2aM_}+Nx7hHdpSnc&u zRhP8H`9Y56K)#WiGdP9D{pgN=MYP+Ur~czDT6u$?v5bM_$+u=Rt$FB-_UJ>pMl&=D zzd(ZnZ(Sxq+QSqp349;$jQJ z0Dtz3c5bE)nqRF>%S(ot{0e#yzjA$k3aZZX|KeF_w+Z0M*T5!Wu#8Z!BeFQ&pEs58 z*^nUhy=Gx(QXJwB4=8vI0wh@9TN2MgQ7{>iOdhxn7B`-!d&f^!0#NuG#F5~8rFen38YFI>QBlZ4qOf~4#0b7dv7#R=j{YoC zF-;mzp#OX&Lf)V%)LW*9zj2MQGtB^|9wYw1nh=-DMAbu_g?cQGUz_u`r?(-ow`Z8- z?c{qg*R1U74pA^2vPR-FU?9C{Mx866iE!^SaXkYTs$Pn)E8UNXUatEUTchdyjX{4O zWaM*QnxMy7v)09!u=g#C&`3q=aCjT_N}e_rzMGF?VjUM*823+HB&;41mw=sYQJC{q ztmf^I$hY@oa(#`mxc9Og?(;$k?a&Dk8Gudd>!lr>2#d2$Ly?G|YqI*6I*<54xQuuP=}2_->a8Q z@a}1RzQKJNiIsDA6b76`s~OKN>!AMpLgw967^_&eQ~3Dnw9@66dq$ttlLLm|J&9+q z%Z)T~RD0=gl%$Nb4VwhJ{KHzk%HMl0uUXy}PKzE#eg0u$y~S!&GypUzW}Z+xFuU09 zlaAIkKt&4$8!OX%q0633d%DU;s$}^DSOE6> z7wrN-fl^;)SyU%)-sO)nRNpj6>8&tT7RZMOl!$`O4#Tux%(%|cW55uK7eH`?HF_KX zvw-~HlgW)rI`L0Vjngfqi+2?}?QFkgw=K;kU2l^p7U$e(P-s8H(jdA;G>T1(kxTCC zV6>e2s3zzv^T1&mWM21KMRqD1coW$nyTg>gA_z(tknPPkh+dNMta906%|gEZDzPzm zE};`zwW@iBm>R~JtBZZd>J}Ij|8{G6I_+#wye>9IT~yn#tcbN?#FCjcYHyH?(T!<0 z0fXWe^{RE7sB!t+{0^9po_FOg4 zIC?ZX>>nA}`fEmiE??EeR#P=ILYs-1eYJ4(*IIjn_xMc^#XwQ>?mMezz!9we$g2(c zhfXtWg@XWsQ(}jIgzdWv_)3l6{BXDoHqOfjOhiFX=`^%m{q|I|N3m9&3$e$kISX)H#_!lSwv^j(s8~Rf)KHjZu4e zYr1$iCP83xTLY`Zfb|Yl(|UX6zMfly9y~7LbeIWt(r_Y)8^tWc%`&e}3NfA^epDWt zq-L^DJ!)0KQ8BHwHx9`w_b;xYfhgT-qk~no|K&pA*q2yO`U= z(3!YYRxGI8BfJEg`WBNoP&a%DDc$4mFu+57aJf`WN3fk@fUd?G6le7+zzzc<5Rd&>&8FLuerX7*51cNed(YS2x*^Jw8JJ2k) z!V-ju_rz%l_6sGEa!P$^CbG2jk zOlq-?XjH*LRbDoZnJ62ocWGVaCz(}?BRHXH$Tgj2Fcb!wbDQ}i6S$ySa+`cztJPm( zfCkzIMaADZil2Em-{~5q(gY_pnuICUqycUP8h!_tWa_oXfA!gtSQhDWh|1_#PzkKO zrEerFDeOy-IKd=C#h0$U$#De@Fw{(ge7uTD7bh952O~HGAVyfB5@u34f6PlFMXM^z zL1-q<66Ow5F{6l>gl7}#XBJuE!>0IIx9Es}>Y^6KgWlq93{fh_x&CHK{oi$9D)9QtNTI5`sE5 zjwLZ5CO(rV>bY)iMn?I0y@*qc`q_-)fi77qTAXK3!-DjFxzRx5a&o7{*>>d5q;Lv# zu&z-a$|(g{Loqa|g`Tj?9xgnIhzjJ_=T&0hU7@zfM(cyigdD@rTmk-5JA%uqok6g! zCI}YQ2KI(}VkO(}AP*9GXr^k1ayirq%5Ry~xJ}66mC{m#WGz=UGR<}T%^wC*GM>yl zrdLqsF_nRhaT3jR`A^p~@s&w~aus%mwG6WpD$yjox|QAcB={|C30h`DSq71SC#@bRk*Tus_Mzg6nlP4C@WqxxbHG2 zQXwZ^{31=FDYG`_8f9Tebo_H2n%PRHbS5$bh^iMvLHaa^%tB9m&eP^uL(&w4k{$S$ zlm=cFq3(Kwkiz|RV(7z40)RSF`s>8WE1;Z~Znb1qPjG^3-dMa16Cu3FbF%A|f;^2D z0$Ybnnwz58pOANiy0|f|8bW^Uh;X5Yfk3HlHWyZ$Val%y3;6^_O;YdnnxEe+UAG|p>86XWT`U>RxUU&7lEeAXgnM4%w5c~5LaHHZ<;tJU!vTk5ASWhm2gbBIE-iwr!WfV@jB7l~#$R+dE;tLPb3 z4s}1f%+uFu40EDd(^S1q=y9lY2ZVm>0}w<&eRCS554@-90{5Ewz&K)BzE7tz{bW|6 z6X=EJwxejCxz`TAiVS!|g-jA+n22a^;762Lv6@A)(Ito$8N`L?5le{#QAoa!@VKG% zMfzhDi}NvZkCC2}vVzo55kXe6nznuiIReDh`OH$tW>_|sL=@&TSw%-6DMpbvo*FtG zUdy?}9Mtsw^xLzUQ@=-@ZhBxgq!+rB!*>d#7i0+B)Jq?X=hA#%`l;5iVl@6GD{iEN zI%ecWIdPJ#A|tG^2q`-BVvkPep_o}DuEKImsPC++TAcI3e#elKx56rWeTK249vH6~ z{9_>{d|;Wr)>5$S|>UF3u|Jb#FmA z+q0tI>!=Oi*_K;agjqxbfI;Oz=0ZRM5ojum#q+U1jz%jG7V;S|!NU3+*vx2@4f9&? zzECUPSs1bAFr%Vz)NQfKoq$A?dMsFz!(r?)#T}yoX=x4RyR$rH+Z)jmEXT@vb~0N` zwR}8J+&XS&YmFd+2qLHl?E-H%xBuxlP|7n>5!i%@`p@)b1lNPNWEUo$km)HzI7>^g z94oi31_lL&sU;-C+vASc^DU= zFaUVUN|IU#FO~BKbnfdNm?0h#03i*<<#I9ua|IJAgKvuhG%24RCc?Tcj(`O+wt&R)W2s-@g!(|zvvK5J%k zhTiP{f$r|n>QoLt19OwU3++w$4wQh>*8mg|tily2!)=f_(5n;zdULKy-IXdD6*@DR z%Slu%5@JHgWo{9wmA0nPUMsi~!i&(>h$l@+;ziL+piv>KuH<}P-R=kt-D5C#4o~QH zDHkHdV+JZ= zwPkPb$w=$0Tw+3$*v(_`%dWFJAld?!8jSR~6+W#ciQAeuKl4`ngJ{df$QO2zPz&<<0qBdN-=b@Teky6f_)grAaZwdT4RI!a}XlyVa9W|{xoSnt?WA5QVl=!!!g!6FBv)Vl8c`ta; zOWGYb?PCvo;!~gb+!rXc2CaY(IPlzepS!Di8Z52adfjX-V*jL zaTO_r2>cC2bi|fzv26igktAXY^O~mXnl?Y%Hg#`yTj`U3tG3XJrpJTf43OT zxAL>EBs81Kbi1^-W>mBnF@btoMF7_7uTIY4Wog5EHo!IjRmA@~tOA}U-Q>}URtEaR zY&^j6Y2<&|v=r@4bI>saRy~oZ(G`6K;RAd3EA&JF@}D606R(&DVH$E0{EdsU3SeviY%93cj`fX+7X&TbELncJGSFFku!7t>ju03a*ul+n+<@}G6_yO z;|&%USzR^4GdhnzcgfFD9dlvRK8;~aE}r1Oav^PP_-BrsCiA(Pvw5xC3Bb(lOx?`U zH)}gTymo()^Z5`W4S?3$fO+2oe)Nmq03dz62Ou}H!<9MV6+=#&aNn3=XIb?4fLWhT zybqcG`iqov$)A>jJcB%U`P5{(v-n!`m}DvCn>-xecQ9F+v;oN?Zi0pCcp5{CGJ zz|6MlC7M&48Duzuem?E^*X_sB_Hmi#Wzzu~EVc_J&_KT3lZIB5f1X!60>91s( zdAc!^>hDcjXJUj%j;K%aI(hV6vln0}%S&m%u!DvKc@ z3XB8RHcn=vb%SWS3UoeVw((XhY%roW7jiQADXb~TjIZ~aXZR}Y>{trYg1{6XeV77F zm8l;LMV}L6ED>^?S)D`eyuK zQ#|PWqw07Wd& z%eqr#1w`JZO<4C5N*f|u)gBRJH9^bd9=)z=`8WnEkn%D%DDXn~%4;e=zyMv=gOb`y(i1UQB@={OC0D(_@^Gj!%w}@ixm*kfcl< zi-Pvx?Xbtab>~!mZ7wS+nUuJ%G8ut+MH!x-m@{qvA@esZuNkXjCo14UVRX%~p2;uF z70&wigZIW1?M{M@#}EfS8Ke$NV^Rg9)BD1o*PrF?I@a?=gg;{V^_h#eUFaf@+VGqe zR1fa3ifVDnR}@fCr$ienC@~se=vh)S%IaiH(f$qUU9+`Ce?N^v@vSOBr;(o#KJ(}H z=WL`h_w*h)&KUkh<<}vJ*%7;N?ia#q*jwL^?XIe#BDDwj^G_ZN%Lzt1NsRXNlBCMb zM3#Sp10HM$SW$PQBK7E-g|m<3m@nE7(!A#A9Lr;^CH?(O7Gpn?c^WPH6Hb5I@Ayms z<(q4-(*suPvs09ObK8W+Zlm|{TW1lY4`=3k0St>WJ;1TxK4*zMOWNi#Je__E#WUW9 z(EggXOn2c)=`YwE8L@w%?MSQ$lJb+<(!foS5J;5ln;|oU^4Y2%Q}bX97oM1gsW#J@ zoZ0df8;H3<^n&jA?J2l$OwP{a2bf|;Ybu*aS_fNH2;X&>@9ldmCrz$vT#S z#V6Nfes!{AtC71=h;{wK^qp!?T(PVUmvdiP7az3V{mF=%MY(o2nV76`rpLr}HgChS z6n&IiURiqKMQ$ z^X6FmL^4l&HvTx`R(G>q<`s|6q8fs%VdT^&mo#1>jPA%*F{XdMHO6R-ZnhbH_t#f%d2=1t0sZseKYyFh zShWXY0F0_H`sl(cT*-nI@MIRSutBwBYqfe|s0t zv?x9PT3?=hSJi2Mw0hr`j}Z-{@80Wd4Bz8x9%1rj`R)yVR?pQTVn+GqK&P&G+8+5H zUz4L4AxrU-8*WWmr6$Nknb2C+-#k@2qaRH@V?axaH9VeOj0*iwV~S6wv?_IGo2>tB zw`P4wr_Z@lsL4leCEtCS^-)*t%7b@4sOdn8sjb&(CwAfV38vfj4?5!Fik87xOuXUm zN4xNGGZ7PN?#JSg@SdrhKInpXZk(A4Q}5>lbhS3CO2r1>5W@g>2P{) zkv!~6KK?o`dH?o&JoYbb@J)@y!bk+%hMU{!`lFrB*-hY2bjyX)EGb!(7906$s_w6( zq6(ELe@lxpdjp7 zu|DN)k0)5szSNn+vkmc1L2hqDcsw6t#~iku;V?MPWfGHx`jB_8O|`Bu*h4)NZKUuW zp&-6>8yKV=qJMFJ<%}dIn(gtY~PQE8;*Qf6nG`^NU!Un1F#ozZt96;ReL-G zp_6weGP!`GRrVBrrjKPd_c&;FoI&=4g7A)U+T|LfZ8M=TynBoR6{tCLuGw+!bMQ_= zqo>tVjGR@3`dY%VkIQ%M7h)ZWElCIer zc0j35*zNk{fSUau^#zwlVVDQ^ys{U(bmW>w);PG_zp2@;kt&M7<0^Lb5d}ZbozTd! zRN(IN{r-wL?cPF+SyFCvkGbG|J#BBnPwe$?$qw(&0=jO?%^Meva`oPVFYa;~4a&$&RTx_viV{YHza%Hh+lQe7 zx6r}i4COXxr4uK%Nqp_TJ|?=M547$5j)JN0_JT5K=EcL;-S2(4oEb}`GNXeJdmp&= zhQlCX)#Wg`FA&`4yK+HoaoIn7`;v3!?D_LeebMax!{zMNoeR$!f&2rGv!(YR)>YSA zuXzV~a{0_-A5c#=?gLARrTelUN5VdiXlX(Kv-Q;IU(Qn>Xx}84DeO~-I~IIxBuqw3 zW@N9RM||;AEE4^uF-iXfx#J9q#^})EM*{38TdH>m_@oB)o0SWRFXK8ey8Cq_Pp?C! z$R!T?Vu>jKjgPN)MVvM`;EXJ}@BBCQaLZm3ual<~!)?gAPuFnch?U4<+9{VyKbc2R zEN#(LnEH8s`_S;saiWiq;BrCG6!Vp7>5sKcGv3buXC0Ns*B;yIoa0s>7iH}PmPK?E zZq6`OKs-1TD8{0JJi~;Fu}G)@S|Fl~S*t8-ohYNYAu2X<6OQXii$O`s`5}{uAEA^= z9c{kevD3^&#NfHT?ZPZd;CV#v)*$Y<>I)Ay_nCs{#~!-w%w|%}iX}d?QNgf0DG`aqOd>bQm(2aQ z?UDb2br4;_Y*Q|mb#er8kVT7Lh1f}SybagqVB*C{EM9ggX;B}Ie+zCP2#)ow%#7O7 zI~L0x5ZTY1#k3e`{Zp*ozYu5cVq|ug+wUE`0m@+nnuB#?tjjP_gbAt_UjlF2>ilr9 zadWxN87f3Vp{$b$=AxSi+}zgrYM1d2gNhN0Sk1!f?fnSG^+p{T!2K%Iz;%4Z*j>5& zw>msrz=|S(dzXui)`KrD_}&{3E`EAB9W zSRIMSTgzonV=QKa4w3jZ-Czn8NYW!A+FHru4RCR5#3< zHSPV&U-qWTod$7Bl_?Ws0oDJ=(N_yNfyzmhK)fbFkd(`1p&$&Je#YgcxPW4L%rND0 z872z|ZqHhDk&E4c_7>Paw2cIsd2CV2f0<bZJ zvDw4zuzphgu)M3+KC1&F`@gv}3pUj+tX~GlP;<);7FoK8aYez;P_h!Nb+f&s+N?d@ z-P$Peti+e$4vjs{_}S-yISe*XwCh@?L{mnSsj{l0CQcF<^=ZtuRSwvhZPBP z4l7~qIK=NZF(iTny@4;eZwEG4i&$2w_Z!p-)+1JD@tjH*GMdfNQ59&b3os1*zB^!n z__S)}^EX)FRbn@Ase9Tg58>5!9)8mg%7>7 z?!lM5_Fr)Mz%QPu$5&qWICA~tD<>ak5B!2$ckikj?gjmKfBeeQ#DTy4sROJz@~`NJ zD~IoYFE+CdY0~?!E|>`q8#)W0{o)<3x(&6Tsz10OCl*Lq0Us`=m&!tm zZ*nxQoNeiNwsrF(Tfv)Maze->WkfJUkbw|^2cm>VBv!};BB5TcFaZV%Y)KM#4-Vq9 zTjK%o#);X%A>yv`zo&lE5}>5JlL^U=0A{rYaLG&}Dcutw!G8~Donxp3wB-Ti*a0SfRTs;sf+YRO=| zBjlzqmb4;H4vrEbBWBl|D4W$1AZn3N$`bE{cU0!hYNWhuxu2IEX1p{yE3Gt(z$4#m4o#)o!s7 z%^QsUPN%WIUk?n>*1cyQnuhP04*TO%rG@eEH59CmL~pwtDPC*AV>~UEHR_85ZYd1v zaT4>e-v)$oVf-Jk`xo8ixHWm9RSyoq%>=V_pFLSb&KZEbAfT%MRa1w>^o?Y(3x}eBv#jP;utR*6K z>CM$*dSoD}?#}rt`*-L3lKm9WLU>VQ&DD|-h+;jcl_aeQ!I`~;TW7QDO?I1J=OV5| zA}Mn`t46Fzsn%~$i&$DL#|&PTBxE$}V>uPrdTGUhHLH*O=T&OKgntyU0VR~19$gfR zHrQQgkBM`KLhhhdg7EKkt=&36Sr)BaA6)Ge_t??~UBA<*@6YRj0h-=%_Q7fE-D43? zc(k-I9^H(=DzEQ-A8Nn@JQbWW_9U1JMLkAZ*}HQ(LZ~em<2$kLUlR21cT^u__EU4_ z!3Rey^`{UCQTJX?tC?K5E4w+L5Q*SL5l`ct4C%n0vUN-7NX0A06fo`QWWz@>un{p*R zzF}*E@l++~O2M8v4qp_pFh@lDO;_D0wjo)9zVl^aM0_JySMW;?nCpbE9#;G>Sf2C1 zavvzZ)!-g%Smt?amc?Ih_|3Z7b+2OH&u{&)oqb#P?&VHx`&yCC1XGW5SK6`kh?d6l zGDE;5|K~@6ul}u!+&q8&II>M>=Ekm>@6lf+jJ6&BkLI1HyEP#Lf@R?cxIrpBA_sr4 zcATOE&IfNizH(FEZJw4)OU)6d40WJMPbx5QD07*3Gmn$Gdwxz~spi|3IpF+~-;0P) z1g1|8IwQbVsAWlO%aWF+wJoh{f%^ldn6YC&!TK>Y#cv$U#e4rb_DuR;*-h;ECn5W% z>HUR2rL|zo7c(8tAN1HojbwGr?S}d2+<>o)_ zx_iT#^xLf;DO?>YM$-C$)!L%R%kyKH5v&9i_i#e6NAsW_#NEozd~pj*fu{XI)4Re&@@( zYo{YBM>O{FQLP}|RxC$Eo3s~sTwHMXV%Hu+K5y9Las?c53UV<#wi}<;#Nz5{95-y( zf^h67#!WH3x(|j8+aKjdsxJr;$}Dc~!F_3$+t-WfaZ5%Ck?DZHzhInx@CeFUd%~m5 zssHvZB^#P$s^*rZ7XHh^ErMyeu)CWlFYf^73o(1_j9jnOcgc&H;b?aynk(9U4J9v8 zbk}p>nNb14>qhweZW!qn2*2rq`TQ>A+Zmpg&(rV(8XjK@0^4sVZU?{o_X@K6&F#o` zX;=4iY}M)A_T97F?c2?(a&|q04)-Kiw%g+gH;K2e(qo5963TZbI2$#>Xx^dU84eqE z<{Wk;Zk!FCCA|$ccVH3v&ZG7AEvmiBkp+56Ms)UdcNP9P6k*at@=B+ppfp9I+!4Rk z?sO5R_2C!eVN%(o)mw8&{h0}MxfzyYuSHQdG zCx|CLKaCy0fQcjQ$o=v7Z(4}Ue~T&h4PU?ZeN_Mcmj3P3 zowvBapW@L?v6;^^e1YkVO|5O|yWwSB-G=}A;~Y&b?diQ=fMXxR=I@;QWBZTyLOr!y~MfZ+)H^T3|?XXnBm`DZc3dj5HBtGu;E*KV@4wAvb(E4TxX z+ZSK@>`nCDM@{W-nc7ZWeAGW(*1vU`wq15|JO9k{T5UY;&z)WGb#pc=&-)&)29ECN4zBPhL0^iwBs9YYqnA1m`V#xtk8mWGEaw5vf8XN`+i0v8%)+&8s)yjV&s##+6=8 zs5~1}e)jSQ2Ti=<@V_n5rOe}Y@5m{S{Jl z&o}@7;6Se23diFPnS!#q4_rI={rC8EE_+N^}{9}7Gvzb!OOHT5V;&QtD3UiJ7b5;%Ji?dR zSAR?DXvVTuQf+@Y6pN_VNCkhgXY zfx3H;q39tih_)zf1uV11BCY-~K6H>zU8?nFID~$x9)@~pp#Bih-2<)|sOMy&cqUWj zgj3kynvQb^JNcCQp$vJ?_?<(cZX0S@1K{S%bp#YHm3bB&dWh|HZ zBF5do!qfD(tn5kde&r}CV{0aVCa;{@U>35s=Ecd(*_@Y=?~<}_CAB7p%EtY(BcBs3 ziRCz|L^ht?}GwBAi!cv#YnaaE1>LlqwbmuhxiK- zVTD9%Qy)`aNJm~xZ{EsKCUQS>`85kCT9+&nm86MU>g13NNL(Jm14@))7fkpD53qw1 zSdhRM_#Tl~#WBs&94*umE!SN-qO9>{U`bYOFWa7-nbDk9B1f%aI9D)%8C=6W7PE}| z*uq=%u);5#p&cE##6x|(Z}3wd^KZi|BBMB73T-6fqxd-f8;|0btePuRnF*PZ8?q_2 zna%%~q;hL_y-)`gtv}wBz5i9bgYU}gv|G!2O&{tP+R@GaW8R*sd1mUTb?(f`7{)ol z`DkXA?QPq*%~ zLASm|eJj3k#Z7?T{%5ra%o`8_-0aEL1gEtvEG@Z)E=2mNBk>Xujxs#pOS1H#cs&4$ zI>oyP8kLREX`vMLj}F|Rvp7t7UQ~jebq!a0j(J(&Kw8;B!r-+=kx9bM?ws5ngZo@^61S@6mg{>^~{r)bJZlpLr zm!=Jr1Nw4un&w^p0NMNJda-sQS>)N7@0MnuO6M1+AXF`Z%WG+BxH-JtDcg+NJp#HGYi<>p^Klv8Gk_%C8@}!>ZqOBdUglorrh2wgxfy$*qXy-VIO0MU4~EZ@67#v6YgS7LyVvw1Pe@Q%R<|@y@T2K&ef_aFYZIh z=`>u4$pmyFK?p#3SYqX^Jr9a+&^bqVEeJEr8)Y%y1?YH{r(#X90}?D*)OBVcTArWr zfTeCB@jYY=KsBM-YYXX;0EI`Z%J_T}%bK{_EH8nh@$A`m*#VMVeBA^Yz86ttsSH_) z@%Qq5U^YmCC--90Jgbi6CaZFm#Zsvc%ttcv6KFhGy`~9yZq*jnW^x#9`x}PwwDGVx z%iWKcV`Z5cwcWyg*6P`t_qGE`-9nB%*EB#iq15XOOE~fyZWrX{Wd&rxTFny`OAsr3 zCHA=4q?&DQoy{389E<3h?)VZXgw~@681l|#bYRq`Bef$ApqDlv;oQ-YY^IianjJ-f z&+S&Rbw2uQx+-!Tyw3F?b%j`NfvyVdIaNUC`8=#R!ph8!DhFNJuT&wtSTD#yM(GL~ zGIGuSP2dypm;RAWWx#z=)$xgHE{Y;c!0VKyOUUTi)mLi|Wc~1VLAmOq0SJ zLCX5A1qi@yPR+voma}+0xZG;nnRI%7_j5tu=%X763=cZ_0QEH28|AaXe0nM?^6pf` z+0lJJl$Pnpz0lltaO-bi}%gRe?OwN8}iC=FL#0&jiP9uEe4aJ3k;q9jcdh~d4q;OfSpvj)f{ zD9xjgXJyI4B7?9I$x2V$7~7MO5qm`rE+2Qz92Eh6ZUsT!{Z0!lB^zn$OvWceZ7Gi= zu!uM%lE4QkMrg1tX*tY_J$8mv{lH(9qW(-O6=EZ;5a z^dufpCjj3|jgsT6oFg#+VZw+gVX(;XO_MwpVYE*{7WSF6i^@nbXc}@lYM-migvJrHxnlIpeIS{EM;+uX`5D2(O!tz9jx85lof)Rm=S_pWLbe z(Y&-b6JIY3xg4m#ZC6}x;A{$D&wfLxuEXYSyJ zi$NhHr-en@Ox70TB!=QbXqmk=Q$;)tOhMt=0?^*tARrAtFCdn;PgMA|sD2mz9=z?v zN%gi*=(!~qI;NB-{SzepAT6;mf#qKLgTr&01gMbuiYk#qvA8XI zgOPF|)A)$}AZFDfE_7!_@yvU3Fv_brai{_q#64|3;;c9IRxR66S%zsmcD+9TE#u8T z%`{U?S~46=Qom_jfI=ZwtW)w)FRMoo?%<{F(onzZ2!tFU<}*w@YLYm1-d=?zveFv6 zq7${@+0Y;=6c{Ud;*oH+I2ug-C~g!eA$FSsz!-T&w?r0G9iD1Z>}a~SZ5qb1vG(S^ zKXla-6#~iZLVKcBmE2Go1#Y)!NBl4albV#Wa#zt4!QeJSG%u2|-Ce(uCk~+s8;mRp zal%W6NtRQ-nRlg9r4M?K(@z683_bNie&Iul3WUri=jOd;kC~zwR*nh+#fSiQ_Ib05k7&$#G(KfWfYxqvElx`Ow%A-Qq z#k}KlUThBRh@lRv zaUTb1>$dR%e47VRB)GJ79A@6qQn$Q>HQJW)MpzX6!OiF@%6Zgv!i)U^+!NTYo!Y*O zML{%uAxXMp>rAZ6F653w^Y^BUT2q-OYme4UTYs*ma^K)#MtH{InNYaK3L~E=&>K^C zucA)dS3MtjXu5ubQ0(`aGvHYcFKY+P&cX^9+o}t>riJ5`Ud^u|3cY-Ym)WdYm`auF zim=b?JUhXMK;;)68|_7zjIQ3nN6hm559wvg52%^LPvL!wJakZ}4j(SiM^=}GBtdUp z8`Pu-A~B=lLh0D?6v z?29tx0JA1NVN!GrzAE-$j(M#>#|_HJI_PmdH-rtPR*?WKUGm?Z^iB9`>!mK*Qh~91 z5(RLsBlEC%uqPQ1%3`Zox8W?;F}I(tJ$m}MifNf$aFkh*tBGxFJXp|+!O|rK-juS} zIeL|5h^WsurAjBBcDg%_oouev z{@!#a3|Y}c;`b+AU+42xz=&F`cAQ2oyLCGK+U8bAJpnevql7*mfRZ#L->`xyatYyY-p1CO1CXh!I$44JTt5F7z;Hb;V3}hsrXrl&aW2xTG}@FS zl*kgte$bxIC*u$7`htmG3Ia!M%h3q{_$fQ$>ez9q?ZxBgJX8r8qT<$zaf`Ks7w<6* zft$U+cGAqZ+ z>EWzIZsM0`dgGRQ-K}yy6J(kXV>e^0nQpG4l-+|WF$}~T;o=ys<#}=HSSuMbk^k-7 zw^SeZPr9-)TpYr9maz>=Jmrrc-sNzwdo1%cxK6^775R;0hbdhV)21s4h!;655?=_1 zuJ%8Nigbz7Bs`Qg`lB<~Y+0rWvvE3MAPQwK5d_M++dHGhDYPF`r1cj9{_TgV9}Y0rr9%2;#n8XL&uW{$ z{L=fzy6S-#z#ar2x6Ke~qs-Hi#YG#osIYLT$SqXl>XY`8U$_J|32mGxQ6xUuHpqGJ zS$w7Yo_F9C{Q$?%+qZxrY6kfagZK6KItOUE3ogN@M1Kmb$97HJf4%L~BVHAKfDW#$ zapdu1xYFnUHyU(~cQ>7Hl(cSt=|!YaFRS7jZrmQWKWRT`gGkP&JxN1jD@*XXS?@bO zB~)s|4w`qX15USC%Q7F2J#*NsvV3^-3W~;|QhwLF?m2oGelxU7MAeeUB*IABUt4>% zf6^O8yb9%|Ki?k>*G38|X7`srN~yc_!!}ZV9>Au<;S`41+*-$_^TC6NZBCnP)CQNd zydy9Ny;)&LpJG2l`1+2_qdGU|o=NAlQ{fx^^?7|g+5oV0O5co@&MfOTRDPgB(7d;YNU_Wns?zAgc~@4&ZauQb=++|w$qp4sz`p0`c%(ah7o2C+?tDHt zvb{B&BziI#ZfzeK%;!)L`D4}a%~s#hg@m~EfgXoy-Q7Bx6Rym(?)FE#!7lLoS))5D zF11}o|Dx+_?c0~CMqLdVVS+tBPbz9X&V4U4F)GLU$^H1Oyt3B84Y{V;+wS(W6DI5w z|Mu28!QX5{Z{p~~*}OQ0>u>K&9&=aP-Yijy45>De-$CosNnE?pb>jt5g{x4rRixu+q>ozsgaMb9_HkeN& zX366ny2$TxN;s2vFXwCdxq0JfN-H>3B6fK-P(UfEkhdAhcDg3#1`> zid1uBs>&8$6@QFCyxt&jR|vm7VimdoF4uxA5g#}k(0elUp1xnU>EVpEGbdUB<^ z0wm-d*(b^gM;()5>Y<8{)QY{KxF-(XWbC}F4+fUERDADsA0fy6s2nwm$hi5Ce?f-t z`~4A+TY#|8&0@3Tuk06HSE%W&ZuGl1OgDH`eNasAOa@A*-*8&kPf{2Ou1mA2^2OKUt$5BxjKSn4F4v~lTh zR#7&j4o_3?B?t8fLg^0xhPjPz1GjLCaeh%KNpOaleaJdT42OZeW{jCStHKIG*B5%| zp5x1Fx*hZIo`HwPiZp*qvA))}QXgSwjC;1k1(AAI8)$mjnBb=EujH7qo$?Tq-k(I~u)qdU}yyR_1g2+i zNs_O17H@5S>z(Q9!My3ZD}SM}V(w(wtmFv}kmbdVdTb4cqF@)Spm9c+inV+&nZTzP z%}+f*-%#F$-paCMYrNDk{#cXIX@~P>bl(5}Bv%59DnM9qTKDUOO5+ zXr&rOG^AWkz|FbIgq)j5KqReD8+pUp8(!3lGTtm_$dNptH>#u43Tv>xdXWzHNY!y_ zSuf`3e?1V)qmJs-vpd4gX0Yov%-|~<_TRRKTHw7kp9kC`cu3_1bMed`tkKok)o@DD zppQw+K+W|`zR;DYSYDB6Ly!CoMX|;$%Qie_nwEq=qbPEJkE$wefUe-H4$#$+V&=IC zBVTeEN{B^6!U|BwdTmA(1=fZ!A&RHqgtV|08Z><7KqKnS*cxmLLzcUM|9fVC2G!D; zWgtZXm#9RyZ8oviH>X8<&I=ZjqdY>p8PrtrfNnGcr|n2{I)%CyepO2VKB`dV&wW2o z)$lHh<*v%A$p{4U8oJun>Pj5Lxe(+IlTr$K$*UitN}U1b8T=V>34swMA&} z(jXFaZkBEf2Zgnl7`?1^GuNxA+$fEO5?nImNFgq&<}9LNB4w6YcsJsFZVjrAb6 z7JO>Ke$#Xfk+CP2{sO&G042yF35xGN$#1greEenWGTFWrEqp6Z3+c&;ki!~ecpnmE zi?M;KKUvms;rS7zG*m!lBRQ&3voIxK^MwrowMSzsG}p5v3@hc5!25yM4v#`wgstZc z@PoP1Jore0CjdlqrMC>uK`z{aF0@q5@-OVM4Hn3DWzL&4Q*>v)%=Ng5Zr{oY5rNqw ziZB(TWh6`tQGOFsf?=^lY99#2(hdW%hh zFCEQe@8g*Pc`62_4WW%oD=W!xsTjqo%&vuHSw6YEyQBdNS)SN&$Xb^a6pha<$r=}w zWtE1FF;Y;dl`+~dhAktRT3sgd$Aym0Mf^hnHDqj+qx_u9^f;eLcZ^hCKDS^(*@A;6 zM_qBH<6mdFD9g?{vB~+dtO$0;#3*Wx4==2wvdL5Ty1_!$9qd}=aN84yGl@NzIvN2I z{f7xlrj4p<&$7~3xhbiF9CAk$25a_I(T|yTmeNf`hDc5WHUg+1|n;~oP-y%P%K$~-{lK`&Y?%oco)$Zhqq3GZ4WT!cvP zdEW;<{0AD-%av2@2n5^azT`g!tyo8+ch)F7OsY7><0X`nd?k6k{v`v-`VAR$)GCAu z(udTBjT$quqs4_Y{!DMuRA|&;!}y0Bhts3VYuZMeY;epWkI46_0s%q$Y!tS|HjR$# z+;QbTcGadZ35&1^hj8(#Zk{`Yq;}r;56zz>JmNz5L_mbZmAG-|!81A{Ub%A>AkbSF zP7BuKCKCY`52^9yL!6uQF38Y;uS74aG|#*3qPJOH(x>0B5lp=J7J{oqvu7RC#^7l? zvEx^h4np7g-epoj7Ab|Oi$93~ffkVp5-dch#lpzQEfFq4q@|*I-b&Y)_L+}8@cDfD zV)c#YCUa0pR<2~qey_83VyL80sdWqTseGzLa^?9qeSR#|Po*|P_RqA8+QdP^%^S~O zSsBVb+v8JT%(~5aDkr0M-Ja@8zBI`)FjlIn>k}of>PAD!#lTQ$NHy$JAc_^m>EYs< zO>K=-HJ52z*=IJhol~{6lPKbE`1dK0jg2XkZFzFE&#|TDTqdPjRcTzYKOIKxwm?Z~ zN`s}L*BuS}5u;D1478e2!l15(^cLCrQW3mFD*2vX*Xu2<^yoSJ-u^!GIz|-xL3+djK8I`y{c@_%YG1Oyj0GjdNeClx-;{BYtpZ{1^@s6gZpFA literal 0 HcmV?d00001 diff --git a/scripts/build-luximmo-assets.php b/scripts/build-luximmo-assets.php new file mode 100644 index 0000000..39a2091 --- /dev/null +++ b/scripts/build-luximmo-assets.php @@ -0,0 +1,147 @@ + [poster.png] + */ +$quelle = rtrim($argv[1] ?? '', '/\\'); +$ziel = rtrim($argv[2] ?? '', '/\\'); +$poster = $argv[3] ?? ''; +if ('' === $quelle || '' === $ziel || !is_file($quelle.'/luximmo-logo.png')) { + fwrite(STDERR, "Aufruf: php scripts/build-luximmo-assets.php [poster.png]\n"); + exit(1); +} +if (!is_dir($ziel) && !mkdir($ziel, 0775, true)) { + fwrite(STDERR, "Zielordner lässt sich nicht anlegen: $ziel\n"); + exit(1); +} + +/** Verkleinert ein Bild auf eine Zielbreite und speichert es als WebP. */ +$webp = static function (GdImage $bild, string $name, int $breite) use ($ziel): void { + $breite = min($breite, imagesx($bild)); + $hoehe = (int) round(imagesy($bild) * $breite / imagesx($bild)); + $neu = imagecreatetruecolor($breite, $hoehe); + imagecopyresampled($neu, $bild, 0, 0, 0, 0, $breite, $hoehe, imagesx($bild), imagesy($bild)); + imagewebp($neu, $ziel.'/'.$name, 80); + echo "$name: {$breite} × {$hoehe}\n"; +}; + +foreach (['mietverwaltung', 'weg', 'sonder'] as $foto) { + $bild = imagecreatefromjpeg($quelle.'/'.$foto.'.jpg') ?: exit("Foto fehlt: $foto.jpg\n"); + $webp($bild, $foto.'.webp', 1600); +} +if ('' !== $poster) { + $webp(imagecreatefrompng($poster) ?: exit("Standbild lässt sich nicht lesen: $poster\n"), 'hero-poster.webp', 1920); +} +copy($quelle.'/hero.webm', $ziel.'/hero.webm'); +echo "hero.webm übernommen\n"; + +// Das Logo: Grenzen aller nicht weißen, nicht durchsichtigen Punkte, dazu die des Goldtons allein. +$logo = imagecreatefrompng($quelle.'/luximmo-logo.png'); +imagepalettetotruecolor($logo); +$alles = [PHP_INT_MAX, PHP_INT_MAX, 0, 0]; +$gold = [PHP_INT_MAX, PHP_INT_MAX, 0, 0]; +for ($y = 0; $y < imagesy($logo); $y += 2) { + for ($x = 0; $x < imagesx($logo); $x += 2) { + $c = imagecolorat($logo, $x, $y); + [$a, $r, $g, $b] = [$c >> 24 & 0x7F, $c >> 16 & 0xFF, $c >> 8 & 0xFF, $c & 0xFF]; + if ($a > 100 || ($r > 235 && $g > 235 && $b > 235)) { + continue; + } + $alles = [min($alles[0], $x), min($alles[1], $y), max($alles[2], $x), max($alles[3], $y)]; + if ($r - $b > 40) { + $gold = [min($gold[0], $x), min($gold[1], $y), max($gold[2], $x), max($gold[3], $y)]; + } + } +} + +/** Ein Ausschnitt des Logos auf eine Fläche gesetzt: durchsichtig oder weiß. */ +$ausschnitt = static function (array $kasten, int $breite, int $hoehe, int $rand, bool $weiss) use ($logo): GdImage { + $neu = imagecreatetruecolor($breite, $hoehe); + imagealphablending($neu, false); + imagesavealpha($neu, true); + imagefill($neu, 0, 0, $weiss ? imagecolorallocate($neu, 255, 255, 255) : imagecolorallocatealpha($neu, 255, 255, 255, 127)); + imagealphablending($neu, true); + [$x1, $y1, $x2, $y2] = $kasten; + $b = $x2 - $x1 + 1; + $h = $y2 - $y1 + 1; + $faktor = min(($breite - 2 * $rand) / $b, ($hoehe - 2 * $rand) / $h); + $zb = (int) round($b * $faktor); + $zh = (int) round($h * $faktor); + imagecopyresampled($neu, $logo, (int) (($breite - $zb) / 2), (int) (($hoehe - $zh) / 2), $x1, $y1, $zb, $zh, $b, $h); + + return $neu; +}; + +$breite = 640; +$hoehe = (int) round(($alles[3] - $alles[1] + 1) * $breite / ($alles[2] - $alles[0] + 1)); +imagepng($ausschnitt($alles, $breite, $hoehe, 0, false), $ziel.'/logo.png', 9); +echo "logo.png: {$breite} × {$hoehe}\n"; + +imagepng($ausschnitt($gold, 512, 512, 36, true), $ziel.'/favicon.png', 9); +echo "favicon.png: 512 × 512 (Zeichen ohne Schriftzug)\n"; + +// Piktogramme für die Objektart der Immobilienbewertung: goldene Linien auf Creme, wie das Logo. +// Vierfach gezeichnet und verkleinert, damit die dicken Linien glatte Kanten bekommen. +$piktogramm = static function (string $name, callable $zeichnen) use ($ziel): void { + $s = 4; + $gross = imagecreatetruecolor(480 * $s, 360 * $s); + imagefill($gross, 0, 0, imagecolorallocate($gross, 0xF7, 0xF4, 0xEF)); + $gold = imagecolorallocate($gross, 0xBD, 0xA0, 0x76); + imagesetthickness($gross, 5 * $s); + $p = static fn (array $punkte): array => array_map(static fn (int $v): int => $v * $s, $punkte); + $linie = static fn (int $x1, int $y1, int $x2, int $y2) => imageline($gross, $x1 * $s, $y1 * $s, $x2 * $s, $y2 * $s, $gold); + $rahmen = static fn (int $x1, int $y1, int $x2, int $y2) => imagepolygon($gross, $p([$x1, $y1, $x2, $y1, $x2, $y2, $x1, $y2]), $gold); + $flaeche = static fn (int $x1, int $y1, int $x2, int $y2) => imagefilledrectangle($gross, $x1 * $s, $y1 * $s, $x2 * $s, $y2 * $s, $gold); + $zeichnen($linie, $rahmen, $flaeche, static fn (array $punkte) => imagepolygon($gross, $p($punkte), $gold)); + $klein = imagecreatetruecolor(480, 360); + imagecopyresampled($klein, $gross, 0, 0, 0, 0, 480, 360, 480 * $s, 360 * $s); + imagewebp($klein, $ziel.'/'.$name, 90); + echo "$name: 480 × 360\n"; +}; + +$piktogramm('option-wohnung.webp', static function ($linie, $rahmen, $flaeche): void { + $linie(110, 300, 370, 300); + $rahmen(180, 80, 300, 300); + foreach ([110, 150, 190, 230] as $y) { + foreach ([200, 228, 256] as $x) { + 150 === $y && 228 === $x ? $flaeche($x, $y, $x + 22, $y + 22) : $rahmen($x, $y, $x + 22, $y + 22); + } + } + $rahmen(225, 262, 255, 300); +}); +$piktogramm('option-haus.webp', static function ($linie, $rahmen, $flaeche, $vieleck): void { + $linie(110, 300, 370, 300); + $vieleck([150, 175, 240, 98, 330, 175]); + $rahmen(170, 175, 310, 300); + $rahmen(226, 240, 256, 300); + $rahmen(186, 198, 214, 226); + $rahmen(268, 198, 296, 226); +}); +$piktogramm('option-mehrfamilienhaus.webp', static function ($linie, $rahmen): void { + $linie(100, 300, 380, 300); + $rahmen(140, 100, 340, 300); + $linie(140, 122, 340, 122); + foreach ([140, 178, 216] as $y) { + foreach ([162, 202, 256, 296] as $x) { + $rahmen($x, $y, $x + 22, $y + 22); + } + } + $rahmen(224, 256, 256, 300); +}); +$piktogramm('option-grundstueck.webp', static function ($linie, $rahmen, $flaeche, $vieleck): void { + $vieleck([100, 290, 380, 290, 325, 195, 155, 195]); + $linie(240, 245, 240, 120); + $vieleck([240, 120, 290, 138, 240, 156]); + foreach ([[100, 290], [380, 290], [325, 195], [155, 195]] as [$x, $y]) { + $flaeche($x - 7, $y - 7, $x + 7, $y + 7); + } +}); diff --git a/scripts/build-luximmo-poster.mjs b/scripts/build-luximmo-poster.mjs new file mode 100644 index 0000000..52cbafc --- /dev/null +++ b/scripts/build-luximmo-poster.mjs @@ -0,0 +1,37 @@ +// Holt ein Standbild aus dem Hero-Video von Luximmo: Es steht als Hintergrundbild der Sektion, +// bis das Video läuft (und für immer bei „Bewegung reduzieren“ oder Datensparen). ffmpeg gibt es +// hier nicht, Chromium spielt WebM ab und zeichnet das Bild in ein Canvas. +// +// Aufruf: node scripts/build-luximmo-poster.mjs [Sekunde] +import { readFileSync, writeFileSync } from 'node:fs'; +import { chromium } from 'playwright'; + +const [quelle, ziel, sekunde = '0.4'] = process.argv.slice(2); +if (!quelle || !ziel) { + console.error('Aufruf: node scripts/build-luximmo-poster.mjs [Sekunde]'); + process.exit(1); +} + +const browser = await chromium.launch(); +try { + const page = await browser.newPage(); + await page.setContent(''); + const daten = readFileSync(quelle).toString('base64'); + const png = await page.evaluate(async ([b64, t]) => { + const bytes = Uint8Array.from(atob(b64), (c) => c.charCodeAt(0)); + const video = document.querySelector('video'); + video.src = URL.createObjectURL(new Blob([bytes], { type: 'video/webm' })); + await new Promise((ok, fehler) => { video.onloadeddata = ok; video.onerror = () => fehler(new Error('Video lässt sich nicht lesen')); }); + video.currentTime = Math.min(Number(t), Math.max(0, video.duration - 0.1)); + await new Promise((ok) => { video.onseeked = ok; }); + const canvas = document.createElement('canvas'); + canvas.width = video.videoWidth; + canvas.height = video.videoHeight; + canvas.getContext('2d').drawImage(video, 0, 0); + return { url: canvas.toDataURL('image/png'), breite: video.videoWidth, hoehe: video.videoHeight, dauer: video.duration }; + }, [daten, sekunde]); + writeFileSync(ziel, Buffer.from(png.url.split(',')[1], 'base64')); + console.log(`Standbild ${png.breite} × ${png.hoehe} (Video ${png.dauer.toFixed(1)} s) → ${ziel}`); +} finally { + await browser.close(); +} diff --git a/scripts/reset-luximmo.sh b/scripts/reset-luximmo.sh new file mode 100644 index 0000000..11345be --- /dev/null +++ b/scripts/reset-luximmo.sh @@ -0,0 +1,34 @@ +#!/bin/sh +# Wirft die Luximmo-Installation weg und baut sie neu auf. Nur fuer den Aufbau gedacht. +# Erstes Argument (optional): der Ordner „assets“ aus luximmo-website.zip (Logo, Fotos, hero.webm). +# Dann entstehen Logo, Seitensymbol, WebP-Fotos und das Standbild des Videos neu. +# Empfaenger der Formulare per LUXIMMO_MAIL, sonst eine Platzhalteradresse. +set -e +root="C:/Django Project/KantSites" +php="${PHP_BINARY:-C:/php84/php.exe}" +export DATABASE_URL="sqlite:///$root/var/luximmo.db" +export MEDIA_DIRECTORY="$root/var/luximmo-media" +assets="$root/var/luximmo-assets" +if [ -n "$1" ]; then + mkdir -p "$assets" + node scripts/build-luximmo-poster.mjs "$1/hero.webm" "$assets/hero-poster.png" 0.4 + "$php" scripts/build-luximmo-assets.php "$1" "$assets" "$assets/hero-poster.png" + rm -f "$assets/hero-poster.png" +fi +if [ ! -f "$assets/hero-poster.webp" ] || [ ! -f "$assets/logo-original.svg" ] || [ ! -f "$assets/hero.webm" ]; then + echo "Bilder fehlen: erst mit dem assets-Ordner des Pakets als Argument aufrufen." >&2 + exit 1 +fi +rm -f "$root/var/luximmo.db" +rm -rf "$root/var/luximmo-media" +"$php" vendor/bin/doctrine-migrations migrate --no-interaction -q +"$php" -d memory_limit=512M scripts/seed-luximmo.php "$assets" +# Instrument Sans vom eigenen Server; der Abruf ergaenzt fonts.css nur. +if [ -f "$root/var/cacert.pem" ]; then + "$php" -d curl.cainfo="$root/var/cacert.pem" -d openssl.cafile="$root/var/cacert.pem" bin/console cms:fonts:fetch +else + "$php" bin/console cms:fonts:fetch +fi +# Das Inhaltspaket fuer eine Live-Seite (ADR 118): dort unter System -> Inhalte uebertragen importieren. +rm -f "$root/var/luximmo-paket.zip" +"$php" bin/console cms:paket:export --ziel="$root/var/luximmo-paket.zip" diff --git a/scripts/seed-luximmo.php b/scripts/seed-luximmo.php new file mode 100644 index 0000000..2d9b7aa --- /dev/null +++ b/scripts/seed-luximmo.php @@ -0,0 +1,1125 @@ +fetchOne('SELECT id FROM page LIMIT 1')) { + fwrite(STDERR, "Diese Datenbank enthält bereits Seiten. Abbruch, damit nichts überschrieben wird.\n"); + exit(1); +} + +$media = new MediaLibrary($db, $mediaDirectory); +$videos = new VideoLibrary($db, $mediaDirectory); +$settings = new SiteSettings($db, $media); +$pages = new PageRepository($db, new DocumentValidator(), $settings); +$partials = new PartialRepository($db, new DocumentValidator()); +$menus = new MenuRepository($db, $settings); +$forms = new FormRepository($db); +$theme = new Theme($db); + +// Angaben aus dem Paket (Kontaktbereich). Telefon und E-Mail fehlen dort noch. +$firma = 'Luximmo UG'; +$marke = 'LUXIMMO'; +$person = 'Eslem Kurt'; +$strasse = 'Hauptstraße 169'; +$telefon = '07225 5080756'; +$tel = 'tel:+4972255080756'; +$plz = '76571'; +$ort = 'Gaggenau'; +$mail = getenv('LUXIMMO_MAIL') ?: 'info@lux-immo.net'; +$domain = 'https://lux-immo.net'; +$SCHEMA = DocumentValidator::SCHEMA_VERSION; + +// --------------------------------------------------------------------------------------------- +// Bausteine +// --------------------------------------------------------------------------------------------- + +$seiten = static fn (string $w): array => ['top' => $w, 'right' => $w, 'bottom' => $w, 'left' => $w]; +$nurOben = static fn (string $w): array => ['top' => $w, 'right' => '0px', 'bottom' => '0px', 'left' => '0px']; +$rund = static fn (string $w): array => ['topLeft' => $w, 'topRight' => $w, 'bottomRight' => $w, 'bottomLeft' => $w]; +$quer = static fn (string $w): array => ['left' => $w, 'right' => $w]; + +$section = static function (string $id, array $children, array $style = [], ?string $anchor = null, string $css = '', string $breite = 'normal', array $props = []): array { + $block = ['id' => $id, 'type' => 'section', 'children' => $children, 'style' => $style]; + if ([] !== $props) { + $block['props'] = $props; + } + if (null !== $anchor) { + $block['anchor'] = $anchor; + } + if ('' !== $css) { + $block['css'] = $css; + } + if ('normal' !== $breite) { + $block['layout'] = ['width' => $breite]; + } + + return $block; +}; + +$row = static function (string $id, array $children, array $design = [], array $style = [], string $css = ''): array { + $block = ['id' => $id, 'type' => 'row', 'children' => $children]; + if ([] !== $design) { + $block['layout'] = ['design' => $design]; + } + if ([] !== $style) { + $block['style'] = $style; + } + if ('' !== $css) { + $block['css'] = $css; + } + + return $block; +}; + +$zweiSpalten = ['desktop' => ['columns' => 'two'], 'tablet' => ['columns' => 'one'], 'mobile' => ['columns' => 'one']]; + +/** Eine Zeile, die nebeneinander stellt statt zu rastern. */ +$zeile = static function (string $id, array $children, string $gap, array $extra = [], array $mobil = [], string $css = '') use ($row): array { + $style = ['desktop' => ['display' => 'flex', 'alignItems' => 'center', 'gap' => $gap, ...$extra, 'margin' => ['top' => '0px', ...($extra['margin'] ?? [])]]]; + if ([] !== $mobil) { + $style['mobile'] = $mobil; + } + + return $row($id, $children, [], $style, $css); +}; + +$column = static function (string $id, array $children, array $style = [], string $css = ''): array { + $block = ['id' => $id, 'type' => 'column', 'children' => $children]; + if ([] !== $style) { + $block['style'] = $style; + } + if ('' !== $css) { + $block['css'] = $css; + } + + return $block; +}; + +$heading = static function (string $id, string $text, int $level, array $style = [], string $css = ''): array { + $block = ['id' => $id, 'type' => 'heading', 'props' => ['text' => $text, 'level' => $level]]; + if ([] !== $style) { + $block['style'] = $style; + } + if ('' !== $css) { + $block['css'] = $css; + } + + return $block; +}; + +$text = static function (string $id, string $inhalt, array $style = [], string $css = ''): array { + $block = ['id' => $id, 'type' => 'text', 'props' => ['text' => $inhalt]]; + if ([] !== $style) { + $block['style'] = $style; + } + if ('' !== $css) { + $block['css'] = $css; + } + + return $block; +}; + +$bild = static function (string $id, array $eintrag, string $alt, array $style = [], ?string $href = null, string $css = ''): array { + $gross = end($eintrag['variants']); + $props = [ + 'src' => $gross['src'], 'alt' => $alt, 'decorative' => '' === $alt, 'width' => $gross['width'], 'height' => $gross['height'], + 'mediaId' => $eintrag['id'], + 'sources' => array_map(static fn (array $v): array => ['src' => $v['src'], 'width' => $v['width']], $eintrag['variants']), + ]; + if (null !== $href) { + $props['href'] = $href; + $props['click'] = 'link'; + } + $block = ['id' => $id, 'type' => 'image', 'props' => $props, 'style' => $style]; + if ('' !== $css) { + $block['css'] = $css; + } + + return $block; +}; + +$symbol = static fn (string $id, string $name, int $groesse, array $style = []): array => ['id' => $id, 'type' => 'icon', 'props' => ['icon' => $name, 'size' => $groesse, 'decorative' => true, 'label' => ''], 'style' => $style]; + +/** + * Ein Knopf als Pille wie in der Vorlage. + * + * @param string $art tinte (schwarz), gold, rahmen (Rahmen auf hell), hell (Rahmen auf dunkel) + */ +$knopf = static function (string $id, string $inhalt, string $href, string $art = 'tinte', string $icon = 'arrow-right', array $style = []): array { + $farbe = [ + 'tinte' => '', + 'gold' => "background:#BDA076;color:#141414;\n&:hover{background:#d3bc97;color:#141414}\n", + 'rahmen' => "background:transparent;color:#141414;box-shadow:inset 0 0 0 1.5px #141414;\n&:hover{background:#141414;color:#fff}\n", + 'hell' => "background:transparent;color:#fff;box-shadow:inset 0 0 0 1.5px rgba(255,255,255,.55);\n&:hover{background:rgba(255,255,255,.12);color:#fff}\n", + ][$art]; + $props = ['text' => $inhalt, 'href' => $href, 'icon' => $icon]; + if ('none' !== $icon) { + $props['iconPosition'] = 'end'; + $props['iconMotion'] = 'slide'; + } + + return ['id' => $id, 'type' => 'button', 'props' => $props, 'css' => "min-height:50px;padding:0 26px;margin-top:0;transition:transform .2s ease,background-color .2s ease,color .2s ease;\n".$farbe.'&:hover{transform:translateY(-2px)}'] + + ([] === $style ? [] : ['style' => $style]); +}; + +/** + * Setzt die Einblendungen nach einer Liste. + * + * @param array $plan Block-ID => [Art, Verzögerung] + */ +$einblenden = static function (array $dokument, array $plan): array { + $gehen = function (array $bloecke) use (&$gehen, $plan): array { + foreach ($bloecke as $i => $block) { + if (isset($plan[$block['id'] ?? ''])) { + [$art, $verzug] = [...$plan[$block['id']], 'none']; + $bloecke[$i]['layout'] = [...($block['layout'] ?? []), 'effects' => ['entrance' => $art, 'delay' => $verzug]]; + } + if (isset($block['children'])) { + $bloecke[$i]['children'] = $gehen($block['children']); + } + } + + return $bloecke; + }; + $dokument['blocks'] = $gehen($dokument['blocks']); + + return $dokument; +}; + +$linkCss = "& a{color:#141414;text-decoration:underline;text-underline-offset:3px;text-decoration-color:#BDA076}\n& a:hover{color:#7A6235}"; + +/** Das Etikett der Vorlage: Creme-Pille mit goldenem Punkt. */ +$etikett = static fn (string $id, string $inhalt, string $unten = '28px') => $text($id, $inhalt, ['desktop' => [ + 'fontSize' => '13px', 'fontWeight' => '500', 'letterSpacing' => '0.06em', 'lineHeight' => 1.4, 'color' => '@gold-text', 'margin' => ['top' => '0px', 'bottom' => $unten], +]], "display:inline-flex;align-items:center;gap:10px;padding:8px 18px;border-radius:999px;background:#F5EFE4\n&::before{content:'';width:6px;height:6px;border-radius:50%;background:#BDA076;flex-shrink:0}"); + +/** Die Kleinzeile: Versalien in Gold, wie „Adresse“ und „Direkt“ in der Vorlage. */ +$kleinzeile = static fn (string $id, string $inhalt, string $farbe = '@gold-dunkel', string $unten = '10px') => $text($id, $inhalt, ['desktop' => [ + 'fontSize' => '13px', 'fontWeight' => '500', 'letterSpacing' => '0.08em', 'lineHeight' => 1.5, 'textTransform' => 'uppercase', 'color' => $farbe, 'margin' => ['top' => '0px', 'bottom' => $unten], +]]); + +$h2Stil = [ + 'desktop' => ['fontSize' => '48px', 'fontWeight' => '500', 'lineHeight' => 1.05, 'letterSpacing' => '-0.03em', 'color' => '@tinte', 'margin' => ['top' => '0px', 'bottom' => '0px']], + 'tablet' => ['fontSize' => '40px'], + 'mobile' => ['fontSize' => '32px'], +]; +$fliess = static fn (string $farbe = '@text', string $unten = '0px', string $breite = 'none', string $groesse = '17px') => [ + 'desktop' => ['fontSize' => $groesse, 'lineHeight' => 1.6, 'color' => $farbe, 'maxWidth' => $breite, 'margin' => ['top' => '0px', 'bottom' => $unten]], + 'mobile' => ['maxWidth' => 'none', 'fontSize' => '16px'], +]; + +/** Ein Haken vor einer Zeile. */ +$haken = static fn (string $id, string $inhalt, string $farbe = '@text', string $hakenfarbe = '@gold-dunkel') => $zeile($id, [ + $symbol($id.'-icon', 'check-circle', 20, ['desktop' => ['color' => $hakenfarbe, 'flexShrink' => 0, 'margin' => ['top' => '2px']]]), + $text($id.'-text', $inhalt, ['desktop' => ['fontSize' => '16px', 'lineHeight' => 1.55, 'color' => $farbe, 'margin' => ['bottom' => '0px']]], "& strong{font-weight:600;color:#141414}\n".$linkCss), +], '12px', ['alignItems' => 'flex-start', 'margin' => ['bottom' => '12px']]); + +// Abschnittsränder wie in der Vorlage: clamp(24px, 5vw, 80px) seitlich, als Gerätewerte. +$rand = ['desktop' => '80px', 'tablet' => '40px', 'mobile' => '20px']; + +// --------------------------------------------------------------------------------------------- +// Website, Gestaltung, Medien +// --------------------------------------------------------------------------------------------- + +$db->insert('website', ['id' => 'default', 'name' => $marke, 'default_locale' => 'de', 'theme' => '{}']); + +$theme->save( + [ + ['key' => 'tinte', 'name' => 'Tinte (Schrift, Knöpfe)', 'value' => '#141414'], + ['key' => 'gold', 'name' => 'Gold (Logo, Akzente)', 'value' => '#BDA076'], + ['key' => 'gold-dunkel', 'name' => 'Gold dunkel (Kleinzeilen, Symbole)', 'value' => '#7A6235'], + ['key' => 'gold-text', 'name' => 'Gold Text (Etikett)', 'value' => '#6E5830'], + ['key' => 'creme', 'name' => 'Creme (Karten)', 'value' => '#F7F4EF'], + ['key' => 'creme-hell', 'name' => 'Creme hell (Etikett)', 'value' => '#F5EFE4'], + ['key' => 'text', 'name' => 'Fließtext', 'value' => '#5A554D'], + ['key' => 'grau', 'name' => 'Grau (zweite Satzhälfte)', 'value' => '#8A8278'], + ['key' => 'leise', 'name' => 'Leise (Fuß, Hinweise)', 'value' => '#6B655C'], + ['key' => 'linie', 'name' => 'Linien und Feldränder', 'value' => '#E6DED2'], + ['key' => 'auf-dunkel', 'name' => 'Schrift auf dunkel', 'value' => '#E8E1D6'], + ['key' => 'papier', 'name' => 'Weiß', 'value' => '#ffffff'], + ], + [ + ['key' => 'body', 'name' => 'Text und Überschriften', 'family' => 'Instrument Sans', 'source' => 'google', 'weights' => [400, 500, 600], 'fallback' => 'sans-serif'], + ], + ['fontFamily' => 'body', 'headingFontFamily' => 'body', 'fontSize' => '17px', 'lineHeight' => 1.55, 'color' => '@tinte', 'backgroundColor' => '@papier', 'linkColor' => '@tinte', 'containerWidth' => '1200px', 'headingScale' => 1.25, 'linkUnderline' => false, 'imageRadius' => '24px'], + ['shape' => 'pill', 'appearance' => 'solid', 'size' => 'normal', 'fontFamily' => 'body', 'fontSize' => 16, 'fontWeight' => 500, 'letterSpacing' => 0, 'textTransform' => 'none', 'backgroundColor' => '@tinte', 'color' => '@papier', 'hoverBackgroundColor' => '@gold-dunkel', 'hoverColor' => '@papier'], +); +echo "Farben, Schrift und Buttons gesetzt\n"; + +$medien = []; +foreach ([ + 'favicon' => ['favicon.png', 'Zeichen von LUXIMMO'], + // Nur für die strukturierten Daten; sichtbar ist das eingebettete SVG. + 'logo' => ['logo.png', 'LUXIMMO Logo'], + 'poster' => ['hero-poster.webp', 'Offener Wohn- und Essbereich mit Treppe, Holzlamellen und großer Glasfront'], + 'miet' => ['mietverwaltung.webp', 'Helles Mehrfamilienhaus mit Balkonen und gepflegtem Vorgarten im Abendlicht'], + 'weg' => ['weg.webp', 'Wohnanlage mit mehreren Gebäuden und grünem Innenhof'], + 'sonder' => ['sonder.webp', 'Helles Wohnzimmer mit Sofa, Esstisch und Blick auf den Balkon'], + 'opt-wohnung' => ['option-wohnung.webp', ''], + 'opt-haus' => ['option-haus.webp', ''], + 'opt-mfh' => ['option-mehrfamilienhaus.webp', ''], + 'opt-grund' => ['option-grundstueck.webp', ''], +] as $schluessel => [$datei, $alt]) { + $pfad = rtrim($assets, '/\\').'/'.$datei; + if (!is_file($pfad)) { + fwrite(STDERR, "Bild fehlt: $pfad\n"); + exit(1); + } + $eintrag = $media->upload(new UploadedFile($pfad, basename($datei), null, null, true)); + $media->update($eintrag['id'], ['title' => pathinfo($datei, PATHINFO_FILENAME), 'alt' => $alt, 'archived' => false, 'version' => $eintrag['version']]); + $medien[$schluessel] = $media->find($eintrag['id']); + echo "Bild übernommen: $datei\n"; +} +$film = $videos->upload(new UploadedFile(rtrim($assets, '/\\').'/hero.webm', 'Hero Luximmo.webm', null, null, true)); +echo "Video übernommen: hero.webm\n"; + +// --------------------------------------------------------------------------------------------- +// Formulare +// --------------------------------------------------------------------------------------------- + +$einwilligung = ['name' => 'datenschutz', 'type' => 'consent', 'label' => 'Ich stimme zu, dass meine Angaben zur Bearbeitung der Anfrage verwendet werden. Mehr in der Datenschutzerklärung.']; + +// Wie im Paket: Name, Telefon, E-Mail, Anliegen, Nachricht, Einwilligung. +$forms->save('kontakt', 'Kontakt', [ + ['name' => 'name', 'type' => 'text', 'label' => 'Name', 'required' => true, 'help' => 'Vor- und Nachname'], + ['name' => 'telefon', 'type' => 'phone', 'label' => 'Telefon', 'required' => false, 'help' => 'Freiwillig'], + ['name' => 'email', 'type' => 'email', 'label' => 'E-Mail', 'required' => true], + ['name' => 'anliegen', 'type' => 'select', 'label' => 'Worum geht es?', 'required' => true, 'options' => ['Immobilienverkauf', 'WEG-Verwaltung', 'Mietverwaltung', 'Sondereigentum', 'Sonstiges']], + ['name' => 'nachricht', 'type' => 'textarea', 'label' => 'Nachricht', 'required' => true, 'help' => 'Objekt, Anzahl Einheiten, Ihr Anliegen …'], + $einwilligung, +], ['recipient' => $mail, 'subject' => 'Neue Anfrage über die Website', 'success' => 'Vielen Dank! Ihre Anfrage ist angekommen – wir melden uns in der Regel innerhalb eines Werktags.', 'replyToField' => 'email', 'buttonLabel' => 'Anfrage senden'], 0); +echo "Formular angelegt: kontakt\n"; + +// Die Verwaltungsanfrage nach dem Vorbild des DEEG-Preisfinders: erst die Verwaltungsart als +// Bildkarten, dann die Eckdaten je Art (Felder hinter Bedingungen), dann Lage und Kontakt, zum +// Schluss die Zusammenfassung. +$art = static fn (array $feld, array $werte): array => [...$feld, 'showIf' => ['field' => 'verwaltung', 'values' => $werte]]; +$haus = ['Mietverwaltung', 'WEG-Verwaltung']; +$forms->save('verwaltungsanfrage', 'Verwaltungsanfrage', [ + ['name' => 'schritt_verwaltung', 'type' => 'step', 'label' => 'Ihre Verwaltung', 'help' => 'Welche Verwaltung suchen Sie? Ein Klick genügt.'], + ['name' => 'verwaltung', 'type' => 'radio', 'label' => 'Welche Verwaltung suchen Sie?', 'required' => true, 'options' => ['Mietverwaltung', 'WEG-Verwaltung', 'Sondereigentum'], + 'images' => ['Mietverwaltung' => $medien['miet']['id'], 'WEG-Verwaltung' => $medien['weg']['id'], 'Sondereigentum' => $medien['sonder']['id']]], + ['name' => 'situation', 'type' => 'radio', 'label' => 'Wie wird das Objekt heute verwaltet?', 'required' => true, 'options' => ['Von einer anderen Verwaltung', 'Von mir selbst', 'Neubau / Erstbezug', 'Ich möchte mich erst informieren']], + + ['name' => 'schritt_objekt', 'type' => 'step', 'label' => 'Das Objekt', 'help' => 'Ungefähre Angaben genügen für ein erstes Angebot.'], + $art(['name' => 'objektart', 'type' => 'select', 'label' => 'Art des Objekts', 'required' => true, 'options' => ['Mehrfamilienhaus', 'Wohn- und Geschäftshaus', 'Wohnanlage mit mehreren Häusern', 'Gewerbeobjekt']], $haus), + $art(['name' => 'einheiten', 'type' => 'number', 'label' => 'Anzahl Einheiten', 'required' => true, 'min' => 1, 'max' => 999, 'help' => 'Wohnungen und Gewerbeeinheiten zusammen'], $haus), + $art(['name' => 'stellplaetze', 'type' => 'number', 'label' => 'Stellplätze und Garagen', 'required' => false, 'min' => 0, 'max' => 999], $haus), + $art(['name' => 'wohnungen', 'type' => 'number', 'label' => 'Wie viele Wohnungen sollen wir betreuen?', 'required' => true, 'min' => 1, 'max' => 99], ['Sondereigentum']), + $art(['name' => 'vermietet', 'type' => 'radio', 'label' => 'Ist die Wohnung vermietet?', 'required' => true, 'options' => ['Ja – vermietet', 'Nein – steht leer', 'Teilweise']], ['Sondereigentum']), + $art(['name' => 'beschluss', 'type' => 'radio', 'label' => 'Hat die Eigentümergemeinschaft über den Wechsel beschlossen?', 'required' => false, 'options' => ['Ja', 'Noch nicht', 'Ist in Vorbereitung']], ['WEG-Verwaltung']), + ['name' => 'wohnflaeche', 'type' => 'number', 'label' => 'Wohnfläche insgesamt', 'required' => false, 'min' => 10, 'max' => 100000, 'unit' => 'm²'], + ['name' => 'baujahr', 'type' => 'number', 'label' => 'Baujahr', 'required' => false, 'min' => 1800, 'max' => 2030], + ['name' => 'ausstattung', 'type' => 'checkboxes', 'label' => 'Was gehört dazu?', 'required' => false, 'options' => ['Aufzug', 'Tiefgarage', 'Zentralheizung', 'Garten / Außenanlagen', 'Gewerbeeinheiten']], + ['name' => 'beginn', 'type' => 'select', 'label' => 'Ab wann soll die Verwaltung starten?', 'required' => true, 'options' => ['So bald wie möglich', 'In den nächsten drei Monaten', 'Zum Jahreswechsel', 'Noch offen']], + + ['name' => 'schritt_kontakt', 'type' => 'step', 'label' => 'Lage und Kontakt', 'help' => 'Wir melden uns in der Regel innerhalb eines Werktags mit einem Angebot oder Rückfragen.'], + ['name' => 'lage', 'type' => 'text', 'label' => 'Straße und Ort des Objekts', 'required' => true, 'help' => 'z. B. Hauptstraße 12, Gaggenau'], + ['name' => 'rolle', 'type' => 'radio', 'label' => 'Sie schreiben als', 'required' => true, 'options' => ['Eigentümer/in', 'Verwaltungsbeirat', 'Sonstiges']], + ['name' => 'name', 'type' => 'text', 'label' => 'Vor- und Nachname', 'required' => true], + ['name' => 'email', 'type' => 'email', 'label' => 'E-Mail', 'required' => true], + ['name' => 'telefon', 'type' => 'phone', 'label' => 'Telefon', 'required' => false, 'help' => 'Freiwillig – wenn wir Sie lieber anrufen sollen'], + ['name' => 'erreichbar', 'type' => 'select', 'label' => 'Wann erreichen wir Sie am besten?', 'required' => false, 'options' => ['Vormittags', 'Nachmittags', 'Abends', 'Egal']], + ['name' => 'nachricht', 'type' => 'textarea', 'label' => 'Was sollten wir noch wissen?', 'required' => false, 'help' => 'Anstehende Arbeiten, offene Abrechnungen, Wünsche …'], + $einwilligung, +], ['recipient' => $mail, 'subject' => 'Neue Verwaltungsanfrage über die Website', 'success' => 'Vielen Dank! Ihre Anfrage ist bei uns angekommen. Wir melden uns in der Regel innerhalb eines Werktags mit einem Angebot oder Rückfragen.', 'replyToField' => 'email', 'buttonLabel' => 'Anfrage senden', 'summary' => true], 0); +echo "Formular angelegt: verwaltungsanfrage\n"; + +// „Was ist Ihre Immobilie wert?“ – die Bewertungsanfrage nach dem DEEG-Preisfinder: Objektart +// als Bildkarten (Piktogramme aus build-luximmo-assets.php) und Anlass, Eckdaten je Objektart, +// Lage und Kontakt, Zusammenfassung. +$objekt = static fn (array $feld, array $werte): array => [...$feld, 'showIf' => ['field' => 'immobilienart', 'values' => $werte]]; +$gebaeude = ['Wohnung', 'Haus', 'Mehrfamilienhaus']; +$forms->save('bewertung', 'Immobilienbewertung', [ + ['name' => 'schritt_objekt', 'type' => 'step', 'label' => 'Ihre Immobilie', 'help' => 'Um welche Immobilie geht es, und was haben Sie vor?'], + ['name' => 'immobilienart', 'type' => 'radio', 'label' => 'Um welche Immobilie geht es?', 'required' => true, 'options' => ['Wohnung', 'Haus', 'Mehrfamilienhaus', 'Grundstück'], + 'images' => ['Wohnung' => $medien['opt-wohnung']['id'], 'Haus' => $medien['opt-haus']['id'], 'Mehrfamilienhaus' => $medien['opt-mfh']['id'], 'Grundstück' => $medien['opt-grund']['id']]], + ['name' => 'anlass', 'type' => 'radio', 'label' => 'Was haben Sie vor?', 'required' => true, 'options' => ['Verkaufen', 'Vermieten', 'Nur den Wert erfahren']], + + ['name' => 'schritt_eckdaten', 'type' => 'step', 'label' => 'Eckdaten', 'help' => 'Was wir über die Immobilie wissen sollten. Schätzwerte genügen.'], + $objekt(['name' => 'wohnflaeche', 'type' => 'number', 'label' => 'Wohnfläche', 'required' => true, 'min' => 10, 'max' => 5000, 'unit' => 'm²'], $gebaeude), + $objekt(['name' => 'grundstueck', 'type' => 'number', 'label' => 'Grundstücksfläche', 'required' => false, 'min' => 10, 'max' => 100000, 'unit' => 'm²'], ['Haus', 'Mehrfamilienhaus']), + $objekt(['name' => 'flaeche_grundstueck', 'type' => 'number', 'label' => 'Grundstücksfläche', 'required' => true, 'min' => 10, 'max' => 100000, 'unit' => 'm²'], ['Grundstück']), + $objekt(['name' => 'bebauung', 'type' => 'select', 'label' => 'Wie lässt sich das Grundstück nutzen?', 'required' => false, 'options' => ['Bauland', 'Bereits bebaut', 'Bauerwartungsland', 'Garten- oder Freizeitland', 'Weiß ich nicht']], ['Grundstück']), + $objekt(['name' => 'zimmer', 'type' => 'select', 'label' => 'Zimmer', 'required' => false, 'options' => ['1', '2', '3', '4', '5', '6', '7', '8 oder mehr']], ['Wohnung', 'Haus']), + $objekt(['name' => 'etage', 'type' => 'select', 'label' => 'Etage', 'required' => false, 'options' => ['Erdgeschoss', '1. Obergeschoss', '2. Obergeschoss', '3. Obergeschoss oder höher', 'Dachgeschoss']], ['Wohnung']), + $objekt(['name' => 'einheiten', 'type' => 'number', 'label' => 'Wohneinheiten', 'required' => true, 'min' => 2, 'max' => 500], ['Mehrfamilienhaus']), + $objekt(['name' => 'mieteinnahmen', 'type' => 'number', 'label' => 'Jahresnettokaltmiete (ungefähr)', 'required' => false, 'min' => 0, 'max' => 10000000, 'unit' => '€'], ['Mehrfamilienhaus']), + $objekt(['name' => 'baujahr', 'type' => 'number', 'label' => 'Baujahr', 'required' => false, 'min' => 1800, 'max' => 2030], $gebaeude), + $objekt(['name' => 'zustand', 'type' => 'select', 'label' => 'Zustand', 'required' => false, 'options' => ['Neuwertig', 'Gepflegt', 'Modernisiert', 'Renovierungsbedürftig', 'Sanierungsbedürftig']], $gebaeude), + $objekt(['name' => 'ausstattung', 'type' => 'checkboxes', 'label' => 'Was ist vorhanden?', 'required' => false, 'options' => ['Einbauküche', 'Balkon / Terrasse', 'Garten', 'Aufzug', 'Garage / Stellplatz', 'Keller']], $gebaeude), + $objekt(['name' => 'nutzung', 'type' => 'radio', 'label' => 'Wie wird die Immobilie heute genutzt?', 'required' => false, 'options' => ['Selbst bewohnt', 'Vermietet', 'Leerstand']], ['Wohnung', 'Haus']), + + ['name' => 'schritt_kontakt', 'type' => 'step', 'label' => 'Lage und Kontakt', 'help' => 'Wohin dürfen wir Ihre Einschätzung schicken?'], + ['name' => 'lage', 'type' => 'text', 'label' => 'Straße und Ort der Immobilie', 'required' => true, 'help' => 'z. B. Hauptstraße 12, Gaggenau'], + ['name' => 'zeitraum', 'type' => 'select', 'label' => 'Wann möchten Sie verkaufen oder vermieten?', 'required' => false, 'options' => ['So bald wie möglich', 'In den nächsten sechs Monaten', 'In einem Jahr oder später', 'Noch offen']], + ['name' => 'name', 'type' => 'text', 'label' => 'Vor- und Nachname', 'required' => true], + ['name' => 'email', 'type' => 'email', 'label' => 'E-Mail', 'required' => true], + ['name' => 'telefon', 'type' => 'phone', 'label' => 'Telefon', 'required' => false, 'help' => 'Freiwillig – wenn wir Sie lieber anrufen sollen'], + ['name' => 'nachricht', 'type' => 'textarea', 'label' => 'Was sollten wir noch wissen?', 'required' => false, 'help' => 'Modernisierungen, Besonderheiten, Ihre Fragen …'], + $einwilligung, +], ['recipient' => $mail, 'subject' => 'Neue Bewertungsanfrage über die Website', 'success' => 'Vielen Dank! Ihre Bewertungsanfrage ist bei uns angekommen. Wir melden uns in der Regel innerhalb eines Werktags mit einer ersten Einschätzung.', 'replyToField' => 'email', 'buttonLabel' => 'Bewertung anfragen', 'summary' => true], 0); +echo "Formular angelegt: bewertung\n"; + +// Das Logo als Vektor (LUXIMMO_Logo.svg vom Kunden), direkt im HTML: scharf auf jedem Display und +// ohne eigene Anfrage. Die Mediathek nimmt keine SVGs an. Die weiße Fläche fällt weg, der Ausschnitt +// sitzt auf Zeichen und Schriftzug; ohne IDs, weil das Logo in Kopf und Fuß zugleich steht. +$logoDatei = rtrim($assets, '/\\').'/logo-original.svg'; +if (!is_file($logoDatei)) { + fwrite(STDERR, "Logo fehlt: $logoDatei\n"); + exit(1); +} +preg_match_all('//', (string) file_get_contents($logoDatei), $logoPfade); +if (2 !== count($logoPfade[1])) { + fwrite(STDERR, "Logo: Zeichen und Schriftzug nicht gefunden.\n"); + exit(1); +} +$logoSvg = static fn (string $auszeichnung): string => ''; +$logoCss = "& a{display:block}\n& svg{display:block;width:100%;height:auto}"; + +// --------------------------------------------------------------------------------------------- +// Kopfbereich: Menü links, Logo in der Mitte, Knopf rechts – wie die Vorlage +// --------------------------------------------------------------------------------------------- + +$kopf = [ + 'schemaVersion' => $SCHEMA, 'title' => 'Kopfbereich', 'description' => 'Erscheint auf jeder Seite über dem Inhalt.', + 'blocks' => [ + $section('kopf', [ + $zeile('kopf-zeile', [ + $column('kopf-links', [ + ['id' => 'kopf-menue', 'type' => 'menu', 'props' => ['slot' => 'header', 'layout' => 'horizontal', 'collapse' => 'tablet', 'burgerLabel' => 'icon'], + 'style' => ['desktop' => [ + 'fontSize' => '15px', 'fontWeight' => '500', 'color' => '@tinte', + 'burgerColor' => '@tinte', 'burgerBackgroundColor' => '@creme', 'burgerBorderColor' => '@linie', 'burgerBorderRadius' => '999px', + ]], + // Goldene Linie, die beim Überfahren wächst; das Klappmenü liegt als Fläche + // unter dem ganzen Kopf. + 'css' => "& .menu-list{gap:4px 28px;align-items:center}\n" + ."& .menu-list a{position:relative;padding:12px 0;text-decoration:none}\n" + ."& .menu-list a::after{content:'';position:absolute;left:0;right:100%;bottom:6px;height:1.5px;background:#BDA076;transition:right .25s ease}\n" + ."& .menu-list a:hover::after{right:0}\n" + ."& .menu-burger summary{width:46px;height:46px;display:flex;align-items:center;justify-content:center;padding:0}\n" + ."& .menu-burger-body{position:absolute;left:0;right:0;top:100%;background:#fff;padding:4px 20px 20px;border-top:1px solid #E6DED2;box-shadow:0 18px 30px rgba(20,20,20,.08);font-size:18px;z-index:30}\n" + ."& .menu-burger-body .menu-list{flex-direction:column;align-items:stretch;gap:0}\n" + ."& .menu-burger-body .menu-list a{display:block;padding:14px 0;border-bottom:1px solid #EFE8DC}\n" + .'& .menu-burger-body .menu-list a::after{display:none}'], + ], ['desktop' => ['flexGrow' => 1, 'flexBasis' => '0px']]), + ['id' => 'kopf-logo', 'type' => 'html', 'props' => ['html' => ''.$logoSvg('aria-hidden="true" focusable="false"').''], 'style' => [ + 'desktop' => ['width' => '119px', 'maxWidth' => '119px', 'flexShrink' => 0, 'margin' => $seiten('0px')], + 'mobile' => ['width' => '80px', 'maxWidth' => '80px'], + ], 'css' => $logoCss], + $column('kopf-rechts', [ + ['css' => 'white-space:nowrap; +'.$knopf('kopf-knopf', 'Kontakt', '/#kontakt', 'tinte', 'none')['css']] + $knopf('kopf-knopf', 'Kontakt', '/#kontakt', 'tinte', 'none', ['mobile' => ['fontSize' => '14px', 'padding' => ['left' => '18px', 'right' => '18px']]]), + ], ['desktop' => ['flexGrow' => 1, 'flexBasis' => '0px', 'display' => 'flex', 'justifyContent' => 'flex-end']]), + ], '24px', ['justifyContent' => 'space-between', 'minHeight' => '152px'], ['minHeight' => '104px', 'gap' => '12px'], 'position:relative'), + ], [ + 'desktop' => ['backgroundColor' => '@papier', 'padding' => ['top' => '0px', 'bottom' => '0px', 'left' => $rand['desktop'], 'right' => $rand['desktop']]], + 'tablet' => ['padding' => ['left' => $rand['tablet'], 'right' => $rand['tablet']]], + 'mobile' => ['padding' => ['left' => $rand['mobile'], 'right' => $rand['mobile']]], + ], null, '', 'wide'), + ], +]; + +// --------------------------------------------------------------------------------------------- +// Fußbereich: Logo, Anschrift, Seiten; darunter die Zeile der Vorlage +// --------------------------------------------------------------------------------------------- + +$fussLink = "& a{color:#5A554D;text-decoration:none;transition:color .2s}\n& a:hover{color:#141414}"; +$fussText = static fn (string $id, string $inhalt) => $text($id, $inhalt, ['desktop' => ['fontSize' => '15px', 'lineHeight' => 1.9, 'color' => '@text', 'margin' => ['bottom' => '0px']]], $fussLink); + +$fuss = [ + 'schemaVersion' => $SCHEMA, 'title' => 'Fußbereich', 'description' => 'Erscheint auf jeder Seite unter dem Inhalt.', + 'blocks' => [ + $section('fuss', [ + $column('fuss-raster', [ + $column('fuss-marke', [ + ['id' => 'fuss-logo', 'type' => 'html', 'props' => ['html' => $logoSvg('role="img" aria-label="'.$marke.'"')], 'style' => ['desktop' => ['width' => '96px', 'maxWidth' => '96px', 'margin' => $seiten('0px')]], 'css' => $logoCss], + $text('fuss-spruch', 'Ihr neuer Immobilienpartner vor Ort. Ein Lichtblick für Ihre Immobilie.', ['desktop' => ['fontSize' => '15px', 'lineHeight' => 1.6, 'color' => '@text', 'maxWidth' => '280px', 'margin' => ['top' => '20px', 'bottom' => '0px']], 'mobile' => ['maxWidth' => 'none']]), + ]), + $column('fuss-anschrift', [ + $kleinzeile('fuss-anschrift-titel', 'Adresse', '@gold-dunkel', '8px'), + $fussText('fuss-anschrift-text', $firma.'
'.$person.'
'.$strasse.'
'.$plz.' '.$ort.'
'.$telefon.'
'.$mail.''), + ]), + $column('fuss-seiten', [ + $kleinzeile('fuss-seiten-titel', 'Leistungen', '@gold-dunkel', '8px'), + $fussText('fuss-seiten-text', 'Immobilienverkauf
WEG-Verwaltung
Mietverwaltung
Sondereigentum
Verwaltungsanfrage
Immobilienbewertung'), + ]), + ], [ + 'desktop' => ['display' => 'grid', 'gridColumns' => 3, 'gap' => '40px', 'padding' => ['top' => '56px', 'bottom' => '40px']], + 'tablet' => ['gridColumns' => 2], + 'mobile' => ['gridColumns' => 1, 'gap' => '28px', 'padding' => ['top' => '40px', 'bottom' => '28px']], + ]), + $zeile('fuss-unten', [ + $text('fuss-copyright', '© 2026 '.$firma.' · '.$ort, ['desktop' => ['fontSize' => '14px', 'color' => '@leise', 'margin' => ['bottom' => '0px']]]), + $zeile('fuss-links', [ + ['id' => 'fuss-rechtliches', 'type' => 'legal', 'props' => ['label' => 'Rechtliches'], + 'style' => ['desktop' => ['fontSize' => '14px', 'gap' => '24px', 'color' => '@leise']], + 'css' => "& a{color:#6B655C;text-decoration:underline;text-underline-offset:3px}\n& a:hover{color:#141414}"], + $text('fuss-agentur', 'Webdesign by Kant-IT Solutions', ['desktop' => ['fontSize' => '14px', 'margin' => ['bottom' => '0px']]], "& a{color:#6B655C;text-decoration:none}\n& a:hover{color:#141414}"), + ], '24px', ['flexWrap' => 'wrap'], ['rowGap' => '10px', 'columnGap' => '18px']), + ], '24px', ['justifyContent' => 'space-between', 'flexWrap' => 'wrap', 'rowGap' => '12px', 'padding' => ['top' => '22px', 'bottom' => '32px'], 'borderWidth' => $nurOben('1px'), 'borderStyle' => 'solid', 'borderColor' => '@linie'], + ['flexDirection' => 'column', 'alignItems' => 'flex-start']), + ], ['desktop' => ['backgroundColor' => '@papier', 'padding' => ['top' => '0px', 'bottom' => '0px', 'left' => $rand['desktop'], 'right' => $rand['desktop']]], 'tablet' => ['padding' => ['left' => $rand['tablet'], 'right' => $rand['tablet']]], 'mobile' => ['padding' => ['left' => $rand['mobile'], 'right' => $rand['mobile']]]], null, '', 'wide'), + ], +]; + +// Die Linie unter dem Kopf zeichnet der Kern an .site-header; die weiße Sektion liegt darüber. +$kopf['blocks'][0]['css'] = 'position:relative;margin-bottom:-1px'; +$partials->create('header', 'default', 'Kopfbereich', $kopf); +$partials->create('footer', 'default', 'Fußbereich', $fuss); +echo "Kopf- und Fußbereich angelegt\n"; + +// --------------------------------------------------------------------------------------------- +// Startseite +// --------------------------------------------------------------------------------------------- + +/** Ein Kärtchen des Intros: Symbol im weißen Kreis, Titel, Satz. */ +$vorteil = static fn (int $n, string $icon, string $titel, string $satz) => $column('vorteil-'.$n, [ + $column('vorteil-'.$n.'-kreis', [$symbol('vorteil-'.$n.'-icon', $icon, 24, ['desktop' => ['color' => '@gold-dunkel']])], ['desktop' => [ + 'display' => 'flex', 'alignItems' => 'center', 'justifyContent' => 'center', 'width' => '52px', 'height' => '52px', 'backgroundColor' => '@papier', 'borderRadius' => $rund('50%'), 'margin' => ['bottom' => '22px'], + ]]), + $heading('vorteil-'.$n.'-titel', $titel, 2, ['desktop' => ['fontSize' => '20px', 'fontWeight' => '500', 'letterSpacing' => '-0.01em', 'color' => '@tinte', 'margin' => ['top' => '0px', 'bottom' => '10px']]]), + $text('vorteil-'.$n.'-satz', $satz, ['desktop' => ['fontSize' => '17px', 'lineHeight' => 1.55, 'color' => '@text', 'margin' => ['bottom' => '0px']]]), +], ['desktop' => ['backgroundColor' => '@creme', 'borderRadius' => $rund('24px'), 'padding' => ['top' => '36px', 'right' => '32px', 'bottom' => '36px', 'left' => '32px']]], + "transition:transform .3s ease,background-color .3s ease\n&:hover{transform:translateY(-4px);background-color:#F2ECE2}"); + +/** Eine Leistung: Foto, Titel, Satz, aufklappbar „Was dazugehört“. */ +$leistung = static function (string $id, array $foto, string $alt, string $titel, string $satz, array $punkte) use ($column, $bild, $heading, $text, $nurOben): array { + return $column($id, [ + $bild($id.'-bild', $foto, $alt, [ + 'desktop' => ['margin' => ['top' => '0px', 'right' => '0px', 'bottom' => '22px', 'left' => '0px'], 'imageHeight' => '280px', 'objectFit' => 'cover'], + 'tablet' => ['imageHeight' => '320px'], + 'mobile' => ['imageHeight' => '260px'], + ], null, "overflow:hidden;border-radius:24px\n& img{display:block;width:100%;transition:transform .6s ease}\n&:hover img{transform:scale(1.04)}"), + $heading($id.'-titel', $titel, 3, ['desktop' => ['fontSize' => '24px', 'fontWeight' => '500', 'letterSpacing' => '-0.02em', 'color' => '@tinte', 'margin' => ['top' => '0px', 'bottom' => '6px']]]), + $text($id.'-satz', $satz, ['desktop' => ['fontSize' => '17px', 'lineHeight' => 1.55, 'color' => '@text', 'margin' => ['bottom' => '0px']]]), + ['id' => $id.'-mehr', 'type' => 'accordion', 'props' => ['faq' => false], + 'style' => ['desktop' => ['borderWidth' => $nurOben('1px'), 'borderStyle' => 'solid', 'borderColor' => '@linie', 'margin' => ['top' => '20px']]], + 'children' => [ + ['id' => $id.'-punkt', 'type' => 'accordionitem', 'props' => ['title' => 'Was dazugehört', 'open' => false], + 'css' => "& summary{border:0;border-radius:0;background:transparent;padding:16px 0;font-size:15px;font-weight:500;color:#141414}\n& .accordion-body{padding:0 0 10px}\nborder:0;border-radius:0;padding:0", + 'children' => [ + $text($id.'-liste', '

    '.implode('', array_map(static fn (string $p): string => '
  • '.$p.'
  • ', $punkte)).'
', ['desktop' => ['fontSize' => '15px', 'lineHeight' => 1.6, 'color' => '@text', 'margin' => ['bottom' => '0px']]], + "& ul{padding-left:18px;margin:0}\n& li{margin:6px 0}\n& li::marker{color:#BDA076}"), + ], + ], + ], + ], + ]); +}; + +/** Ein Schritt des Wechsels: große Ziffer in Gold, Titel, Satz. */ +$schritt = static fn (int $n, string $titel, string $satz) => $column('schritt-'.$n, [ + $text('schritt-'.$n.'-nummer', '0'.$n, ['desktop' => ['fontSize' => '15px', 'fontWeight' => '500', 'letterSpacing' => '0.08em', 'color' => '@gold-dunkel', 'margin' => ['bottom' => '28px']]], + "display:flex;align-items:center;gap:12px\n&::after{content:'';flex:1;height:1px;background:#E6DED2}"), + $heading('schritt-'.$n.'-titel', $titel, 3, ['desktop' => ['fontSize' => '22px', 'fontWeight' => '500', 'letterSpacing' => '-0.015em', 'color' => '@tinte', 'margin' => ['top' => '0px', 'bottom' => '10px']]]), + $text('schritt-'.$n.'-satz', $satz, ['desktop' => ['fontSize' => '16px', 'lineHeight' => 1.6, 'color' => '@text', 'margin' => ['bottom' => '0px']]]), +]); + +/** Eine häufige Frage. */ +$frage = static fn (int $n, string $titel, string $antwort) => ['id' => 'frage-'.$n, 'type' => 'accordionitem', 'props' => ['title' => $titel, 'open' => false], + 'css' => "& summary{border:0;border-radius:0;background:transparent;padding:24px 0;font-size:19px;font-weight:500;color:#141414;letter-spacing:-0.01em}\n& .accordion-body{padding:0 0 24px}\nborder:0;border-bottom:1px solid #E6DED2;border-radius:0;padding:0", + 'children' => [$text('frage-'.$n.'-antwort', $antwort, ['desktop' => ['fontSize' => '17px', 'lineHeight' => 1.65, 'color' => '@text', 'maxWidth' => '760px', 'margin' => ['bottom' => '0px']]], $linkCss)], +]; + +$abschnitt = static fn (string $oben, string $unten) => [ + 'desktop' => ['padding' => ['top' => $oben, 'bottom' => $unten, 'left' => $rand['desktop'], 'right' => $rand['desktop']]], + 'tablet' => ['padding' => ['left' => $rand['tablet'], 'right' => $rand['tablet']]], + 'mobile' => ['padding' => ['top' => (int) $oben > 0 ? '64px' : '0px', 'bottom' => (int) $unten > 0 ? '64px' : '0px', 'left' => $rand['mobile'], 'right' => $rand['mobile']]], +]; + +$startseite = [ + 'schemaVersion' => $SCHEMA, + 'title' => 'Ein Lichtblick für Ihre Immobilie.', + 'description' => 'Luximmo – Ihr neuer Immobilienpartner vor Ort: Immobilienverkauf und WEG-Verwaltung in Gaggenau und Umgebung, Baden-Baden und im Schwarzwald.', + 'blocks' => [ + // 1 – Hero: Video in einer gerundeten Fläche, Schlagzeile unten links, Satz und Knopf rechts. + $section('hero', [ + $row('hero-zeile', [ + $heading('hero-titel', 'Ein Lichtblick
für Ihre Immobilie.', 1, [ + 'desktop' => ['fontSize' => '104px', 'fontWeight' => '500', 'lineHeight' => 0.95, 'letterSpacing' => '-0.035em', 'color' => '@papier', 'maxWidth' => '900px', 'flexGrow' => 1, 'flexBasis' => '560px', 'margin' => ['top' => '0px', 'bottom' => '0px']], + 'tablet' => ['fontSize' => '72px', 'flexBasis' => '100%'], + 'mobile' => ['fontSize' => '36px'], + ]), + $column('hero-seite', [ + $text('hero-satz', 'Immobilienverkauf und WEG-Verwaltung in Gaggenau und Umgebung, Baden-Baden und im Schwarzwald.', ['desktop' => ['fontSize' => '17px', 'lineHeight' => 1.55, 'color' => '@auf-dunkel', 'margin' => ['bottom' => '20px']]]), + $knopf('hero-knopf', 'Anfrage stellen', '/verwaltungsanfrage', 'gold'), + ], ['desktop' => ['width' => '320px', 'maxWidth' => '100%', 'flexShrink' => 0]]), + ], [], [ + 'desktop' => ['display' => 'flex', 'flexWrap' => 'wrap', 'justifyContent' => 'space-between', 'alignItems' => 'flex-end', 'gap' => '32px', 'margin' => ['top' => '0px']], + ]), + ], [ + 'desktop' => ['backgroundImage' => $medien['poster']['id'], 'backgroundSize' => 'cover', 'backgroundPosition' => 'center', 'backgroundColor' => '#2F2A24', + 'color' => '@papier', 'minHeight' => '736px', 'display' => 'flex', 'alignItems' => 'flex-end', + 'margin' => $quer($rand['desktop']), 'borderRadius' => $rund('24px'), 'overflow' => 'hidden', + 'padding' => ['top' => '56px', 'bottom' => '56px', 'left' => '56px', 'right' => '56px']], + 'tablet' => ['minHeight' => '620px', 'margin' => $quer($rand['tablet']), 'padding' => ['top' => '40px', 'bottom' => '40px', 'left' => '40px', 'right' => '40px']], + 'mobile' => ['minHeight' => '560px', 'margin' => $quer($rand['mobile']), 'padding' => ['top' => '28px', 'bottom' => '28px', 'left' => '24px', 'right' => '24px']], + ], null, + // Der Verlauf der Vorlage über Video und Standbild; der Knopf zum Anhalten oben rechts, + // damit er nicht auf dem Aufruf liegt. + "position:relative\n&::before{content:'';position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;background:linear-gradient(to top,rgba(20,17,13,.72) 0%,rgba(20,17,13,.35) 38%,rgba(20,17,13,0) 65%);pointer-events:none}\n& .section-inner{position:relative;z-index:2;width:100%}\n& .video-toggle{top:20px;bottom:auto;right:20px;z-index:3}", + 'full', ['backgroundVideoWebm' => $film['src']]), + + // 2 – Intro: Etikett, große Aussage, drei Kärtchen. + $section('intro', [ + $column('intro-kopf', [ + $etikett('intro-etikett', 'Ihr neuer Immobilienpartner vor Ort', '32px'), + $text('intro-aussage', 'Wir kümmern uns um Mieter, Abrechnungen und Instandhaltung – damit Ihre Immobilie läuft und ihren Wert behält.', [ + 'desktop' => ['fontSize' => '52px', 'fontWeight' => '400', 'lineHeight' => 1.15, 'letterSpacing' => '-0.025em', 'color' => '@tinte', 'maxWidth' => '980px', 'margin' => ['bottom' => '0px']], + 'tablet' => ['fontSize' => '40px'], + 'mobile' => ['fontSize' => '30px'], + ], "text-wrap:balance\n& em{font-style:normal;color:#8A8278}"), + ], ['desktop' => ['display' => 'flex', 'flexDirection' => 'column', 'alignItems' => 'center', 'textAlign' => 'center']]), + $column('intro-raster', [ + $vorteil(1, 'user', 'Persönlich', 'Eine feste Ansprechpartnerin statt wechselnder Sachbearbeiter.'), + $vorteil(2, 'chat', 'Erreichbar', 'Kurze Wege und schnelle Antworten – ohne Warteschleife.'), + $vorteil(3, 'pin', 'Regional', 'Vor Ort in Gaggenau und Umgebung, Baden-Baden und im Schwarzwald.'), + ], [ + 'desktop' => ['display' => 'grid', 'gridColumns' => 3, 'gap' => '24px', 'margin' => ['top' => '96px']], + 'tablet' => ['gridColumns' => 1, 'gap' => '16px'], + 'mobile' => ['margin' => ['top' => '56px']], + ]), + $text('intro-region', 'Gaggenau & Umgebung · Baden-Baden · Schwarzwald', [ + 'desktop' => ['fontSize' => '24px', 'lineHeight' => 1.4, 'letterSpacing' => '-0.01em', 'textAlign' => 'center', 'color' => '@tinte', 'backgroundColor' => '#EADFD0', 'borderRadius' => $rund('999px'), 'padding' => ['top' => '18px', 'bottom' => '18px', 'left' => '24px', 'right' => '24px'], 'margin' => ['top' => '24px', 'bottom' => '0px']], + 'mobile' => ['fontSize' => '18px', 'borderRadius' => $rund('24px')], + ], 'font-style:italic'), + ], $abschnitt('112px', '112px'), null, '', 'wide'), + + // 3 – Leistungen: drei Fotos mit Titel, Satz und „Was dazugehört“. + $section('leistungen-bereich', [ + $zeile('leistungen-kopf', [ + $heading('leistungen-titel', 'Leistungen', 2, $h2Stil), + $text('leistungen-link', 'Unverbindlich anfragen →', ['desktop' => ['fontSize' => '15px', 'fontWeight' => '500', 'margin' => ['bottom' => '0px']]], $linkCss), + ], '16px', ['justifyContent' => 'space-between', 'alignItems' => 'baseline', 'flexWrap' => 'wrap', 'margin' => ['bottom' => '56px']], ['margin' => ['bottom' => '36px']]), + $column('leistungen-raster', [ + $leistung('leistung-verkauf', $medien['poster'], 'Offener Wohn- und Essbereich mit Treppe, Holzlamellen und großer Glasfront', 'Immobilienverkauf', 'Professionelle Vermarktung, marktgerechte Bewertung und persönliche Begleitung bis zum erfolgreichen Verkauf.', [ + 'Professionelle Vermarktung Ihrer Immobilie', + 'Marktgerechte Bewertung', + 'Persönliche Begleitung bis zum erfolgreichen Verkauf', + ]), + $leistung('leistung-weg', $medien['weg'], 'Wohnanlage mit mehreren Gebäuden und grünem Innenhof', 'WEG-Verwaltung', 'Strukturierte, transparente und zuverlässige Verwaltung von Wohnungseigentümergemeinschaften.', [ + 'Eigentümerversammlung vorbereiten, leiten, protokollieren', + 'Beschlüsse umsetzen und Beschlusssammlung führen', + 'Wirtschaftsplan und Jahresabrechnung', + 'Erhaltungsrücklage und Hausgeld verwalten', + 'Instandhaltung planen und begleiten', + ]), + $leistung('leistung-miet', $medien['miet'], 'Helles Mehrfamilienhaus mit Balkonen und gepflegtem Vorgarten im Abendlicht', 'Mietverwaltung', 'Mieterbetreuung, Mietinkasso und Nebenkostenabrechnung.', [ + 'Mietersuche, Besichtigung und Mietvertrag', + 'Mietinkasso und Mahnwesen', + 'Betriebs- und Nebenkostenabrechnung', + 'Ansprechpartnerin für Mieter bei Schäden', + 'Handwerker beauftragen und Rechnungen prüfen', + ]), + $leistung('leistung-sonder', $medien['sonder'], 'Helles Wohnzimmer mit Sofa, Esstisch und Blick auf den Balkon', 'Sondereigentum', 'Betreuung einzelner Wohnungen – von Vermietung bis Instandhaltung.', [ + 'Vermietung und Mieterwechsel Ihrer Wohnung', + 'Miete, Kaution und Nebenkosten im Blick', + 'Ihre Stimme bei der Eigentümerversammlung', + 'Abstimmung mit der WEG-Verwaltung', + 'Übergaben und Wohnungsabnahmen', + ]), + ], [ + 'desktop' => ['display' => 'grid', 'gridColumns' => 4, 'columnGap' => '28px', 'rowGap' => '56px', 'alignItems' => 'flex-start'], + 'tablet' => ['gridColumns' => 2], + 'mobile' => ['gridColumns' => 1], + ]), + ], $abschnitt('0px', '0px'), 'leistungen', '', 'wide'), + + // 4 – So läuft der Wechsel: vier Schritte auf Creme. + $section('wechsel', [ + $column('wechsel-karte', [ + $row('wechsel-kopf', [ + $heading('wechsel-titel', 'So einfach wechseln Sie zu uns.', 2, $h2Stil), + $text('wechsel-satz', 'Den Verwalterwechsel organisieren wir – von der Übergabe der Unterlagen bis zur ersten Abrechnung.', $fliess('@text', '0px', '420px')), + ], [], [ + 'desktop' => ['display' => 'flex', 'flexWrap' => 'wrap', 'justifyContent' => 'space-between', 'alignItems' => 'flex-end', 'rowGap' => '20px', 'columnGap' => '48px', 'margin' => ['top' => '0px', 'bottom' => '64px']], + 'mobile' => ['margin' => ['bottom' => '40px']], + ]), + $column('wechsel-raster', [ + $schritt(1, 'Anfrage', 'Sie schildern uns kurz Ihr Objekt – online in drei Schritten oder im Gespräch.'), + $schritt(2, 'Kennenlernen', 'Wir sehen uns das Objekt vor Ort an und klären, was Ihnen wichtig ist.'), + $schritt(3, 'Angebot', 'Sie erhalten ein klares Angebot mit allen Leistungen – ohne Kleingedrucktes.'), + $schritt(4, 'Übergabe', 'Wir übernehmen Unterlagen, Konten und Verträge und informieren Mieter und Eigentümer.'), + ], [ + 'desktop' => ['display' => 'grid', 'gridColumns' => 4, 'gap' => '40px'], + 'tablet' => ['gridColumns' => 2, 'rowGap' => '48px'], + 'mobile' => ['gridColumns' => 1, 'rowGap' => '36px'], + ]), + $zeile('wechsel-knoepfe', [ + $knopf('wechsel-knopf', 'Verwaltungsanfrage starten', '/verwaltungsanfrage'), + ], '14px', ['margin' => ['top' => '64px']], ['margin' => ['top' => '44px']]), + ], [ + 'desktop' => ['backgroundColor' => '@creme', 'borderRadius' => $rund('24px'), 'padding' => ['top' => '80px', 'bottom' => '80px', 'left' => '64px', 'right' => '64px']], + 'tablet' => ['padding' => ['left' => '40px', 'right' => '40px']], + 'mobile' => ['padding' => ['top' => '52px', 'bottom' => '52px', 'left' => '22px', 'right' => '22px']], + ]), + ], $abschnitt('112px', '0px'), 'ablauf', '', 'wide'), + + // 5 – Über uns: dunkle Karte mit Monogramm (Portrait fehlt), Text rechts. + $section('ueber-bereich', [ + $row('ueber-zeile', [ + $column('ueber-karte', [ + $text('ueber-monogramm', 'EK', ['desktop' => ['fontSize' => '160px', 'fontWeight' => '500', 'lineHeight' => 1, 'letterSpacing' => '-0.04em', 'color' => '@gold', 'margin' => ['bottom' => '0px']], 'mobile' => ['fontSize' => '110px']], 'opacity:.9'), + $text('ueber-zitat', 'Ein Lichtblick für Ihre Immobilie.', ['desktop' => ['fontSize' => '22px', 'lineHeight' => 1.4, 'letterSpacing' => '-0.01em', 'color' => '@auf-dunkel', 'maxWidth' => '460px', 'margin' => ['top' => 'auto', 'bottom' => '0px']], 'mobile' => ['fontSize' => '19px']]), + ], [ + 'desktop' => ['display' => 'flex', 'flexDirection' => 'column', 'justifyContent' => 'space-between', 'gap' => '40px', 'minHeight' => '480px', 'backgroundColor' => '#3C352D', 'borderRadius' => $rund('24px'), 'padding' => $seiten('48px')], + 'mobile' => ['minHeight' => '380px', 'padding' => $seiten('28px')], + ], "position:relative;overflow:hidden\n&::after{content:'';position:absolute;right:-90px;bottom:-90px;width:300px;height:300px;border:1.5px solid rgba(189,160,118,.35);border-radius:50%;pointer-events:none}"), + $column('ueber-text', [ + $heading('ueber-titel', 'Eine Ansprechpartnerin. Für alles.', 2, [...$h2Stil, 'desktop' => [...$h2Stil['desktop'], 'margin' => ['top' => '0px', 'bottom' => '24px']]]), + $text('ueber-satz', 'Bei Luximmo landen Sie nicht in einer Warteschleife. '.$person.' kennt Ihr Objekt, Ihre Mieter und Ihre Unterlagen – und ist direkt für Sie erreichbar.', $fliess('@text', '24px')), + $haken('ueber-punkt-1', 'Feste Zuständigkeit – keine Weiterleitung, kein Ticketsystem'), + $haken('ueber-punkt-2', 'Transparente Abrechnungen – nachvollziehbar und pünktlich'), + $haken('ueber-punkt-3', 'Vor Ort – Begehungen, Übergaben, Versammlungen in Gaggenau und Umgebung'), + $text('ueber-name', $person.'
'.$firma.'', ['desktop' => ['fontSize' => '17px', 'fontWeight' => '500', 'lineHeight' => 1.55, 'margin' => ['top' => '20px', 'bottom' => '0px']]], '& em{font-style:normal;font-weight:400;color:#8A8278}'), + ], ['desktop' => ['padding' => ['bottom' => '8px']]]), + ], $zweiSpalten, [ + 'desktop' => ['gap' => '64px', 'alignItems' => 'flex-end', 'margin' => ['top' => '0px'], 'columnWidths' => '7 5'], + 'tablet' => ['gap' => '40px'], + ]), + ], $abschnitt('112px', '0px'), 'ueber-uns', '', 'wide'), + + // 6 – Bewertung: dunkle Fläche, links Text und Knopf, rechts die vier Objektarten. + $section('bewertung-bereich', [ + $column('bewertung-band', [ + $row('bewertung-zeile', [ + $column('bewertung-text', [ + $kleinzeile('bewertung-klein', 'Immobilienbewertung', '@gold', '18px'), + $heading('bewertung-titel', 'Was ist Ihre Immobilie wert?', 2, [...$h2Stil, 'desktop' => [...$h2Stil['desktop'], 'color' => '@papier', 'margin' => ['top' => '0px', 'bottom' => '20px']]]), + $text('bewertung-satz', 'Ob Verkauf, Vermietung oder einfach zur Orientierung: Wir schätzen den Wert Ihrer Wohnung, Ihres Hauses oder Grundstücks in Gaggenau und Umgebung – kostenlos und unverbindlich.', $fliess('@auf-dunkel', '28px', '480px')), + $haken('bewertung-punkt-1', 'Drei kurze Schritte, Schätzwerte genügen', '@auf-dunkel', '@gold'), + $haken('bewertung-punkt-2', 'Persönliche Einschätzung statt Rechner-Ergebnis', '@auf-dunkel', '@gold'), + $zeile('bewertung-knoepfe', [ + $knopf('bewertung-knopf', 'Jetzt Wert ermitteln', '/immobilienbewertung', 'gold'), + ], '14px', ['margin' => ['top' => '24px']]), + ]), + $column('bewertung-arten', array_map( + static fn (string $schluessel, string $name) => $column('bewertung-art-'.$schluessel, [ + $bild('bewertung-art-'.$schluessel.'-bild', $medien['opt-'.$schluessel], '', ['desktop' => ['margin' => ['top' => '0px', 'right' => '0px', 'bottom' => '10px', 'left' => '0px']]], null, '& img{display:block;width:100%;border-radius:16px}'), + $text('bewertung-art-'.$schluessel.'-text', ''.$name.'', ['desktop' => ['fontSize' => '16px', 'fontWeight' => '500', 'textAlign' => 'center', 'margin' => ['bottom' => '0px']]], "& a{color:#fff;text-decoration:none}\n& a:hover{color:#BDA076}"), + ], ['desktop' => ['padding' => $seiten('10px'), 'borderRadius' => $rund('22px'), 'backgroundColor' => '#ffffff0f']], + "position:relative;transition:background-color .25s ease,transform .25s ease\n& a::after{content:'';position:absolute;top:0;right:0;bottom:0;left:0}\n&:hover{background-color:#ffffff1f;transform:translateY(-3px)}\n&:focus-within{outline:2px solid #BDA076;outline-offset:3px}"), + ['wohnung', 'haus', 'mfh', 'grund'], + ['Wohnung', 'Haus', 'Mehrfamilienhaus', 'Grundstück'], + ), [ + 'desktop' => ['display' => 'grid', 'gridColumns' => 2, 'gap' => '16px'], + ]), + ], $zweiSpalten, [ + 'desktop' => ['gap' => '64px', 'alignItems' => 'center', 'margin' => ['top' => '0px'], 'columnWidths' => '1 1'], + 'tablet' => ['gap' => '40px'], + ]), + ], [ + 'desktop' => ['backgroundColor' => '#3C352D', 'color' => '@papier', 'borderRadius' => $rund('24px'), 'padding' => ['top' => '80px', 'bottom' => '80px', 'left' => '64px', 'right' => '64px']], + 'tablet' => ['padding' => ['left' => '40px', 'right' => '40px']], + 'mobile' => ['padding' => ['top' => '52px', 'bottom' => '52px', 'left' => '22px', 'right' => '22px']], + ]), + ], $abschnitt('112px', '0px'), 'wert', '', 'wide'), + + // 7 – Häufige Fragen. + $section('fragen-bereich', [ + $row('fragen-zeile', [ + $column('fragen-kopf', [ + $heading('fragen-titel', 'Häufige Fragen', 2, [...$h2Stil, 'desktop' => [...$h2Stil['desktop'], 'margin' => ['top' => '0px', 'bottom' => '16px']]]), + $text('fragen-satz', 'Ihre Frage ist nicht dabei? Schreiben Sie uns.', $fliess('@text'), $linkCss), + ]), + ['id' => 'fragen-liste', 'type' => 'accordion', 'props' => ['faq' => true], 'css' => 'gap:0', + 'style' => ['desktop' => ['borderWidth' => $nurOben('1px'), 'borderStyle' => 'solid', 'borderColor' => '@linie']], + 'children' => [ + $frage(1, 'Was kostet eine Hausverwaltung bei Luximmo?', 'Das hängt von der Art der Verwaltung, der Zahl der Einheiten und dem Zustand des Objekts ab. Nach einer kurzen Verwaltungsanfrage erhalten Sie ein Angebot mit allen Leistungen und Preisen.'), + $frage(2, 'Wie läuft ein Wechsel von der bisherigen Verwaltung ab?', 'Sie kündigen den bisherigen Vertrag fristgerecht, bei einer WEG beschließt die Eigentümerversammlung die neue Verwaltung. Die Übergabe von Unterlagen, Konten und Verträgen organisieren wir mit der bisherigen Verwaltung.'), + $frage(3, 'Welche Objekte verwalten Sie?', 'Mehrfamilienhäuser, Wohn- und Geschäftshäuser, Eigentümergemeinschaften und einzelne Eigentumswohnungen – in Gaggenau und Umgebung, Baden-Baden und im Schwarzwald.'), + $frage(4, 'Wie erreichen Mieter und Eigentümer Sie?', 'Direkt bei '.$person.' – telefonisch, per E-Mail oder über das Kontaktformular. Anfragen beantworten wir in der Regel innerhalb eines Werktags.'), + $frage(6, 'Unterstützen Sie mich auch beim Verkauf?', 'Ja. Wir übernehmen die professionelle Vermarktung, ermitteln einen marktgerechten Preis und begleiten Sie persönlich bis zum erfolgreichen Verkauf. Den ersten Schritt machen Sie mit der Immobilienbewertung.'), + $frage(5, 'Übernehmen Sie auch einzelne Wohnungen?', 'Ja. Mit der Sondereigentumsverwaltung betreuen wir einzelne Wohnungen: Vermietung, Miete und Nebenkosten, Abstimmung mit der WEG-Verwaltung und Ihre Vertretung in der Versammlung.'), + ], + ], + ], $zweiSpalten, [ + 'desktop' => ['gap' => '64px', 'alignItems' => 'flex-start', 'margin' => ['top' => '0px'], 'columnWidths' => '4 7'], + 'tablet' => ['gap' => '32px'], + ]), + ], $abschnitt('112px', '0px'), 'fragen', '', 'wide'), + + // 7 – Kontakt: Linie, große Schlagzeile, Anschrift, Formular in Creme. + $section('kontakt-bereich', [ + $row('kontakt-zeile', [ + $column('kontakt-text', [ + $heading('kontakt-titel', 'Sprechen wir über Ihre Immobilie.', 2, [ + 'desktop' => ['fontSize' => '76px', 'fontWeight' => '500', 'lineHeight' => 0.98, 'letterSpacing' => '-0.035em', 'color' => '@tinte', 'margin' => ['top' => '0px', 'bottom' => '40px']], + 'tablet' => ['fontSize' => '56px'], + 'mobile' => ['fontSize' => '40px', 'margin' => ['bottom' => '28px']], + ]), + $text('kontakt-satz', 'Schreiben Sie uns kurz, worum es geht – wir melden uns in der Regel innerhalb eines Werktags.', $fliess('@text', '40px', '420px')), + $zeile('kontakt-angaben', [ + $column('kontakt-adresse', [ + $kleinzeile('kontakt-adresse-titel', 'Adresse', '@gold-dunkel', '8px'), + $text('kontakt-adresse-text', $firma.'
'.$person.'
'.$strasse.'
'.$plz.' '.$ort, ['desktop' => ['fontSize' => '17px', 'lineHeight' => 1.6, 'margin' => ['bottom' => '0px']]]), + ]), + $column('kontakt-mehr', [ + $kleinzeile('kontakt-mehr-titel', 'Direkt', '@gold-dunkel', '8px'), + $text('kontakt-mehr-text', ''.$telefon.'
'.$mail.'
Für ein Angebot:
Verwaltungsanfrage →', ['desktop' => ['fontSize' => '17px', 'lineHeight' => 1.6, 'margin' => ['bottom' => '0px']]], $linkCss), + ]), + ], '56px', ['alignItems' => 'flex-start', 'flexWrap' => 'wrap', 'rowGap' => '32px']), + ]), + $column('kontakt-karte', [ + ['id' => 'kontakt-formular', 'type' => 'form', 'props' => ['form' => 'kontakt'], 'css' => '__FORMULAR__'], + ], [ + 'desktop' => ['backgroundColor' => '@creme', 'borderRadius' => $rund('24px'), 'padding' => $seiten('56px')], + 'tablet' => ['padding' => $seiten('36px')], + 'mobile' => ['padding' => ['top' => '28px', 'right' => '20px', 'bottom' => '28px', 'left' => '20px']], + ]), + ], $zweiSpalten, [ + 'desktop' => ['gap' => '96px', 'alignItems' => 'flex-start', 'margin' => ['top' => '0px'], 'columnWidths' => '1 1', + 'borderWidth' => $nurOben('1px'), 'borderStyle' => 'solid', 'borderColor' => '@tinte', 'padding' => ['top' => '56px']], + 'tablet' => ['gap' => '48px'], + ]), + ], $abschnitt('112px', '112px'), 'kontakt', '', 'wide'), + ], +]; + +// Die Formulare im Stil der Vorlage: weiße Felder auf Creme, runde Ecken, goldener Fokus. +$formularCss = '& .block-form{max-width:none} +& .form-field label{font-size:14px;font-weight:500;color:#141414} +& .form-field input{background:#fff;border:1px solid #E6DED2;border-radius:14px;padding:15px 18px;font-size:16px;color:#141414;min-height:54px} +& .form-field select{background:#fff;border:1px solid #E6DED2;border-radius:14px;padding:15px 18px;font-size:16px;color:#141414;min-height:54px} +& .form-field textarea{background:#fff;border:1px solid #E6DED2;border-radius:14px;padding:15px 18px;font-size:16px;color:#141414;min-height:140px} +& .form-field input:focus{border-color:#BDA076;outline:4px solid rgba(189,160,118,.25);outline-offset:0} +& .form-field select:focus{border-color:#BDA076;outline:4px solid rgba(189,160,118,.25);outline-offset:0} +& .form-field textarea:focus{border-color:#BDA076;outline:4px solid rgba(189,160,118,.25);outline-offset:0} +& .field-note{font-size:13px;color:#5A554D;opacity:1} +& .form-step-title{font-size:24px;font-weight:500;letter-spacing:-0.015em;margin-bottom:12px} +& .form-step-intro{color:#5A554D;opacity:1;margin:0} +& .form-progress-step{color:#5A554D;opacity:1} +& .form-choice{display:flex;flex-wrap:wrap;gap:10px} +& .form-choice .check-row{gap:10px;align-items:center;background:#fff;border:1px solid #E6DED2;border-radius:999px;padding:11px 18px;transition:border-color .2s} +& .form-choice .check-row:hover{border-color:#BDA076} +& .check-row label{font-weight:400;font-size:15px;color:#141414} +& .check-row input{accent-color:#141414;min-height:0;width:18px;height:18px;padding:0;margin:0} +& .cms-button{min-height:54px;font-size:16px;padding:0 32px;transition:transform .2s ease,background-color .2s ease} +& .cms-button:hover{transform:translateY(-2px)}'; + +$ersetzeFormularCss = static function (array $bloecke) use (&$ersetzeFormularCss, $formularCss): array { + foreach ($bloecke as $i => $block) { + if ('__FORMULAR__' === ($block['css'] ?? null)) { + $bloecke[$i]['css'] = $formularCss; + } + if (isset($block['children'])) { + $bloecke[$i]['children'] = $ersetzeFormularCss($block['children']); + } + } + + return $bloecke; +}; +$startseite['blocks'] = $ersetzeFormularCss($startseite['blocks']); + +// --------------------------------------------------------------------------------------------- +// Seiten anlegen und veröffentlichen +// --------------------------------------------------------------------------------------------- + +$anlegen = static function (string $slug, array $dokument, string $seoTitel = '', string $teilbild = '') use ($pages, $db): string { + $id = $pages->createPage($slug, null, 'page', $dokument); + if ('' !== $seoTitel) { + $db->executeStatement('UPDATE page SET seo_title = ? WHERE id = ?', [$seoTitel, $id]); + } + if ('' !== $teilbild) { + $db->executeStatement('UPDATE page SET og_media_id = ? WHERE id = ?', [$teilbild, $id]); + } + $seite = $db->fetchAssociative('SELECT draft_revision_id, version FROM page WHERE id = ?', [$id]); + $pages->publish($id, $seite['draft_revision_id'], (int) $seite['version']); + echo 'Seite angelegt: /'.$db->fetchOne('SELECT path FROM page WHERE id = ?', [$id])."\n"; + + return $id; +}; + +// Der Hero steht sofort (LCP); alles darunter steigt beim Scrollen auf. +$startseite = $einblenden($startseite, [ + 'intro-kopf' => ['rise'], + 'vorteil-1' => ['rise'], + 'vorteil-2' => ['rise', 'short'], + 'vorteil-3' => ['rise', 'medium'], + 'leistungen-kopf' => ['rise'], + 'leistung-verkauf' => ['rise'], + 'leistung-weg' => ['rise', 'short'], + 'leistung-miet' => ['rise', 'medium'], + 'leistung-sonder' => ['rise', 'long'], + 'wechsel-kopf' => ['rise'], + 'schritt-1' => ['rise'], + 'schritt-2' => ['rise', 'short'], + 'schritt-3' => ['rise', 'medium'], + 'schritt-4' => ['rise', 'long'], + 'ueber-karte' => ['left'], + 'ueber-text' => ['rise', 'short'], + 'fragen-zeile' => ['rise'], + 'kontakt-text' => ['rise'], + 'kontakt-karte' => ['rise', 'short'], +]); + +$homeId = $anlegen('home', $startseite, 'Hausverwaltung & Immobilienverkauf in Gaggenau | LUXIMMO', $medien['poster']['id']); + +/** Der Seitenkopf der Unterseiten: Etikett, große Überschrift, Vorspann. */ +$seitenkopf = static fn (string $praefix, string $klein, string $titel, string $vorspann) => $section($praefix.'-kopf', [ + $etikett($praefix.'-etikett', $klein, '28px'), + $heading($praefix.'-h1', $titel, 1, [ + 'desktop' => ['fontSize' => '84px', 'fontWeight' => '500', 'lineHeight' => 0.98, 'letterSpacing' => '-0.035em', 'color' => '@tinte', 'maxWidth' => '980px', 'margin' => ['top' => '0px', 'bottom' => '28px']], + 'tablet' => ['fontSize' => '60px'], + 'mobile' => ['fontSize' => '42px', 'margin' => ['bottom' => '20px']], + ]), + $text($praefix.'-vorspann', $vorspann, $fliess('@text', '0px', '620px', '19px')), +], $abschnitt('64px', '64px'), null, '', 'wide'); + +$karte = [ + 'desktop' => ['backgroundColor' => '@creme', 'borderRadius' => $rund('24px'), 'padding' => $seiten('56px')], + 'tablet' => ['padding' => $seiten('36px')], + 'mobile' => ['padding' => ['top' => '28px', 'right' => '20px', 'bottom' => '28px', 'left' => '20px']], +]; + +/** Die dunkle Karte der Seitenspalte: Ansprechpartnerin und Anschrift. */ +$personKarte = static fn (string $praefix) => $column($praefix.'-person', [ + $text($praefix.'-person-monogramm', 'EK', ['desktop' => ['fontSize' => '56px', 'fontWeight' => '500', 'lineHeight' => 1, 'letterSpacing' => '-0.04em', 'color' => '@gold', 'margin' => ['bottom' => '20px']]]), + $text($praefix.'-person-text', 'Ihre Anfrage landet direkt bei '.$person.'. Sie meldet sich in der Regel innerhalb eines Werktags.', ['desktop' => ['fontSize' => '16px', 'lineHeight' => 1.6, 'color' => '@auf-dunkel', 'margin' => ['bottom' => '20px']]], '& strong{color:#fff;font-weight:500}'), + $zeile($praefix.'-person-ort', [ + $symbol($praefix.'-person-ort-icon', 'pin', 20, ['desktop' => ['color' => '@gold', 'flexShrink' => 0]]), + $text($praefix.'-person-ort-text', $firma.', '.$strasse.', '.$plz.' '.$ort, ['desktop' => ['fontSize' => '15px', 'lineHeight' => 1.5, 'color' => '@auf-dunkel', 'margin' => ['bottom' => '0px']]]), + ], '12px', ['alignItems' => 'flex-start', 'margin' => ['bottom' => '10px']]), + $zeile($praefix.'-person-telefon', [ + $symbol($praefix.'-person-telefon-icon', 'phone', 20, ['desktop' => ['color' => '@gold', 'flexShrink' => 0]]), + $text($praefix.'-person-telefon-text', ''.$telefon.'', ['desktop' => ['fontSize' => '15px', 'lineHeight' => 1.5, 'margin' => ['bottom' => '0px']]], "& a{color:#fff;text-decoration:none}\n& a:hover{color:#BDA076}"), + ], '12px', ['alignItems' => 'flex-start', 'margin' => ['bottom' => '10px']]), + $zeile($praefix.'-person-mail', [ + $symbol($praefix.'-person-mail-icon', 'mail', 20, ['desktop' => ['color' => '@gold', 'flexShrink' => 0]]), + $text($praefix.'-person-mail-text', ''.$mail.'', ['desktop' => ['fontSize' => '15px', 'lineHeight' => 1.5, 'margin' => ['bottom' => '0px']]], "& a{color:#fff;text-decoration:none;overflow-wrap:anywhere}\n& a:hover{color:#BDA076}"), + ], '12px', ['alignItems' => 'flex-start']), +], ['desktop' => ['backgroundColor' => '#3C352D', 'borderRadius' => $rund('24px'), 'padding' => $seiten('32px')]]); + +/** Hinweiskarte der Seitenspalte: Titel und Haken. */ +$hinweis = static fn (string $id, string $titel, array $punkte) => $column($id, [ + $heading($id.'-titel', $titel, 2, ['desktop' => ['fontSize' => '22px', 'fontWeight' => '500', 'letterSpacing' => '-0.015em', 'color' => '@tinte', 'margin' => ['top' => '0px', 'bottom' => '18px']]]), + ...array_map(static fn (int $i, string $p) => $haken($id.'-punkt-'.$i, $p), array_keys($punkte), $punkte), +], ['desktop' => ['borderRadius' => $rund('24px'), 'padding' => $seiten('32px'), 'borderWidth' => $seiten('1px'), 'borderStyle' => 'solid', 'borderColor' => '@linie']]); + +// Die Bildkarten einer Auswahl: Bild oben, gerundet, dunkler Rand bei Wahl. +$kartenCss = "\n& .form-choice-grid{grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:14px}\n& .form-choice-card label{border:1.5px solid #E6DED2;border-radius:20px;background:#fff;padding:10px 10px 14px;font-weight:500;font-size:15px;color:#141414}\n& .form-choice-card label:hover{border-color:#BDA076}\n& .form-choice-card input:checked+label{border-color:#141414;box-shadow:0 0 0 1.5px #141414}\n& .form-choice-card input{accent-color:#141414;top:20px;left:20px;width:20px;height:20px;min-height:0;padding:0;margin:0}\n& .form-choice-card input:focus{outline:none}\n& .form-choice-picture{border-radius:12px}"; + +$anlegen('immobilienbewertung', $einblenden([ + 'schemaVersion' => $SCHEMA, 'title' => 'Immobilienbewertung', + 'description' => 'Was ist Ihre Immobilie wert? Luximmo schätzt Wohnungen, Häuser, Mehrfamilienhäuser und Grundstücke in Gaggenau und Umgebung – kostenlos und unverbindlich.', + 'blocks' => [ + $seitenkopf('bewertung', 'Immobilienbewertung', 'Was ist Ihre Immobilie wert?', 'Ob Verkauf, Vermietung oder einfach zur Orientierung: Beantworten Sie ein paar kurze Fragen, und wir melden uns mit einer persönlichen Einschätzung – kostenlos und unverbindlich.'), + $section('bewertung', [ + $row('bewertung-seite-zeile', [ + $column('bewertung-karte', [ + ['id' => 'bewertung-formular', 'type' => 'form', 'props' => ['form' => 'bewertung'], 'css' => $formularCss.$kartenCss], + $text('bewertung-hinweis', 'Ihre Angaben verwenden wir nur für Ihre Anfrage. Mehr dazu in der Datenschutzerklärung.', ['desktop' => ['fontSize' => '13px', 'lineHeight' => 1.6, 'color' => '@text', 'margin' => ['top' => '20px', 'bottom' => '0px']]], $linkCss), + ], $karte), + $column('bewertung-seite', [ + $hinweis('bewertung-ablauf', 'Gut zu wissen', [ + 'Drei kurze Schritte, Schätzwerte genügen.', + 'Für Wohnungen, Häuser, Mehrfamilienhäuser und Grundstücke.', + 'Eine persönliche Einschätzung, kein automatischer Rechner.', + 'Kostenlos und ohne Verpflichtung.', + ]), + $personKarte('bewertung'), + ], ['desktop' => ['display' => 'flex', 'flexDirection' => 'column', 'gap' => '24px']]), + ], $zweiSpalten, [ + 'desktop' => ['gap' => '40px', 'alignItems' => 'flex-start', 'margin' => ['top' => '0px'], 'columnWidths' => '2 1'], + 'tablet' => ['gap' => '28px'], + ]), + ], $abschnitt('0px', '160px'), null, '', 'wide'), + ], +], ['bewertung-karte' => ['rise'], 'bewertung-seite' => ['rise', 'short']]), 'Immobilienbewertung Gaggenau – Was ist Ihre Immobilie wert? | LUXIMMO', $medien['miet']['id']); + +$anlegen('verwaltungsanfrage', $einblenden([ + 'schemaVersion' => $SCHEMA, 'title' => 'Verwaltungsanfrage', + 'description' => 'Verwaltungsangebot in drei Schritten: Mietverwaltung, WEG-Verwaltung oder Sondereigentum in Gaggenau und Umgebung bei Luximmo anfragen.', + 'blocks' => [ + $seitenkopf('anfrage', 'Verwaltungsanfrage', 'Ihr Angebot in drei Schritten.', 'Sagen Sie uns, welche Verwaltung Sie suchen und um welches Objekt es geht. Ungefähre Angaben genügen – wir melden uns mit einem Angebot oder Rückfragen.'), + $section('anfrage', [ + $row('anfrage-zeile', [ + $column('anfrage-karte', [ + ['id' => 'anfrage-formular', 'type' => 'form', 'props' => ['form' => 'verwaltungsanfrage'], 'css' => $formularCss.$kartenCss], + $text('anfrage-hinweis', 'Ihre Angaben verwenden wir nur für Ihre Anfrage. Mehr dazu in der Datenschutzerklärung.', ['desktop' => ['fontSize' => '13px', 'lineHeight' => 1.6, 'color' => '@text', 'margin' => ['top' => '20px', 'bottom' => '0px']]], $linkCss), + ], $karte), + $column('anfrage-seite', [ + $hinweis('anfrage-ablauf', 'So geht es weiter', [ + 'Wir sehen uns Ihre Angaben persönlich an.', + 'Bei Bedarf besichtigen wir das Objekt gemeinsam.', + 'Sie erhalten ein klares Angebot – unverbindlich.', + ]), + $personKarte('anfrage'), + ], ['desktop' => ['display' => 'flex', 'flexDirection' => 'column', 'gap' => '24px']]), + ], $zweiSpalten, [ + 'desktop' => ['gap' => '40px', 'alignItems' => 'flex-start', 'margin' => ['top' => '0px'], 'columnWidths' => '2 1'], + 'tablet' => ['gap' => '28px'], + ]), + ], $abschnitt('0px', '160px'), null, '', 'wide'), + ], +], ['anfrage-karte' => ['rise'], 'anfrage-seite' => ['rise', 'short']]), 'Verwaltungsanfrage – Angebot für Ihre Hausverwaltung | LUXIMMO', $medien['weg']['id']); + +/** Eine Rechtsseite: Seitenkopf, dann Absätze mit Zwischenüberschriften. */ +$rechtsseite = static function (string $praefix, string $titel, string $vorspann, array $absaetze) use ($seitenkopf, $section, $column, $heading, $text, $linkCss, $abschnitt): array { + $punkte = []; + foreach ($absaetze as $i => [$zwischentitel, $inhalt]) { + if ('' !== $zwischentitel) { + $punkte[] = $heading($praefix.'-h2-'.$i, $zwischentitel, 2, ['desktop' => ['fontSize' => '24px', 'fontWeight' => '500', 'lineHeight' => 1.3, 'letterSpacing' => '-0.015em', 'color' => '@tinte', 'margin' => ['top' => '40px', 'bottom' => '10px']]]); + } + $punkte[] = $text($praefix.'-p-'.$i, $inhalt, ['desktop' => ['fontSize' => '17px', 'lineHeight' => 1.7, 'color' => '@text', 'margin' => ['bottom' => '0px']]], $linkCss); + } + + return [ + $seitenkopf($praefix, 'Rechtliches', $titel, $vorspann), + $section($praefix, [ + $column($praefix.'-inhalt', $punkte, ['desktop' => ['maxWidth' => '820px', 'borderWidth' => ['top' => '1px', 'right' => '0px', 'bottom' => '0px', 'left' => '0px'], 'borderStyle' => 'solid', 'borderColor' => '@linie']]), + ], $abschnitt('0px', '160px'), null, '', 'wide'), + ]; +}; + +$offen = 'NOCH ZU ERGÄNZEN'; +$anlegen('impressum', [ + 'schemaVersion' => $SCHEMA, 'title' => 'Impressum', + 'description' => 'Anbieterangaben der Luximmo UG (haftungsbeschränkt), Hauptstraße 169, 76571 Gaggenau.', + 'blocks' => $rechtsseite('impressum', 'Impressum', 'Angaben gemäß § 5 DDG.', [ + ['Anbieter', $firma.' (haftungsbeschränkt)
'.$strasse.'
'.$plz.' '.$ort], + ['Vertreten durch', 'Geschäftsführung: '.$offen], + ['Kontakt', 'Telefon: '.$telefon.'
E-Mail: '.$mail.'
Website: lux-immo.net'], + ['Registereintrag', 'Handelsregister, Registergericht und Registernummer: '.$offen], + ['Umsatzsteuer-ID', 'Umsatzsteuer-Identifikationsnummer nach § 27a UStG: '.$offen], + ['Erlaubnis nach § 34c GewO', 'Wohnimmobilienverwalter mit Erlaubnis nach § 34c Abs. 1 Satz 1 Nr. 4 GewO. Zuständige Aufsichtsbehörde: '.$offen], + ['Verbraucherstreitbeilegung', 'Wir sind nicht bereit und nicht verpflichtet, an Streitbeilegungsverfahren vor einer Verbraucherschlichtungsstelle teilzunehmen.'], + ['Haftung für Inhalte und Links', 'Die Inhalte dieser Website wurden mit größtmöglicher Sorgfalt erstellt. Für Inhalte verlinkter Websites Dritter ist der jeweilige Betreiber verantwortlich; bei Bekanntwerden von Rechtsverstößen entfernen wir solche Links umgehend.'], + ['Urheberrecht', 'Die Inhalte dieser Website unterliegen dem deutschen Urheberrecht. Jede Verwertung außerhalb der Grenzen des Urheberrechts bedarf der vorherigen schriftlichen Zustimmung.'], + ['Bildnachweis', 'Fotos und Video: '.$offen], + ]), +], 'Impressum | LUXIMMO'); + +$anlegen('datenschutz', [ + 'schemaVersion' => $SCHEMA, 'title' => 'Datenschutz', + 'description' => 'Welche Daten beim Besuch der Website der Luximmo UG und bei einer Anfrage verarbeitet werden.', + 'blocks' => $rechtsseite('datenschutz', 'Datenschutzerklärung', 'Hier erfahren Sie, welche Daten beim Besuch dieser Website und bei einer Anfrage verarbeitet werden – und welche Rechte Sie haben.', [ + ['1. Verantwortlicher', $firma.' (haftungsbeschränkt), '.$person.', '.$strasse.', '.$plz.' '.$ort.'. Telefon '.$telefon.', E-Mail '.$mail.'.'], + ['2. Besuch dieser Website', 'Beim Aufruf verarbeitet unser Hostingdienstleister technisch erforderliche Verbindungsdaten: IP-Adresse, Zeitpunkt, angeforderte Adresse, Browserangaben und HTTP-Status. Das dient der sicheren Bereitstellung und der Fehlersuche. Rechtsgrundlage ist unser berechtigtes Interesse an einem störungsfreien Betrieb, Art. 6 Abs. 1 lit. f DSGVO. Mit dem Hostingdienstleister besteht ein Vertrag über die Auftragsverarbeitung nach Art. 28 DSGVO. Die Serverprotokolle werden nach spätestens sieben Tagen gelöscht oder anonymisiert, sofern sie nicht zur Aufklärung eines Sicherheitsvorfalls länger gebraucht werden.'], + ['3. Cookies und externe Dienste', 'Diese Website setzt keine Analyse- oder Werbecookies. Bilder, Video, Schrift und Gestaltung kommen vom eigenen Server; es werden keine Karten, Videos oder Schriften von Dritten nachgeladen. Deshalb gibt es auch keinen Einwilligungsdialog.'], + ['4. Kontaktformular, Verwaltungsanfrage und Immobilienbewertung', 'Wenn Sie uns über ein Formular schreiben, verarbeiten wir Ihre Angaben – etwa Name, E-Mail-Adresse, Telefonnummer und die Angaben zu Ihrem Objekt –, um Ihre Anfrage zu bearbeiten und Ihnen ein Angebot oder eine Werteinschätzung zu machen (Art. 6 Abs. 1 lit. b DSGVO). Die Anfrage wird in unserem System gespeichert und per E-Mail an uns weitergeleitet. Wir löschen sie, wenn sie erledigt ist und keine gesetzliche Aufbewahrungspflicht besteht.'], + ['5. Kontakt per E-Mail oder Telefon', 'Wenn Sie uns schreiben oder anrufen, verarbeiten wir Ihre Angaben, um Ihr Anliegen zu bearbeiten (Art. 6 Abs. 1 lit. b oder f DSGVO).'], + ['6. Ihre Rechte', 'Sie haben unter den gesetzlichen Voraussetzungen das Recht auf Auskunft, Berichtigung, Löschung, Einschränkung der Verarbeitung und Datenübertragbarkeit. Einer Verarbeitung auf Grundlage von Art. 6 Abs. 1 lit. f DSGVO können Sie widersprechen.'], + ['7. Beschwerderecht', 'Sie können sich bei einer Datenschutz-Aufsichtsbehörde beschweren, für uns beim Landesbeauftragten für den Datenschutz und die Informationsfreiheit Baden-Württemberg.'], + ]), +], 'Datenschutz | LUXIMMO'); + +$fehlerId = $anlegen('404', [ + 'schemaVersion' => $SCHEMA, 'title' => 'Seite nicht gefunden', + 'description' => 'Die gesuchte Seite gibt es nicht oder sie wurde verschoben.', + 'blocks' => [ + $section('fehler', [ + $etikett('fehler-etikett', 'Fehler 404'), + $heading('fehler-titel', 'Diese Seite gibt es leider nicht.', 1, [ + 'desktop' => ['fontSize' => '76px', 'fontWeight' => '500', 'lineHeight' => 1, 'letterSpacing' => '-0.035em', 'color' => '@tinte', 'margin' => ['top' => '0px', 'bottom' => '24px']], + 'mobile' => ['fontSize' => '40px'], + ]), + $text('fehler-text', 'Vielleicht wurde sie verschoben. Von der Startseite aus finden Sie alles Wichtige – oder Sie fragen direkt ein Verwaltungsangebot an.', $fliess('@text', '36px', '520px')), + $zeile('fehler-knoepfe', [ + $knopf('fehler-knopf', 'Zur Startseite', '/'), + $knopf('fehler-anfrage', 'Verwaltungsanfrage', '/verwaltungsanfrage', 'rahmen', 'none'), + ], '14px', ['flexWrap' => 'wrap']), + ], $abschnitt('120px', '160px'), null, '', 'wide'), + ], +]); +$db->executeStatement('UPDATE page SET robots = ? WHERE id = ?', ['noindex', $fehlerId]); + +// --------------------------------------------------------------------------------------------- +// Menü, Einstellungen, Konto +// --------------------------------------------------------------------------------------------- + +$seiteId = static fn (string $pfad): string => (string) $db->fetchOne('SELECT id FROM page WHERE path = ?', [$pfad]); +$anker = static fn (string $label, string $anker): array => ['label' => $label, 'type' => 'page', 'pageId' => $homeId, 'anchor' => $anker, 'children' => []]; +$menus->save('header', 'Hauptnavigation', [ + $anker('Leistungen', 'leistungen'), + $anker('Über uns', 'ueber-uns'), + ['label' => 'Bewertung', 'type' => 'page', 'pageId' => $seiteId('immobilienbewertung'), 'children' => []], + ['label' => 'Anfrage', 'type' => 'page', 'pageId' => $seiteId('verwaltungsanfrage'), 'children' => []], +], 0); +echo "Menü angelegt\n"; + +$settings->assignNotFoundPage($fehlerId, ''); +$settings->save([ + 'legalName' => $firma, + 'description' => 'Luximmo – Ihr neuer Immobilienpartner vor Ort: Immobilienverkauf und WEG-Verwaltung in Gaggenau und Umgebung, Baden-Baden und im Schwarzwald.', + 'email' => $mail, 'phone' => '+49 7225 5080756', + 'street' => $strasse, 'postalCode' => $plz, 'city' => $ort, 'country' => 'DE', + 'areaServed' => 'Gaggenau, Baden-Baden, Schwarzwald', + 'localBusiness' => true, 'llmsTxt' => true, + // Koordinaten aus OpenStreetMap, Gebäude Hauptstraße 169 (09.11.2026). + 'businessType' => 'RealEstateAgent', 'latitude' => '48.79381', 'longitude' => '8.33237', + 'organisationLogoMediaId' => $medien['logo']['id'], + 'faviconMediaId' => $medien['favicon']['id'], + 'stickyHeader' => false, 'headerOverlay' => false, + 'motion' => 'always', + 'homePath' => 'home', 'imprintPath' => 'impressum', 'privacyPath' => 'datenschutz', + // Die Seite lädt nichts von Dritten; deshalb keine Einwilligungsleiste. + 'consentBanner' => false, 'scrollTop' => true, 'postMetaHeader' => false, +]); +echo "Einstellungen gespeichert\n"; + +$passwort = bin2hex(random_bytes(12)); +$db->insert('cms_user', ['id' => bin2hex(random_bytes(16)), 'username' => 'umut', 'password_hash' => password_hash($passwort, PASSWORD_BCRYPT), 'roles' => '["ROLE_ADMIN"]']); +file_put_contents($root.'/var/luximmo-zugang.txt', "Verwaltung: Benutzer „umut“, Passwort: $passwort\n"); + +echo "\nFertig.\nZugang zur Verwaltung steht in var/luximmo-zugang.txt\n";

;7&cRT>@vBgT`qml^v#W*W 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 literal 0 HcmV?d00001 diff --git a/public/assets/fonts/instrument-sans-500-latin-ext.woff2 b/public/assets/fonts/instrument-sans-500-latin-ext.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..0ea0da04cb2bdacb918460c16ca2863138a19f4d GIT binary patch literal 11144 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