From d9c35f5ff646d4d38c73e21a31cd63f3baa82044 Mon Sep 17 00:00:00 2001 From: Bernardo Magri Date: Mon, 13 Apr 2026 19:50:09 +0100 Subject: [PATCH] fix: resolve evaluation purity, missing packages, and brittle paths --- GEMINI.md | 67 ++++++++++++++------------- core/home/behavior.nix | 4 -- core/home/configs.nix | 4 +- core/home/overrides.nix | 9 +--- core/system/hardware.nix | 2 +- core/system/scripts-derivation.nix | 60 +++++++++++++++++++++++++ core/system/scripts.nix | 63 +------------------------- features/default.nix | 2 +- flake.lock | 70 ++++++----------------------- flake.nix | 35 ++++++++++++--- installer/install.sh | 45 ++++++++++++------- lib/default.nix | 7 +-- screenshot_2026-04-13_13-35-05.png | Bin 32841 -> 0 bytes 13 files changed, 176 insertions(+), 192 deletions(-) create mode 100644 core/system/scripts-derivation.nix delete mode 100644 screenshot_2026-04-13_13-35-05.png diff --git a/GEMINI.md b/GEMINI.md index f74edc7..d1ae717 100644 --- a/GEMINI.md +++ b/GEMINI.md @@ -1,40 +1,45 @@ -# Nomarchy - A NixOS-based distribution with Omarchy flavour - Agent Build Blueprint +The Nomarchy QA Mega-Prompt (V2: Forced Trace) +System Role: You are a Senior NixOS Architect and Lead Quality Assurance Engineer. Your mindset is critical and highly skeptical. Assume this codebase contains fatal evaluation errors, infinite recursions, and broken dependency chains. Your job is to prove the code works by attempting to break it. -## System Architecture Overview -Nomarchy uses a **Modular Merging Architecture**. The distro is distributed as a Nix Flake that exports two primary modules: `nixosModules.system` and `nixosModules.home`. This approach ensures strict separation between the "Upstream" core and the "Downstream" user configuration. +Execution Directives (STRICT COMPLIANCE REQUIRED): +You are forbidden from providing a summary or a "Looks good" response until you have completed the Forced Trace Protocol for every single file provided in the context. -Users interact with the system by importing the distro's modules into their own `flake.nix` and then layering their own personal modules (`system.nix` and `home.nix`) on top. This follows the native NixOS design pattern for declarative, multi-module systems. +The Forced Trace Protocol: +For every file, you MUST output a block formatted exactly like this: -## Directory Structure -* `flake.nix` (Master entry point with core modules and test configurations) -* `installer/install.sh` (Interactive installer generating a clean downstream flake) -* `modules/system/default.nix` (Distro-wide OS defaults: SDDM, Plymouth, Audio, Network) -* `modules/home/default.nix` (Distro-wide user environment: Hyprland, Waybar, Styling) -* `bin/` (The collection of Omarchy productivity and config scripts) -* `themes/` (Distro-wide color palettes and backgrounds) +[TRACE: filename.nix] -## Core Components & Logic +Inputs Identified: (List what this file imports or accepts as arguments) -### 1. Separation of Concerns (Upstream vs. Downstream) -* **Upstream:** The `nomarchy/` directory contains the core logic. It is treated as an immutable input by the target system. -* **Downstream:** The user's `/etc/nixos/flake.nix` imports the upstream modules. The user's personal customizations are kept in `/etc/nixos/system.nix` and `/etc/nixos/home.nix`. -* **Merging:** NixOS automatically merges definitions. For example, if both the distro and the user add packages to `home.packages`, the final system includes the union of both lists. +Outputs/Effects Identified: (List what this file exports or configures) -### 2. The Interactive Installer (`installer/install.sh`) -The installer is designed to bootstrap a fresh system with this modular structure: -1. **Repo Detection:** Identifies the location of the Nomarchy source. -2. **Scaffolding:** Creates a new downstream `flake.nix` that imports Nomarchy core modules. -3. **User Files:** Generates skeleton `system.nix` and `home.nix` files for the user to customize. -4. **Flake Updates:** Uses the public Git repository as the upstream source, allowing users to update their system via `nix flake update`. +Vulnerability Check: (Explicitly state your check for scope errors, missing inputs, or syntax issues) -### 3. Home Manager Integration -* **Hybrid Declarative State:** While the distro is declarative, it uses state files in `~/.config/home-manager/` (managed by the distro's scripts) to allow for instant UI feedback (theming, fonts, wallpapers) without needing a full system rebuild for every small tweak. -* **Script Wrapping:** All scripts in `bin/` are wrapped with their specific dependencies (`swayosd`, `pulseaudio`, `jq`, etc.) to ensure they work reliably across different hardware. +Status: (Pass / Fail) -### 4. Dynamic Theming -* **Palettes:** Themes are defined in simple `colors.toml` files. The distro dynamically generates Base16 palettes from these, allowing for infinite theme expansion without modifying Nix code. +Specific NixOS Architecture Checks (Apply during your trace): -## Verification & Build -* **Test Installer:** `./bin/utils/nomarchy-test-installer` (Builds a VM of the installer environment). -* **Check Integrity:** `nix flake check --impure` (Verifies all configurations evaluate). -* **Build ISO:** `nix build .#nixosConfigurations.installerIso.config.system.build.isoImage` (Generates the flashable USB image). +The Flake Root (flake.nix): > * Verify inputs.nixpkgs.follows logic. Are there conflicting versions of Nixpkgs being instantiated by Home Manager or other inputs? + +Check the specialArgs and extraSpecialArgs. Are the custom variables (like targetUser or inputs) correctly passed down to the nixosConfigurations and homeConfigurations? + +Module Scope (*.nix): + +For every imported module, verify that the variables it calls (e.g., pkgs, lib, config, inputs) are actually in its parameter list { pkgs, lib, inputs, ... }:. + +The Shell Scripts (install.sh / bootstraps): + +Check for variable scoping and word-splitting bugs. + +Verify that every external command (like git or gum) is executed via nix run with --extra-experimental-features "nix-command flakes" to ensure it works on a barebones, unconfigured NixOS live environment. + +The UI/UX (Home Manager): + +Trace the execution path of window manager bindings. If a keybinding calls an app (e.g., alacritty), verify that alacritty is explicitly declared in home.packages or programs.alacritty.enable. + +Final Deliverable: +Only after you have printed a [TRACE] block for every file, you may provide a "Critical Incident Report". + +If a file failed the trace, quote the exact broken line, explain why the Nix evaluator will crash, and write the corrected code. + +Begin the Forced Trace Protocol now. diff --git a/core/home/behavior.nix b/core/home/behavior.nix index bac8aea..a8c57b2 100644 --- a/core/home/behavior.nix +++ b/core/home/behavior.nix @@ -16,10 +16,6 @@ let configDir = ./config; - overridesDir = "${config.home.homeDirectory}/.config/nomarchy/overrides"; - - # Check if user has an override for a specific config - hasOverride = path: builtins.pathExists "${overridesDir}/${path}"; # Behavior config categories with their source paths behaviorConfigs = { diff --git a/core/home/configs.nix b/core/home/configs.nix index 9a5b23e..c966428 100644 --- a/core/home/configs.nix +++ b/core/home/configs.nix @@ -37,13 +37,11 @@ let # Check for user overrides userConfigDir = config.nomarchy.configOverrides; - hasUserOverrides = userConfigDir != null && builtins.pathExists userConfigDir; # Generate the xdg.configFile attribute set makeMapping = name: type: let - hasUserOverride = hasUserOverrides && builtins.pathExists "${userConfigDir}/${name}"; - source = if hasUserOverride then "${userConfigDir}/${name}" else "${configDir}/${name}"; + source = if userConfigDir != null then "${userConfigDir}/${name}" else "${configDir}/${name}"; in { inherit name; value = lib.mkDefault { diff --git a/core/home/overrides.nix b/core/home/overrides.nix index 9f7822a..658ab22 100644 --- a/core/home/overrides.nix +++ b/core/home/overrides.nix @@ -20,14 +20,9 @@ let overridesDir = "${config.home.homeDirectory}/.config/nomarchy/overrides"; - # Check if a specific override exists - hasOverride = path: builtins.pathExists "${overridesDir}/${path}"; - - # Get override source if it exists, otherwise use default + # Helper to get override from options getOverrideOrDefault = { path, default }: - if hasOverride path - then "${overridesDir}/${path}" - else default; + config.nomarchy.overrides.paths.${path} or default; in { diff --git a/core/system/hardware.nix b/core/system/hardware.nix index 2c0e884..5227399 100644 --- a/core/system/hardware.nix +++ b/core/system/hardware.nix @@ -25,7 +25,7 @@ in wantedBy = [ "multi-user.target" ]; serviceConfig = { Type = "simple"; - ExecStart = "${config.users.users.${config.services.displayManager.autoLogin.user}.home}/.nix-profile/bin/nomarchy-haptic-touchpad"; + ExecStart = "${pkgs.nomarchy-system-scripts}/bin/nomarchy-haptic-touchpad"; Restart = "on-failure"; RestartSec = "2"; }; diff --git a/core/system/scripts-derivation.nix b/core/system/scripts-derivation.nix new file mode 100644 index 0000000..a9444e6 --- /dev/null +++ b/core/system/scripts-derivation.nix @@ -0,0 +1,60 @@ +{ pkgs, lib, ... }: + +let + # System script dependencies + systemScriptDeps = with pkgs; [ + coreutils + gnused + gnugrep + findutils + gawk + jq + nixos-rebuild + pkgs.home-manager + git + sudo + brightnessctl + playerctl + pamixer + pciutils + usbutils + networkmanager + lshw + parted + btrfs-progs + cryptsetup + gum + curl + wget + libnotify + bc + supergfxctl + systemd + ]; +in +pkgs.stdenv.mkDerivation { + pname = "nomarchy-system-scripts"; + version = "1.0.0"; + src = ./scripts; + + nativeBuildInputs = [ pkgs.makeWrapper ]; + + installPhase = '' + mkdir -p $out/bin + cp * $out/bin/ + + chmod +x $out/bin/* + patchShebangs $out/bin + ''; + + postFixup = '' + deps="${lib.makeBinPath systemScriptDeps}" + for file in $out/bin/*; do + if [ -f "$file" ]; then + wrapProgram "$file" \ + --prefix PATH : "$deps" \ + --set NOMARCHY_PATH "/etc/nixos/nomarchy" + fi + done + ''; +} diff --git a/core/system/scripts.nix b/core/system/scripts.nix index 709f43b..a4c610a 100644 --- a/core/system/scripts.nix +++ b/core/system/scripts.nix @@ -1,64 +1,5 @@ -{ config, pkgs, lib, ... }: +{ pkgs, ... }: -let - # System script dependencies - systemScriptDeps = with pkgs; [ - coreutils - gnused - gnugrep - findutils - gawk - jq - nixos-rebuild - pkgs.home-manager - git - sudo - brightnessctl - playerctl - pamixer - pciutils - usbutils - networkmanager - lshw - parted - btrfs-progs - cryptsetup - gum - curl - wget - libnotify - bc - supergfxctl - systemd - ]; - - nomarchy-system-scripts = pkgs.stdenv.mkDerivation { - pname = "nomarchy-system-scripts"; - version = "1.0.0"; - src = ./scripts; - - nativeBuildInputs = [ pkgs.makeWrapper ]; - - installPhase = '' - mkdir -p $out/bin - cp * $out/bin/ - - chmod +x $out/bin/* - patchShebangs $out/bin - ''; - - postFixup = '' - deps="${lib.makeBinPath systemScriptDeps}" - for file in $out/bin/*; do - if [ -f "$file" ]; then - wrapProgram "$file" \ - --prefix PATH : "$deps" \ - --set NOMARCHY_PATH "/etc/nixos/nomarchy" - fi - done - ''; - }; -in { - environment.systemPackages = [ nomarchy-system-scripts ]; + environment.systemPackages = [ pkgs.nomarchy-system-scripts ]; } diff --git a/features/default.nix b/features/default.nix index 8764e7d..bf7f645 100644 --- a/features/default.nix +++ b/features/default.nix @@ -87,5 +87,5 @@ in yaru-theme everforest-gtk-variant bibata-cursors - ] ++ userPackages); + ]); } diff --git a/flake.lock b/flake.lock index 3fd89e6..f632b92 100644 --- a/flake.lock +++ b/flake.lock @@ -244,7 +244,9 @@ "impermanence": { "inputs": { "home-manager": "home-manager_2", - "nixpkgs": "nixpkgs" + "nixpkgs": [ + "nixpkgs" + ] }, "locked": { "lastModified": 1769548169, @@ -296,16 +298,16 @@ }, "nixpkgs": { "locked": { - "lastModified": 1768564909, - "narHash": "sha256-Kell/SpJYVkHWMvnhqJz/8DqQg2b6PguxVWOuadbHCc=", + "lastModified": 1775811116, + "narHash": "sha256-t+HZK42pB6N+i5RGbuy7Xluez/VvWbembBdvzsc23Ss=", "owner": "nixos", "repo": "nixpkgs", - "rev": "e4bae1bd10c9c57b2cf517953ab70060a828ee6f", + "rev": "54170c54449ea4d6725efd30d719c5e505f1c10e", "type": "github" }, "original": { "owner": "nixos", - "ref": "nixos-unstable", + "ref": "nixos-25.11", "repo": "nixpkgs", "type": "github" } @@ -325,54 +327,6 @@ "type": "github" } }, - "nixpkgs_2": { - "locked": { - "lastModified": 1775811116, - "narHash": "sha256-t+HZK42pB6N+i5RGbuy7Xluez/VvWbembBdvzsc23Ss=", - "owner": "nixos", - "repo": "nixpkgs", - "rev": "54170c54449ea4d6725efd30d719c5e505f1c10e", - "type": "github" - }, - "original": { - "owner": "nixos", - "ref": "nixos-25.11", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_3": { - "locked": { - "lastModified": 1775036866, - "narHash": "sha256-ZojAnPuCdy657PbTq5V0Y+AHKhZAIwSIT2cb8UgAz/U=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "6201e203d09599479a3b3450ed24fa81537ebc4e", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_4": { - "locked": { - "lastModified": 1775710090, - "narHash": "sha256-ar3rofg+awPB8QXDaFJhJ2jJhu+KqN/PRCXeyuXR76E=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "4c1018dae018162ec878d42fec712642d214fdfa", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, "nur": { "inputs": { "flake-parts": [ @@ -405,7 +359,7 @@ "impermanence": "impermanence", "nix-colors": "nix-colors", "nixos-hardware": "nixos-hardware", - "nixpkgs": "nixpkgs_2", + "nixpkgs": "nixpkgs", "stylix": "stylix", "walker": "walker" } @@ -419,7 +373,9 @@ "firefox-gnome-theme": "firefox-gnome-theme", "flake-parts": "flake-parts", "gnome-shell": "gnome-shell", - "nixpkgs": "nixpkgs_3", + "nixpkgs": [ + "nixpkgs" + ], "nur": "nur", "systems": "systems", "tinted-kitty": "tinted-kitty", @@ -538,7 +494,9 @@ "walker": { "inputs": { "elephant": "elephant", - "nixpkgs": "nixpkgs_4", + "nixpkgs": [ + "nixpkgs" + ], "systems": "systems_2" }, "locked": { diff --git a/flake.nix b/flake.nix index dda2a61..ce86d4c 100644 --- a/flake.nix +++ b/flake.nix @@ -32,12 +32,28 @@ url = "github:abenz1267/walker"; inputs.nixpkgs.follows = "nixpkgs"; }; + makima = { + url = "github:fujiapple86/makima"; + inputs.nixpkgs.follows = "nixpkgs"; + }; }; - outputs = { self, nixpkgs, nixos-hardware, disko, impermanence, home-manager, nix-colors, stylix, walker, ... } @ inputs: let + outputs = { self, nixpkgs, nixos-hardware, disko, impermanence, home-manager, nix-colors, stylix, walker, makima, ... } @ inputs: let + # Overlays + overlays = [ + (final: prev: { + makima-bin = makima.packages.${prev.system}.default; + nomarchy-system-scripts = final.callPackage ./core/system/scripts-derivation.nix { }; + }) + ]; + # Helper to create standalone home configurations mkHome = { username, modules ? [] }: home-manager.lib.homeManagerConfiguration { - pkgs = nixpkgs.legacyPackages.x86_64-linux; + pkgs = import nixpkgs { + inherit (nixpkgs.legacyPackages.x86_64-linux) system; + inherit overlays; + config.allowUnfree = true; + }; extraSpecialArgs = { inherit inputs; }; modules = [ ./features @@ -67,7 +83,10 @@ installerIso = nixpkgs.lib.nixosSystem { specialArgs = { inherit inputs; }; modules = [ - { nixpkgs.hostPlatform = "x86_64-linux"; } + { + nixpkgs.hostPlatform = "x86_64-linux"; + nixpkgs.overlays = overlays; + } "${nixpkgs}/nixos/modules/installer/cd-dvd/installation-cd-minimal.nix" ./hosts/installer-iso.nix { @@ -84,7 +103,10 @@ homeActivationPackage = homeConfigs."nixos".activationPackage; }; modules = [ - { nixpkgs.hostPlatform = "x86_64-linux"; } + { + nixpkgs.hostPlatform = "x86_64-linux"; + nixpkgs.overlays = overlays; + } "${nixpkgs}/nixos/modules/installer/cd-dvd/installation-cd-graphical-base.nix" ./hosts/live-iso.nix ./core @@ -103,7 +125,10 @@ homeActivationPackage = homeConfigs."nomarchy".activationPackage; }; modules = [ - { nixpkgs.hostPlatform = "x86_64-linux"; } + { + nixpkgs.hostPlatform = "x86_64-linux"; + nixpkgs.overlays = overlays; + } ./core/default.nix ./core/system/vm-guest.nix { diff --git a/installer/install.sh b/installer/install.sh index 0f7ec75..c1cd952 100755 --- a/installer/install.sh +++ b/installer/install.sh @@ -32,9 +32,16 @@ ENABLE_IMPERMANENCE="false" # UTILITY FUNCTIONS # ============================================================================ +# Helper to run commands via nix run +nrun() { + local pkg="$1" + shift + nix run --extra-experimental-features "nix-command flakes" "nixpkgs#$pkg" -- "$@" +} + header() { clear - gum style \ + nrun gum style \ --foreground 212 --border-foreground 212 --border double \ --align center --width 60 --margin "1 2" --padding "2 4" \ "NOMARCHY INSTALLER" "NixOS with Omarchy flavor" @@ -43,20 +50,20 @@ header() { section() { echo "" - gum style --foreground 14 --bold "━━━ $1 ━━━" + nrun gum style --foreground 14 --bold "━━━ $1 ━━━" echo "" } success() { - gum style --foreground 10 "✓ $1" + nrun gum style --foreground 10 "✓ $1" } error() { - gum style --foreground 9 "✗ $1" + nrun gum style --foreground 9 "✗ $1" } info() { - gum style --foreground 12 "→ $1" + nrun gum style --foreground 12 "→ $1" } # ============================================================================ @@ -169,7 +176,7 @@ get_luks_passphrase() { configure_user() { section "User Configuration" - USERNAME=$(gum input --placeholder "Enter username (lowercase, no spaces)") + USERNAME=$(nrun gum input --placeholder "Enter username (lowercase, no spaces)") if [[ -z "$USERNAME" ]] || [[ ! "$USERNAME" =~ ^[a-z][a-z0-9_-]*$ ]]; then error "Invalid username" exit 1 @@ -181,10 +188,10 @@ configure_user() { info "Set a password for your user account" local pass1 pass2 while true; do - pass1=$(gum input --password --placeholder "Enter user password") + pass1=$(nrun gum input --password --placeholder "Enter user password") [[ -z "$pass1" ]] && continue - pass2=$(gum input --password --placeholder "Confirm user password") + pass2=$(nrun gum input --password --placeholder "Confirm user password") if [[ "$pass1" == "$pass2" ]]; then USER_PASSWORD="$pass1" @@ -314,10 +321,10 @@ review_configuration() { echo " Impermanence: $ENABLE_IMPERMANENCE" echo "" - gum style --foreground 9 "This will DESTROY all data on $TARGET_DRIVE" + nrun gum style --foreground 9 "This will DESTROY all data on $TARGET_DRIVE" echo "" - if ! gum confirm "Proceed with installation?"; then + if ! nrun gum confirm "Proceed with installation?"; then error "Aborted" exit 1 fi @@ -359,11 +366,11 @@ execute_installation() { info "Initializing git repository..." ( cd /mnt/etc/nixos - git init -q - git add . - git config user.name "Nomarchy Installer" - git config user.email "installer@nomarchy" - git commit -qm "Initial Nomarchy configuration" + nrun git git init -q + nrun git git add . + nrun git git config user.name "Nomarchy Installer" + nrun git git config user.email "installer@nomarchy" + nrun git git commit -qm "Initial Nomarchy configuration" ) success "Git repository initialized" @@ -493,7 +500,7 @@ EOF finish() { header - gum style --foreground 10 --bold --align center "INSTALLATION COMPLETE!" + nrun gum style --foreground 10 --bold --align center "INSTALLATION COMPLETE!" echo "" echo "Nomarchy has been successfully installed." echo "" @@ -504,7 +511,7 @@ finish() { echo " 4. Your configuration is at /etc/nixos/" echo "" - if gum confirm "Reboot now?"; then + if nrun gum confirm "Reboot now?"; then reboot fi } @@ -529,3 +536,7 @@ main() { } main "$@" +finish +} + +main "$@" diff --git a/lib/default.nix b/lib/default.nix index 01cd641..c83a9e2 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -9,12 +9,7 @@ let # Unified state reading function # Handles both JSON and plain text files with graceful fallbacks readState = { file, default }: - let - # In pure evaluation mode (like nix build .#vm), absolute paths as strings - # will cause an error in pathExists/readFile. - isFileSafe = ! (builtins.isString file && lib.hasPrefix "/" file); - in - if isFileSafe && builtins.pathExists file then + if builtins.pathExists file then let content = builtins.readFile file; cleanContent = lib.removeSuffix "\n" content; diff --git a/screenshot_2026-04-13_13-35-05.png b/screenshot_2026-04-13_13-35-05.png deleted file mode 100644 index 1f9bbf79ba9b716e94f94f04e65da899b8cf7bdf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32841 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 +9Vu@QB9?2s zy6bQL55RY88A{8BOQFCOr*y0dRFPq{N5Bz~STU1J7s%s&=5~IjT^gR;SfXSDjJd#^ z7?jFUbX-$V2+4!oVHB!F1HL5LL6)4rTDkN5jedz1!kf+s~y(2y$rx4#Xhi z15aA-?_uOtE+9||MY4$p!FkR@)Ya>5%U5J@^WL@AlSMTUdUxKXaCvNw$lX$j@<-jl zRIYT}%W&P@YqYr0w)-NjJU~G6-AT?&oKe)+VqULTN7SGNx7$Tu=VKA1EgEYp_*JAv z7szSDme?Pec@M(0j}wf;iIw6EpBiw4S#eWK#=kFmZuo0PXae;5N@}Xu7K{>S*AMP~ z{55zK?aH~-fZ@;Bm{0+^cMq8V1hLslk6I5vkJ`S~+?&kQA|70`%d`oJaFI+@6*U!U zLc~?;pP>?CV%$ZVBJd|x(q~I8C)DQUXV^?WRgBI^;{Cgoy7_TJ?dg>;^ivgt8GCk# z`f%?c=b`^Pm=0e6Adxi{@-#;wLy^FA!#zrihTyr;>stYGYkYoy;Mdapjamd&^TqN< z^_4l`K2=zB^A+dM%9TR~yytODWjv|q973m-tQnl0e|Fj7|23nFj`_FsE&uPa?BDRP*3IgQqui_i2D~R#s6JHidAS{Z zzZLj-Y~1=;Z-w!pWHlDq-AK$@j0LtlOlBd&6`I^09p%i z#A}(5#YjIHx`=P{c00|FFH)mq0x%Vp=I24xvtc@rOobOa?~oWx`)<#6wCEagIY>yu9zl7V)t1@$*gPbqK4nHPOgwW;Rm;WD z;MjzX&9}I`Nz1HHO$=wLiz9Sn)OojEkLK=%=ncH7b&V2Tu&M;l>B8~5 z53Y^=u|7!(il}=*rXZQOrm-Uivu^qjZ@K!?Q70mNP`N61PaxVD=E;#ai5F%49;C#w zq_L!`DN96vmqtLeYj6_05EN*f*-$szY}TXqvS5fEr*h%9`0Jj==o{0vM<)|Nua zI*PadiQ06%K3lQ3&F&ZV<@*!3x-g;IXe1_YZD-_+0oBij42XxROA@f9+0k^TC%z~k zM*m^^^gs`M5nsIJ(8hPa259MU0JJ%^Hyx7aak$8OCbF=-{#vbWH|)5mL(w9VW=(46 zL%(%?ePO#xq(p!e8X*@vGW~wp4tpgLnOKX7r76RNFLv#R?Oq3X{RQkHvWIi(Vv0rF zXZeoW8ChAxtLCsE*Z>)VT)55b?L<^039_?;mn>SQsvI4m-hDQnnwkeSS=&=16>E1j(DVJd8B*7|203F>RN)W4kXN0j)nhj6ILnIXkmBrJR4rBu%G zr?-sED_xpt@}PSkVNF# zSmvt^C40iT33xyzAMDx9e{`M_F_{n3_|| zlKCb~-7&djng8Tbl3Enjg@TRl_pCx_Dcf(I^b^9h&wl1pXKZR_b+#GoJhC45E`L>; z*Svh>U3Q{^E`y*0w>zj?dG!<3N)^qn(^ZE5COv-79$$Y@%5hW1LSxY2hSxX5)H*hg zGM>>VH@lHD7uQvX!fW`!O3TAJ25L0}k5raQq6&|8dr5*)king@jw}Km7gS!o3phnA3it-+i-F$;?m81sIDs)>hrhW zbay%Tt~nG+@Ax{sW5%1*eVPL#oY^`L`pmBUak;h`TTN`)H@+maHiU|}#l2axWUISYUuJ@~H7o^Mnxmdb6MrASlu zMMNI?ZtUL$#JI|B+N~tLsd(6PxR^^*QtsGvEC0E0jKp6~I)$=%BA;E)b?lNYcj42P zgOh6l1e<+xpH!1W&4CHtnYu$>txzg`zU)cw+isHUHs9-g>ckfnR3h3)nepu3 zMnM@CytDq`Q5_Zm*VaB2hyT4QE?S+T z82_stpe58*J;fRfzc-@8nVsfw=c`9V>Gm(imk^C=e#SlAVK|5zz)l|lmRr0IXlN8{ zy%{jpOdM3k|1Q57heRl-H_$_&INLk_0^BT7QA)N${j2fn)U^yJB&>M}Pa|gg0qFE_T)ZHn@wy}2{=nJU@p70e^-w#*>qv!imwjkD zPt9_mSX&8S{C#y9V`vu9ORFTgN-SeLuRaATt&6MAX*<_Z-%v(->sUyX3SY?WZkPQh zRgolUy8lHW*^S1JbToDJIr0$A~gC9_BsuYh7iwl^S7IFXYJd zydY}_e4@iLp>xf2!`E{&w3d~w!@3kp-h>K`Rdsh8?icu=WiQ9xL}_4xzCCRK1~bph zSz==ov0&g5BNx3N5^aCB84~}SIL$ik`F=Vvg@)Fo5jW|e^#Web<6b)}yI8g9I%KJQ zH7tK*`F_j6*P1uk8BoC~+_x||nT&(?YIT>Uvdv`;Aldz`xJ7wpnURaQ2Yg@E_+CqO z#g3iW`K9%`eB@=Wv~aF8NzGwvkoQs}FLiDp?=m)p*3t zCwk*y(wiCo9pb-GB5=JhDv~caJcuV!=Lve|sX&Jj)N~?ewMP9|0wfBcL2}8R-5eEL zO+2_&F?dv3D&sD^1vO>j5J20>Q8Fm>5>8{`>HZLSJ3zVJ{`0T`gDEaw{_4LXXH%x` zY-W;?@T|6>?Y(W^jZrkctJ9CmtsPuMa$6g1hhoO_9XjgyUBPf77@Sb8-c2Uj%Qr8l z-dEn{TTxt%0+K!`RI`5d!nNYv0Zm- zPhKboAPu9O&8Ss*Hl5S?F*`Rf+{Bm|d93WOOCzl#ygcI_PMSZqqoWBgH{k~& zBapd7L4i55E99;{CQOfVP)A)*C}daLUbLm`gM|+HkV27?6rBAX;ZWos0qd_|$Y@y3 zoP0B=qub?G@J+}R{*)coy!R#Y{O^Iw;Bj?XrJ;|T@B#CvEp5ODov_h0L4o;6{ZoNg zRi`Ctx%A`$$}wMXnjW^g-%>_q`<&_L)N<*V{U6~m$zf=zwSHuB7;iyqp68ygzVCxI z7LVY5?sSv}NoZpecgpANf&8g}Z-eUAN_ZfoRzgeJN)Q+cgqC)0Grf&aIwktC@+yYpJ(@#rT&!prDw5?D6D7 zuoy}#!TT*wDq7rsOuJvm-2|^v+qb@(eZ#`Z8ZPlTPu3a}P(w{FQ7vsp4=*1;c7errO-ttg^ zZ@X005P|}U^|F{9)-)27(TGV*4fp4nc183FL2tHvtM0S3`J!PThFmv@V04mbK}e+; zRA@8$%IU)(uDpXFL?+AWTie_qGLhBKptP@4@r(8})T9uZlv0fAYLYkHl0_b<+XAM> zVq?nntT+FvSEuYz(O!a~fzQB8_g4CD{XL8N@ExOeWEF`P1!_W_5JZqAgMNz=$2SSyu{XM`eS5tVgKh1=cTaS+_@TL^1oJdW0qAk)Wm=s zUW!@~NQ`(A5dibK{~8|KO> ztdE_zI*|XC(%Dh#ow>cQtuc&sm(|_$!9W(If#d{{g-D3F1z77=Ui1LE|~n}#A7icZYy>(yr*Okq<-+fm#@W%Z^EV9w#v2!_n{!TMif4F8vhOV94mNqGj-uM77aG> z5{Zl6tIIf`X%Le_ojby?8f&s!`cv*UgL`g&e$@40qkI-Qt*i?>BjfwtpN5o3zN1It zPY<8HZ?asaQ^;c^buRT8M2ngZ(%gAwzNaJi=!Pfx)rp@KQQSpz;L27Pe206{ICR+V zSPm7*cVPY->SpS*L5K$zMQ4p{$n*I|fyv3~(9W!#RH!fF9u{pgqLZF1VK4Ge$vHFj z`Bnlgl45x{%n`4PbU@n2LGR4{wL+#lVu0Sa#$u&Cab~}-m~A=sW@+~PQ1~{jTIQr$ z}^1|yGMKz$}>@apYu|HI+MYMao7rndr` zctO&_+4`!h+-tn;4WIZ`B7GkVHV~CLLd^Eg^3CKq_K3HT+g+#S;0%4Pw|1Q8<-8=k z2^|0|_h#q-n(U=0R4M3|vht`iM%tSr9Cjw+Vi=@9$_NU3WaY1$ShkK^#9ZC)8vf#$D zRP7!6xyjc!P72@S?ywo<)HlBahs%YM?(x zI)V%h_R_70Jquj+cpB@?w5fE2+Hy(`bG%o!F;L6Yq|tv@8YFFRp#vleVE7;@m+I?` z<<4<|d7-bZ^*Q2fwN)~P%I^)8htK}ueHI6C!Q4B8=daFAvX7p6it3k<8LFS3kMKeO zT*4nEj|2Q-T#rx7-RmhBt1hB3&;dj}?@nAX2UrdsB(75;jv59=;Nc<^&i=0{Wp%Up zh~*P?0Rc8?v8}Y=&!Cbj{w4k_b~`a(IHsiH)Pv@|Ur6t05$oiZ6e_)Ai3AsH5Tnd+ zTteH2i8ypF!)Pf8jsy?oLQ51JBP-S?VODu};=>eN&Zh6v=X~|3&o;i+U+{S&{(xg6 zb$^s{`ekFq_lQN@U0=fi9V<{h+RS3ux7O#)__i6Tm0&xmUO$$CI_~ca4<8%D8^}la z0tI3P=uYYP_UxBQq8+-vQU`2BKtLgS71RL{TXaJ3*`t}y=XbX%X++k@_)}MgtfXWV zHA#hV%nn;SntW<2xjBsT=~*?8O*T4>9$&!b@23(d7*1b~=M4}F7J7L=ZpXKVyE z`eVc}f9MNUySXq%L`!|@G5TRjr8_c{)(L|!2)o3$Wrq8$l&MfyTMCR%$=XBc*x;>S z{o2%2%3r=X!kvR*W8LM|WE*=Vf$k8DP z%+#;AsjHm3R>nc!+ev|@E_lATMn#Q(;xCIlEiW{(0{lQwYr20M5odvh_PNIX$7N$l zW8hjYMRc$C{-*ZLdRW`-E=`Ns|4!T3nFa_VzsDha@{S?Nozh3%!W?lP{}Mab>;?FC zalQ(8GBWP#(6QlApKmsT9qCFik6;Y;DP+1X-+O`l9)q;AGREYb4vA4sLXlvci3!;0 zeEmbVI#Pp5`}wW55|Oijik@#N8W+W*<>&DmoN4&ou(ap#HV3_L@p4KQ$}Zo5%0Gz2_@+oLTHx6@95ybLn<J;w~N>7%A^m>%OOq zWu^}lQT$?FJgx&wwT>iGvx`T6<|}-^v2zKI9@4)rP`)V<)DoS&qAD1C8MU$nT~J7F zwPKq}xaacZ-dnK;bGFajiM3s8XBx!-KtXBdcHou{b}??Zo7+6Ea$P;~=|u46J29J7 zYw@6_BKstN_QS9uJ>0PX!ju#crsO$9}r5mVz@mbn7rWxVS629gPo=KR zmqXon))_FbzYCG@HPuHqmdO!4nA8HI>w&stTNG|$yw}}N1p=oZW_@SEni|Aq&zrlD z%z*QW*Ku+h9z+=;I~9w~`mi?^h&D4sbOP?4X7y|xQL?VVF#Nl+2fF`nWe-h2skWf| zO%Dd-4k^7Hg)gSvBWHw=>I`njL`)jih)JU5|FhX5+FrMcomMt)BCW5p2kHG2{ft-v?NUteGc4uPeBxi6eu+9pk;SKnmapb;R=+LQ-3H z(g%mVaKlJhi(cQ&pPOH9JGU|yNJK-4wfvJF0!%IRg7!=iMZE{~SV8D>wW#5{;ft3d zBU_n*+xGVu3dDyA$zsF9t}i-cjF7cJw%2gDDL)XEMM@D_ruRw}l;aG;$>t*7PIUwI zm5{khd0byLdeoes58X$nj$iiP5T{2hVD|}+a3QOLdJn#y2nwohSK#eKX`SUX^iPmX zVa|(?Wn{7JN0hCDQEyi?#U}iJwfEgoO|M&<-s@3NX^Map;h;3B(mNbMMWpwhNbf{? z2aiNh5KwwYdQFg)(2*{^6G96;K!8v~3(3TDzkBqX@0+#e&zV`1mBq@+3dyg$``OQa z_I~$vcU$h1tZ%7*gpl0FCYp2mbH-+_GxvO0sq1uqeBEV5>GrdKvPUv)HJ`N1NVF=_ z3q_3#L7)HgH$oF}v36j4;4DkD8l5p;VfXyWq20g-BHRqC2(Z94hBfYB@x3r2E#19y zh-4^2R_=EwTDfBQjcdlX~A9hHa%SK8a>zRRq^?K^yJ9X9ttrf$=A)%HFtsJuZ z3ueiLbs;vG53Yc7@T@P!?EHH8u#tFUv>v&o@N9)YQz*gT`ABV9Z$Z)5$|Pt@z%gp( zJW!EWfJVv1tjW%Ky^6MWt=7Ud%8Iu2>rr9b=x1w#E=u|P^@&|i6k1Y84`;3i@Xe;b zqml2p%5YMwJD<@~{Iw;>(q+t*QO)$cfjTkUyIeg@T&2vA8?0i%nv?vpmiN)PP30;g zDLU%0ESEbLiJw$u9Fi^Hau_WZC)JfvQIA|Soo+VHD_>oKCkSAc5}60-)ewu{_Gff^c0_hfY670M<4MQ1g0tezfSN;``K0F5_e z``B!aAfqxP%`zf-C^$(B--s#4ZtWqMO#_7hpMCrjqtcyKy49ns;t2WYf5heQ zz4=n#wv>2(P+s|}$ZZ)PsU>M4)PYl?lk?P=D5U}8=stV^I6Z~B(CJl$yKa>7rz&rj z@}K2xmU_~#9$gXPq5u^7&*PY(=l(`h6)%9T{3|CFSdbgmqET!Tg;+GM4bnNdG&5>C zIJrtGU=by<+*;|`e-e6TsHc|v>HY^;xmkjU(3X9uAH30*M}cd(LC`+U47S@*(dK$F!v9mS#H#tTl4SdW8SdP;I(1ub7gLDqD&3A!LGZK zMaf_u=<8;W}Xe;l;ePX^ zNYbpl!#YoiJP&!a3JhH%f6`KZ!%R5@oahKhtwsnK=~-PvN!dKmA7N4&MXQ;gN6*_3 zsfb7#eo-?Y?}Rn#NcH60H$jJe6Kdga0s2Utr0l|>PohpN=oXuGYDphxxK0;WqjDLW^MP}_}xF#Z(PBiawkX^g$<>%$u zG!?Uey~IivbEnDNiHc?Y&pY822rfb|$^71-HRl2+Dny=QmU~)hD zOI8d7?Mh-PV$D^`AR6tNDLr|FKjo9 zH{*Z<;($^H>TQX%k90d4icKq)JybiXMD5lu{fd>G8s6DS*~m{-i<`5o!Z+y4cDMrx zc4Ca4R`JB+q(ByIr~o$pHStT&lnadL8@gGdH4Lna95N_1Apgv|BjT6(coid_L!+qJ zV}ZEZ9K2mIOLoDMs$|4Xf@F$xj?0tXRtiRyTBaRQGu8}R7E9FAb)H62&U<0^4-gv& z;^y|^sey`~`itr9FEs2=qsH0ZSpaOKCId=yf;4pP4$7t1Akk4Pq%DqT;tZ^Ig0wmF zV02SZKSnGq8%qo%et+%auv+blRgaClEMCo@mGCl18pt9237)iehC59%T(3wXKz$X{ z^BcBUz-01oD2y`0%GSMSL3LYb3)SdYL4Jt5f&N4A>BU0Rala@_nTN>o;jlidfRqr} z!DZ95;djd?rWx|HyrOrmk)7d=C?&+aRpY#%<%E6v5KwJ^SB`72UUG1R%B?;us_KE` zf=eK5(%@dVu%0L8-PM_K$yL7{N0USirT3zo-jK}Zk`JCNNW;XJ$NQf>>7#0!tFh`P zu1a(KaLDIS*unmeBy*E@-gCVmbsN9ee=Ka?%I?cq8qHbKVFwRNwA{8a1t9;xI_a{H zYrD;k7&w2QP$M6mmN5Au!LN&G<|lIkk*D zd*=bTrd;~)<`&<5-|wH1IRhhHhr-F5?`^&hkic?uFjeicneswSD-+~soS9KCCE@6R zJXc%``5l-vV0h3`T-IU~KJf8H9jj%cc!HdfC-d28PI&=oo7zG`!=kxfZ3Q4%LUu|E zw86~iH9M^J;y*znV4I^hyP*GL5hYwviv#e1^ zu~qzhjyhQ6Sa+mJLbVSf6*$~JskUA~vPLr*p-Dilbv6R~FUSlNwWHE=p==xYlZ2iT zkA_(iE;Dw0;L!FjSnpXcs-tEf(VV|{s-a@0VCO7mevtXT8pW2H1omtjzH-9M^e`w$ zpEnU-N&^Z$DIU!#cVlL}tpvW;BtK_~*?WQcTI8!BY*vl~UKcQQCN37E6;H2UKMmf= ziN4`!Uor{6aheWx@p2ERUq+x?O2m=qdSca?8SnGS zpdLS=D~F9%3bS{9a(_y`1eru8$EIqW2%28jrtcn|xqPrrl&hY!3mtlm{`Q8Z{Y#@w zSb=q|KE(pD-@hQO=#{)Ea5vbMf-W;qBa$*Uq3(zrC>|>A+N( zeFc)dAin(J*f(FLs|6TT1uYZcmhjgz)kJ+CS*Z3uXuELYrUGzLz>m|kb*y(DhT=;| zML+Y(sB#Aop*L$k6uh?8iJN5X9w=mADW++65ms!x5K6}45AwE4#Z507!8AH;mO4)? zL0NKNMc9K4|9C%XR~<@WYpT!+bJ5UUU#?3ynCi}$=1`5(43QA^WM1k-H(`<(G||sb z_DEOW2)m=o+`y|=2!QrgnK31oA^;na!*KByKEWVR@+Qk1?uv-HHx)Du;o7=Xn(f<# zP(e+4E*Zaw6BF~;A07_F2bVDm#V9B%TelGuVho_qb02c|w;oP5hU{kpoiN)V%=VzH zo(W**K#MISI>usvhFQa|*$^W^(Us9JlFF|T9+jEZ<>YD37<9CH_T>*C+%iM3B$31M z$$8UCQ6GanH)+cQ%v)WqTRI-(f9+~BK3|E^2*N&GFZevK7oj3_Xa_G8+1X^;#xP|p zN(x;YXN6}j5O?t~ns%q^<^Y#g>zn~9+i;20*!n7y$k*}@J;Yx-Ol(D$MDfiq@Ay{9 zAoLH*gyiZu1Put1dZ~~(syyg9pbOeLF-m9Tncf>i#X3aI%>kSOLza5UW!XuT=?5-! zp`^@pNQ`L{-R~elCq6X;MEJm@D?G%_=%KMy_$R5j@Hlo780c+2<5si#3k%r6FAHW8 zk{+s#jil_qem0tZjckXZc@V$UJv8~ablS$3hc-vOIYAuzxo^3VzT7l1CCkj+%>*A5 zKN*mVTV@jkwnoIIhM|ANsIS%^(+#j>2z#a^h2IejxB|BcA^UVj~`7!mFQw>h5BFH3EmZ0kItY`I9|LGrlb0gma>7lq$ ze&D5{_!^1p{75FtYt)S7Aw0Q{IBUSY|pP{yX$qMyW zckz0r54_H1S%lu~_+>j4@O7^4LBdJJ!r?dyd$9MiGxa$kQaz$l_;7Qqp)2)9k5(eu zrkkygFEe2D=JkLx)vgKuX(pp~^%Pv)&Jix7UoDd^{@(3O5k9Wg!hs#CwfgfEzN`Xu zsfTflQn_#2gN_A&`9t$P*t)CP8M9k{%Kesq;9@lI!OG=diXo%)# z8~xE%?0ekmUguHJdhMeqGLIjnodw4yigp3Ks?0U??1vaR!H>;cW19~YSLgu@9fJeH z&DnQT*LRq?DsM53|(J&yV#fWq4;UHi{Rq^D%y+lXz*QllXEC?b%xZ=c@j}KIUUJkEkeu zmxjb+)`G)2a-J|8;%`)b&S@j)ebg+&-8|T*RRW)1BWDlq`Ka{%cQ)c<)VG--SZ;UP zde%^7zb04NAQyO~crsoRY{$52!PSH}(a9tzZPY42o;VH+K8nQ>E~)Lx1Z)jIu24ct=Ojh$F7A}+IFq9E zkS9v-vzFN5x2a;IuipzY3v5gelnD&K-X46FLNoMQUY)qxpmDiDV6eVN-}b(B@0y9L zM5Zamd-IBd3+pk0c^kfa3|FTm6JiUW4bYg@ z?xTo~-l~;R1clKk=`+>hL`MHQmLI<-T504`rYQt!2%vBo(Jr%zvfp~(g1q7|bbjyD}#hX3EAPzSa6HG90{=_UTC zIqczI4kV@cF{l~3Xnx#s^<67re4!Axdz2s5T>MWFOP+Q7C;hM|iXvNt?*0SI)$Ec1 z%}i!RNe@F~Z32>4%j(mA_=sgE55bvPGql4(+mcRb>n+!fwSt2aaSDoh#RO5CnHAXh ztbyMVb;OBDIc!G_RCRLwK-NpV<_3bz6JC9n{i&Tgo)o4(j{wUGd5Qlpx$Dt+O7HW( zJ6r_54Z3`IRcVIo!Y1S~ol@PrQ`Pv@2uBu6+XmaSlDyZWO(KQCAyQ6E<4zMT0bw-l zW@Uj(IUu>flcAD?f{z2pvR4z0cTiGyYr>a@lPOY>Rc}YnBd0YfFpsntjB%Lh_=3HEa{V08$Tx8!qyE6m|4YH~!f74RG)Zq^Hkp<+ ziH2scTGZZ|?7BRvLyFAI)R&{1I2_4|4kSx@4!*%oB?b?u+abbT+`+L+FU&5qZgB_G zB5ru&DDyc7QWD=21>4UN$Xj=)KT*1YVr0kg?qaU zuSt%eOUqYU2pFI7NOde9`hBj&tGNRHq+;p@yOq*|ZEDU11HT%3hga6;aS0~EY>Ama zY}()Qv*a+)ctl%g%3Me+0TN`kmpvx~8c7Xh@jxS<9W-;H?YL;X7g3))Elmu!4j%WOsqR>ud}~JQBXHI+LC0%@wYW~-$%Y3 z8fdslex_b=am?(pYb4?lCnr zBR6h35lV5SL_$e2jnz>3hfoEE z%KK=w@G@kTwpd!fWWsEcuegQ*{@w1uRLV=C(nX$I4C51w9?yGI&N`yGYu{5*#ZpGQ zux*s=?rr>e+fBnSvhV3eDL~J0LGPGO*}9vg1}a-W*J_#h30pt%F29LJq>{+&NR97P zBT(tG@PV(4sUV9%hmV#s-0x{)1z zy@Jhf(m(B)PZyU7N=T-XN21pVd+F}D#BKXdiCi@<w$*Go_)$TDlwT4BC~|HXOzY*^RO<9k$yg!lr!thrD`BKBu$@K63UC zDy4Zafe5wGoodME4{c`W<=JlOa&8PKBZeG&GJW{@HK<0PNLmj-8b)+jd#A`l=qY(fLWSFe zHj>PT&1_kf!>as1Heu678hnQ9?NY9#;5mhXAq2mnM$}3wW?($p>7z-$K+{D~bs=*y^ z)TT|f0JKVjS_*PdQp=FZB)Iqt8)#7#4Ez%E-U?|75QWw;1gY%+_C4ymy_a|unN70kA#NoGYY15U1wze-Z68Q`LW;8M4jE8^tNZuiECYPfri%(~{K{Mu zjf$$*&N*WQge+!2H_`+`SbmvcBMgB+R2m7<1szw}OO&J$$ zIUXmWVZ|7fd3E-sz={^QTwz_|RT3jxEH>hQ`cOZ%GiPf+m)Oqz(MgK17T-B$QsM!sjlz5xa}Wy&35jXX0KSN;K}Q2;lI6}ilI6=4 z3+E4KiJT*g7pHu~z}d&F=CCE$N6sHX>m~CLrCySVsA9V_rv(22veAdNRO-ZI_hP)N z!{kYh;yiA;w;_^2;S61~O~abI<_^L4E5if)O91$OGK36`IjPOl%!$KbZFDP*61TX-y$Ajw(<*&``e!3VWKl%MS*(Zh#L z=OiA)sq$PcZbD&#h_+_4h?iBna^-O}bUX(VSUh|t?Q|N{pg9a!Jan8<{F)Q;=XD6q z#sadkYm4ZtK{z9u&P;0&`=w*fW+;rCzLTfhADYZGlww*i;3rwfmfK5<-@y(Wo2LXtB8P(7R}(>wSwTC%T1oT7EPaIu zeK!5#&bX+^sUvceI!bfes6@YXFtvZG$S&gax1)~~EF_KR#3hSE^}ur5+`BCJ1I@C! z^|8=Nt81uh>k&?Stv;E$6$Cs$ohUHT-o-)SAqY{iMP3S9+Z*hpKp1W>1kB7}blG!e zBaNln?W`=dx+o=Gv?#b?W7*z!izveq@Roz^emXbRv_gN8smqvik0PvkXQ@PE-&+2 ziVvN^c%$3toa3s)nu28`&J_gt@O7&Ro{y4l6}1^OB+&o80_tFL!EVmVS}Ja~?mC_j znq1c}lJF`ic-5(wa$+#VGi%aDtKR>$D+bo(46_p~+az@>TKe2Jx+KKk>}YEh9z2;; zZabS?9uJl>HL!sh?+%*;BH9z(I*PX(dLjG@CPu>0FU#vQpM}SBQ#cY|a)QaJN%H_$ z0F%fuQL*1?!>g*mG`>QnwF35oDP2M3g`FfG)7b!tvWjPMZWce^PU&p6KfHJz?$&Qy z#U<_B-tDfL!s}4%?gMQYG%E`}o+jLm*9nO@;Wur5U>SmV9ctn^-z<&kzF$F7_yk>{ zfda(%tffCAl2KI(wtpTnZ~N*?Aiw|YBfsd`HtuXTET*67So|_NEuB%mqP!qvPFdY7 zpfL+YH0=4Km1Y?dPlj)zl;~ae$-d@IS0F&iIanLVK_@B9$h%-9m3D~he?Rk|=^Pm$kTsdVG|B)+?CO6dPDY@l{1;1K>uItPG&m4{p1AcY68-s7d zaDo5SD##)DqTwW{NZ*;XzPNwO*5}^8avdtuGpLm&K42#M^x{ch9?G46e`+feH6lKZ z5TBMT`FY>3K!M}&t_FV;=muk^E{>SyLDajujI0zVw}PBjB#LUs&CONyE*Gaaa;H~G zEAUQx9qVWl>ZjPy6woVIdovwt4Noof zbb)_kPNhz>AsX#UqvSA=#x{3Wzzu5gQ!~3}In6O!avu2@NF?PQoAr5nT)}G{+J=Ux z@7g5U`#I#c($mvxH`oKhBjiv)86{!~G*(7SqlzpG_LVa*q2^xJI6T!wv~q|H+eHDC zq}L6Vh4(zaO3?yoo*$IYBo*B(wfrMot>PEgqF}`3>+0+r8r$V$b|<;?j#JrJu@kRQ zx z8N3+)1cd=0v`U@er*aKG)qfppRt{+p5kLcZzPf$<=$4Bn{B{zxvWZDgncA-D*8?(N zIsHjw-2HeS@K?n<2C1YowD_+f>(~ETjPRfQUx_1bSz~{1%Y8Fk(rZC#l_Ya;FdD4P zwX&68R5$hNKsCawX27rrprNAwf_(n{g&#cZH^2^uuOO)Pg1Bs-s!^BnLkFQ_M912igcHag;U`>$9P@C!a z#|eqYyPMWTo&oWVCIpu)qlR^>Vhx;R{~h5CbNWnumWa)~FzYocNn81kN6LrqFsmkURTI*kj^n7MJ|><`tLW8Jl6KDg$K&@Yy>IR1TMue_mv{$jXSIKRV|o%VDC3j{K}A$fm)>Pq4G z>MjS1!YpWW#`pr$MyTvy)3^BZ)9Xte{}R|-_WCJS1#6h{(GD$HEM95=AK;Up_nG`< z#0NB?*VgP3f4q51&^%{)URWJQ=flg+!W~W;6xQ-Get&u9%`0UmJ8~6g=`HByY1pba0A>*@5x%@Xhns-`y03feQ%DnarAa#?}Ydc1FJ`m z;3x*17Zvbb@!u!?hA$Eg>#N7)46I?S_@ZP{fz=$?SHVFZ8!YsXZ=Yk1 zaoNMTDO+uGnE)LZ-SFZm{>?cs`9%R1eCnW-7P8b4#eyk4T8oBws^+l4_K zsc_5Bzl79de9%~qRL6lriKhA1EfDsGI&1a<*@k!(=9A)B0f4bbs=6;pgFxFFn!>!5 z$c1VVY0>*7$j>by4Q(MSoA~v&bJqh+m`OD*byh=!c{GDy^o^VQyAF&qCz_5R^!pz* zx&jumlFp6^p>IwW-&7WV5huQC=1|2^a;7KLayT6q{#J|VB43GXXY~_n+;+JL1l^rQ z;X<=aS?{bL&Su}gbyI>P9~?}oJXosax+q)v4gHIW?U$h-)aTC` z^hp=)gS{P;Lu969MrP^~Jp}nBwtUfOleDdK4pm<1Nf{Xjkr-1s)X(lPDV2pgA{r3Q z_>?-jC-)j7h=RRg2acg{_EV!NC+b)j8EZ6Z12e;7Q<%I?2DihtO^*tH{te47T zlG;bEdM0C*l`|~2r;L10P8j3I+Pwmz zX&&&8Ns6_@bD*GN)ID(okX#2aS0d@a=I7OBL<}}q#=mBN`p2i;=a4Gvj*aO*q7CoU z(QdGOgPas99OoUQPL~>vGLTB|-|?Zh@!cYUdm=MT5l0I%kdvY^eO}c&2I$7Lt&3I3 zzeAiW&|Bl4u4Obz5X0t+fXZG6xAGn07=pfs3w$@z<+f73K#I78o&PbMTY$^?sn@q5 z?qnPOGy{VfM^tG}1469~@Rh%zuxWPIOjMG6diKkG5wm_Z8BE#5R#^k5YH7&^;h7clUM9qryu>RFvUr_h%xlH2<_>Dk5E!w&Taf11R+}2-wYg!s4C4~I|9u5vEAb|FBtvB_r1QF0z<9`5UG)%no98X zuBA-XFr@Ami81z)iH27glIM(;vJqzD8rk}eY&txPO!avu!y&3l@8iaIR;F+#_pbi) z=!vC5p8uXcJaKT!*o57_SS6{8141A;?<+QCS`Bdq{Pr-1>ewU)0M`EDJ7T&mB`sbo83E)&T6WlKikva7t->hIT z30&a4@Q=O(Q+>UK%nVkyz0qe~r`ZAy(t9Cm6TUy&Mw@%`Mn7LcqwR^Y4`Vm#EVr{H zLmYtztJFYxr2#dnW@7)XhQ@GN)9~vTJyg4m?qhboiV2Astb`e?mN?=Vnf$ctH-)3x zu80#O^!?(-!W@f7$wnr^iOE~IolT|p)8JQZ!1<`*H7e?~4AkOIUf?Pw3K*a;Y87RxG#Oc<8}XH6@prhu?K znIRB;iH?$;a`{Ldz2{nr6^%7XXFk7ZRH?Ac7DAl+0e&*8 AMF0Q*