From d6a484c34720c55f07892615400efa31f61f4756 Mon Sep 17 00:00:00 2001 From: Stefan Mogeritsch Date: Mon, 9 Mar 2026 15:49:58 +0100 Subject: [PATCH] fix: update Keycloak configuration and Docker healthcheck improvements - Enabled `directAccessGrants` for `frontend-client` in `meldestelle-realm.json` to support ROPC login flow. - Strengthened admin credentials in realm configuration to meet password policy requirements. - Upgraded Keycloak to `26.5.5` with updated Docker healthcheck logic: - Replaced `curl` with bash `/dev/tcp` for compatibility with `ubi9-micro` image. - Switched health endpoint from `/ready` to `/live` for single-node use. - Adjusted healthcheck timings (`start_period`, `timeout`, `interval`) for smoother startup. - Removed deprecated v1 hostname parameter `KC_HOSTNAME_STRICT_HTTPS`. Signed-off-by: Stefan Mogeritsch --- .env | 2 +- backend/infrastructure/gateway/Dockerfile | 4 +- backend/services/ping/Dockerfile | 4 +- config/docker/keycloak/Dockerfile | 6 +- config/docker/keycloak/meldestelle-realm.json | 6 +- dc-infra.yaml | 20 +- ...026-03-09_Session_Log_Keycloak_Haertung.md | 265 ++++++++++++++++++ ...er-web-app_fehlschlag_2026-03-09_15-39.png | Bin 0 -> 36758 bytes 8 files changed, 289 insertions(+), 18 deletions(-) create mode 100644 docs/ScreenShots/docker-web-app_fehlschlag_2026-03-09_15-39.png diff --git a/.env b/.env index 1dca8f5a..1dc6d11f 100644 --- a/.env +++ b/.env @@ -49,7 +49,7 @@ SPRING_DATA_VALKEY_PORT=6379 SPRING_DATA_VALKEY_PASSWORD=valkey-password # --- KEYCLOAK --- -KEYCLOAK_IMAGE_TAG=26.4 +KEYCLOAK_IMAGE_TAG=26.5.5 KC_HEAP_MIN=512M KC_HEAP_MAX=1024M # Lokale Entwicklung: start-dev (kein Pre-Build nötig, kein --optimized) diff --git a/backend/infrastructure/gateway/Dockerfile b/backend/infrastructure/gateway/Dockerfile index 5da87e17..b0b6b096 100644 --- a/backend/infrastructure/gateway/Dockerfile +++ b/backend/infrastructure/gateway/Dockerfile @@ -5,8 +5,8 @@ # =================================================================== # === CENTRALIZED BUILD ARGUMENTS === -ARG GRADLE_VERSION -ARG JAVA_VERSION +ARG GRADLE_VERSION=9.3.1 +ARG JAVA_VERSION=25 ARG BUILD_DATE ARG VERSION diff --git a/backend/services/ping/Dockerfile b/backend/services/ping/Dockerfile index e07fed32..ca1542b4 100644 --- a/backend/services/ping/Dockerfile +++ b/backend/services/ping/Dockerfile @@ -5,8 +5,8 @@ # =================================================================== # === CENTRALIZED BUILD ARGUMENTS === -ARG GRADLE_VERSION -ARG JAVA_VERSION +ARG GRADLE_VERSION=9.3.1 +ARG JAVA_VERSION=25 ARG BUILD_DATE ARG VERSION diff --git a/config/docker/keycloak/Dockerfile b/config/docker/keycloak/Dockerfile index 9d0f9c44..6e08ca61 100644 --- a/config/docker/keycloak/Dockerfile +++ b/config/docker/keycloak/Dockerfile @@ -1,16 +1,18 @@ # =================================================================== # Production-Ready Keycloak Dockerfile # =================================================================== -# Based on: quay.io/keycloak/keycloak:26.4 +# Based on: quay.io/keycloak/keycloak:26.5.5 # Features: # - Pre-built optimized image (faster startup) # - Security hardening # - Health monitoring # =================================================================== -ARG KEYCLOAK_IMAGE_TAG +ARG KEYCLOAK_IMAGE_TAG=26.5.5 FROM quay.io/keycloak/keycloak:${KEYCLOAK_IMAGE_TAG} +ARG KEYCLOAK_IMAGE_TAG=26.5.5 + LABEL maintainer="Meldestelle Development Team" LABEL description="Production-ready Keycloak for Meldestelle authentication" LABEL version="${KEYCLOAK_IMAGE_TAG}" diff --git a/config/docker/keycloak/meldestelle-realm.json b/config/docker/keycloak/meldestelle-realm.json index 323dd71b..ee821925 100644 --- a/config/docker/keycloak/meldestelle-realm.json +++ b/config/docker/keycloak/meldestelle-realm.json @@ -239,7 +239,7 @@ "protocol": "openid-connect", "standardFlowEnabled": true, "implicitFlowEnabled": false, - "directAccessGrantsEnabled": false, + "directAccessGrantsEnabled": true, "serviceAccountsEnabled": false, "authorizationServicesEnabled": false, "attributes": { @@ -283,7 +283,7 @@ "credentials": [ { "type": "password", - "value": "password", + "value": "Admin#1234", "temporary": false } ], @@ -395,4 +395,4 @@ "clientSessionMaxLifespan": "0", "clientOfflineSessionIdleTimeout": "0" } -} \ No newline at end of file +} diff --git a/dc-infra.yaml b/dc-infra.yaml index 4f9f3c01..80485b89 100644 --- a/dc-infra.yaml +++ b/dc-infra.yaml @@ -76,8 +76,8 @@ services: context: . dockerfile: config/docker/keycloak/Dockerfile args: - KEYCLOAK_IMAGE_TAG: "${KEYCLOAK_IMAGE_TAG:-26.4}" - image: "${DOCKER_REGISTRY:-git.mo-code.at/mocode-software}/keycloak:${KEYCLOAK_IMAGE_TAG:-26.4}" + KEYCLOAK_IMAGE_TAG: "${KEYCLOAK_IMAGE_TAG:-26.5.5}" + image: "${DOCKER_REGISTRY:-git.mo-code.at/mocode-software}/keycloak:${KEYCLOAK_IMAGE_TAG:-26.5.5}" container_name: "${PROJECT_NAME:-meldestelle}-keycloak" restart: unless-stopped profiles: [ "infra", "all" ] @@ -93,8 +93,8 @@ services: KC_HOSTNAME: "${KC_HOSTNAME:-localhost}" # WICHTIG: false erlaubt Zugriff über beliebige Hostnamen (nötig für Server-Betrieb ohne TLS) KC_HOSTNAME_STRICT: "${KC_HOSTNAME_STRICT:-false}" - # WICHTIG: false erlaubt HTTP (kein HTTPS-Zwang) – für Entwicklung und HTTP-only Server - KC_HOSTNAME_STRICT_HTTPS: "${KC_HOSTNAME_STRICT_HTTPS:-false}" + # KC_HOSTNAME_STRICT_HTTPS wurde entfernt — deprecated v1-Option in Keycloak 26.x (hostname v2). + # HTTP-Zugriff wird ausschließlich über KC_HTTP_ENABLED gesteuert. KC_HTTP_ENABLED: "true" # Admin-Interface explizit auf allen Interfaces binden (0.0.0.0) KC_HTTP_MANAGEMENT_PORT: "9000" @@ -109,11 +109,15 @@ services: postgres: condition: "service_healthy" healthcheck: - test: [ "CMD-SHELL", "curl -sf http://localhost:9000/health/ready || exit 1" ] + # Keycloak basiert auf ubi9-micro — curl/wget sind NICHT im Image enthalten! + # Lösung: Bash /dev/tcp — kein externes Tool nötig, funktioniert auf jedem bash-Image. + # Management-Port 9000: Health-Endpoints (/health/live, /health/ready) laufen hier. + # /health/live: prüft nur Prozess-Liveness — kein Warten auf JGroups-Cluster-Formation. + test: [ "CMD-SHELL", "exec 3<>/dev/tcp/localhost/9000 && printf 'GET /health/live HTTP/1.0\\r\\nHost: localhost\\r\\n\\r\\n' >&3 && cat <&3 | grep -q '\"UP\"'" ] interval: "15s" - timeout: "5s" - retries: "10" - start_period: "60s" + timeout: "10s" + retries: 5 + start_period: "90s" volumes: - "./config/docker/keycloak:/opt/keycloak/data/import:Z" # start --optimized nutzt das pre-built Image (kc.sh build im Dockerfile) diff --git a/docs/99_Journal/2026-03-09_Session_Log_Keycloak_Haertung.md b/docs/99_Journal/2026-03-09_Session_Log_Keycloak_Haertung.md index 44546ae0..36487079 100644 --- a/docs/99_Journal/2026-03-09_Session_Log_Keycloak_Haertung.md +++ b/docs/99_Journal/2026-03-09_Session_Log_Keycloak_Haertung.md @@ -41,6 +41,31 @@ Sicherheitseinstellungen auf einen produktionsreifen Stand gebracht. - **`frontend-client` vs. `web-app`:** Klare Trennung: `web-app` für Browser-basierte Web-App, `frontend-client` für native KMP Desktop/Mobile-App. +## 🐛 Bugfix: Keycloak Import-Fehler `invalidPasswordMinSpecialCharsMessage` (2026-03-09) + +### Root Cause + +Beim Keycloak Härtungs-Step wurde die Password-Policy auf +`length(10) and digits(1) and upperCase(1) and specialChars(1) and notUsername(undefined)` gestärkt. +Der Test-User `admin` in `meldestelle-realm.json` hatte jedoch noch das Klartext-Passwort `"password"`, +das diese Policy verletzt (keine Ziffer, kein Großbuchstabe, kein Sonderzeichen). + +Keycloak validiert beim `--import-realm` Plain-Text-Credentials gegen die im Realm definierte Policy → +Server-Start schlägt fehl mit `invalidPasswordMinSpecialCharsMessage`. + +### Fix + +- **`config/docker/keycloak/meldestelle-realm.json`**: User `admin` Credential `"password"` → `"Admin1234!"` + (erfüllt alle Policy-Regeln: ≥10 Zeichen, Ziffer, Großbuchstabe, Sonderzeichen, nicht gleich Username). + +### Gelerntes + +Keycloak validiert **Plain-Text-Credentials** im Realm-JSON beim Import gegen die Realm-Policy. +Wird die Policy nachträglich gestärkt, müssen alle bestehenden User-Credentials im JSON ebenfalls +aktualisiert werden — sonst startet der Server nicht. + +--- + ## ✅ Micrometer Upgrade (2026-03-09, gleiche Session) Verifiziert: `micrometer = "1.16.1"` und `micrometerTracing = "1.6.1"` waren bereits korrekt in @@ -171,6 +196,51 @@ gemounteter Konfigs. - **Consul Healthcheck:** curl auf `/v1/status/leader` ✅ - **Keycloak Healthcheck:** curl auf `localhost:9000/health/ready` ✅ +## 🐛 Bugfix: Keycloak Healthcheck schlägt fehl obwohl Keycloak läuft (2026-03-09) + +### Symptom + +`docker compose --profile infra up -d` — Keycloak startet korrekt (Port 8080 + 9000 gebunden, +Realm importiert), wird von Docker aber nie als `healthy` markiert. Dieses Problem existierte +bereits früher und führte damals zur Entfernung des Healthchecks. + +### Root Cause 1: `/health/ready` vs. `/health/live` + +Keycloak 26.x führt beim Start den JGroups-Cluster-Join-Prozess aus. Bei Single-Node-Betrieb +(kein anderer Knoten im Netz) versucht Keycloak 10× einem Ghost-Node beizutreten — jeder Versuch +dauert 2 Sekunden = **20 Sekunden Verzögerung** nach dem eigentlichen Startup. + +- **`/health/ready`** wartet auf vollständige Cluster-Formation → gibt während der JOIN-Phase `503` + zurück. +- **`/health/live`** prüft nur ob der Prozess läuft — unabhängig vom Cluster-Status. + +Mit `start_period: 60s` und `interval: 15s` feuerte der erste Check in genau diesem 20s-Fenster +→ false-negative → nach 10 Retries → `unhealthy`. + +### Root Cause 2: `KC_HOSTNAME_STRICT_HTTPS` — deprecated v1-Option + +`WARNING: Hostname v1 options [hostname-strict-https] are still in use` erscheint in jedem +Startup-Log. In Keycloak 26.x wurde das Hostname-System auf v2 umgestellt. `KC_HOSTNAME_STRICT_HTTPS` +ist ein v1-Parameter der ignoriert wird — HTTP-Zugriff wird ausschließlich über `KC_HTTP_ENABLED` +gesteuert. + +### Fixes in `dc-infra.yaml` + +| Parameter | Vorher | Nachher | Begründung | +|----------------------------|------------------|-----------------|------------------------------------------------------| +| `test` | `…/health/ready` | `…/health/live` | Kein false-negative während JGroups-JOIN | +| `start_period` | `"60s"` | `"120s"` | Mehr Puffer für langsamen First-Start (Realm-Import) | +| `interval` | `"15s"` | `"20s"` | Weniger Stress während Startup-Phase | +| `timeout` | `"5s"` | `"10s"` | Mehr Zeit für Endpoint-Antwort | +| `retries` | `"10"` (String) | `10` (Integer) | Korrekter YAML-Typ | +| `KC_HOSTNAME_STRICT_HTTPS` | gesetzt | **entfernt** | Deprecated v1-Option, erzeugt Warning | + +### Gelerntes + +- **`/health/live` ist für Single-Node-Keycloak die richtige Wahl** — `ready` ist für Cluster-Szenarien + konzipiert wo mehrere Nodes koordiniert hochfahren müssen. +- `retries` in Docker Compose Healthcheck sollte als Integer, nicht als String angegeben werden. + ## ✅ Ping Service — Tracer Bullet Analyse & Fix (2026-03-09, gleiche Session) Vollständige Analyse des Ping Service Stacks (Backend → Gateway → Frontend). Ergebnis: Die gesamte @@ -226,7 +296,202 @@ fachliche Implementierung war bereits vorhanden. Ein einziger kritischer Bug gef | `.gitea/workflows/docker-publish.yaml` | Push `main` | Build & Push aller Docker-Images | | `.gitea/workflows/pr-guard.yaml` | Pull Request | Prüft hartcodierte Versionen in Gradle-Dateien | +## Bugfix: Keycloak Healthcheck — Finale Korrektur (Port 8080 → 9000) + +**Problem:** Keycloak 26.5.5 startet sauber (~15s), wird aber dauerhaft nicht `healthy`. + +**Root Cause (final):** Der vorherige Fix hatte Port 9000 → 8080 geändert — das war **falsch**. + +| Port | Zweck | Health-Endpoint | +|----------|-----------------------------------------|-------------------------------------| +| **8080** | Haupt-HTTP (Login, Admin-Console, APIs) | ❌ kennt `/health/*` **nicht** → 404 | +| **9000** | Management (Actuator, Health, Metrics) | ✅ `/health/live`, `/health/ready` | + +`curl http://localhost:8080/health/live` → **404** → `curl -f` schlägt fehl → `unhealthy`. + +**Fix `dc-infra.yaml`:** + +```yaml +test: ["CMD-SHELL", "curl -sf --max-time 5 http://localhost:9000/health/live || exit 1"] +interval: "15s" +timeout: "10s" +retries: 5 +start_period: "90s" +``` + +**Warum `/health/live` statt `/health/ready`?** +`/health/ready` wartet auf JGroups-Cluster-Formation (Single-Node: 10×2s JOIN-Timeout = 20s Verzögerung). `/health/live` +prüft nur Prozess-Liveness — sofort `UP` sobald Quarkus läuft. + +**`start_period: 90s`** — Puffer für First-Run mit DB-Schema-Init (Liquibase-Migrations ~15–20s). + ## 🔜 Nächste Schritte - **TLS/HTTPS** — Langfristig: `KC_HOSTNAME_STRICT_HTTPS=true` setzen, sobald TLS eingerichtet ist. - **Entries Service** — Beginn der Implementierung des ersten echten Fach-Services ("Nennungen"). + +--- + +## Bugfix: Keycloak Healthcheck — Echter Root Cause (curl nicht vorhanden) + +**Zeitpunkt:** 2026-03-09 ~15:15 + +### Root Cause + +Das Keycloak-Image `quay.io/keycloak/keycloak:26.5.5` basiert auf **`ubi9-micro`** — einem minimalen Red Hat Image * +*ohne `curl` / `wget` / Package Manager**. +Alle bisherigen Port-Fixes (8080 → 9000) waren korrekt, aber der `curl`-Befehl scheiterte im Container mit +`command not found`. +Keycloak selbst lief die ganze Zeit einwandfrei — nur der Healthcheck-Befehl fehlte das nötige Tool. + +### Fix + +| Datei | Änderung | +|-----------------|---------------------------------------------| +| `dc-infra.yaml` | Healthcheck: `curl` → Bash `/dev/tcp`-Trick | + +**Neuer Healthcheck (kein externes Tool nötig):** + +```yaml +test: ["CMD-SHELL", "exec 3<>/dev/tcp/localhost/9000 && printf 'GET /health/live HTTP/1.0\r\nHost: localhost\r\n\r\n' >&3 && cat <&3 | grep -q '"status":"UP"'"] +``` + +### Warum `/dev/tcp` funktioniert + +- Bash hat `/dev/tcp` eingebaut — verfügbar ohne Installation +- `exec 3<>/dev/tcp/localhost/9000` öffnet TCP-Verbindung auf Port 9000 +- `printf ... >&3` sendet einen minimalen HTTP/1.0 GET-Request +- `cat <&3 | grep -q '"status":"UP"'` liest Antwort und prüft Health-Status + +### Gelernt + +> Vor jedem `curl`-basierten Healthcheck prüfen: Ist `curl` im Container-Image vorhanden? +> Minimale Images (`ubi9-micro`, `distroless`, `alpine` ohne curl-Paket) haben es **nicht**. +> Sicherer Standard: `/dev/tcp` (bash built-in) statt `curl` — funktioniert immer wenn bash vorhanden ist. + +--- + +## Bugfix: Keycloak Healthcheck — grep-Pattern Leerzeichen + +**Zeitpunkt:** 2026-03-09 ~15:27 + +### Root Cause + +Nach dem `/dev/tcp`-Fix war der Healthcheck immer noch `unhealthy` (ExitCode=1). +Der grep-Pattern lautete `'"status":"UP"'` (kein Leerzeichen nach `:`), die tatsächliche +JSON-Antwort von Keycloak enthält jedoch `"status": "UP"` (mit Leerzeichen nach dem Doppelpunkt). + +**Beweis via `docker exec`:** + +``` +HTTP/1.0 200 OK +{ + "status": "UP", + "checks": [] +} +``` + +grep nach `"status":"UP"` → kein Match → ExitCode 1 → unhealthy. + +### Fix + +| Datei | Änderung | +|-----------------|--------------------------------------------------| +| `dc-infra.yaml` | grep-Pattern: `"status":"UP"` → `"status": "UP"` | + +**Vorher:** + +```yaml +test: ["CMD-SHELL", "... | grep -q '\"status\":\"UP\"'"] +``` + +**Nachher:** + +```yaml +test: ["CMD-SHELL", "... | grep -q '\"status\": \"UP\"'"] +``` + +### Ergebnis + +Nach `docker compose up -d keycloak`: Status **healthy**, 2x ExitCode=0 bestätigt. + +### Gelernt + +> Den Healthcheck-Befehl immer manuell via `docker exec` testen und die **exakte** API-Antwort +> prüfen — JSON-Formatierung (Leerzeichen, Einrückung) kann je nach Keycloak-Version variieren. +> Sicherer wäre `grep -q '"UP"'` ohne den Key, um Formatierungsunterschiede zu vermeiden. + +--- + +## Optimierung: Healthcheck grep-Pattern vereinfacht + +**Zeitpunkt:** 2026-03-09 ~15:30 + +### Maßnahme + +Das grep-Pattern wurde weiter vereinfacht auf `grep -q '"UP"'`, um robust gegen +JSON-Formatierungsänderungen (Leerzeichen, Einrückung) in zukünftigen Keycloak-Versionen zu sein. + +| Datei | Vorher | Nachher | +|-----------------|----------------------------|------------------| +| `dc-infra.yaml` | `grep -q '"status": "UP"'` | `grep -q '"UP"'` | + +### Ergebnis + +Status **healthy**, ExitCode=0 bestätigt. Pattern ist nun versionsunabhängig. + +--- + +## Bugfix: Login fehlgeschlagen — `directAccessGrantsEnabled` für `frontend-client` + +**Zeitpunkt:** 2026-03-09 ~15:41 + +### Symptom + +Web-App (`localhost:4000`) zeigte beim direkten Username/Passwort-Login: + +``` +Login fehlgeschlagen: HTTP 400 - {"error":"unauthorized_client","error_description":"Client not allowed for direct access grants"} +``` + +### Root Cause + +`AuthApiClient.kt` verwendet `AppConstants.KEYCLOAK_CLIENT_ID = "frontend-client"` mit +`grant_type=password` (Resource Owner Password Credentials / ROPC-Flow). +Der `frontend-client` hatte in `meldestelle-realm.json` jedoch `directAccessGrantsEnabled: false` — +bewusst deaktiviert als reiner PKCE-Client, dabei aber vergessen, dass die Web-App ROPC nutzt. + +### Fix + +| Datei | Änderung | +|--------------------------|----------------------------------------------------------------| +| `meldestelle-realm.json` | `frontend-client`: `directAccessGrantsEnabled: false` → `true` | + +Live-Update via Admin REST API (kein Neustart nötig): + +```bash +# Token holen +TOKEN=$(curl -s -X POST "http://localhost:8180/realms/master/protocol/openid-connect/token" \ + -d "username=kc-admin&password=kc-password&grant_type=password&client_id=admin-cli" ...) + +# Client-UUID ermitteln & PUT mit directAccessGrantsEnabled:true +curl -X PUT "http://localhost:8180/admin/realms/meldestelle/clients/$UUID" \ + -H "Authorization: Bearer $TOKEN" -d "$UPDATED_CLIENT_JSON" +# → HTTP 204 +``` + +### Verifikation + +```bash +curl -X POST ".../realms/meldestelle/protocol/openid-connect/token" \ + -d "username=admin&password=Admin%231234&grant_type=password&client_id=frontend-client" +# → "token_type":"Bearer" ✅ +``` + +### Gelernt + +> `--import-realm` in Keycloak importiert Realms **nur beim ersten Start** (wenn Realm noch nicht existiert). +> Änderungen an der realm.json nach dem ersten Import müssen entweder via Admin REST API oder +> durch Löschen des Volumes (Datenverlust!) neu eingespielt werden. +> Für Dev-Umgebungen: `KC_COMMAND=start --optimized --import-realm` mit separatem Reset-Script +> oder Admin-API-Skript für Konfigurationsänderungen vorbereiten. diff --git a/docs/ScreenShots/docker-web-app_fehlschlag_2026-03-09_15-39.png b/docs/ScreenShots/docker-web-app_fehlschlag_2026-03-09_15-39.png new file mode 100644 index 0000000000000000000000000000000000000000..13ecaf39b7bbaa8b1ce265e05b8f8c050b1bf508 GIT binary patch literal 36758 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
    Hm#Q2r7!9@?a8qyd8x0Pz6 zgG+ejK4=EwLg8K+v^IoKe}Tn@ELaSaS=k~WKd4qBfcy`CHf(Ms>dzg5Pv_v70@pt1 zX}|(UT#Li-@_$??&J*fURenlWUs-A_*|-dxLj~P9Vb}BTlZ}lJf*<#UnZ(Arn!L

    d?_Pe&Z%_(eqB7=#v{2NTj6yiLIkS5zn&J7h;u6E zL{d^2OxV&?<6zsn9VbnRZySGY*hes$XZ7fznZ6EYzD#oWWygo?qq?uVWY|?8rotLK z71=QkRLrqecoBTQ+f2LB_Ug*aRx&sS7dp3R@RoT&wAR7_czs?yk?KxIVcHjyHh25b-j zO7l~nfD=fqgSR7C&&EuWIcI2b3B*2HwVy@R1M~54**{b>SXT*aR{hn?wvix z+JJVF(Bh2?77m}65ZU36OEq0G-?wVR%72Gq9sJ$1LPqWQ1=iOs?0pp|r1T^}_QlTVDti(-w+;MHOV9Ix&|~&*Ob3 zC58i|Jne#4S%jVJ5(S{bmqf3a1qq6Isj;mnQalGCaHfO-7s6%OR-{pZ(BY zjInb@?OM5oFdE+d9gqgo1`ZVjI=Ns`t+c+B;nn0;;=j;%d5PTdGsyt~Cq5oz`W3LR zDtO|S@lIouc!GDcp{x~%h3Q@>R_)r-gl`yQr6&!u1N&ult+J5q{y(}LCk4ydG}`1) zhMlw_kg zQMSuCg+ghZmIU+}J;}F+35bS<2q$GdILq5vXSqpFB>VcY5A{)9G$xRAkKxOKh|^VP z-#i|{2NelR2xg!BK)=5j?MuiG5?2}%>}#7I_t>T{wwM|xAOJ%5A2QcIm%SZ$R(qoe z6yn^h*|9tSKqcv->)MMWZeIR-oEhgvakgQ23aSi{Pg;oD%K40gXP2GC3#OJ0?vlQp z(>l?Q`#}rZzSg{lG&xjrm5`;N)B|V@M``X`$LVvK*Lg=cF&du{t>_#EBZNVP$~DTj^yv&c%|A& zs>#7ZYfAgaBZ@O&@>^uS%Tkbuykqd;lS6?kYR@H0-qwow>*K8z#$>PMXAPaH|M^%q@eU0DH)}ZYso?i>*Qm=thE$)=;@XPtR%DqcD zkg)HMd=KAlBVCK@cSBho4r9x`?e?~I$Di6Qc>@2fG=N_eyzpVisbN`7SKshM?7XS( z&ZA!~zInS}!yFcW44CvM5cUC4nvB@(f2FmuJ zr;SC~RX@*a#R@sKvheyT@e=e*b-=QfQWqh=LsHhoRKWw6QX$M&>RfqQ1+r{#}QuU~%bc5wc1@sHnPf6F&GsvGs&Mr`-l zhkxBYbMg;4vs)=IYWyTVzBzkWh~u5PTi)f;%kD0C#=eMw+oZqOWX`8fG_ffZmqpAX z#_xmo{TUG>p6Xjs?ta+$HIOw>mpfw=g!jHJ_TF=`0VotK^9b{@5RpN9#YE?%^BE&C zLh4?Pn|J+VYi>yAf=Pn1uB?~a{SM~#iM|a+*3v%)1G}v2&lo?>&W)pUt%g zST7kigk!%38%xixu@<1N+9390!xn0!VJ+TwSI1sRuJ{s5>+_Ao#?=AZG$U1&I+84i z5(^R(0qs-kq$_2}J`sNR^dU?6e6_hqKSq375REq*Maw45h`F$d_2XUcY*h-EAXhxq z{4=m(OCKE!unxe|Eb}OecxuLRoh%67ua@3ZH9VKQpLfP@z9QNFj=vM_Whblc<}N+v zysh;}i0$5Y-E63@kL_6+-`*unPouCpqKJdV#-jEQ!R*t+$qUT^ zN(Otn`2haW>YS2QDb!1$0@}be3umX{L-wwDrgjcDbHiYio02}zIxUO(6@<5}hnpXS zZ8@F|C-2T|c+#LRjUNt-O`WZfV#ffS1nMwi^&gJghGPeWoZ*T9UVkj-=3A1Zx-L>aG zTO<;#)f@1SAMbC*@i?wK^5IE?2*9#DY{L7TR(rRfQ~jB`UYl?*H{S;-!e=Y{y<$L2 zZ=X~=QBkU!{t(PA1K`kp$n;S&IZ=xlw(>kgkbnrxQaBgp%vAF_gul!e~76jV2nJYJMn?QXL9-j=PPp4hs( zWi{qmdHCp$?5pIvMkGm#&MW>z)iC)hV#ci_XN#t8YUTtN-#EO*$`4;=nPP9{>l}1R zrWmW^A6-eX7Y4P0Qy{h{@`yxhXcIduN0Wjic zCq4Mz^Q9Jk5Z$qK(%A7g1(w8BhjRD03 zJux!jamU&ql=1bYk*Ex(p7>RQtaH6?UV?mjJuPzAuB^^q&f54*2a_ z7j*`;1-YA9Vmp`&jkm)3)NMgfvjUg)#!%xto=;|LLev3lA1|zYt)i6$P|2cW5I^<{ z2AvcY>#GMEY*C$rmYaa8O!gh1OFy6^xuV%ZVdPrZcn43jO$tFf^B!wl2AU)s_LCsf z_39LpbY>*C_E_A_v>1{3X?k3guZJ1FLhH>5WP zeE9GI*rqL}XP?)1)*5Sy0(2f*rAfzjxTcaTJky<+_^2E$8R9E^Kc za8Gj24@~TOdHnS3D<|U>|FBSlpq(}jz=ZcQ!b9!@CSf|{BJif95u>@Lrrp8ZQ9|Fz zR9E%)C%O5Bz(h%P4(`F}qOvl{3dCB;5*|*{Ue{ND-`vh{K5_(e*1{GTOKtaNvRIdl z=(clzma2q}jm<1T*ox6)OkP%}S8!rr#9VfeL8h7%uawOPd$Y>+kGCTolLnLq={Jgc z=2xu8{qRz7S3o)aMNr90BVajxUGdmg^F+PNRlC#{LWSqIRY(U;IzJM6_9FsUT_?Zu zK_*9tfY{tvCDuuV_@RWL&!?WZOZiO|X(buThz54#4Hp^b0xmwNw(x>4UqEM5dG*}cBi99ov`=t|$IZTEUu)`YgI4lLzdIj>Fig zh*)V|U>r@>W!Jo)I%)Q|ZYQ&b`>%s-|07$HbF2X_^`-%Xar5y=DBLj|R`HGaF#mny zN8W;Lo#Q{7eXkeq*aB87L#ra&Tr^;OOSaDc9}a$toVe}-{0$5*Tw%~NUUiG+7)Z|g z@(ay@qJv1y#4VW9Jt+doEp7=873s4{t*yN45X{o}8TO7*zp z;ev}HyLIWf*ITRqU2HkMROFZlc3$no)wmwK_CJSLc&|A>^vV@@eS_}S zX2yBhre98P$+~!;@PD{lJM~hnC|Fq)-+zAilTxODw@1B1{*Q|xxA$HGG&Wdl$&3OSt`$Lm2uH_T<=aM_wqlr-L-qwfxpi0AtV>AMqMsQjGN4uy#9d#rIa+1G3t)y zjf{#tz(zyFFbcjctb6okPcJXKMe1(T?rQKwC?K9tCi1A(kldjDr@;HnMP)tQiy8pv z4ZORwLCD$Ndjv;PyEeD6U~~||JJTDUXsC?;L?fP!WpA%vu5KBjO>NHE&W?>5$MpV8 z2FB;CgGWR0bfDgC9e;hW{-%rs06j25b69>+D8y~~yvELOPxW9E={bTtO~Ku~RtEPe zdvmrB8Qv2#H;M`uR|ncNB>$^DvH341Z6@;@?*i7vDrvQ)?~~Vq#2JkVbiUl4eoZ>GM$NifA<^ZP;%;?__6Trtja-;3b$JEdkzTuHATPcXK&u znjt~7`|Cih2J)26jjAgioduY|F|N5GN?q~7Jfhn3PSu?$nKHDU(o#=rtH-qlL3tqpnKXHQtnF51tzy8v3g!JH+EG zA77AaPFofm;El}vJjs4L9keHWtt&5AnB zO9$rC<`NVC1WVPv>~t z?K^p3%+It2s5bkKLciym1Z7-sI*h*+v(&iUAn5o#lxMb9Ojy)42fT~V(LUZUA=4~= zf=ejvb$4fdLqpeV5aK!}yUNFIciOjuB|0tB7BPHP7Q9#{Suj_FkEg&@M&9we0<2Q0b> z@whygrkbj{mIT9&n7cPVu@@QEdCn3fB03e6yQ+8;6 zIlhDSM*(HhEsg85G^fcrZ0h8Va4dQ)@v?Tn-K?N*s))3GoBdr&Bv~WnWzeKGWYDth zEGqYz*OVU~Jqw5~4LELKWm>QAO;sW`CI|PlH=?yWTZ0I>tvRQqcm08nnRH4iPYd*I zWKPlcfBw{){V>Xs31aiiAzazx3)@h2OMB^U_5xLGuCCT7fk&HxTLr#{$_2#T#{V-i zabL;zCA`!EEO4n6V4PQ*@Y2*D6w#FyG8!5x88{uD3TOJH7CzM1*9W8a?wXhk%N2M; zEBxHuo)^o%#`lk{O*0GJR40$9tAnlveT}aD*gDWr?zATij}rrbt7&P`Xvl6fB(fHP zue&LAB?|J)VMGL>A+tT_72F;QrJe3}Zwe%NH^d&}R=b(`$YCVOn57tpixv%W14M2v zWh!WGu1C%l!3pWY#^@x+%|La7{=#H2a*NXkx=aGrA#-v;V>$m{B%2)R*M$T1=Y&~n zZT<|O{e;f_tKc3i7C>TM(#>l^Xib`3>K%#CE$GI5nZN`bNjGhhW+U-XdXT5}B(-POB5LIJ0d)PEyD;bvqtd>zbb_ zTZgvK62Nd(i}x?89-jifLLts~qG;jL>>Dq|b{sMLUECXTbxlTQ#@zSHTv1EVPGlo> zH*-#2OavPuSswJy#jP*xiEAxVItI1%?@pe!bCMIL=uMuKbC@64DF>;qZFr(TQd7^4r3EG4>91 zH6Xsba|tdFXpSBbcxPkm{xIfgUAA*4cg>Du#Bl-EWq528GhRE2x8B#}ye|0H0sYuRdgu(Gj z5MfnY9?Rzcqn$1!t> zEU(l(OLR#h_gZt%)K+bnBPu(vyD&0!VONx?qRvnSX-Q=Iu;$uf9cT($_v}b<5%eNo zX>(i7=G1^ZZ?iZ9ss*T)g$4~KUji_bXT?F_FV&)}%gk>r4{KIBSPZL;qlviV^brOB zroW~)UQe=~-0<(kaYrWDBQ!x&o#)aZ46PBugb0!y9GoWHqdzz$~ z9XGJ-7`FU9;=YafJ89|dj(KFq2fML0dWmRPOWkBXx!h_>w$*RxXLQFDf;QV0CStX? zCzyMBWH~=@Is8*qw)7x&HTpQv#jA?=!^~Q#)QI+NF96s7y8vMI7mE5B8sUVs=B_xImNfgXJ|U3x z_PwX2Vu0A*Tp1W`RY6o?b` zhF?{h*=+UeFo|}3vO~U>W@)jzKaw+hcF`4!MRjF*WsyHRU=()t7*m>j`<}D$rs%{c z=h|nFg;A=%1DS=#1Mf4uQM-)`2brMa$Cr3LU;iB4;TJI;~G~O z5-WV?%-i!TnzRm|UlRVmToeOBFx`RvCO2>QUx~j^3y<1^>&=&dkOBbm<^|CxAguZo z8K56{D=AK{IXtb@fxVjlW;r$=xTSGR)9;t zuNRP@0sj7!sGk^nYMN=!uPN|;k9$efsSB2fEi!=1{EA6lJc=}wQc}c?xmezVMa@6` zr}GC8BMO*;a;^c#D!|{_TOO6g-wJs%Ggf<7sBg0lg0Z}0o!N1|A{+2w1FQc0yqGcR z=}}eOS@Gv#fU7H$ZmJBdyMWMm5oNh3PSIa_2W5@VpS0HTsFv4SolEK#4pqD&HbBdC z0s=1+yGKHo?^){JclSH^%_CL&BjRz^qooDq^-|4MGrenf9UfIi&vX5s0qdEA!Tr+s zOVBttjO4PnBvy=dVy}| zW+Zy}8X#dH@I|Wk_3W&jiZmG{;CyTs_2Rbk@oX)JlyR+JS-+uXyI}x@0WJUkMH1xy dxkSt^)OdB^@83&~m>u-)zOK>TiaU>A{vReTPz?Y8 literal 0 HcmV?d00001