From b7b209b70c4f51b88c64d59a77cae7e8369c6e83 Mon Sep 17 00:00:00 2001 From: Kyle Albanese Date: Wed, 16 Sep 2026 21:52:32 -0400 Subject: [PATCH] Initial commit: Arcade85 (5-in-1 TI-85 HD remakes) + AGENTS.md runbook --- .gitignore | 22 + AGENTS.md | 149 ++ Arcade85.xcodeproj/project.pbxproj | 321 ++++ .../xcshareddata/xcschemes/Arcade85.xcscheme | 76 + Arcade85/Arcade85App.swift | 12 + .../AccentColor.colorset/Contents.json | 20 + .../AppIcon.appiconset/AppIcon-1024.png | Bin 0 -> 726107 bytes .../AppIcon.appiconset/Contents.json | 14 + Arcade85/Assets.xcassets/Contents.json | 6 + Arcade85/Games/ComingSoonScene.swift | 69 + Arcade85/Games/DopeWars/DopeWarsScene.swift | 1340 +++++++++++++++++ Arcade85/Games/DopeWars/DopeWarsSim.swift | 628 ++++++++ Arcade85/Games/Galaxian/GalaxianData.swift | 229 +++ Arcade85/Games/Galaxian/GalaxianScene.swift | 679 +++++++++ Arcade85/Games/Galaxian/GalaxianSim.swift | 628 ++++++++ Arcade85/Games/Lander/LanderScene.swift | 1016 +++++++++++++ Arcade85/Games/Lander/LanderSim.swift | 214 +++ Arcade85/Games/Phoenix/PhoenixData.swift | 390 +++++ Arcade85/Games/Phoenix/PhoenixScene.swift | 1035 +++++++++++++ Arcade85/Games/Phoenix/PhoenixSim.swift | 975 ++++++++++++ Arcade85/Games/SceneArt.swift | 295 ++++ Arcade85/Games/ZMercury/MercuryData.swift | 142 ++ Arcade85/Games/ZMercury/MercuryScene.swift | 813 ++++++++++ Arcade85/Games/ZMercury/MercurySim.swift | 451 ++++++ Arcade85/Games/ZTetris/TetrisScene.swift | 898 +++++++++++ Arcade85/Games/ZTetris/TetrisSim.swift | 327 ++++ Arcade85/Shell/GameCatalog.swift | 63 + Arcade85/Shell/GameHostView.swift | 47 + Arcade85/Shell/Haptics.swift | 15 + Arcade85/Shell/HighScoreStore.swift | 43 + Arcade85/Shell/RootView.swift | 200 +++ Arcade85/Shell/Theme.swift | 35 + README.md | 416 +++++ 33 files changed, 11568 insertions(+) create mode 100644 .gitignore create mode 100644 AGENTS.md create mode 100644 Arcade85.xcodeproj/project.pbxproj create mode 100644 Arcade85.xcodeproj/xcshareddata/xcschemes/Arcade85.xcscheme create mode 100644 Arcade85/Arcade85App.swift create mode 100644 Arcade85/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 Arcade85/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png create mode 100644 Arcade85/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Arcade85/Assets.xcassets/Contents.json create mode 100644 Arcade85/Games/ComingSoonScene.swift create mode 100644 Arcade85/Games/DopeWars/DopeWarsScene.swift create mode 100644 Arcade85/Games/DopeWars/DopeWarsSim.swift create mode 100644 Arcade85/Games/Galaxian/GalaxianData.swift create mode 100644 Arcade85/Games/Galaxian/GalaxianScene.swift create mode 100644 Arcade85/Games/Galaxian/GalaxianSim.swift create mode 100644 Arcade85/Games/Lander/LanderScene.swift create mode 100644 Arcade85/Games/Lander/LanderSim.swift create mode 100644 Arcade85/Games/Phoenix/PhoenixData.swift create mode 100644 Arcade85/Games/Phoenix/PhoenixScene.swift create mode 100644 Arcade85/Games/Phoenix/PhoenixSim.swift create mode 100644 Arcade85/Games/SceneArt.swift create mode 100644 Arcade85/Games/ZMercury/MercuryData.swift create mode 100644 Arcade85/Games/ZMercury/MercuryScene.swift create mode 100644 Arcade85/Games/ZMercury/MercurySim.swift create mode 100644 Arcade85/Games/ZTetris/TetrisScene.swift create mode 100644 Arcade85/Games/ZTetris/TetrisSim.swift create mode 100644 Arcade85/Shell/GameCatalog.swift create mode 100644 Arcade85/Shell/GameHostView.swift create mode 100644 Arcade85/Shell/Haptics.swift create mode 100644 Arcade85/Shell/HighScoreStore.swift create mode 100644 Arcade85/Shell/RootView.swift create mode 100644 Arcade85/Shell/Theme.swift create mode 100644 README.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d47ece7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,22 @@ +# Xcode / build +build/ +DerivedData/ +*.xcuserstate +xcuserdata/ +*.moved-aside +*.hmap +*.ipa +*.dSYM.zip +*.dSYM + +# macOS +.DS_Store + +# Swift Package Manager +.build/ +.swiftpm/ + +# Secrets / signing — never commit +*.p8 +*.env +.env diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..a9b095d --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,149 @@ +# Arcade85 + +A 5-in-1 iOS collection of faithful **HD remakes** of five classic TI-85 calculator +games. Native **SwiftUI + SpriteKit**, one shared shell, each game a +`Scene` (SpriteKit) + `Sim` (pure Swift engine) pair. + +This file is the operational runbook for an agent building/deploying Arcade85 on the +Mac Studio **without the human in the loop**. Read it top to bottom before touching +signing, git, or the build. It follows the same pattern as `~/dev/KyleCode/AGENTS.md` +(same Gitea, same `~/dev/.env` token, same signing identity). + +--- + +## 1. Repo layout + +``` +Arcade85/ + Arcade85.xcodeproj/ # hand-maintained (NOT xcodegen) — edit via Xcode/pbxproj + Arcade85/ + Arcade85App.swift # @main + Shell/ # app chrome: RootView, GameHostView, GameCatalog, + # Theme, Haptics, HighScoreStore + Games/ + SceneArt.swift # shared procedural texture/sprite helpers + DopeWars/ DopeWarsScene.swift + DopeWarsSim.swift + Lander/ LanderScene.swift + LanderSim.swift + Phoenix/ PhoenixScene.swift + PhoenixSim.swift + PhoenixData.swift + ZTetris/ TetrisScene.swift + TetrisSim.swift + ZMercury/ MercuryScene.swift + MercurySim.swift + MercuryData.swift + Galaxian/ (ported, dormant — see GameCatalog note) + ComingSoonScene.swift + README.md +``` + +**Convention:** every game is a `*Scene.swift` (SpriteKit, all UI/input) paired with a +`*Sim.swift` (pure Swift state machine — no UIKit/SpriteKit imports). The Sim is the +engine and is where mechanics live; the Scene only renders and routes touches. Keep +them separate. Dope Wars' `DopeWarsSim` is the reference for a well-factored Sim +(seeded RNG, a separate `extRng` stream for non-classic extensions, `#if DEBUG` debug +hooks, a `messages: [String]` queue the Scene drains one-per-tap). + +The original TI-85 sources this was remade from live in sibling folders under +`~/dev/TI/` (`lander/`, `zetris/`, `phx4.0ti85/`, `zmercury-ti85/`, `galaxian-ti85/`). +They are **not** part of this repo. + +## 2. Signing + +- **Team:** `TG8X9PP8VT` (Kyle Albanese). **Identity:** "Apple Development: Kyle + Albanese (5SRT78F8BG)". **Bundle ID:** `com.albanese.arcade85`. +- **Automatic signing** (`CODE_SIGN_STYLE = Automatic`), `GENERATE_INFOPLIST_FILE = YES` + (no Info.plist file exists — don't add one). +- The current pbxproj does **not** pin `DEVELOPMENT_TEAM`; the identity in the login + keychain is used. If a device build ever fails to sign, set + `DEVELOPMENT_TEAM = TG8X9PP8VT` on the target (don't switch to manual profiles). + +### Environment prerequisites (why this works) + +Commands run as the user's **own launchd job in `gui/501` (Aqua session)**, so the +login keychain is readable by `xcodebuild`/`codesign`. Verify before a device build +(do NOT change anything if it fails — stop and tell the user): + +```bash +launchctl managername # must print: Aqua +security find-identity -v -p codesigning /Users/fung/Library/Keychains/login.keychain-db +# must list: "Apple Development: Kyle Albanese (5SRT78F8BG)" +``` + +**Hard rules:** never revoke/recreate the Apple Development cert, don't touch keychain +settings, keep automatic signing, never commit `*.p8` or `*.env` secrets. + +## 3. Build + +Run from `/Users/fung/dev/TI/Arcade85`. + +### Simulator (no signing — default for quick checks) +```bash +xcodebuild -project Arcade85.xcodeproj -scheme Arcade85 \ + -destination 'generic/platform=iOS Simulator' -configuration Debug \ + -derivedDataPath build/dd build CODE_SIGNING_ALLOWED=NO +``` +Success: `** BUILD SUCCEEDED **`. (Verified 2026-09-16.) + +### Device (real iPhone, auto-signed) +```bash +xcodebuild -project Arcade85.xcodeproj -scheme Arcade85 \ + -destination 'generic/platform=iOS' -derivedDataPath build/dd \ + -allowProvisioningUpdates build +``` +Install/launch a paired device (list with `xcrun devicectl list devices`): +```bash +APP=build/dd/Build/Products/Debug-iphoneos/Arcade85.app +xcrun devicectl device install app --device "$APP" +xcrun devicectl device process launch --device com.albanese.arcade85 +``` + +**There are no automated tests in this project.** A passing build is the check. For +gameplay, run in the simulator and play, or use the Dope Wars debug env vars below. + +### Dope Wars debug env vars (DEBUG builds only) +`DopeWarsScene.didMove(to:)` reads `ProcessInfo` env vars for screenshot/demo poses: +`ARCADE_AUTOPLAY=1` (auto-start a run), `ARCADE_DEMO=1` (deterministic day-12 demo), +`ARCADE_DEMO_VIEW=buy|chase|tier3|over|ride|keypad|sharkchase|endless`. The +`DopeWarsSim` also exposes `debug*` mutators (wallet, debt, price, tier, held, forced +RNG rolls) gated behind `#if DEBUG`. + +## 4. Git & Gitea + +Remote: Gitea `https://git.kwalb.com/kyle/Arcade85` (branch `main`). No git +credentials in the keychain — use the API token from `~/dev/.env` inline, and let the +credential prompt fail to store (harmless). **The repo is created on first push:** + +```bash +TOKEN=$(sed -n 's/^GITEA_API=//p' ~/dev/.env) +curl -s -X POST -H "Authorization: token $TOKEN" -H "Content-Type: application/json" \ + -d '{"name":"Arcade85","private":false,"default_branch":"main"}' \ + https://git.kwalb.com/api/v1/user/repos +# then: +git push "https://kyle:$TOKEN@git.kwalb.com/kyle/Arcade85.git" main +``` + +API: `curl -H "Authorization: token $TOKEN" https://git.kwalb.com/api/v1/repos/kyle/Arcade85/…` + +**Only commit/push when asked.** Stage only intended files. Never stage `*.p8` or +`*.env`. + +### `.env` — do not `source` it +`~/dev/.env` holds `GITEA_URL`, `GITEA_API` (token), `GITEA_USERNAME`, `GITEA_EMAIL` +plus other service keys. **Do not `source` it** — a later line is a bare +`https://claude.ai/magic-link…` URL (not `key=value`) which breaks `source` in zsh. +Read values with sed: +```bash +TOKEN=$(sed -n 's/^GITEA_API=//p' ~/dev/.env) +``` + +## 5. `.gitignore` (already in place — don't remove) +`build/`, `DerivedData/`, `*.xcuserstate`, `xcuserdata/`, `*.moved-aside`, `*.hmap`, +`*.ipa`, `*.dSYM.zip`, `*.dSYM`, `.DS_Store`, `.build/`, `.swiftpm/`. + +Add `*.p8` and `*.env` to this ignore list if/when they could appear here (none do +today, but the rule is: never commit signing keys or secret files). + +## 6. Adding a game + +1. Create `Games//Scene.swift` + `Sim.swift` (mirror Dope Wars). +2. Add both files to the Xcode target in `Arcade85.xcodeproj/project.pbxproj` + (hand-maintained — there is **no** `project.yml`/xcodegen step; edit the pbxproj or + use Xcode's "Add Files to Arcade85"). +3. Register the slot in `Shell/GameCatalog.swift`. +4. Build (simulator) to verify. diff --git a/Arcade85.xcodeproj/project.pbxproj b/Arcade85.xcodeproj/project.pbxproj new file mode 100644 index 0000000..c825734 --- /dev/null +++ b/Arcade85.xcodeproj/project.pbxproj @@ -0,0 +1,321 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 77; + objects = { + +/* Begin PBXFileReference section */ + A00000000000000000000005 /* Arcade85.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Arcade85.app; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFileSystemSynchronizedRootGroup section */ + A0000000000000000000000F /* Arcade85 */ = {isa = PBXFileSystemSynchronizedRootGroup; path = Arcade85; sourceTree = ""; }; +/* End PBXFileSystemSynchronizedRootGroup section */ + +/* Begin PBXFrameworksBuildPhase section */ + A00000000000000000000007 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + A00000000000000000000002 = { + isa = PBXGroup; + children = ( + A0000000000000000000000F /* Arcade85 */, + A00000000000000000000003 /* Products */, + ); + sourceTree = ""; + }; + A00000000000000000000003 /* Products */ = { + isa = PBXGroup; + children = ( + A00000000000000000000005 /* Arcade85.app */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + A00000000000000000000004 /* Arcade85 */ = { + isa = PBXNativeTarget; + buildConfigurationList = A0000000000000000000000A /* Build configuration list for PBXNativeTarget "Arcade85" */; + buildPhases = ( + A00000000000000000000006 /* Sources */, + A00000000000000000000007 /* Frameworks */, + A00000000000000000000008 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + A0000000000000000000000F /* Arcade85 */, + ); + name = Arcade85; + productName = Arcade85; + productReference = A00000000000000000000005 /* Arcade85.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + A00000000000000000000001 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 2660; + LastUpgradeCheck = 2660; + TargetAttributes = { + A00000000000000000000004 = { + CreatedOnToolsVersion = 26.6; + }; + }; + }; + buildConfigurationList = A00000000000000000000009 /* Build configuration list for PBXProject "Arcade85" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = A00000000000000000000002; + minimizedProjectReferenceProxies = 1; + preferredProjectObjectVersion = 77; + productRefGroup = A00000000000000000000003 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + A00000000000000000000004 /* Arcade85 */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + A00000000000000000000008 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + A00000000000000000000006 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + A0000000000000000000000B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + A0000000000000000000000C /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + A0000000000000000000000D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_CFBundleDisplayName = "Arcade 85"; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UIRequiresFullScreen = YES; + INFOPLIST_KEY_UIStatusBarHidden = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = UIInterfaceOrientationPortrait; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.albanese.arcade85; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + A0000000000000000000000E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_CFBundleDisplayName = "Arcade 85"; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UIRequiresFullScreen = YES; + INFOPLIST_KEY_UIStatusBarHidden = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = UIInterfaceOrientationPortrait; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.albanese.arcade85; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + A00000000000000000000009 /* Build configuration list for PBXProject "Arcade85" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A0000000000000000000000B /* Debug */, + A0000000000000000000000C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A0000000000000000000000A /* Build configuration list for PBXNativeTarget "Arcade85" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A0000000000000000000000D /* Debug */, + A0000000000000000000000E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = A00000000000000000000001 /* Project object */; +} diff --git a/Arcade85.xcodeproj/xcshareddata/xcschemes/Arcade85.xcscheme b/Arcade85.xcodeproj/xcshareddata/xcschemes/Arcade85.xcscheme new file mode 100644 index 0000000..03936d9 --- /dev/null +++ b/Arcade85.xcodeproj/xcshareddata/xcschemes/Arcade85.xcscheme @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Arcade85/Arcade85App.swift b/Arcade85/Arcade85App.swift new file mode 100644 index 0000000..85dd9e9 --- /dev/null +++ b/Arcade85/Arcade85App.swift @@ -0,0 +1,12 @@ +import SwiftUI + +@main +struct Arcade85App: App { + var body: some Scene { + WindowGroup { + RootView() + .preferredColorScheme(.dark) + .statusBarHidden(true) + } + } +} diff --git a/Arcade85/Assets.xcassets/AccentColor.colorset/Contents.json b/Arcade85/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..1fb8f22 --- /dev/null +++ b/Arcade85/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.706", + "green" : "0.937", + "red" : "0.361" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Arcade85/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png b/Arcade85/Assets.xcassets/AppIcon.appiconset/AppIcon-1024.png new file mode 100644 index 0000000000000000000000000000000000000000..51fc702c249305cc2ddc1dad7dbcebad8ec9d40c GIT binary patch literal 726107 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 EXs6+pz{tH|f zK!3oZ3h4`*=l#{s!IF)uJ5W|Nx=3OXd_t5Ymc3JG3hGj{E58RG*S#?-dXPXwbO@uA z-qgN7j zhK0_f@&k$Y{RNG6&j+U;Ege1{B$aXRy&I0~U49o(W=sq1C`0|e?9PS(AUg7^nq5rWju4SoR-NQI@J;NT;8$>^uHb1x z3==osNI{{L;KRt+yEZzv&F%&m!to z6e<>6nEE$UYFtroDCK1i$U0EO&^!o7c6w?R>S|rtc%02ImEpdy^`K8BlSO1|()4dYM|rI#|M zU@voD90tHDy&uF?7svlpMP8DCY8@SAVYEl}zhNyn#y{9Bve{ae`Rsz`{(ULj?aGlw z(dmL@VjtNjGBY)8hXd>|WP!7J2!OR5p1?M=Le3KkakK`@q>xPzEOr~fIiBJWyq&y) z?;*LL`SA=-T0V~?vFHr=>A{n1H6A~MD$lRa-kTxoVAJ8F)eKr+9@waINItiL+VOu+ zsF3#rm&vU6r~Im`;774bBHrqlA*%y&YOPs{q8`PO-jueqyvC2p<|=6XS9IGvOQ9ke z@F^plAT6s_-HVTFyPJn(+fjb>_=*N@wfoUm1t;zM?lZ$l_iD~D%hAnIqUGLim=Sg+ zY0h-=z9k=Gc~VWZs>%Mh>e7`Y==UgAejb{z_hseOZD(jF(*k*Hi66VVgAV9up*)HW zIeR#han=vVzwL|bLR!}>=qkITCp2CwSgWE&p^TBb2OUl!!#li?_mwXFdWhr0>>xQ% z^~8BZy%8_-1q^PPf9hBbeO&LCK3gs^@pydkx{_c6gIja9JbT?sIix(&>33@?x-S9r zNQGaXA^ytJEF>5E`kABN({)&T(dog_nO9_w+Cvs5-)f1oWz3JOvfaeI9G{sKl2{^K ztEG-G`BgTHV6H6+5VJZ6_80jK48PkZF_t*UgnFm0`Umgx>huitRtYkJD3WZg+H1aV zRf{4V9|*4YM~ausgy8W5(3khV*)KC@i2ip$7eg|bjkL*6@%Z`JE+X3<{xj@lP~6pB z1_-5$-FE>A6yDOp;&+82;1Gi_^i(1+&}J3{BmH__v=)XqPfKC^F$hB5BNf9PS=vaA zK2Wl~Ch#zy?*(lfL2kJJ?&YSOODhPo2p0JV0l}EAqMFC$hqj-=PEwOnI2y6)9QTk( zmT8T3V?tsmmbA!WPILG2K;9;4YQbrM#Q#lgIjs&=&TKc-qD!L-whF8nZ?z$x=WnF_ zjC2G&>yFNjL!4jgQm=z#aB&S zbpf7(?PHeKiZPulbJ$Isw#9M(_;#HCC(TORbETs5J8`rZQ2s!4x;@IA!D}@8HL2h)uGB`X*L|| z=7%yH(LZ5=IUb#yrPSB6mvJyzuP;2YLEg;a3f?=y`ZhYf;Fbl7h(k+)Kkw~B8 zQq7dFo#)uzWmgwusQchJ?%Sjtg1+42M5wgX*L9R-S)F8i-7;KU!cuK&zsMf%qnHCr z!{yu32Z_j(LiCF0ebB#g>#PF?(MuV>sxuXedd)zq<&o1%HZcE2`3;iDHiMvwE@935 z;~C7f`tm{7b$j@IRM$3@$`>QF+nhQ+AiQ1DOO5)qL@r?JHsUsW7HK7Zxp9viCJF8AI+U*=)cDrQgBKX zQO#sJxR1%PnutmfgN*3qNSQ&On2nSs>*bm{IOlGxS>fvo3W*;gg-Jvga66@K?;CVw zGjJOID4;-`F7|O@S|Es^!X%0C!N3`FwGz5R(Z%a({$vG{kgNu4P3q~uvVTHir7$IK zImvrL=a0X5U7dEWy*m{NVqqilV9R=0zLZ^DW^T4$N_Hf4jd3WO`PoQu#LX-j7!cq) zg}HIZJZ0@yb=i%rBd$eWR!{P{R|8gC1HDx^yQYgdZ}jk@^u*@cn-6!o2S3LB865Pg z!1%i;D*2m6xdeGdgU>AQv%8YFD5CYfMnr%0XOYb9)r7oyRiR^GWnfXjLehE$;C+y> z^d-xofZh+Je>r>>bsd;zefiK|-{X6vB@cRj20@ESt{%L`@Sx23o+?#wo*sF=`bW+o zHwJr_v=dlwqdTs$t5Uv-g}u}Pg4F>)&~c_vxumV;MDoHt5!rc28u`V=4Tc7h1F>1vCIK}>@%JI%HUD; z4S#zAzw>(4b<8|rk@{Y@HM1-oI+BBWIfI~is0R!64r31D3;G<+d%F}VhJDkw6Flf2 z_QU$PnL(u3Pyd3JcXXUbJWhsvv)*zjHf=%l=+05@G2)6)=jt1+p|@1gZ{Nf*$3Rx@ zRhx?5T2nh2$eI5pa0wlYFeWetZAeOKY@vU8VP8F$6N+I3%}b1XbS!~Y^ntXWl^hyZ zfYN0&t&NF)1Bc6TD%Hic%Rxc@zbyVNL{H-k;G5*?3xL=&Jec zNeaz8Sxps$Dc{mgMQeHNb50izu}IMPpn%Wr>VD~$-SilmetyW>turegdAF#q8rvnv z;s8F$mL6=A%4hhVt%H8|{Zft;$W1QfdDfd9h!Gl}rWM&)qoNNLp>p`mDtY`XHt{)b zoAec!ooug_RM^zjmhR$v>N1wR%Z`bGS8UfeBbXoX9^o1A!$kB0ZZD15Rv=c)vBFRA z&J6FQzf*pgJ286niurMg2G^D70FB%VDgHL`B;Q7hpnHDM zCAzb9EngyJiEU*!zk?2bRJ3Yw_!S!Lh*?kbdtB&muA~h>0@daUZX_XBi+x8m^wWji za7MY^`Oqz>QAo;>^UAC*88pb>5H*Vh+F;Ik@hB5qnTYC=|6r9Xv8#GO=FJT=o*Icm z6lKF8jwMoNc?6>=-DH6Z+DXLapTzI+;&zC(nyfJ)p40LtZWVsOLxM))n1xnvjtxJ` zmMw4EbW@|%gSd8ztIV5bjsP4^Si<9`=J1#|4?x10a~#0X_mF+^e8z6M$hhoq^)KV) zww`Kd?)>4^Au}1_h$K?WwO@1Ad|iD!QB;8biU~*+9l!EvI`SA2xoMh2_K85#~=?(d`NTpR>QHA1TgzYW!-E(|3 z-ZgedV?cQC_4tE5hO%>ucg4LCtj(5tvqJvo1@y-o7`O1vP z7*mJ?M~UADdi9}Qnk-dY9QmY>x-K|~<;|ADc;ETm^;h%&btfC8ys5|g@8>pe?2IxGiAit9xnnhu8y%su#elv&TcjNYL#3%7k?%|X)*3}(`n zxF@A9yZT>Y5CguYIjMh$dE-1V5+B-0OK>wYFU;DGJ-gK$NRa8mYK80D0<~~gCZx!z7=KpoUnuaV zH>Lwx18VT>f7q*8!_aEcI7)G!JCBD8_D144ON)ZZyQ~s4DhR*kZe7m6cgz!?DBf&m znQkf*z4Lu58-4tzt=Z zVu=H=hU9G&VBoFkUT#m8!)CLsh6qPCn8A?GDH7A)`Tb} zy|GenZzFMOsY!{ZKCvChp$m!{fBj*CY;R4kc6mu2Vb1@(G;0^I+M6av2aq3cMfrKe z**)03JN9<*&juCaBe;OOO(3?lX@)O;X1!@X+sv_hlBp@5QW31s$35eDJ{Z~(yDB17 zQ8|~xy0$38B>N5HEeYSv{98ZgH`UdG&oqhS8iZzy6bbXQvGL`>KX&?ygU$X;oz2oa z$3S4+w~3%FT^}T2I#5|uo~tRo#bYJMQ#4$K=k-rAH|?G&{{-ghx^DaiqiVW8mgoxr zb^te}3&DXfBp^&Ve%d7rDnKv;ci8Z#`fsot7(;%>7kYegcF56paI>3FVMLZrk0RTh+jkFMe)wn3T`G zO#%OCg3g9638=~SaGMeQdQ^xKmq{cbYj+6Fa%IcmG8rSoGCIi05W?iIDSOG3Fx{fI zfn*b3wVPKjy(h}M?D_LgS$i7QpytE_+yYeZXI>Cwt@k2V&G}c|dcr6F|2@g7hOXjG zZcGT|x;)$YSO3;0(!bmzT!Ubs*}sV4@daV6j!2-X`0kvM!%u2mNT3PJ>TWLpC|W?IUr+mVE~N*u_f7k*BF2$?;(-i-YYbv2`wn z!+%BD!tdGMf`lxeW)oX1|9CQaZ!rl84$; z39%hyeAeL+D)i(04_MznWSc{0W8>T8)26rXm&=7qgN5^GD{IeY|F=uSl6gWV0gn>B zU$4iRaP-r8HV550jTv^>Ik!`t0^v2gmS-uQx6E2q9?Ys0pEC3wCAeTTNRkc7B^ov3 z4|l&J2_Nz}A!X-Sl*GL7t~9SnRl}8sRJJeQ7}_E~gTacd>^}4nA?|{XU=R#$6}(w= zYbBVZMYnoOPxzcabJF;`|8fV7_`>jv5>vC%dS{U2oVc*%71e7SBl{Blkc|akDtgjf z^S=pLylW+hZ=pNUDM{1V|MKvBRQ@}Hz%K3fUMTmSa`n~vul1+n7o_XjoK;By4a`bk z#ppmT+Vw2c|7@p=1o!XqDcjj+_)tYdo4~Jt9UAT0`z>?m7y#It%Onb^@n8az#tbg& zj&;|!?4RwS)#HWait`X81Y<7yoiW{M>^=RfNX9z7VZ17DOAYmqPt2A*pMwu~C>8h7 zLVXk8Yeb?V=2OUCgORJcU8Fat|9#KyP`EXa(8e`xjT)`eRfO3qQm3_WeVY6-B!^`# zz_~DK2t$26tkqftqH?ueOwzs7-e8!2Fe6CCxP#VxkQ(OuF1Z{DOmag<(}gOfnjxwvhRMYS1KD)Rp zV(6YO14N}u({VcAoa?4Kz4*-NV#B$ zAvgV1!K%$W!S6}Ec6HrOl9l@?H5$L(=wSvr z%z3Ky;?GVpDVs0xT_*0;!tur(uJ9VKZPZLP|2?83yoh;_=j48Gd@RoJ&v0hhC0bdG z5q#KK zi^`oL=+*bcI?JD#N!8b@MK3P&&xVVb7wsYDaxv1&dSni4ya|<%boXfBP(^?#@#?HhBI8+eU&|V}K8; zA$7^)s*aN0ufj7ASeQ98peg}jiF~)@hkA#jNPGg88^uzeT^8MY0DO?6YhoNx%Q+F1 z(kqt-3z2KPB-A3$Y5v8jn7!Lv%YY^sq>h!MCwI(jV@e9ccrxZ4f0rk#d)0$ZrK{h# z7}?XM?Oe=vTi@Y|I<7x9G%VD$uLgCz%C+JqHO-yZOVCh8Q-~AFM8waZl+4#XYjh)v zV9gJGprAqHI!{xdt(=#o_d&U)HB&G1S~}Erl!ivP!gsut2aei?(*_;$Jl|&V9tF`% z6g6B)qXc~^^#~1;?Stkl`PL3+Wh->YAC0qVNB`m&AZ44m!Dwo5 zKQ(D}TbKA}Ch2&44WCkAR6Do}}PT zK~v25xI}!&84pgaW5NSfEPnI%!%J`NM3n!?(;QEbwNhavQ;1EbMadYznn& zgkDf-)LmRtBsdFW2Z66PEUkOSh-;~R7J`!K=j;n_KYp~2V?rS(Y%vg&AGVMb9o;&0EPfH!atKBz zSkM!I&stuX@2wcL1akYFSDXLolt5El9^ND$6L;LS;Wc5BAXAWu`+AL~1TLWEXxLk1 zPjxuhHf@zBVGeG#-}0eqc9>hLi4Be3&InSR5 zAHoZ=$n>pqHD#A&NnKvZDK8IBph@!bPxK@$ZgNC^uVDA*&gRG1g_%sKuqVF0!CoX%IQHL57;kyQbN=h?#@!393{UL@UY5xa($2chfgyz zMf?b!hKS4Ar}+r%j3T1@Z<;%cZm|kDxVBzSy}33DPPX=>IQ>`{%dgbjFO>wK|@D^w;-V9L0gbc$B{Jv)L0xqhg83Z`f?%CT?14t7q*m|)-Y zeD7*`a>R(oWU|0nn^QQ2xGOceHnO3OSd5+XKL4D(-sVv7q<0)vT?CmQKkos`9|#07 z-7lAr__;`*UNvl7immfs`Sa1>By(CIL*Az3-XeubHSG7x2S3_;Uje73HLxv)E@Q;T zXxb0?cA2l!$lM|~b@gs{4Esu0SfVVDmY9f!c5V{9<3}Evt zrRt(_=y?2o-v#(5CW?Xns?4+MTkSod@cTLqQ{mhlXWB`Ua!6@P%~W49eVB=+eq`%4 z&m>h+PIMdcsNuN>0r9-fS!U!!$EDX|Z55{B>=9X~+Z)Lq^6Qu^bc@jhxygD{t}{U? zW`;407N3}z^&KAU&E5A5i6F&KKW)lt?S-bJn5Y78{)Y28mW|eYVU=h%p?Up?kuMiB zNIY2bnSY)!MRlOU(`W4~mB7~YPcSK!~4w5_*BRq*qPVc8Mi z$~okPMG^C<{xP}7{~p9t|G`2pWgx{P3Pu-a{@P%YY}4sN%B>*7U8)-b^Ccl3fZSmt zt^!VzyEaWsy_;~)M&vyS!lIrl`eNfNpcWSeGWYur-@|vWmJcl1tVjy-$1HI39|vv} ztgnDPKRV}bxo?|(*tF&QxcvEX^wTg{Keg-0aEPr7 zc&LS~7)_b?$yE74wHZ?Ge2md|Rd(0Z7er%iwm+J<%hv=Z_j=u|n1gP|>hCU@EO4U+ zZ+VLvqW_(~ZVx5rls-uQ!t=E^^A)}`d*bw+)!ZfEcWZZ@p`-VQAKni3?%2NXrP|c9 z`tRw(uk)MHWUQCtz6Sz!vQ=Vm-)OSXyBcSA1Zf9VZx;-&>?e665n)9ZgP|-J%XT4d z=w=Z2A{4D1JTH+JhyUMAlTy&ZCHDzKj^oB&jywVrovC!uNon~XUW{13NdM9DPI07~ zn=teo_`uE6V~0p7T~lm0>n3yzt(+p}E0(YwCvvp{7$W8}wf=dc_7EyLBYmXC*!Nv% ziG{@qIh0|lwOfP1xvWdiYqumijfr66RhDRS5fmWU`Ag`(1&2hf zIPII-J?8BXMph?+B%S4kSG!*c?z(eL>6F(Y8dAc18xkcfJ>bt3kd|sy9d<8{KY|24 zsdOaUQ5!KtpgE|zWY&K(f7~lggtaX)tzkP6!;f9O-&nE{kJ$yj{Gi(R2kwtYZJ2oU zdBJ1E2!lsOOzwd)A>m-kc{DjY7wTDK7eO4obJA+y`aGF0K)v1Hi>i1+Y@$8SJ|%|R z*Ol*Pd1t!cC8~&<60Pm>m34v{qw#kLPpzId4j~XT#rj1O|yLECtH1YeCwxdI`!xIj3$o!-j=f_;FNfE zDsVD~UQlU*=HnKrfv7FBj?k;?We*7)E4&gnce~?1zO{%bz{2+rVJ%i@%3(|TV74k$ z+T6RC0sa+IAA^GqcIqn_QEc0XC0G3`;v_Nck@iXc%-~UYHOLwN37$Cira0jG&Zv>g zpW-+^=#5V|EAqHh=SNFRVeJkP$vqUX=IiNSB)7Cwv!1q>E8EJ?a>gr1?2QXcpRt2E zhNo)HW=idkPF`hKlQy9FK=<@V-SN4fHmOxCT{WT{=TS89*#%GMJ0t5Lca!si|Mqgm zs^M_tyE$mf+^DsB;|sbzS;Ib~&2TRw3T6eK(ifC0{Fzb7hmTe2%036~(;c10AjV6Dx(y6ZL&z56Q z=Fb4(8IM0TyQW0eH-N(TGK?mzUfnPE@fyXer24&JN1?H9+Mak>w{?u5E1uBKD`u9s zn|g_=TV2Hjmxm`CkXdJnx!{ce>Dn~u|HlFt0$mb~O?0w};TCBBwNM^b;mV6B`6YbA zc5VpqVZkAuMrt||6V^eSYwVta8TXn{_>D)gP2$#V%K(~p6!Cbc%61RW6|2WUs zMj?2xMpBJ%TkDNu*fNgR!;+<_u~*7D0Q`(Q;(p5v{7^Dl0W|-;kh@??Kz4i%YL2YO zcKTzJfQ&XHvk<6q6KFm1ESJM+F_+$UvkGsxVYNd?7KR&a@?6v)`K<$)&-C2_&M#NC zYd86+ad-MzfB&WKR|vWpx#U#2IpryEfPOuVS_^PBPdfjNxmq|p-sTzJrU)9ifMi`Q zSXRsN?@y1g!VOS|eJ%b9)1*}c*GsbhVLvnAa%n#R zkL=lw;s8`y=V_`=>GvQu*6i&o5kOo_q2yfzK6QDEf3DoQYHj{4x4^wUs)H?U!Fhws zH?H_I$A7j@t83^R94|qwr6?^aNQSqRSh7ZHa2ZaM!$yrUOW)0==TVdm z31$g_l>B|iziL%@^?Y7B_?k$pW>M78t{}yP`XW9XBWY}Kjjl}$-X>ap(tbOuJ7M`? zCAco12?d#Y{rlEH*L{Gz|BkufmwU2$$#&g6ryg%s3No~JeJk#%oJTSv5okQBU3M3- zda5J4`7v?3KC`KRt(ysikilj9_x8a4qb|5Jg?^jOiDo_g3gJywLI|GsQc||p$AoUY zaqnQCvqZv4(CS6@KDMD}pSc=RK&sy`l10S~poVqnoYUViw7+0#Qsa-SNV7T)Zt+AqvhzOoLXJZc^AhVfXvN^pM%^t z_UDZIWMDH@iA3GJ3oK>e`q@Ex2FF8|I;B2Do8gfAl)$(B@~#bFG1<?hpDO)I{H;_md0$loP$lU+1=Fxu;8Eq! zTTGHFLDFe>#Rw~wem#vAfY}Zq=?YO%M})xr$Qf z(+1s1*HxC8+9~sG0O@bLz0SZg2{ayu334X9YeU>qdma2#;$oK#v}5Afo#w_mrKoZx z8a&T9Fne~!u^VQs0dWHhM8!sLZmwhGNEOvTN|r%oIF+ngrQ)w~o}E*#sP(?%$oMca z+ecLrIU@Q2ON4o`iCjp77EKVOrD4a3DCWgCae>(SSOc(b->gM&~hRQL~M``S|9-|i=Hm~pOt$zMi{i#{&BlnUZ z1@dQE&BhD}qcTAZJCvLof+n9(IK&#;9QW)Hf`&cRJjS`lj|I^4 zxrQh*VWkp*Q1l6bha4vx_8zLDw%_v=MYfISje`++rn-}7jBUGK8u1U4sPK@ZtsiIV}@ zT6-iqP1#qOBydzlkk9dF9Y0Bs4x)p&ha{mi-&pvt($#Lpa$aM0PhZYfdy! za++yhP9=oLb;mn#*rL*kYdB_d`qI=FC(68N?8(fccld@lvRo)(Yl7LoRf{c~3JIg8 zPli4k-hJ+NVZYaIHPHr31y7+luL>}>0)7GyTPM=b4PX3xPAo#7Te=@#3)y>UtI^u* zxoN0$=fUZCQmY00={{jg^bYr`>9;{A2#({atr@9B9Egwes~ksttZi_9mqZQgEC!P) zrU^IbG_L-gS6C>~gC@y607NG6#SaMzGdw;Iy6qadZYr5mp zg6GlzXvf)gZGz$Nv3T{vjSex{h2J39FLP?H=!IHj8;8Nl4w(ZC5pQTow?wY~HUBJ6 z^IME49c|)@XYX=S#uY>s}Sn}tNae80(ra`KlR{#<4OTa+9hTF$me6}9>`8lS{q4_!0qy5Ds1RFdv_gI zCPont=6gtGc4AZ2Ct($z`*P2jISNiw8d>o`YC#0}Qm2 zy&hx*HJY{5D~l^C+5t~Kh1s|^kf>fpMg!!PqS@zHFxd60ukyobwFAUsj#fj}Z5+-K zwxdDXVfs8G!KXAZXy?XjvyQ6pYh=XPNq)l=%4#l7FUr9AA0na2)msHMI7Ru!8!(qk zR+yDdSW)ES?WTO{*SHxDP8|gvIMG?Zu*lSJF26ENM5S?3S2FNvc68n>LqDhdkYHE; z1F#fEuQ0S8nT^s0__h}p$z<+Sw)-AoOI7&Afisj(V!sM6Q9|)~HQCOhx>#0=vk{>Z zpzI2@NGkSm&kMKB&OC!@pO{Qk{0hFAQGun;qE}QhGPVjcegB~gtt5j>Lb!uWBjq57 z{=J|9Wi=N-1ez4SkKe|y|C)2r{Au{&m4?k(F>L;@`%Go3dPLMe`u*P^bdVeJD9Yy* zp^2=rW3x1}9z3wlS{gCgF;u1|A{_mJqTwmn@{I^`05WigrJ+uctbklywxUTJ+Tt^1 z5-EC*vB1eE?*0VN8$Vg* ze2cu`sD(LrjLt#BRTb~gV{IUuj-PTo?Mt4vO^TZInIjGxaOWY~-``*srp1?+#tO|g z+s^{_rPI=06|7Vo$oql$+U{|DAUkH~G9QTf>0n!BPB-Xb9BJ!(yrsl>@vNnrpK-cr>Ht(LuKMhs5?@HYh8X7I9^ad(n!GbgBn%OMv;!zTWS&qq%Y| z_tQ6_+-8?P>9FX(kRMSPZ$Jw;D6ZB={p~`nkt)oAAp!C##47w=JCS_`Nj)}l{Dm55 z@ceioI+$V6UFd_%oNnF>_^#xls!l2a{b@m^9C%*kQO>~^*{Ns=!cW-0T!^SFB=89B?tf}GQGoL$6pD%{gp`u!tC)%+D^fT!;p3Us-gB~6L`Ly#Z^S!D?foh$;I zsObETLI-xi)U7uiZKnvE=yfO1bcs{noof=6(Sz|xE>?h?_HzHL(lS>PMMjsvt0AT? zM9-LWzyx=`e(OB5BY`qL_apjFi5 zILk9ENbJP(P2LfKDb`M6Y$)zn2s}-l)I3kCT9N3I52xf*Py3gxD-in_QAyu88zby?PR|3`fJ!Q9p=h z1jyD!4OD+eFZ|F2j;x_Rz37Nof1kF)`ME9cQb_2N6k8j1olHKj3KAJm9##c-x`n83 zX(w2DcVo{_hL4ZqZ6YlE#ySTB2;&_Wkv*y+nU?HnY9r-5^Yl&Dnhc+h;YF z6-HllK~7T!zsDW?P zyeVGXZP9ii@*vVNdL89B0ZrmT`G2$W*lPT&{A~S)$2z^ZmFAIt>`rrlUG|%32OguU zY}S^!WDIkut6MrlEJ{-gzYr3^Bh|N#aVw+yM{ah}3-&M2Qq1sQE2KX5(_C%B9kajL}3yJ%fnXz3c~MU|LmL-yAQ<7#NJxc-^HqPTv~ ze9JcL34Z)>rHx^MtGu$+CUO|Nmn#yW>Cohf;Fs{RI9U>``BEO*tMcigLB0LBT55a; zm!QMmn;+he>x5z~qs7Uj`tlp*J8!PQ$riO<1hl({$i364ymB*G&Y2>P*uC=hH|&m>?S%9%)FbGas7)o#b9r(eGLa zBw|7b&(d&{_OJjeQ}wsbgwx=`Of=t7@uU};9)j|@)Iex-`7~Z_ey%d_-bC15DOs)U zFWebT8|Ue492{4}Lq{*=W&;K=^kJ6~=^>@3*f899JJF@9(`f_$5`rdb0o6UFPQ-|S z4ZZF@#KmwW?uH6gQy__+ENCKQyzNRmK8#4k#;C5sy50uYIE1Q~$&`Sj zM1Q>GQ4Ng5I)vnDP}$G40J!MhdL^a3A(kiym46R6)@}0(zBL;peGl~;KuNxFhDUDp zlEggMQf{$_HtgVZv}O0)d_nK~Z^?CeoClT6-TxT*%x-_4&^e^TZQp?xAJh)q5_-{9 zp`G0rP$yT{Dps&{J9gj?Q-U|)h_=6n73ChP*6_vTc9`rZLs*>FzpA;ip!9ok&oKvA z*Rn~2fL<0SgbQQF8p;Q*XYgrLl(^8weQ+T!{IV;&T4Ca< zRbED8bn*E`8xN9d90kgJ-xo?v3x926$HPe+q)B4*tkL(_7=q5tZsw+7Y*6`_?=sHy zq?1{K#9%O0HrEcv?E*F#BotM9dW3;O;^T*IX3RhF%dc4wxW%f5{p4ervxJKx{g_Y< z?6Ys-N-KTtoUnzwXn&dLLM5}12t~>8)JQN-h)Yb=VzUm%Yz}|IY5>x8^STG8+B&A5 zH7cQ-P^lM^5(*KRW1p&1D;I|iC6-MqNTAoSTcyW@s^(CpXVpu_U`@x}qnz$Rz_-Aq z6v(JV$jTj<%@E(qeU%6^ ziFY23{EnC0%GRr2v>o$g5+)3pJCyhF-yx_V^Mw#(X+YUDlB9Brz3A`jB%{pG{^@x{ zQmd1CORnanO{r^gcQEqeGF;@n&4oX-|5;Bc^se^Ufz!{}ik!`X8y^ICgs=k@cnd-E z;LsK-wi3U22<~m3=QX4QKui0)X!=cx1Cc`wZCBg)_8MU83cs#otzWS@A{~JX|YnAM*k`%5~ z>2~L;`wJIOuqbt{%hF&Xkv^uPPph3X)I(zmk9dVG=kN$?KITrUqFVeq|r9j~CYprFTviqNeq=|cy$zQ#qjOP1Q z6Jbm=8+%Zm?x-^#O{}2K;XOUJ?Yz(i;AS{wLFqT{u*jhdrju`AO!KHP zlrUO9TmbY#FihYmR`aXS?pk2vl0e_{5D%hccc8mI)g=Mk`7$(a0E`(6KOdlyY}k~( z7e1s~YH!#=yJT(`)I;Lsj;8w6rf;Q@ z=S};-bc`N%`_=-c@LY;BrzA!Ihc(mUVx=D#<1JwG!vxKT#5x}zODruAqvqj+|FJ?y~6V4g;ttIMO76*C{&!AumnJg9ltPK%cu({trB52N+7KsMBuL&B~ zON?`E@ezBnK;uEOIvjhyH%NZ^w{+tjJt@k^97g>ge39FUHr;9oJKtrp;Jk?gA`@3s zY>#2@OBRCkHTjquD^gww0E`oV5A&B0wk3-EcPX( z&%^KCo-%vwzW!UC|6_*Z*h}s0yr=&fge;Wt(BiB8nfv2dk1Xt?_?~y%Ev)qYky&^i zzUVg6Erg^@EtLbyH~hvzIj^`bcvG&iFDQ^i|LS2XUy$uo0eAm0@^(Ko@vu!-CANux_ZU$9PQ*veTPBws=3L`q_E#`*gV ztu1wGT)Q7%fy}Sveju@r#2CLW{nso3T^D^>8A1y8Q}B6L_1YD10rz$;02yR59~!}L z92%UijxZn~a^fpSWKHb9e4xHOD1#tyq-I{8{8yN12TkX&2gv^li85$pDs}|h z&FS4VmE#%>9KPtgMREi=%$I_SKI+lI4g^eVx57SlbRE*0k#Jzq2H)x+rPldU6_2^v zA3uk7ql!^PAG!C2H}8GCsDd<&ooAj-f7Jb`izD|DfE@y*D2i^9Y_9$Jwk057ImIO? zZ}$u|@`Ba9SIwAN5r^VU8;8O4vtuHG0Na=4wRe@V94y`Z7Tln@l+RO3sCTd8WTW%g zpG@(RA2GrM z9YO~&Tp;7N!}Pb||IuVAeJOcmL4TVMWi-9^>+NzfIZbI7 zOVB^IQbdJefLA0O1MDpTeFEf!3kt19&qSB*X3{DRE;`RDa2e*E>{;5m$5mG*95w(# z;6K9j(pTvliKS_{ zx4-ll*~AS>_D3k5t#i%xibGZ$vDj+#`bk4;EZZ&Fd*9wHo5+XvkHdTBY{sY_bhEJB z`VH1SMp0)qj@xhqoKR5QIxsl@cYn>6t~2A7IiQ-xrxH4(M9uJgEHXge$MAbPQ!9>q z@MiY~najdf=0&WR^mE!5n(qu{toWq_yY&gw6|@h@a_%mW692;tS}~{+z#J4ix4-&- z_+t;Q<-~8Mh{ zYjPdCm$8(UBX3ao$=;A>{W3vrv6ESC~8T?v67BT3@ZGdAp zA+A-!e8?7IxW&Wv0;mqKg zBW9zdM#+QcE0zL;-;(!@ZsYh0>u2HoCVUS1d24DSBQf&m@@4q<{JtZ4uOEZ&ir`2v zvtkCpGmh4}tE1}#Ui9k684@Jt{nELnRpi=2G&#P1V`u@gFe_DdtM>r%6Si5a!nX*J zo&ZJA6${Y@6J_*J^qx}2vXf_ekBz2k^x!HS&DM#?D#l{;giS03qGP*rcM@({r*m|P zw%e70*$n8XR_S?#ezVQya{w0`q{&pAT2zw&{foE}kS0#TBb zH*#2gEwHm2L3A+*ujPDD-vxaWAoOH zQgfb32_oN-7VMu7kq`JeNis9~9?uhYbZpgpp>yR1`4utvi%KE~f{hT2O&mm8e7 z>#s#fJBNKz&k*1=zxTH1z^SKWdf>3cgh7!-c>Rb>vK$;Czjp4LV%Hqd@r6%m_LLV@ zmfYaueMP0c41L+Aa9#o#J={BQBBu?zCK!h;vk4)boTLh zys|x%v18f2SIAj;+L?c9CkN|7B#L2=eHRo;yS3%K1kz%86ULRE8w|ZYi}J%5KTSBt zFpaO&S>s*Y`6Cp;L{al28?}9(vq906F^0YVaj(;*Jc;Pl7p-@$u+h0_a{3hi{Yu&g zCrB<}QIh{};4bmgn)6t<52Q)gC7<7QklDyXAeA?hr{0y&hhWc05$od_G-CVEzX7Cr4$}f8<8BfcfY8%CC z@)3`SOfaK*wso$nrzEw6m;LE+C*4#t?6!!zWA$s#aivR}7FQY}tA7jEy8lHzQvvH8 zhZ+h%!gRs*N*)}iZz*0?(b#Ea{qDQMn(`_9?t1t6Yt_oCcy!A6M|JhrOS8+yt%|SY zs)#TrElE_5X0Z`eE85nk?r{$1DVqKiseOw(_8sK}zuo5W+|k_}mP<>Y&)D#Rj+^rV zc`us=ZHgi`ZDl{&H|7^nULTQQBODldtgqtUl?ENw(FhxDd{x@CMg9btT*MFS& zj;}yVH%^ESyUF9@Z6-4;+2{7Ikmv9MOrrT5_pS!%4U73>8UmvymcwZB6zVja^Nm4T*3KQcN#_?ZkCC~3c9tcj7ZN?giOE$7!O7EBZ zJ;9qIrmf>9ipQl#9lYCSdV6{wN#}Ilc(`M1>B>V(DSK5`)0)Y`JL`FL03;(-xjcK9 zR8=HSIzCpkxnbFSgwbc;Ngow+$?pxniH=EGnq6#RPF?K|`c{nX5}cQfDlM=E6tQsT zaYPAnWvD&P%Xh*33Tgm!_LgDACzLE>idsgjF&B}sb;6eAk^zcg=VR8M59=^6wKM&j zx|@NvxZ=i@{_Elx_l^_J`BJ$rW+F{phzZ_OO~Mo=85#b>TiuRm$bbid{9^C<8Pphh zhepLD#!Kkp8HTL`Szm_o>#ZYXdL%?gryIT|6JnCc{DoWRVI;3=`e_Yj&^J->1*Qzy zHd+UZ@m;Nw#`siDZoHRd*b`V_W$Huw(H0q3;zt?#dWqG38yWMdT2l{gy#f7CI+ZlB zd@heWSMxl74Ksu70~e8KhjhIo(rU zY7JpzJ34?2A>sumgw{Ulc06Fpmm6LnQI^;2fQhe9ru1k{tB-pnZ!Rui;pp)Tgf+K= zv14qfZFWojy&Zi)gX8|?Rk5(Hx=lp|W(okKb0N-oZR3^^Db9gYL}Q8-*kS{o(FoeN(qeQzB#LJsyA2N|bzN!)FINhb8 zEkY`R?f)<~;#+ya54|%>#}6>Acj||$%PwP{m7#rLSOTQ%w{%eUdhjx9d#}x-zb1Eg& zaq+E0wT!K0JhR?rV8x_7@7sbQLe}DyU}?$%U%Rr0vWlF` zSOdOK9WKz=ML;Bpr>Q#PBsYck_1CUE+~9ib$GL-v0D?TN8a^z+2x$Wt*Vv9E1yH1J z@$u}qyId=vDP40%s|^}$f(2(+@rBHUMv}k$&1&+?R*xA=aFkOGUg9WZ@p%pr{#x?U zX1d$VAIGmYlW@Ohsq2OdVPNIVrh*i*TW6Z6ui8J`qF(Ej31&-!NGeFXV4dN&<%hFt ze<*9vY9yxxt^YV5GHIyV54U^<-w!&iOI8X#Z?>dG6ur~e6WJcvUIUhM|Bab0ZylNA zhc(s87t8{}M;4|>*UqGc%4#PU7p;4PNRvaG^s}c8B`(%q4}!>eS(-){wZkrW0=E>xf94}!I%`r|z|E z=C32>)U^U;if%Yu2%jg^NJssB?!N;i1w<}fKqeu7Jg*V{90o)+_Aj~b-~(O(a8fa- z8(H(`kjgrE>u>d{|K#mtjmS!s>E@j{mKax)keZj03ndG5Xd0(^Jk!69Zej8#G_`4@B7z;5nM-O$P&Ii-ke=)FY7UJLJQ>>7JNlJ0l%njqAA;a;> zrJqb9)f%kp|I;AmmW5^6MeDx9{#8`eM?yFU$@JZeL#mw!tzX~@X(=>Bj z79FjZsBkT>gh`LmL9cKUhUZZ5%Gi@~TN@wxh9D@!ADF^c~t&3P$1ohbOVk8kxVrpVHGTA+tYR1A&K`5;OcJY4;2cP@?yQjWhAF* zcdly5GFC@9Z6a4RyP7)0C)y)#C*PoU zf#V+(ytP_GexIXhtNX`aYjjJ%0SbPi7J8|T@Or_}(s@8gkwLMHD?lE_{5))T-tg8*p zW5HC9)F3EbcYYj@CFG)Io|2${V5cLy@wzZ9kDCKk7>#IwUU-{Mv_`q=djV9#yVMY zd4{ovV!C7ZX`pZ}3)UODM`h1=l`Bhq2OXPCR6>d4=|zKbq9qOpB<*S2`IBu69YI>| z22FP)dhGdfH|IS8fiuM6XjzfO#l0~cz7ks5Z+J|>^WGo=uR#UK zQk*D!?{VCgPqH;BVoFY8AFWcV!)*67O+w#L{#tq`Z1&{dk^~tenmhFRJ0rrLff2R= zlO*`==7*N?&2YmMX<7f%Z*ji)>%Q9rQ#-|RcfQ@(W80U>|rr~xv-(H4UI4M>!THNP!=N8)E4b)I#D@$Ir6TKf6{V*YK zdfJ8RWlnTvs?)38>Fpu|FRA?*^{)mc`Zg?jr;fVjFxO`epCuvbH|sV-uHWMqEEB!$ z(y|^3BQ%q?M;^wxx;oerot zCy8$XM<^8lnF`rI^&x5iI2PanhW8;Hp8>njMhTMrd}$+kd(v$2uxdE6?;UBSX1L9I zYl@-6W<9Jmh)e+m^K2B_e6q$>8=))SO8VXvEz)P~-}I4g=f;XHKH2;I!$Q4Ze8@zN zXt^6^1lx+zLtvx9XuiZhFMC17cRgvMau^ceM;dK7Y-pQ4i4&3WPMGi07g+T4Xd1Cu z$$0V>FA<_0GS8%XU!r3^hEW_i&*@GddWlw#{x6g318s>EJ54*E%(K_5KTGPYA@wCY z#5_6F94%L}N@?Xmz&1;~r&Vego#fhDkSpKplT@P@xI?lmhOU`ly)^|oGd79Mo;DM{ z2;*Mfdv|;jRZ@rMIR-2FW)Cac{7HEa*l1pqQPgN5lU@#BC6QX)mF1%z@pE}1{Pal| zRWNmLoF$U!&IC+dG%{ zzjq&bM?Lul;zTF23ks{1mX zX=*k_Wt^I9>cN4V+&?R)+pJ5Rj4#XvQr_gCtOm_#-)x`1B#fQ(^4(duJwEcq0VPCb z!Aw^FO91=zw8xe2(=+X+eke_KW)R27qJtqRI$nh%7ENP5#Hb@=nq5ZuCo+`n%2G>N zR&Ed+@5SIit$k}?4O~iy6DT?KIxu0f}licYbZ3@G&)Un??|2O*+t{c{x@y zulwTD)t~R&W4vd7C%J*uxBo}Yj!&m7$>!}tk1%}lfa|f_%N~i?g`_$>J4d*&bU8e6 z-kg)J)SeC0MeCffnQF$j1e$-IDq?0}#fnwZOLs!<6B*;*BX32uRuA9mlS{v1SZY7H z2QgtT#;`>H_Y!CRmx&gdwET=g>galEBWXqyc1ku*E&g(1V@u@|o~J?h+dw(XKKMBbj-2>l z?Cud^XNfUZjuE7a9{i))=Pv+mvWy|!-3Da#9e|_1@Qd7NAPK-gNi07|4^GTpK`NbI z!OFzhA8UbKGg6#%2MfY)MZPoWyr~|MRQOA_04q+B!@y~SXBePaWQIf#og_t;moi@o z7T$_RaHJ6T5|kTM3WR&i^ZH}#2BYtjrNa9B{+16jNk#njwq$LG+Vs*m`qxh^cD@Kh zKhbpmUf9XXtd7+TJZ7`iQ#|0u=W-jTx=1lPM+CYMKo#D$52Lgna@>>GRGz@q>E|l> zI$jIZT*~!PWj{@vI2tl)TI@w(KX?JVLILgb7cDv0$@+{GztY>OvBf@rSOSIF$DLM9 z<6k3n4jyU#Cinh&db~a(j3eWCK@;j3GoTr2A(=hb8{k=2uHqtVqN^)gEo6@?`v`l% z9Bn(_mxbMeuAx#II!QwOkn^d9w+b&=9lWf<5B?+!g$U$DtO++);c0$4NOIn@e|&JT zFk(7*$-&J$tk$zfSelg!BwJ(P7yDf*>2e~lkk|TeyIUKjS-^FT9+wH@qaKi>yJ+e! zcAxmZG+juP$(9o7Qpv^KEMM^0`dPk;kQ!~kl#uNP8_h}QK0bmB&ZBf>eBHAM5^l?9 z12lir))Gl>;((Y~d!@l-&+;aE}ng~4EZ+a&y(pIb%o{lnJ3 z3y}kNuP^);u%e!E+V8sqWv*I)7wx*~leo`FEyI=(o7~z+J4p*Lb&kwkuC=*_OAtQb zkqMuXLC0E6eau1{y3gDxm|%s`7=55&mKU5h+MG1;%_wf?%p_HU!!`LCtg7l+RicsJKkVnepYWS zp5xRtLL+#P(|Ph|e+e=P!|uMGo{c0mOm-TuKfTQ1>O^&3az@OX*bLla4thdLJmU1@ zPngV%I|d;-g?xQ!-pSRUN$+}Q*+a?9968ET6!{-mpk!w`Iq&3!R@kP5_^e+wPctVv z7(BFt0!R3Y7tbe}QNR%7JPAZ-2R2}5=BZc379jk_5zq+=Z!o#uu0*1rw>jwCV0(9j zZF8ty31d?ri4ALWy3PYD>?x*0OLr%1T4FB-yA8K_(mt_MY zIsEMJ3GYkGU}nofR+AXbA^8J=rAl6nkCG7bR<~_naXXfsKbbeJ(yKY{+9RHw7*tE^`qke z9$FHbspc)pWEt0CYR95RrMO|ow_NakC{sPAFR3ME4JA{2_L}RUR7g{C2s`}8kwYYz zJno>ju8jYaHNxH1b(rt`?LvHIY}opLza%8ApO6hH8d-tudyH(pG5t};{7JGsXa`(e z@~N3$Um-deiMyey#@c(rW$AWBuX<(YPp4_05H=H?!x=Sk0(&Qp6fV4cd4A4PR|#g8 zJ%jnq+6v&+8CxJ9Iv3!o zH?s7)MQp#`5g)PP=X%0_%T%HK%iu${1a+M;aT9QkcAFig*!ge{q^MA^Gg0rnx#_r9 zHJJ9-8ED}JO@}S6qGSw8CTryU+(mdi&*Q+&@lBhVCGqqH4u+erZDE#|8Tw5%ZE)& zJ=rpN4$Op2@C5~v)fpu6jRPGY#NXggs6(P89eJMJW|&_vtTd1_6KtYI`9$yJu}FI(p;lG zO?wT}XzYJWC0E-Yw=%EZuRe?!wtkYffy!GOr#!#=?v(3r(H?wlV{zw$kRf3&U-!RT zn1!1Ui=!t28TbY895@ACP695kqNQzAXgi}j>XsvJQu}w+dK?Wv1uw4^uOn%CKSs=i z?z&Tw)-{K8)|4<$?n5$Q$(%Uf=0OIqree5ifWeW&^_LNsURBWEoP>yz~iY3J(r4?A%zqFjDq!|uMVF1@BUyUsg-x*7T0$(BXr z_h|=_z58MhwI4`%O89!`)ZKsVEFSC19l4S2ggHY+_62^VeJBI!e}A_ptU(@SW2 zL-)&dF_*NuLdkm*`Ol@aYNyj?v`XRqYT_w{puH(ei$VEv%urw1R38N{mPv(1pOinr zO_%k0s{M5ar;*p7lNG{$Ub#zJXE%Jn1rrEwQ?1`c&n1za6Y0rH0#*{pcM1eqDOk~! zEENy&|4sKxRuZMy8SNwb#qR%YIi|`hC~eT>kNu}#k)cxOdLBaD6G@izcwi*ek0SjA zVv3o$lm=P&kwP1%bH6Y4`tI=D=(`-cx3Otd{(U2$h`SFVFgTlbixjXLWqjK;eCWGh zL_b;+FH*}eZ#y_4ce5xveMtv}(-pj3BRP0|-V(twy_?CS5-U5QZp&VN04xeBy|_E~ z!*F=6TGpYebO_I~I3oM;w`RY*o+hfS^%3iN5<$1cU52`T3;M#wKaEdbL2kpv%j%eI z+QNmB>5s_fJ3@I(u8(!q@tgNML2>;LKm4m47zzW-AQp;TDYawhFd_OWG6ISpVtWSmbqGwS8NcSpqythKWZqkx_(bql(y_a#i zNbrO86pT5a-QXl{`8$_jUsZtbpU!3AYolqTM2zZSl7kME?n{@}*9t>Y2O!kvT?)kT z2DqAO_ftax#usUX69U;)6>js!qJr{r_D6AM{(I0!bX4t-puVfje}C_642Sx;bB@C;H8k zb%skiIY;)kyaeLY@8l`8Bdw&&M@2yThfo82@cJvRtE7OTTBL`DQ3ObNaK& zSvP0!sce$4w)#Cy(M#88A9-8#8IE8%ysMpN}a#r5{+u;hT8|>@s&JDk*$eC5E z$u^mPw$du#IOEE0XJY;KJ=wF*HOCC|T>k*Wkh-HzE}X~_b4|>sF}QsW@)LuE6MzzJ z958e-4gi-B00im62b@ivwUWYIN0|4R4+ol2C+5D=e*-ie&GMhWmD;OY=vaIlkTy0R z^;VU!B-`v7zs}PR=;W8*b}j3Q0y7)(-P#;ct3#}~>{6}=iF5b;iWX;{Sl{S8MqaPg zGUSKa_LiBR|9I*Hh_gcR6Unt#Cd~$kO9mPbSj@ZPI|9 z?DS;mY^1&F<+l}o>8V#PakS;Lz!pHTCt+iO&{bkFOeuQi&di(-%PX*bKKx@*<2yx0 zjreNF@FyS7JqcjyPFVnuF!aSV@{q04?ukc~Lh8y(-9pQ0W#y$^Ny+Nzy6EcoOk4G3 zhjwLa5kQ^haKbcSbNa?VQ0-(W07k(Cy2@G$;in0ely z|8~i{m|iLJ6eplt!<1vn;l#~#UvYBjE`{VQkbmNIUyUUael6 z+Bj2emo8_C@aky4XoXe^nn^myoJQQ4W+ zFCOo2?tS$5A?9b4aJPLfdS6A;oa0Xhzac^Sd}bPv#A~h{9<5r9U1+gf;potRlf3!? zlv4g2siMAXH`hEV!QwCr?ck}QjCM$W=+!b9O5STFkjw*Dj%8@77C;aVMBgs4h(`w~-DpSENzA(q<{wdWc-pv?(CPPMf(ALcCNiiB% ztEA+HyJ^Yq4Z#|h;@-cP3^Ev(WFUu9_O^j?@K-Uspj((Gf@be1uG633;vJ9__gEuvgKrCj!Qf zgjkOJM>;4-g~|o%#QP(bSPF&7di+vo)#D*cl4z!wZbsTldVr z|8!wkU^JeCW#+ALXbK1&4fdb>bt19*uUxhfB_B^%Gk{v;pu zj2tEK$v^$ZC;wPs`OM$Hfpez8aV&qByIz&rl@CZB-Ze=MsFTM_{z@DhemL~K9qQ4% z+k;_w>1p<-gCntUN5C}e-#&Tt1<+dmzC&dEaN5JOzIkC~Ps=|soNarTl)My#^9MBJ zR{O*{R={eB3-i5B_Nqf5sTZ;bhs__73H30cP_L}tTqGWJ^6bnxf;`}#XnCtVm0i8-=+_nWHP?Nirqsx~fa0s^3SzW*^6&V2OefWYD?dq?9Hs}%ht4xY zjMT&u9Ehaj;ISFJdg{Q}%71K&qEA?7{;6+t#I~dG$OdDGEB&nhHO0QsW#!vEdC{42fYtB|M&d=@~!{Rep{aa@CIhxt`)ncA2;w#aBsN1 zH8Q&SKiS{-mkoFeE`w|OlF#@2wJxpU>vnjl*L^|yw0^(w_1A*-67Rr$ciwx8^~}XN z7e2>p3oyBGHwVYg8w>FCn6YM0zH~e~n%R|}}ZoqVYVJs|MCy&X_!`S$x z(D5MV805tE!kcq?%*iURj}j9B_JKJ85}#xk>R>n1`vy-~^M-`k1qeoV(uMoVU-6+s z3U6X`FgVe-l)7z(NaK~i#A>atOQJasz*j)Rtv^%)vO zOqeI$<}-OnVGIbbe}MK4hve8g8gZEePUHkW@%T4y0_M>{M+X@nSocBRmeTEuE)q4I zD1c?p6gw;M{@Re`4VuIU$bJe|e0jhUi`FH1XwOK`-X!lcA3Qj0^-wsZ>6u%mgUai6 z>#>MTM}0eL@Ng{f45(Wv1rvS&_Um>gJ6BY#CTUX(BL%& zk9}yz(R7ko46S~c6z|$08W~Ferq~vVA0N)cB&U<`Hpk2WjT4WQzsOt1Xj2pLMbg{O z0)o*LFh6|epI(RQ+>?XzkkEMrvM|k&wYJ^DD;oGEZQk_TX>^e!*8b)a+1W7ra{g$r z@A*GmlTK_Eg$9JaqWb`ht~s#Xl$F_0_1Q^ z^Hc}&NMO~dw@-AZ$q@h$eG!-K2iF&@n%dTvpcz{*{u{==&Ln^0vzLjhIlvbM0F}uP72uy^JWI#6t8b*%DWPpx_7WqQWShA^?-!So}Om)~D{$rl-)l_}g zv+ECKS?wj1%0WEX(X1HY_&X>ab8I;Zt`1vzJ6|VD^o~&azR3;hY?QgW#+w|n=Gf<& zl^9{oUe%z!H6TW?eCPU)L;x`B{P#5CKodKbz-e|c{XG?^xZLYzZ`vou<8$?i$y@1= zfy7Pl>1z210Dt=O{mtXi;?MSC&|tP|ViPX;3jjzz&L2EjdNq1-;phGOqa57evFm$- z*}GaX_{}kdVO|!*&$`mTYmQ@~K|Ce5{Zs1@mxcLpQ_w5jQURegc6ztk4&a);;2-(F zA-LloFRQ!xckl_|w!iUrx-N4;co0qHW@eH-Jsj(TV?xR8D7-l*bUXGPCy!k_Kk62I{)+f` zQ1^4aieB9C%|k*E*w~5V0Y^Rw5JHV<)4LPCV#lOO!j)WMJ@b!wkBc6kGBT5f^yuEL zr?tS15K`l|6A#DfA0To0O$6oa+G4A5+=sC*U>D~Mwi}IXN4#n>e%!Q)om?#E_0FtC z(8gm1h8*j!Ho%A-Wo7i1BUZe9lLa1Pw^GO8#yzIC8*WX+P*iIn6 zhocnEe{2a8K*Bxi?~KM6u!w}s8f0Ct8#qRNx2~~>Kf>sn0Lc{~-%}G}Af6Rl ztR04f6jFE_Q6>D^Hg@RF^Ka;c!zOX{&BIg;cg^1r2?RDCH+DAe@FkUGBQ>vOac{W( z24c((Q<)hHEtICm2Bz5u#MnBX`PU{!!DAWDoj<(%G=DJ8pK}5d9qfC~f1(I?^Ctj( zL#^H(Jk~+qskL+>u@3venIE|n_0RZhVDvrLBgTmxvi=q|`AgR~4d9q~Qz`;eL2j?+eUm@#CTJjMd(D5a;>E`MUxU7&tZjK7`AeC2MoZBZ zdwgWw9H|0somO0!%mhxajnBE{y=rG4Qgf?RnGz*%e8s;sj@xt%5ONEG15-S%r-%{} z@913f)OYQFjD)d2Mgkj-Z_P1Am(+s=gR}H;1vu*#onsIt6!-e?{TH6GjYC_7Wyf>g zk4&0SJmlc155!xE2aeM@nDm){@~*ejpHpA9kcNYL!tutZN6Z=N}Pb z!v5!UViF#ClWf-*MgjN+$Mui0(ooR`;y4A27{5|^-v*TPFS5t=A8x+X=U$F4c*-O$ z>jjX^e@GLp)bWuV(IIn#)5^_-?#{m)*mPWuc$0k?Gl0K>j>qRUo!Ianf}6jz?Qeg( zo^jB1+-no=#!LP?NOWJ`FZfLD(lfu~yW?@*bzuWYFl2Ij|I8n&eJm9{?R);J0G|Lz zIbM%x+X)NWl-ec5NJ2(LQh9I-vpkJdC zN&)%-VwA+o^A0j!{21#e>x+;{g&F%31Q=OCuQr&KpG3qH@w_0#x8(e_e|nlPXaa#F z0N>&?Ar{&r{{$szlvC9)&JFMMZvvCdNM^2*cH zD!?)?vjnUoH`~_M>#X^`KG^c2+#FKo2Ax=OX1&>rIP#a_?1#|^6}$5VGa+@gv%6w< z+QbLQp`V^PCCM5fob~XFhs?p8jTpMW{lZyu`?V8x->mN#)pvR!?TUL(-@d^OwVNHFu=F@gPmsB*ufsY){~t8 zZT0~s(Wl3m{ncK5{G~ToHehJjo((ZSzMgv=;PNg*kKr9XTzkEO#H!qnc#uoM3+AlH zpboHYrCbl>_A~xOhQ8M)4fp*>3bggz9_n6hoT4@F z>Frl~AjGp?zm{WgUF)H;T|d#`7pzqX?@wqAA7cFP{2-k8$km>!S3JTtW^&D^6dkHw zpr$|bfNha`k^_G0a}{7D*7@Y$`+%kF{TBc0`Dln5$Eu}clTv--+3u6oy8g(hu^1~e z(|Ucddg|}>XO;X00q({h_B$^oM_c^wAzcqF8kghIyu6h=UgT1EJq*}mWbfL8Pk3{yl$Hgfh}T z)hnoVtXX^4zC1<2IqhEGUM%O4!WYnegNY$Go!unsnoI8c6Hfh?>3Jv+QhN6oK@pIL z2>1;O3Hyej5jSW=zCj=O*Q>d}YPRMuW7}owr-Q@*UxfY*$>=e&i~M52W51)UrwYpj z;QuOb{BSsb_2}J9l8X5z%p(ak5jeiLeMrZ62*R!Wg~#ld954qAMq~HLX&8)crt(uR z1HkCJGMlBosL8>qiI2$hi#2Z8@~;Gq89jgH7?yI@#nwJS2f_XmxXAZ4RgJhbeG9b#~s|1Xj`y5(6X^7h5q=38n>Fl2vUr+f@~ISf&IcsZ5USzNde;&+qlnt>>V-b*pfFzY z-*#4MI+QZmzftwdi0J%84FT{#>p)Bc%FdFnW{%SPAiR{PA=qw$bloM$-blFAa-aX> zXYg@~o2-r9*0=h^5vj+-H@@xH@gkeS=m^#MYmRC?u#esk#9;7%toh@rYi$S2@eI+_ z!Bbh%)1-0(GLyakr4erJf3T)9Sfv?~a)oJg#@zD-k!f?=z9Ci{9ka$qI{P=utc_rE z{&$~yeT2g`0JAZg2486vgG*;+n%z@C(9<=j8 z!KAG>G|8Nw4(1e?EY=G|;p^JG)+;`PAsbRDuU&yPoNCXb$fLi5AVldxmO2753`VbI{=wZ<|)-T&)4YCFw@%M0p*M7nT? zqfE{VJDr#Mq}O`L8gg`jtK@ zlA37@)bPkMfkb?eqmvnxW4@u_M`#t`X~z&rr|q%x*!E*{jLDCj>1iF)({8=_z%C93 zhd}vT>3(<*e%l>zfuBt}*9i>mqL1*)$C|ZwyydCciv2ae@A>bVP_Cb1{jWa)*j0Jo zvyj~bMqGk>!ETm!2|V_z3`&V@$Mm%NKK4u$bG-TQc)peIL9WSde+zDZFZLoR#=0w^ zYkJfF&CXwibA7bP)G)KG3AN;gob}HQ&N6N|T>H5}sPL6PDnka7l+(ejXojuFQSb z-T%ZwR_g&wI+|_q&6>xx<5^1-m~gvJ*tDJ|fG0(Ga5RgdP5qibGZf4n1Y`ZYYvBCA zKM>*81Kjw<)->iUWe7R)Kt}J~z#i}>LXdq={40NnS*v1Q3(YVI$D91EiJi=676U?p z+>8)h4bjp~{3{rAlKspN!NV(qGk;U+U>;I~4UBBb0r`4CH1z@#ZTZt9wrzX->u1Wp zY&M@nZg`=Arga|4+OZ7`2vEUJe~8^mqe=3g-Ub?X17dH30YT7vTh7yj5>Da`~?VzBz@`RVwfX#VzX^V9)6 zGB6$_W^=%aFB-aO))g;VY-bM*U#>qPgkr6KNs`2ax2m{$pFjCDR#S{oUQi|2Gd@d* zwfV~kSt4UlKMkdN&an5bwuw{uYjCbF^0^h70G{UGf;M(yHGwY{o+vi?*3c1T0H^`J z&!3Dir>Qr8=a{bi10hSR9YAD{W91VlFGSlIBCd$>{wEpFdg4cFSz z)o%kxZg>8?Armw3<01n&@3UTGcRW1*34GSGc5(0BJi(x8BpMeeDXmlIG09q{gRM9) zR^J$GIEUDw8^Pe~@|xOTWmt4f|E}Hq6JnS4oB3`Zgxwgdy9Bqt7yDJ4(Ufcwx~AV8 z@Av$>_fp?`J+9^QTK-~HSvEJ|7Tkp0xa~hJz`Y?pEja%Dd`n=o%i#8h9$DjAHXi6u z-Iw^rwCWrGJ^$2~I=Ef^y&f<18nbrSa^B_kdi|;_~H8C(wEdFd~zbGUFN6c;Z9S%Zma@_VD7cyZO`&Ov z|F)I-*baT&5RZh(pL;r_;RI9|15|#dwE5r$%xwLy3dk_rpZA(ger)SciKCgTaTFkiK^66T?%s2tsLPhkh^+$NJv^Aj@~m(2Z+v zgxPEX`+6$;!h{|I59R&P4H7XbJ!U^yko@e->Gc+8A0cGSPwR^ z1Z)diFV zbFYMgbN;R=wh;JRQWV1niXm~)yJ^ttpI;~n-~7$#gOJmw6nRL;-s{@^$2xdn!~T*# z+}P+4geHvZWA>D!Pk#a>e*xie5Ju(TAf&>-i4O;GBcsQbPWI>it6g#f&u?bc(~h2@ z<4^)zf+34*Rkk>6rqwOVbv>8vas3l$-TxB2dFvMr+TzmKzKhk|FDwB~qdq5oC7~G2 zH+sXD17~Nqwq=oM5vwG*Hl#*h&L68|cbUQ*u8$8{zi9q{_TJ`Y*C@^II#pd&Ne|k_ z>WG(neA0Rl$K=4m+B1phSM9IX7LuZa1IPp&iL($Gq00*)Q%oC_WDJqF8(YYGAX@|8o#VR?lL1bP`v3tvnw)9AI~4CN3PB~ zi$?BG-DjN2CjKM>wE3mp=qwVD#y(FpVB8>@l)KlT*tl?@PF}yBo|8Lzlbe3>hmS9* z2AIG=VCJc=-`Ru{b7I?m8EG&+9x*Y(&V}IoNbWUpva%zFOzD=02~EU${#(SsWO0d; z*H&^z>wy4jsr6oa2f<(JtbZ^b>yIlqYUU#>--9$KrO2#)IXFCaqbXF_NJ!ioVbk$A z6r0{na*sz}*=UWoFc98&hsZt`p_hCbXZoAZi@ibj;R^3^SJwF7@>eB}^<70mEO~3} zdZ~C{yZ(=F09@;R?~fI`d>r&Rbn)nEzi7Om?&F8}GPn!0ND1bb&G$oo2Zx>29^L%5 zCZiAW|0L(Hh2z@0p8LGpSu<5dKTOa3S?9Z6){m_#h5-m8qmLw5nTUvY&WjbrcK{m?$k{df)&#ziDJC3tO=b)!vfiCX%FgWVF#{$mQ9>G?2Y>AIg9 ze<6DTiJ!Xl-$-Y{%y)S6&~bJO(?~0}J8UsV-}cWPAHc zv}7RczvGW)w>$qGFABb=H=MFIng6CpYdb9 z@uaJKc>8?QxZmLE{x9RMSK}iO-nnv-5V!01+5E*0yH!tI)!yg7`99*y=d42#4h{^$ zBXPn=_EIO*UMFM-ksFVxjVwWHzwLYA$k3)z`qUMG?Ic9*uX+0hV3>8lhTq5i4=n`L z)_O2T0Pe(!#mF6pTt_+`{67Z#>64b{ZA1Uw58tjyz-5m)nZ%XnnYgRuu)q-PCjQnL(34&A2w-W z!uKhV@teJqJh2J$^ngHX%ZB916{pU#n2&w2{exl#<|G7A-gLC4o*g4DSn4EjlFOKDx{9}=d$`n_L`gf{*p|_#z zFb31nz_#TvM;{a0aWJlOpvOG;M-F3eXh``xZuAA4m;ct; zD%dhH9-VYdw~uE?ELwl3TA089kRH8Bx%UfVDa_dhsfCw7W~L-Myzr+zA6SCb+LS@^ z*GpKO9Y2_B4b4U>0DC7THnx^=EJp+~8}i|4N%Ap>O-Rv=uH!h1+n%e#je7^D}>@J9_x9e^Ud@fVziAIJKuP`E-vSTWs26 z3n}Moo#sTtK&^a`MiSY({NwXn{{aCoff01<-WCUVhO->o$I-*Wlv#g0wG+)$*ZNC> zf$WnfdX4p}#{8fmKfWP=eoS|6>`QxpDgR@w1z`N?@pW{~jkIz_VU2=ME!yKW`C-DY z#0Cb*#RlsD%6bEaxY+4Hk1KjG=owkB8R2M-p|R>e4;Oe3ECXXAn>9~3?7%`U3djDTK)(OslcHf| zTUSEDe4-thYtr*ycCGNPnOt?>!#cM=jY1-r8v9M3Q|47le6y5e-i$8~xeg33jB~9~ zjOMR8B|XU|@3XeCoBT^>&Y$ED*`5E&#rdTgE?Iqzn1SE z@5cXHyqnKGe~Bl9%CPO2{$0EI-8PG_ZmOUe&rX?jpVD)Y-0`A$;7bV}Pc+5_Qq8gq z=hh;VnMaS)ySDjYVN4%#gT~{GqnY{bgQA4E_o*Y8pGTRJcW*$Z!Hqe5cmZCXfjRRJ z#v^};lIsWg53TSV))U*P#Gktw;@((&vr5>Q=@@;?4S^(sZ6i|fT&)wyT|epgR4jhE z$zr?Xr4G;am%-#w3;;Zq$~SpH)Kax9MI^23Fm|rdVBLJDm~tHQfPblt`Vo(`BnN>o zURwIW$=8j;`vqDK%Mbs_WFCnm8NEk%Ph`b|%8KC``pTMrWYqO@4aBn^=Cg1brw_8l zOJsjzLBqb_O!U3J&~oVR{~@t?%VQF8Tp4FdytH@w|9nAjt7RNKufzC1^qLs|Adq;G zrxtj$BH>|f2FjuJgd4v*|LFVh$1J56ayd$NZZ}f_XKYVC$lm3T@rft1)$l>@ex$c; zb;RN~pXvn@T{$?m=9P6((6{9UM|f8DasFZOtT*u`k?Q%0>+l&8&c*xbxyM&*4YK}; z5&6j&Np&zF|Ex3d6K1eAv0gUxH;P0r>l0Z}7^n8a$Jv{GN4G6Dif<1Yo$&xK5tCi(it zqQ+pYH(VO^@HGHD7YT8*{uE9AO3v|Q5cBK@#>;2koXh&d@o4bzbjM(N)-UQ!V8@%i zfW3aPAZEw(X>iMo+-;+2`PHg@W54AqBjPj$J{>2*a5(V477xrXwU>A@t_;79>EE?) z`Kv}M&i|*@|JQ%xM|x8-OZK%J>}5+fyTN$&hT(eGHl_`mS|RmgumF|+P|h3x*m zpidK!Vkm5S)WeY z$R4r;BUubeoF&KmMC__;{N^vKF~uu{^o7D%e>=PIf zgl7>la}90m`9+#GdI=jl@>6u%omq{ zPu{Y{K|;hHGM%wH%jmZjD{LG*{iOx7G###b2^}v7qZk)se#bFBUbV<%x%6`m*+xFG zeX>jbxPUo28_r%sMjEKiRXA%*uYkWd8)qx%*dT$@51b?(K z45?^rBDp@fjWv-pGPl9S4J9(X7OrN-n)B6TGqJ68nBb)!*95i3Zexm_MI-{oT7T81 zJk)R3+6!~w0wwvxp?4r-$4U@tI>d;H$2IjFqw3Y$b7I?EhrYps88Ncf#GWx6^oMU} z8A>+p!3JKhz{3S^@Y2gl12FFMsWGU3jPbKAUHQp3aje3^1KY|kJZ}OZB8!!YEfCWs zA{IV)Jhtw1Fs^zdk(i9KZm)c-);d4(x93n$amYV=cVpw=ngX65k~1%Jf**4Ix_rFL zVG%;ugQZRf{~JukLk#QmbT%@GGk)S@hRO8m?7w_8ZQiN%i+Y)w3-0(#ukOX+1y3fY zeaG~)Qm0S5A`rMn7<62ROaFo|m&%NP`M>a0_(EdeF+J^K_rm7|Pd;b-jtA}~otFqN z1ino01^f|L^?zZ~QjrxLYqW>*9VT^bz4(AJoqu?*+R3f6@B8B3F8< zcP*jlZ1Ck3Bp= zod4n_A+=GixoIV>USm;u>{`e$!SisYhbEsJLS7GqflEw{iB8=02^q5zk$kn`!`%F) zXKr)9;UFCpBQ^I|X~xsIl0-@! zVltX3l*#ka z;}3{hj6CdX0dQ&FJH+b-(3t&2;I0Ayg|NyROj`dPA54ke!V&M?;-B0*MtkD#{oh@% zF^XAV{Prhs!F{ZM4aX5~r0QP20cjoHendjeA#S-!7- z7Jl*I5VD{*mIc9q1JiZ?)8sY2WMc&aoF8gB4M^yp5!#MAog50Mi+m_%lN+H1;> z!p4$|b@bRBmYhIb$ltW^tN%8rHMzo&8(0n4%;|F|u_d4V{u z@SKT^Ra>dftOT@q1IHF2X4hXsw^s1v)e7}oHJw>EV~uae(O>afciEcToA?iZF#X@) z;lL!E>+AK`ByVs|ZtSTsaBbvMO#D5T-f*-3Uh~H?^~-2ugvPET_1pLwc{0)%1F;&O z-d>Wp{<7&elrXY8JrJ}d$P}OaHHWCkk^IS_Ma}jNhi+xVVG@`z%}PJ>Z$M(#dYlmH zH^`B7Z2Vt>{toE;MS`B@HP(dQ?K1dUegXOX@mv1?_}Ab62w<1!Wr4L3xUqIabWBfU zpLCB{@CxungZd8Kha2$Y4Sa?B$ibxd;g$Zk{JZ8d2S-(62`j*jvl}4`#Ik< z$DlIw&fA7e;tz?T6F&9{9gdr;;!2kXdTRnQM=*fy1GIOlsSY1}Ww8EUux!cS|A-@Y zP2NQre7McEChK4F^xN;ccU`2AIW_9~ zOJbT$&$%A>uAPFe{bvHbIw$r{5B!~f>J7KliN0)CjnGO6EWK;PnC;Gz~jc`OA{*k>>h`vu5xxUgppBPfk7m9S*OUPX77E0fdqp zS&ad zH{xx7SLDXO{qOllc(?sm;|riZV0BDSyW{^#=dayO{wj+5+4ElFR?hX(9hlw?`?+CY zc-9xyqgBvNDdnU7$o=(GUVy@5yaxwv#XoVE*&|*i4dr{JoIvOU2V>_U(_C2h#ej#1 z-mn~Xu*;YDjtft|f=++%!yFM2W9iABT9uoWUmW^-gqZU*A>{RxgDk%M!$L;WVbDNH z4w8(SWj;u-@|OS~e*JvQxDU-5H?Ot-*BYO=sh4fKI0SY6;;kY0jTyEQ&`{Ke;WTd} z=^P)U<_-7RW8Rb4PlARjfcn~@N9T1JbFJu8Hu_>TZ(~SE2){s2eEsD z#NwMc9NAwy0+lbr&$Va#MW96DcH|8czKXiDB0gq1jGf1lgeUz-fM<-UdJg8UL3l_c z4C~#;FtN6M_XrS-g$K78(|2yGAyXb%YvP8J{Z?MD_{IzTP9Nd4a z!E5CY6B|ta(ho4siyw|DT=w!#GelF2bOaF5H zS4;wykPT1F?;b4BeiFPK5YD{H#*m5p08W?m7te&-;uY+;UryXudjeq{jv85)&C z*C{chN1li})@S_t{8L~1DVDRIwZ-`ikFDEU8(750hWM$qZkbsWA~SS{>tu1}Z^8{+ z9+)0r3{3&K+g_(i&fc|hZjw%IEgK_hcVFu&J8?R$t~Kwu;GPirJ@M=Jx&9-(+wZIK z1yCQbI;N-H@mq^?&&M*y+x}brs$|azmFTYTS-XxO{|mtF@ex2{(WiC0ji4vaoREuL z9WMPH??T(jjsLwtUhT!IpbRxGXZUtpI?EOxwYttU!sGbjzfQMr`MXRX75vh>&XTq6 z=Xzqg%bWVH_4f<4QOnML#+J|cMYh-6;(18PI!a<;`+YG+Y#sg4?03W_vf1Z}%kMa^ zO@`mOVE}!}pV(j|2V7{W!$|8R`O4qL89R+*KaRZmli(4WFxc5pH%|4SuY)I>2UF~6 zxU}KtuP95^n^5eepti>gXa{*Ev55)U5fq315l3@}Km9FB4ktJ4@HI*X7WnZ1on+YW zHyo%}W6P1~CE(r;C|(=*v;I*Y0U=^C@lSoWKKlgzJjFA!#APEaq_;Iw@GM5@=Bf5e zzb0P$D1$Pl&Ks)!gvaq*7ONkA1Q}O4-(;~Om#d|g;c0#_wpnsnd?h1B64FSyjG1{c z0UjAEVVy?hWnZLk*IypTIS5Yt*1!U<@d05v@KF7Lb(^}ZP!ift{kg|t96H_Nfhc>; zn$SGqTYvBu6({W2j+;IB_&c`~2w%q!$Z|}sMg4Gvj<(JCG zrhdj*2fW~>gJc$aJQI_!)JFUISMEDf--j_C2L){Xf}B_@X>86$nBkEm4PkDjgn_Tk zCLD8odfhWbaljtx9=fL4M^>zY$cO-7&I#wbp$|Cj8qT{n*h)^fLXoSbtbx6@);jj5 z9oM?nzC8epdvNLJuRK_6L&Z@)6lANBes=!E3A!}1VW&f)unDfurUQNVx zkl9fm5QsD3H9(SB=4U1I1oX(Vh%g=P>Mbj%CTF+>Cwb`ro%4U!gjK*c?C2*DBMrf% zCpLqer=!5}T>lxbfOV!<;|NY>du(hB&Vbm-FW0qr)OXtt*a)t0H{1(>n-3JucF~dQ zV(?MGOMl0^(7xq=75o>n{$Kh>0AF{=x%?k*zg z!G(F($?GI}s^r13zYHlM4@s#WcyIHU+7B7nnG-kZ{k7lV?+dSac)i30I>4)MIx{VS z5VOe>!{>k=2>8slxsYG-#DTG)-2-%lv%Yh5v~&GU@#!%S?~|MEyvcPi?Dbmu@Qt%ti=jk~_47Bkz~dN3t+ z%j$JqK|31we(^TB3D6Xj=gPrB40|60%rq_jsgIR(;%{E`V^DU;myVpBzrOz>P%zz)4JTslh!c1Gj3sTk(4S*`-Rz!r~1;bL>p6h_}d0YV$ltL&Dvv2WA28XoWqem7S`*)^mY9SLmqG^AnPwQ zaF{b}1Y>017#nlx%a0izEC2D26-f1!gg6A^#~@b6pE#KYUt>(18yKVGdP*~nN3}`s zghwtTfhr^Y1}BPMtAm7Wcqxn4&jF+HizR;ph--;R+D`}f;sbBS^gWK&lF$$bUF2O? zIN4!)z|Y=r1!d;8kIH%zU^IFQHMWWR&3~LA470hnQ#Ul6|9zbX*7Bb$M&dM_^THl} z@{q`WM8H0gIA)G=)n4Mg{+^(;Eyuk+2mT?SZR54T$!`#u^!N_GbH%{S=x5E~qCfD& zjVo{5ah$h*oa0hNKY5$q@WqeyE0+0>Y)qsBS9XTax+MP!riFC$|7w1XHGFRWo8PU!DSpfU z*#CENG-v(%ZvbTZUoAc=IQyz=7VoFW%Lb7{W!QI2Py3_dEi%8T4FpGcK~AmX*6WYT z_gntD2+p2h?NU!J;;X`{xyHI^Tj!_q>>mT-AV0<(wn{S z3*#@bo9&4+bL^qkPh3&>23%lU9?|qd#vJEWMRN^bF}6N8ffbr~4Jf?+9e#xC-xI)i zIbbh`k>&6BQWICi2lIye$kHo+*EMy>jj@(8RI{CM>1k+bt(EmUtmRq}WCY*w-RJkn zCP7~3^(LKj0dTt#MlJUAwAvWYcGBxl^0&dk4V}GQ8bX>cIb%A%>t;{=XbF`;Wme2# zWVQyAf%}EIia=)AXTI3z&$8D%@keez_&RzWR}bXM8R;URfpo<0zbUcT_RJrY?i&L2#U_@-1*d#Rx|F7ol#$6e_VF`U z$&-KhJoHRx!>hyEFz>jgCUy{YSRgP~t7?#M^B5h+kL+LKAHEEsUK{2e=TmR3)w}$~ z61&B*`7dYAtAJZ%+_6UP3$l7OPmkXD3^o|(U)CScX||VDBsota!Jv}#?t|tSTzO$qe?gUBWa!B89!6tHKqraPabe8c4}ubu|o%U!l+PvgHE%D zeg(1OI6Q)fJy878&S#Hg^M3tf8^1z=HWHA8IoB)qU}p`_d)~VK$=?6|PU~Y(;r04= z;W<7s)mfg2OA`PrNkAV!Z}aEAe!2)*bi6+Pq~q<)r-8Vqx^wMG(H#SnP4K)?x@C}Jgnj2`yp zjx4K+cjJaHi1uKhp~h1HpW7DcS#SI>S?9d-dbprgD<1tjd$Ex(JjP&yV6WdIpznCB zU-a0V?IZgm#c_Ljlp8(G^*Z>z>Q~ABU*Wah?uGCz|Gnm}|4|d>)F=N4;Lp2(WYZ(4q41xt%^<(DS4-02{Bn^af{M-M9QxovU8=`rIe*FLeFqB0)?VYtL^V zK$xMMTirgnSz^i8!LKUWr;_P#K5TjiHGqBO*_;6>hrz_u9HxKdZ+yKKFnh=xHUuO4 zaR4CZLE zowNwE;y&`XR2i7}&ZG7aGwS4FqF@nLEm)I-=G4M%I#WbGI9Q&HSM4Mujt`LTn?zV^ zyz@6Yi2iYcO|m`YI$q|I(U3dHVe`)3#!ud^!^$r+p!(vmHDOI0Z9-sqzW_BoVqk+_ zzx4caTyGe8&N@n?0LDeuV9v)za*K`aW(;1qr0$4oM(?KJFJGCK7k(}cM)=K~>7c3~ z+$9-?>KHj5I!zo-2ao9`=U`lHnbQt}W+8`u#TWr+AIcQ8VMHzwK|m4Qm8S$Mn!*Lw38$XBeJowF@8OZt0 znEY_9yL$Z0VP0SZK^qn}by5h)#|})?Ca;T;d}QYz9o*RIj5#NQJ*R`?*y_w*fW6K2 zjl}qkqRwE;Imqdkz;WLk05X`c+8ammGq=;V|6TxrXihj>`UVCvIFq~A-?@&1aT(ij zj+t@X^{Q-{T4yi0`+7lqwL*frk(p$lygdJmU19+y)Ujop=N}oF-H9(->V%w**5I~H zJdV!9<|A``?GOz6CBh&Y&akpQWmf25TrfSV6pYl85cW$t=75zctB+Os$Z^o`k$<^g@uEULgsbBKD?Z4%}*T}W&TF}$3 z^@;E}vYwB>0)XIa7WlHS@A;5XS@>l0EIl0cJ9PJEY61t>xBef*zua@u9r=~p;&b8M z1uR#3S{?}Y3Gor$i(VMT9KgM37Ca9x{ukd{|MdQPzJDC~_XU10mMKV2ZOV~qyVkrK z(r$UkHQ!$>q)4dK=UfhOoopgh1Z*m zIoV#fXxq$Qw=c09C%q*4bG^Vj@W6k>lg{4&KyLiO)Ep%8M1KAq?*RbHHamYkM)G2F zaN4IP-Oq|HJ=LW@RwS@TTxSBFa`mTNSl}bh`B!q2YvS;Y2R;P|r@j6F63f6kWC%{$ zT$_-O%zVx8%s=0#z&mCzC)U7QIJGNuV-WvrmD7)|v27+<*PmeMy8jrPpKBsq{aB_! z;F9Q6SjyO(`6q{PN@?WdAAErvoiRb0^=A|lS#^LlvGWNG`Gk)w#`wAZxDGo(Bz|S; z)sVqEd&%a?KYeoC@w^vY3-s(K{;>ZU1IDio(6s=e+NSUQh3@2wzPypI`qy#%f!-Y8 z9BvK)Spg#>XZKO$1q(4uCHjGs9rW-+nVR#79;bY8+(l2kmA~|w$8GYLXo93?el=*; zhmmuD0X(Ej{^YeC&sy2;u^(fH4OqpYcLS$F4Ly}@;6ILU*DIbmLr}`*(s0ec*Wr+u zqrn*Oy&X|_lQgjBC#v>DsD>@E*Y!yA*2Z*fquS|@-!vjiFd?NrwU&`(7zYot=!nnx zmrwaBzvGcLr~nAUWBLKK7KP&?4t>P{AAu>0lVT?C&h*1;yhDrF7b7aw>bUo*5-Kkmcbz=(`a0ZWXz5YQB z9kJXufz_wRn1zST;HKj74FE9t(@)f~dDsd&HT=x=A1KG4-f_?TcihJBw`YPYTXFF9 z7vITo}Y-5m6^E^g_(;6b#D{?7i8y~Vrq*gRUXXG7h5AGU8MFMKbX8}D2G zd(A1;SFOMHLib6x1@+7gGCS%8j~FuUesjzL$&yPmV4&v#d@lSLKU$+B3?l1)zF`2t zvb2RcPYh!PW4vw4*is$N{bU>-j{R=3X1cRs#}Ue$7rxFIoo@^~1LM z{1JwXZ7;`+gCS?jjfVkxWH!devzbdr0T508m|^R>bRt;j23P7Zu>^IEn8~fn&uiG?#sv7;5 z^LGdikM%Ey9bvChNsmsxxc5bSCiNq~$pt=jNmf&-G7^(5s0tf$Mx?K0O-W_J|L!k*{^>6Bwrwr z71}xAGa+w-7yI#jYc8R&rxzH}W^%>;<$d7lAf!*I~lt zd~9KGUk#yhrVGL z7HHgDN5K69aQJ`>qJ5E}M-UT_nXYC+nqjAIOzr3~e&awTs$a4?oxY4QF!l*B<0IGP zA%}?$9E~`*_x9O%R$7Zk7-v`GK$%9z^p7S% z{w)9v$kiWg$inf2>?9{sCpN)*aWSB3EnVL*W=z8?BXpWEaeu50hHCliCf&ixXTI)V zEd2WX1M)DEr$F-)Xu#k?KMaP>;bY}GI0i<;&7QNDjZ@AObjJ<^{``K|K6wGZz&%L* z*t8BVg>>{D>rff^=0wi$qQPOE|II8t>iUlLWd3X9j=1+(=qpB zbK<=$__aY^HrS;H@_~16NX;E%HkflAo1ydUuxk#ZIq|>c|5~44$odP`>om3Rrx-kZ z`5k55g{xl=3Ivtr-aUPs?RSy%nC{@h0B(XYlLBjA@8G7}$IBHmg8#j=Iwwvz$`%^6L4?pumxP4@>9>@`>p*Jx2 zp*M>G3P;qubhT0w!x)ujrqK5Y5dX2*obQ* zmq#&P=f81CST$lRx)o)Cd>TL@ zk-k32tCQX+v&M!(0-Pq^SH&P2_EIK3afX9KW)Ir6q2iq&r#rM~HcpS8EK2>)YN4`#=nWu${1Fjwt&-ItvLcPVerhK zxKk5)Y+TpG8JEa3v4!mR3le)w{u8Y@*hL+GaB1rQkZUK`5OTu?8Ghp%%N&UrOUyNv z?YKx_Q7L;)7@1jSfeyZ2*_Ig5xtGlA4=%>_Q}62wGB@#aFNJLqL_>4Q`cL39fQ=Oc zZ-~*HYd-PwbnKnK1YnLO>X}o89osg>BcHkcsjs~M4h%@^T47Y|#YRaJ*7o%Jr4B|Q zIP>x~i#Z^}xGzZTm|8iO&7@zk!pZfStWrtpoh)ZHv;Ojo=D+|=Q$kq_1-#7@?>G6+ z{x=WVJyH=+uW=x*LV$GY4kw3p?y=AP4<7mD@5t+<$V?dU;~u|iXuZ_55O+@vl7Xg^ zA11k4GYWq54>AdH&7%PFRy;rd5Z5#$n@_OO(~Os)IU{p8^(%g#XPhTBDvNOhiy@9q zl|fL}{+GlgremMcoTd3P5r~PhhWdqfECx>b*eg>I!g2B&oYvNBHrGFUz+0FOW5Nju ziuDtl&e)DGZTneA<4>%i6ExZN`Ui8kC;z~MimV*st4M^WnHX~k_;Fm6@-iWdZOUOp z?wP}D?Njvd8QD9%WgMox*f($WH0M2-Zk3*Sb@a5g?wt?6;@jvv4Bs=Sldt82vD^mR^Xll;{v_nDe*@r0 z+MCBBn)>@g7i$&eO88!Y8|7Z$yPz){LI9QBSj?*{`y2n}2Rq6Kd*5(9bnITV@LTW&0e6TI z0}A5~l=JVKAh?|SA1vbXEHD|!Kluj$9k`jr8i_`89ca9MYKdoB z?0E3#8yJ?0OxGU{&Vk;_REe46Mi^om+g^6OL4m5Vj}lEy(8bLxnC$E{ytwDAsriJX_L2HlXDpO1*{FMSoXvqN+Jir z>v}w#nvWjn%V+7$F**7Do`pnO;l5b~n`32;>EILHUGmOW2u4{YlA=r52UuGuR$g#x zmLIt^ujHRv1Oc1YtNEM%_!@uZUp~{DzxKaCoX7a^fTy8$!@K`9h5)UAC1*G zu4}8~$bK`kjT0JU+sn@0I`mTJdkT1xW&Hv6&s_flfM4@R^0rYxw^WE@B|#)`NQ7%R z*JxQ!d^jN^Hq5EXOx*2jqpar1bjOP?*!%nsmhr&y4Ng5y3TAxA;$Y$Q%psFI2;AM; zt-K@Vh&P8o<2%`n?PL8<2i)+}p>JTKHov^%YAOjGCfH6T6W0zpOe}n{$8IRgE*`^b z-XNOmzj;efO>9RR_o_oB zA6%Hi(RH@(5=v(lBdAh6joKWs;nO!ztd=iPHiGo}gX|?+8Nnc2%83{w7xub#5m)W8 z{taSHs3m{-jXhjn&VO*~Gvfh1kF z@ou>4&ivP!9oQ?MLv~{^FPCNiE&sLVt`GZbYQns0eXjra*bCfr+^z*3>FVwc#Rhik z2D=u(`eF{sxtTv&KwKX7cS3LCd2^K)0O$DH!Or_z{(o%i@BPD?sC6?kW{I*FvKaeQ zJ(PO~!+9Ddo{>Ag{O^Y=UWJOsGORu7ysU*dshG6y=~y$?JPE6DIrIxV*b$=Pdu zxR6ib)w8{gF5%)+f5~i$Lw@{%mG~o4yyWBDh#{r-uwj|)1{QPb=<&J#Q8<6yjF0>? z26vnXkoxE0z4;4Qc-#&rDLg`SI611+dBem?ncm3~RiqKyh4Kupdg2_7Iu{~6 zs`L8ioFwx%KCt80pgUG=*7hQwv2$)yoAn73WYLR4Dx~RP6FbPeN5`j_YyZdXlKw&#Lp3QEl!M+j&BF6`uD&LIQpYEH)-M>HW!Mxw62zm1X{N zTL8jlU87!Sfc-fsoIhM>1LL)xdOq@(KKWxf=NEQKLZXQ?zQ!DE=dS>Zi+KIab{NE{ zEWO91OIZ#~><9;rl*9{vn)%eNSqqZ*EkG#;N$@pCa%3xZ~U`nSgT2;pE;<< zS%+l<4nOLHJSMnEj$QM&Yoen7C_2gZ^&g>rhYwc1H5f}`VmZFX_z^^sT>r4fP!_ID za>1f}V^6&|+vl|t-+i~1YxodX@LtgNv(SmEGMjfYzd-C?cW7h^RZ^F^1 zaMpw5`wObU8*f1=0u#0K`WJ2p6E1M!6rR#aXo=USh9lSgk61*^-T+H;Y$fs<3|#Ou zaUEnwW9?*~8iUk2pu%ymF*6U@2%kTCU=)6O!eiYt!_XYmkkjn%9KcN5qr|HX+K%bn z>T6yRng0w+)xBh{tz1`)&DDw2eP%=48_0_fUIVB<$G1IZ#Xelt(A=>Z$=ibV zWEs212K<))FLnKUA@GZGtpm09C&KD|VLTRtE%bi<^MWQjr4HQ0v+h5eo;{GI=7tKE z1T=(m<+lxMKDs^#yRR@_2Jn93Ap`CZ#+NMAn~8M5>$>l@&ledhCi&4Z!brR-|&Crzmd($q;l66$E+RMBw>&I zV4Sif0aaeU`owWwl$yK9@F^q>M*c)(#+Kn~zNuHwVRVG!-z1=gLvu~MtcA^dNc}N3 zp#6MMzHeJ&YaNr(Wd+WBg4vw1^2$-Zz+&QSlpkow71>!YeJy|NVAW3~snprBS3o~< zB*qvKhnPJZ(A@iFuYcm>3gY5v0e-^bj|Sjp|JxYFG#f!U`FNp&2Y^|+mkdC)uALu< zB(hw@{YDyk{r3DX!-jMI;9+k(0Cv94U&d^uY|G>UC~SP3F}BQ|oDPOVClLqt8hQ<< zk38`uaswxC0*Wn|_*)1D>zWt8ebaH(U;Dq;6dnluEeKro+x++X0~&5%KJvG{)eaj9 zr~N$J;;%pW!ts1jKyAo(R30;j%ya#NYmyE*TxRq7g^Ym+mKr91rt;Nq;!kfg*^$2% z4etClf5tR8&^UqvcjH+adxpmDg4wqAd7&B`({QfLX^wNmfagrJ{>GHm62`Cf%$k4$ z5-hi^bx4(;H56H+z92-enf3Tv%k@N7!^|8IIA_^={f%ZL``TLAz~}uvBgIEICZafQ z#JT@X1azbpT+BL`%>1UuXnZG|MKeJwJ1o`0N#&4L?u z)6pT=s;0+YHQ{2eLkVfdJ}!4-8UV8(tm|K#MKAp5Y47tFu5_~Wu|3yW{`eb8gJ%ra zAN$F_1#x1EVZNFeE;h+O99*~2xs&0XtUG%xT~9PaQbk^{Q-JJV!6< zskJFaEziAxz5fxw3TsSH`)~o@1h8Wd7bBk(THJ`LYKKB^y4zV9H>& zQuKu|lHp}P5489*Zq7l=UIoj0762O(+u_UsAM-`%pWt*%UktN~Sz`5pYH+18Cf$l< z9Rh0^xTPj0ZY-j_=I@B6XZrFCN;vi_i3yLUIVT23b9b%fGy2G(I=MlZe*`Z@C#=%nBP>i{@7QfioZvrdwQjZMr-2Jxf_ZIbnY#%owz`xFImdp!3?^4|Fm zsNqe>yyl<|ZsA!5eEWlk56~MwI%JkgV=vcvA{^Zy!Pgw+bDTT&wMpzaf|`gK`}~tI z`yOc3H0FWSIAsujDPo7g9-F(75g*PSBZ3+}=L4#M*I&;`5LpBx>DVd01B-e!@JUFg zyzMo~Il&wSbmGW74|myn=rA#adh31uzoxLT(en_D6QSjo`mx_%<6+}y*uqVJuqp$` z6c#%BYpn8^fYD4aM3;}IG(p-9WRh4M;buG=NR@~S3O7`0$yqNzrQ|oYN{@YI?q!dD zzaSa?Tr;t!IlOv&2;>KH^&z+HnF-y~G`R+rpg})R3Ka082mEMJLE{S#PZ8ldl7=iO%e zJPz0q-1fo9^1}#wHTf zcCO_8$X~Nu|KM(OJTfrv3|ERwmz~C7j}opZd;beyB7#X=`vPAKe0T>1{v&pD<06op zJY|Nw;g}c(x%Kc5=()CYGB4wo{N?lT7gkQ!;p_EZ7dI$ATM13SYg<0TOG3`yoP}VK zdah;r{-1qG7WUD=Daknd04!>;pT&ADM4#+~0ZG^63`nl}vpEhf&p+Z3dn`i0^G)C& zjX_##*ItO`NFV%a zzxTiWz2$@Q%-_gI@f=@RSx;%Ddzb&q_0NX0LLJk;Yr+rk*sttrkKCl}{hZ;t^T(id zq^EtY-cIM?3ivMn#MYhM@-Kg7{^^BLv1kgo)-)!K4Yh>gX77@G98!~2Y<$0=c6Q(Pi$j` ztzYs59Kg>t2Z{2rUbypY2pt9EPd|}xEhImlQ*Gw@guVgS3n0-U6;jJeSiNe;3{3YV z_NKM=@&C@Jzx0>?@~0pFvp@dyzyJNe|LJf2&HwV#@BhIcxQnHq-)?L{CN2GfEMs07WQ^Nl~6<4$W|>;q!KVdMO}|HrAm;GFBloCbfI zxp;Es&p78ls@BDIvQL@7H_HCBADjB%HhN=E5aSGoef=MN$?yElmH5I6Z;hB(a0HoHt0U;-FGuH>{EMT0 zpzyKz^yWKbbTso8PWcf(tfEi;!H$HSG6KAL+h23%B7XJ*X==CDj9SRuzj4Czd&zK!W<%H!Eb$5FBHn?6t_TmFx5vI2XT0x3%-f zbMcwP6Ej?}q$O@R?1DtMju?0S9r?H&3`Y0_k7}Fp0)S1qQTMD>`C)dBy^dp3i0FmF z`D-q7&j(rgt^F@Q{+N$hBz9$pI(F9Jc^yom;ncT63}xA`R9d5WT>rI5uBm0A;-eJsb;HeArt7Dr9(FMgJZrm@%h$Ux)$W}xPZov+~UHOT!JECXVc z$)x>P|IL5n)4%iY|BmF(_CNi1|Kq3M`M3VUs3(SgQ+Wm&{fg(We*+*VCB=TbpsH9G^e%9H=xHr%`$&(YiVcQ~E^!xQ;S0fw zTBH|3Pyb@M2XFA{X&>=@u?GV`oYg$mA!r}t)vtX}j^nRt{=L8`fB*eR-gQ5!?8`m1 z(Vx_xk*c_E?lSk&2J5f&=%?m$@y|Q4ytvBEkshGzi|m=bCK}D8dyPJ0Xen|?`2L5S zW*5cFHwF;!LSR8D9{khHadwUWPV&fkrLrE_rN`f~>nDU>WDN#T?^ynnMOw-75Df(v z$PWg|0etD<>>GSutk{ki5>v(y#ZLCbR19wFe)v*I!di|CwHX)7oP!MdsgH(ku2Uu) z%>lDS+%{gb)XMpLso>j~SuY&mk&kVo6R5dl{n0zpA{ipw|-T?SZhW*Xo{LN24{mD;0{Wt&h@2)(tbZnvf>#A77mxsC;3&!zW205TX zEf#A`{rQq4e9ru1&2jL|e?fadF8BKTd~m?YTi9%In)7$;K^3%3)qCG+f@#k|&U+sC za{fyvu9S_Q<}rCeaV8Ag!0x`F&eq9p*)ZtdKz^)058iImcb$--nUv1m?_}0jhh>0` ze{FoMe>n)qxlqSBZ*0%?k3ZrALi5kwWRC{fdq_j zAeuF+e*K#aKuygiq%mBFH|tMr_+Jg^Nt7kXC#IS*Q8O>~-9LW8p*iOe$LjHS{^lH= zLaL>{jJxyJIfFBMnNW<)5fU~w2d>%V1k3e?@Ui}cm=Cx$Qj1K4mo~ z`(-MSII1yqb#2x2`jCcAanna0tV(3F>R(i+C2trhmJ-6cwaCpFfuu4r(iij39wmBX zWv#*?>r%Xur*;{4&k%^QzabVdufMN7TKleRVvxgN;io^%Zr}f)iaoNG+Dzw)pC%huh8f9@~*`Ae{UJ{9wJX^S=Q=@!e)aX{9r* zc=~$-?&TW--qLLKZkal!$I2u}{NVy>BjhwG{*DMlHz)mSkMT^DsN0p_^6B8xCu(Ba ze#`${gcdjJ(~14O6Hps z!ou=IUh40MY=fgI697?K=SdJNxi6Gs>&6qHB@IrFp`Cbq_6pJ2lItD4~Fz6gO74*NW*iE14eVb>9UrsJ$-y;J!I-PzT}ze zAb^_C@x_>5H_&HNne{r5q~a%8YB5~s!O^cD__0$n(lO@R;r$}}G+F3cU`vT$ZH&g3 z2CW-mHCQpR0ei*H!*6VYnQXKF3CXYN$jDzE)tu)1B}0e*aj&^oRT2ZD^gqus^0|d3w~rs{5svN@MHH+ zlfCoTw0P!$lLGSwk83Jr?vd2?xc+fnkgYia$ymSN)q&o@k*_8o<{|3zzwEdQitf3ljHN!Fa8L8&m%9%e7dS< zocyUO6Up>@=g9_f~Z*KGnA&`v0bS~6TgJzLWoMS9RnGuyy zTI(k#LwOHL#dAxD5<-~z^?EFSA_U6}RF{nknp|`U6F4OvN9;3|)&n-~Xb?0%bYmO} zT!Xf4TqaXZ@&=O!j{E65da2$#Toa&$VPc96=sZtN^vMyd;h~;$zc2o&h0lNO0;Cyh zl(6XmQ%n9D4CPe|Yjqe-t}7djbIg45=0(%Dc?$69`?`;Qu6^$ZKTv##V4(w;zFtx{ zrriIsX10;qidavnsiy%bR?O7%C+m+335`q^jA(cn(ld>TiEQ93evD@VIhrudhyGo= z^tEb_Z}M*tG>l`>`qRH_wgzLA#d0s1^A`v24b5E>VSUTL^-ZN)-CxA||JwKe^bh}| zuE@CnU4-_mS;zDyAzqesMKSt{7T+v5V>Uv2!*p-apW}&FTY7K4+yCZrVw~f5c*3NC z-PUp9N%}4S57)mn^GU9H^<<`|=(^^8;Voek=IujVXG#tV=x9(9U}#iEhN)+ZewS0NUR&>$eOn?6!)x! zxdXuiw;$RR&#@I!@}@Rtq0Hc#y5-Y9#jGJ3)0w=X!(0s<-#k&t2%NrvYdrVd=!}!# zxEsRxBLj^1;AqTr7vIK?6-D$Cn5!|wpIr5)c{l*j1{DNPa%v8xL&T90(<88`r46yX z8VbZVV62Is5F=VIa0J+RBvf9O$)&Zi`(FMD26zKt8*%@Qg3YS?H@)8|@&iRE9uNU2 z5D6&o@BQBIefr@)`NL1Y^;^I7=_fz^>8HQ_xBsh8zyJHc?|AUqtpp^2YwsG06;3IG z-@x(yPkzlYy^~Jf95I=F#N&;<;cJz$cVB|jw%~| zFdZXs9MSIChgJb0h3%xPdjyGHM=&`5`)P9W#-H_%Yd`&MJQTLWK);JCQ)DyYeXrXfM5mET;_IIRbf2xunov&v`uRLc1Ras) z*KwJ+EUAsxq%zh(`;ZUl$S*lgjSaMGWu5r5G`Zf&A!(Tt=Ek-k0rotREpn||hu}yK z6u=A=s2s`FF@R%N$9x{{$6Y`5GG$F;qK8E!M;)QaLX&b_fo`g(n|s_gnwe zpZW9`|HXd+*GK!if9HSs^k4jE|GD!pUwnyuY=Bfe`I{IBYl=gf?S^ajZ|;9X$HZid zZ#kahf!ga&)w>tcPpD^iVw~f5c(cgFXzSSdBb1+I<6paGC<|C03|N=OVBRr3?Y!tS_okI}T{Mo9 z0=>`P#9aMtc<|6Fyn*&!09yvn{e@RsumGH;Tw5)&iC@m@ZKs1D5+~Mq z0YelovzhpP|040m%~Xl=;8+x)4@nloE1WSTB89>w^^g0|9gFyw0eO)#es;|m8FLjo z`8U2qW6Fq7=9YoRVE7Xn4P7Ka%m#tRyLE<^7R%VSuJ$pP;S5)CDkhMqE3vm~XkJnV zGuY?YF(tqvRYMEv#8)3lj_`n!;|wkuWZ(b(uYLN5|LFg=KTbS6*?GkeR@lVM$ANZ8 z1o#SX?LP#>=*UewMGa25n}r%{< zx({NuKq{uE8CzW9l9VnNK} z4@t9-ozc{}cFbou*DrHA0;a^_f{!_r7d`&^<$gsE=Z<&eti@QY9BfWLbG4{GIT&?v zg`;qNpGr)HnG|HlxYvK9-}#%_5G87TGajHVEI9d50P^Pg*BYbOIQN=ijhW$GL5))@ z$MP6X+oJ0VdB-p(F!7k=CO#rgPtwn|m$l6`$cPw}o4pe&OeAQ-7+bZ?h4jKJJ%RL# z%<(avT*odPK9_$&IDf|*E*kHcm4!^6|567_9A9zI{F&;P2G71}<&vW4`ZJzu87oj9 zi)Fl4Cn*ExRR8p!`ct3& zS_Alve=>@zV@c82u7zd|35WH8i~XZ<{q3X!v8aO@M=UZ!mD*>$UJbx+Old!CuXxY+ zi_0VbuK(t?^V>3lm&?ogPevcb|Caw%&tJg$f9LU!0A3aTXal`0*uBLrytR9~LoWO0 z1x3l;3H}l7eIl`W=Y+a9^nHeX%m2$4kT0zdYkAfaTQ~0sDx21=U~?UOkzgW4$MLPl zIBMz`-6IlXmv^y29s3Tu?(I=`>^?5}`kKaW;RBXqSysTr%Nqj7+7j0fDUKnzdRx?0 zeeqmFT$OWW^yGfiGmd?OXZst=_ounR5x4g0iLnG4`T=cZUJ=R8hRka~VC=4D?h`Kw zVm5Yk{5tORyOXMT7^unb%qRKp8(eWuxV}FWZqlHvusjT|!&wM){C3@kLMWlbi5l*| z(vkSYK%ZE+rAD#mXlFw_K!w(Mtr91DTVCX^KcNW$)_>=p9OK&~KCwYE<9R*->uio5 z*iiI1s|&TgU!@q=Z zt17h<#?;LL=77w5!w-lGP-paYM9f?Vi!?}uR0%60$AkuEz7;SWCF?%5!FlMO0SC^B zWPHprml8X4bUrKx1S8MTcFSgzCOQ~4Gtl@A7WfQ_J`c&BB6=ix+uH@JX^k^6DyCn6 zhpC3tllIyCANk~?K(FTljDMCa{Bj-$yX(<4cBE~;*8Gv9i~?rPyZqjXQJJt}VRy8; zUE*zVl+V6$pK?F50amu&I|4iNfvWTOK;x+&L1Gts#I`%%ES1e-JY@3%dG@npWQh?} z7b(ZgG__AGOqi$j+LJyqbVl;Axn>f-?L8g~56}AMyfZt2*k><{9D|bDz%8Ol(WM@! zn#uzoMW_+sJyzcr&BE#ZKY0%D0>eqo;dLk$!)R>D*qLycH>4cDM(yoWX5>LF(=#v! z%lak`ab#eB)-biFr+KYLX2Ci%Aod}YS_{n_2^wQ}I$=#&4zcyu{pU^4?hE{h zHk4)(Zc&UuAd(~Y_Q_h8TfR=u8yr{uI*G=9xV7-W;`Q7dL1mkI+3uj+^qbq(d zGRAwH;E5k(F05Q|_9u9(1%K8%yfp_%V`Yhe5xR%A7TCzswR##^q<69)^#M%&TI0Lh*uda|oaP1`-BG zoBSs-#(Y6xLBrLR(jniZfD_j2ocuY^OrSb?r;R}ec<)eAJ?cw`q z*6ZM8)jNKT)O&~#1N0B?(T@(BTW`VP?>N{UGDCtvE5OX%9ky0W=qKFm)BQ*-+_p;7 z+dd{f8k$2t(zjsYKk6@T#cw=AKh{6kPE$kZczv$*@0t;f=DnbP<6CU%V1Tz$Tk&E8 zhF`=?EK3gp_2o60d1FU?aCCQG|H7r5v0q$8p!@4J|M)FX3gecVtvZSfd~`~zEr;2n z8>e+V{on!R|l(4Ui`%_d%+nPKm1%SFM>433sir) zDtXWGkU#Use{*oMb5Wlq*u21LF$8qyZ*26o!@$F37yei!{=0fPb<{~HQ^%CIWX*%v ziNBv;a0xOo)UdH6^)+NP>u650bI<*ibD{Udv1-mY|J;iSBOj3~7H-SOwU`(0BoJkK zbo19OZ7-Z8EcKXz>HVX>XP^5&s;mRKbxeFs(!f!3XG|&7FLku`#jkHJ;FVlbQ=5(L z9`8}}b`P4vfD%kBz5nO>g5E9kGSoO6l#RJc90>Du{`2NXuyQZ8txW4n|E`@J-|27v zkL+)ZkNj`_?f(*wG$wy+y}q-~%y0Xz#s}nRxBrcQn7$o;81nZU0N%Y~ zcg24x_^ZL;bZ5srXGMDE#|asAPG$-fbuK0p=52c+D67hF=s0ki3jYfm=;n91f6Jc> zr`Bez$4h~Znp6L~^}^KtSbs#k*zn)E*G@Sdyo)q@bME7g2eYHW^ywv@OfebSfmJ_Cpbi!BN%*CYkb7)MF3-u zF#`}x;^bi08A|9#Ag0+?2gkFM<@mzS7>3;IX&HLmVjV@8cK58X*dI5cBwp-f|d&G=eEY796a-)6u`re9>|Q!KJ7>>HbiQ*-_yC*s7N zdIbg^yt#6&2Wa3Gc2PC4MB->4+nLbJH-W@EACSpgo&rAew;(|SJ`k>p#)*SUjwNn# zFViPJfgDWhPag!~#gCBQkMlst{KTIMB)-lAL)hpz7(YpYdk}CmPRsn`XHZ}*=wr4f z2VCM~6nn_-wLz#K0)gR91C8Ly-1#_8)|h?5LoY#zi?yffX$j=V2E}t>dM(Db`Cysuz&**VE)_)LM4G71+ z*S|1w9QisLbV=-7v(h;C$&$g%PL2(S{^Nh%A`^nRn93qxU&2xD{onl4 zJFN2ut6=1x^FP<4=o$mFUP>K@_{!_PrCue$1$yI;AqBrWq&kJc>B=7mJDJ_w8WY7X&LkmoL<`$2wl?c7&<6O{VFPrbWQt^6Yu*2I({FMtWcy7D61 z`yXeuzWJQ}A|Y`NY_-M+)W$xO9PMLV<1iF0`qs1V@T0f6a9eW=icPQf0{>z!qsGLci^B->KSh>}H{-y)4kz7W}~W@FV}(ye0VI zhQ9Id`4#V@4g4+t4^Gglo{#mJ6WJ!c@M%4|mwfej=Py|H^=psJUd`H0fL^F@W84=t9&4_?7fEnea}J4%Ec>5c6YK`QKFL2=dB+;ysUZO6 z#+Y{cOV_-MLr(rg(#E-v_frVR{MkuiJdhM#NL*A^pVty!St1`y*-m9ZaC)Vl#Pe<$6Ga@MzF2a+}O{N#ZI zIX{4+b|eoxN0-`C;}Ka#u9+KgYl0PxVG&n|h=_kHw@1FPO2IvGd&c0Y-PXVpW%U^IU7V+;06+%;3c7_^`1E zUJM#rL(6qoq7JMGz;daMUc%Ww8DmN%a|P%*5Mb|4V|4{Q(V=-dZ^JeQ`1+Ypm1ZNb zZbHUMgY5rc+1zVjIysQDfCeh5%6Gq@E1Rpw!Ra`dO9vms=B5Lv*;~lNT}oCmLWwu^cvI21Tx64S~V8cY7O{zM{I{&7ry zKh{`p@U;euPq9DOPrSvY$tA59udHF#ALXOo2rj(0`G1MuNB*-4tbf9N%fIIY^>|qi zSLq9ftKO9LdmLD3+6~ykxA%r%Q9fgTZ-|@9M;oef+MClXzQ;b>#FKv7X?x?>rv07Y zZGY>F-QM=!^8ft$^KpUS#iZhM(sr*%Lj92Ermm4}{dZ`w^^YoTHyyGiCAMJcEgl^g z9BzmhgU#=Lf$V@f(CZg`E~2ubXKp^gBcqdC78q)Vo25F^kFV7BLn5(U7p}+iE-wDG zZOaQgP%c?NVRUS1`SJdSG*dj(Bj>+8bTT8CU9>V#@ce@~`I?xCNsLTN<2ZlD_8Tnn zIWc7ox{vdu*C@_KzQGJ9Tw7Q4`TxqnOl$sNG6tC*eb#?}!sVU|R5? z#6Wd4{(3lzQR6!!inu@0f`}1fqv$r8e57gK@wK^w8$u)GEERr&lE?N5Ddged8u4ES z$su<5Q_J~;k-S}Ro(Ta2;fd#m0~Dj93&+%Uf1;keoZpI%@vH%{9DCMd67qRLOcKJJ zkv#KI!J~(8oS;8m}^>a^&GpogtW7Dw)rJ zFcUvt`^{gO0O71Z-1>L+1CToTTRt#q-p-2{S*wg15lpS4r#e6iJ0}V;6uUKkktB$IL5fP5GfFP% zuKh22?PJ0ai)&g+jEDR=zwt&ao5ZD;bnSmBG{z1+p1WnnG3UPqkd_slu^9`T-~KN) zSkSyz)hC`%v`&l(WWH1cVjv;coDPX7C59%JaXpYN@43=!Za>7}NLHtq3^uln7h591 z-T%$&|HIz7C`Ym!$<@e}WVSL}nMuE({m}h#uKc)%=c5XkzQaqAOLB66%FGB4k4I)b zx*NcloLOR^UoB2NMV?rhYRu95X#C48zj7c2N;>DJfpA zhxaOg1iI(gkMv!CV6?bM%^OSmeg9L`a_PM7bLZb$SU>lUm74}xv-p9xKT#6z$c14t zyqSwtbIt|g^M@>_9%q=ua{6=q@+6Zr&HW2r>S+ICjd`vM#F-c^!zuj4!1E9HZ07u% zI4l@xyZ`hb4Al&C`1G$aIuD&|JO5dM!xupir-SJjx;ZECO+mbdFq%>64002M$Nkl<>jwYwwND~H3)o&N&Og5Br`cx4 z_CJ2AKYQ1k7=@ud@lSoZ+Z(R{=xI;9O5ph18*v|g)*sgO?eVYtUEjat`ul$YXpwtD z(YxT?w6kF>JP*$WXJ1vuP-9GIzpU}1E0!L-{t?S}{y%M?<$L%<^@t~%e{JCL^(+6m zAbhC57wJ4a*3b3kK@d9j4$sNDin9KOc0I}g)Egvg@AdVX>>EsfC)+S{=K>TLJkZYz zC^&KQCmn1q#PVnFzHs%TRbOE8U9f-uE(fuY=Ws z)4P#R9~h<2zR&&#LaaN#$=iGh!nwG{!zZydI@kv!DW&Dy=y}7$|K$=G2dcP~Gj{mr zrk6OzzvJ#1f*%4%M{g{1+VUrX0w8Zh^dO0;G9)JtlW-*#j$JFWn8;Q`fKo#HZ<(u$){>aoGbZ94MJo2)IWOrpBFHU z%`w=S;>!N$WTG+7`J&E|xwr38+acK6s8{n;2jY8j-|Yz?>m^Wa^!t4tA*C^Qd&( zb5D9W>@C7xP{j&O_W$&fdH;9+O+GNt*fZF!Ph%t8;S48c-mh59c&KcjxUGQBQ~MCe zcwN7Y*CFTc^k8-GSZ`?I{~++*7VVNTRFclsfhUJNQwP}dzdI^*nft4QaAbHQ8*?}R z5iWnR6)veo?Q!yoF+})IyZlRx568@i{3n^6ul30jwA+@d+I5MVe&BFS|;`sVLk>?A&L)>>fdMj-YFkS2w{0-(MYxK}K^vD4>ECt@QX zoP*%Dv01oEk#!QA#JB}%nMTOmB=0yin*3EuAmDj}fIfV~5yDGWJ{#H}1p0Pt)+&yN zy#U@*1|}Ekm^#FNZNl(4mit?O$#23{ys1TVUa^gRWBJa1W1**=HL>7hJiqd9&0IgN z^}qbL|M7qR!^QhE4qXWPE?Q-#>&9r0@E8|c`vyn9?7NB2#T|7(`}pKTQ`tuSq`|I_{-B7YXR>*rK8Cx6#KCm=E%T(dcmxrj5*1tKS@4J-pJo4$~vrwQx} z#`xNNa{+@JQ{yEYvlycqdke(0X=5jL5KN+)qk!jLFAqU7?x*8J8!Y58-@O1QPu>Z3 zVdlanJuhVD2I=^?$?{+Q$?|8 zaqJiVjWK@g2FSVoC9O}t}c<#1}2It>vRwa{}cPxeNC z5`s8*k?tn`UjOV0Gq1k}`U)1In&Qixo-3fESBR?s!99=8OK5t1d;jY=)1>04ktEjU z?_LYK{fXkL3G;Cn^StR{(fA|}f%w<;@86|3_rC)&mM}O+6QTD3CD63K;cDytHvrR7 z6jA%ycDaoNgfDY1Mhy~s-+YKa#g9h0)JMWNjq5dB^+`_+<9q4=MDVV^xkQ}jS;AUg zLI!+_9lrRgY=QoQgK~fCuj#hO_c4Cjuk~+kU|rO)>-e2I%)j#gGuD6p2%zhywPEve z@^_W)inA{G==#L!IGzi}f;{+M3w)R|WJ46gykmN|7ysTL!Qb)yJm0VUfA9Kx@67gL zoFB=HfOXuTShAV2#@Q)4^1$Ogw(PL5Y7p`;s)<}(TB@1WMXbSg0p9@4{^zM9Aw;2 z{8=~ZKM&eC2is3zL_)j~!!aaC+1qLrEuY43+?Y>5=@wST@{Y^!*x%+P6X!2K$$#%N z$4vmI?bxsINB4F9sYxQ3O}6+Fe{zR(BDPou0(O-#Pz!wIm%wV!w8Ap$5or*n1=pfJ zR3!SeGUTJi_aBmBu?8!vq$nZP&S5I*y-cvH=&ipB6i zoN|pFfY#rr?y+)A{RQ(U*^U8S_k6}#&3#Tlx#~Yu_R66qVc9>DF1h#ddHw+(dkxL` z`?(@>%1g(&Asek8eZB*p~Z z7vT7Z@6MkOTz%G~9sj9gp-yflJ$LDoS!|nQIp~QMRGu&5I?-mW9i#L<=S??$m5yIu zBh&Y;XE@2qb#Sto!2+Dz9E-)4NWf$oqM9I@`=!MiQ~&e+Y{+5nyqS9up=P~e2lk3r zr0}lmpT^5n6x$X$A*Hm8{Z}JwoK*byCjfN)bN)`G$s~XHZQ&m8G@Pkp%6IRVp0XBN zm617r#gaWCfEu#4=IVISDb9pG4!Fnh6P|pfdvN8^0LoZUyZpqL-RR&K(1*`e3;2k0 zcn?U!qlEHH9hb3khaO2K3JLCI#KKARZ zWg-~%tmm`7hMb32d^g`KpVJmkv(|sj{I53vRyC9FBRm4!n;^pi8fr|V!`uVU_zSjCi?tmB$`8)rK(zT6G_}r)yWA~>JEu{2n?sdSw z!HA+?^#B9Ut5IXA$Y1~RfLvsQg<_@}#z$iC+MzpQvaDQ(z4=Q-KP~Zx&!P$nSjoN=2SZ|v;KsFnrQ6qr zu^D*XG^gTU@-eH&+gq)6?|trRki|dkpYt-*zI%JiGg|R}L(uqZ_bvWq|6O4KqI((C zMf#O!aid-VoUr}S_uBvChy2U5bJ96)zEr7iwnnA^WY8BC_9l_**zh5o7c@TkI&SO} za%|`Nd!GO15u^IXX4Bg1Ty$iIa`{hi@-KGueAn(Kv3s15H>x{-)bW#2B%T1Fl@Z)D z8E^lZBkv2ElG`wT7}l4se{h7+BZmp2gR)45kVa#E&*Q52s?mF`)H_ZA8Xqif=qg7D z9|DtWyxvVfH*)pnQSc{}wO;&~;s6_X6HLaei5t2FtZ>(4)-JU%N%ApLb3_x8wHnud zA*gAwCY(wt4~fInuzj`OK(2{&iihhR9LZnv(HZ}R|GoY~bT1NuIl_mnb4(~Zf3K}P zogts&CIx}oT1R25ay~Iw&mR=*gD?IZ~5Ss{}GPqoj*Kn<1@)hI5DmKKIzLd{nP)Eoe^21UK1ty#Q#bE!T+!PRbtif z+W%+GKGj!xzX8yPl%HO}(;4eM!O+v53-n1Jt9|UnWW}eQ>l3Xz__3j1cm+_|X5FLe z7XK6fseqfxqfhyL(m&`{>?^+i!ub;;`Sl^lxy<@>AAFg=E~e<8Equ9{Fb2ZKvp;t3 z3#Wv6M;B}S3pc;FW%P4BK@o(SU25##lkO+V4OG4V^6wYxZ+jX0LT)C3bZ22-LY;F+ z3SuEX%M8p|INX6FhW;2eV~G1XnZGlh~SO` zV#m%=Y0Nq%FX7y*$q1ePVM-g*=_ACW9r$6x)FX+;6CLo61=4!x*hn4lLuJ46SDyCf z1HbGXY4#3L6VK@C6`QUhJRPSdW!}AOW)A9b;~gW3polAvYeO_NAZ{|irtu={n4ac0 ztD3)r*3VD<1hJ3s`lm(s)P%e=$EVL1#uy{?nJu6OTk+)w0Q{?45j|l+6_;3$ZQ97}r^fJlob?AE6%{)`OMdbd9S_S- z%|`H)uRJkVd%$1wpnd~x93`I}XA7|8j{tW4SEO>un8+$4iixxZ?D`vW;9m*NejR)7 zztYJJ|HRf$-0gMf8mePAmWYN=LhB0}eq)Jz@VFW}_uc>H#5v=9YMS74-iyC4vQI7% zyJjYJv_7ZU-?5WJ#OuY1fWddRf0){t!!`g1YpdhX#6o9Wz)>V0{6@uV z$KL;vj=h-B*$B7)s2zC_7jHW29|pifZBA_RM^KYdK7HmVJ~r=)mK_YFRX%T$g@HIPEPBUpNz2`!A?H(HpSczZ%iSGd+UTDl=J*=-h@fZhc&5_ z8K$0o4nySfmk4d*lmn z&pYl#rX|Y@nq1sT5*JBU_I!;`Yy7YZpiRnrDb@tmI{6}L9R%W$J{&d~nZ`%`u{A0t zv5~O(TOT)x6P6ea)`B>&(dZG&F23Xe8!-^m^#G)`xc+dRlJ6&S-7`?FCY}jZ^aKVg zHX2NvNcc+Ki=am)mG_1LlS(;ZG+UVAJX%q3)9(7mJ@Wkt$Yy)zpIVd)z4K`f#91Yz zM6}}R0I-^CtKP|35bT(A|DyrYUx~QtBTCpx;T|`9qwsh@l>wsFe`YzdZ{-+O{Ae)a z{vM_42bUDaF|053rCqV0cOV`J8vm}-a2qj(E4;vS9DkmC33!3Gz_vSr*ZL1%_igEq zkj<5KRrCpe^32}b&JI5#WQSNfaoqOQIlxg*b&!oBYWWM|jV~_x%@cXz76}T8ZuIx_ zal5)_{?GdCL>fW-6<2BMuW(jA-$k@s&majr^DpY!R~6Dv-W7f4-{DMs7~|)RF>e5~ z{#JF!t7wJSV{}^qY z>tG(q)VtC1{HHwD`eWq#RdTS~=Efy$I`c;1$giqSpOXYv$FRnflUGDF|mv#3~`>o07xgnqUxBju=s^t zkpZvupIz5DjGI-@4Wg{G6*YAT_|IqrBDPN)@X7u04!dI|=fq%yW#kW>eKs`3;Ag#q z937Z8+sRM*N~fQj0@UUe2ps=|PJbkAiGbmS9+FV4e3 zuIs;9(>ND!nGa8DA^YLy#b$r!-RB$+SFEk^acA4X+Ya5a{z1*racZm{UkWt7$3A&P zZ<={?!&r-Fy&3=@T6sMQZzvTtNvQE4%%?B@go%ohzy48M=LSaKCzZ#>!JszEdA^A3 zI68lGZy_eM^Fh4p48CK?iM5|H#HO()M&j%zC?*wo-(X4f__1akwtu+UZ`2SR>mR(= zP!`B5g8|@lwmd9d_p=zq7k&M~iiEmAd>L zS&uvod%hN1Ub_j#aHUY+j+?{M7&+9{oyUideO^UaUx_K}zxM(;M+PPF{AtedcyucDruc$KaORz0uvav_MpU>0 zAl5WQ_*y>T^S>~76!ohV@U>!La zE{L2$(-1`oKSMDe_Nz{k#RWCOCb-lz6b{We0~{~$WR38`^*`&s-3ANeSFQdD37-B$ z0x?F%`oqE6>Zo6HX#7ZngITjvz&O$zH8+;L0OD{kvD4J^wnSE<;$Iv*%I58(E-*!9(%Prw%yD z1vT;ZB3<8p(8S;JgKz8-1N8&TLx5jD!$&MiMwu|M4@PZ~#%>T+<${hJhUj6TF3msW zX0;9eS38DFwgy$EzKAhh4^o5MH8WnxzZ@=T`5vQG+KYqPBg4&nu>{{LvMdS6%IO$C-315uWgX_aZ zUqIt})Z_8)vShL|pJ>2qOs}uV=Yf=XkgxS0sxQ~c0Ue~L+d315n#CtEFvhEz`Waas zktCud&$J+(I2#sX!-2P}4nvP4Xjly)6#z2^3oQ$8^bzikM zoxgA-GodaIn@*w-*Z#$a5s;=kg>bzkyYLfZOm5!B_2dB?@*2m{I(m>j7Hp2uH+mS5 zv^pLd_*|D|S9j0Au6fRNh!%707ExlTpPCoH_oc&Ght_QgjzRZ4y|bd`8r#P8moy4l z9b;t71-E~ji31UD2%~509E70vIC34WG=9$SjICIB%OoT$TZW7uXMfis;A;@7f^hq~?>`r4`* zW9K&hQzS_`A9d%!XPr^muOsC;7;sJ3o(X7_>YSj!#!Hzm_i(sWU4MLFFHqmaX11D? z#*56WqzQP&n0c)MOCGnWf#1-@uekwqFiEUAIyLVB3^F~B*ZKn;()K47hoW+{ktZG` z=)C?K<_$RZ03TM+Tdh6;aIB00xmkda7v}2iUvk%HdKCF1e(230u*P!$>t?}>rLBID zQjD#6Q*C0WrRI{6>+oE(3bsE{*ceNP{T(lSTZaDGKH)#EB{p!>hWyU>%TpP=e(P+J;nBzqSM%FOs;)>w!n4b3RPniKfd1&74f922msEA*z52Boaxfr+9ykJPn#n5Z0gZtrv)1NGP z<6y730kWKr5V=r?|90;eXXfFc1{e03*=BBWmOxAMMYn{BW^M*T*f$qvh9PtG!YBX4 zXkUGGh?%~5hukSMc{KmdS!JX5i#Cz^lLd1@wEfQASAwaFf(o-@8Jue+-rkt_TT%&B zSota5uANjQR!pJj$nB5o4-6jbWsG=amiz^_5BM?6+GW&?cO%_c~}A&-siFFBaK4c0NWJEMv&@O?3VAiItBSj_iX-0*A-(VVXtI zVCo}F*Tf70toV| z$9swz&Pa~qA!dl(N~D95&0O7;|3jUcZ5r3{;l|U_KXlzMTRje5d0@!ii{7hCY^Ou1 zy5ClA5Mxrlp&yzhw%WRhWN`Jf_z0s-nC>!*I$u5q2-oRf`jz*@zv3?UT9_r!;K+aY zT91q0CX+zTC#_DMj~Pc&ed{^%=9hZ)jK`*c`q^`zk3-w8JT{XF`L`rs{N}E~sSIpo zX5VLh=9(qtI?qv9kA>o6Oz#=8@bnGI&hcUl2M;E~XYk^0oN*;P;Ttb+eA=AEH1JG7 zFo@h#Q~yC)WNPsA{0BnGIp1xdaZL?3Kq{^&x@Rt42Iw4AOf8Vymm29%)55pc4u6=N zKM>JSH)JR^$Yiv1gRWr$p7Srd-dDYaBqB67)Zly1!v(VH0S)*R;nHH>tsk4(f#aM> z^)m*~dhGQ#u_N!Fp@j$=+}GA9alzU1$zvo0kV(c40E@Kqylvj#8|SheAyn0SY#NRH zm7dtp(fcSe*Fin6y`vGr3r*4z)j+_C5uL3o9Nw6<2990etYNH-6N!B{nlXmkb!Pud zmO3!jL;<*W06J*>`er-K@SQ&afXv%Ta$*eM#DWZ;?lm~alED={1K~6|*S~v2+R5PE zOSN>2f414bjM^tw32;iAnCql5r>=pV#|K=zk~mK^Y8`*aFGx9ncRbb&WA(+*|2eIB zxBo}XKmQ9rt3%;iRb(Acg`W%T_4A^Y;OF|^%lCWjU(x=`f3G>k`K{~kLguW^F{X&u z1=N^a#5}ZaTwvtIM8m~af)XK8J8wwL9U2&JzJoRUT)4r|YS$YA#K31u$BhKo=4LJp zgau6x4-XT6x_-oM9!g3Uha6X1{(BW^utG5GIRws--gpw(@JvjeZD+O_9#q)(fpFdM z?Sy>BZkwCUL6}1dV&G0p&SR1v5hr)6tv970P}$$fi7gG8Z6atq^@l!heuURPCG$F= z!^zP)?@c4l1vvMLIa9~3ckPUaue8FhF+=-f?+vK+VycE7(|)Rej6LIr5+pQP`+A!vap5##(FcwK5K&#m#yi5ZLNcJwL5t^n9*b8sJd>^00Nxr6 zU-k9jY;}Ia>b4aPyuh#*5kG?yvhiDF*xs zfXT=9T1Wgr2hGqD+uHw#t(T?sD-+}I_@X=Q38-AQ56LVLx;Q;pF)=rt>qI>BqSS$! zFc|hDnEnb7hE_`$>Pc!6j4U?6)-&GJ1UTdGcvOb?5Tca_T*m0oy>DiT(Uj*^|AuGl zGOS4k&R;_j`}~6wC;DpsyFS7Zn;l{voadfuezxW@GJC+^P>@3)UH{V<|7n}%uAkk* zy?BumdhpyGQ{$c*% z*KrD9R?=BK*@ym{LVAX|^S^7#)t9zwnOK}Z`=17PpM}PUMYc;X^Hs(toQiI+lwJ1`x!&kdi9Ew_^JMJhlKQ^58ty}14E5n@ zYcv{OoN_aEGoeQ9fuTEmgbM%^I|k-i_ic;|Wc0?4sxm7)F`NCKFSrv(b&8Uk?W?wm zA>jaYHnxycxjj-L2sCNcF{?S*c&x)!GlA=aT+*@*;45n?#tN65=iy;Ez?Q3@p7nA?vB83eM@qtfR^<{U^unp$8BDW--9|OKa*?EA()LRDK|#jeh}Ie*mtx#Mt&6EZRYg*|YwL&qkJO%~6PZ zJ@9r>YtThoa^fKfMVM~#nuje3EgwBuKv9_oONf(@EdP`DazBZ+Zk4w_4#XT&2^_gG z*SOP>b~@;#ex*5@IWrb+4~B5MUW=~tr;rKdTqBQq2)KJN+j6Zn-6 zxcb!aYOPNbMp?y1dc;=gVB%Y7p&^(v;Pl=7{JN5hW0)p#&t*jwv~i)miq8o zg;UV4S!_5?ri(9elmxkPI!GAT-PzGa-7CY`O4$0ZfCRtzjX@~Bc~jo{8DkfJ@hhaT zk*(`39LRlOaJ1$xo%11nC2k)VEXGucwDb4h?aC-JqftYT1@|=vVg0s8Hm&*FH+l_x zjrLe`dVRZ^jA^*4o_WWozArLIZxw}FaiWlE^VirJ=-@hY|AWI#-iI3uv9dSlnbVR7 zu`?c7Ith&E?CMwkOPc)QFqh;WQ-R6Ja<6{^=)S05g6bP8j!#@(3)>$7E}sOLb+v7M zJAZVE!2@un$R3Fdz#7eRNPvt0#FOh6JHrtTc-M7XllPoMh8B|^d;Iqe6Clo8gVq5q z*VXn+kVF>$Tah}$9p3UK$Ki?jI#x&jRcqSgHvUcg75XiE@+U@O3HFoTC2kOybi4w( zeSYM-;j{kPpAVI%FLy7&S5{m0DV|UI{}TEC>%Zxb0DjY+2|QuX1%K+_^Jj&-+psFK%QAedzxKb2+n*+=P7zFK^k4a3Db(2t=#4iQ zxWSwz4tqjv{FVvihio>&7mdBUe{HL1(eZXrFZP(>IkFB|3E49Y4{0wfkfJ~)92@svfW_%y2qoLYV0<;e{C8_$`$r|oB{6-K|G_nR4ERta z#jfA2sBcNvJ5=)KVzeT)NEFlyuDpQOcsZP%hnc?ZPyNlZ@k`#g+q<~fff#mNYigBx zpgar2WRwjvW^wG0F)-CUQVkxN+C&}9$|aiE2_J{X1BAi(Gj^gtL}-5-?)dDd0R$4) zIkxVB!H1iD{r3!+04a?ko?Bz`2XVB<0io=|i>)|&O9gHPodyM&=13wGmO8hAI*xgh z$>ZU&L#Wa5{F@@h{;Q+;FlKK0aoGLQJBQqePgfsMwzpCHUH)qH5 z1ySSLF?|8LLS>ADyd;0sxf19Tym0f=SyvZ}3C(Fn9o(5T6NxO&*_HUQ}5B~_@ zEBXY)wWl z`bT^(z0Ce9`SYsNxylPnyh-{;x9Sx0jOu}CdyP(jMCkIbrvsN z%9Ev!a4?9GDN5xyM(+4*P^>2Udd9F~9>Ux>WlhdU^UQp6bM#^i_dw6}SvSz(@Qq5i zVv-ev1%%fRe}pQaW1X1SSa3K}8Tyo;5ITm@`7@Y?&c3OpxfOwou0Qf7ko{l-coh`( z20uEf^QpSzs7Ks5n}0Ndyy%9n0Qqx#b91#lykln<8lU`8cYg>gLH%t1LBSoW*-ZlS z>BDTt$rt{OH{r6v{tDn!I}67zbNj-X@M}L2-stG@LfiXn@|O~O4ksRi#jl`=B^>c! zG6YFdSO;Kn4ziG4IT?7&15JZD(PO?;1`9Agx<0KprYk<#KHdA*d=CDs+7V-ib+`z| zVS_A=L>U*q2lmqZt6pX{!YrCru>oiOp&pCrDsKwSzcDyUVR;xuw!+^AJ65}HWCOqe zUwyb_Zc@qUAN5}jS{GND;O8)5>Fp0RCoa3ttT?m=>EeXJUzWiKI_A@=ewg79NwA281e?syl0 z0wMj{xlerSZvyoGXu8CwAq0{YvBYg0_)B(#F_@SozO8B#s3?MrVN%pRa%MmEx33Sb>|vm@Fk; z(DheNh__>~&;6gMWW;^kEPx=^FqGUuOSXh8_BSPM8^I<+I>EGzRA^Rru52 z$j%;wF9P8Xe@}H;+JEx*w147X`rEzhe8yA1?O*m&OZ#AX_v zFCZ|7l+{lx#9?zCe1kDWhePj)?GEGmJn+0|Z9aHA8U?G zcoQ&XZS%+YhRNafCp>B^%V~ppC{Ei|BZQ7o{fxa!G)^q>zc9cZBk(egtvW=OJA4ii z8aZ&AGuEJ`YN+lZ;SGSPKj+QB-NU%?W*agzJ1V=j1i4!MkBO%`I3Hy5fK&#~)0hba zxP+GKV1ki%{DptRhl24*^NAL`sdeZBA2Qmyo(!S44T{qN^RHSRn_K{FDr4ZWg!Ek` zKqq${X3;_*ydjvHL*i*QMZA0&BMr*pF=RaJzy3g}7YbuF@O?v|@`>m2WANkfh}Rq7 z^pA7LA|XAzy%tFHCBN}t$JfR8@ZafR?{)3&d;6*1R{%>9;wi(iUm8>$KMWqzjgms9 z{iBaQ9}a9;Eiz6q(?cNPx`$0skQ=M|vv<7=21_mlap#=ZV2#5EY`s>3Ti^bjYL9hr z1C?tf)1JRpod@87rY9<1xHy0j;om_qXM#SslWL7GK1uPB!-AZH6OJF?rwlCa-4qwD zeLqFOSl@k(^_<8}X$ z&ieyW6YHSn;1Mv^_i%V_u@0lQY!3ZV`Hjyynd0E!4IEFMSTLao@2dYQcC_%&T&?OV zjB3YgT==Z2fAGELr7*EH6c7}Ej^{*l64}*^r`S@&#)eo4gs5xQ@q$5uiOJF((`CEx zCH}4bgMayIn4k1dKR=28mH+4UpFaZl&5FDVE?leX#km1heY@eF3;LLUvj3#tyZM`Z z9{xV!@AP&x*BNmGKF9Y8;1YbY|D^wz&*hB?b!raGJEnh6UsnVIa!c>{Fw+!?%cPqC zeIKNKL6b5!j@XqV&zeHmIQHuXJiJ^l!4bN7c@aYzZVaT9&voIPN1FOYzu;&74kcCu z;P})>JQnKmz*QD};n)Yqom>$~X0zO2HYV6883P*o$;J6ge%7tL?J;4T|7R8!c$7B< z^O#QKKg?YOP)6?t zojHjNf0|Dn@nYNUF8OOS;AiFEM;3?FARx9totcDZo^h$^EzZHy`+%3&g$CX+QV zxhMZ%iEq_+;D_tDV9yGE*2;F>-{wF+sTiAaK20YVzO(*GclNP@%v|aYfEq8Nsfh-b z5i5Sy+FEP_jK&Nh%|MT!ZhVVF`p5={nx^Ti+w6fdqP695#{XIDA3+_>?cS2OQwzyW=2i>_h#He5T9h z3EzgX)<$yu6gRzJG>IcJj3f6pVCuqHJRzO_mveLP1H{b2=h(V|?P#kE>)xxcGk*aZ zi%U(cS~q{njPAtRWqlsrSANL!Pxg5OzO{fe*GZgt%=KR~-S54tCx-aG=`-haGS3lZ^+DpZd&)@?SG8NH?)pc;?~s5vGzpBT;Fwn zfMa-8FNyO^_Kksl$7N5W0v8UB<|AS6iOf^BXo)hF5=NrN`dt560yC~d7R)~45jNAT z9$%dP^!NS`%gUeiAL5e(#;*UUB?+Q=Fxy^>Iz$tkJ;={W($HLMSLEZ|`9tBLWQp1M z4Hl0Qjy_(6@cPon*mfF+C$9SwG1y#sgCLwB0IV^xui6KEscL>XgzpAi>o4sK{#6Kv z?34W`eG1x`Anv#c9L_xamB0TRz{act)jo^isyt0e@x8iMd9&U%>{`=0~73Hd|)}_fh=ECK7 zbWs}8TvZ2woWE9sHOa}WAGziRj#?)C!4%qF|K8oQhG^G%4u34NZt(lZ#Be@)EH8*B zR)P2HW8#V5^Hbi-zY`-M?B!YiB^#gAm_t6ShGT;0`ocluA`dqJ{-H-29OB78U_Z!^ zq4Ni-w)ejoCM`HY@@yREaPlwrC`N+lhT{Bz?;z3WTNuZqk$NORY-g)<6n z*59_agRg#UXg~F_^SA57gPrg2lF@MG1NJmWGra`_8}Uf{6ASopEPm(=29`hSAH6^A zFzs+^EDLi*V$aSwBm5;NM&SY(KbX2+zG+K}f3_>nn`(BYWAcYlzxV0_nZYH+zMrt! zMstu^hj`rUA5L=+hFarBWB=m6eq~0OKPo7e&pe_e1i|gcV|Zqee6p`4Hg24F99Z(S znh+(d9s0G;aN=*hMMaI8KZYVj;?eld)PYH?o;a6tPY~=_J<}mHBUi2j6JsM{%j9HSs644aWo`Q(r$W#`0rD04Y+zL0~`Ezxa`WuZ5+yfTUILH{Xbt zX&ClVa$>m7e=J%5qK2x1t~)($;wru_CqrPo#{Rumae}X{27JYT6dJ9$tV1wki+2IZU;$5+uRZ#RY zww%D?xyRZizwSQu<8Rr8C3I7dVRp3eAnuPzyA~q7?rm_ca9A7W**ExUjoK3v5XZ*Y z6XARP&ueRkSpUlwI}->`FMjONgVoV?T>ltQ$J(~X`yQLkwgg2g5LS;D^NI^QLS^LZ zA7jhW?3VkRX`~kyDjm8C5k$rqe%c@YB>{{pU-O^&n@dKqnc6zd5shL6|~A)@k(1A7b*K{ZE9{M*p(^XP?MyKL?mf z2(n46(3*MZnV_+dF%CfcnkDwBr=NN8FYS6B!%l{=0o(ikUIWKB*FU&iJNeoF)6m2% zW@@Fc@U@=yu>Ihx_y0&8t?ihHV0v}n;Z2NE&zRor(SO8`+3p~i+A^}g)};Q@W0Sqp zoRM_wRakj6EZcCH_KHt(R%PMuaDL^_p8ePVr9T2V71De*K`NRJu@|U?UVYa#>m#5m zo*vLA{UVyd2mDXR_y3#!L%jbm`IAVm3gp~5&s<#Sxrx(`_4m*hD(SJ|J9m-kF;JVm zho1E{&{)Q5$2dc6S`V^qGaeera~WpdU_xP@;p(ShaiHTs!zBjgL%MwbQ7`(Ndhm84 z85c4nnOi4(U(otu=7*c;&p2)7fEwq-J^$x>R0MGF;R!=z>eVGaO&H&8fK}L`4kLER zvo<~XsatvLhrDyMyV*}3G`{fCi8cRKfIToMff_!diHE*f>tqQuzkY zfc6zcLymXj$(X9{$C#_Wzq`)=BurSi1J6)S=Yi7}NXYnK81~rFw~I z`Q%=3^wrVR#N)8kn_6gkO86Y_sd2}!bO37V-(VNpC1fE?7+evajUh6*w zeHd*`Cd?iF&@cViE$SMq0G4J+JoqBa8_?N#{-+$cc&-1y6Mt=|cm6tDp@@VSlt|az zIf)#8U;o)N0vR?`<~LRNoURUe2rsA2ZhveTh$aZzbw*s{#E{`bhQBL5ppsXn>7$w9 zA=4Bt{pkkkaRxXdo8S@i%PM=wo9_m2qex|{?dI ztdREbtWUtrE9|&&|MUY7kimGWv9lxxwbs(>4_2?f_x-<44E1`%Mz-cO*%hxZ4%QhN z=eXk64yLvKmT(xn*t8qiHF8`I6Acxu<*?OcRWxzQ4o?WK3QVS_xLwLddD<9fPe*S&e7<>VuwM8LyceWe)As=$tGmgbi<=s~-wB>GCMS0A zzK+?afOE!kOD3{#Hb#62LUiC`9{(Qin|nrwJ-OI78vPR`arZ~EmMc6CSM+g$ETi?7(KiZ?ttwpR2sq-k*R zg*&^9!Hn@6TjFaBsfEm9T7>(}3$1JmF8S~q$5?SX2C%s5tawRSoBl*c5i5W2@TfH& zc(VVZYYu`2moDQm;)YCy!OR#*W3q|^oFQ8N#Dv7q;a=;4LL_}Ku}#dq|2LPc`%rn3 z8Qc8f!GSXBj~qCjICWUV?d3o6xq@5K3Osld!#x462NdhcnHU15BaYKF{t^dAS@_s) zX=*g;urP6Av9ZxPkMHa!AjOw#v9Cesb@#Q%xjuehe4z}f=pd@byCmd zxM7V!I0@~B!v<{nm#n}IxkjjI-@qCV5XQdtGGVM>x(|?~p6M5@Hx_Y|W2HME>}=?P z4ytQP8*IwI@jmz9fp7eSEHg1&?VK|%713}})fXZ5SpZ&q0wvyc{V^#y=b>TeJ+ID) z2QqBOr-pw0WYe)n1}J%W;=`Co#Rya+#Rn-FV*AQ7i`OJj$4xGcfAbLAFotl^dEf$Q zWL@eX%87E>WX%COe-h1NnZ|hw>wZ-J35$3e2QZU=k5T5F#u1un0r^F%?|=3uo#f#2 z>xaY?ysb4(xH*Pz0E;{G+Bto5N8b7|qrOAv*|q+*$+IBX^0miz-@vrYwIbFdwxfP% zsJQ)$u;bvdnROfo^<&={3&NPzZB&efDC=6o#3W7)cANt6NH?V2=P_m7?)~5AANcK? z7&NHg_UPk0Oqq9V%ZRQc!4`v}K^KSmH+`at21bA(bN#^3yq&JQ6 z_yNB;f`1%uciS}~sJ-%;0u$3$?S+R!-wV#*hk`2Uzw-ZgoWF}hRw{zNdc)w7gdlUq zx_S+kdv)KXju|+9BsEqPvllpMeDl-*b6WRK*6S2vsiuQ<>TS~(PF*mrm2)w*h`8ls z*^CdU;EG@TCqj-;gw7r_LlB2C1Yvc5BR^Om`H@_~)X4RZy3*(7jb!Ja7gk_&iI*KN zh|@JJJu=MHQtyn{5oL{y8IFWAd;a#j zxT(J|gn%r4FjpSve1QSS#IDmbl&Jp?wPTjPzj7tDTlvV@{N8~VS);bX9YW*azxFxh>lnnUJ9mP3vGWiX>@eQnP*;SA}@!~%=d;O)yrXgsI zk9Gf1;I5~y1xNhYj9p@i9p1c8MP=8+7XSc207*naR2ZKk6Yl;56V5oq*7p?_L^5nH zKE%rP58VF<%B|}kpTi`(;ZRqOF>p+b?N7be14A0LA@MXr?-b*RDL)c!wGV6mk10ai zIfskRcsr>d98UgG)_Hoz-WPLV$$M@9AYecJuhQpz&^@u+{?o5k0-PdsSa z8E*tSF6E3JeDcoz7eHj;OU>~|3m*pcn-~o?;y92lmC;wOcj2_aus$uu-+FfQ6fFCX z=f5rh{yTp7$CFgA^~X>BQ?HsYdGz?IExpyY!)NBt;|nhUrVGyChk`2O@Wtnt&OQGL z|IYu4`8H3Wl@Y4OfxYhCMXy6+eGwL)t*m0^3H zkk!=-3ppq6tmsF7H7)(C0#Cq?{Xciq)B0mPK9y>Pua4=zYIptrX8AkJ<4jWh5wQ%t zCouNL8f+rhgqu0<6(i@O#xz$j^#;2)qo&kwHJfvgL~`dZ+gyBuZB1~%zq})gLF^cz z3+r$<&;~uWKoud~YCvd~Ldk#^v1%NddZvTd-!YVfylntnt?bGHtNQo2OtlR@?|8?q zx$=AMm{`gUSUwzskFxheiR>-JPh1gfY?#Mlm=~1Npa})M__E<9v2EUq&hOxd&ub^$ zUPEOWHzf1pwt(`L2!bEEYdhmJcCUGZUUu8*q8%OVv>^6=DQC3Qi8lGWaFUd)aTqaN zB5aIT{?OQ2JO;Cb8q6KM+zk*2{&|W}&%dm{=(PV}iyv|zPFlv}&|UVKl^94Sr1$^G z+({M!&8`3>Mv+~DZT{FB_-M}GSB!1&VFw2vvXOgQALQ0281&DUobBIs!!c2T4iouH zr>|Z6a8>S^IhN59F|hYnZDcU@U$rxsI*(0jDch`VdSD9eVicwVt$GQI{uPL$UU)BY?*u-m&1*axN(7iW$b+`M;qVAWk^1(4p{^Eb{ zKNfSH|AJwa`+wr>-ycY<@UTx3Wk$MNxWIKBEvfB1&scb2IsU1I{w1bilk;=mO+<1i zjztq6#7^;DM%R_V;7k1*sUur4!ar}=3t0~L&hFU%#O6dqOHr&R4skS|!+*F8yAKJF z2qou8Pw2!F8Ob@FdH6c(odgHxP6v7#{-=*9^-OA!jC;fL3N-aM@8KT+7VG@i%(WE8 z@z@b@dc`J$sXscq(_vyd^MpHXayBNlSara(>%ZP*u+UYry{7m6mko-QWc9xq;;2$Z!mVW8uG0u>}2$y;lI56j|jbA<18{kz-~ ztoRay{l_UjzG^k5SF7##Ph>=p*0o7aHqfCQ%sU=FTULht*{Tb^=lYp{WwCrj^q4yD z=3s*-;K%;|5%c#?0L*&6>+`I~hk0xJE#I@=_xirrKk_{+-uRp>-)+b@e(&)I^>3Pf zlr>UA=wG(b-{QZKLM`+76h$OeGTJe6v|F*zP?PBRu{Ke%0)>% zMp*MA)3_XAY&eyUVUh?|D!Z@BG*f?(kSc8eR6wi0LJT4M4tXC2;ag+FuLDuBE1eY{hk0yyJQM4{YT>dg}F}tBV>h5BQbP?#J$2EZbSREZ&2VQa>7H;d?!cN_N&W zAY1}OCwoGe{ePcN!JTV?9+Upfi|l_Ko7uef4`*D&hbC*U8!Ui&AF&-gEG>cKMsT#o z=lCW6ZTdIn$ySZH^)CuM`QP_T@kv;$F_R?gi7iL$ z2-868VBFVGEVbZj~47t~YG3P%)f7KvA zRD|Hmh5EgwF;tc8zc0uMvwLA;PQ!OsND7&-ivX zGUg+Q*mC&(gpb39d-#Gvh#C1H)E74Nh>wFoi7#;)GkBZY0HZW$;(v0`e7!;PRRDuW zU`?vHmSqozW-G=FGg~1xNT3?d^a2FwN~g z>s{Fwem?R&Y~J|K`OhB#Oo3XgeKY$p!8?OylL9~D^G0it(XlY~8SIbkf7ajA|JrN~ zuffcUHGu)B@|8sWPcS8!cUr(KQp! z0gONUEjB&&D}RYRj|gYU11POM{PRS=_Rj!VX>fi>V`%?&q8afFzy-=4v}6ipKHDLk zc9;B%7iBMJ?d|Muk8^iP&f9v zcd2Ihr46nzA{i$;|AUL6!{?A@ykej5Q%(4!hNJm6<{^-Fk%9C-*J9!~A1>^^SOjg6 zC0_hbT^D|Er&uC9(VC|x5=GwgFHst2z|6&cl^36D|G_!nqlOj z%$^aZai*4vLqOAu7+HQKbm!kXhff4Hkj>OPD}Szk;#qY`!FQe3oM7Nf-@NwupS4DR z#*B?)w=w%71hy}krKfyw4=!>uD#l;tzZMAKtHnoHP*Ro13Lk2MwsqD`$f@HB87;D7 z{YmlOAA&$A*y6?RnjnA*e~M@D_Kw|PCmdtd5 zI}m3)B*`Zbg);Y|*x*Sjj71YuAa zvClZ^PCOFr{jZoYzhvm+XW2V6$P<&N>rj8Q2bnf2k2Q5%_=#Yqnrr0!zcB=p`ty@1 zi8X!vBXp&~;mWH3Z+10r8F^$}^eY}sgG5d|CqJ6R*k1`~{#MvqFpw~c|BgmC(s22h zcreJ$P}P zi!CQA>zj9Y8FS)NPcGD1sn`08V!dPQBIkrZFBn{6SHlMr6U84FvdTQxBz`qOF-vA1 zj{`u(!>zG?ku`RCy^r>b*7#7FLH*oph%MCan?Epo5J+X<+$7Hf&ddqcN*gT9awR*P z4gupnZc&-I$xSH`A)Mgwr!aNqc$k1qeRd87HIn#cHZP_lnB+9k7i+oR;n%qC=xr&? zdR9QfzSytL<5G5H0^aS6zi*}xuuvTNL>~&~r#~kJ03k@<+-D42%{0S9gzO|_%eOEc zLzUSXupLMqt!-sMf39`&zx4P6J9}_>0<^r|L-uQ)pK;)?)VpyLtmLUf0g^f7W}^8t zVx%Rm#It^aU@##wN(Wa+2IbnnuUIZu(X`=qDhz8<-cfrMHTE*WKlv|s2gZX&Fvg3v zcJRcYycfKt7bkQR0P?vOXp}a5o&dA&9EpQ`8&7HIyZ%^|;?zTfyw|^RHe3zR)=^;~ zg4d5&kA<}HGrah6sJ%eIB8Ps#tKMpX9Q_1FJo9=3v>USBTIUKm=gi;|!rAkCDD9^l z$d+E%%bzL3Mb>Sp@61H7_P<2&cjPi0=Ea%5^5SIdqljbdCrGcA=BQbI$2cYyc1&Eo z23dxK9jpD#6zUXr`r&9kQ7fO~tj9Ql#k%;BS3P437Sgj-xJUYz#D=H%(){=`ASM_P<00QO--aME& zRc#D@8i0wP0~nx?zJHg%Yh{j*CdS#*;6&!@vCo-cl77aJ^$p!bckX{Mnd5?=WU&=- zG0^vNEg9D*`;)Lfd~Qo_aF13ZQ>$vGmc=;AgkU~HikH^=4(tj7I$}KYKh==Q&RxdI z;c`Cu$V}b6HF?E@seJCTvW*SyT>l&$-W(I8K?yLf&CuBC)j0Mi8W=lP?*sCXL|@&H z;3wDuQwoWxgM?Ps1!#w|5EJ@ZhItY0F<)>aOAs+FXS&oS9zW*Qm z4Aoj02P2!*lNcrvCGDBHk&;I;I@j8C6vzoCph1o7kv~+gcEo2Lo-124c7b}iv-8jT z%{2!0aU8lh^lG>Fx4%z->--nrGhREn4$Zak-4Q&(d+~kJ|5waEe*<6&zSjEd{C`6Q z?}EJ(zV$y}u-pF0|9Qb53;YV;*mZ1-mpj?l=Gr)&ybKN!Ft@%`^tAT|eZ>2)|EuIr zU=36oB%coFVuGqIIZS?@G*=MkhSJo0>ioh*mnoq7KJ!oJ9Ong@mHd%CUEE~Ih4{=r zH-sVKDbIv-!U0vw#a4Wk*|C)3^CuVJFs+Hk{*hIOfKcCkqJi*e_Ag_6_`(a1n#07O zTQA8``ppx`v2{rX=8l8x`aqJ{r&bOU!g!;H`P~0W!z5EH@M_I@#_Oj5;0!!H6JxQ_ zH#+>x1G4i%G)93IsGcDWV0j|Yag^?Y1=5=*CU$rFv!s7h0WdT^;KZEH9~=Km#iX#7 zz74n09()b}#Be%p=82CHx!gaofXo`D2y2+#Sv>QBF-yy+F6oImREkVD_z*wpEnrY{ zPB@ETvxlT5M#n<98Iwwy25}wwj^Q=U>|eobA{id}>iM=lbX8KK1rbh zl={)fq>{aO&oB&k@*%4<;VH z1VLkxk!y?h$=^e8j#CHAJ;4aIWsz_kf8Z?CAzxP60*JmDFF96csc{^VGjGs0 z|9P|Cw&5~vGD?`@a~u z{K~&IY33D;*0enGDRXuL=qfR_{PFLhwBXv%^kab=RYwX z#;&5P;~XL0bqy~9*ArgI)xem=gW?8gL~J&8S=eyp53yQqo_ccyW}s?&{bL(wBUrG+ zByn=fd6eKFF;&3c02Seh%GqOp-V=R+i=B+Im;06f@V(dnsI7VG=Lo#+)Cs>ZG|F!?gVV<9{P2RyXN8(5oV?#*2M=K@rtO=ec z1BYPC0I#DBY8ZaU9G*TfLBV+cgaGWclb3P%Muj1*fjYp5a+J-O(KFl)<0wPZ{1Xeh zh3}vykaX;R04-ddG%n9mvlwzM+7C>olWot5Z64m-6BUoA4W@A_((x0VtTnetv5jih z4jc6LsEG!1T|=1tB^el+aU6&(wkIDDmwbfvUkv))Al>Iya?J|{Fxc{fI~-R4X!V^q zCMZmj3!0~Y%f@QV9OtqBt)25F-dOMW`O^FFG&k2#_^uk|1Jyndz}NI<3c{K3EUiR~*suZ(GAOYyS+o45RuJR7<74_BhwpV-4g zWLY1g3hy&M#5gC{=sZQF`L;KiDS)jIapLP=e>T+aP1UlgwH-}z-RZCS;GO7 zD3(JDMv<6_|6F6n%?XOTz4O2I_pG^|u~io29giZCxU!pzS#7`Pd)wTSa?}6HpS6Dc z3cy{iy%>LP!Jd4N`NtJ~Ziv6`0{+T>*V~&#SMUA6pz7%2krxcvA70&FuV$(D#ifE{ z53Kd)lUT{cw|<1xl(YV9RLuOKJTj(|JHqx{=SG^E({332=I{(qkTt@aR|vEiwn9o^(ik&+(!O$a{4H1gd4SdX3@TqE@2jIr0Q z=VRCL_K)}E0^8XdR~IV#20x&5zz5&`m>TJbgE`s8Op3kxOmu^sBk}`f*bvX&!^nBa zVOVtZfS4Gl_gn{JG|qy}Ot6PPIL{_4x7MvZ3xg}Dc@e7txU9eKf7E0mD?Z-i5t-dT zFxv;@3p8K^7Gkc(_~s!VC>@Umj>m6c=>^pUP)zbFpZd_5^E?EH8o>I2cF);uS^n^N zH%={14#v%Qt?UGJxg|K{>WtIaVNdLf)0nX=M#}DqtOr!{JfI>=eSOi^1h zgWAPVnsxn4jQx>(tnt^{hixBM9i3yaTgyn?qa%OV3F>wJ`{Qs`$B9VqxQVO2Z3)4S z2avgNVe+vvOu9*SrgT}SgWo|p8fkGV8*%;T{FO`g!t)IScvf?qnvMT(EUja;j#!1s z`pXEpa1LMkM+9~&Zes@F1%P~U}M^`T%-|CpTZWxmKKftSP6TH{wdhm4{0^?_x_^k26oSHQ!; zWBMk%0Z;!=pYM1M|4{9hm|X5O&t=kibKv0vF)w6kjA@1nD@c8uW9N_H)ofS-^CHS`*o7R6L&vt#zyGfJW2ljsR{?Pk|6=$wWB)m zfZxT%0P(T@#$ir;)zdp(Q`!a*dQxz+VCK%>M#2D?wUWp%4p*H*!O?t!BU0jtjgK3s zcw9aZc41Nx2(qAJu>bug&#FI6#>t>~#e_M8uDRs)f&LiBZ;Vn`{Mb-<2G}#tm;xK8 zY5$6PRQQ(A37mKXm+D;qm7dL}LKaF8FYeK7|EZ%rB(Tv1(cI9(k%s+l%dDcR8~XsR zeO@Zr7$zH=t%Cs1{QK~PTwkuW@pYV@n#6V2KirjNoiTKAgiSD!57$;lAV_~7nff&} z`ZJbLHK_28_Z5?ElC8OIBNJPlri@DwWSnu74!dw!xewJzGO2Cdlp+`-S(s@cD!v(*)`BXyS|684uBe zqo;K&>-sp0xz#D6%;xlsw^JX&*KyHWLo8!NCzf1M$m@)$G+f(2pyRu^W?S6ub3J1Y zmOlC0-7pQ6F(BOPzH|C#e!@5w^{Bf4m>7y&gOy70ixYv7Bk6eZk}=tu41|Uz^cxTe zz|Hf5Ol=LE!557<;DaWOS^(Z}K#h~2><{E#7u!jGbHwMa+2{VpN82ri~Iw_l`t8kr>H$YvVP-m-Ma7X};f5XH{598paY z4A7}xpx$@vr|elBwNLv@W?K%%mXJ5D>Jw$hPiga@%p^7D=&`Tfb5X*N^`e&JtbfKh z0u@Afa|+{sHzN|NhkgF51Xa7*qA&2>ppe z<2hk6!saemOzopA^bXGc7`hJRz_?ob56*aoXw6l^txx?80yvp2wn+ycaHP_ZB{QD!LDcIrdl|MS1PED*o@c4Gn)HF(b19uDz95lM--!VO{ z^3*M|9HZHITZpd@9C2Bm_6NfkqWI(8AK2?Vz|Ds|`zaXo-EWKZWkyok?wE1Dss zUaY%e6MV*(dTIYD{y$GvI%&9BNAvk!p33Wn|Bl6~U z=WoZ+Wtegv8zNE9`6|xLyRVwl;n|Mj+c7dc_=4md#CETP*8m&=o(%=x{KSd>3fM#6 zI!t6t9m34_e!^c{rH(AZs$cPGN;*8jPic0e{~h z$T-gl-H-SPpX1Q1KLgN}i63Cps1aZjKN=iu_y%jtT+q<$Ha;cH_G?XrXh;RyO?_1f z9)J$6q2j7)?7Hq`6w&}{$IS9;|0_eD|D+6UP=@Njr{VsUIe#i%>Dk9eYjx&-qB^b* zpM%tloP3WWGPpjxK=vAp&yuzmmrKN4+^&x#%|EcNvLLIJQ_Jqx7=%mX>{)mgyQxyC z>=Ext6K2N{N%Z*HcAxjZ7Gw5Ly=FgN;BF3Y zY!+1CwJ_DoU$u$nxdFR5deXf3<)AhR_2n_*9t-}J|CDPN@LV&Lop%+z2Cf@7TitZC zWK&t{9-FS2*Xq!k@2mBVTt_^BOb3v+Sg1{U|~7))U9IPBQgW|Y`c z9l8}J)YUoOWzAr?hqrcN&#|%6qaTauCl)JuBLY|6+>D$*QD84sd6+DI)q#J_x910D zZnDMOYMvm}cS(r~*YjiP@s0=~(2Jo`X};FSXw;ZK>>W^j3cnZNU-v= zPvvi!t%OC3aU<5yxX7OIZwK;gN6Dk(#?e|n?Sl?Co}wQP1VrOEhje~Grf;;hux#b8 zm~Be_MWq(r=NMrx5O!xwl|gK}D}UlhgM!uw8&e#M)8`Ep%(>@4Zv)%!L*qH$>>PBs_3R5G32w8%s|J`hQv(f_tbIdh zf8d|yXN`cp_{mkg`H(8>TH1!-Sn7LC%m(4)7arz47wDa<9CZKV3mGjvlkKrPD-hN} z1~nR&D#;X=Dz;_$+-XlVVXo^j0= zpb&VkHDOHXwf|%vVskN%3XgYwJU*`a6I^8uHYB=IOAHBhu1x2AXHdNU^-pf^6*jo$I7KM6g~*YSHhO#18%FqhEr7j3 z-DmqvTn*&7J}`j9Ik3-B8zaX}8p{u7;;I{H=N1yp;_S8a^a7Wq8VJwLFynC@dErX0 zrYAT5o9?B@DehBqp9ClAjr(@~?_YmD0C3|^?SH%MKk=t0U#a=4_5Rg-pY{Auzut573oh#A{_J;UyCb`n`Ed|T$~k@Ks=cuq$nb6en^_*@TQg3Zh1sVCGXGbUds z->egBh)!CfwT#4Pw-`0;BdLaC~9|rB%{iRqC=vYl|K&$F_BR(sb zi$b8=*Vtu-M90|E=v^KGK|QEsDvL8{vGvQ)IpYHem9V6GKmWPpj2}6TBacllJ5)Yy zd*>ex3^-xCkMthP zXtObkgFZ9n5XWBdsVF;|bja~vI#KTpQJ!PH3oq2Jd^>eqjd`uqBiN4-1yFD>HO=ilgT@`v8-VZC4J!Ny-AFF&!i zU3R%Ig#4^AMq_Ru@Si^sz|K=8;!ph$P>(pg|H)|Hsmu32j1%W{!26yU!^aU#lkwqA zk6Y9A5Jl8-u@|X-uP3v>%S0y^G4t&m9Aopf1sL1mo>D2>6s`Z``gfx6J^CfK#xj0= zH1BtS>Ir{}stv}@zw^Jd{)B(}KkMO|cwhgmA$@AiWbXX$T>tzMz`te#e{T4%H}o_9 zY>FeF`};?B=#}t;K>pfZ(61A|@Qr0WTB(DBhrsiKi~XE`ia(r=dBXoG^`n;~SA<_K zMntTBxXK&Y2=c}qm^tKf{cz1aX67~ry6t^(hE3mt)C&kvqL-WR(v&A>BWAF%N07E9x&Ic38*z@kcV|5zNTrKWV42a!1GT` zY_v6aqXLzS{pZc1;`}DXCe7*Ayxxat)gvmbJChi&>ueCAabNuia#(e4z<|J*8k_D0wKkYJhKheHb`mRgBoKt_h z(d&pHh#h>*g|k?K$-$_j$tTzP8XnX+m)c`NA?s>WI|^%q7BPHduh~nTUiBxQruG1c z^l;}+>HT7d{m)ZkynhPw-YiGBf{@W5qQk#=7BCRycS~irl)$~%$N1U?1MM883%`sQ z`fO%O>}WV20$}TLkrO<44~6U)kxn67>d!TU?f%7iyIoiPTxH;LV$yWV)_%Dea_ITz z`my)ZO8MTp%m+^jg;K{?*E9AzdLkXi93T5X7?O8x!SQFan_AzExsS%l!mdI6?Ne?jl(0J+fSdT zG)H+p`xDKHaF|b{!<_QvPt|GEe}d#a#mME}eLVlQ9^vouA9XmD5)7PVxi0LG8pf{< zG#7)v^WvZWkzz?kyC=-xy$)OJu%)bP(pM1>Way`|c*gVXM znK&nE{e!nHxp-JNpC8=jx?;hqHour@Bwr5d|KB`K91S?LNjq2u)MoT>&B@=N)*!BW zl8av=$AQj##XuH5-G`8$atJ2-p4%Dp1+;-5S;CoCK>UPOiM=n)*r7deS2UY&+NggejPw7*8Jei?ppx zGug@ee1*owhbUmdWYY0jf9fNT^E;xodjW&~$Y!1y2ZG7_zdFgqH9^n0rr~(*zjYWE z>>xlhojjg+2~T>^5gf6nH@;B7ZG@wQ2&X-Ax<>Bj$QyJ}`wQ2`>VX3IqgXh?h9{ZO zMXh`9x<}aX2Ll27VItWWV;q=HG-o<8wBi8I-{PmI0AY(u1Tv>ilUs0vqOZw&cezv}`QJ$wC|rhDMK%otGop92t?4AOXQfN4gp zdp~)i>hLX&uT~&B6<*U(PA;Zs<#OyHTkn%&nwU{Xp8IdfqpjCAF%vhnMU$H&U+M=F z)Oki>`@VkFtN(mWx!~*vTGMZ4?ILrIU~DDE5|WkgerA892Y?UeyQuMu3bkrCaLmJb z_P=^Yt0G!|bcP=l{;M0B5fS+5j@NSrRU3Zp7i*Y!xG61gxVvC}dh6WAhMhW7Kk~qG zXl(r*d)c;%m8^F_;&hDmS>*lAy&!+zoe|bAT`Di*fO*f)*->?q(T|Le7-T2J^ ziTd4qZ@zc@JHr$IPp=<2x>2f%{cNx231UC30+=-47pmkq*=N4{L4X?=|C6 zEkF(jd%VA3^*m3wAh;HI<2`V#Hs1iWh7%8CUdXXA<7g)Pfjka*^}uwL^WwZgigJBC zR5@UiADfB6!hvt*9f9dTU%S>b7-N}pz%xCjR^gz{o}|Yq-wMs_FnB#_-PM3jUi?RI zC4rs1?t_->ug%jx=e5OFo#LmL=O7Q<8tE6Lb{|%LV+8)xfX;lRT|{++6aA?_?H69X zZALQ8?rfgux)I420Q0N0PyE46hM7C2#6VZrgC*$E1y^xM%j&gJz z>#=v;vAD+7K4Y|Ie`$~JgTXTQhhCb51~ju?SBESi$KD<^vH~lk_WN0L*v{;0-bNqX zx3ll+f7`Ww)~_74vDaU)+crV><`^v1Q)pvbcbQVbT>pyysL1^4qM!BYIu}9rD;I=V zHy;@kbnEhbkxjiLZtF5lR>?H^#J&6DsB8b7w+tNxT0KeA`?S|XtY}h<`RD#~T)psQ z?q?Fyx8F7ipZ=r}IPKu1gF3L$$5?ze4B)f>uFjeOD^id?6R+q{%yTv!9zEZJL}|6JaZj0+|$agD|yg{B|0-s)aqjW)Pse?E%WSLPv)!WHjD2t_x+CrG^eCK z)~O%1_XpGiB&###q~OLo7xlCjA?yQLTVrw5cFl=3Bzp!yBB+1JTpOG{WG@9K&AZnf ziS6?*5MLphmbV0q9LhTTA3?1P?qUVgR31;lXafX3(BA#+{U1*`;63x?3c|FUrr!MS z9c3}8Ff-oyt;Qj#t5|aI{?|WYVETFQ^@r*oJ-;088omPFqVd1+zw3YJc=C1M8J&&# zHBYax{Mme_y-v^kmt&^CoA1r{j(=x(;#=!qS-*b*;GOmluV*8C^=40UVgGT0K{ohV z@N+}&W`X-W+8D+ot=ymZKW#ZlA{D~g{t$V!b^M=LKRrXUA6(L*1?xwr#}=O!eet1Y zz}JIqBkRJizj?5Ae;gEt`=&3>+=6DsZ$mJe_X|Rv*MwLuUd>Hmd--KUqoV;Z3%9W> zb?6Z?J}n?jh<(L-p&(q1%?*hmf5W4NC{pLaI^HMp3q#B`nps7q9v*D*=NIST#en^M zK?DM}9=KTNJ9^CW0=c;gd_>7;In9u`-b4FBW(?SwFna%mXVjll4;*uBv$WRSJ<61` z!+a**?|hgj-h9-W4+vto`XUcUGUZ$zk23MT!{6J%T^)}4Jh@)@=KA0DKrM&)&C@x~ z&gXh_n1d2ockN@HrB(nix)hxZ;Khw!qC_9!L>F`J1Y)e$SeEIowU6!j9U$l(>Aa7V zd9fhC4bupT14=XKw(-G^g=edT?Vkp|n;&*+sc zmcaVn|Kg{dM?^xyfSj=M0;WT?oc z4(OS``ytRA-cLb&r)%QK^UTCzC7%Y%nWc&0)!!L_ z7-xeQc)mIw5d+|w4S73I!m#N4`hu0$0{h4%jolyH5+w6XMCK1j19eGXDSO&PY;J-y zbwA2Cb(jAhfql9!2IsJiO_SvJIPKeh;YGT@%kNY)D zkpPp*{?t1@ERk!UPeV*DfAMYTMS$ZY$SDp-XQOlX>wfG*5A=k-66Y^~Bz8MQr;f6?kB`M0hA zH-8CWH{gPt(*G>Bg|IT+Vmg>7N8gf(tKTiDhYP34R+0h6&j5D5Qd*n1YI4oBuuSa`4a~_-r_Qr(T&#&rFd}~c@SN+S| z`q7n`?8kQRLdr%;S@KQ^#fBQxIfGM{`FEP_10!Y8iDz5LcU(Jm<0e=Is*@vW7Sbrc=x4)zy}_Ruo_wDh^p5yvu3JIRsD0*ojpkH_sz)DkcXddEVaV*^Gu~JI^7Q}M}y%e#6L$K__Er@i3cDU=6#rv zBgbcc?BL_~^9_y=#@MrLhS?X+#~T>o#;WikY;4EjI4@;5qMs1I!PPUBOds_JYNpah zuPG8U{Y-vd^hCN}poP~24#Zbd?ltM3R&Bh&J>7klt?x)m!AQJmO|0b@@abq@YHuBJ z>imS;Y*E!2TA1wf{%e|@;c8MH5pa=BQAAC`)Jb4`iJ@Q6=DEY{c{F*lfg@W)zmUx% zM74s5dG^+ZJ^8(a-%~)TzhCWt^%KR>%Azdw6Wskv?xGaXhM$c#PvTEKUR#6RbAp$t zP9DWOZ{V|*Ys)oY48-K9ey2BC0-os8|KJomB?PC%)&XzV^3EHO{#(ijonRqPer&>f z|JhHNKllGc$_;ApjvYK*cQ}weqI8AV{?I+ff#Q1Zzi6>tBFfr)w=W{{%-edL;t+h) zZ$EW0`J(<4D*s)7@dUD8tdG|B8VtwD@0ASLqn4Py!3CFRJDf*EK`2tGVd(LU(~5fBqd^!-&>*)){7=2*XWXOH zq?b8{m1*ASBBn5yah(tN6saKlHyAoub`QY7(kqCW48p+GxmYI?STo{0bK6)~SMtU( z=i(4%fs}9Q2IFCrzmAnEGXD{_A;4Q2R6K zFI}~CM1$(^wJ^zK*_kKwRg=A5E`GunT+W}y1~E)9C`N5_*)$^yme?tAzm`}x@H*kAWEj*m9dZf>@E+q*R{5&k@ zv6U48#A@V@*`B~mf9_A@S?7SS^%G~0PW=G456a|~x(grMvmOgYLKA324!mFC*S2^g z9Ro`ra&Y8;97051wkTgr-;lvZ_UCsb2Ik?^Z!O}bi~f$hX6KEPz@%p2y9<2Ej1K*I z-p?QaW$<(w03JPyccubUH(GrV!{Is)CjEjZ_;{k(u{IRnQCRa0cbI*K4-{_&e1+&m zjGvD1<#&{<|aMNIVhAC;&A{BOEt7YmAZamHTB(Yw|e2M|5KGn856@MJ@TGIBlAJ zlD^60Pzx}xvi5==PY2hpAiuvLSenq7fAdI9t;$Z<;CuD%nY)k&lzam(mclw7c*Z;o$mC4v7 zR7@vQVP4{r+uN>rN33M=F_U21TX`lngX|lDWuwC(@ZSHUzxThFgJRfvO< zAE5G(Ex6#}NZr#z4A+4&@D%G&>!0w1r%s2lj6r1E7uS64@8b>XT|dFit*&jWGC>o6 z^96Q#>H1}3bf1BaATrY1y6zrvEq2eiu>(_;@W{%8JB(wAu3tRaE3dh0TF@@f9e zGhrG6Pj$zt+2+Cu3WG-5`9f@7|062qL3S@X0@>%E@xw)wD2?;|F9IDv=y<2gboa8o7w9Ugg7j)orzi9EyKb$Mt z==50pu1gTCRzSS|YhM|0rv8jaYq(~6wt}uFv$@Q{si^&MD;%-MAN}k>_J8{}P$Z!% zm%og)#(p;MZZ=XtO>wz$143eLVj$AiyJ2Y47VFR8F3H%&pTZlP|m(@u%)5 zzHxtSyy|m+^li-;e)2nLPoMgzG35sICa!kEvWQcC~;KmbWZ zK~yW^++cpt-PZ@LGHPDHCxRO7SvnKW!zI|o@UYSo&EEw`!d!x8c%B-wR;L-A%;#Z; zMC_~~pPKxFI=PIqo(a(a7rpKauPws( zN8+#!{!wS7I@(XZ%+A@hW*KPiCoG$O_T$uow}HY>Pu}&X@>CV=)c!t%D*sDAkta`H zRHzMm|6R6UaOTJUFTw95S&!uK!rU6-o@~i!lPoq?H;Z1YWAhj0vw!H9zIZsZ)|oIJ zDRbm-66nWd;cyd0D2wT%Gzs(on+b1s-EvJ6q`I=KxrQjIy(@bshtVr&kPUC(YjnT# zMMkfm$rVqour!xc4vGM<+Hk#F9An{c@7 z#6VDOtUG7qc>81h?tJP`JUy%JyO_V${*(Sc>;JXd*4jP(SE&ED{t3X(1^m>&UpMIU z0(;}%7u>J&{jB%R|LgV7e81N7Yj(Wv_;z;)T!+WoiBm1FwzsqJ4RE!@6>YtHD(96EzoQu|eht4T| zCMbqJ+pxpuA9L5Zy%4Mzg4&0Kw-<~pG`u};{WidB#dTMv?3kz_W9v`u)Vx76ag3fH zjOZekM2HZ_u`3bx)tn&7I>X!{SS62IJk zX~<7p316UjStv7RO>?bCqaKw!j-1kX<}(>Rxn{ChPe@#g>(`8fs;Q6hT!)G6ImpRb zqsIz(7-!KaEl1yGbeQs5sB%B`tBi_l4#1axEPFVAW`ZsC4Yk0)b&weoB+Pnw-kOIck&z{1NS~Joo z{|*lAAzF4f+`p*#>D=BWOr4206khoMNung8?2L~@Wy`*sO3{X-vKzARd$uuS$-Y$z zS(74J#*%#*`_7PM?7JBm493hb>(}p`-}jvF-*C^p_qq3ZKd+Z+1-w#{1&#+2&mxh> z74o1$Oc@D;CYxhT)!Q4WBSd%Y6-6X271p)^0{y?2)!WpSXCJbl6pFttG?Tp45v1+i zUT^?BT>--zXqmrOED_O}MQN%2(Wik zvf<@9b4ReL(3dLMwJDSm@|Fv&b#pE^B`;exGnu0sO?@ydsZZ=F7MZzFm z`*dCVXYLdbSG2!;QT1;EahWxht2K}99K@M^CCefreBPH`{jd$Yc)eFB8h*g1 zsg&+Rz4F1BypkCr7N!PoavM}ra=$Eod5`}_$R}LjXuDdGbJfWk$s_?Kh2A;U=hEsP zh-2ybxWBKJU&{lpw~WQQYlXXwr~w`r-J?}NXQoC2b4iN&1+cwB_q4{9apU=!rSeYW zMQY?@98YgE`|SA(b(Nd0i)feJ0;#R{a>@~X^OtRS`=W{r=Wv}?_6tc8Ts_ne>cIun)MfcJ7 z^IiOHl}+_)D{M5u)HkzlbSLUFD}wo{R>_8M_c@dd)LT<|Cx=w9 z=7=NtMf`@3oKx%8On-1?+a7CGu$w(K@Q{_bsvQJqS@wPV%{QYI5c*c2f&Ac`eb)agU;vgo+r>?<94!ha*>`+ml^|lkAdYK|(6F_joC`^$>xlQ)0F8;7VG`4l<<=s&xVVudrHmW0LeMor~zw_I7oU83ec& zoz%uS)XU@w4iTNsoKPxb+g_DPzh_Ws_58_csuV_%Zl+2?S?S3c^+(rv{EzD;h!!FI*yHg4&qF@7SZTRC<&Ifel}6q^>o*pJ z;(qa@Y94R=O+ z!tdGSm+A$+| z2a$zwLmio4`Ih2bXfJG?%)|RD1p3yVEk9xi+>^9%mJK-)E@i@8K1Unlec^uPFo)Kr zSK)5l9!8gUM(CQU&%!nCby8c$`W|=eye-_QHgpg&o&~$&tddMuZ{)fo-&e@acN4W# zy(+}T5^k9*BY=kuB^lg*Wr%k-)!Qi{v%t;Tq*vWWiTJ z1uLPA1Ghb)t`nVaU~BiU4X{~O6xRB-f4W;M$6QK*PF4;H|7f#g_$aPU#Hcj!#?Pu}dZe+oxU#R`X}RUt^TT7|$);jTI<(R=$l@|2B` z1d$HK^}co0Fg~a6-hve@`2)HKHI2DN$f5?BIgXyoe~zmvh)Hf&!SYr$FmO}J>i zu1{@hKU4;3d>5tK!N@npZC_3XQbE3!eP32eIpkexga4#&sd#|}0>pQ>1u^rrZ^|PD z(jppD*DR#|ZT?Ibn(8@RYW|eDyj{sE)TJ-1pSl)y?wNF0K~p!ysx&{s5=ySULnJZs zRz6HFp5`t?7z~TKYCOmD)>An-=v%yrDQ`~4jLzS5+Ri}Nrgc_8Zd?yUdN13B;^pzg z)2Az|Ewu`~brGfjnz+J@a~?q9>Yabt-H!g4w1(6PQImT zY`S&3kP+OY-`8vcMOg<=%MaU;g)B^h|AXH7DJxs|J4OzVu+chhod?e9zu7QRY)bWd zakD!;L~~t^!QfRm$Bgy2lbaVQF|%qgAG7x@!~aXlHaHAg>jS&MZqKE%$p~h@vy-4I~N}Acz<-Ls^Gi7 zv>*HM{IERv}_R3fMl63*&vSM(Z`hLL_fOJ49IiwWVz_}Ptym=2$LaIO^!^$zB(}c;OCEe|5`N`j)aRl z-nR^{h=@2AoD7fig*hN@UXq;9ihtatet%8td;)@r?TXgSjc;(hsb(a~hAt^|*DiHq z%2FJ4vMzn+lDJ3IfPW=4pdO)jg?U0pD9$)NuV49%j8YDXTXxlp^?ng|R-un@0(iKsL3=OL>B^s0R@!>sa@lF2^`So~QEE)ae5) zl}kRXMx)(~F;z>M;?j^tzPr9^1%2jdQVrVIFVrq#D>TRE$w?9IT2y=wv|ROzWMsAX zYUx*9|Nhrj+tR*9C!7w^MQVXx2A1{j_SN9o>-Iu7aNlkZR%x6mkZEu~PBg|Kosd^m z2tUqpMCNH>;9Nl#-xYM;>)9&(xK3;b;@`Vqygf~j3pyi~PaH)t!&KAz|8x_ab2YyA zc5V!;^7R&%x4582hXPO+W_T&q!1A%1_KnqG=rvp*RdT;idxv*(7@SdNa>-JrqRP~* z@))@zi#Zwc%a@y&T*Z%Q4{1ve6u@y{)Sp7;r;%M6il&4w@8YdLLKu$3b%QC<-r>vmCllmhb4TaT z7aH*c;9a=Y@n(T9xQQMFhid+_<~WmqzoI`O_L!(rn=r6G#4OPJHgSVQH!Y(>=|DPg zWuNBE=(=px54B~2z!DZEtcIGb!Rlel!(`$tO^f6Wf?`=Ml!G40y=g{htsG9F7m=g5 zMQFHuS9B{;>=iFyGOc^INgd!@b8|Kz?wU-McQ|+WuB7u-M}e7>~>I46H-E&Ek&tl|RkdE07mbSjytV#6VZL_@3YIsFVuGWc~ zj>>r_IIA8YO3?!9ElhLU6!e27IhG>fe@pbrB?$yxARUMsG+r!%JL_w!=zaA7*@60Ifm6_c2HEeG1-3&30|G?LpP`6M{zVV}42j|=Ga~#p zn3vl6e)3TuqDHL$VBH0z9HTyiy9^8ZjAzJ~z|a}{29uJh5cdkSNSQK;qSpx!xrMA? zT!6&;2~~NEeP#3BVZLHW|+AIZTMzc%91U-za9^|AIW5=x?84@{Pn?b)nx* z{OwM`X*K_*3HdUj@TZOq1x*U+$qB?rx`rK2Q|ZfasloW!p_=^Az9-CARjP=A`4Fya z_r|QDGxQnUrpX<&k%4qB{WtIgeDc=riVM4NnTQT|s)ksN%7aNlc_VYidep)nL7ooW z3TfrOi#pzPE_&>g+n$`C1wKR}UhG2yj6Cy((Lx5-EbhI$k6fSC=r15m%ta*sRHt@v z6$>_j)7q~E?MT)m2ZZVP)>&=<$wU_xvaX4>(NVLU-7Z_6LF+9uuB-v@ON^k=G+OXv ziyTJI8>eya5ckMd1=X`s_mYi%YF>C+1mO*CONcS8*B5x+r(SAw3;m0qR^Go}XrqN? z{YqM6-`VA%L1>`0c3E@5TWzSEY$3UG_;Vb;N#30@xqP(xcvaYRr0=iqB>>gRYTJO3 zsy51R$nfv&!p`uUcRMusC1~%G;ux*EOWx&GS6zwyok6%vZ$2${+ zLXThOphWUmj-Kxl{bt0D%cCZe%FQv4wJF8 zmAYvj3Vjy`!_&+6k%tv{#1x&xu!_70<)Of0PnJR|Z6KCVbE}XC8J>*qwy6TU`z1*<(%c$&|zS%7mBaLMG(Q*FL zeDdGwViBr-(E-I9JF|I-nif8&StL`v@+}PRImYM zDS>p?$tGXlI`!H2M*@vyv2l-r`;!7)uoq{9P}53hzkEYM1n8p3Jbj_KX-jK>$F@uf zJ$f(59h4E{|JTzOUjjJECj)FlKZy^vPzC!=%zEG$tVC~0gmwEtiQL3^VtpoZrd1%B zkIEkr7uA&XUD2ECLq**p%hmq?)5&WoWxG?paNkZ{dV*U2Aixp>i>Q@*J$`bQSQ&d1 z7@QObU~s27wTBDO?#T9y6aM`&x|64Pb<5{n#br8w|HR6-XUb;qdS}6PPG*05smHx#N znpjf24qJlOMDVBA^$qHVc?GFU#dyX0-K!Qo!m(J7&-`rev@TEQ&WH9p*)g~eFc;LJ zXQ&(u{kiZsp}xZ9dq|Ex% z;e)S`N*4Kjythr>A~eNXvdk=xI`~*6`O`Y5NkV zy5=R7at*n&eBihs8z*{^-U%|VhZ_Gun6t8pXh>OtlOw@z^XzcZ)<2jUhSr`DEKN^< zV|{=>=5h-;#CC-2yNQgA8{P28!uf`Iz|N^P1s=)Gjmu&oE=55GW0S^e;k0{2LkBp6fvy=+k0x@1xC znA}v$6GX05G|Q%X_vw$)Lj0z0;`KvHH?oZa-F5M$F$U~fe++% zpOo_t#>GU2Fe#n%~ybkDaI&wdAd z59fCBP5q>-es@pab#$xA@QA2NYe27FWNLU~Iqu3}^F)3KY4g%4&lc6d5O?w?zV?yjxmYTt1*f>EfwIJ1HT*KlyC#VXd z9JuzH7qI}HiIxK6MjjIOn=l1b$#x{;K#MAOlP*CcEcI}g{=`BSH=bVVzQ=2+&S%;G zwW+K{-P5#tVZW~;%Ft@|Q8|O!5u&H-Wvag?Cs_W9X+*O^*KE0GtHy33@RcLro{Ej^}=9o|-Q1zBHORpZ> zyZpkVm~;K;qx+M|d4u2h3+IVyK-NKM=ddmVjvRF;p#SL)+kWA21 zTkJ!i`~pEB%RlKIKASuwp+_#(HT6L+yGCi2C<*v_BtOlsEQT!^r%HFh|!4x*?v-6tNUg*P3$>=w85UT-iF`o_bMa!|h&Kr- zo{TajRf{U~Q~MuFPesgwasm?5rgt1u*FJHfDI-Qa&NM-CZf0PWlRrjv_AN^$5lt1B9 z9XH!6?^c@)2FNeaFK4=8+cbMrQTXG6Y9(I(3Mcct>MKv%`(SM+6YxW^$8wF!xc{Ch zJ4rjUhJqv^k0-PcaFjoPVA@B4Fl#S$lY1Btoy*fl!en+mDQsaO;`X1Hh6W}1Hf(0w z=dviz#8vzGJIr=kpg9GDXj)K_3jLX>svD*h-U>=#y=_OG?4MuIM_zC`=+D1rg0FLT z15W`dTOq|?^M5Gny_wPH2c+`7Nh3blP5(x|wzfND8r%s=$Sw{Kq<4-4G5~KUy5}Qk zY-^3K_gK*B0xcZR0#wt?^i2Z`d}`8!+!L~sT*Jn*!mO4nB*E&SKm(eY4jFwx$%X5o z)VzFE1NHWYAn=a2oax=j>6?;D749#egA7gY)Y?@bPAmZrEwB*ntUaH{IPKu8S(&r#wuq|Cv(a zJ8HT-Z&Ic-v=!s+VGn@*Gmx(P^XkI?daSVMXoB>ARLhigYb zvDP8_5jfpj*v#*2YDIWQjIY6)$#RM5D5;;&O%4v_flK8axu2)pI)XYt0l>?&sW! zZh6;)R~>$2En=08rGYq$_g41dDXIgVl54{&w56*cMA2%+@mKn`lD_-F+e>z-)Jja( z7hv(Zgr<8w$5m~{g?)~pap0?_7AcT$`h{}~1U%DZu3W$UoVDg&1Gx`un(5XNSgHS8 ztSZDg+~1A_I}_1Gp240C*h$=7_kkBDPHb2}At z9~%Z~iznUk-WlP&^&X$%^6UM6f8X%e_qer#_^s+o@9r0*OSEdKsPAsBfKgnSO`ztJ z;?=S*yv7hA>fDW+&Bs=g&lo3JaYn&+0cSRkMF27`GD^~-Oe&J-Bb!AUUhoB-NZxIn zyDu{oL>GVDbObeKC<6$6{@9E&x^*v^^C)comfM&ApfA&?I3=wQ2>9O5yGB;x{ zIY5NF-|1W17+7MrZ!q<*A?6?W2GgspN#%)w)n6?!j?GtEQ6H%~%|Eqt#+LR`{JNB)my7uS7Tnsl7xEVmLI+2S_}g7 z+}S3S@P1}aXu}j@bXxZs*X|kVJ>8-~wdt|Wg4LKZ5oPpoQC_x2@rQw@^*>LhH*+p1 zr3F3Dnh9JT1sv^}6woutl|YwE|A7DfJ}4O=JgumCpGMgOu8n^|K?-wb9cQw~HeGIF zsJX0MpTDa-&#(qxe{kMhfT4em9*VP{re56@v^MN*xV0|nd@O2r(!WY`Z+~~h6uHr5 z_!(nCD$cFu%jgwaj*uNn7(uN!TBZ-cYJZp(U=^~G{+k$70r&!cD>a+>2uY~f?q3jgJ+nPo!9w!hO zO}Y!8wBw?NO#*K*844f}Ih5|&L)Li%V zFXN_kUYAp~K1456O;mGG%$?Q36ULtW77EufrK3#sjvw{KS0|ovZ*%HbXP_sdJB715 z0+YAQ$y>CxhphCWGT=vFN~_H%YB`=G^?}6&TotP zHI|04UC%B)T_D!MkJ|TEeiZ0MrbZ1(S#Qiwi~=M2+lOXa^W$p*zm!nCt#H?&kLF)f zP*5WCl$GULcD%uf1=S3hlV=eom|o2_mq2W3=&cqz#Y1>Exc$Z}F+~~_ur-RVjwicZ+V0}O zQaQ64Hlu~VbANqaUbIHo7Vs4TAL>l;YebAcCJVzFeM?}2@-Gxopd^%=6}wDVtWC)p zb3&}gM4nUvIPc;lL>2DH$ge$p*Lr1ZbX)5tpFVX|?;BeCbr`=OEYQ9zlG9`ATsbZE zg;J}v+O5`fa{glHNd+eLoan~vMd9n3I0wVXJj^$5k9{A6H&gX-;h=YyyWzmE36FfA z#Fl5aiU<4~`i2b0`pRh}|{OX28Ob#-6P zm&3WCJ1eB@Z!vA8Nt!Z{dXfk)O(|83(FX)RMTzDKR=&P|6w z?W2IgjT-T;-I)Y4u)5M@-;cEBpjyUSS(LI0hZE{@dO0;daIDv8A3rVI9R?^c`WPJ9 z031F{8qCCZA0}nN(=pf=bSU+F$I8D%%4-?iwaxEa+Xf`?J>;DZ>eOO9?(SZ9yHRs{ z2mk!!qlU)AX}qHl-%me*KS=~GTL=q zsJL5`gN{N!8CyJ5&e%%EhW>_~WgP*}F~Czx^W!NF`j?eqm{Nyu7_L$wC-5Z%ToE?k zxOYXwhhGT+Xpt@3>s)bu3$rKfwGZ_k>HH?vYok>ALF0 z1p4a*mFDd;*8bdAMkuq z9H#WNAJ|399gZsggB9ivD&|`NL)K3#9F>vAptZKoFVQKMPi}z@dzmEqruJnNs#Azu2rS5dJ*%EI$qo<}uh5HN#t<4WF5O*vmJlVS54)eD-Bl?D#yN34V zjqU%gnT3pPefIxb&?UY~YCk8}R&A_WJ_7 z+Cr`^(|-r5;s5ZHw~!^hiu7mT&ebf;aT7pcUZgK5KWQCa42`}*Au%z4!2VZXN}E3O zgg!dl+IdapreoLX<$ch1?JHY!YcR$eWKK?nMc-7_ko$E)L90=-;(=pxboz4U{kI4H z=I_59m#guZ@1c^@T4`hPV2J2Wi#ToT(K=SX=HAec>lfd6hI=3wleH-qJ63jvJ!dv#9YE#bv9h9{X$~?&r;v0C^17!QX9hV7AN0y`}?3Itm;zjxo9}Fp^HhtP9ZWH|92aFKhBH5Uhp`TrKpl^)Pn$R?OI1 z_|%_M+s3p>tQiN$2frfk6Fy}mikGXZ-JZ=pWNSdu#dq=br}ITybm zX~2WA+5m2ewwJGT~XVw|-a zmOt7fHft|!;qhWQA(9uYYEr_Pl+D*v#{7ck*#@kkA$6ZU+dGqSgOdPN%l*ToB0Qma z8PB?_;Wl5XQAq}F|gn9IeiWun> z9fS1lD{FN06_#bi3kttDzLhs4DSJK8+NHmuL3yV0R?fdCy%wb3g}zyg{2^ND z`2{CXUOLCneAWNo2o#

LwDv00t1f*9L!TtHQ1kA+{9I+CfEm&hPMVUi7Em1eE*? zPRE7(4T%m6TXS3It0by!6bdDUNu%pF&L7Lq^@P+PJRoaGdj&rcUX99bzj4KxQS%n~ z^yghEZ!PCwTxE&4y$gvW53h=m+W&P1)MyM8o*B#bCbz~Owf2Wd9sh=^tVWPulsX>2 zd53GrwUGl6629rH|GoQgOWm}n>L`!5FFNJ(g*!Fk(~q}@-_Rb!U+^0~1bg(h^<#r8 z^xkjpQH056EaD!YD^fX@4iR2Wl56sj#fO0Y)lnu1%=h1&;C^dddLJ!8$htf?#BiyA z@RR6{Tv#zDJ+jio5M7JWy#x#p`BTbLpkTD%tdjm~FPfSk1Ig%94rkpJ9SWF3m< z=xrA8gZ|@ESVl=Ag7l34Cw^r@bP-uvdbN_1q%L&h+t-JiXW7S>>rrsQq+z{%+)jY# zMb$mS2WocCWKX?r20*Y3Yw&`^h5nBlzj<2zW4?tdBT-2JS9L+}P0yu}U^Lrxb7BbR zJL!*M=RG_mws;su>Uyx-DcWcMz3;`n&Xwrwr@P(GKz+WX1jT-)?HcOcidq_cN?u4&FEocKoXFPrI#J{10>v$|E*W<&A=E@$Huows@C=7=%`A=h60&x6F z4zl+p(+mQ*b_JI+rKYs<@fkM(u2PRfQ*tQCy;iN_H#H1KVosShnu!y^>oTAF9Yr@q zoin~JD5|*M$j|*t0v`M76a{uYNRv}h>fz6r7^ghyQjTQ4P$V=0af%XE0Jhf$4(aVb4X$R>D<+GCBU7Q^MwQapY?5>|U zhCipRNK_I3&4f@#^A8VbF`{n06Wj8BJ`4q=koz(ReSjb+bo#=S90dSQR}{M53ucF#c09d6Bj3L_PwXUT9Tr^ z)aV^b{4c(V;`KIJF;Oa0uLe{rd%cV#Dcd8*pioRZZVJ?3d~!_Gq6f3bzhY*`?mtVA zaC2df-oPCMS;)iP0l`HX{T31FIl$a|kCH}nN!FnyLK)Lfza*SK4SKL+r%cIr%0C|D z_xB4Z5c2DNg!U;cf=z7C6g>Fqx45SO7OImQb7>C*d_oz)duB^b(D)KNG|XYU55HOgtYV-gT??J?Ai{ zyK`ghz4mL{W44(5`kAkf%V~=D`SsAz_mff<RZ`r2J!Q#q=u3 zXM7W4$7cJ24zl_?%vm~xB$p>O;jQ6+cvZJF{+4ib`>MxLB{SjiXK(|}p)h^z5W%F^ z7C5vC^>tr#lBouG?!&+S(&h4_l3lq<_!IBY0+C&*6|!!2pfh0?&iXV!pz12oVdJS< zlW7-v^ZiCx?=-(n(;+A~2D-lP8h)s1wy{gsq#fMFgp2c_ceTx@_=o)ij*2U2nX7ds zmy-PJB%)>`EU?#K{_Q_`4PijhUmqmCzkg413XFyBk~#(j)BS_h3pQFPkN!ZXvWvbq z%O2$%rggEP6&_AkD!VXJ(y2%edv@EYLv+ZT@|!yc-fg%g29EcXGbE}!kqR`1P;(&RdM zX3<8Rfz9|s(*@oo!|ijG9SbU2m+dR}(;)0qSmw+5iElP~nU`ko-`94DUUp|#f^&3i z*DOh2a1O~!+jnrIv3+vIFGtCaFYFy_txplQ7SDr1Sd;^h{>a^b0T!%&u$q#Gi zTy|b#ydiOQVaJzsH&Po-ygjTnDH?gEABN2|vP!%&P0tp&L(e9JPTqbd!R{XN6R2W7f(%_y>7a^ijwVPVFoH$-b1y58KM=<>37Y0E66^6WpV`>MVEmxF{Ixq0t95oPFLoN`COj1U1bhE9O$OU zsR6`p6@wNbcMKs&jwP-5M`<3b({YFkY0tM>Q`dz`OlT>}#)(CyY9tfUpxw_k9Ha#n zdikh7y0&q6b>6Hf{qC{y9e+)NlAMAJo2G!UDP=d-qs)8V68k8#bP_Yw)_z(TF1+Qt zvYF#&9kZs~y8bT2_l;e|-^22juoj3k=!@X4g4Tdj(P2SQ3k&0N(-tjs@y zs!ETvrpkD|{3@(2$M}=}^eTCbcdBy6SL}erP0nvhS3H^gfY1GTPsn^-g38hx8Djs0 z&iZ!i2HT>}9v*+E{2AsnUO2CY1*wxybA}t|L|HtV;Vh1*06v=h&}gx8K0o*^Y@?5H z9s^@6*Bhr*p`pZRNJVN#)4v z*4Guqw}~fLz%#_7{GZI<71L3g4AL8UuTK7|yj}0lI8{zxD4$V-tk8Ru(yw-BzSK*M zi#}IELU&`Vka!8S!+}`&x{25K&^!?br*x_(&8o$g1VaM-xt>5$PT!&Wl^MK{Z{di-D^ zi{y>19u5|H=PIgQw$c&I;F_YF{h!aM_}~5Kk3)p{GwoX?f-%Tz6%d*+9QDDBt_dYvOl1LHNbMU_Qqc^! z!`lSw9!^gu4+1+C1voSmD}hH!BhO!$!s^`jFzD?7p~dw1|3(rfLHj^tPcz;fycx*@ z&>CZ5bQf+JJ0gxbm_I^-8&@0}^uU?Rs>d7^bhmck=i>`h43bV^ScMC`lhq&`B5Wdv zbq8@M=pl10(OiUEs*^zO`|*Z~AGK-eD=pytsKr;s?6$%+_V9@4zSy6#!Y3j>GI*%r zp@B!=jBv2GU%hL1IT?$&o=5)(=p14iy{fLhS{~ zGM~Um`bh6newv-k`zZ7;%jqU)hX87viR8$ecDlVvGoyAaEnK@?eR8*cV$kssSz`YS zpfT>G;e$w=jEJ*m`7=088+p2nh^LKWq}2`ZHAzK7ej?mA4W4`Mu#mqY)^s&hx@V9D|0e}5LQR^1Ay%?maU~~fBML#2c}|m=4b?65#3>52k=A4= zM~YQmvS&X%;#B%I&*!-xzP6QFvP2(dv&30D8KwU=N;|aR@c%B+oGtR)(P@OT2^byU zc7d$uM-f6^QQoSgb)$Z?XF~`-9aJ6G71TQWmoHqo+CMe()6+lGsL>$z52WK7ri5RQ zko$w;NP|!T*2DPha+_U)zrNyPbxQuX-~Vh(!tJ9SbtYLRB=6(J@l#LgQYE+bvEde21!McUl~rHiKqJZYp!GvUmwNU)&owcguzgKcnH zUF(A=BP)*}>YK~CWB~qp$I%8~@@^WXqI!cDA6LK0d$?(?BMRCqCiNHI%(zR7I|g@Z zGqRXQOHZqfY0(cdSy=jS{(2b5yt=#xv}XYAr}k1O`x>g;ykuZK{+_>GeP8K4-4*{| z7J%di(2p_=hF7cs;WRW016<}r_&}Et+S~~|fNxPsV9;@5ff*FEx^V9ElK%cjt>kK~ zOsy)yI!UC3>11>6arJ;E=mq5KS#VSCWoy-em`Z#FmE9il$(>l&QUb9h<2#obTpEFVE+Oa0nF0S}ycK^w40TLc6Rs!yJT9Yl~dNlLz+6^9ugg;n8usY{)24;EqSM>^Bj+pv5yTg=JFIfs$v{s73PdUi$ z?tbcf7R@YhM|0y?-ec_^vZi=k{=K45UbK!rdF8}gKqEUoXM`VeF({++C#Z>h^^B@& zeOxb;aOlm1bW*pH#MbJ;WQuBym(RJqJ0f0mjy!zbU!6a9qZzdZ^bNdb&FCFQ#U92; zCc_(EjRG-%{3nwhj!CLBlY5K$Cn$xtJln^;As!*}Gx7%&aDv^b?_CkEcqNN?RJtsZ zUd1|$cjfifKYkW?<{S&}LNO|&US+pE;u|iltOg#*-AZ4~tI&Ey);uTj@TO;T6XK&I zqd1fQJEz${h=@LHcH|v@xb2G8goECyzY;Ec=u1FMxaK~uljy?-!v=OslI7NFClek6 z;_0Otsj|r=&7N?YZINJVBc-qiGI~5N0sEK=q@+E(DkRI=$U}J4dm&FEvwyxr0a-01 z{X72@!;jz_Z;1Na#Rb+fr{R0;f4t+pLdDm8o7jr4U8yqumX?O`<~ASUw`%i_edZIZVqfPo!b?$)ye0^*3yM@L+s zkf&iB49CwH{9lJp_CIM;oi7gdZYiy(f%4ZRHYE#n{heHV)WA?wb9J%d!$7t7G=E z_iLnL??!SNFa!(N*S30OQ8zW}4>AW<5E^d`G4odM%N-?F*1Wg0)^9OiQCvJ4JUIfUQ zDSW6sr`=zC5qP`$ib0rdK3|+Q=H8|UKnffoA|bTf0!Q%flb*~JEhg7!6QG32>^-IT z11JNy+?CwO3xRkZj|P?j(|$`RSLD8O<7Q3xQ4`&i?nhNkZ?m?tSD&u9B;>85=Dv@+ zuwLlD4_)~J3nmqmrx!soKtkR@$QYH~IcP|@wF`wcE54!aeKJhj4YVv(muiwQ!TLa$DOYusIh^{EXmye55e3>SiwKlZD0MJYjTfp`#GA@ zMDMGRV6AgeyqFuy6P2)0M9Ct8_tBzBaz@y?${gp5*=rx++skDh`W|aHl9oBQ`K>nB z1V_6Ylrst#y3EVYUh$VFx!xU_Uv=|yIi7m2tCc^PiGJz(M6;709G+n$Q9Qp(dzgmV zqF#W0mT)s{pQN+62j68JMb@nOL~#Rjn&x3SPN9E_E4ANlX|S0Rem*ALR2HU@UOqFO zV|&wS8EZJlO8~_g*4Ki{12;qSzu>17Z6*!0{1<=7zJsizI3<7+eIb7#_Ln*byOObB zCZVI7-R};obM47m`^!;l{2%_{HRtD`a}|QXrcY!m`iCU}KkxE0@T->io{`Yi;*AP- z`;ub+lDtLRcK~q8)4hSLF)4u_i9=;+CVutsaQf+J`&+R$qIOJ1Uk_3cOj;y1@vomJ zgB|rgbcb`D8}G67cn%Npl8}si0d*&97t2k=!}J&c$ADN~gSzB)q+b&~1w%(rFGega zx^AOWwNzK_na;=>{i(Ow>m{e5W51i=Wmrl2vn}9DxJ6I*7{@gtu~&V#{TmN)Pgz>u zoBP36a&CfYSj{rTxO&F@J1H+-pZ|XVYe1C01V<-&(w#o&w8GFI!-r+Ggabn&GRA*w z_~#%e+BmE`*_p4|x&nEe2OnN>3~m_Q=Ri2W^f&=I>x224uP(8fBn+T@kZ$YuLgr{l z{_Gw$uQ$(-4UNfrE!Aco=%Odr!!y6DG1dL@Bg5E21&RZE_qDoEWfq+?CIj_8*Fzer zJqMEyqDYadlM9giem4h>W3D~)mEQKx)7Cqo?SGMFEUtEsZb6bzG08al@I)u~`!+74 zjG7m>LYJXI=IH)An);dengGUvID0X;M;@>JzPxt%q%iN!+yJffV8gwAsbdX?s(k3^ z4xRljt^`?czA=~ffzqP&r=QcKg5UMa9>jUBH2ZrTrtMrQryUDlor7%LBzm;oK?Sss z_Zm=b%okT<4dX+YO*#RYuU@{_3#niiO)Ndv@yhod;fj66eFy)}ehRIQ8JE_@Jz&0s z`*H$qARb@xU#!>4RTA(UbYktk7#;6=hx1WF|epM`*sP~vOaueILB7<10G&pzkfbKkvwKI85+#~8i0 z-ulNF^JA^O&c0*f_b?J+O$)7##A%EUu1WOkI5jk0!eu}5RgW+Z@dbEHU>%0BM=}Ap zPhG({D3of%HvPowZv=^J$1{2);^z8eF4IKT``}b5yf%}*1!^A1Y4$sVayg!QHfqIJ zc(tDE;IOB+`6eDG6Qku=V~OktL6c-mZv9kc{L`(Pj;-*F;9);G2+wC%8KjDs}F2yB@2E_4Tp3EawwXeYq-?0qWRZH9zXJIF7+tZ^UQq4f{;KgZjG} zz8BAX`dd^#hy3#aKo|E>;Li={hW~j_-!0fJpzj)gbN8K3&wR9&xq0|5nhTV#8$Ib1 z%>}PHHr}JY%sO1Q1P$?t_XVqOP6g`L-UAGdHok}MP-r+h`zT-$qV5F^rBS&U)KoG{ zl~4cZj~x(vbDTt0J~A-tV4RPYC>n%W_5mjifkFxA2PORzhF);{hM^DYj@NeK47EHv zu1&o>dQd0mmuA2d#1eNPIh^wc{wyV~`4qTuH8r5A&CudWO2p28#aDjGCF}F1rEC5B zlx|~(Tr2ZIIV!rIt|!0b>??yWsP{6u#l^^F`qYA8WUNLj=AbAPiWd zOT!8F4Q~B0#S6-l9d{z%@s@jM6l=-z<7u_aE-N#~BmZ$7JP%fB{f&S2Csm8)8W&c` z(bDUc3qZAacyQ)I3Drg5*N4~{Pv~% zr=p36=l~K5hPy?2$Sc^8jF#Q-AT`yMuV#kpUjO);K+2zUV!2^J9_AaaQo0D5&{vD=-bmKUz1!7;yw6hWFAEC-!gRCzc(b zyv#qbS&kimh`}Cs>nFA|A4D|gcfm_|uD?;=^Wk&j`>ydn?{fSM`P}{qK(|&m-`Wvx zr1B2_X9#F*Dm*^i-vpn_zfPUE@_Q$rM-|?|e{Osayd2hreSai>E?!)Sdct#Zs`;n` z)R6fG!B?)BO1pm(%e>CoZ+-Bb^Wg>k3axfk z;Kn|Sw}6BAWg}hRrI}5NIl38A|D{sf08-yQ_dLwgi@@hBc-m$ zWjQ$*^LuM;~4B*an~elE18sBY%HLfP0P2mmW4+J!DpCX4c2ywx4*7 zfHTRY=l#2H_)Hsl`oxczIqM(W#+_WU{*15kaL91kGp04-;59ez;3j9I>@L37gM;jC zC$Y_pA5x%t_5ahp>MyYs?vMN@-w*-GnnFXn#(CzCw%8+o#13Hk&9L1gn+@A~{Yihz zftl3(Ol7ZsXs_{rg-ia)L%rkfp-G(afNukj9Xb2_#~?;E4Z7<}{us|bH5LJKEHqYk zGEf;>*Vz*e5u=ExaSaV}pVz~AJ)bw9&EN_+Ttm6SLv2~sD@jN|xV~PHKcIQ-Zt|^t z^Bg-FBn=&%zYM4K{;<+&OxC~PIf0H#KxmQ6*5^AR53cp}ToA`jPs7(k)&Qg^t{8ad z{9o6V;V@J_bN?gm7_EAGULvC%Kq|vgGX1Q0iEm`|kqfsL0JRO=C;y2`PFMa;5{B?I z;>S&~zjgix50IqQlPAe6{|H9UX!3KM8pmGo0F!a!VRmnZ*j}0##HWGMu02bgvH_hb zv2X#vANH~ZLBIW(T}+Z|?auSxx4ubXy9X~Jaym~{e+mF^pMM!+-Gm{Fg*~As@)h zKXC|j#bApV&hpH~+p$UOSn2hecvo(oCm+__dFXK8|3fcx662L$a`gPOor{ZB`V?9? z+6s95N4k&j6@#?n@rqC901ma}l|^zrR_9p3>s1#<-UJW)JN%1m;(0izv$youaCdNT z;6FFM2mZUy|DAsV@VN!K7wA6!(tLOR`~2Jb`?mI9I-WbFh%giUbPyV^c zM7fW^+}1!dE-abnQhQ!7rIso;C=I%KeUgRgJcb7r;!|v<<%Ss_$X8=HrFS-_k6^-C zUOHd4mqAJ56{n9phACB(@e#%)|Djreji1)%;?^WGz=medBPl6jM?9&;o zePC@oAP^5h^Q)!QZlfOFO4UP8TYyY07IAKTjpqhCVu+PU^Z@H!=?q92Zji+ zkq7*3M}yr6IQoF$q@-$yJ8tl;NLM8YrLA({Z*5U+ACzDce4C7(f92PEs@TJN>m>pW{b<*WVr-^e)vwB?MW zEB=|*ipxOR&ckN?Jpxz;iJ+18e7dQ(!=;!(%af+$V2jdo_)8$FxqugEfq zB+Wh;J~WP@bshBNH`gS{9Vdrg|B9S`@mGEoyowJ}(_&&kW2>#Sz2BT}q^8aeYY5J| zgsvQ8xVmMqB*s&hhY5ng8;w)t-$gzdY|eEH%qyyr!$<3UW@r8yuj{MjJ*#9j^VpXw z9EokN|2JIMw@j_qSWYUX}&xEeg3|`U-C+?^}H6y z`%I#2hHS>l?yfR_-{EV!N%VYf&gnpchAv$<(sBiwF$$sl4QoRk5z}|}x zOj3$DBX|HV?3-GER2BaUxW07D_rVEsEYXh-HD zhe!ShiH!Q~z2V3p)xiHokx!V-1ym#H@LyY(Y4so}S{d#U(yz+sj=Oy|hU>oV+^ECd> zwa&j$m0!-m`~c3rz!s|Ia^gSeTUMZL+k|}f%w*@(#9P3=zwiJ2#zV|@1lz_FSVH5d zSJ&UYaI&#~gMv&3GlohHI1*g={Pd(s6f*{V@y|S5t%F@7UTyTA%llmGdfi-j`)2dasmw_W8%(iRlAG| znYPi*|Eh^yW$9x>2DBWDqt7_luSVoN5PqD6RY*#bC^zz+jH{ft3hSjj+e0FlKwhErr+CzGjudI~O1^zUwvb6v0h!@=nmwmCW+3F*7e zQyGxPh7?O)kdA>ynPP!1Z4gUmjq^lLJOh*sL+;|=*oa!p{VQ;)c7MlRM3 zDQd$xcrdw6b`oK6<`3by1~NQaIL5i;c0T<9dvo}4d*V2KpX(9IyFcc%=_zK7Dz3|g z+kyvNG?f|tIMkM&c8@30w~rsU|1R=>=NkZThiXl$K~HOO>0hA zqWs)^J{SMFF{$jmFvXNhO=~g|uZ?80L=Fkn%yS{mMqe_UntWd%z@Pb;SKf!vUWH+5 z9(u*nui#lIoAs5Y?wPo8)L5i((aETMo^r52y#eEFuyH(Z=%x3X%*T2yKL^k*R-+h?#c6gyUQeBMohX5|R zQF^RN>OMlliU>IQ%j*(%aIyt!mWjjpiagJpJXXlArtM`gaGNr*pHd(Bf3*HsH^51# z`0~f)>A*&_zB{1Ujg`c$&q8!?B~JWK@K7-1WVT3#`Eg&=F2LaY29A1R%lgyL%bhhc z3qxj7#Nv=kqo1{Zt(Q#;Z1WfUe|Xx}9uKrt*VZ{=G#;(E@Wc8eRd20jK!dev@^A-k z@<;c`zu`+Y?hW$+$~YTYeOS10P3-hrQ^|UM6=py7yBr)`%W%o+&E934H*EVFmiu4M z#YYl+TG_uF0;B5G^S{}+c9%StYY*1>I^xEYDYMDLik(v_kEJ>Iuu9C0iUV;e_L3a6Mo4-c6*5NHymIaK^+1wGRmOW#d>_q(e=1ebEz;-y*74%f(p({Dcg< zyy-(vc_Mc{3;~Qtvoy;!RNs6Yjck49_aY|S^ZC!l<`RxxuRNYuXkUNw#|Q~(^wST* z6zc$q^yq-m8h_?!lE32$K*up+4zL93mpu^82?afn9%o`n!~=9v8KL{Rt!Zitk>q56D z0FN=GeeMF>9Nwmv6Ab#sLQlhYWsx9UqosQje{*=7KKPq=`yW95exTqXYg!-ZTnAl% zTq*Vbjh=9QVCh=rf-v>eM~%5)^Kg*6otaC&@!N8LhLZSKUGs0~yRU#tizCyU2+25;HXk@3!ijhY5Ihhc25%DxHTV&^s-e>Lni|=z z80z;9f9eewrKFgV@FNdWX|BfC+`G!$W zykEP&rFMM@ngF=B66cRmU~{a$1)IMWa>6UNMQD46;d4Y>oIAxeUizAh%-hF8bP{?k z*|(*{z>$pvjq>sgIW5O_me>zC50baBIgG_=GO5+GS)>Q4y5N!cR%0C9_OJOH>kqQ! zFxAYxe^5@_nDE=qe&YL#AbuN%2mrVK^PptflH%-uXa6JHtn2)T%s(6^f5^&F8>v@g zjGP`E`^vIG)J=O}c7gz4Lt!2nG_>hv^pW)+|Gxfeysy`omTY?I`-T!9c-i?gB|2f% z=Nlc02@ZJigVvnom1x$#Z&bXUjg^jm>@`!9y>)Z_RL-zE_YClUYe)ts^7Rb}P{hge zydXZW9ik5OynIcHUdPBB&rN2P4C!W{lj=wCg|X)Ndl$5I9Y}hoac)6qPrSY}wz| z*@X&6V7!Jm=wR-ZayPt%bBb>p6+=WxqICTs_TS4@@=&$0e6xzbUJ z4?Nr^H&6BfNZRI`=_=7auVh>Q_a1J`;HTl3apOhyu~zKZ-=^k1>))~S5ihw0_3FAu>4-)xt zdBflURPXr6B|qcrgP`WpH6{~-V#Vux9XvbCZ)^X<1A9yQJRu)9pB{zTRW<7Sjc!ntv>Tx^kes2EN zw62*i>D1BL4B6pBzOLmYh_P)v4WZVPKd7{fR#~c$y(#8cw0oah^@Sw0!y@}vqZm&# ztV{5zXKe=rMTd*v6ecSqZioNyRj%Igi_Dmu)1ytN!0O!s@WPfSJE#arCoaP-M4gPr zxB*wS`dYJIV7i_f&wi<8cW?@_@jQe^RvS%SE6p*+#hGpiC3b5F23JUrLKKr|_P-?~ zceh;4OkJHKp?V3R@wcAgKh}TpkDUGT%73`PB#rt~@8R&t_Cl9X65ClDNyg3a1p>U+ zo9EvIK)cs}%7jp@S)TDB@4BWU8%aLNA$0*a>zVZTK5L*8=`72{KRoVq7~7$)3*2T* zUku|*Bc3Dwb^kLt8ojQo2tG|Z^ZFnW>w+wtMeY8;cflsl((F7BPC01=src}BZCfkE zm|2Z44SJ0jx^$b5*vvWlVV3X^FkFFQ(PoA0d!OC`bZ3+=bi+CMWY=8Re=*np2y$ME z)fB^8O#AIVb->n89R||~hQYYVa!j4^!+fC{#o~#8EWwb2n(DpER7cT_orDHdx%ula zl3ows&BZKc$N2(pKMY#=i?{dSi60B{h)47o$_tJnL~z6>f3ofMC`!UkWLG(S$Y%`; zhP*M2Y}Lv5%n}zt4Bjp{be)?&{|o@kE&s+}Uoky$dk9uoXlSK~Vq&rXj9Wji+kh9U zeizI3=MPfsp)#CxzwG>}-T9&DfhG!7=9Fl>d@_FVfsB1}SW#*Wb}3BJ^(-I081Lu* zoBcLFMkfYwW2Jx9zA&CzcwfM)_Hh3Y1o!6g3&;2H^M(08A^-dnfNq)=>o}R&2tBDg zzHE-#kj%UFyaM1Yr_IOL;=gQC@4xGMzJq@^phtleUu6pD-S~>7cLEscMVc?$ca;D7 zTH$emI*`8M$iEvUu1jddeb}bB3Y_2isGa$9q4B4ovRUin{BuJ{;_%B>pIY{!#r81Q zQ5a(+_r973Dotd}C!`1evgtk%#CG9)!~^P7at1uZFOcA-)o;$I`W}{6`VW)cDBUd}hoB6t@fn&i0&`CvO)I z5oDF&5R+^-izh9+Xas5pLjU7AYtCp(O2F84inMc7CYO5F(Q5Q+=6W*nWgV*?OF$it;6h9SxSU3Tm#T-WYW*m z%JNT~-ovqC>IRQXInuYEzb_gOce52z1&Z2b)v?P>c-Sc4gVuue>gVcu*@ zZlftmW9#|jIq{$`w$5iC;j=ZZkF0eA5rCM7Cz!ZJN}ZOS6Ch*q=S?#RTDdawvAQDw z$1A>7PXWz6Jv3c|wLTYn0l~nn-h3XO=Mu3DKqCh^1!x|~oR@LJ9_QS0hpn395pJED zV~daY4+12%@l8K%5zhJ#V{huc*7aKzsdqoj6USk1##?%Iv->NcIj>qB>lvHY%E3R~ zy@U5cob}#;483@#{uXphul8-YLkmzF1Yv@<`PYRtD}5faI8h& zaIRS8Awh}*gI>fl#e|l)hz2khNlQJp9n-FLd*VEOE*rqKWM^>%b+r8voMQsedWbgx z)GGa%{^;X!>gKp5DUKmyT=dRiCImxW{p1}}@&~|c0Kl7fMU6o)Ut~2eEpTjGPxDH- z5Cz5|0SeD6Pd)X&8N$brcCC->oTwE#loaIIs4H_H+&LwSkkwB8ux#54e%luIkGyOL8tYP*fb+(TBTh$^Y6pjC*;g)ec&3O`D$(Pv;KH`NqFRM z6Gs#x&oQbDLC5s3+MVwe=9C@Rzf;V3T&$(7%jV%wZt+R>$lttDjQx5zv_KE`lT&vH z85m5r=x0zG{2*F@jz`3_ZTxm>lQn@S+-qG2(7X?*hoy`Axo!)b>#-mcYV1H?1UMW? zbmkGNys?|OY${EI(I#DQXime9#T@7oJbCf1pPp}PJ?1>aa>Zh@HEU?;5u+cwBvt=~ zvj54K94cD_2=v1q+`sW%D7b;z&q&YwZF|#?EESGT_SN>e@-^}7f2m1>X5@yCAUYq< zc#Z(eYmDmxnZV}N0Zu;?7_km6v6P83wXhL*zIxvJ+G3nrwkT#G4w1Rmc80xPO$=0= zF`6cS{(3v>G%=3thMvW6WI;GS9aemd30a5csr=)9;uZw6-8w^o9U5fBg-ox-k63&o z+wl#zO}p~gBEaO-BOaaQ(oOzB&(XFVSdXJ=Vl#;z@dZ9>P#act6eH?BfoJ8Q0dacm zy5`^|Uoz&xnG=ap?aZaq%VL~wz5gYw`axDyPx zK5qmMe(5W_F=bj`<$DP_gg1YO=97kvg`W1HdkBJC$9udt{DWWm$`;2t&~EwjzxtQ; z%mmS=v}*w6UisYpUEzE2-}HAgxJ}pQsr_dL@PxCWb25EO_ItMy*skplB7fDy7llbO zCDLing>p`QqMl!PThiaY@>}CoQWB$0?YSiJvn~Vxt%F;*MUQ`QEc4V<RfDM39_lTdoVG1vHwKswJg^AO7xXw+`af`qgLK7Y$pK9h@mD2{!Z+>sF2 zN)fj8E6<6tIS-$CF<0AmnMX2;5rHvqp${v_<^z4hCl+EtHN|%CT%3|m?`hUz)xN{qy+3y$iXC>bN~0cN8fSx`AQA{M_afOj!z=H=8r;#=-cuE65pWV0~+4=(>Bip6FH&TxOI}CjvTX1&9LO2v1f)E+<~1b?(V%hhrvNU%%{HRS?iuqlQWFT9}`(1 z=77CA`sh8e-uu72;BXEK$TY7PbR!eYV|tMmWxha~uSL?I^KfHTUU>RXaLp!?wf+!Z z9ge@VGYCd;Vk{G`6*{HS5aRj`D-sLScmMbOiT%S=4E7BanF`r&lA$s=T?|64j(L`nhtwSRbFoMI3wk?7~-%efUHXc}&OyvHbCj;{A^&Fd;TC;#mK**A9SgE_f( zb#FLyN$b~xLMK)tS*^L+fCFG>r#yB+xhSkt-SYu?fop37paE5p$I-CVw^!52rpFo93}LC4|bXXp`x zY;DI?zPV)-GswKYy#r|8T8!Vl{(#lw!)|o&1=${uTdKj~-$;O0|ImaagJvGtX@3CW zcgmcad1Q}&KB%b;c%;Mvj-CtJd`0Vw5fx205sOs^-xqr`lhCZK4>JUIEo0k{;O0Nd z`j^>kfVJ;1Yg;i5rMS*F=meKgCmw>B{1Z?U8A7J;tKW8Y7-8gtC${wt5Ibp|^PnDj zL7J_1Pgi{*uX(ZPM>k@!qR<3eK2SL24`;BES&2J zOC;S%BgS}KkYA?Ol@1{%h4=i7HT8Nd6Ihpl316Lmi7h_Xc`z=QZ_mp`Pm`k?{{(c% zYXiPx^{(e$f0$N7=K_Lrf}=Y8-SsK>@Cxqvfj7g=zv`F!&#L|k;q~CO2XXMDBERkv z4U675Ry#KFxbw%_4K)p8UZl?@ns&Ie(hejfSC0c*xS5_^%G7=O^nbd?uJdqow~oK% zsHg^k{um!DNQu>DVz_Yea5^%u9usY7V;H`hC2Xj z;PVG7nZ0v7Kkxv0e}@^PJa>;P7vY&-9OzQeaR1{uEl< zBS2QJ6*o=}F(x*Scpt-scXPmtLtjThUEgpg_-*YGrVUcV`}$8L@$NO9oH3sDPjBOq zLFzDa|CdSD12#KM-y*HtPCX3owS&vhyZyJ--~2a!$1R=nmk)Z{Lyt_aQD<-pI;N-H ztdq5ApF!c$(<1v5kkE_3LoxkWV7fkuRzM)rreUTx! zX@sD*-#|{#a4A3k#!pIXjwN&3 z5egX0ZuR%Y-|;8LxQpL$ZOX+1t<-LMnCU0#5nyL0$CUU_|58obfJ~)%_6^bSbi99q z{LCL8L*See13YVu;!?3$sDoN-R9g$-G03*PNp@|l#huH2kWxe1bgLKF`oIK#!g>D- zy4HWi1aS%AVyxHs0S+994b{MEP1f>{zvkA`n@c$C{J@F-(CZk^HHd=x@B9N9*9k$K z%xPHchLf#XpU@j6n^85DMY0G6;7*4I%G^egW&cYwpKsN?se0ZAk=hdIbtgrye-Q~wjGz$cwaZ}=%M3wzY1q*u zM->`N)*RXFe_J~?)q6RMIkro5E=M`tpH3uDF8%N}d(fhJgF-xz5)QdRpoZDdSQU{~ z=8(|WAI0oBW`j2$M{oIGQi z*)_&USSP7Nek|Je81D=-f?o9>7tx{!6_{t+`8jHlu%jSz8ak}MvJMZgUQ^1udf94x zdH!0?r2yw>Yk)|8tg>=z9ZdXL6Sd3}TWcJLBf|lE_40v7IB??nOa$ttZhH+Z@Ln$; zAdTlME{TJ>M886UOpRRlS$Y6T&d%arw$m6jrtVeCB&YAVAp4W=p8uwC!G%`PX#tsu6rH$x3OS#t=edz5Y zjznXJ;qF+yW4C|VasFGk;lq?Lh5{1XIU=xFB`%gZdT)xc!$I^GfLUC}7#Z!ZzX_bT zYZrr3$G7auz4*rWTYv}t;2@qyy9LO4GzhRA*WW`gOnrjyn4Wf{zYD&P{O4}~B))e8 z2<$jMGCFjxhVNA5QPBGWUpe28_w(X=pYQ7bzJPb_bN+?%mxKNh9elAb^T4D_3aLML z9KwjLV=^(h)V&z>0>p(WywnCm^Hyky4r&z{rullHW(>fGa4=lHx!z+s_!; zxEIZEG+qaE_}3@87U_@+Yw(Q+H*Sunlk^FNi>Kz&n};`%_)5eYpN1W`mt9D%#LyiO zD?R7X3#!Jpm1z89)CZhb{ted+K5H|jBY$rCw|0$NE>=KwhF^`5Hx6ic*fbqDwXvhN znWyXVu}@GK%AvkyeWlpHF^pas<6@%YnA8%wx<*G{t_@?|Z1aa}A`fsZSH5O=9^g^l z_C9s!dsj>m(Nf1Xk%V!d0%w}wHQ6ohCzb>*Ez@g zW3`3L^o=8^F?flPe(JmO2RFWnGrJ`mX4BBV*8!a;7Y~)3-pwb0WdeX%)&xTRF`)_Q*fg)pu!Z4Y{@?%ahkx-;|JM)y-@o{O1YTFG2Y+o% zDO0{-5}9l~ZVw_^TnC=5z{}U|ah=1RD3iv%c4e>6z2G!rEV8x!5Ra_Cy_|p@T>qwm zuZu1Phfm8tywGc3CCruZ@-MD1lJ^EJ{TVxu&KbMah6&^I{>N|LC3AkLJDz?!#(3gX zJp2|{4fwo2H8Zkk;)!GCJ#PRM5kA{UCaRnJ;?Qh9PsCa+1I9r`y9D-yrfAl+`GXx} zdN06WE0)~%AIzm{nL>w+Wd4mdT-fqD`8CD%(z4%u2OGkK)P0{GyX*@%+i*C+3~~2C zeBYfxf_>!^pJfqyc;wJG_^z;BZU4ylg;t&+n zUj=vg-Mu$^L08kvs-suCP4DL4N&YzP$BYglN%#V=g7V;cFiZy?Fde?ex(oCh0=;lH zsm(Vuw!t?>d**hWH)BI% zY4~JsVMP0q7&Gf|#efGt!!Te(T!*oB944kgTRgb%1Og?D{%Rm&hoYPm>UvbldCt$3wSQN33j^EflEUWWvm^0b#|@BcbWf30VA_?sX~KfD%? zicnB@t7iRKYpuT~^r@ovH4n8~@M{&Tfe0Y2_f9=cd9=pT}S!U^( z+n>)MqyB*IXatUttSubT^UHO918G6_#{f(tx0 z(&CB(Jz%}M{=fd4|Hg;E`gi{3hu`>}zoPiKrhILG+A6?r>;AWY^iMwg<3IRsKKx&Q z^iLDM*W3%ex5ScV8?X=hFl?jlj~2lAPTEUo9L6KlFtY6Zz5fl|`yZUKIVYIJe{hSi zQ=al^J(<*x#57S}k1zAFkq+(^fX`!kY>~r@GUw7r>7+xhS7W$&Hidz65FQI!>wszB zutjtCBMTdG5ZK+wJVvI0^GDD~t@L~d5-tRRMK>_sH2eBO&^2{_FY>qjNpiSZwj*17 zv;Goa86yXlM*bm*8@+j_NDbO5%_VjL+>20iOo9)1L zop;A4RKQg_4v&f)MKtWb0FMan1_wDR;k(POn#`(uEB>3i+w=#Of8U@G<7&-c>*`bL zQcg{rcP=hKy@Mt5rOvh4dzzE87p*{ZvE>ql@9=YxhqqDGA^&zA{>&YXhr-#<;4RaE zAIA8cJ()Q;gJx~H+l)+r(O{U?{MENURT<1X4`V8wc*qHna_Jv&!v64{F+sr%+5w&j z2pW+PCPX%EY^@*$7>$98A13(B)j9ERenv5f?2#Yp<_5L7?PbS)#Nc%_CBX6HP6ySY z_CRQ;5a#@6c-Td2yTx@QxZ~G4n|B>Fm{>$#4`}PcLQR{$<1zq@X82`|ZvL_JA7eW( z*|&I!89vHa-|dn2+c)N3`P*CvBc^ZtSkExp2H)4LYU}{2UBZNB&OFed5lX(jU!-?B zk+@kScgG)ZOv9p@GN3+(4s*G!2I{bdy2sFtJ z{6V)KOpwzIFCZe~-ZtU03^9&~dDb5&iBhM(@*n-R5C6`8`X7Gy(N7$RHD3>ZdMofJ zfBemd|KY#*uRr{g|LPxh`Mu6re_da-54``56umWk>DA6)tLVS%5vGwzWF7t5{^ppo zoO_|IWIcfT@if1#6NLS5C&EK!l8om!#5q^{q(1l!)F{3hqunxLpF{107zSayOxF4D zz|i%cIx$=V4i}o9ewmzKjRl*A;0auI-e-fyIn4pUKNuULL_vMrIadzef0nr-jyHQ!SotuXJQ$r^9!nMg z)M?Bw`(JZl4Z$etmz=$SmH&Dp-?+!;qBs9Isc%jF!GmLic$`q1)>k5)wfesibTG0v zlkKIamo*VFS@}C~3n6ifUD4Dh5e{SK^1Z(CR&opj^`QGA_M6;1$Mr?Q#PI|G-Oi0w zL4VB$n|xzLx)|8!nMCrSe!}X%xts`o(-JPS7t}&p#r~43;i=Or{h`7f)f937vd;SIhM6cT2 z;VaA`yTkACJ@f)JNYh*aRngO0tGCwcS&w%E5Nmzf#qCht1aQ+nrg!+e?tk|DeL&>2h>BU@KlK+KjElNs4oBW(Y7Dnyo}P(G?JfuO$oyMaoFE<}hGEf> zb!Fba8c&@DXGiF0CY#;@(}niHqatSDUIcY#T@l|}{AoodfA3&(z)OUo__1<1ON^XQ z?H!k6TMDoq^w?j z)|<6ua@5}#9r80DvM|;EGg~;rxg^ngu3$qWR*n0)UWCZ?DrSVaE*$<1`tad5|JLt* z`0d~O?xMl`002M$NklW&ja>t|2gGum~QmW zTaQDIiYd2J_NLzQXIkb%&;TwM|2Cjc!Vz<*|e^gzCAHpVEj)2t#_RXG>jsc zMBQ=Fq9D61Kr>#?zq^3;g(WT5&y08NXKo)FFYt^BlQy-DZvfX7cMFlhd7 z2O!MFz*hTE9sMV?JN!>U{{8@^pw>5kp zfA#l+%)jqAIK@?FE?DikVdnky+?ahLu3NNlxtW5e^uE|=z`EwVSOZti>)u7jWcji> z2VZ>f5nDV%W==+Hpb4r=+kfRgAx&TohVlIk>*(>xk6!%yclSb5nqFUXgGIO#%0_@55&4TKKm_(s}>u`NrIXZH1`U#^dcr zAAaj^|MjnL{&zWlAxA&`gTMdbkN6Nki{ERb_W|2Xdt~p4Y?%E)QFYlj6z9aV#o3#) z%`zAnn(Vuc@U;YzY2!_^U^wz{&iU&ih*ltOx_D;Db5w zzLhSH4%*{~ao@@9h+H_w2m6-yZ!w{PnlmMqI$LWfQ=5iwb9COE){@?&V}80CJB0lU^9VFsr})|+pX*saFhE6od;gE) zy)w>wuXXcbZ#h61^dg2l==7f}_U}wsD>Z)7imzbDU&P1z_v}BeXIZ)?`004ZclG{0 z{^~FLg}p;wulTR{)UL9t@7J?p>1p@+eO&*3K4I+<{7-)Q&;9z} zV$d)T&zv-G;m39=o`7<);S{^dLT)Jsw?_h!wgd*;;#tax_sk)&PMl8Ui0v)Buq1ZL0aJv#p2T5(V_S2{++q`d5=<>Hfr*&#Pjk#;R=2&}A8d}@ zc#-hNGh9WOD0zs4+({o04@9m71~|Z2z5N$AYlKCJCldA+c5qn~UiOQ9R51?${;(p2 zwH+q-r-dn8vK|5JnVK47AHra%_G^qQXD_H7Ca#1N&zmFZWm-`yZ@z_v;_||MtCFjg5glddU&&5u?FF|G<7aG^BOuB#X@ex43k=Q%6--8SbxgytQNiO z7>~VqOuad+s(&I~&wm=qU!SeYZR+78cJg)f{PaleEd4n)PWrpQ za8BJ0+l@bb$h^7!kn^Aa3&2$Ho^dirCNBzt=(E~w!S3!J70-&v#T)TG^tWgp{#YOh zy(z#x0Edj>VAl#>)tY@?d&k|+lD|*rRUd^jxpBhs<7xeR(^jZj^de#)sc>3{gNqPq zJ;A3A$Z4(J)Fya)tF>X6(xN96ct+43B{wDC1DJ5JiZb>&*=%Tk0BfwFxM=aEzAvoNL^vhmKrnYQk{+QBsZZ z*E-rCb^Y-5&Ht+FpPj)^^@jof=Uh-@}v z)yB@jY8|ZeX5IVW5M<~%Gikjpu}_f<_e6W~XZ$`Gewbj1ndJ;E=seyo{D=Ve{GW)R zp)HipFxhRh&EGMDiF!i6)ls^(OE`xS)Dr{HBs)Qd$Npbjl23W;q+AW?^q-(0Rg)3U&ip+dSuwU@{Vh0LA;941 z%{S{`?wHA5xC4r%>xPV0D#o>C{pb9{7>>377N)jCezh7@ez+~D>Kc_|5CmY-$Q?krQFM0 z{LRVGKl$*JU*a18wY&MZJvO6v{WM9(#dpKOVsz_V1|2 zRyO6cFCFOhdf)!$Z>T1kgjRa>A#RTYMAKJ%#E{{a8%&n;(WTZwXfd&?YtBQj8#2)H6pZx$Q?c1vflnAox-m-0#&~3)y-9 zJ1Gf;$yZJ##}_}W(YVUm#TE|4ahaSDc>P0Von=L#m%y=NydFN8Sc$`sHcy{(24fJX z8C@p*rx`?k0|h-4@@_R#UZ80%?~?EVQCXBfHN&jyXrqll2^WXG|C#zWZzs`Dbe@a> zovktMSpA}xoFCix04VbaH6D3w+Dm*{56Raz3aINunCs2v9%mDl$808E#@O4Ut_AFym_}SP0a9-~JakXjIXo%I7$AgAS-x?YPk>qGQ) z4M`{1hYj27{iiyD0HXjk%>ExMsGK0!(E9qXyl~-KOdSkx{#JO3>wLo^J{qe_ibyE0 zf6x(78x(GXz?oX|AGH&b-elky52*E($V-6wRWl(9fPm(_H)q7T|C!jecI`CJ*@+1Zc8@q;ge0YY>F|%f%@H-9wl^k)^8oD8CGodCcK!I&P z1UGxf3jJ&K*dBcLr33xgeS|)^BVG@&n|N(oddncD)d9oPK=XqSq@f-#9((uL32giE zi2AU9N4-EZh{s`cT=<0EKpMVOR{y}&+2?WnO15Uu6wCJ0w0 zoJG`it?Rkx2)zAc=Ji~6B0`yeqvv}R{P?fW!PAXvhO6xaMlV}TeWSxb6MXrO*59a0 zWIHaj!ssXY!9$@TKJq$i~pthVS7!T)+k8Wyr_#o$HG-G761Y~Yf&k17iin04Y`^;8@ z$3U;{mr(~BMyg$Ro{9(XM-l9H83MY2FkP$~(&)4O|xGL2L9zjkp$v6*3G=00pXF<vtc%O~k1E__O|7~9?7tzvzuV5*Qu*w*1an{ip;-B>&#gKKV508f&`|~IDZubN3^Onq}o1WyX3W1k8J&V-V@6*nw9e8hzT>v>JI+Y zi<}vLqx+xM|H!#xycs{iIKGn6PxEbzhTm)c4xS(s5N|pNa^COuH+}@`ukfODk{Zl|%l#H9i{ddwg)m@z*b5(m_HrnkJkoudji z_WNQAts}xv1Fxxu7LJUmpDx!sYD-dgJ50Rme{1MO9U8&trGw+w!SQ=Cu|~zj|JIDB zSetNT!8F{Uny&%YjUHR!l9k40E()E-EC0xc4VKsmLug=wx5~j`ZpwtsOl`m#Wgpmy zIlKzyQzRlYUo0@3CX|Uag|}@v3!m2?pncO9d}h!X>^a%vcR2freOp>N=WbB;%S?b&!8h{I#~nSS~2ppKY>p_>l}Qa=g7oc0__&ee|-85Y_W)_|F*YyQ?0@Dx2MpE0kOPl@?rph0FgUpwkCCq-nwz25b6X?CqmQ;{=G@yG zA_OQ$;A2M7al|$L=!qM&FR30Mxdb={QbNR=U;4Hg!_#Ii(vhrbd18PR<}G^q#xr(E zz2@%cfE|AB_Q>=~&Qg{G`2^bv<_%T|IP%!!nf#a9W@Fdub?a$+00B8I^7N|=p$}%( z)Ao{k{q+nn=I$B0X6hZx;?_VmS!0b`d%)uZ=-vOA+dq2_y(c!~5CjyA=u;Q^;w7Z5 zz%(A>F-N(t|0R-)>wh!6@ZpH2-n$Q9QvtgvhXS@M2QDV&j2)YL)vsZZA7Ip2Wmn_G z0tRWCrio9+*pI3E_(zVfaK#CRfQJttBE4)sV{D?>u^BUb+dx+S0BQTj(*9vEX_%68 z^9LmP)BzjEG5AiAO-LTBumBWG|C~B+r)Q&AfJ0VHdsL3^$VIx!q<;9f>^#8L7&UaR z(>L$-HoM~yN`{zM$C+qe?w@1+Kl+tl{mZN%;i%mrh;Se8YRoFzsGogQE_#|blO}J) z_YVH?iHj&}@=5##9fumz)4qrN`_SzRB60Xv3Y18}xL*4c&rANO1=nJyoX#beBm_x~ z%M-H6jh@zgHS7kr$b=ffz1GMUIhZIzc-;;eb9(SH)F1x(HPLf z(0OWpjnvz}1NLMhW1L3<=LY_={u7osp>^KkNFD4!hr^*`-<(CzPg+ZaE5|iYBu-x- zu@B|JyR43Z)w52AIN>;2@vEPq{c9XQHDFzK{>E#Xn-aETFu^D9WBs9V%udC=aCer3 zX%e+2(-C=sy;Al%1DTk+UvdV4l+t=z9f!)Po2z%|_An`wpt$Z!dGUgnVvOL`%O3z; zeJrq$D^BcJ?Y7^H65CzsO*s3_oDC12DdL2cne;E?Jc;3;)i5(1#aMe|0!aMik5aJp zZ~QfW}3Lz|NYWcF62Q)181f`{ z@W(fP{4C&WLb!cRC@cO1U-{RUq2VI}`^i8P4d(i{na&pZY_hITLS}AyzQ{V3~WuqYd75kewlB)p+OMf3lIk z;ECmuzc^}Qx*L9LLA_`-uDY={ycZ^)C3^5*^LfPg4*pZ}&p!cpBO%tZH6oFYr@pJ! zUGqmh-VrW$s~So@c=kec-Cx*XWvPUY z!*-J32RdRyW>m(I!$)iW%z)>>Kur%KKbkiXxgpGr!o=m|Viz9!VT`RNixVnDK1}`& z44KgK(FemkD8i5!`;}!Rq_Jjx4hftg`#Glj*^g}!@pL*zHJL~UYk%cVonPr3< zY87qlk$F_%OaX1ALE{X#m9ay$@@JwpKC&Myu-KdpTD_x!iUA8qvm8MJg1Tz}?=^qU zox}nfU8a$F{T&MmTI{pevp>2OUEiZlfe&5*ni~c?l2`T3FShuPpVlpU{pSDc*Zy73 zuZL#^_~!urUj(9JPk9Svzp;GcdFx5N3#G3P9m)@AoP?*YM+O zp$+2)aQ8X1H0JfkoN>7p_yB~{&dpCCI*at*#CpV&^AkSdZ9-6ZQ7i5~wlarxzQtYq z$!?#I2l&O%v5tHwJj;1IkvooEm*$_88|(@oVKbGg+98c63G@6Ty+1fbECVir{Giu# zeZ_gk_ABJl8=G~zrCC;&dR^r~P}`$y2iqXt==1~Zf_+`Har>M6b~ zI1eE-ao4~9PT$OV@98*Uf;%6ogyhVhpd3NtcaY;>itLZX*r<{}*L8B5`Vn)8>?9f5 zdp_G<`G=(`;6G)JkNAU&dHs9158o)Kd05%&FZG0(6o?I;i2M0EB*?jE`STS`#w@*! zu!+>#S)&9%-ufp2UVjl8uikjG4^Pp7ARKBzv5OBZqre|xOEw!u_lE5R?Rt5v1H5Wn zpBVSr=Jg*QL&qLb*U!&1^)=iph-3sQ^s!L@d##X7Oh#M})h&9_RCYyv;*2yKBPJau zyv6;NzxrN!QIrz8JKtU4ntjjtU;hR`qo=3c3i1@(4Py4@@jdv%-;L>Rf5$)c0(6y3 zbq9PV|Dz!9@ZIRw?!fF-yXW%?gG~0mupRhCIWoGO-R*V0ngex%w@={~T*xHR z+)pjJ8DzWH6n=YMmWFc}8t1PIE;pHH1Oi!i(AaKx%Q1cP@A5jkhM?XTwqD&mA*=!% z;v7cSi|N8jee>zNMXrjezq2Ul;FKsA{^77ne%8a)fyF%yn%Xg*wjw4jW8slfbJof? zuDOW~f%FFMH<&9Y$vuwVF3fc}6X#t2jqQyg`(~&e=V3#0%$-JX+wUX-a2d@iDCdawLx$Z8JEfXvj`G06i<=`n)Qw2 zOnR-w4zo7&huY#&5DGM|mo=Io1YqScu1sWB>2RsD?Q_`t8ZkM~|2seD(~JGzv-zMs z@@R0tdPp*sblo0Yl^=1eXgpBFus>dZ&C9j-Uvo<3Ras@>u7GDMHrTe#|$zl(M3ib2(J z@pt~NrDMh54nTIayZX-muET@t)$q=L$2|Pq0C)R4{-GD3``=V|fJ*r1^-lm+eQy39 z)0_QmdO6>)t?%y1$9lX|(D&@$)8E(oy?7t_-UT;;+w|v>KfB&_T=nH7j*OEsH6gO2 z&9oP?Omnki%rn19pC)qynT=#v#$5Q0%b(0AE)fzROPjckiwtst=o?l8aT;4GV`ygV z_csiTf>YSMN140_D~7y3uYU)y=*+x17$r`76fgGt6i9BtAe>h4In~%=7zFK}1QG^h zsh^PI(XvSN|`B+jZ@uKYcP@_k+o$F-(wnCy2BTWr!`!p^h!k;$07s z^)nS?Z7~Npu-A(oKHnTg$daR|tjiB_eIr5`!%Cpuwd6e~GS~pv#&kJIW*q+47#z)v z10J|QrbBDK-4~8!!>|kiO~QUahEJbQ^ip~M6KfxGDv#Ob8*GBcHbJcQm)?vf74PVo z(t=}jb3ihaF1_u5%mV`!ZcUmAxD+q8LF8EZMJCvMKtMdaauuN0e`o$^3}8=(#I98| z`q-MlO2@0wKs|B@^5^r%cF|G;_G3d#KfHoahPL|o`Un47k+1!G704e3{6oXKm)LLo z^!#H_c5kI;|M5rNz+?}yFBzTJ|L$2EM}3?O64-_=``dpsR5Cbx{=mrjW0~3KJcv`{ zPF}`iUvWgi&+SJd&F$4)4@(Y*U%hxUM>N-$)+NrQfKIKs+je|ZnX@>+fnyLmZ1r01 zR{ptCv_6g+8x{GG-vCJ3kANj^&PLqV z>!a2B1ZBzTX?OmIes&W(!R-zh@mt*;e)IQ(&7Zi63luXq3LfTa4UtGzTf-Zt0Jdvv#)$~7-f$r?sf2zP ziU0s$ZVn;eH?DCu9q7O%fC4!;ry0ZaGJo;MEeN&olgU0_{M+Z`=wc(lUcGf=HzKPL zSsjd39Gd?cYp`N4N+9xwfKg@Rv5F|Y{_z(-2iyjIgAa?F?1x%@CEfHH-*C%rnJ??% zTLzn}MuoPQe8mGswODUhO+&WC2e3xvpZ=8JVd&tU6XM(prG!5ZA&2n`SC{pNQvdD7 z7)LrD@f=d?I4qu#9B{OiP9IJt#rZrc3^_KPJ68#7#?v(qsea0qaIO#Luq}sV;`7Qp znyW8`5N<2(!#Hm1yuj({@Q2!DIv9GDIWOV7uZhKr-VoA!w2#aufYFSP=0EJNz3qw9G>J3A>k$fG z;8w_*BvFeP=2{O#oW>{ONB*$OU{N)u;X|D^fptn>Bl9zlpwmD!)6b>;EBKXc3n#2( z3i$56-tEDBafduIgfl_V@d|PnAl8tYWXUwSJA-CqV5-Me71`ZCTgZGIJH|_Y-sEgY}~>K!*yJ`+Z(t z@~_{w`o%c_^N$}y54`{l(k6F+g>N73@SDF<)6;J17lPn^=Hol@{5DU4lThp-frlpf{tabr&iUW22_T})H;xHr{sw>|Fi$Ut zt_OYwYXA0u6NImtS**a6SKq%g3)RM~xN$8`*G#zNoSLlPD7io)Y&>{r7>-BY8d`?- z?>q#h8Y`#1e{z6UMkl^}Y9H=(voCLbg9GA2gOK3XOix~t8#;Q^jKJ0$CjX00lhk6z z&XSo7E{*dy7MQ5j3H?m7{;1%9FLm930HNiL@MHgvKi3X>Zk`5Xpr&!o%Lu&`5>E)O ztH#@KsU%OMimTrlr-! zILXjYe9=d?d`r0eO$4n!7+6i&LH8jviqkP-H+~7-?$A&0&I>&aIr;0yugW#;@VEZ< zfAHbA|IXh4{jD2s{{Q>`?Ds$Xv;X!VeQU0-1Yf=afAM#J=fl7Epa0$${}3RNvdOZm z)=>lRclGOhn~eyDz1!=*uRFs4letQ10s9}T*db#7@4q>qN&N)2_q^>f#AtePdCGYu z5y712lYL1M*_>Ut@bxX%+m0bv=k>%0o-nr?w(UQB&}Wl>-swc!hoFE z(s9DY84jl|Spx~cRF6j|HHM6D?XHH>F2Py31+Gdt+{Yg{>=NLtKO`4>BR081nYB}5 zfe()ZFks`AC;30~!?BueW;mu7d1a1CM2>%(RgH^-%KlEl&AcfmHXPRYEyA1rHvQIo zUWk&uiU--z3Zg)P9E)pdpGu zy=HD>rSVA0!*rB3#pZzU*l_N#243@J95>H(8hL%}sT>`?BA;N~=>TNj;9u$@IcW^K z8QI10Ec?ZO^Z)hDe^>8^+kf#70scV$cYy!$54FeGZTH=N)PX&zw$A5FFMHE^Z+h`8 ze58iQ#opM%VZ@x2wIdRIaXqk4*`n+H@8;lOx()4f9P`GJxQ;gjPC&Beb+h(4ccHk) zIn;N%&ci#!kkH@oK}j;b5NYb6?mfQ#!8vNfIO!GWC4Wa2ImgvL5>MSVCit5F8O!22 z2VP2EqnWq4|;t@5*kY|rkHWvmrPKv?n z*1XULs{F@)x!Z%ulg$ds68j#TlMno7wUZV@=RN%kBF8Jtt9W0)-xYmnzIPqo0pCOZ zKl$ZPOG$or5(Blx|#a@e7yEfw^fYo?oq0~~TTfA!D_ol->Xk2i=-}GAx4*EQ z;)DOg@Gd{YeJ=GU5oc;@HWu}ynd8*Pi}mvcfN~#G7>=|97a5)At^|BrH{Q0ZQqDMx z4}HE}3*xs$;EfXvotSg|T|-`QAf>0-0_586JcgBV(o~e%31ynsCU;f*EefH5l0e$v~zxV6kfBWRm z{_O3Czw3LCJ@y=%dpeu(xc_H!x@WV;-SctcjRiZnfAt;3?*G}ncDY>lKd?NG{U5XU z8gzNkJc9@UdUlLbdru5b0E;;sqdU((_CW(*@~A;!sZ~WU^F~Q-`7ifT2uRFF!|QZC zygH&igE?2^vA9N>8k+&3m~W_|uwR+EbIym=LeP~++6;lCQ_Y2k`oy@~HX=YjZTsta znTMsQtL)F`oFG2`#evs7JpY+5>>I!ClUw6cBNC=+P8r>PFi-B|9xZaewr;{5OiQRv zFvi(Kiivf`ujX>qpTr{c+i06XbDsEd^QY(Z!JALeuA^%dgNf(j^H1ZlqqYh+rQw-nKbs zaGmo7Y;CRo;;0xt7bm?p+>qpE;>~9#ZWoW(>UuLG_T6UYNe9e4apLBKya3a%qg3ph z3`V}$N^g$%ZPJ64XnevT2ffV>C+L?yOydicP z<7~X?G2tRa-_3X6;9`_-WZr}xoAJntx|avvc>$6W#n;?+V(43Yk&! z!)+3U!x$O+MrK%n*wi=DF&@mJT_OE)jd!}eM{NlU9t1w4+Se`C9i1fwc6cx!3y$2i zum5rXpXX9;kEbKCn1PuyIQ-6-4S?>c%I^a>BE?=-Cf;6eM z$7I|yHtc9Iw6hm@s*pAhU-Jy_cI78l9OaoiROHKY#x}&TvF@B_)|@u(tLuNXtDF8>KmOFyUs;R{21m&HEeUxo9~h5d`k_2rBv=k^ zXmUyM%mo6N3Ink9A32Vfbt11}^-U)AH`xQ{WGo0jVs*R}t*15j1~T!Xx+Dee_&3y% z4H+f9`G(Lpmgxl_4b$Bki^}B~*yw<;D z^zj6k#&zqL59$c};z_{hz&EFIl|hxJ9iKR*P{{0@R`YP(2^fMMb}=5X3>PppFusdD zE+?$kWB)x+KHXQXkFwb;yZ@+kIhlu6wPZWGWO9HPlOEmXz3S+QwVuY^%QLis58rVV zU+N!o4#*?PjoGnNUUt&2XCqsa`^@g)b-C_;`FN#1&nIkaDfEp#1M$-vMnEp~G>(9}bgR>V z{!uZ8)zA3>H_s*ldaBla$YT+ne6Qzq7^4JmA8*4HLxeK({72%Pe_q>c;|Bp+5~#k- zs^~>cKOD#0g~sS!7CVF05h}97Tv|S{7Jwh}fdG_D%XHEFZ-q@NuUl8)`<)~-#JL?J#C2jE$TNk_- z0yq~6g;@Is-}TdH`Q#9NhB}Ik-lQg0l3$bc&-%k_F6059oLtTXq*)CE&mY*wv%#EQ z+6F9?YvwWp0Xcus98r$A!Y+o4k2dJ_Prv>P@f@LqZ{gq~TPNy~>1~UpPkR`?5O17y zD#fdN-B^?FlVH@f7{th1GuV}1%liE%0DIGO6DH$saxx_A=@Hpz$@ajH>}CS{_=rj! zeHvyi3tPE{1xycafb`0k&~00Ja8L3JF&q5TuIDqwCz*|D4U@+qljr8RV#W(Y(ClRa z(_=%=C(A1b?a>zRr5N(ajbn3heelWCN9zv{k@DsX2Gh{j-!79#=VbT*jR*$~cN%at5&DIa z?_Bu6hQ`=OE?Ag{L#KHzS`QgN9=q!M&Q$0K8_uaI(Bq(n6~GLL zv$605b<|m^;_wd^j*_&4PcHSfiBXIXeo^qKZ~!B;o+dVW!O>HYYj*Cr#v#KrY)BFp zj))trD6S`tZN2N$ny3EcvA*Q%8v&^Gm8=)2Y~|g(-TB?QF)J^v{lwyGHr~6+w7PRt z=?g#kf1Hsw_xRQLO#uEmzz==&dor=zyPPj}>l~r({@wHG_ndb}XD{ch@MTNKefB)# zW9MLv8k@t6>(fYbcsPqidp)1P!JsRwICSJdhYxST zV!04M9a4sB=r_Iw%{7X%vfLg7YFytzR(Ch({pb1m=bxAnodoO^rv8(tS`d*eCDP6V zD&{iD7zd`2JBI+#HH31+UH`JyABYY7u0INWQFab`ty*I7b$xP8Zj0S||CDXKeT#&;NsGPB-6v_yE2QTVd@TVw~XuS^w@e>hGF%Zpt$x9pKwZ zBC<81l2ThP7FuO7=y1C*7=_iFvrJN7=U5lgskgykaU5#^D&(9g3q?SYO z$@h@Sa&ufU{=yu(8iBR|pi|1NFNCKDjoeM3p# zd{);;yYAK#uGMygNTaYjX{se3$ladV2%z`Kp9K}#>hS(Wal3}dF9JK0CL>_VzRlR493D)m|P2tTR%Y> z4W&6^HXk%3T?p#dnJX&6Te#yw%RS)CkEIOH^`}c?z_alv`B?ub8>C?}iP!nWW^VXI zHVs@DOe-Egz=O-@O+xUAQ-6a4O!oq=^5J7XQKV-*h!L%Qy2y~u`i~KN0~EJEDg44; z`)6WaxxM8Vz3ukpU-iD*SN!s?y1nDezV!C?FL~GPZSQ=i4nOk`{=x01f9fZ1|LDhl z;`Spy@cp+R{r->V-@X6LE0ev!EHC{x0rZdy=Eb8xHn&kLB#$=z3Oy z%f5I2Lj+$5$(y!gY$lK^Hu4d3Or{*q8=Ye482x!}NhZ0+7vUM@KZ@N!x5_g=n(2KNCG{o6Aykyt<0l2>#w(~#+ z$!+T=IzC(L%79l#yz72+t*M`R*m_24zGx??{JCUY4eQUGP!sKb21F5WYOVE>T zlQRqSFr8iT#b8`{@vQUe5F_s*0biN^*|xr~z;|%Jg8eg&_n5?E{73skeJ?$q#6ND3 z#7;cUKD{L$c1P+>aqARkDArflZ*EDIB~PxJwXMuUSlPh z$A&Tbp*yXIldN2(#UMDBBj0kM-`Mt1kWX)zkq?dt$bg9RKVP8>+K_0xZ%D3xE zIuHZJrmWI2Drq7hx6PpRF^u!XyCf=Hzg&tsSq}FLZP&f)Pe9YjbAwNUGLQ#`$t%9c zx)5Lb+6R8>h=Xa<%}|%&f~UV`8jL)}-}5X9&VB6uI?l#v+K{ROi5nE?8+(;@qUTV0I#-Z>F}y-eO0>iS>aFceaRc}wY~ zOdID2-W;6p)W5N3YNE~y#th&+X0r4rpD=-za{vH907*naR1!)_t9Jrs9Op0m+W$<; zrTfM2eedm8e8bn@zUu2ge0$%AzV7yA?|Wa)88^@uH(s#)*vCJ9`}jw{>-PQM@z-vD z=dXUp?ZNiR9GsO^WNU(iTexT(bhu(jVXsr)^j*Rn<4^anm z5x2BEv%$v&FJkjP$Q;rmj&45`sdldkurZ=)4b9Uz!}clL*3X;r#xnEC3z@dOCRP>N z#wNzpU(+QhVo1*CTZ)O2qS$1%^n*kH+#BrU4dZwm9e(Ree>dn}LA9@MoRgratMF=$ zF}6)H@&b>!1bC3{r^{mWWrinQ4#qWShi71n4T6tEx_eoZdK?Kr|9~s!0$gF$U(3Q=TLnfV{(miS5^3@wi7q;s@YY>Nq8yf_OiQOAq1{*)U8Af&d z#DJLjrY3q*K$av58r|3#BA!1{BvkX4``|#hxWN$x{9X5RKliyU^=KCec-qvTk^4Uc z#>v=ou!&K?#6a~$Z^?!4JeZ4pfz;`P^zz_dTbnMK5t~>4^JRY$4;n^KrVDRp@s3V@dL}}Yv>1kw!NWZm}*9vE^ zKGYwF>xT|UoN(Bdl!0$O_{7U0{XDb0 z^bZ02F9QGPXRCN}E(Yb!jj{KTi~zF#vAh2{6xE>;pb@eA-+KshzWTqYAmyCq-pcJY zVtFebbbIgFH=@uIf9Nxsrm|YZplZmWeB?iD3zHO=A>R8~8LD3ym~v}DG{;Lu+|IOnqxtWp|@m=%CWy^JQLM+3U?`X{j4y(%a`L5G?;zFGE znveBgzx4r=2KM05JHsf@(PHnM4h;RwnYfF6eRiH*58f>211WXE;`2$?--R*4c{z$5 zRWSa={q*~x1Fy~ejh#S_6ptq;<~wtnI0ps}bfRNOy9>jBTrerq=W&onMsZpH^~X(9 zF97S8`O%i4YtH`1DG%#UcD}}3Jlt{-IL&+_r>}o`GzIAV$`hsJ0a?H(X z4+vD79%7Q`uiqc@6^{M{P`2h&a;|s2&OrFi`T=Z!k%`57qP>Z)nVvRwU&P=W?9=)I z#%3VIb&eSSgF5=w(H<0Y+n;j7@wB=AK7o~%ntB7yM;Q{}69JiAX;;~w#>4;wecHlQ zFu22KeEk#|2OOaQhq!iZY28-`YnAfikjA{knbBSS>Sit^7kykho!mUT{tf?@`zP=y zjgpHYy%@-t8m}*y4)zGdY-)AJ=K99ux)f|`%gbP2v`yem9muwt%5Tla*>yknflm-g zVs`VoU;2k94=5+l#&v@kFm9XYGN2#bo`3zL*X23^<`UnG0TgI42pqwsG`BO1*P2r(D2ki>R)9Xnz9gDC;DCeXso{a!Kq9Kl$$j{gPk% z{@ZW-m;TW0SO3=En!U~>zIu({4)~sL|MuHo`7i$5?eBf}-+J`|y-Lil#)klZ{m=J9 zfS&uF|Kk8n9c=kN|8ZVu#qIuA#TnuWCQmeC@=pXjkaZY2gQ$8t-uv8p&wIR{j{*$Pn=grgEG7FFHwZ(>g z9-vOBMXpDVp2D-5YFCuWpN6_Zq$a-H|78vTp{&u$a~a6e7L0t8Di}qf^wjnjTaMJ7{5sR0Zsu=#583XEJlF* zreit`4W6=`HNb6V(bJ;@xtvo9FZ^W?;GnGNL_eQrW!q{LQ|mVe0Hqi~+5L*)BJ&S? z81Fw8rTRRq?6N~cm3qE+ci%Ae8CAM0{V^wBGIZgYkn_nepw$%{B6GS&-;jb>HsaAp z1Nap@y3_iodpOtC@Y~Rky;t3OPGw$Wjli<4Bg#ix222WAa0W2LOX!vXQ)IsvaGG#y z8HwHKA1LJ<<~#bZ|LIcwKYK@+yL97m)8TIGoE{dq{|Ba*C^J_*zO5UcS6X!{?F3rP zZquenLBEh{gIUbH!V^ZobhG@=ML%60?!K1QRLj(A%TFlx%wYVg|d$pvo>)nre52nm+=&dEI4X5rs z)h0YcOVJ{84wu~%^4Mc22PVVyvD3&f?AL)-VN`z}2=eY5EF*LZlX4TPkZSLv&uAjn z!sq}>dgx$wU7X}%@bsI;bLlq;nyj%&j?M}?gjK5pH=xO6$D-hrsNiz7eBMokEl{Z|GPZML~)TLv`II&@0j$jaL3P+{*JkLE04-cJ9=H zPa$`pr`_c@n#hJVg`C2PPy^|YMvqHr5|5uTxN52o-F-JD0Cb#tD55T#FRm(Ox4ADQ zRDD!kEt8J}``2%Q zo>teILD6S+`X=|GFryrmmkCBaB^+Ob9UXN5sEdO^N4GQQL`_GWexj)h*}LfjS`BpI zi^_uCVO!OPV*rJ)ZaLHPqge*DNMBp{`B*sM#PE8mOZTXiak-0Lyh5Z?NVnwU#jubU zkM+2IF&$*SKH@M2KEBQr2yCi?)n)F){44ZjP z@MXQ9P9MYl58oaKCGP{xE3%g>*1tSt8e=N&wp!;-jZNrlZI9tY7a^0-zGVEf;YXh< zMKsL|bycufVKiCq65j1K9uZG_8`+sD?^Q68X`ujd>K7CCz_OtDgpjb#&*#{str;8> zohWzW^rl`wLquw%$<;=kneU>n8vz;-aWUatanhe@AhsS=JXn`_cG)kDrtzQC;&%wK zIJp~jKfSaqvfv7+?z{VNw@hAP_25sU65R#qPrb&GWD|Jx^y=^a?lK_gbHu`{wp)4TRF4~gomznfoB0g8%5eg#<%#B4Q%5~2~L6DLl)ad z92wF%VQL>kI8ZJN;L7#35kiXaKCJl@Q1w4`e~02>!97{J3aB57?sD$%Ch+d4>*ELS zM>qpZ6*XSUpVg4e<|<&n*=a7+>#$;^jH!o};{LUMs%MUIpJUKy@Mgk2wSKr1~0x+AbRVrz8t&ZAZ+#cT8 z3=^KVIk}`LA}w?xr~zjD3?)Na22nq35Y1H$bz**iw(jU{-FYsvP@QSwycWaO_nJ!> zt)0|JUU7?EChLt#5Of*L*)kAtQWKfI3!xcBoTS~)`huWkEDeg*s9O&AzNrtCk->27 za9zY+TcTC6>bzNpDnxrY+%fFPw^|(M2iLJT(jK{&9B}vK>e-e0iroP{{^vdzN_`KD z{j7yqj}u6+=FdhpwgyZ;XfMJJ(WjeZ=)X|`(2Yh9)CmGc*hW&QDDbhv6>POD<$h}b z?IX(T^dbFU?L2MFjDmGd?R6GBc|(_O4X~!kFInHpdXJlh%xPLAq~S(7#vv;~U)N|| z=qCE*U0`Rx2tXM^3k;8lsl;T)Fek}Ausw9puWZRw40b$a@71ES9b0_uQOR#a7Rrts znS**q%VZ^oPTk0$)8QE-U~XMvYl9NB^u*~#43L-cb4tD7Libnsusqspn-Jr-br#O# zReg6&E+K2u5qI{p`oW1^Qr_Pu3Caxgyv( zHYxH=5X3H8ILA5anzPx~w|pb@x%d}z@ExBIh(yonTL&kw8q#&G{hxQma=KI^mkk3- zz%~IxP~UjAeQ*7yVGe(f+A(X4&g3-bG&JwCoIr?9UZr7-SB-0NV{kX(>D=E;(!(U1 ze5+tu|HB0AUtX5hR<9V1CJi>ca=dAz)y^8SJ`G1tANR{9tI;O)*sgJ8 zcSj46p`8Z1!`ce-hU$$gvyS7g-1+au0%phW z+c?a5)NeaC0pI>=26m;ANSk(n%QGb$>igky4T=|fvrdI?ol*UY2x>R+PqjGOp4(y_ z;JK#dMhjV=MAb`E3V>-AzQduX-DPfRQaEx$qQa8rz}0&bC^(;|gT4S}n7(5K=}_8_ zW-_$wtw-fDFrMUjiaz+8o0!(Se*EB(S`m@S|F?;C6mLrn`yjgeya!woSM|W0Hnd=s zrzk`I`TfeCLfCcv*DsgC`_xi~edZbouzPn|)#%4^N{l&Q~O6>gULEgo=R6Jrn5X0^3TtTKXYFv^trb)IHXo zI_gZl9xars3Ryd0+gcjhjYhxgT&{orEm01(b$7m5|ERIy+wc{d@wVxHof19!cO`9; zc`$P~zk6PzQvc5xL;Wu)DaEY)2Mf16Wyv_3#LjRapN|*V?Nk(?Xz2|-1jD`~ge^eE zDZI&>>k9&x)GalTg6H)fK)&Bn{P1;}chE$v`-x#W=anU0W(j_NZircv`VMua5FV6| zR*sfd z{n8a6N=`)rZ14w#Ra7TC>?2EqBXy&u4m2Rcz9SGrzmIU5kxtGpI#Fh_1&>!@|%WaNK~br>AxpbWwap>LE4;urWk&rF#b9 zUwNQOLvZYoFl`jDIjf{nR@q&DilWUU8>vY2fwL!)0(@~qMB5yljiN7%-|lt*Ua5CJ zunfZj4$*LM+o3meG*Y!0w9mD+<`?;iaM<#w*>iLTqGOY7kaodxlbW{6NPDy{Dhalh-872kMZE$XmISwk}JNpmw( zB!&E>Q~TgAHy#Z)EEnc&{>ibFY6=D_Ni#UW0UreB;KqtA0C-R zb&DpiEDLs(e9Sob5y*K`LA?xiy}ER zKj8qr8g5y2N^XQ_fY)8A98(dGk0pwX+^(uy&mJVrIZ$O-xN7>Q$>ssuLz8k#Jms?(T*aBPF;bN;a^!_pn^0R$)#Z36q2lLZY;SBSfuk?G)Z{CiXH6a*W%8cE1h zdv7@o#8?-SPM-QqvwtP5MId>8bqrW|T$*u`tZ&=9T~LwxFQ2$1c;`~5yv^8OshMgoM z#{6opy41bpC_@f+Qwwc}g8_%^&#Mv8;^{k%(;PYPne&Wo*hLQwzMgy!k7ne4->lFO zq_orYJ*4Ji_!;crOZ$g6(QGfsa`Xc^6m{8?mRB3ljJK`@&?^8aDh_`1$^*R54^}wx z*==wa_13&vWXrK{M@s--1wwYoJ7QT40YjRoVm`;9&YeGzT(asXc#cZZ4`*c^A^4O3 z0+b=5aQ5N(fm#>M;~uvxb)To&al^KbKDnY$w#USCR{UJb;iRL-*HluIMnbEOkp*(kx;AwM=UKr{GhpLv_sT?VD?$ge;2G7yw>C-+vY{tm_V4L8w zC1ZIWwvis8tupGZkxYgdHC25n$O8m)ZwT0dsC+oVN~`EgiX9PB7-j?wS1@;E&-be( z@mzofJz_|byzO+U58ubRSCwjCdDgeLeS2gw`TAqkj{RpP8!hd;;py(cXgSvI&1Qs* zGze=ENlGx52z}{piuGt>=tKBpWn>y+>My#U=TLjxyu8Acr>LBIfH?y)x5?NJWBLVb z9uc-D$*3FK^XZVL4UY6H6IJAFR=3W7WLHm<66S-j_V72tl&R)W{BGH`(8dWp(A^_2D@4V}= zwyOj@*q-}8($oWq8&&tk4a#RGNG`>XeC_j`O|#7<)O#6M3hARPPb;-I#Cwqzqv{?7 zT8wxc?4C9#dW={G{4K__Jj^n1Z*Z*2mc9YbvNfW$vVqvwj}ii!Fh_Y{vQ#Z9lm2jC zy*n$TFdW+aE@A7bLB%jrJ@-3kiKpMyG5kDlc4@kL~up)uFj z4|nDPQif+7;@3OIS3D;js1KzP-=~Ni zr_%qpy?lyuKnbU2V$Ytc&8n+?{73J2|7GLOEhbzHOhp-#tivFRFFn z<#HI~Pt5}{Jh}6znl?+%Bn;70n@$&K{dBq0hB62H#S7a5i^nZ<(@>1s8l01a_B?a* z>C1Q!&U_ci1ice-I#0jt2{;2D>t=lF4Uv894LiCp{CHy-NKB&KgCA3(z_uyj5?@37 zfB`vlLEwikdJ)BXZ#r}6hbo2dN}Zu+`RYbP)=7UYudb*B*ALeNOaGRL38>iVBdKd; zkyk^^+P}P*TBH}bEY#y%0rZk|kz1K2vhhv8eUa2)stE@r%W2TJzM51WO8wX}5`|j8+vY`sb6~1>-Zq&zLoBdq`>2lOLBRzL=mU`6n zUvD6z&Xmy;ZD5C>Xjy0wiN+vA^G^fd0j9Cigy>FU`kOT2r5Kq~qu7jg z-o0bx+s>(Y1o4O5C_fRDyf&elx_wGUK^U2_U-Jg6VI`Sa$DC0^dO>)G@T{8V@a%!< za$0T6_V(^cbf23~QQEa23(BEgsYbV3%4S0tg1;uk{B{bVNak?k+@YODk+9sIg`5;K zX@tmwod0^2a?LPE=s>+Tu~(`K|ARI^dE&b}V_f{7hiZsL^DC1U?Cuts!}`ry%=F42 z6Yo2}p{zTfOO%ocQ{;Lhf7!#=ROf_>(`98yRz67WW2xaN_jm5}*Jv-UE6A52+-BfM z7Xmxqr{33klbXu;<1dHHRckeoN5LsRqoin;wEu+Hydic&47~=edQ?qkhvQ0;MA!gX z6%kiPnU#5oYYw_l+LtuCg)SBj%Dq zSVWCznEdYLJK)t6*<*&4VwB((dGz^Si-O|SP)5(i$AMcyOfzif>@IIWXd@OwUozsQ zl%7=^326avIUTrvFrkp!0eVi=T0hMSS$L&{7csWZD~Gu`%vg@d1PgK zl!(A9hp&bqRX+CCONZT4GeoxW2c!)TL;Sz_#h8g-^%A;c*vhH2t<9OfG zCU!HV0A=za1E-SJY6`!g-m!U_%l6N%sp`xu0=RF}&Y*Y+?!bat*gUthJ>Rt2gF}9n z+a8(1ErWW=X0uwDzeqetGvID{;!Qh_xjfD&t%mz8J9Jjz5bE;s?=pVL_k1!+edXltT0d?UIJiyiEATU(&M$W zycRa>ZN=12$zm~KPK;7EJhl}u@hg`B!7FXr&1+H6n2HKKj4b$>G$6$AFAcm@Mf{0# z^*cX9bVorNnk{@@Sp^dwM;*mIU&E~+8#I{ffgOaGle=gJd10R*i?D}J?&S=x>lx@B zK3L$S*b36$A9H|W8#49ROKGLO;dIO%2inyVZXcjGoMHUuaY1#t15*QCT|`TWIQ_oU zi|jPKu!npH@=-hBezCW=;t3@MCOhP~7_;XH@;-wr&ygY1Y zN3MYWVBi&qJ?3Ne@l{OJ-}^G<9eOS6o0`X~-cp()etpI-1Z39&E>5FfOMhBer00)w zSljr%siT}H{S`Xt^{!xX)4FdWchuKN5Su3bid{VJ(k#$e{UDlNGb~EHwg2IRmHaPG z0TnUAr4c*R#tNAKV3^cvMHHPr&Tm*Dkan;CEMPNj`Eqva%=LhCMZD%GqBLXEdRQe`f% zZS~$9P=ry9Jvp1v{$ImX<>(FR-RvylzlQv47-=V*1Tk()Yo1>t z_=DNK5NT$uJ+Pj4L2&!AAiO{D2^|YJJepr(p~=P3TThtjmXmY?s#I86xujf%&J|x( zj(Y8qU6`)Fckt)NFVj7?gvM?4f-g;{^*JwFhZtt_M!s)&H>KD1Q)#(0;7); zcam-cIn8tfPV|y`p1I2Q_w@k}_E?h^l>yYY>rogJpc~7q(B#0L%k6Hx%V?MeRE)I9 z-)3gd{ul&jU(QhL3BGm;#oPakZ^T!TY1hoxPskDNeIuoQz_eJxnlO*OFB@@Um5Xq{ zo+HIS$_KprIkml6_7P!KLeJfw3ZT&s&})L`$6>Z{Q|Yd zf@p7vtUqy0IJPEyb(dI+@J%l~$CqDR7xsiI5)vf;L{JY*Kvz+@b|x2fTs z{SHa#Zj21+Y1-?mR6_4-jIPC_2okS=mNF=9cK+|9o(cg5c05a~bOA_U&Hlu2dUWO! z*oLe110T}8-K%N(b&Zqp#MNJy19P$hGbWlWj}1uskN^U>)*% zaH|;&o#jbGlaFd~(=>Yc+$rc#!fA~g4a(tVqGy8l%h0f$f@9wBmX?RX{{ZLqY?*09 zD7$>YP)mrmb0j2ZiZFxs^WR%;bY_XYDiNZ2P~6ec5n>N#PfQ}^#p=QH5+PqL>g$8Z z(ot&>0=TIi=!9h7>Ny7RPHhW))M3*?gs6`Uv92sF_K>hR$5e0LH6CxPq=zD0zhAca zbnv4^p600}QB%h4%S5eaSzmX3R^YxS;bBY4D~0g*1KEa(!oxvNzQ5J^Ew7Qiokt0pidTcN=0>C z{@D&bQ$4Du0fV-lwwM)GsM~4wQuDO0E9LR2tgP++08FiYoq6y<_!xp{aL*oC>C5M^D1j|69IT z8@k`qEZ&hPqzPLKzI3TFZe#eAC9#0W&&$Le)X?{r{J6_^(yT7MM~287mAg_qI3#yX zT0!9ocJDP+j@UELTF+Hc%@XVgJgI;h@CO}vj#9lC1zq4IkSXQBlm5gv?3R46e0TFJ_7 z;6W)z84s?=QI#kx+0#7~ZfOC_tXxeE>Wkn*IFKmwvSs<*t-JF;DX-7j*Bw!YcI8AS zF76mZTs*|R;HhyN8&Dd$94ejs#y>pFW>a-PnCSo!-kQy3TeBf}&^>rHkv~wVF-Wq(q2$OLuA{6u zLB*Q<^Yy0Zejb$85gk^-V`-bdjVyvw0p)HargXm z;GcHW*qp3Oma);Uzn<(iZ~|Jx{LPZ&a!OErd`5x_FE1Fxw&^^uKBk=ihb`ColN5JP z7K6gKP+tp}d*JLSltjBvv!SEsAO6SVOw}yfTJ0U4vxGZX`#j+qu`fY3u;z7KQ)GF2 zez8tgl7ksiOlLthWt%;{xwF(Qb8T2adO$a(W#QgsTou;ABFkFJ#xu#A zFLSWT>j8{!J7j4!57NO(T;Su>E8Sk8_x3RYGH4s_-DK&<&P)o`4&((0}nlM_h~B^dL}X`bF*I|Av=xDzke* zCTu@TaKOokzLUEGV8>?#{M|M9ld{NDK+tmSH*NfNVp9*c%scO@$L;{Im!{LUq+qjc zQr^(pL%nmHg8{A#zZb{0ezbgBNfV8`0!M4{bxh?PO&}0xNMlZ+oabB;HA(5 z`H`**zgzt4jinEyTMvh(xmcr%+O|0pOS6Xbf^+E4{OP|T^8=CRs?~za3*#oeD{5<;u#ec zH|)QST$WpJ%FsLiUC!|PfbNy2D~GqlWD&H|mz3jyo9kT>!ciA=vHQV=;Irk63jmj~ zqT!VS+eV4g3Rx)?J2)0L$ z`lsB%5li`l-H8Zb|B!#Z)PU==*kW#48%gZ9G$tjcCOi*lDD)KagB38gZ^&wty;BT# z^dkvKURMsfkVj~x7<>p`i&XI2Dk~-$1s*60k`g$EIzA`1&&h~%1~K}byCNtRB*Q0@ z6f9p2-b4of^$|)NZA&4HNs2+r6-8X8uDTjVeByGlugO_r4Wp%;=wyV>@*1>$EpihY zh&9Vv>d1lt|8g(eZ)7@9(^&)mVs0A-U7NfTdhjh$a$-m<*|jQOI9@Au!LNfrR`KTW z(A;a=vp$ z6rRzOx-3(7EJ$3KwYPE=^s}Xh-%NU9){^DWev@FIr%(Skj zD5DHSqrT0CfcM_dq3Lki@HRjCv_ehax@C!JcE<|N~h_0m0P~|us*2ETk6vc10aMt4P z?S%4NkGjTccrmL;vDT_nsJ2a%@Sb~c%@oD(K|S(miPV?0xXR$FKXvrp+A^krTtq5X zDD7lLVJGu+gz%$`M)?woq~ClA+bUKERxS=^^Q4j`;+rSJZqz`=!${-nr_VuEFaL9U z5@74NRo*=#DRPQ3P5ZP8ybaw7U;d_PRsCfo$b`|5s)>u4CL*W7`f4(1te&6yqqwO&!(lxlXd`_df$PdBpAWw|=ZS8YcR{H_7Q^B}gc@-=4ICgZ;@f;%-*75K=K4 z`bKVKrO*3K@JpqJsge1~5wc8bB~0s?4@=bK%uE!*$ zDfG&nLce7YP@kJownt{KI|ivg)}bJ{#2ww!s}I=v@nX>Nx>!2YPZ%VvSnt=8HmNF3 zxz@ER@3p7v4w|N}Kuq|@hqo?vx9^th!J95DDO) zqR`JA*8)3qQ!9S{4*OQ|YGew%sMQ(|Xn9q8;y6#15=>iUpC~c5y}X9`So}`5n)BsJ zJr$6-pMA&adwp%q@V_Ur_#d8B(>EUyl}gfl4k@n;4tepO*R)pHIIPw5amgp~rNv82 zIY6$aAfJU7F~50tIHSD1pEvzOQwS*s=;K{_NbQ+k=dKxq`bI80F+uGgsiBB-2WTc5 zR`|Oth?x|#drJ4%JuQGygAg?zWQdv&{+@maRUwFB8M2~Ohp zoxf^U3K|jyrjICG&v3t{>C3wB?2;F|USn2BvX*JMh3*#Bw3qb??-S zS5k^2nj4=tqWw~%rtIyVv5;V>btUyCa31=P=@)V~IugL8+EQa11Zho)YVk!7U4@3P zvpVkuf6rIPaX$TVzvO3y6oBKQ<94=G;OLtV%5SvFf&%;1*Z5w&%#%K+dO0bj7EBo}TLiyxu_lx|ro?jTttNQ1KT+>(&fxLt2^?bP*?2Vj9SOtPh3o~plr>e4 zPn4ILc4bFqji^Acn1NnZNuDV2#_Pxq=vFzPlT%v8Oi`2-#kw`I(H{XD%M2=^tNS)- zKVD+zUV>A|1V$Y?N7%_)i+usPgGBV^p$UJ(Mp&?QWf2fEbtLuvzGGXPnd%=CzOWnq@P` z=JQKjan2u=cTik@dIjEoa=(y|R$ZX>_cC5mpO?n)N~5WLKJpD#cmzKR#vVsj@&y&h zXm7UQ+rA@%I5TMxJzkT$VQ0S(UHSF-m&8Q(2czoSVMS;GMWv~+=)ks-)mz0{HLLcf zZ1YwD&>}#$-B%t`_d4|ACzT)XH`A_$7EVYBI^S#lvu6o+jm&I_>H)Q!EDAi3WY6kZ zwBw#_tyg7zEsTz6T8d1N5v7Mp2)_T@6a8JJ)DW}PvYXzTbH!@y`RnIeXuD>`TKLmvIoFMS4AOu)OnyP{x<;PV{pb^{I5U~7mSUA~U{Jb%6R)Fd zHZUi2ODx7(EZ8X8dckdKG&crD(b;PbvRgnUFT5?Wl~G~`M0RkTzA_=cp;yyU2L<%4 zZMK$eP4=Tm7Ze^%dRhzLnxlYPEs9|mwa<1F z-V5hxEz&Zz9C1M{P*R%b8z*BDz|X9 zvw>gGIirsbuJ?3nUmS%kYA!E9Ni%<;V>wx$oP8-X_T zw4aVcYN|pf?y=4E-x9S$j72J{UyA}!lI_HtnNwTjfYFC~Whz4@Hh zwS!0NOhk|RK}=Q#i^DI=<+{Y=C`uYinqO|qzkv}``FOk}2+G?RE`IYbbSx_`Hb-qd zJA_14EnPKlXw10l+Y!U}7|J}Xp{TK`J2R`u9vpWlC3n;U+X`ILdx#=Bw;`v%q(t}Z z_^JA^*F=MRmcw~$;lX5IvkV~X8~2J&GHc?lQ4M|_cfVR_>3AR?2RSu=hqtG?O%7>A zr+#mm);2jmW8M?^=6E(QTg$(~sGuI?wp|&X4buUKK}}Rlt57n zdzLOudU{#VSVo_;G{UhZo!-vVG68e@a8rH5FF9+;NL4Y2B*^n*jc;{KvuV8w6YEhb ztAlN1@seWe(zh5q42<`{fGu0?Y>4C_#Us{KJ**iu?6s0grrD*GoER<072<$ZKgn=Qg3n>=)-pUfS9a zd+I(n&8n;fob!s`-zUI&g`aw2{z|AL3xxmSsIktiBzJ$w)#KUyrbbnf5)BJvZg@CQ zmA;-B68E1yc;3I^>2+Q@rQaa0Q6<{KpvMZ;IVz3g)h~ zv2Sp*#3tT@^L zr8;lBk%W0EadO8)VgXS@wa?}-Apta{?loP2 z2j+^5fneZWonoC;mJO<_eOFbjYyx?n^DN(dr^zSfiU#}|yP&vn*Sp(Oc8h6sa;ji2 z-C1l8|MX$`4TTwtv6W@3qLwCFpH&r2P*t>duNC|~-JpE!<*(Q#;s&FD_mhEr=w%_X z&D#L2A72-3-+PMez>Q@`ANA(hUMi$8sD;M=W%QpN<>4t_^!o2U?Y^!+a|S3)k={Huqo+`vPag75GWm8&}20>Lc~w>C!Uz3bfns!QiG7C|+fM{B`DF z{43>Kf!#{pYQq(@pcdW5tc?Xk6THWBs)B%iaLNjE{-a?&-XOzko2T#JLJs~(u*xQU zuAfy@m0J-}^ix7YMTwrKMhW@W5&|z|gWl{6i5{gBsC`ZIg&bKz4PiVcy^@d4|#lkOwsssvXQ9IDICH7 zkz%y9&hn=YC#4FB0uRj^H-7~Me{q<+?Fko<6FliV`G8IC*dK>^5&j_y z`S2cktRk0BUF#w*B?DW#_aB986VA6shB|zgm$|z%!cbq9HP!28Vh;gY<|P&fm9o_q z85yEH0i%ZrrMP3HMy-Y(M@-UNv<*=!5W!$rYpZKcK3_+VrbSr%XmG zX?fVd>tLS@Ed)ge&-6X;Uaz(*hPmslAo*gKT>3~EZ)v4xxkD6Z!tfWj${p!3J7$fe zd*$Bkh@dPkokGpzs+s5SuH5Bu{?3Eg=X^X}y{&bj%OW{3Oi0rnPt438~U`qn8?86NO(U0RZy~!#NODtP++Na zz}m1fod&ag>oWWX<3_!wke`UZn5$ub&>qjKo(TtvI9&_i`xsx0Vtf?VP%fQj{HXih z$4OM^u`QAKE=%f)1=BUZ^@;wc8?N-F-Co;MIOHr=WK3U#AEWC-_ftdD2?S2+!6Gkg z?G7HCqH^9>_M#M$()bwW1nSFas`*fSt? z$KY-~pF^ME7iXKn8pgJZ)z%nO+X*7yoc&w7LRR8o0rbXh>y?3qdllYSTV3T`#nTS1 z{TB(c+-~;3omo51(Q5f|D*g$o`k@tfJ_lh#oP9dfSRQE!cBxfo<^769+)Z4hA6|<3 zBlgAu9cUT@v3>CvytCnD@&s~c^y2^yo|Voy^;6rzYDTndvR^ERA<#|suxi#Yr%mNp z<8H7Qn=tcJ{KdPI0&#tE4q&?+iyh&2X$rI+FyjoaT9Dco7;Hn|qN%-DYe)J#HEJo^ zg3)VVpeNO|A=eP6ICwTD8|M8W*Kao&bLn#L4#VE$w;@T3SPjK_G$?|}&$+<3{XM7% z>>oGs7qB2hl`>+KpWa{Ky_ON|H+pZ`N>~uulGLFqh7W+Qe;i42W}PTTi@Y}GWK&jF z#%^l-5{Gfew^PEG3ExT`_N6?%4cpqbC9OkK z&9wxh$8W%ZB0X!Y{{kx|MqQ3yqW(uwsHi}2`;5J|y+eJzND(`A<$iU1^y5!GfM~Vy z|A(bL6dmxMH1P=1Ei~I)TUu%Rk`=qF%jh6FzYyqf2}ApleW9sH9i*ev1|_>(KP0-S z_J&5>&jkMJmx=4#mvHqIS#sYFZIR}MEIsXmrl(#zfV}#av-qvZ1urCRuirE^lF|w? zvfD2C2@HlvjrEYTuLs`wH*>#k%Iq3L+tt6pi3ci*pl%sCz`JX2jMqyT+k%UbSv@lC z-#!F*2`s@bJ{JQGmj38+MA@sj&H;Oq9?NLG`>zQg3lzD9FriRS}5?gTcAG1;KPyPBnih|vsEwdo!sMu|t=)TsJA zrat-UJ7iG%4^z%s1f{ayhQ&$h3+Y=K!^ZnRg64Sjs zw3ieE=lJk0XKGCkjU*4SAI#ec7FX;#P}ZCu5h-mMxGfg9Sg@I{e;DL37 z(*!A1n1}F5NtB?GnQF5(0P?!tDi`E9y`Y>oVlqe)vc>m&teaZ57DO%XBLXoTmx6x<4CiPxR- z-)WOrn=r#sJTXETQ|bD|j%4A_53dqa9O7W=Q|;Xm4*D3ifQK;&7Ek(tw9$>ep8)m? z(=!FSqdapXP1h1!oBepEBg%7D-*tBXTc1;F+__E)af-aNAh1XYkWCvvQ$4AfwE-=s z3pi{O$B$zQ2DNfDM&CifJD!sdz|5pDIDZ(JD{UhAWKVXKFuWBQSQj|Umivbky(sI0 z)Ww@g>}Q^GnE~ge0zYrb3vEo6=G-|@p(WpQeg~l^`2x*g^4)!zr9{scL)p!+#aF6D z>h8(XqS`28Vn_k>+BYOinklf4a>AM%qFHkME714c)oV=>5*GJXJiuW-3hq zt$sf&Qx4?j9^VH5^1^T3esI43!EK=(F2uAq&~?b}1qeqhM7anVihZgduJ6))&a(+xt61JGHKdk>$*@Xn1f^jPeP>rR zU1BULuK^;Mo|=01mTB6%IYP*gbN!$zE7{N{XZky>5zSC%di4Mk-c-gS-=fNyZqRhw zL&tpKa$}}_J)+L?&YR#X+P|x*-OV1D+u&Hbdal>@2dVIXv|D*0JGq>x=5MDnc6@{= z&jY&7KK^Y8wVlbq_sDcxo_Cd3*1C2lS4V&TZW?}EivCTBO2SGL4o4*J8i5z@!w3Nr^^_Z!h-`T zMJ$r6Idwgp&=e+Rkb38iBe$wvJtp22FXyxxCyR%ZHxw13chm*;e3E2{1z<>#DMPT2 zP2{LVKR zTFQDIRzGq*lzBb*ySZ{AsK`{irfTX-x*CYK#mk+P-V-+wD`i?DKHf@5p`%ao&s3)2 zp6#RCuny0kW-Fv}bVNd~p1Z-}spW&3(1+kT|C>rJ?HkQ8~OnEZ?4a?=y|z+4T(ftU|L?(9Nxt zW8MeKv_0?YxzEWRPj58Ekd%Dh*CQn{<9RRfGMxAYJI{4E>1QB<0Sg`%40Pc0XiJaG zw=jTnpNizY4Sg__P7eDyEq+mre%Y#Hv>}e?f57PZGT+PnPkk=ES;n_ua5C=wpY%3A zKggNqCD#)^*-1Dt%0YZ+`}~JLxlJ;>dW_8f3WX1IMF?2@Kteth(M0bgU}sPcV~%Wk zTFU~A;KbKoMK1Ct-|*q;(wD9XWoqbi3^CH6ds5i#=&Q$fCc2g*?6yab_tiQ4oF}@pv=UaGNf8)Bgy9Z)A z>W?e}hj9Cwn8dYyY9esPNaW6(Uh5Znt`)BM%qxXrGuqtbNT64G{x`3UPcL6D#&u1} zB@cs{oH%08?$#XLbuF>)0}f<*ah2W7(bI|;84No5JUAoB`&tca>&H*v(SyJ0kRKnq zaCwE+9Pj5}-QZWIzhYm@`u!t-#{^v_%?V86Bs%MS$RYB96yZr=0lPTi@dbp{CJ&KI=bXQI9!J=38ib=RC8CMRf!YBbrtf zZF2YEQa_;BwL0&R%#Ft}^Uh}NO=D&L{oy_#plfauB>{_rxGzpff=~%vTZ1}}q%lJ= za2=nzM#hhu0Zo}6jG9p*$7sq{Q!MIFRX_P`?43K~;|Q7YTfcSAy4S54s1J!X6FX|{ zx)($K=&XM@h`VRX92`$vFyxSHx!P9~zXUmE001q0-&l6Y6^@=mg4nW5uX!V&-x8WJEqZz|5X*{OrX5Hv?W2>UWSuft*GhAE2QEJbHTh^yh+xhComU zj+^h`hwCs0YBXFD1bG-F&^L-XiRw5Lk1>syJT|`RjV_%w@}to)BlO@c%x*sr zDWb`Rbzk!tWacvSN9$gp<{9HUO^pRcItrcm)F0dhE`#Iaf&i{4uc3msmJu@8daZ{s zUnl|hGJW}c{SupaAZgtb=sMoicdewEyiY9I9ogLTL32koyy@h`TosxlOLh8{cjs8W zC7pFyO|aHVCKK5P%5yT6=CBqmdI(j+}DpX%@_!x z(oH{_tsg|7qUfJ%crFI}%Jl2A{o1!z|5$%=>6$jDm7T*~-|6MK=$t>|UhH75jhLIW z`e3iUwu}E0e9^~sxti_EslWdXU_xAjzhZzSYY9`x%Je?Q&ZIbr=m$#`j|HH+w#C}x z_waa(hkbR(@=p&hJgbw7%@^HnLVdx_<1s( z`AfXN=v2Omq%Z%fue$x;|J8r(8{ao#*{{xr06%y8#CLt~9BEHk4p#dfqn_HH$Mb~t z=>`NZ{yUqxaVEVPjLv(3Fi)$eKKQaWlW9#b0IghK^|^=#g(6M8J$UXB z#qS#x6?^j`&^(IcI?sQRX!{#i9idoh1pS#G+Fr>wJjZhmqScB(Y80Kk7xrFC&f(x2 z5Of_1bhsDoK@&gC`?L}>T~~TrFdJXKsek9X90ck^#>md!6J6sG!8c;yz+}9yMJ8yI zkf$21KG!EPQrP^6v{{!5W32jOOB)DS;u#xdzn$(Dj;(QUJL>L0nls;W?O3kOmwxgj z+2i%bVq1im2z9rWD6~y5 z79m2yHb_At3O81`vOwYj{sL~ID7X9r9By(2gbNT70uf@kK-kENl|T-5Te3QB8(}+f zyG4_3)7`G-`Td?T)>`ko_jjnOugdQFzWMHV%`wN}8HYL7Ttb>-dhQc93k4g zaBtt@V~%o!!36A~C(OYyAy!MSVVgJrz2 zzw7YSY z_?r6CaiY^?4UG!mUYw^#r#JjP$#(;)Q*#^Y`BZ zV!Q!O-xrTl&*&N>L8Ymle!{P>Fx`ycunC{N&mE!OcK@{cs z@uK_-72GKMqL4lhKg}$-&WVcn;2Tc@q89apw~Y(y@vlt=!=N_C6&7tZpFRI*IlJ*) zeAirXu*FWm1SGC12&VvS^5jFn>Y^~ZvG2%0a8zCNJM!4WT*$Ht7QsJo#7OL-BEt{% zT?ZL58sF=0<*X?iHawa8v0oeTJ>P<}_E($D2j1cTGXK5lK@zXT+8?#y^3>PFkjZw4 zU}v~FsE9H|^}%W5ike#8phe5g@~bhOh#aM z9W0o-_(!ieb-UmAgHJ;yy^3xY@xnDrUNj2ce$gU?ZC--xz8L1gUvwgAv!58RzcJtI zX{6S3{1Y4T(2Rw6t3z=5_xe9_yYj_pW>_Eo0UG!61~zPiZheV?YvAOeeh#X{3L9{c zJEg=3-2+D(wSmjOS0!#UQCJO*)xe(l7seg|GV@p);)0i)mGZkJdy}=k3tf!R>$g~8 zB;dliTBHXpHpSoTKdzcWb0>dY15=d70RTLKw-46bSYXrj6a{qW7vo30NaUXf^KBHn z{x@g9Ljy@n*c#9HVEu@fgFQZ_MT>U$8gAs5`HLQ5o%zQGU3eVCX${OD7S3(xGKL8Q zd2nr=1&}WkJ$W6nnf55RCyHPLeu*s zMriuc-9GF?SNpM9`zPhWAg-6jLmymx=SeKvUuk$e7n}a6hRt*1yU5Ws&h7CrvD4EQ zYrVY?{}SWYar-CnqJO>tunqx1JMG>fV;cQa&n?~->?mw7rLhbB%!X*Q4z1?&rO!#a z`a-7s(m%_`>LK4)w%7G> zuL@vdf5~6Cz#I!WWbImmBYzYpCdnejteYoR&(0se-OQl&(frvQ$wRL=>4j)~$(;>! zYmR^0>`4$3Hcg2G{vVdgz24{*{NBC{Zm9Lk`xJ*~=at ze8%-tLwtpqf$Mi<)nk#5J}TFyO&H|l518mysdb8gSmY^I)7o?AJu zdL5$Q^EziOC$3MpbKascrz2;kL+tbPbWM+L_rLBO2O_4y(-&%K9S@B>WUqfA@C^gL zeF>su2=ic{s_vT#df`PgEt&=#GW??s%9NJEg~lVe>#lZ7)2|IQ`!-MVpc%&GA}6v# zKXQ20Odmp7=4T2zOazhe1T^i|KMdL0triQAyZ;|R;1M`2G3&o0 zj_VF$qpH7JSqm*!ceQq67fS%~#N?1z`r=5A_+X3QL*ktYWz6E+2923Th|faUm(1~o z*|=aKuMYMDIK8s93lHzO0PC0wtW)Ic`tNKLQ}h;Voxt`%KTilQp5~OEaa!kxaTz!F za7VCFG;b}cI}n(SC15Cwyj*xaV`n_ER{Qj0Xuc4XI$NGa!)fs!lw!#o& zbZ3rrkohu(8U^l|_Bp17)6qhuRvp|tHCWz>D`sKMMYT{As(O*3JZQ!;wKk#Lp0>$9)G`7R0 zQSP@i8sQ3!P^{Zb$}cE^rwul_SR-N>|7f4_gbKs*q$h9a>Nd8$z+%S}>;kj{A3UCD z*ozTf2HHf@$dGpBuuX{yvK}_hySoTwTw9HiPuraM!a z0eJNkI)kI(8<#ULm-tbs9k!c4x@+vr*4GhGqE((qnUA!qH^=xhmWdCwI6AZgpxija z7f>a!l!j+)$nvx6O<&+k41Q>aVxp-Giwcy1hmLqBc6D`8ISHhxJ3V9T7v;l#c?h3q z&8E1}wC%4nysIvLY5JQ!gCq7s9@)l-{?aRlcWsaGqS&0Ob&UbeJzjM`SpM&jNTG8y zfc7|C3B8SCL(B{j0JQz^m&b7Ft6YC$ukF~;*;cmWOMj2YNd<3DF5`u_HWQydhj+*v z-8t*V^Iz;ZCK96|hFKrtyE3{%n950I%1(XH|>6W zR@ew)TjWdrL54@9M&Q+!It&)^7({b`P1wY(iZ?ds8X-V!D(&F5NBbyQ23=QUhAaUc zZ<55f`6`a`1~9oq+vtuE69+uvp&cVw(;_3p~Vh59Ys1sh-KMJIqH)t~d$hd`+~glQBK-Gev+_e`A)py&Udy<@Vjz|%wc_~+?9KKi|;?_Pi|+Glf*8BF|n?Lr)! z>pl?`d34BbL0|?I|6nl0TJU|RAb4C`(srMA5IthjKKet6ReL?>8q%I`xa+E2eFfHC zE-GNxOVN4F4yd7wAxNv|eUbSvAMp=O+dkxRJvn#)`ZKbrl=2E{Q#|O!B{u&RVR~XF zu>Plc{7iu8(uG5?w1g`(uh5>|_EJ!0UuY`dhW$OJz@sP7T zFdHZdLrG1KZ@jU%2OFQn?7a!^V66Y}&A%+XwT+#F$gT}PM80_-qn_}Y>*M}cJFfq& ztvf`N)^5-L#z=Gk1=j7NB%w%1@(n{khoAnvA%58Bjm#75ZB5y=21m zf*PF4nQIK$JaeF3dSdE{4qssd*$o&x*b0k-nlZpzKi6OmdCkDb=28AZF}AABIntAn zT4)m)?F{(^`4bZQ#09{`!{+ZAR4Lxs;{a!)v!9LU$iH~tY!Ho^x&?mn*Prex6`paL zH6{*sZ%v97TYMWPiWqI;jBSHtY?y8S?NP!0od3cY+6cvuUGv|_+UsBJXpN7a|9b;E z4!}xlystXI4 zwe_4hQ5pmI#G7YxIN0)v6ba4*Lzm$`&{)g%V9}UH>>Sa<_gqsfj+DN^E7F)%#Bt!6 zJ23*I&h)6%mg+^)pRWJJtgcF(|Clu>0wf-XJx;Vq6|0$l^e?Ud>hH}b|Cf^7kbmU+ zKJ)OIfBj#(;k~YdFZ}dR=idST%Eu!8SN~0b{)@mb=D!2%IZ994y|Zh(T5-hFqL#+FSC7dXnDEgOKmPanACS|BxdYe`3@aB?RSczg#Xx7X zuL)AzAjcaG+HX`0ZSL54vk|6Y39behhy4W$o|T4|0b>rDcQiRJ4+Us7)nnXI@BfOy zv7j59S~#JZP-uFbr6HM0cC0S)Sqsrcb=2F3xA@x6eXsx^Mj83Gwe>Y;nBJ0&(EL@! z-)0CztneM#B7t+Zb99iW8LPg}*%2dl+!NB8m6!XW!-)-`J3ne!gJQxj zb}_C;Jz*Okz%*uOLK@x1P%Co`dHO0{>8XniZAxgrv2Txjv7gd^kz5>O$5BR4JjwgW zAHcf?#>RkX>1W0B+mZkL4S?oHkmR}TKH%kVe@zhj{t1|HQ#`TZg~?O=>A^&IeKM|6 zIAeeun*K_!yn;v$g_>gaRJ+CiP1_!NW1)YlVX`{w^4f2#8=u%Y(DU@gMsBVNxHy~~ zk!RpZFz>ATf_QGi&ztd>$y2$ThERYvT24CXp2KC1NCB?#=LJte491Vc9PEWVsX-T` z*fERdv4E@4odlYk!37VR9_QFhKcTh`ri2VsPO@yt6Ic7l78eWg?SSkvT{q}wtZT@{5HBCmqS(49NL(=M_hhke?Vl6@Q+)tv-@BmPv!H+ERd z>n2vN>()Z+t5fED@@xK_3!DGMsvMkMU$GG=@~zG2RDdx0>AIwnKXHu>__gbW`UnRC zoqa|Lvfm1zh7rL?d-DhXT8HNy|JV=y;KTR+&<{ON<+YLh>d*e{!>@hrb03?0U;Uc^ z{7nGF$;b-|Ps)AK=vmoPBB34o|DK?nt9hK~{{bjet=N-#jyqnJ0rln= z>^u>8cJYgJ?8ZX;^5ER;d`AIAK*m*%2jR8t*pTuf$SdGik2 zHC#DLUO5&JBQ5LR9XvjW(Oi|UkI{^+*T0bgWlP`OW*l5Z`h&HFSfvVAIktN3i&W#= zDJTE>1g+P^I`zeIWUe3aF7po`|1nUzNnLcqRiPmuHpGC@H~%O!ELBAZ*JtfQ9t~9t z&a(jFa0A-W%++APD}+uP1hUMfeBuw$HCKKSv1@f}4-izO*n$Cz>-=F54s-!SK!!K$ zBmaXBf(Fs+w}OcNdjF$KfYR2DJpzex@6Z3OAs%?zw26ND=jLBX?I54B7XwhRR%d8< zeO7)dl#SU_4Kw|XIXdvRZ7dVsvX36s)q%c$Zmb)h*g4SiT;Ge2{o?6FrEtaoIW+y1 zUU>zP911lR>xl!f?+A26kWtST)xEgj(3SKUVS`=sdks(MFxS5N-5Suvx9%9EJ;GbR z(^vmI9gjtLl?TO~g6GK)nY|9;fvgYQ#-L;5E2C$K-iMn1Y)#D+zC!LrDM%=|;WQQkII6ofLT#RI zOf4N@SU+U)gN5x8cE&~-1^VaZKM7XXadYd!{mcH4=ParAjN zmus$#*yb8k55uPm4k)P7FJ0#ok2y!j0LdTy^aeO|m|#54AJBZA+jvV?6O^>@>pRD= zTHR_Kdh6#V|JV)$dR^lp>dUoel=xtdxZqCgPsJb zix*w&al_^WGBozUVITOf77ZWdx|i%z+vYT4iW zhgS3GCSX+4A{$5jlwkBRk$f7P#Pl~(x$J^ieY`)Klu0Nlm8a!*~jnrqkr_-!q-glajeCw z{&fKUjs`o^&;6G_;nuO|9p_=s%(V_!z zc)fn1iVr+<`qwWq)M)fdaSxrt_J@4;5d@J=H`_@tZ}<+Xw;xm1qH*XfI>!YA|BcUY zC$0J185}upFoT7fcI3p@!7UPQTNkqs>&zcFj?BNc02ZV+;u>VgT+A3Eh08&jUO_RS zd;d2&PQv-s?#@AM^bZg*(-Tdx$ptj7-Asa`DoIZS7}a+vbq&rs1T;3@L#6LS#cEHD zW(F^UlKqv8NfK7(h`fl4Q2N13Xv$ra^7N%^j7B!sf1@Zy*Pn?$k$*AKiHY}r#%VrV zB}Hfc=&IlOCr0nTxc|+ycRWp`m;1Gew`dWc$x!;6Ji#!3^KixWx<06Q*>k4;1};8& zD-ewcaM2kae=x^@4jJp{$Uk|Rf%g!xMk(`A-5e!~+6jqF%wTN(j4$oDUk$&KkstXd z4rCeYJ!RERj(t3pKf2Y^)%u)XS?I&X(7k6}+f&~Brw#yu;~Y<{4CU+Xl%bQh=cWCq zT)XCTiT5fTdvzxM>TkX3+mOcY5#HF%0&i`?dzJb74~TJ0bHb)CBgadGlJUNA5y%Ez z{Si(9QQS#DzJYIl^NC=(={Vw5WNN5BzLF4243Riw|{wI;zm1Ie#JVnqozPjd_v_g=CSVPC*JC9 z{)q!pXBrS#c|^h@Am|AoLa@5#W}bSFBbG7euj1?T(@Rf1geJ#EloGg9vyV0{1j*p2Ys-bGD z9lle%(BV!DwIxcPdwqcx)XtF~24L&+a2Ods@Y76p_iI%1VEXnwUv=T-sZF8vt-Ut5 z&I}nd*x)A4j8$JS*8xtkOpCl4%Yb*T+}g%s@T|| ztt{XXgTFDM#*oI^vqZ7S?|_V?b93Blz>Qw>ukBIH$$!e^wBVz@K+cGtsoj}>BU!tc zRK$72AObM9d99CxzWGNIT8AoL^N$RW24M{3x>E(e`3Fxw8G#!e4#cE+c*k12$se#$ ze3XCZAAB;P_h;iKW*p%J=_OCtwWtl_ZRU?I_B8CF#mP9Nb3Njv?NP6aeMs|`xArhE z^b7UzV+YPOP>(u5S8ydXL4ICOhzUmbnYQaTUaeb>( zT?~+!KUNq7my6J1hv0`O*Mk&11o)$QgsC7M?=Vgz%|E%4f0A$hMI`?Mf`TK~EB)r* zT)`I}wY276(?&3K>~`be-Ao?%qgng(ge(gmT!RQZ3}b#?{usuRqiN=F&0kCfgEh4N zBIHw8YY}^c5Uqz}4k-TQA0mE|!S4RVi8xr#oqywGDx1G?+&e#~lH_MW^g(vQ` zGkI69%lr=D)g)q_LQvnU9ZjM=esDVujc6?4cQw zx3yyg6LlYr0hYN0hg>;N2+i=KviXC?gT_&)=z)d~3%k;(HKMfTL3_Rg*!hngGGd{B z^T|IIdinN=-}A|rSN@o5ew=H;n*jXh3ckYsDjIJB@b@)1zxUj<_q^P5lJm0CZZA2v zvyu1u*7KY_qkBZp|0`bi|0o1P6b?MuCi37vjrd391nAzb%$T%@@|d8Lr`(O1e)pRM z$V2^XN?!N)76Kbo+IbyhkY}*e=fdR0sr+#>N@on+uZtg{5J;<$xWJqJf30rw4;Mi~ z(nrX}?5;mp;&d`(^Vi;*Z2sV&zz?XMN9Xto zZ(IhjB~@FCu{9rRZydev@_L(tJQj{U1J$JSKl2YE?8+MGc77p}hl0@>eN# zGymidty}H|qG#$H@FUQysVKpA9=-lYIc*>V%vD}KMt{le~D>bc>Rwa zDB#ni)2kDf>py*^@f$sT=OE7kdUz)P+%M@XRJ~RyN6`b@8k63`$MNGCIbGqWD@49Gzr5EqsA3E@?LumBY4jSS1R~nxDu`#F( zYmhvCO6`p{){tJ1b(H;ygMcZ-`V42O#J9G zQM{BXSsr6$VdB9#5T|jdOHi$>VB=jX}ws{KFgHINi%BKJdnP#myyL^5;2i*W)#RMC7nG z#Bj|CIS6<;@{c|*rfFAQIpGtBHX}Up#~||RZH=mn2*JMi!s8KpaJ+z~7h91i@n7Cs zsT(rd`mP^GayNfMhdWi)uJuCzN^82wi4gvN9gGWR^N(J4{IxhRwb}fG_;~$KoRQI{ zDovRHO>|_?S*xD^p*zGw=nT57r#7+OwSb0N9E>G8U{901gQK5F(2s(hiX3>>Kcw{& zH$3j7;D|r5L?&8z$h8h#ltmLVJnR=cD-GNv;wN6<%=xbxqRk_;meH{vd}|WClr0LN z=MkpyO@S^D^0g<332+c6?)b$4+iBJBX_oV-ER{prx;#GeWpuY~lHv#@e z&s+9{G>+Y881yXd8IGXWM)nO(WA$RN=RZu|Kz5sFbHF}w_LFX5D(hpcW;@8f>V^?{ z_7S!al)wdRLQ@wS-{r9@eRglZT>%UIq8@qewbgrs!S~k;w2R5!|3zl5@X^CRJZM`e zeNPPNQ9G}HQCR;4iTT)vFHZQ(4KMD15f?~=fKYb83UPz&YK)l*_YKpP&I ztCPOQ;mPDc4Ap^oT>ryY8lL^cIcOtHVB`f@0{0th=0Cm{7lb(BTE{1xz2>n_p<@>w zG&$9o7r>BV%1R$4#ps3SJeup+O?-u@9f0Nu4gwDL<8KB#2T$ieA;nHq0Kp(=-l!sf zB;-#5Iz%CjL?e@(!}IeG&gA0)56+Q4j@RwNV`rAF>-d_FaZ4cy4`w;T?8vvwl3AR`VV+9Rk1EZJDVS5NMrkB1oFUa+%@qoRA z{T9y6ErmDC?ZHif8biP+*6`?gBHLcu;Vq2t%SLufMn6Xs&v9!866 zm_WstYoeYwiFW}u|2nV+amohD2?Y`xW8Zhi^gjR8CZ@QlZGCAMo{|i-4<08DZQqrK zHbgKWcygh@x0@61ux1#(m}?)Ev6MOvB(+Wkb8X3|Hj|HITn#@RB&XAUQ@}a}$2|}y z<{zc012+a^{Zjd_a`SK0BE$!qnKfYEB0BPyCaylQ@|0JZ(OtuscA0+=-Bgu9v&n*( zHu+n&q5Yc;(EONV*TUvafIzVtkV7}VSu+`lt}OKo7LVH0r5aI!MIrsA^Knr zs1&F?r>*gh>6ZuI(A0A05T5avYh%HN=tPIkqN^v4te5ZvYp%Sz&CM6^)o8Dcxpo}! zp`%_5Tr*P-)z>CGWdJf{ZBbr4?55oUBf z|6^I(*5!y1CN~XvaH`S>6}EL6JI0OqtUbCkec~{FNtvhXA7R?3f9zj<;04L6Xnab_ zr=|OX=~ZC8Q-+P#w`yYa~P5#g(k{(fuV~4#S(?2u+F?0S0y7`ZQ?os~W1>2bM5yP2( zONUKZeyl0x=n{V!vsY?A10Fc?R@A!TDY=&%W>0ScfW4(vwh%|HF){1YEKDCNgb7t*iG=jV^UW&k`t ze>F~BC{lk`{#8$GH~Euf>=GaO+~kkJ=AYorQwN${^3V7(|C*Wq=xsu{vWcWU!+jUm zdJ~AgRGj=Lj6`rV{~6PIgqZvVQbfstJM21)#jcUMD@J%Twdo_knCGE0bvp9tI&57g z4t((l5UKF=8)EnyxI%+J;1xLr%NX#9esuVC0@hId=)kaQA0=y6|CnJzbF)psb}TdF zzT>T?tmA+g@Dr;}$b-A#$;a3Y5Z&;C9UM+glo6YXV+Rv8HFNN;B{EIf|4`sC`%j^Qa%^rWj6T9<3t{Uw zCV>cuKO(N!8VDaw`^w1ythVGEaz_xjS3fkby^z=Pq|x`ffs7YWFw)TLwWye|H$LR1 z8s%Q|qMe`8NSQbG_Im3+J=mS>&Y3#sHwN^teu&FjFPG~Rj!cAn2^!K&u6fi^kR)?Ne0#!YS!i=XZ~|6nx#@Vk)2z0ubdzFJ2^F-Td~X3_{FdFJEIe!C5q z6L$bFCgF1Pg?jTaf8oyj5B)-jb*8a%(z^D;8*HPYQjCO71R-zo89e<@2-bmKkWcas?_#+K98FPk1oMte98ZA{=r|hXpX<&#zxaX zSTplL8J(BSzu4dch95!GLDIJG=sX^4eF|WVp~b+?;HE##PAb5w19NHn(YpG!4&jfx zV+szPJG>SLg8{qiH`k5#qsafAsfiKYCsgJHn~ub;`u72AAEl!pQC6SBwky57>EEk= zv17ZC_wiXkut!1t9G<2BUj2WN{M`@b%C7Ud9bAr!1kGo(y zAK_w~VBM3#B!6tsho)Da0n&X@8FsLc($J)3yetY3JnImN8etI^t?!O@W5h(Lku6#k z3kh#GiYtEuU5rNF>ykW`!QkEVGrVrbfU-HIS2_7niyhKq126sa@~^M;K8D(cP6Ly+ z`{kKGu3P_A>imP4mad_JKpcaVz|ISanpF&`isoZe7~?;EOx{s>H2>>!?5GcG!u-b- z&bpQmcAnAEEjkchRBEub=MPU|sBM5z(`NJ?1aGp`7!f(aGdH;mv@|Z?+{*CefIT?o z*tO?ZG6$z$PsN7%>!p6p2kXVF!=v^LR~R#6avj0E$Pj>A==jKZRIE)48-waBKI*jX zp@oX^o<9JsoHf;Yo;G#U{K*epMr#w&dGEOS;~zV)s=s)P(>^M9tuwD}ByT?Xzbnss z9DeN|zj*^-OZGa|;=_6qVE;RS`$P)coBZ_ddFQ!)od4+Lx#zQV28?~vQi=hRYPz+B zbRUYMTiXDvJqWvhsW;YQoJ!%g6*=_mlkPqS!2v5YK<#*j@?=Ha5GudkyCBiN5XEsL zUz@YXKea*C>-Xpx_xQi&kJ!@EgG?Ml6AAJ5kE(74=!A=~QhP?*w9kQFwFr9u1rHoi z>o2msCJdzfYBU!3o4VGGQFLr@RJbh201Z6Xg_w+m=596Kyd}wVALOJvp4qI zU2{YG+7`+;O-8WypF1}*qx!hXKQR!-fe}J_Vr%sx&*C&p^of(4N9QL0!+(kTznuZ> z2M6Ape<8T}QHi+0L3hpt5g)-OF#AMp;r6$iRubY8LDH$R}wpEm@iE`W(w z2`W#_|5SV8246pQG{L5GJoQE=N{zRQ%%M~c`Y#GDZ<_NJ4*k(CG#L6H;nJ&eFGpFw zqo95cGgKyT@iGu&72sd!dwlc8MkkHCYodUyZ{!z@E8e(0y5Elc{VxEm(gd1hZUR2S zJBz>h+$U%qD9FX;Df%hi#pEEjm|I{c6ypux&>UiAs0h4(}t&pIRlk z4TIRAY26K>Y5s#lQZw+0)@JVno*U$gBeruns(F+d-cH{A@6SHs$eYPo%xUM z7IneWW9skx(W4d}dSg8FaAbvw%?KU2wL9_;Z^MyNu^f-!M@N9j_62G^j0_B8MGxgP zjG*Dm%fUWlf7*k)wzx)S?;*5-Y8YYR@OoWOG0|O*qYKXH%gLejYHzqJ#x7ET8=nDO;sW8m-OT?efR+e! z$qRk*-*LFoT;NJI2#1ol{4=pyYIHd?A99$Skx55Cy%*Au=O^|$83U9PE&8FnA%}<| zvjAx&W=<4^cheKVO>6e7S3dcF^R@q*;=Jd<*S_+V_iXcVHF(`>@!`A)@NEx2|JU;0 z0cQVU)6D6gJ?h-qcm4Ft&e5Oj2QaYHp!>k=*0R^G+h}m3kDtED5LXc3VgLX@07*na zR84&z7ODeDW5;O(i;v#WD8#wCV!&wIYuLslH)isqd*qp5Ce!A#7bOkW_kgZF5rwYG zL>k7%?Cpj{iN@+dM!{RL^v(b9tWf*GF)Q@0zJh_yMjW#FKx{zxHBMw9y`Mud&-@pH z{YHTK6C3>PM~4d&b=n&FLOE)-@HJU~Fk$3iH^W~4F3F>kwp#T+jwk0gc1$ z-(LaP0^K`gkuX7fvKriH<365y{k63(#LdwK z0`A~{*(bBn7r__5&6W#Cn_8E=!#C09 zUH?-9z*AquH2+wQ^Pk`7Ihm2*H}X*XsVo};%&KvMvk}yneU)n@AM#vZxA}XS^@69? z{`(#DgLCAsv(^jv>pPxL=6{`N^f&$x-4J1J4v7eT^KYD#Wmx8U*hldE{10aXpyLCJ z+{Lx7)D2H*#N}aPa(*iEnAohXN0pCxdNO}8$*CAe{2A6ivcr3LeK&=k`PW+%)dw35g)nXET$P#L;U7oU*56)l~({ybR0ktRvsXKTh_uieV1o=(RH;%2Oru(8{KWJ zU>$1_T*q)rOBi0Odf_%?!!wwy!^T=cGzGi(gMn(3))%_HS&pY%$y<~5_%_G!kFl8H z)8kE-8Q=;=&%N<^@z-Snzlz*6h$Tboqh^E$hiCO02L{I{B9jC1Pvv+1-~6jT>iWUj zmw)B|{$KzfBkR|(7O(zI0R9fgH+>U;liBl`lRoEePkT7m#{M$9YWh*t@YoZ)?+9x) z4{-R(G*;Cq_W4FD?xK|+Um)nN`_MoDrW~Ey{m+QQZf~?4Gz19mx$>`op}cf#j9hmj ztN-Q}K{Qm<7Z%M03Tc~eLRRzagW}*4aw4c4Kg$=VfgQ%?Cj8WDlvNu?=p5HSeDOmn z7Pn&{_C+8v{uQBd5y#-z6GWb+iH!l)Tqh8rFl|I|_S&%V?w((Z+Eg}ky%i99t2_RL zk03w#k54pE-FSTQr!BnoPjuDYUMPyKq^YRoT5Vh#k=Mb1nX=A`Ek?#$PO!E$rty!L z7|V-tuhDu_U0L|NanW@hohXAwZ3(maqAp5fQG+Ni^MMg6*yD48+q~Nk&fLSBS6D{$ zME=0(YO&KF@kH1;MmQ}bHsJDM&7QyVo|S(rsB`|}SdN>2@4fiOC$Y5!Ma<48y!BOL z80oM$)?Y@}Y5Is%z;>an&BfP?^w-uNoV#|^bwZ!1=s6VKou94cy+6#%?GAT`D?9w( zF z^t4QV0hR&tq}TPr-%scf+bFE%_8(dPN6a~)ILQrwt%SyaXZhBaL}Z;k8waeOjv>-a zD@o8RkAgYf7ed8>ywb7T7gK=uUjxoXN(N3EgZQy^C`S3wh#@b^)8L1_{SnKs5bg`- zDn?Mt^y6peT%7R{-pl8YE)ElnL_M9Mg+heNc&DeCf4F@?8b*@xYkkUsizy*#5W?ai ze2M(W$(eubY(z3mYz`Uot7nhG({`NU#!R#7QStrQ(3U#WniD9eqgQ7iqR@o zDUY=|8B?u^urVujlGkH6I~B{KCx)q~F=MD4)Oa#580c|qeXGQ{)ZtaUWirT5;%G^V zbJ$j_AMcw&Q8rr$e=P!^UU7#VK*NBYC-l|~TzKzd3qMc(=-8jgzae`S?RENte^1rx zi@*5GPqAN1-s@V6SN|qJ&rN+MN# zP;whY%)W5obbnyO*!@q}!RxmYtIz(j+fVfZhzak$W9Z^ONVpyZP%fDEol` zjC23u+R!~tutBS>J_3Mtce6{JmmIJxY6$7xpTN^j-wuptb&bDD+>lMYVO#)-|62Y= z`PO;;!^4;ap$TWqU;5{=Z@a;3Cg&S1<1S9b##W!;Chz0g2{vfwoHJVAi25x-)LOIS z{s-aa2S^-sK0rv*xS4^+ob)0BzKrVBQ2gWiuknJ=rzP+H8bycV4GA8IeT^KS8CYLp z0w1}&_Fhwo2O~nHuO@`?u_hH8>s7VB8c#9cu>OVY1$PVp2QP=4{KswhYIwNZ|1=;h zF;9y^P8R3?U@ZZDV>(_w)F@{456qeWtb0TUL3#a$)%9N#kT6xMS4BY*VL$h*AJNVoYb zA3V?h8r;R(yqoL95Z1goUoh3L&))CV^qgs3028G@WNu6Ym$T zL8?*$B8HkED5!{l^coQaR3Pv}1?hs)dv75E(g{UWdY7V7rPt7lbPx!=hZ1T+3#45B z_pbYO)|wBq*6cZR-m~{}7<_#7JGYKT!|}aw3;PrVUJjSTJ37mKZ` zan923-tf=)Fl`$BbNFvCz+(*fIK`8+1~y5<!JEoiU)By_G#c!E{f73eZ;v<%VaU&I@wMV~w@hObLnQ|}n{r^t`S5pr?6G20HL z6$y=AD&dvMY0~|tm@UQUMJ^`PULJ8EXH3z3RxeTn@<`j)i&_~XCSGh~Md#q68TCAX zxSV`XWp_=2(Cs5F(3YicE`M>8m$mZogo~LeH=X^tm0YFNz%{d+xbtZcb@S=9fW{}M*@*0T7 z%Uj<9Lf@&RPjRcm!ywIJwo)T+6a${)l{E>d+{;pGx`CpPXZRkCt&S48OffMt{2^ui z`pNe<%B05kd-cTD_R7Xik+*TvN;(GpcAfl7u%lO|-mwP+T)`_UDY*iiztN~|`*KkW zJ_f)JLQpS+MuFA60C04-63Bk?B<%pZ$e;zDtYT*LOk3~ zIEfkH4HHmJD_YKf5s0|KmQnsY2C@?alGYO^Ux*3^s-^U-OoHE5Z}3jTj|Ju(vb=7@ z_zr;^5Y3y9?>r0Cx48%xKWP(lvglSut8$M&OWQ;P)UidgL!$qorOsjl?c*L2Ov%e< ziy>{qpQ^Wj@@@%Nqbl|$8+81r+$Z{|5gzov>o&M0Uw=_elP(anl#Zylaz~7u5CE|z z$vz!Z6~FL*_S-d4KWS%WWiZ<-K|Lt3iTU<`^8E2jo91foh-rV|PKQ;XOL^hR1HK~` zV~O(e?%bkM(JkPrc3JNQRR9i%nKDmmlD%V|)HP=Xzp7h!+NTym14^7*bJA%K=i^2> zI`bo{nv;T}BTir{-9_~D+4c|B#BS`0j-KYjYfSwwGwrYTPB2)8UzM!J58~B&5mR~n z`sJ{d%F4{6@F$C<_5tySRR8{zH19 z-eIueJ0WS|?r!*E@C%UJ)o&-PM>HLF679K)kPgmIU~cl;64qxUcGurcE#_EsV`>y} z8|F0mw>|ZT!|Sz_VZ2Py`{;4ivu0aah^cCk>=@T4K7-nzzkCUaO|)0xs2igXp|I7I z`WJiWrX!(r9HmO6RQ>7x$hV;;lb>_1EzF8s%eD6IROj6ueq4*{@1?W4RdjhAPwY!C zCmJIRe9l*at%rxk=H%JVx$N^(1G)>5NVO|hK4$)Zxfo@iGwn}G2X)9S@-AXGn20=^ zVVFPgPFAl9n3K8^b5-L0aU`I2vd4LRXmFGKE|N`|pL zf+|$Zp?o{Si&a$4Kv1>XF%1bXIwqxL)YVI=w< z`CkZ`GwwoN`J1jwp$wJ-e23ySL_TIYRw5+zme>JKgKR|QLCxj(;pt|#RKF^y{=%68 z8=3xzFhgLVP?w6CYtZ(lh|B-Bb~w1iGANj4r}1N)q0xlITB%~+?s&_qeC$97-g0xx zlw?}Irc5SMZ#OVYWAS9Vc9`-3qRXC`j$>qJhaJf0Y6#6)!y< zIl2Hpz~%8|u=pu&klR$B8{8?>yPUho zH_a~Qo46i+VOtXLI7ihuBktzWKV)K_Yx`h=tcvvhvDhg(y&8S-$k{9AuE^V68M4?V zorua6={mcL)HwrFMyHWq0*7xT{^m|)P1NaY{bJijC4_M^N zHJ{k4F*qp@+Lsm--t|`a&rw-PHQ#2HdH??L+cF8PCp~yC)hH-%#wnHObxElWhH3n z0auhiUd4Z#h93^iaC8$Wp$q|Coz^i1M#-AQPdr>4%pySOoRK;<*{sMmEfET--_5HM&LOu5*CoH7U^7P?6 zZ>_ws+*+!p#>teo#$3MV_$#NSBq^Hw8}{E9`xTse`4@uhi(8M{CJ6ZhaLdwZIh{wm zPT}{NGkFT06uQ{?LCa$(6wKQ;n(S%3|LF2SUTUC1_iAkiRLy6 zDX@<>_WiPn%VuKb%U zJ0JgAhBZcMHH z)SYN#;y)WsR~9s(VikY}J0;OD3V1rq89BV>Bn^Edc(E#D6(?d}d@=d^VEkeJdgfP> zLB3%!A=Iaf6aJiPt!w*4mIo>I>HgyNdl5thD$A}eqjJSxnK;e-gGT2HeKYsYFNH_< zXnHF8JuPzsB*|~6a-BRmO>ltQ4YH`wdb>G$VCY#x#418ytvM8GVMxUgsJ=KDTfA7l$o?ivezH;D` zGRCCHDo06l75xyX$=EKv7$ad+Elk7N&-Xtn-mFT8f6XR zR~r7!9=wQtbr*Gjq8~EJOWrPR?@Im8MAqrgL}(`E?fU4I+75 zYWs*k3H_W!Y``OZ$}|W1G+&E^fu7gjQV=jn`gkO@aL?a0{aujr)>M-eWD3GpjZ(^j zp9dT6GQJaix>m(1_JJr7^TtH;Pn*#5!ZS=kN@sewh`(~ADdVm^rkSO!i{+#7-cGv7 zKYcp*@9eBkN6A6pe`I^;zNE|dSJtl)N=1nScj6UuuD?7=P6(L4_X!1awetp?j#>fx1(!(-BTT_cg2wdeAptM^=NbY$AzY5$iG+I5 z2C|pX-zgME^}>wo&!nh#BR<}Yd^pR2k{*G*@jeWwDOF--n#vMWU~aDwhK>eaLqmN> zYfshw)_ieslCqC&?7hh*&g0BK+gRgrx6e<{k8dqI``lmVxh-!_KShwQfQ&N%Gtd^P zX}p$ttHo#Z3h*w_?S}c958*5fZeug=nwL#{I`Opt2-3IwB**A3k8^Q;F1N?XBs zOC>WG#7`|ucJ$0h?biE4vA^eNDi)Q zS~B~uY~{D`Og_=#cvFCy8a|4 zB5nU7oI*N+HW#u|Dy6SO{|S(LI!~5Zb`(M{BHl@8uW=Kth%!0BVQ{p1GXjE-)Elmv zhWKB7xQ)nDY5thYU6I^G78me3rf%wd3^QYAUB zjN>d6U(>qxw2uozykb;_54Rw{2speDjiZ@7QgFRPOZT`+Gd^gy>{Nuu@YOfwA54$; zzWQ8^keb;j==`@|#oO-A=@+axT{B?c;!gO^yQnPI)Du5|wVyFjh128DZc2z6UjJq| zBvy0$!DG|CF0oZzbK&`iqoZFc~3m z->MANW;~6G&d08U*;MU+>Fy5Gs5!>a|>9{yL#d>Ge zW+VPk8Ls`Ax(c@hs&@NEN`s%%KgJ!1$)k91BmRFmK+uy)IY*iO({wUEd}zz^6O&VD zT5$b6CuethY*79AfF~yWZ1711Qv=BGk|6 zZ;4=*pW399z72)?e+z#M$)OWD4XU~k0z(3HOob7~ZWq3D>9m4(w3jG%7Q4CG-dkFN z?dWk?pwkZR?ppN{wqT% z8v(%q;gZZK)^YdN%kYX1GM{1XBMZ;Yf_HM_5CKs=5`Tj_^BcE2tSK~{<=iT<^_yiq( z*(tT|G)~k$d4G$^`b}h%+_KFkm?Sm&uH=IWi$SaaXhOY^Mja#8!>v~T}Hls zA8Lh8P_I5bH~56ryS_B4?{HBo0q@nzV}64b*x)|YstrR}Vx%eT?Q zItTdL9mW+}svrBwXPEh`MUc1{c#5lJNLx6Ir5^L?QPl%pFWFJl7|!jv@PdlzD0xmX zg=3bcIv;NpN6MOk_+DjWH|`Wnc1j#Q;k5iwB+}x0*7DLPV)7>}4E&rl6bseHQ_IXf z&G3FOcGlkS+VV8b{MnDq&sAB+>)F|%MLqWfbQC>hCtS5WOq#myxO8Qqexs^z6?1pE z4Tkr&dLZG_frHN}{@ZYTHqrP_(##R{sd>BaQw&S1+j@Rz`+cbS7)9O54MevTc~qfj z@A`itk8sTnM{Cn~hmIKU$i zL8(A{lJFka9p#-oa*7yH7-;#-mXAm8nUK@2H!96NYvuCwoY8h|-1W9JhG2S%x< z_ngiTS6!!5J?v_m-;YYUmBG!)8V#({&{zeHnD?N8S0kMa{;z#>OblXskaCh0s}W1) z*ZE#o&n=R=<^W5?(51SxgC_Wu+PVua8^}lH5W*<(@}Sx9$f{Un-(_}!-S^v-NwLPz=h=jJZ0-5c*JbTP_8-s*E2zQe^+#Qe=Mhw@r(FL1Gx-u03Ip*0T0Xz` zb(+Y}C9$aAF{ft9_U&1_45gQq97X=pNxpoD3L?_JbQl1~x_pa$2p zB#A1VC9@^bjqlS{KCr#rORIPo6Zkp5s`SNc=J~FaHh)M6gujh)xw_v(&vOXrcl0bl zp}S@9trE|^5JKC|>R!ju&#M!6%yi8)&EpbPRQ2{}lkn-+)NJUJ3|*mXd+u$bRKz)h zw^!stbzQE@qD?q%(PV)61JL14j%r<*T!_UI@8^eDqwe2q`mrsV0Z;s% zv9ZUe{=SdP)1%Fj!o)y3ET~L~88wqkNPnBF97g+#o_;MBMQhfdeP~L>Y|Xr8H=Bg1 z#$#=SlG|whb6~cjr32}`;VYcW&_8DmqhR+W_^wQHYfN@bzFQes$<~4SJ=p76*wL}) ztK@jWi+%`qa`?}F@z5>@5`udn9Y4}N7#MgIhz4Y7Bju6z!o~d-I6DZgsVp6WeZjhVCsEpl2f8cm7?#cv`2)D)c>T;tMp{YYwd;K4AS6azr zZY2GlH~}EgW$+5SsG6R*o^N;#33sr4_-uwf%-4ivs>Y~G0W+#h5NUf%?MPTDWN4}_ zt5gx+QhT1c#`unEq>W2W5JbQ}eUR$-j;yzG>kH5dBu$xHdwXn!wK#~^70v#QqpD{` z!N<^)zzOS7fuvn^ZeVf*D|D1e~SHeH%1(SWoYDQo+E zAxN=_6+&VZFp)|hP5fIU3X#eST7N`+Gj$to_mZ+5vICedUpglKA@3@G7*V#0VgAE7 znGgAJzr@T-@;zn{-P?K~D0>O9wrH4M<=&L07UucBw(GPL`UYwSf5Pv+Z#hfBC6=3D z0QY&PsxJK&)<0zHy0*2=gJBRUx6;FQ>#Y9P_;Rn&yQ|JTSY|3RVV|8v$>R%$Lcw8- zE$qpi*kK|#wAKwcvsHA)Re6ImAhXXm;JHN)UCO+HE<$-*XNh)~iQ>p9>yGMW3dQ3| zw(F-(qtDX^*%ilAUd!d=yYyI@L zB8U5Y3h*9JQc11Dj-^9uWfkBh4ji#fD_1;dW2x=b_Y(fEzinsDnj~<)kn<)l&!w>G z1K*t5rNH4<>kFRGh~M(OEkGE*O7@~qgG#!+xni&7++%l0lW50DLM$JR$<^xOVb$iKFizhNo@Fd{d2ma&$d1eps?Krl-;f z(e735gqirEeNBUT2=W#U-E&vTnNri7Gm{F)8gaxj$l^ztbTCgNXuxg zIqZ?G#TF!X7+KsCqO-{WFLhH|QNT-x+m%9X0}FX;XkosG@pzxpa=btnRSgH5Rt*&3 z3Hlxb@{(&JadS5$F#ts{pLBdLBRRv-ANoHe!10;n*wqSvC%7D*w=H3`d=H#A9{+$l z@J&xIbFt0lZy8?pUZV`2NCV&CSOGfXSWRtVuGueN*Ry%J%xB3jLfGllqp9!pM=GSz zbfuG1#4VysXwPU`1078Whx+pZmw-!-m1U(m8BvmX>j!gEjd{TN{L*<;vdnpk?U(vis7ux;OP!>rL1x=jqc^uibeWnk~>T0WoY_ zIQUc|O?-X1hVQ(EEO!QHl8 z>-s$TwYZX}I%|7JUBJU-JDzW>Y}F_L0Dh=I?vH>RN04=WWhn|$`o?}gzVx8A>+m46 zRb0)Ut78*uuG#7geqs9S@X~djoF6~3_`9O+j6}yGb{rG0=&9u0bKQE@e_qdz=com@ zBs^_x$s42Gp9396IcDr7>IMkBsl|IN1U!VFt7U)pjhaNQoU=jJ6E&v2q&`WT4L%E9 zVE6Bb{Hen_2e4Ac(BcjxtXgXMO+|;YjRZP%?0CNR+-99e$K%ui0Hw}1dmCuvS$CV| z{0U&;{5adSF>a+a0&7?<>p_~}evXycjJybElSaAU-5;M5;_c6b+cSlFsShE9>8v<$ zXs&re3R0>84FQ7?yvU2A5w)|X%5J+ zm}d@qc2-3Erv7%}LV0bbe#dFV>+pj_k-yM|GZw;$)y955i?Qtk0x zWl?5B#xb^Q;5yEkv}-FXEdaKi(MCm>R-Y+ zCvtEAStlR=vIBDY9kzYF|3Xh@u3S@JQ+=v*DoOrrBhtdyi`(nxxcRI^E;=lYl(ay1NN=x2xh9 z+Qgms5m|DWk}seQ5T?*FurQo*ks(6n`SVfp>5HBhJvKkOR0-z98c{o>19s=+;}&@h za#0RC6&@7LCpTgUgK(0$Vjx-res`eCX1uo*@qv>=99-Z8s zB!`*X3(8=fwUs*~m{K#nx;-UeyH??L)RM63vAjm9v8N!E;Gh0kG&HAh9>Esv5f zqALRJ^%DOvQ1aZ6XgOCE5Xe4`Y=2jBv!=;50=5&1hz(e2Ax~=8*Wu}8u6ep(!ICJn z`C75ot*R>^h-W_po99GAWOz9$ZeI$<_8lQIqPvvEAR(UT3Y=WVUGZhYW@^wvjXT_Kt^2-se{Os7EtT zTh6n1tSV~dpP82SL^k+@BeHXtVp_2#ym^ z_gVX=sE805rE{vz|Hap)#VcR9!s{br-aU@08N?I!*RgGe)@C{19HnU1U038YI=9wb zSC0Vrp9_4&oelqu#v8a#({ea^sIhhs7QVl4V;yP$y!m&;&6(~YMNQAiiL!ImOqD_r zIwJ+TV)BDf&*j`^mg&UDcV6*Cc#wQdYnunjJuNQMTW??4lWa+Vz-tI|(XDf#mwC1( z|C|Nt;`>aDni;v025rZmu8gVgW5CphcIisT*k@lx^QEtvImWC_z8ybVa54dNxoWow zIzVBJ*P^O6nazAV2SFFUwGVHl%5^Nsv|f;v2p3D2fs%{nm+L+w(}<;Pyu+165_ukT zE>tXXyV!Md z1pF3bJUiq5tZu;+4n??587V0SUPvq@zaN8~q>iLq(UH|_Lf23*KNWw`3C;LRGccJx8F579|$GMK5vvTQDVA&!;&d zwC{WO5?sC}QROX0Xt0c4`6eK~rEVHl&OSr1wL4}xyrDAj*v7c>sJC}kNgB!&~d4hQBoF_8~--nGSzdj^EgjJ{cltM(dr|4@$R6tMMc!TSkv7jzbHER z(B0mx~M))nO$@QS3i~5UnOOpuFKT{3l4D!w}vjLS>e9E(JOlILs?a zNXs*i@97n5F0~q43%~)wH9@YfPA6d_CzCER^bgDQg=ukJ(pu7fU9{jUhTEIv*c;Co zUo%1Yj#XA7n_3mXFW<5G86vml(eN^1ubXtmndJ7N^KHV_CKO4o?kVTn!Zo+VxQ2yZ zu-K%es}Naz#HHtUJoKVPP9VWO{vI@UMwTr@2b@fS?@L~KMt=sizovCU@7#N0FUS&W zrsEX_>tZ;kJe@xsxF7P4}}U zKG#2+{fp}n*PHH9X5p5UVh{q_lRPN4Vazqr8f%08tlqNTNTJJ#)4EHDzh7khf#2#~ z#aOlR`hcZM3Hm$AG&`KNYPOSMuYQ{A z{Bv(RaN((sA&}F!_8588EehH)zZiE(@tJT8EQ-INeBoGfZ570mR_jI0!|5kEg2>2R zQlLQn_bICGVp$`S=idqP1Y?N0P{_AaG}?u+yWG@}d8&NjILGxy@mT)PNd(@ax`g zh$6d0;~D;}vuY@yJooD84|BoLVfnWH8=t(M6~_BI}ZaJi7>L;xR_$A5SBRyUBqsn%Gt**Tj{YT+DKB=%Ppna?Z2cKcDT} zOG)ti;E6Kd{f$dEtqy$yESzT<+b2v?RGdqYm&%^Xijs-|anMz}~d=Wk7QP z@pqtjov6A{(L^07neHs3>%?!*+XtM=7!Z?V@lie#pd5#*Q(yz2-K!w zpj@Rj4m>6qXP>)cwFMq2ifN^1A>;ubi-xjPUW$ogaq>cb{af*w;vRJEg>l3#mnGA) z4l4}q+!ar~}L$ zVs3bgF~k3}y7~p70E0~W|30o486(#7-lyn*=S zD;{zH{MbD3yz79tz;H57R6t(N5v4*ziMyh$)kB!F^ON$RlNE0B%h^uwWjlPu$}~Eg z03}yNm|vu3;|({@e~G9IaF9+{il<=Ooq z_&I|u)GFlV4X4kVcQkpP0d78ft@&E=SC{BT5z$yT%!qyVVKt%nWz5rG7ex=*!@f&W zk9}5iN|GO@q^Gu2wZF-|X+h=9!zNU_rhkBG%(jUY-%N7|DBsvyO*sj|a3A25BQE8d zBg9)>hHIwamp~yWH*Juc#uwoJ%|H?PHHLLfgDV3a*CLwO8<+>p%+{EKP z9asp5R#H=6-e!b*iNou;!|6FF8d;~dsdV6Xwx_*x2CD4?MgQZ_;_F!a{S&TjM5guO|Lf zbdMVkr?{J&n97Y6?!L-S%*LwI|5~Q1uE~8YY`mE7Yvt)_K+Z{0MgRV$UBP#ux#$C|zpBc^+D36FV_e~CFK?U1DZhhfj893B>pyXrRHwEIoK!lJ))fB; zWy3pf*VI*g0Ld<_V#N_xkNvvo#*-|9xLZ)ia?MceXd=+kT|cYYG`IpksSs_X!ohK` zs^V9Y%Q_t$#OI8>J#oU*;?$E&+2X*I28^xVPi8TuKt;Q!n*2f%3YV!Q1D?`#N2_be z0_5YbQFbzZY$BoRT3Ejo*_V^4kZV78Nq*87O-opjI-eH&Pm zl}JL*oCXf^co*OMZY+P@-TQ@*yk$aaV?RM>{KX+~&7U^ATY% z$%B5%Cp*)1Rq4aaWxUTiUj+G}h1fBIT#_v{b)g?~m_iw? zeZD>vAlO?Ek|$?2$(8>MZeTSP`x>l5mDEgRJ9udG$xQ0l#(Fi^@VWv2EdvKZYBgF=e7Z9OeGGA9IB=U=y-V({UXf$Rr@>i5A>0@6)wdtc1QZd))czK*GBD z?ySTc`jZE?`jD+H({DS4S@WRPFj8o!sjKCyp&!OdnzEVXyD`i|Hn#X&wrcrU*0y8be)Mv$ z6_hb4U^4|eSjEx2M6(3#HnItB$HrTmN`oFjFGlgyT|HCxkESxfHr^+C@jm6tZE}a# zegblEQ$ZJ371^F49_SQ6clKEL_o>hn(q<9Wp}5L>@vC>_G5EKIJMh!w!l$wqrAZF) z`Q7#Mri~H*c|K{MyiWf)<< z(rb{5_XX*k|u(p(+o}i6TxVtih_X z$7z5`QMU6Z{0I)&^Sq~~86%99#ZDg8g|s1^Sm`45jNh$?uX%fVt~xzv+`j{7QYmcn zC#O4m_`HxZ55x6c74g1E8CsLEIyc*i@ub+A=jDOuZ(oan)Hj`32IVRx;r4k(RoN6J zNf$NwW&*#wX}hRBrg!u4KFo)%C9m86{jL;`DGw3V z{e}#Q#ej)3lb!jz{Z#f2Ty~`kOK&pl@x)mW4LSqvRxHgCP-e+A1iPbrd8b85!{Fd* zbTF0(1gJfTm%&D}nHg3;l)tVWI_*FVoo%vm=)wCnkc~z8^JvAXZzltJ{OS#t6YsHn zLu6KQXEG8JfU`Koo?bk32x0!?ALuEXKY45^AXqko{I4GCqGOuq zaxQ&T>*8*ID)3RjYpkHawQE3S>AB0n#IX`-FJF>v@Yu^(PTa$N%j9X3qdzB0ct9_p zZ<7$}u#e6*oTu7cRLF*p5RMQSvy0#+Jk_euweIvJw_m0TM5&9^nOCG)+;IzDKYuEU z;D+(P799dL-6(eq@QBt1eaa{|R8T-MYm-MEtPJ2g_07Nc{vMne@Y>G)Zx>d1w^@d; zi&xo|qAr3IPI++Yb>|c2FjMjJ<2Rcx%ZI&ScVoj z6AWQcO?lQ}I5i0)oYY{Go5)``vYDI~->oRgMk>~54m}A%&7%Y~iVl>;- z1w>$&YSuV;etmnhvg;gUKH3&CqHfLAf(dPG+rtfw`fI7g^F1J2I#Mb!5eI3F_114a zr&{vd;$H2ikC)!|KCH(Zh?)sXyAFAYXXd*4#D>g_O?>#;C@{AZD^l>PwbiN<^fc6O zG2-^vll`+G4n{>K5!l*%YgnZ^d(6*$*2BRfQl$btEzG=RFzci@EovWMVRq38AqUUR zA=l_Is}IV|iP}iqgAx*6+K&vu_tqU;pdn*&c*X}b7>oiEpYF1LTB7uhMmbgK_!M~> zS_eRqLucj)4b8ITK%WDfvjAyS#CnE&kpBJ6YZ|?^la!Tb?sqLbdiFSJcs3W$KgWHw z2BiALbq8r>RNgRg^{o_f_M7+O>V)MR2??0D=vh#K;C&6KteB4m>9~<8lcNf=r=2A| z`BFO;>WqKnR|T35iz8>^6B=WqQ+ja#Z1bKcozltY@`#=g7&{_Xk4qAj4u9wVhDwy$ z#cQHK>NeHXA9?>`4X1qH%HOxX-hc@v#gQL@7IA7~@|+lM$SB{}Q@n=!qiR;wFqF+l z0#B=b)U&0Ond&EW4|C$T44u^MQe5rg{^$@>SYm=q0LBAP{+OOGK|HU)EqoV8rIp4xqtNU#gZH@+Ik@~u05n(#raloew|&hFnvhhy z&-JS>Z1E&D_~Esw)e}%f87Px~5x6NHMJFFN3g+0@tF@I* zzA*n%uO1oS?b`=_dI&t!J8!BNyLA8mEP&IPkE~1^-5WiA9Zi}G$JtndagG3aM)qG% zJgxJ~Vmd6e*)@Ll^KJya>}JTbjkbtr05he?SsVL3@0sr2_Zo~BQB!@2HH}jI&7MxVPEGfAMh@z1zhyQ_ zM)ufm0-SS4g?>c-Lv=$M*xFA7Fh9PfP37%wpgy?5>%n*Jesi=>mkcQl31Uig9U-{o zyyv~C`Z+%n74@^;#P1A!8{TE5tJVGhN>Ht9_8>ivX<_krpe$9? zg{DV1HkZg2s=Z_69=s=q_e=#^YoEddyunN$mP@F z1JcS|L=alyKxkI9h8CKCR)tsSB6Jacw~}O(5cs0ZAu?`>xIGsiwCMwz?LOHCjcy`W z2As_=!31L{yC6jG5(CG=TVd;)%B}?JgJ$!O)0-@Zig{!@h;Fz9Tt$2TB|Qiu+Kg0#=!YM_>wu)S6C}9SYXp zWu)k)7Z;ogz8APMvGQvZV&nfS(WmqIgS8Y7upaGefnruG%jk#FhOXCVq!}I8AAXu? z{C&&pe+h8F%Sp;=lFp#E2KNSoHmUpJvk{Lyw&k7*rO2LGy-0<#WdR)lNiHh}^JWBK zn!u-Q(%!Ko`c{{+k*V!MKqfDD^Dm9kYh&`?+f^ikbp?SRFY-XwQ#fs-#w?XMyaZjTXu)ZJ_QD4vor~5Ng58w;`jsLrJJut#qG|7 zeUmbArS&ka6_*||d>y(FUmG)n&ah0Wss8$SF)t+n37iuUI zwW98Y>;X^=1fuW$GzE`ujE~S}yRvW5luB4i=Xc#<*|y#C8Yt;g$$Y8G)W)8*Av3Y& zjzL7&-i_!Y0`kOBJPpk3z5)(AYNL`yz-G-w_-Vz|QkC;RvEo3Dqa+E+D5*`2rIq(l z=Igx!>D(`?#`0?(Q2fRw0wKt6cfsTuN4cCW^t|=_1!(pkgiHrsrvYN`muXxrg)(juo z`M+!`jv32%s*{E-%G}TZB}FXVe?ooj)bS0GQW&`Jo7g|Jp2(3IS&pM?9|KtHvNY&v;1!Lgi>kWgF}5 z7v?_L_{tGvB~1|q#I#bXvOP>ZQX%&-gnBcfYd0kcC5B)*P?l*zO&0k(=jrb5&sxIN432eRR zJ!~VO@KQI5=bAppqtL0y2y2s3k{u*Z;SjO>rB0mp4T}v9=y9mE@$z?r*+`I;c(KX; zr9cYy+Ntg*hx3~OiWAb;!m*DJ%LCt#fS+^%!ltRG4Zl)0Vk@Xz_Y4jSPHXl;8pn+} zR!abcjN^-@S(EJ=B)FG-?Ina65a3!T(gL%(q{jDVbhnCE&QvNm*{Jf$Z=DL)^q`n( zmYUtH+P|X({}!hUd$ay|0cDzG9)2lp$^ZU{>y9>)-A-RggNkFYbe7aKP=t;sjgsVNp@E<^%N2t8U zKtjuMndMOy8ga+%ju%MjF2mn;l)r(&$2Q^be(Nq>h=6JUodx&5_44l=CW88}vG#9W zx!DS*uQqThRWNYJbiMwH(ti9rMVCEfn92gOvy_jI(QNW^6_Um|5e9<75J0q`UGlotdw^ zA_wQ~-V-Q^)2hFz&%r%&?uPiD;>g7a>LycQW%(ufANRKq3D<>e48?&ZSUH7=4~e(e z0sT9nI>67&VMr(C5WeiszC)PStYWYPVtZ0q+12)ZkW=Ih)6R+LTaF- z#6ViQks3J~Mr_3D$MZHLpr~CIg5y_`}y}^lBWt z&D2C)$vXJfb9b%f3d~>uSU?Eoja)@VrgkLm5#wDW2dgDgI8w`#c(fEf(O? z$&DH<(JeusrHfqSTb0j^tC0$gPqgh{*&%yN1xM7*Qf1DUf4k{Qd<ILdpGaX3ch+NXtuRV@o)_?w-U^K%KUt}kn||L8c%H!b>* zGVqW+t7wwrp!-{eueu?tvb$h^c6h~*)b+U92W&kO*(}(xNAf&>f634|a@JfAmlr#f zOyorStD(5xgF{o&SqIC zFBK_*p?Qb1jW*@AC!TW@z2GqQ*=0G`E0Be^9lK{9E)1Rnxv=q`eb6Uz=RWn4zWY&% zn$bOGpIhcr*Y-v=@8A_LTU**Glc8$p}4?)h7bzJ_k793{!Wof+q`l$J`6D8yh4eK%ac%^yNY61j@;9$5V zcaLi+I9k(x{Hw*M6Py$njsA4md5O*?bb!7-%#%TVu;!Y31i*rK#|dH(L|XVw%s_$N ziL#yp^rvG8WXJK~AN>4roeuX-cm0lnyEk1WJKpPt=178Flwds+uFG4CL!MiP_e`Yo ze;iPlHToU;wePPPE2uzfa)pX6cE4t*)~`5z)C=EdvfK0Kkz!?u4ognM&LgsJTF@PC zbRI#+g8WAIp))gNmGI~I{MJbuAjd556n?j$h4yIc%kvW#-MDu-J(m7o(ATuIu4Eot zl^fJ)4}Clk*Rk}s=`KHnALv{h&KvjF{mJ9G``haqNaA2i>#SKNQah>Pbe^w$gp<%n zL*mV7RC*^$e!%m5{ylOx1#3Ziz?NT|JOly1pfg=vs+)z^36QEW+drJenn5-J3d5ud zDm-$8!^nOWzFYeCgdqN^xpQr&6ik}DyjWGAoAjhHt&M(FlJ3H5F<89;K2jgdhBK z7*;f=5g#@Rdz^#H@PUXbuKQWd~YPNNso^&0 zzf)$WG2ETj7}AxzrOX)WXEv8dlkH8UP!Xos`oj%xN3}}>vR|L=->Puk?{UFXMWh4; zheZwpLZVzJ(00K9cE8b=?_aodC@Kc6*@M{jo^Nv~(<_$F@^#{Dm)IiTKGwSEv40Je z{%N*;CZdiFHvLVbzEe<0#u}9E;~pCLQ7qNkGSE##V=`DPrCLSq*igSbRe1Tdl-!^3 zKb9~G9p$dVW+5Ycq`1Z}|4{%)xQwruiL&_d_Yjups&CZS(6Oh7qXIuav>^1DL`(q4 zI18I(${dJfsxxiHud(_XAL(ZXV%A&seXRQG^PG#LaGRsHUORl{r?#8Vjx@tz;so(= zPSN^-x%pthzn)!VkkJlHo=3IUQiRq|#>{>ie|)DPp=$!<&<>3uOX)b|R4$ltI8#>A zOZKPY~ka+Mn)0TMD5xzgwx+tRqcuLs}G9$zKXS8Rb!{ z6j}Mjr?t!uWds`H2Pwg)=y!1BL4D{3I>!dp*9^c=!^1FFzre)!c$e62CGgg0^W`?2 z{OT|KBG(-nir-VYuadD@E`H;Qr*1g8VIs^Pjl$6;1%Ga`?=S}*N1LpKZvqIB%{!oj zOrWtE{+NJtYrgEjS*;*{rC%bZ^HT=X2Q@x&)77`(TQFM_hYBx+Q#5jd^EiWUY4m_( zNzs>n#fd79M;R33n0El?gO^h4`=vWrHCC*EKFwL#E#o+P$wpy-cyhk>H@kYEQI~do zy@aQ-$&oxpcJg#C#O?%~#WdaD2poJvZDYSME2n*>TN`ulXV&`IwE>qc->whKc{=^u z_>kh-da5oz_XbjFtUWUFTT%*FapiPQA~Sh!;&Yp&yMfkKXiMf!UA(^XvxWH?(M+kN z!K?#mP>VdED3+2?x=l~CxU;x`0l2~#%H=*AKFGRq(Tb%zxq0!u=JZk@P}8vJGz<*- z@@d!wY;m9KkaoB?zT{+spJto)_g=kY?MW>-$&6suQwdQhK5n!2P96zt8u;$}JW)-) zg^}fPC$A*chl>yW5L16Wm1a$vOX?^ULea`H@%yl|?<8You@s}&=>uBjTU_>gz~JY3 zUGwxI8$Wx|@R(HTvw<(2(&6jCWtQh4!%1`mJR!{vZuw-zQ*mQ)J`97gh6et<$L6O% zV)L&t{RR;y~G`S5N|q2Db3E3o7H+gtua(6(B}pBuCbT4+(^ED z)hOua@{DJr`~3a4)!)fD)3x<`Hs>r3pq94ueO`q7ZD_4y!MC7HM0`n zwEdJsGFhzJFM6)hH5762S@(Qw<>LB`sr_5-k4()d?OSUNb~GFH1%WmB=QIaRV|dNx zYa!+?FZuOF=;@J*!-TuTNudh)l(lhTXsTMTXz&dtggj$br;}WmF%P$~9`Ua55eN7| z{CzIS&jmS}k0t(_4iZ)bpwicm~n6kQt?EG{sWd; zC3~C@;=x-sq=Bspw@%I65RjyKRE9Ecn3AfnfM)o4^Zu^d#M;q>n6CQ{;gCjZJ zA-Ki)RaUTh5?D|o`~Z9v>j6SF6VT;a%COgwfh#AtC(UAnerQM~5`;XyT*1#lZfx3S z|DC8*1i*aCP+L?DJ6iO~K#Q^IqMaB5Q zC;<0uKckWE?SRY{U^K^d$*N+t%)P5sHb+U$)J4n*Y|(1U{yV@7CYGdCF+mRBTF>q$ zl9%9c=f4WpG#9Qp1;GW&cTckeK=0<=lP)9>6L}N;l2s!RBPH(;`2U78x z-&+yi)`L< zl8u9VUQbWUbUG#k0ZKb?vD~YYSm}Em@bT`b?FOd}jRiEG@6l{=8A_Hx@7+-fb|}Q9 z?}qX-s7hXi)^o#1Q5y50G6cPrFUG0tQ&*&IFOxH6f=%xft9rL-YL?y-qSX{q=__%v z6(*DYRhalFhj8=Hy7kl}FU|MWQ8RkU1R`?d)^{_50EZI49B`bJO*_gkcsu6jbRdE2 z4K24=I%;0H*Z{7Rt%dKbJsS@-ZOIVpq!#&-Y=<%GWb$pkwSmnJd{`99Ae36a=!Cr~ z*!34!^Ej8VV5NP{O0vUlmq&ln!&}=v8}U)m{h1SMzre2A}M7ElAkjvCGjMH zRYrHYa<28p@#5wW{qGMtbR`3{DPU|}TCc?nwm(E-GVv?OM=(y^(mn=8Nq>dB6k3oG z09+AibA0Zf;R!Br15T*CGv`o3Bd13OQo1{^hPt_-oDS{F!>~t8>5NJG+*Fg)D0(Bj z_TqXr;YUiPj3#(AE`$sdO~qndB-p4EYx1s?u|8()cv(XHyR~HGqaVaSBqaxDpWf!* zP9&y3-vOyi5Gz6N{ODk-@6%k!hO7e)#1`Ya<#Y3BV)tTi&PHUm(qM`uLS2g!=kB)% zZXvu-RI!a-co#dpF(h~%{GDK<5;Qqb*Z5}53B}uK;sk~C?q^3+3EXe_kvH1Ptnd-D)xdM z`tm3WYm*d!HJ*K~gMc3Sp$!4c6P)!ad47jLR7rr3Xiy&RQ$O3KZFJKUHZDRcg6ZW^ zx$hlhtl0yUjc=#Go|HwE=KQ#y9nxTELT*o9YrWP6POKgk$*bTWK2l&RI5bz=$fx)` zXBb5$?(F#>!2rM7BSetOc{TGpC&^_&jCRbg_-`7x;i7x{3s{f7LH$WOk3oB;wx6?I z&N^nN2y2vl3Zt4wQQo6{EAgNCFanY#;Y<7QEyL{97aQ}DWb%Kz6`@-Is|_;2lQ6|s zj-mnksf*$~)&vast4+zWKzB=~HEicY;%moq!P*Uv_p8*Rqokd zWQ{mXe{OHjDW=!NNVV$87c0?PE&kKUXY#kN(LbHHaGN)uPTG&X@qOq52q;R2GlzcPocmm`D;1plzokBHnvnR<6X6)F#5+Y zu!wWJZG$sZi-TcQ1A9UnxfmSvS()rDKQHTwiNfkD>~dUJhem5 ziAw*@zs>i6weS`$T~fvBgws;2yoxKVn~v((xeUTi; z{yPGl{UosUFkH9j(lGU1WrY@bnfvr!^d#xxJyFRE1+-mMrS2p z(`LLt&uGUgou4y76+31#vrSQafy2Sh|Ec!tXKr~G3=l53PtIUup~nxyY4ho&L6}Rp zR|r9=0B3{DN0qmQKL#|xPv;5R;hbwB9J5^x5?V|K;DzoT74WScJ`1$uepAqK`@>vxzc zf6XgUE~EY;cG-pBW!fwu%GQ9IsX)iNE}c^ZRwE@4{$-cuV6lWrYfJ+I)TTI*cQjmA zW)i=@C9x{yVps;qsLEKTsq0NghM2k!5+FGY}cDmZsJlz53eiI}9 zsXFt>jv>I*u@c`LPVj(i)nH22`AGOjz4iYNvb}<~ zxPl?v+w+%v^WEIk3f8`Ce@&-Kn%YA&w9?k0K`Ta{3k&fd=MACVHWm&%IBnS*ui6#H zmtRHy_tIv|s0IUT^!HMn8@W7FEFruEJcX*{LhQy-w-TwtSBdO zy&0b?4GY7h!)k0J?4Gyqp3L)y`izz;xJ8-z;@kIPjwpo6+gm;%`KftLbVSY=#mp-v z1a-($T5aQnbz|{t)$4=)=}w=!(?EvD{r&xsp91CImOZf}_GD{BqN^tzM3alWlefL< zyp($Ay<|OZX_G^HP~+T47TWGyzn+hBjmazVZGMFXjT+QMq4u25s6}Ti1Vi&*U+Q|@ zCavx*NT@=4WPI{IZDu5E`4nK|dA(m_p$TkcDe}#$flkVrZK>>yYT8x*-a9n)kz43u zvpQm&5)vJ^ZdqQSCXSFEi2@p#Ja?B!CWjx2pHZaiYrDO^VSNj6r^Fe!W_(M1nn+XM z13Wd`RXVYvbp3b1UPU^jut%uA;a#M*!q>M{{=zT&uAO#Q~9=L$(-4A0p`<(^JJ z2hly^EPNw>jFdJYv|swyI1!WkMn9w3rEb=~mV5sDmP59%!yZ6K*qjUK1U(Exi1dV= zq0O!{N8zU?;I$!Ih?(*$V!T}!3<9UP5(3>2R#gbkJGapLV%R@AzA70>;EQjt0L(Gr z2G-i~kgx!#S9TFIAjfZm&M4g>m{J?$Yg-RY6&#G&lfzj7e*atQTqe9c3>u43nF(?2 zdP^A3UXXe}ww#dEH1-rcKjW=WpPvF+!Y^FE@A#@puP z<0`Gu|50r)JnCHz6Kq-~Xji=2?6Y0`ytzI|nY%5MAmcPn8MK)Slp&)CLt?l^yqFz2 z($X(M4fR4u9tQI>_0Ee#HMk@56-aG+42v_9YoKG1%3a^N@P`d%Jiq1 z%MW?fAzd;`Np|99ocLW~Z5T^D1j!e;df0jia+N4)gmX!Crh_jAgt9HY0&uy(p1BXv zk!-}L>$VOXs~9hquiAk+Q`)Y(vY^1VwGL%Ssie6AzP7Q8|6i~bC-3nw!3TIlPKUCl z-X*icZ@uhZ2iVj|P%!q#SF04F8VG4z$ej}i(^%_Ws#!HjeIazD$<^M8MSfJ{S zHo%|~m~ycBq-e)g8y$t1vbd88K$2gaU}(B{#S^zPh$6#&-6155hohhgZLvUq$)}#% zWqy{&22|$58XxwaYzcjVH@BR?$j8XymivCTXCk1j)i|@2(G&OHOWfw>;;}QBq`^!$ zR*%ZbgJ;jm!qY!9HWn;f9;>b{JwMorW2isl;=PcrC)FG$-cZO(e0792ISwHeiFmUK zuGb{`4|_%jplzVccRrQdziO@h#vjZ2XCYohuVeiPsw(H4r5hrUnIO@bNXrkC^y_bk zy#-q`WKLcw1b@ef%%ftUxPi#!Jht@+me?7bId~z!=gFph@iiVOc-6r=2T;h0rFb?z zLTCLofrJrUwNueP*en<_ZLu==P&g54)h zFJ9s+4LTu@W=*328QRNIVD;TbZmoy`xH z&)EIorw*>CBV=xE+XuE~vW!nA;8T@RPzV7+IF^I2Ud};C_RT`rMUdMzmwwIQy-R$- z(n0t+EO;1->PQ+Cn$ZDa6Puem_Au_CvrNL@BO&l^tbVuD{<|Mt|GO4|or7;u3+^To zaNAH^5#bDdeiAxKHomZW{$jy6jTULA*dpF}S# zpAOVXc+gas!n*AqN7PHtC9j$`rh*{^@A(Bx$$Pf^qi{UsagpR5CE5C(4BgfXyip`h z24x^kSRM{l@nPovT!WDzc)?ndGY=3bRs0*mE3i5>LPM`Tu0I)Ai5%Wk^c_rj1lj>4 zS846!-K0D21kAsjpZ5z}uAiesYiZ8S<&8JSjAb}5IS*c> zZysgxehqyRr^gcC2nehzXZfd!huNqW=F44Yy*%T|!Pbz-W(C{EyyE5x%uv0iGdg$e zjGpO>65-}V#P*OJG>XI|#Yj%|^u;mAHgR$Ge-@SxM8Fb>eFzpz9=>;?Aj0y5Ud9{( zT0DTbDEh%dkT8<-g?rJujLy&hHa^_jwc%I!LJI;{5I9U7W=JXMVtPrO4{WTdoAk>h z{pBkOjnJtCYQAEuO#g3Pyii4z`f+`02taC{+-VSW}hQR7J?U`e!MOfQJ? z$W?e>`$Nt&O^)zVG!BW4d|dOWv?C=vbQU;oT+GiTr0nt{JXpdcl=~boJZdw)CN@(z zEFU#UF7>_%mG2kXu`d1dKPsW$j`%+K;K4{vKXL@@Go_r_=fJi2TW!9ey8LI6I;aKT zJ#Z0@uO_Ghf8r0O6%zOaYRf?KnuWG58$^O$GP2rXS5%Bjp5g0OC#@all&jvDDLA$< z4$=~ak_+2B^1#;diWR=oNDa+MVba8*i=lLY(w=U%3BYaT5S)<19x+>lBw02@P`ZOt!E*MHPs9e8pFK1#;q z8C1mUI00F2ZIdmi?>c-6)96qNqmQ=2GaGAsDq}MCRiY1Gt?&&FRv57jR&ZBK50llr z;4g0f%H%~*36PLxm#Z;D#TX25m2Qq2x7kki4A+ON5TaJk;f@7K@fyF0Jnf$+ zqfayCIY)0n77@ojwmz20DREw#0CU&F``fV2u^apNcb0E__P$dl?`+<&EqP?G)99=m zD34PoP2ln7PZaQ}(3o38r20?aQPjkX0|L-hY@73qGS4_D)_xO&{;SV31xi2B<@&x7 zhL0W&uJmwFIg5Rcn0aeYwDu{cL0IIF>Y(f!HoIB)75t8|r8*FqX-zJZNGHi$BXqO4 z(mcOzX9GN|P!o>at!s*T6Js_rVCUH@e!EdwziRM6#r?*MtjwZ3vH37RZ`PC2t=qC0 zj5>H9Lh8-BMpH}dR>5s$59rq*SCo+bG)&UElk%=ki#MnAgyp*-KMa06aJdzDN#f1_ zE#Upx(AGG#7mzDDf&Xm~?CjWX=6TV8fO~X_fX0ebVT&#*b56~%Rd}Lgs$)g@3;1Hfxm3%bcI0H{kviS4aEI`2qZG%`ouiwB9L}%E z?p@)?kn5fzW1a7lx24em=iq&-W-^c+CeO$1i|r%Fum7$s3KF(+_>@1Ak?~4wNQa4< z0}edq2E#wh%*I-Gs=l)EbNHmV54uVmI#ami*J5Bz`d^dZ$b5X8+L3055JWpE~#&#=2OG21e!ev z9fYAHjg#wg1E=d3xThk>Wf7YoOoq+5OtTn%@pjj;2*v(ga)E7#xI+l1CP?cH&3_bm`N4iJLKiuVR=$ULhw+t6m}VsqNe7RPcok1h;}$%D9=Ku^zNZ zy_SQaQsD(5v(q@aRQP!;;o@k;Biy3dqseWY=J-xtP@dmQAYu1|XGp=Z3f#zROs{b) z(OjX|nH!&jI{&+#yXhZY06hRTt&S^DeVAMtKUuJybJ`Sm6fG2ctt#Ca%}Ny6y?B~m zpe)#8T$S#}a(Fi(=w8EEWX1i*s{^T0TqOFPu8#j{# znQ{LoiWv(#Kgn@g59G$%nWO4oCC+<=NlzEO*cX%1zM{fkmR9Dd!${nNiu zSrx#S1mh^m67dDF`!2ZkO-)!z%<}(UTnqILWW3ca}hoca%c$jd3WAQ z^NUJc>ifkYhLZ>>+cj}biKY1$_WcdcTlcU(=_blkR1_CqJFiG(t-ri&{aUa|JMi(u zsTzegcMtAk$r0jN%9KLguH&clC!ZSU)!8@d;FElF` z&}Pg0tCgWm>Cc(=0{3plU|T!Lj3=#6f7&wm<+q}M7Y@5+6x51h7n5$JCAZ#MGgQ10 zq>>NTR9GE0`t-G{#FrC1tNJL5%l*psU)1(ykx+ANdDgZLc<}~~+G*|_Fh@N7Z#~zZB{SgbcM0 z8dSBKa%Qb$Z|}@j9_PAdJsj@D?fTGyU~W4h)KM#r}X2 zg=~BPVSlk+BMp>Jfb5=5L39_E+0zd~jYWK>FQYzQgzi5ryoacybos!S7SlzJ^McbK zU9)xyCH!sN#!lM0O+B}V%F-N9G%#x;T1($w%YRi2+P?2W@@7*Wqum|YH}~U`Wc{@bk*toY2I{G8_7WA*wJY|nqDhtm>b6u)j4 zW1Lt1#;aa$s7Q>(zM zayuDtV^yT(dF(m7g+k#ac1}InTuJ_bv=SA)ly)3jyOO366W%`wVyj2SE~aj7 z)O+s%91q2?p5l@^@)W}%6232*#%z&N_P&4Gd!Xatro>t=PMx)4X0x-paaB(6+Q=7^Oab8uSoZj)EYx6T7!!(1;aYFDWlP{jE<3+VvH z%Gun;&>jBJIH&CYFQbH5hv2O94YUQtJi71f*VjQ-1TE|}*rCu|8!F%3>eKrh8GJQ} z_0MGM3Hc9veMeC8;w*N;l28L79-5{OMpVY%++J-8qIK|7n$Jqal2aOEb&b@2>rlrM zIW5J0PuLPCekl4ja6NK}%hf6lF#=%b7ZG*wn1A#*6RC>fl+f6G`)4M69%R~2vLQjp zH&RBXsQZ-(;YC|Vj7dCc3$wUNUJ2~3p_UmQM6gg|Y6;rk_xL(iR&Sob^Czbp=W(4L zEx^k^RRv>L*|Wp1h*gjT`|y0o0lj;M~Vg22V5kb0%8{1DfZEwf7HySZ|dpKFR zqkI|3A-F}(;>%%R-JYp-d^?d_LVD*yEH``od%Bv(6~$9c(btskZ=sVJX58v!=+!p% z??F)6KivQoNv!7-pqs9Spy%Z6gD?4a4MPBU6!+6-3*U__13a7!49z$8-&L3$Ch{+} z+$=d~9a^rD9tAG#fUwT$JmfCg$^=^P!VZF#wc7;;wP#OT`|Czrb3Wa7 zpr+gcaFj<9dkJwz4quFDv>XReY;FZT!9G}WIjWT&Ss!sBki(PwDNCOHe6hgwx!7V@ z*sWn0|BO|jf3bOI(Q?USb&2)Plj^0xjJZP_bG&G@ptt_~CecR^L$5z;hefpSg7+#5 z6>5m*9yL6hj_tHpXPQU%3;PS-Ov1xaP4lvmM-SzHmVk-ieZ}K%3KyPi-TdRJuHcc- z*h#%TrVQr3r>pRH+4Pi;`d>noL!KRazIjlNGr30~5Q$x5P6}VkVnZ?mS*Vax_2PuV zggb@+U}V5pTakcXVqO+$1VlxZLBr*zoTLYPCEd?UhePR7YQqyJVcq**Kgl^6bNq;? zH0~#k1cyc%Y0z`i{~7|@8PS%uUYVSf#INe&M+ zgb4QJ-G#QyZOz#gDL~V>B%wDt`1-CHhb7rpHxCk%5#qF93Rhp4sQlEAAj%KcF*gZRMoumr#2r@*3J1HhY4<5o!o7!{556 zvzcwh>Vyi)>M8#v{ww6_US;y;6<59tL@PTIFNfQWxg+HFtaUE0YM>LCNJ@OTLir@m zyD8-Dzhb-nO#bOO^voMy6e%?xPivns6BF;1_2n*3c|2=U`D@Pj>U`>X2*|g0^?bfJ zE=}q#R6ARu++^cUp~N~9IIr>GQvHP8G5HI3HrJ)OZR1lp3G@i}AyQriNbpm`*I2~# zdlEf-7%6KLSoPGq(Z^W5a76jXKLk|$Eu zhdSWwv|!q@`Z3$?OYjFh(dz-(pK&x%H>`B}9gXx)sydn>-41Si=lJw?e^HH?QMTwX z{DaDkVyGL*`9B3w1;-=^ z8=5d3Ob+FD#_wHTdxV@*!t;=?!LMIFk1fjRd2SKBzfpPTBy0S>7Nl5)!ZUt5P6rqN zD>*88Tx+Y!X^b9uNRUs8OmEPESp{bzk_L=mv z7x(foX!Q+2AD^6kpmFV!!f|@zbQ=PQk))+KO{X)<&dQHuN0&sB?O8d$Fr*{Nvu~b+fPCCR1d4e#b}7pZYw1 z0rXZLucDg6NnTadXn1iNKCmK~esNhsgdzY|Gp$@xrblN-nIK`vQc!P{kqrr z@rfaBXf9B;?1+9KhxKF-)Fa@&s|vahbi5kidN-k%M9g;^>H0Ky&$0=0@wU1T7ao0K zax*hbAYqvNtB;So->2$F&CK6lU1$hJUX)srG9!KFZP-L@X%dHf;e95B*iM}N21= zJXu20S@Xk|DO%^_UG%BlXF@Vt^kVO0zO=9$IOK}s1u3vf=?+2wO#9_uTY5WBjLDf9 z?&S6)SHXae!`&5DkpqZqmX4q z6z80|dTr~ZO!{r?R%W3DetBx)dL_Vo(5n`oU?25L^7#bTH)8cYeT4ZUd=xa;%YeFR z*#dAn2VwhZKkklU+u-|KLp!j4b2%@Wz8Z22XmaM9{b~L&5h_uX5(+rE?>JHrywnUP z9L?jEUz$NdpFu5A}phtBQH@@nA5cF5r+wC_z4Xs-x==f&b{dLvBY4-WN z&#OaAM4tA*ul88maiBVz$ubDN{DAGWgQdV!S;TKP5ZCBT);)&WMWu$f>L&G^+k~+f z)#VT!ib@nt6_+yMkg39d+7-(ALgHizp6j#)VKKt!>w)f1jn^29j8!8^pZdOX1|4_S z7jJhp9efU_=J>}Ek2^~C zivXoFJ-ZAzn->c|JBIYzPW^{}i6@sMd<3z=c)6}cRJSJnPYo!x72C5?}p;w=OJ)rv@Z~TL2R;v~<12DqbT=Y`;05X5aZsck_ zcbj82ZF5Yp;q@(!26hq|SmYF-zqe8No868-%$`Q!(yjJw2Au7l{3#$&yckih>s)0=>Fa)!ay3$FBG zeeI;y7dqT2wA^}0dw~8n;potR=R)QGjZpf)p3siIFQEX6Z`_BqZ!C9YQ`ei9GgN^? zlVij=)DjqS=ox+Q^5+ZBlo=@srB` z@m$X6XyODXt~8bYj41owCTq-X&a4Ejo43h>1s#0Q zOMiW5>!K3-&Uo@ja;W zL|u_}4Ivt4TX7pC!UzBOTAXnI_TY(CCzHh740j_EhcFl^(HV_fk29e_xG^!^I95dN zVI!woLAQ0lmcr*;mjRPUyr&#@AE*A{-maHcEg+mg=|Q+i!?*07(x!_jpSmZu_XaAHlVmpH5@%FLJN+Ul*GGn6Uf_LBZQ^I-b0vx`;cu28fS+ zQdydb1t|7RU-G58()~D6crlZlBIK8Mk8{3Ll8W?K4u4II#M7SaJpSlLv!$H~kc@Qf zr_~EONyNvVpOF8kBVPDd)AByb6clrGI!|4DNk68|2r@jyJ0=(Vj@n=cF<1?R52Yl+ z-X4m1An9&PRc4Mv00%l5J-Y#yU7b2z`eG^<*% zLfJ1}XFsyfsyExWbjwFg!aMkHp#RSTh^A9O^?g;}MBXFTu>S(|u7W(zBxnOWi%SfG ztyxOyc26z@m?<+OjAHg#y;@o*dIEw5V!>`Y(oL$yFzhGU^IPt0`FHiu$2=c)!tL*H zevr-2&*b18tV?UoDVhYizE@T5UN#l)NpKX$Ak$pfB8-zyQw-^Gv*XZ_=+eS)E?AGq^#`MVA1*8THZ~7p1VzvGP&Qlnza^`m){Gya~eZ>N+CoQt;2{ ziMY?$SD$R0HK*>k)Mci)Vh-LCJui`8@+fM8*%xgqWtPN#1a&mzP2R!%7_?#SO`DEp zjeP+Z$JEp33xxa0>4$3xzFFrhk55Z=o+l;EhBs-a=^at_Pe^EVJ@9Q%|2ee&@hR6u zXPS*ru2r1oF4cx4)q7zma2c z^)WsCL>$4`+tu^ooc_2!mi{8}DAv*!H_`g#BXZgamLVvpDxs;5pXz)3>YBFwci8UY zO$lfI+AfH7^TSJ2r7f;dUOzkQLthg3{4S4tP-A#$np?}u!RR;5;h!uE-t@lFhY~Z8 zmU<>E@N&pawbSx`TLARYc2zGD%kFfdTlE5*LAF zJ!@Nbv5s_dm|KjzD<|mhcC`0oGPzZMKLerNH>*k^?w$wHFmLlNa+PHfJ2}J||7b!7 zFU0dx3fyiyj)ItrHeigm7y4C4Y;9gi5#~tduMpADTfb+FGEI>{$Xi^xb?-Mppy4_L zq>MR*O$P#_=z{W|2vNQ$C=6Toz{)g_hxB9uKlMq?-uAX5KZsl)K%{gs@RGh06(W5^ zD&<%VVPCFpGx+!C(4k)%?Jale^=xo+u7|a8)x?|VYOTiWf`lgN<>C$rgS4Kt()h%| zb?j`>nAt1XMZg$nruQii*P9Pl=U9L_h3UEa@ssqPp}^pn9y!6_oTM+-5@+1v^h((1 zOnQz#Q9D7b++h!R&LSvlJ%#o2ZvNH@r{xfA?IIq_+<)Hje!?;T4&VD_p_i-Jc$7X~ zoFATfN#j6E4)T~Id9t-zO4)RXrqKpBVn4D1=NM#yCa+nwD2rdIoBHfIQ+TN8 zQ48yr>#Jb==I6>a$MV?AdC4(i=)+ZioRKV17)Sni-}<#h;+x=J%B1 zL%Lw8nM~>SZI4vg@BclzWFO4$#0c59xU(%7X4^BAwkv|+b=H(uC$Q*ohqr6#9`s@% zwloi4DlP7051cUKddt$>*eccCs~+MSIw*RA30xR@E(SDh3I1`-%1deVXf!e6KmbqV z9!qB?1Ded$Qngvq(9Iz81X)qx4i!kw`H zwmXTAT)8SY%@K=*+i7k3bZWO6bKuxR#UKZtUhV?~T>frBm3)dQ>tjxn^AkmxA8Qd0 zn^;f^qT8xf>sUE=n!0J(!WQ5>SUix?|H;2I%H%Ud_Z+`q?)9qs33#W?;{^Mu`SE2u zMlN((PUZiPn-#a?Ci2%Yqd=2JVrELj6~z-tyViAM=QWvGyhn$wUXPj zwi78tUOD#;me~q%*W-MkL_F^&C`USUb+E7gh9Dl-Cn-;;SW}{>2&a( zg5Rcff6X?Ilhge55+ba3JGwWEWr!^vtOm+&CM#ry;ni%KTMs$Xn*ErX{Zq%lZl|c? zYsz67(q;2Lx;jO73d;QT$qF9}hlHorTlGvq$n}SPl&6wo9HZrC2lrZCqDV$MCU#yU zh@Wpc(BD@!-lKj%ACIDsX{jcsU104^gg9vp$Ba`a;}8(mydM;ghJd=Z~`-*E|ENSFd#KTkIksO;MUAhd&&3Hry?5}cwMvd5mw z9^z+|j&)xlIAZhDqDcGKfKb3`KS0_o#3|Gj3cHQ$R(8EevkpG=>cjjEVF0wD?nwCl zFbL&Nr}WW5dvBfix~d2MOewVKFsL?RY0%2DPO`i$iK%qzTgHkX-2Qahyu2DV63Q&0 zFLDjOC3xKq`V9|*kl$b(zq=Rk>7$^u7vg07aF;v&UCoXYkq28vL8~v*rmxoW>FhYr zp$u@3cq_7lN2KTD?`Eb4mwsT62VmO zOkaEwBH5KbAJek&a{_j)b(2`wQ%=%9pDI6+ziq#8w#k=lvBy>-?L;prRW%MAHpR>4 zi1RYCv*oB=PdgO5Wx#>VM{>s%#5+ovDoRn*8ZJ=ljw@7I@HhoOG&~qT~5Y>czRNNi^&>3xLMrx`;TQa|$mTb;epS(}^O*AC2 zQTXja>eN`Hx9A;V6S!X5wFl2P;g{9_bj}BcuO93SEvZ}}YJ^!sJtg#=7A2L={wfEI zzHYzSs7@Ep1+N^hdWXw_*CdLgn}co-%3N2cnM|xlL2_G4*8$_TpFbx*>_w#JH~B^P zZy7LiXyRTCFU~tauPB<28th#4uM#5vne+d|&+pa{FqcV3=>ax)XxPe8wAfXO;}OWsVcgH-gzkjred@7Ump1A#wL`#F>-fK=u<@goBHJFy+zTM9w;#c$ z?EevUmQhjmVYjCn21IEXLIFj(a|i)N@=*clP(oTldO*5Gl!gI8I;FcihLV;VVCWiZ zm^!>?op+t@_x{9g}n}NOwo>lu)VZMK>=zQ3Pq}jaR=(&33Pq!%HLh7hz(8We+aas%L z+H`oAJTeRzrg?FS02oeWDfw>$v#-=zcRxZ|9D)~+noXNW_bVi#XwHr&lpf=tKN1&R zARLqP-Q^HMPgyQ4CMAUWU>pLWX);XCn38klWK}B+`4n6Q@|^%f1nOC$d2qGrjh6M@ zy^U+EfL9q^Bc=pHa78-S=OzZ+VE9Tix@5|#$)z)@% z$Ii8@PLOEAs?^0$IueBdY!#@aM^rxO8>r_&Is4ma3F>Mh4}@HAOj7)?4R3L6iuf1j<<^2bBJNt&kl1lrt;22CwF`#7i?n(b`{i$fBwF58&?hyr8du$dh$C; zVNZ>QLsf*q9u@F>anDs)Lr4?+Ta%IN;#p3;loc^mCRVHZ-USs^I(a!&f1F=iP>Gol zi^7@3vGr}bR$p-L$<(uA_5wJMxJu0bcW5MX%{Bhe!iIK+4enOz`gwC$UlD=L5A-ueL9ws)or*s+HW|eB8QZQS1D8*i`z=6gcj< zKo~pv6C(J~#vo6DY&vR}#f;y15+L$N2kd|5hmmh?Xc^?zv8^ejQiGyuji$e zWY?=pdkK`4WrLrtV(cA0B$wEHW0J7E+yvfZ2Tl8)k{}6_DG`zQQvB~>R?}^}KQ$rv zqtoY)!hUd4-?Qh9fwWV6VJh21$wgEIT^oYD$UeP-brUuj5egNi&R3RMeY6_kb82fy z%Q=zlvD$(}Ycf&>T|zCP!e#9E3i`ZINYo9x*SNcZ*!>ekp3Zcjeq@mHWgNV{{D|OZ zI<0X3lM}74OqkdB*}0r%0UTP42t_yS`APt;NADA+Fb!^Tg+Bft4}xOpk~rqRJAGn~ zKd<0~b7ToPR=jur=q#a*PLGVh1T7(d1Ym62+Z$T5k2_GHK&a5|*+rxS#0h)(Jc2%c zm<^h-3~sZ(ET>WBd^?_@vR;=IV6Mw*dlfhmI)myWDJgvoMcolbDJG8Bh86@#J&LZS z#%(>e+B#lRxJdAvL|~$_M5Wuy(a4{=Qj7?rTAy34s#K48>RA|3oVs+37 zY*u7*W;o+BZ3I;Bz>YT3Qv2yb-yW^e)s@Sd^|<)QIpTYkY4zX!s+z`TK3!9iNr?`m zJIQ6Ak{<${B>ZVnF;Y~@@xWFQnet_^@Wj*Y2l}}P$>MDUUZbN`Z#lKb?~mPuE?_R} zk;LzUW^KZ^Ztb}ZG#YFGnc#CjGd&s?Lg z>}8fdkoEC21h>gh3deJpu&vSA1>S>xM7{*n$*M#P247sqs}rv=S*Cip1>$e-h$hSY zCCmabgQOw%xmIDQ;|li~|G}MyIihM^TtyIHa(s>sWYmG)ADAH4D6+P({~-%zx028A z%!Mb4L3&}njJdn|fJxg$Unw{?@jElLCpB!0lzDNEc6?iJZRn14a-+APo8i4T;rZF) z;P!%{Vl#rmDCvgp($9k3jk3MP)MwRwG43+RA+pZn5UuQ0k!*qQ<-V;3MSbt(-p1oU zu&~|XB|?>~?S)om{84qLGW~Cghry`cAP;tILZwoDDx(UC3{LAJ%K_gm{&xG91r%4k zPf;yvH;@|~PV|wBp=bi#cPELbZrv;8!{+k4EHl~bPGnb_V62q39VlBHZqb@uzvjyVgV z#d?tAAIelT>(Kym$XejXq)8@G9nCkVU`b}-?gyF{xsSXD`Z_*&rapkJ!4ly>UxTe| zSZ)*z)hUiEBxEOw@S^vlX3OGV9 zsMOaCk9V*tC5$~6;Z{}Gsk{RXLsE)2&G0idSFIEyVtHPeS?X?gu=2q1;?uGG=Lg*THi>^T+Q zi~+Uz>M??tpA2q+EUGy`^D6>XkI$~z;np&6k zZWYS%f|7_Pz5i8C{^3OZX*CBgV>ZpJG{14aBYHs{z z2>^|)1AOzM3bGMu_K0Um$=XDbn$g6blj3 zVi%wML4f&zZ+1DooPym0LfXw8Z+ob!BvA&A$ z?2vFxuj4$*4d{D=;)FDJ{D1#JV}RY+eM9_EpxeZL0;FS`RJ(9Jd{A|qu??bP>*?&i z0gnHy3y?(lUmv&NWGN~3U&-1N!QJ)962tHC)c?s=?|yjamPD9Tn7xqeT?-Q`zstV& zzj3v?Z|cCtNeCI>@LZ%A6)4Ta^(fcUmdzh$E#pn&13P*DcU2m9KwU&9Rk~ITm7|_} zoSfXb@t-5%?AvMA1^;0~KIRLL8p*v{f7x%yu1qGec{u@lSs75zli!ql(Di!GFx znfRgOv)}fWJ3FBGA%C7`a)wr6!2@VSq?Vl?X@R(e7G_g7XZ(-gW8dvlal^Y;f$##w zO(~hGvntfV@RP>2`GZoJ5-u_&`^v@4p)g{;ILj%!FK!tAXMgM!$6y8>lf;&olnvzX z>%c)KS>E% zV<9h1@86aa2(#;X$s*CgRSpT2OToPZF1|X&*`6Nzdz(Wq+CyvW^xtWlzR2(W?ig?W z&ZeB`U4npmUSvXj*|WlzPvkL#7&>$eHr&-aidL$E{~y_gM7Z-?>WDJm5iWv^vh;5x zwhQkgvxht^7BC97jz+zdgEOey4|>N|T2$tZ(iOyKU8PfzLnF*4i7)>xXHJ zrac|y73)QHg{NjN9c^8ObDEBU!c*z zuR8w~*tW&*DPD0*ri<{455+^NkbTRyT z#({j)1uVC(<-Eo~<6ofcaMlfn9r=R@iK%$Hn$77kxKsVA3vGfCfE%jo)aF@J^jG1_ z@&GJx;HL)ikaWdN^n682`RV~N#$G~lPS@1g_bP;rFT~iUpOjqZq9|)_7*LS~wrPgq ze(e|2ayzoU?Misepgcqg&Y$XQb}G;9eiFW?z5rO*>l<4+Cs(tO^Z$GPhV?`1FZcjn zhnWwPHK9OCko!;RT!Iq1-v>t%>TDvn%mEVT@8&K?O__`C833FQ>xYBfH0VZNGd5&I z@n1!THGUl|olT6Y6kWtLHhOGoLS77ns8feAEE}udx%2Mc4k$1Jn2E~YU5a*9gS{kd z1;ZbI!R+0}${Kv+c!T#dmf72HkFsyYk=;G)f!pnPGUCU%xjE`=oX;1AoYyl;itpy# zwIVjk8s2YNO3r%8YWcYxo)oyC4e#kb zBqzTKXMrb!ZTrmlPkZB?v-%ExQri8yZu;v!CSbU)(EITvtt0-jOnWW0Tj8J;M^A&g z|vMGqctAYo9KOX=pADQ-43g zzH@@BGH8@FdR*ZdX_}~#shu4P{U`H1A;nL~^(Dne2WVe>R>um;h=hmReQTw?HHHH_7ayI_)iZ@J$cHM?$_%@US0y~`nuDm|^E{p%Dnvy!R zQSp+J-X`BqEm~vw`pey;i-97zstYP&$)cG#@B?y)Cyr%^tv{z9>6t5X4qMjXqkiOt z}wKv;C|_iGaF?%uk0}u86oY3< z&d$0OixDb*o5|Hce|l})YH4$Sr1{5!0C(=!@&M9pP3)#4V{BHFUu0;wtTWX#7ayMQ zta+fCIF|@*_~!1vkxW^7qhXm;^gB3YE;b zUsH13G%h$;Qvc+kPu(OIQzeFiolz9A(E3O z;H<$lnZ3kBI#@L6A@jmOND?d$Y!>AHYfmaf&u;;JPe|lQTxHq(G-A9@I!DK z{W%`f;|b*6PpIQOFUMr}8C0%kWp&_eH{7IaH=RkOMJ2%(8n%#>l45eJZNJs7ycIOQ z8WGJEG))SRc}Sb&x}^&36qdHjEm=#eW1FX)@OyDBNtBBX{T{{3FW_v(bK}>`k=goa z%=>4pY*;PQHp^YqC&zk>Qh~D1*p4i{#V2`i+}DtCDIb55GXbRj<%GF=i-j3I34Vuu z@TC1ZM!c1o*M85eQ_gK;Pt0wV)sNX`W8z`cRPm6}$ATKMZr$ z@HtaZ)zH1iQGfoiTZ5#GG1&xIL@g}T0)FIA^DwM?W}cBenVvd*47Uv{_Hj5!7HDl_ z=up$m|McE+N087!otgvOo(v6GtN_mkdn4W!#}1tt z8L8$B9=Xw%+2d739u2E$%m_DViQ_J67SZ`U%@^=|9_j&!dA5`b8*G2XJ9r|eIZhH0 z1fTEORu($=3iS8{r8=tV=fUsYJ zcmKEIzP+!wgG;8TLC1$nnMZ$35Ai1lJB9k&bTt0~^#0uQk}Oj;yeW$Twx`qSe!?#t zGvQnRF#q6XlK6Z^nqxX+um&*Z7-W4zf$mCI|l@}N?+y+B~I1p%9pYbjjcv= zd=b>2lq5KYD?F|m4m=J`EIKz_&z1t8)f5Zr4hw)u=vj6*3hRKayPmt9TWAn6sk%rm zgfEr)@tIZ9;@05K2T4yT8OKu5T7HW|x;Yf|=j+FLM)$x!cFu=Viiq3jv`~)?>U@gJ z0!@f@@EuzGZfz}r>OF+K#ux&xCjR+sQ_!WBkZtJB2jZ20QcpDb>x4BAxUYD2*o`$f z$X3l&%>RkqvVkW@w8yO%)6RFv`j2EZo)mHR((%{HBv{xL)bqi4SW44W7O2@~{f>l1 z!z#$NTVGS5J%;S33%w&mn=`#U?45qy)SxfgZ=Mw!~x(UsnijEpoKxe^Zb- z^7dB!G7(`Pj90(Au@tH+-|%?j6jj{xml z@y01hmI@zDaFOJiMq+AR6GwV{3l<5(m-|x*V*Z&4TO9rqX0^$vKAt*T-wsKeCoGN9 zuI+>UblXN7{`X`nHtbf?1QqkBK;mAWTVIRd%S!+JXM{(if(NgB=rwl^-W@eROJu1K z_LiXqz!&mh;c_~J_xY#V1gb2_Y<-WHm|FFeFW@lNjCG2>1m|bA8;R0scB)g;g>C-) zT{|=YU{;%KS-^f)dXd3uo6De0_<)=0{G|SQ7I4eL8xF7*T3EUj>3YUW$YrCI!car` zR_wopaiWi%kD`MOOk=`- z<%!bYRD~M6##VUzynMgTg^)v%0_Axl7GP*t%Bw==*LT~14+0N^G)U&X<6DLJa1+D< zF!StN?(Zmc!Qs6u!)pHbMLf1rJ+k- zre06EKZ-*=QW|Wf<^ppo8^s1g4R0PDwaeIIDz~%$^i2DF7i=s#O#$1;z(LoyvCy*< zBy9Z-f><98Iy|k3PrH_x*kP-T-8k&q^U<&fFIlV%(ml zz67sxAk_54zJ95Bb%`kt5y8_F*90y7df3SM`-vZ`cP==umTR!I(Q_k84ezEit@A3@ zCVm`z3MMa+C7k?3@gT7W`q$T+c5HYMD7h$AGOwPSzLB9J2@5xQ{NwKBRR2T-pz0|e z-TZw|whzGwGvL2yxj`$j{HHlz7a(_ubf>98ilpc~?Tg`y*WaE-du$w(5D@2bw;4@w zn8G0;)E^h{&DeaNmn_cJwfcI22CJNk6t~cMIpMBQFtfbQoX}@D$v6HlN>S2hdmCUB z{aAl^(!@`!?gIE;GYZPU9OMMo?$=J&D_&ONPQafGI6Bhq^7ozG{Rt$}_VXJoS!-Ms zybEd+M{RTgK~SVFPurnX^D-(a67OnsWj~+% zR1A8k_`^D)OR+fsY^KZRvl#cH#qac74wIUFHP*4qp@}C9lquppqe8gqanP62hQnt` zn{&~G%*+#kN2QiX?en`acAoJ)x&n>!oZv>-nap;wrcwMVw~urf`?AcHu-UQeI^KgZ zsnxT}f~u>S$3T55wgI1Y<_SNYDM|Hf#0 z;kzxJ^Ibsx0-u9Nhz^wv1|@;|a|75`L+Yy5NS{LmbLU25ZrsY6S$x1jjG*j4f7=PB zf8 zykp5FRq&F^WBl$W)`77cDQ@R>Df+pckcwA0&xDa{I_j`>WPn{ZjYe2@xwBuLq(&FwlV^sol9Nu{TJYL z!A$CONZP6LWXxf<1$&e8k%Dc*rBIq8djfX&_&qz-Wc69gpPddFBLxA4DAl1~_M?~h znvB592F)bj06(m_tu@d7O0@m(xfv?gPl=wB@LLgBY)gB~i=aq2V`SY^&cEGZkExuP z|MYv6hCiTb7#7DQW8`9Wtmq^1lL(5!Qv}ZS_7ex4f*m9c-N%8czLz59p{afCegHd` zgo5vb53Fs7qI`02Q`X_f7~z+N+yaUR6P5zc5f?9jt*yCN_{(rcfA7VqK zA##7B&5opdDw(gF+|}hRdy7^{)SUfAl+`Nos8vHv;X{j=@G3%73n9I=ic{^osB^Uu z2MZb;{0{V<28fJRRK>Yjoefnh^~7N()yVeA^O1nW&=)s*5@PL-cusA4JZApGy$5G# z&y9n|uj51CfZQB&iYW^F3JBVzPU)TIVkz+x3|sLYfczME5T%a;Et-Pf;RXz!Q2i0X zO)Y-G9Om=iufP&nb{#;%?d8<4 zt|jhpHr?$oC=L3p_rxVIgDr|4N*y5)eC>cWrlu*=fFqP!;52pR=VSLoMMdd{ zmx}_2mUNclzlMl3WIqT|7s{TaU3@<5X08$Xg`OW2CycPRn-Hu=#+?IfG1946-Z>rD z|4N^p=MCxTV`c>Vx5F)aAA@bQ-O!85wohra7VSNBs~UJ79Ie3Y8;Q&;Km3>ZW%!dv zxsxCsZ{n^QdsFvbwYfh+69n@3)UGVXx3Bm(BW%iyh=JbIF)@?7)QxQOVqSSOe6o3s z{Vq}=FpwRWZ%XPb6Klk#_Jx)4lQBk$VTq$;b^g-~o*Zs5PJYHjV%0Fb#P#F7Ke?xM)(R}rPfl|_ginIM}^zIt;eWKR5Vy=sDf zLVcttmgQICXt8MIJ}1VS-JpaO{_qRGMF(s~3Q%n8x$hmx^~8Lxn0|k@x5T2Q@=0j0 z13Mo^j4yTm)tZ&?!#1pDi7qzJBe?V1nH^K;K^6i{+*9I2V$$u8Q=1a?tHF-jUl^rJ z`%+WN3vqvCejjeOLu>CDVn6Y#-e&%R)Y%OZxG~Xk$7uIgGJ2_9OhQ)$sSE|1i4-f} zP7XRNw_hlHtk@%%mG*S3s>A*&rU=^F^cxr|TeKpUn$4S>Qf~0Bl;LG85)<<}$L}gH zR2ZBG!}>`&>W|skNQdLmm+r=pl>icA+W-PukGq-3nI@4-NkuPDCjjO$c685*HKP9b zbsG8n*clm_HX$Wu4#!T|8oSbEjy<85zNj<~AGxXz`NAPl?jNv+9xg~bp`A!;YWr_* z;1`_06{Y$m!?~SIKL6bdO^eo6+jV7c&y&;K1%Rb)wINyDkHye=qQXu49rwfxB+Fgav8e z`M|2~FDk^wvlYipjz_;icc89{r>OKXHK^jqO28M=$gQGXs=p~#d zPDRN1Ljd432=B+5kxbU5|Do(z8PKR_5s@^k0OWlElMWR*Bc_FsRHS12-UwP{mrG1C z&9wtde|QclKSULM^4-?>QRWyY({6RP?32M448+qAdsULN>?^R7&7=3BJ|Z8?g}eKe znV?FkGoP)x59(+jwD&zr5O2@zjg|s`m_9SpOZr?DJ@z^~X?LBwfcw{Qy2u~B&)Mh9 z9Jzt)nyKV?EFAStj-tgNWXkKeWk&x{q5Sw)q)t#x=jU6YFqcePg! z)U$J&QlqCaEL`TdO5iZYpGx3lfaroW)QwY`Az_@dABCvyiTEf;_K?I<=IlXI^VoX! zR^uI+m@?~=ixy}^y=bGxi^90e1%z->ax-2`bLSD$M#Z=$CYL=3Yp^0YzL+g3XyHUl z`yYN1XP#(QrvzOur8wiK6*Wub!cfka;)V4bQk{D<7X9e;4ErzSg^v+Mhw-IZw~OUo zk`k`!>ZyKQ#;+&o@*TtylwM7Oiq|v#k|fMx96bTXlN24$O9o(Xb3Xo8c&n0VX<;R$%enD3pVY)}mqwmc^N{wG<;lrqWUy?)xcgfJ z4K|N$%GvhJF$MP*rOo@OLjCyekcO$bn%*W?v#p$1=X8(gsJ!ldrvuXZn{g#lB@wDyK-0z$4O1<&V{iEGP~EOu z0X>@|iUyvrT`XX=^2v6x#P7<)tNSx72B-SQ7N$d=S0%rwwv_7UklAHj83~#CQu#Cz zXm%S({?-?6m&m4WT00f7)X?_*Vz}U-j>DR?`Ra%;iv>nnk@zH0_=^5&)^Nf29;@j@ zJ@ONyf*5<`nk8!DGWv1#hhU&Xxh9l)=2tSvdfoP!d7!gB^n0cBXN3oh=#$IOUtL)$ zdythuHRbX?M4l|7f*OuBWBBptVX~|?bB&(OU;BnErWby`w=+?<0wF+D3ltQ1l%p4o zL0{ij+-r)O)c3P)E9hfz<8p&{z^Ip{lE%*=*{u7eNVvI$VjTQ=PDgBE0Q+x;Iu9Os zcuIxG^LuXDsqJ@ZmM}KoUW>k5uq{00_1Upx@4{6+x&LuKdx11s(T%p}2q`5Y$2FoZ z3tar$x)v|(w)K`0mfLY3ePONkSdIlbqQzAcA+6%7P_rF#Je=P}4CLTN{ciNMDfHgL zwFPep1&fB~$ZUqG5FNy0=iegJGt^w41%FeemG%lsO-BMBs*tPYIQW72W;%_P*Rr&` z8fJNU?;i7K_HY5^%ukm#t;=cLG9Xm#uZ<6D(1nxj=gaect0>9`2R{4Z6lc4IriE6! z7in+rVjshPhUreAfB%F;3TWnc@@xF6qe&>0klNrOq2^A=QjqxbZQSokEwT82$3=V! zXzB53ZEVn*>eDo8@U*vC>o2F9JVUpHu{*r%MoV7x-r?m}Vylz`ME~Hxy}`dqG78e^ zfb=gsRI^mH)xS|j)S2q3Xr5k>th-8GS;K1pyMgTGsl@)r%t1PT;`Im*tE6VG#?SwTavkI_C{{8^ae>3-bZ)TpOto?JU(uL_{ zbr$X>7)=j4qilN_V=^^jweM|3knD0seR`ev@1eoT%w>I>f<*9@Z2fD&O9xA1+tV#_ zm-g0Y9p?(E^n7Q>tRWn#^L;#+m?X29k!DwgTelw|*#YXC)JQ!ML};sgz^Xp!ix_&= z%X3NWsv^EseEgtFfd##U5ECj?@dv4n!2$4{h!m$z&awNyN}|w@EE^aDyJq@6WF0?# zsmreN#$pbk2hB5=var_X7b@)i(5x1BeRrD;(4D~*L6)(Y!!gfG#4drUU%;)sQrNUi z!4HNXW|jHzMB{OUk$dso+cpPeB{FC{-paIdMBmkmi;VJ;A4Il716NUncquke?r6fT;wa zsY*I(mKpVIYq=9Y2QhXHNFBF7Nn1qnh21hg+8lvqAATCXh&86YjGk@n*5cC7r7dka zAGGr{7|!~%X#=6`s@Zdlq3Rwtl|85lX6rkAmp(oFMP^#`^f~|EcMsn3g&t?V1kabt zO}YlK z32e1}m--f$!}PCYnBL^Z%r7jSvl_cLhtpA$M;9ROuN${3ODIqv>wTEnq6acQjC z6K~-^e3{}{srm*ouT^{UTAeY7#A*mqv3f65uZw{S-f40^Ef6?H)+0dcl5SdjgZ^B$O0W8P&PwN{uh3B{WzNa=%_b3GJ zxxD63b~e2Ijx87m*OX`h3fE*7v-MBD%xm>3{~VZ%qH=Jqu#+O8-yU3RZ{$Ny6_F$f zG&Uaj40DcN(`SRlmxj%H8gwf@bQ& z_Rz0tN-ddSks)Ab#U>9f?-$S*-JbxUZZh+Vv%BuD_* z97AXclzj;Bi-cif-t(^zO;LuA;yTY5Qaf*?Rkp!LliBnNnU4P>6!7d)vRe*@1iLhz zDC$$pqMa7e3(<@D{g@{sx?v?Ch;&-#VvUsiCCj(lMLf#6)qtAAa<@fTQsA4gVa?yL zO&Fyj=MBWrA50EK+lHHUg}j0Wl35t${B*4+ush%dYd5$}cG|apGqG6&wI&L+*zbwY z^fU4mLMM;#!x%FF9D+Ovj6TH#BSPhHw>K>Fh0= zadoxaI)rJFggIUgv4kbFE+f|1HdO-f&YVzNJuy^|%(gSLJ_9_7v zc;d@F*TUADb5w6&1#XzuP66d~hRtNcAHYNU_#A?Quh5yC&Z0edW)W5acZ!hr$f?Ln zakJ%3TCQs}XJQVMdRTkgr;pD)g!g6ygfDMt zTQ5f;4BDvaFjwv4e8H{jlp9Mg>_Z>eZ+I9D02RFPihz$z%E87S+sw=acDP*i689wS zOKD!53)NWx1^p_r3MFyN=1iN5n>k!3k02$>djFZ>`kXnV(&=||k9Z^#-YW~wkeZ6D zI$Z3i?|7COue6kcX|J%-cZsY(r_Cs9mC%8r^QEDml4MEWJUW~j0Cd*jW0cA$W+!}x ziMKsZ=FON<_&|BrkU@#hR|QierElCBC_y8dIBP;fQ8}5|K%vvx)fbh2t?+V|hn`ip z^TY)&mhM*&TjA$m{jH)awXxalmj87dFfv^*XMOS~)eMPi-~2fbIH-z=FNtW*AK<>3 zrkXbFo4R$Wc% z0FBP;5<)b*m;FP-QJoZwLJ zaUcb)DfH&wEX`QNY3c%ne}kIl6e3E=KJMjxEXR6{x1p?l7CplGw1o%6` zZ9j`eF4BuF#(3Er2C=5+!eYp!+g}xCy^nGss~~@?-Gs|>oa$cH$T@&bCd_3moJr|U zmoRtMvMt;usX5gv7V%Hr7N%*iEz$|gdO~bV7^9hfETm7V4-$h<3*xMSOW}WWJ)ZyA z>@)g2DPAHOQx9BFW1^^4sESb;fFv}3o@Oq-#|%*tf`hO+y0yf~{+I7PmGEBNv#Pe2 z{T_F2MH(1g5wkPMRDmys_*Zv_Cb(pbX>F?pU#8zIP-H2})^w`(w}CV1CPo!m;M6L#EL#~QT5?cXxpYwKOWQbdq};|QUQgNl{oSRgAiBZJp?}4K19U2rQ@+D#2EqJ1iT%NTg|su$`<*! za0kv`3notd&qSGTbVK4`?8=|*FBL|2*{`zJ?=i_d<7Kd4Ppb7gzclXZ>jN2iz9JPS z*E+9i=LBAvb71sIt$5Ss#2OLj(P|Wo-Ou6ts;r)BSb`@;^`6rCz?w===hsKw%f}Jy zdDm)Q_ZdtkL>_CXWgPCT4Ywi9p@dj(|JMb^o_8U{0pPQN_4WYYqI-$h{2l)M*^1Ql zWPl|qGT<-DBxKP$S6IJ|_}`a071`pNVf<{IR0*8qQ?_A{To-fbjvt+kLt)JePuk~L zo`NlsUPOKsvL+%|QEK`$>S9#(-M3kw{N=`=;q5R)>Xzad?+Nc8md3{HSJ^SL2+yto z0DgLhuA;l>i?407=wG28FA{#s?HTHYYHauQg?WF!eyIB#pNT5|g*#h6T_`aGppK%7 zh=o2bn60Rn$}=Rclse#5s@?x)T~adv2~gVYXW#&))0PpMGTB>}!RyL8GZ??~|3~S% z-x1Z_PwqYeWb6}rfX!56=qU-)(XJt<6+Wl4HE8a6Aqon%nH%?5;D_-ebfa>RW8^*o ze)suUWWvy=d^jd+r%D*SRg+%y+oS^ihqoM-iA;4YXWWSQi3*w!h2-KUq3$xyXEQ3k%^o{H)$g$zMJ%FJ=n>`e@OkLvs@XgAfDU(98{r;y_C z4RVi7u75}}2ow@xPVXg6eLIWCovZ)$2+}9E8AglQ$*&23D#3VVC@GMe5iiB3b;Mvg zxfaL^wvH0L&{pnhUm8Hx0Ea?7T3_B*ukB`Ry^Oe<_2roinM|oP*j76G!uVO%5Vq92 zc&9Pi$_mE!cLYR=U6#ycGc56_DXJ-YFynU3^mg$#^D=s)l-19qD?wKwpXXeAckryl znw5)`x`R5G)F1t$mL}lN-CF)XsZ+<5cRNT}kQ_RfQLHMJP?u*ugS%~`Z z#)b}^jp^Q+yK3y6|6~(a63I3E zkKI9oxwv!qU0xSIC$-IoRO(iOa2Gl>vr{Um{URT-({DB*kk4=lqqPpd6zS zc0z?7GYF8|rE9+&-Y`I&q+R%&ehWJ&N|NH!cenofOY5!Jl-uAf1aB_-B9 zvv#sIk39hp^ih%$8r+3IRp(>38h9vxXr_z!wlBeFDouJPTAg_&3xn`IfV zIoN4#q+IFOaAJc5g2C-Ulgtkr7g2#QW_o6L9h@~3E_Z>KU8ld^^Q1j*ww$s^;RCIP z=Z9Qy!^`-dH;U8NdWb-VBdq|6ML_RF!6?hNpaKWp9>x(b_w)C$V(3RRHNaHvuZ}Ja zYI!fD3IwHYO{d+S11r(4Dzguv5L5l{pm}aQRMco)I9&8Uc0qDI9CM*33Ehv6AgPyd z{9*md&DE4zk;u&BI!#a0=V}bgW(L$#ztvPTG$}&Hf-VgJe+PSNs7>E)E<{1Q@~5wu ziL#>4&Tp~O-f`cC!dYK92_<>cE8>5xbF!N$b#q@pg+Ic_#^e8L3|WS380%6khEG!D-+p6;EaM(-g% z(^@oAcV=1T9?Z}IR1NYlCUa9nk(4Y7aot?d<2hmn$$RaV^(%Bls7?b0<+Ndlj$#Juw@EgNk4%SrjyVL;HH4_I2rlbk+SXt~#2 z1nGv)vmJtH8ZtN_m7=<}PVm#4@^S5}byyW4Ww?@}YMw#oeP3gV&>SE3?Ky<7G!Cs` zNwQGpF5!;4zO+p;zo=3hh9B3unyl<<2vt43RW7w;g7K1waq6@E`eDIQFBBD0t+k*% ze9*i7i`nwkXWNbtgVTQVrIsZh8Irk&&yRfD%g>kS`)L^5X4s)Mf6{#kX}A#qJ4#4C zrUjLFs;sNfvC9Kn&51L`!}Ta0vtOEpeoifHe@O!gS|kHKd#(sz{nVtW{SikE&9}i9Gv{O=D$hT%*4H~88Bdwg{qeo z5E}XqvF&XG03@;4vs857YQP!>3r8d=y+i2S5UM?lcNmxBU4?+#mdQts4<^yc1z_jGRV&b8QS{ zF_Pk}TrNRH7Z8>5MjRRP38F>mA+e6c~@96RS%INR((Mqf~`iXmYzWgq(7;k{Lo}uhNIV80suGeJ*9wLsOOQUsfSykMz6fp60z{ z<9k{D!7vAWrWr>9;?J{5jZH(3)L&qR^1~=Rn0!MT0e{Z4AHe+6CPmGeg9DIaw^klJ z0Hc>n?|D;~IANSVwkWdGHyAKs5k!8#@PG>ce5k2P4}6rfOEK3i-v*?4cwh|8C04$L zBrjf3?%c(W93%HYR6hgil*@0J!Aao$X?xIW$AQCd$*~I$m0;GpTyqsOau0ZmLp($@ z4ONFr5EL z!8dQrs248|TkO_spbF^4aB261UXMPMJzeIOP- z%}LOSNJohsdjAlF;+})hdp6JmD+cHMo-rz+m>ju|!o|hUXbZ{p1!Wy|4E?*}S-sle#j})wamq2gr$oPi)R-UOZcDJ__>I z4|c>**$|BQu`As}J91hK!u5(H4#v=PHd2^ez5k#)e8KMdD~c7hL}%}L!JTItZF8;{ zl6>%j^Js_fpL0(j_u64_&i|@UE||vF2QX?BVcL2A3tbMLxF&Z7(PgF3x<;Ba=>r3% zFZ<{=T)>M({@k|&Zne&O3bM8cM{b;xtIWD?fT)oNwZR~?Yawy?Olbb~Yi-fxO6*>n zH@&*)Bk?!wkh#1^h8zo--s=EBp`KHbtRbHPs%bI6oxB-j6fW# z2VY*-$V^-1%ztF(`G20Rtw{jIBuZ}bxQ;F_erRX^CmP~MpR_WvR|!2{#2hy3M01rZ zWBzGo1&yrA@;k@HFiBJZA>pyDb96Y*A|h6OX8(_#&)G_^diI|);QR5}fzO@y?X4-; z!P9+cWz$2O`t(<9QJAJqX!`13eHaKHUHF2hPiTBk4{h5%17*`g<70dM4Nu$9i$%YB z+uvDf)`4lN6&t&`;ADa6gOWp|l-o6Aa?EDyjTBxD`cO~)=mVJU)C-zn_1ougK$ChR zrq|cl0-Fnb57xxGHy^kO!KQzbL?0h;L(_9r-h;>o401--^h>WU@oKeroI2sjOuQ;lsNABrsA0m2im>1)4 z!9|K5aatIxgPC>Wo?`ftHX#tX7s$|UOBYjL)H*?SUK%GcbG0UhQ5uj4*1z#5o-6+v zvj05;tico^JV7@S(#xxmtRG_P*aIh^tl_Thkr7ndKIkzo6pwf9p-`!sdl>!;Ev)KS zf;yG)FHK|(NIIqFuF-PcqdEI{p$&>Z0b;cGyWRWU>oW>mJbHfA zdrWl^xo2wi41&ON<^A;B!#pj+_c&H%^z^^+Hx{6Q$-DQ?9(T~P=AIavn=R+2jecS) zV`AfM^#$r&Avk|kpZ5k{%Ske zPw3(=UeU|B?-#;;aMR$j0bK3DXS^2MR zWzPLSnm%iUcgsJ(`X`U8#`RNcd?VAjG5B_b89{riYaLtwddbahiWbJtD(Y6Dz`WtDF7FZH$7z!fj=Hv8D^^FMX#+Jc%(;4y7wt+Juyt)G9Qn|10J0|*oX0mif?>A8$$ zdh%gBy>yhe$6#stmtBQ?+58uG3e=bqm$jT8np$jcT?j4Lwx#L0R+pYDZ>NX0ZO>p> z_6@eYTizd(KdWCSIt26P-~$63TQIx`3VPepBNsa~{heNWCnWNn4EW1a2VAhWElHoN znC;icy~lR_-s#l=R{7vRfma6a=s&@W;8A?Uo=o$aJeVnM0D+9$vpA@sn>XM5v1!Ab z8|@xA`o6~qgO(mI=UZ{WX*moyNP3uzKSUe|dsha70~UnA(>H1W+Z#$$s<$6b(2%8n z#F2wbE*iGpbva6rs~25j@MeVa98%m^xnUWDHHpmgyu3yb-o%10oSpoKX1u%}M&0oG zHokuIj`8EqR^uDD#Fa)i-Yf8#>l{$QSv=!HPCVO^lO|!A4@$^Sp+m;GM+MG^i@Bfq zKLS# zpAq;MGOqvG|KzfTn4UCDC0^{ch3@=Yufacm=1YxHrocA(+OH0%N(T@5o&#fKxAnqb z<7lOt6Llp2@e^A8Sbpj6{>mNZjp!fyxz9g*?43`%kT)_VBo_EJ`Z;A#cJ^yz%r}q%qeO$X7Rdew4 zobkb&GXMbgIoQygQ#3I2!8sAEJ$uw0JI+6kW^^%$9v5dQFohV|_R5nm z`;tmb$f9LP>88QC>8cRMT~U?l$xeFu=AN?m?UO%XTRV``Vg!q5%s(_Y)yAJeYUTY; z-R2JO@$*kWrY@)fvDrB?u;Gc1)BMCSL!MQ*U{YK7ljL>(R~LR8dc@9u|3|yLCpz(X zGiGqai*V)~Z08R%+VKZTT-aCuV3n5#ohzcweQVJ;h-I#*U}g?rH6m@vmON1f)BMvD zYvV13X6Q^97(181(NrT_RhA`gYnS|ao)TzcAA5*@O*^Lw!$(8aQf^E35K4~ zCvM?L8gAudgrR=05t*|<)#yTig&j*1@W}Z>a`WH0mq#F6wC$zkjQ#p=uU~xME^PHZ zcuTJiX!35bkcKxh=%fDx58cP{-D1A!zRG@croYo-67viAWo>}Q9<{}P+P^ISoa0Pt zlU#ZYpBmhQf>wX}JG}|qd3So{0cfJ>q0!l1I&p13slIPFB|7=&huo&1_ZXxH|0Byk zo0p9t9(2;#Z`u1Hl$tdjl#C(!Fx1JL9pQ#V5s7_i8S}Qe3K$*6K&@sxv8VKJ3{fBk z4ivVeH-(Ia-^G=~l5Z-J>38Oqb>Ir2&t*La2bLK4&p=$XN3egoCSTpg03P3N`T>Wa z%{%eL_qoB8ZBoSCT7*dh|K=Q$k9X=MAY#dplD=_qLYseh#LGjE-?j($&-_rldF&0N zZd!-P^jE)+)>Bv>hU0VRxi^C3XN+L)%zy!Q#^F^j!_aQImIpEQzm!G%H zim=sBPEjFu`B?~9B{Ro<@W;1+ty@<`7~zuxIOOa%(Db;>#T%|!TR|x5=#$INziW=T zW}P_K(T{5E`!E;fKI{Yuf0iI`-n0n?^z){7B6!r0Z;cQHsXjvEJMXy?tf2xnEr!@# zb9wm#qoY=(#;vd))B{GZT8h#28m;i4@kRc`wsqo0$G7Qx;O2SBaKiJ;zUVdo-dNB6 zBZ}1MG~&&G3+K!Oc8wQ&#)>-k85?yRVq?Bz&H4v}p>vf{yyv}pV=-mi-dY8GmC{|! zqQ%}?lq4xWK|MVD{ulq*!`Hw1uWm@MPrma5|L()5|JHy0`UcOM&lUJKR)Dq2nthwb z9{K%$^v`-f5Fne!AI=UK>}1ZLQn1*o!_7b?6jwF6?8WYHb}bfuDS&Q%9+qJofwF2|FoSmv1ehp{NOBC?}2D%IL8!r z#xg-{IONWY@ww+DIMo^a(BvXcME0@rObrHOaJbMr z`4>Vlh;v^6zkk|XUC)19a&F>t?tjv-jiXqonSfpVj&J>k4yTHNAr|Ve0%R@e!KRHmw2!l8F34M16)(~ zV6h3Bf0a9b*8_$%;RZ7Sg43GE z7VMbym}B5@`b2|Ga@|_?kn4u*;Z0mbd&O?PAY1_#RsX^3Xv1-290(3EN(6T1Mp`Y;y7G#)01*-H-0AtrCo z`LV5RqAGKRH9av}^J{&ftN#*=+}B$k`g`jx3TEJECMGl#$7ebyaP=Dy^9L-v&c6!g z$b$>bbsNLoAICLjk#p5csNl3!3qQNA3Kmwv{Yj(JjDOkzf7uA82Gr7(l~ zt#3WN`^#UvX}lTvnV~M)fu*L$S@e*vPV~2d(O5(aJ4UOA+ihYY z3qvU0LNnKVctwv~W6OOKj72KVS#L z`@eV&>Ja;vwB}DpeGyYDit@x53Vzc9CmKBTAouw{`Hup*nm^KU=~`isi*-m-eF*Cx zM(Z}h(Kl!8X1xE5U@9J*?zye?Q*6d(Z9_NwL_s|K6mU0?u!m?JQW_ltu6hXUahC`5*NG^ z->i8T$BjPn(R~#jVEW)K7k1lAXYBrPQOAL=?HMgipDS6M9=af}4j4Rw-xq<(n~3j4 zfyT%7^;aH~<3%EqM4`cNOxi}aJ+a|y`}MoMv5-?5HeOiV;yv`pUnhU@_>h)szh&2F zb_%id8?E~7=9xn_M=jwb(|!X;Vr=*v0#t=_8u~gAiJNbYCw^`W;A1CBeT8+}@sA36 z9I#N3^WqykUd9{&IqW9lPk0m(f5c{dv5`k?k?@8J*XbA}%E+u0{K29ypl zCo{2w+x(G36O%vAbD_d;j)} z25O8xkOUG~=77`yBQMo5Bsm|*B4h6Gfj)d|Mj)XvB$ECX3m@U>DsPD8;9~|6BBmMZ z@)L9S7?m8|C|c9Si;nY(KjRZb>@z>GTBPDwll4ewc~L)ns^5#G9Hu>pxfEFSP=!QP%3)H1@{t{{3Iio^exWTd}XY zW8K{B;kj3IkKtwaSNEFw?m4y|vh<$4z~ww~U&}t!dVt&WW_Ew<8GFnoq-~r*oHcua z%jI6*m^uF^5Ao-mgeUsM1}0EEQo!;QPaFw|>}w*Iw7 z8_&Gv`44@3VHM!ks~F_G&wmF$yv>C;pq&fCpcY{ki?y?O#rOV<4KMOBCnB6V%9u*H z28b(T}{?(ZP!Sd2-jE9C#;Y=hop%&)A+~Ts&Kb;qnM>RUR z%r*KV<&7-(Fdr3TZ7mpJ)^)9O?S(RC*PI&7fjo8|u-)}Z)}LnH3YG&IgWen3xN4ULy1G7DdTko|;Cau!-Yc;v`roPd|CrMPoJBiDC2J{$>90;eVwDr#3pBbolh$026@0Jr!nr4*+pL z`~^LZwv8u;1ZBcHebF8zFt>f6e%z>kxobWP@TA|ox3>%*GJhuAMH*j!7TQqAe`s!W zi8B1WLPK?lvv^dSZvfGYo%v6lvO%f+)}O<0=LBsUo9Q(1@RUXjX~5M__28QSxbhp} z8-y{a14NZPl-&6sZXTHJ#%w07UHw3l4~Igi z{P2zKX=TZuDopZ0=keo-PNeMd$^K4sH~wU$>oI!7UjXZ?4Q$1ggGQCJ8Y!pF}n7e;BpAHVoFEf+xPe(3_{#21haz4kH39`M+C zz=xK%xSg2#!kBpc20JD>$f+s)1fnkh`{(e2P@CYB5*Es@vAipv#VL zVu(2{N<|KxxC-NYYC&MDcrzhc+}j3!M)e=eDL}1JjwFMgJrV=48kIA0ud((rs8nk) zwU6Mw{>L@o)v34GP7N0mwEXbxxv{7>Z-@+YJ=S&;ZMySr%~ldSbJa=Tgjk%gY&$l) z_?q4fgUdM(mG}Pi8xQ~DfBmNqfAzoq>udN%{g3Cb0RG^MzxhTs&&tmg_{*#SYxHd! zd*hpb@^$yR2MF6Ldx>`6QEsN;y6KNH>eWZQ=anCf-HT74wY#vFDjS^L*EwxC7mOzl z=*u>Sdg6W0zjOZ2*B&ty%l>5=bR+FChonivXJOguILbXJAh*{Fx|j6#z) zbJGv$AXR>U{@1RM#TOI0F{9_6W&Gtx)Onv)JUZ`sm%~gfWVp14n(s_!SK-+V&20_HqMiu|8j>u`*)- zmvxd{?(2Uu!~O&F0prx-HT2&ie`k_Fc=e|}v=evwCJ&FGyeJ*?yev>?dKXS)+eh)x zE5{Cc?I{ZMHf=Mw^h=|$TH9k|4%0&u+xF13?V+FQhf$t6qab7Y*T~;*K%0}loz%(H zi^EZ$+(6^my!o~(F=Zn*@9it+o4tWJ`fJDM95TA+-*4`k1HQye-fSp87^zHr!Ws|S z{eVti+p-b^{?WA#lmFz%K_l+Ofu7$ug5d*yqOs<&<4~SMiZh1~lDvq|Z!Ax&6EiOJ z@|!^P#pDe-c3fbS*Tfc4zDU`6#rE8!`_R#Y9etefRv*QLu1rbZzK3sExp^9JqQMV7 z$2b0cO;6;^D?D_YV==Y6-&e#Xf-qB0p|yk;A8BA*^G`lt6IXxBaPn6>{Jc8c(MAx&*@yb9A47{1O1MgPHkn4H_49Qa_&j7MZ;851xyan^a8Y zkuz~s7e!t)dSXVGoZ)m_KiI*g84tuV)MSV~?>Iw&^+&wuc7EWBjh=qW;T;oMw>1RU z*x&_+n)**=pnYM}K9hkB}m3@>Lvw%+xp z_uZ4-!RWMkUPbquKOTTskCz-Co>gbp&kjZb|9hVb$x!pSXV*Wz|A&LRXH<4MXFrD= zFuXNbeKGdF7J?I@zwJw;fRYpXG;;P{Qw&ICJvX_hcYN;u8ShzYHDd4Ch*8d;Iw;o3 zC5Y&%k53yB=E6T`eQ#op#ekn+JIR2e7~;O;54|Yg z@BhuaH3o>SNa5#-J>C z=2Cp_Khy+6pZ|CUWR##guYg8Q%#bwHZP@1J{8#7XkAB+I=O1|3fXB=G7zGNAYu5`y z)_h(x-_cL4%FBEVWmr?gYLatvqwqWb@OWW=4~`}qTpu#y)sW7#-mXM_j1nnl*V0mkOPeYMt36EU@w zYMlCEj*K(<)34t4){u1b;-}Zr^u^o$%sbfgYHY28wTNtc>a;XH7k1l2)3%3JfBNc` zhvr9>|M!04oqzuqwkSH8KrO^A=o8S&lK@c|tsi|xsC#}8AVOHh;2qRqD}!bVRGx#9JhsNQ z9J}awP|(N1?Z*Oi(3m)^@X$p`Akmd~^={Vjac=O$fMOizf1+&cL5!SBU+AWpiFU{) zuXTn!vRrGU2#~2q1sR^Fg4Ms}uQB+ABh~t?&dxt)Y-6u3w7h6lHt6+#o=lrKjrFtEL14l}7KdM8m1D`L{mk83Wj3(=U5w zobFK@eRH7@iMJ08C-mYim>VnzbuEXiH()_E6*%M?j(BcZq9!-Au$jq4wb4{%3 ztAt%|(D-}Q4j_>83J-SU@7}Q@VQUDm7A~p`foja`3wIj8z-BD4K?Q(VAoz+X!hBt z(dXq3jw0vDo++!1GII15jUCQeu>H!nS9i{&>3U!6=a})qy%Nk|aaQ4fJTM^cZOCYz z6D1AB57`KjYn-=}f7!KZ^l%vK71h|GjyFAOtEVt4q#nS(*r?TTRT#jcN6;@V!9h)& z8zx@4-#Asm08&8I?#&z`l7E~QQ$2A*VduTIwD;zGfZDXQUu@2Q{GFR{Y;Yg>`eQv| z>#~XvQ&g~{Ui(WEenC(kGFAmR(T;KJ&AonU+4^y<0gCSEAO9hYn>X6_MX&wTPn)Qz z$s1SjfaXnpNjPoGTzx*}TMJBUQ}z+@C@J{Z}h{%=jLEP$kKuY6=3j^-|9ccYdrE$2Ujx(wbg%p z)i!Ga9?%oBgS@?ve-ti%=+9W&7;BGT5Rlz^XynWds&!^ch6FqO5kkD!2BSt1qrW_~ zm!{8kuYpl7(a>kg?yem_#pi!a{W#n zpvg7A=d{W~Zz1UK^i#iQi~}0|0B>JsUChq>ID~!`zC{-bsbMEiH5S z%R`4;x8J=a7fa~*%*i?4LHdH!8zC>EFVRF(pyjI z#FlZtMUVH%n_8fA)i*cU^*1*jV)deK69+D6=2;@LGU=B_Bwj@RMj$;gc&Kr>2bt_P z&VDl-PV_cc?K1!!n!ax`7#T-DYz7Gh=eV^+*$0F0v}-A}LvI3b+;5UA3TQ;lh1kKM z=OL?kPv3B@kux>p#%Og#;s4`nEFJ0AIZ7SOKhpjdTSetqkaKH6tdl>2TQf>=!X$rE z-TBY3F*k=KVtw=pop${5?eKU8hBk1NBROh1`Qt+s$F41HVWOG(Wip5zz57~G&iqHf z3te7UuCn?TJyfQA;Z0lTQxj7`sc`1(2kh9h-cAe>lrlW#ALPNf|3`+1heq!!dxm}B zS{mP*6LMtLCp$Q?C3$+U$}3B*#Ff`58eji1K$ApO+s;VoN&qXC#YL|UB0!J2!V0!# zMz4+aR#+Liy!#>kmw=!8*`IuP=LbJ|!g?m2EAX9A0oEjI^KD!IH<{U~ZZqE4r@6AL z+}X4Ly4&zFI_|d_N2ll6VIr`3FAUW)lWp2_{eJ#*{|94Ux|nmS{&u$mG#BVYv)8#7 zy61WJ;l9OvKY8@rgCwW4gov5Hne+x~mWm3Oaq!UIvs9s0p&~=Ryrnt1dq$x$zGBlC zIrGvSh}LU^(HNm15P7vu8ijMKfc`mdC;ahOeU5qXjf>uMKX~*LW2oexYM(P34nA22 z)%6ZQ9VeHQXEdWFRIS2DgQlT}+@IK%o)34c6ybIMFBZ0)e?c1SK~;!g;tNTe02*8J z&)EAvYoJAlPH5H=eG8zSza1WoTUf#hwD!~hSG>)dbWNw0NR&pn^N*T2kBl|M%=jFb zo++SN`oXI)vb+L>uQRvc06GowK90E9>eLT%rwtUt%Y^W3N3 zNXA)f+*ou)9O(Pr;PiuUozqtXK0e5;xuWj}kXRE&t71QOU0#t@nxchfEz|Io(1{rz zvL6L$A ze78ch=uOu+k&$y9_JDzxjRXF5gKm9Ui(I5kbD?ScGH>1xLz(cdIQ7$f|k zhFNuH%>jtSp9*DQNOsE{D}|W zfX-!{TIJ0K2I8QNDqwO8j|;%f$2A5PyusH;hBQUUP$16y5JL6S1;-qcTMy32sYS;0 z#)0{*wYEUa4F*`^0oyKb@ztC56$ABoG5-M9v;=-KHt?+#V;J~Ik6(U_-P*T4q_rkk zXahrg;*nD&p};CmA2KpxQcrzEL}M_(oEEUAT;JtVEn4-F@PfPhbe2%{2+f?ZFp|qp zff`FfYGKi-4Q62Og8?|yRx@+1t^kpVo?4-ChbD=Wa+DTldmZM@oBs?z)4x3vksm;D z65sm(G3s{U@mk-NfrHW0CQz7Y=bGW4{^1`#{6|0apFVuwfAHoX8KlbpgZ~mKy zKm4cv_fu!jw{LoK+?yda)@w>nO@Z10M-*;DelCkgEFYfKoOKlo*^zeFOrSGyjWOcVMVC_fvBYq#rUJ)VL&l1GcXRM7b zAi>q=*j*jiiD&#)34PfSO?|oTPW~X71DIaOqOY60g(fD#u?bgQ6#GlI#%ONiyD_L7 zsQ3ukc?eb(QvJ{UzfN!oHS4o}8y|Zt4eb8ds~fg|MS(o6^Y%muJC%9Mm7hMZ%FK{| z-h(G#c`v{5$}9`^is{p~cFm`?UtTpHzas-<^>HN+>>Isu>Ii-2^fBBAkHFoS-vsLKzeDK#Yf`nikqI-8K4+!Ez0UZA=4?w$e_QnNEh3cssd~O(gX~1RN z24fONi$C+{n^5A3pRHFIey9o4dW@^y1keqZ+0$c6T!z|zpA=GtE~}m~N^~$v^3FOT zw>#Ul6Hsx?e>OjMYr8$H7^^!y@pK-E&q&9vM#nVReiIHO0DD8iLi=$y2ylIceR^no z6ElCf*wvJHJndJXfHVp&erA9jF&KP-&P^gbWnp7moiLey%(oYBzU4*4m=|k#F7)?9 zWqqgK(FN51c#YB5cE0e{RxmNU=xU`UTz`OJVQdZjW}75n=;hLDHS)f55)CX>ZIHDX z7nN1&zr9@73r(L!&Z3Mf)c8=Y9~UosfpOPa9d=ETKYG-f-n}Fy(b5_<^=FmgOOC>7 z5Fzqw?@v~U=PF9x1HiQnzZx$ueRH|#MI9g8`p+f8aj}G}4bmur1H1(wX%lxoVSnlG z^6#DBuKmY9_g_AI?43`%o$<5Pa|J%)3a}PglW*Jj?Z5v{ID3X&m(Blp|AfmH%c(Ff z*ps=RvXN|u=pKg0e%>Y=*yvT)?Kx(2J>zdSAs5240n4~w-fr)K)6zS|4Oh2cz&|+eYk4v+{mRIu7gp|JxcQ?Rs9%9M6GC(l8AZQuN_c=r##;qo3E z_fA@Q82A1FSI20h&&yotL((-Xzj35=Mi5}*YCPD|@XKo(nC|OyALzqOG3dG!O>T^u z6L#UA*Ln7n5LF}JUel*|;XZnNnH@(blZT)q1LYcqtH0HdJGJ+v)Qew*)c?eV74yAs zX-x9G)`vo;^7aC(4SwG!G6CPhfN{(VPRS26N(rKZ-Q` z=#{yzIp2frbKljgA4i;bp0BaNr`L$2Q#;7hsL%HIvBDfCWBZL``!Q`?Yw+CToJPMf zO@HDe*v$`YLt@lAPwyHghkJj=FqU)rUH9!>v*@-5f6w_oMn`);`G4rcU-pUb)tUpz zko>zza5BFK2*rD8+EULc)F!`$c_%LH*5=M-4)0|AI{gTxpDdt9DJ;`Suz zo2Q!2Nfz^6RP$rb`q1aqocD$>va>T6L`t+V+daL)l}0)Hd*9%*xf2MDE_!_JCyaaY z5zNK~h_9WmzYv{<_@26*lf1sAB9Gg7`7?jC`i4=x@i z;mcfq9Xh}G*jtH>{q&g!d726kAJ~x4qM6k(6K&S-^)E*@sX~lMAvBJA@xfZ~!xaV|WlFD}Ul{0Va>e zb}+HoH8+kZ`W$(=JJD&h&has?n}`^8oz|{qjfW4Qjz0=UoZN74iB1}q2ti2XwO_xn z9UZx{hGqxc4+C0~=XfMGsMs_FW601r`uw*(!hxLDL>$g%8R8YF43bp*Io!my*0J>* z%^Vsyc`@#DTL!ej(RZaPR&{EGRoV?p9$O1l2OHRo(T}C(9F#>*zxLZ7(0dtdQk$So zE&{nT)!)=+Wf$t*k2Y5M$ZvAloZpEFyS2G@rM)Ci1u?M5=-2V~ z1`yr$)Mv-_0olkL;jT+ce;^%yloIao6{M+9j{ z*1TJXSj8Sc`)?YPW%e@z_u&d04+==_!^z&=dX^X0a7-ZerL1|FKa>+|H~;2Yet5tR zuMRSy#g5p0?U1>GX3nh6J3?hV>Cc;W*Dsm5DEWjrb2+?8&#zCN`j@YW$vvdh6#H2b zB)HPG{fsM&L?5Z~^-CHc>N~X{hMrrBlYcj5V~j}u)B-=m&4|Q2|8dJ#S`PM%X&R>2 zB%DVUp75y-pTG7$>+f$;V5++uEG@o<4~{g?t1Yg?mEVt=t|0vWmQHLo#*-g0;Lx1n zlDwE21GQ*9&?^gr`7d|+sX(utmCKjlQeX9x1L9qG#wX7B^Pd#rKk~~*>)sXTn6CuF zvQotfQ?HKKKmEjT_Sn&#oSa`)DUuR?hW`KWl(Z9&-B@Q&-_PM!d;$O6 z+WYbM*5+*m-c*4v zPu3iLOyTT3YB;^|4K7ybc~whaRzyJ|P{sJXIY!QR4EK%x_O5$${!NK+=|2ZzVL~js z2I`*X$Oyrd#`ku_0RR2BbSbp!K7G%DTDS!8;~&y+*LQ}Ii_)RPxkm=)ckvnp3XIn| zFJceJ)|8!>O2B3WE2S68o^vN5ux>!gGlaN z?i3?%3`4%+lV(&=)9)rpbh2<>Dcbg5(oOycJMVmd`fd5<;54-qwvwK>AG$V6HgogGyXBH z1XRA}=2=XR0kZDiWYc>MU_W2=C0eP$A=DlAkX!=;6i z`>WKrp2o0eK0aqOdP-~U4w%?(#&47tvrt%@d(5?AMx%D|fot0I=zivtKk@SI|J-kW z`QV2?r0TsKKKhBTeEF##`mvXv{R@BPy_mhlzOBF)wF2Mpo4@R!8t|NI+ zG9?D<&~c8&Y>k{`9{;tB06uIK94ScU@U_)}RiOqLMcH4U&X8Z3rU3L0?GQA+(c$kF zMWs_0c%@G*djF3a+E9_}=3fqEtE0!CdWH(}i9?+v{&K=MPyMeO~IOU)=Tp-*^5~C&D9s zBIJ$2dBuqzgyrJ6R#q7NJQDbcM0XQ745j@~(Di`zJK*Zl=;KXn~VeiN7!C!aB$;O)ux%0Bwu|ai842=#&G1z)j zr;puO#%HkLBdhsT(+T5wReAFBjVCq|buIC}zBf;D;zb%j?K2nak&OES$9Qc-VLvz+ ztS=b8EX``m(g(wg5%248Mg-s8KW1rTJ>$-lI^=xl`Oi;95SbqiZtjgfwWQb2tTq28 zu{EFCo9FGPK>Q0ns8XEmw@y7*ql{Br)jQY9#*m&d05QaB8bmpR){q(4?i|7oVlB28 z3w~ZJxBljc=HB90(XBq7{}E3A3xD(HUOxH1e*fL*J&nKncmMP63I7)SwgO-53Vb2w zAm{#PKK*lN|JkdVE5@I`anW-T_u}pax>u;zH2a@d`t7=mBG=PN@N=(7~hK~$S(YtXe*ZZH{v zP3Qf8#^`A*McdRq6H7R~n>yzlxEOhEVXV^(mIy#(d+zz6hE4-W9TtA@p*Y3b800OF zCqRt0ZeY!Jdd6}pg`j!E-w!bcKYn;)&Sj<4a~B)ps;zd8sl)YUfs$MEO79=9h>c_+ zloLIJ+QCcQy@#jj=7BUZ>zi@W+Y?29!k+UWcyKhHpG`F5O44)A%byTEngmFt`Wprv zQDYiHhmh!;sKO*dWd- zBFt+^cf7YAm8!e2@dKFa>wiLPUZL=_>60P#DHSFmwetU{y86F+=Vj5#5;S4 zP!GB2=v}Cc`zfEnT8j^Ve? zf%)_e=6a10Bp#9lV|H9+j7OEurXF1EGxnyDBHhpbJ)aI9vVJSFR#J=*!JcCoH|Gja z5vkP-yn!Jl1T_4&K(Al_f^r;w&E>C*_}k8)^axkf00>GM_q6?R7ytLX8`YR%j}n97 zur3)t)E^wpUkQR%{>V0_a=o6{_#0$>0pqnYr*r;KY+ef)+fN?)ik+(;86Rxyuj!q<#a_flG=@yWv}lw-xvTEAZj3 z{P@c!zT=zT7YlD3zVF}sy)S>`Fa5t>6TO~u#c_SG1$kZ3&joY4%#dC!Hqn9FBO~th z_XfY$cKYt|)fUEH6hxf!;k&U6NB8C7no!1>A*u;UZ3dUl(H)N?gputt58H~rR*o3C zMpwUhBgLFObN5h$QhE>qcfM^t>tyC$r&Gu~18~Q6UaUUV7T?V)6=Mqj^w_-OzmQU3 zfRkIi-KS!BhG>J@KF@JQ$tdwUEK7SiwgR5uN#ZLZ-fy^IjVr=-h91+u= zBT%CA`DY-+PW}5#5rVsZrE4dhzX>diFns0^J-PV4J+i1K*hP z+3KnPZnm|8DXk=AbmENRp2HK4T#Q+NBXZK%@PiLH8vn!%#&@~(li9jE<(EPG@`B+d z=iGqEw+-}gJ2Ybb5|pzBbHfk0mf^`a5b(C8Zs8PH)O>UuZ125fi0L9Sk?%Uk)pYqq zb^RjsJJ!~zt~nkquBwh7*uhg$($|KiRAJUIpbH$U}PUq1CGf9U0x|HI#XT)vmV`+WoU zUVOa8zOBF)y8@i^Kl`blywT=*m}`xjrymA$jkp&CmVKM%b;i_L4?@^DuB*CssAuoE zu5E0C9l1onPaO^e*!vFZ z=BCy+V}1VVoD>=(^Gy0(rIPp$h%fgk_NTfK13%Tkuw(d`N1|ZBk@;M}eUEimu*mCR zEYZo4iTi#ij5DxON1$wcGKNBNb-wAu56?~9|LDj5d|(hYcHONZkp-sH%zX2Y6b`KD zAK+C)6At4JApU!Ap?27kkCr}PTor>eErjH~=RtWIQ{x}o6UB49_%0Q__X!}H)waj@ z896x+8&lifXLzogJkS-__#o5<;ToD3Qv}IDN4NYTA3viyrZu_cJ$1kY7uv0#7-N6M z7RB&ZT;HreNp3BTOX&D1i}7#%o@=FpYFas(*UHip#KtsJf<4?n=G&h$Z!pDma^i{5cw~7s z8+7=6Ej~JZY0D|s)6P$~;-+b=KS-Jz?-M<{&HuA6AN}Y@&3W_w$Vb0y80Q9!6Ks_d zkA}wN#!>2EA`h;=c63}+j!Oul_mvC%x-`+DZ2TGM%WGcWxwye&o7TQ_$J&A>uIgJi zCYl(llfeA9)hK|+md%BmJbO72NC#VX09ak0IP#P4dXW@)-*^Udxr(ed@c2>i)Rk{A+7VC2MG%XK;=~I#KYY9X#2v)uMlTK2Br|NK zZY+$^h)vIe8Xrvf%$$b>f31FkDHn7S6S02a(zmfr{S%X(n+_fT^`)YshE{><5eKN7 z^|fMML*-qlH@C)(ur`}Nm235CT{!`YV?KADT&7&0rG)BKw$fGHNF2lEGexdjEwXX&)%~E5vY&vv2}ISnubzC}|FW;@ zG6(Pf*#nu=P9GnBK*8QOFS>!b8#a%qV`pp-4A$B*zw?H?YS2}PTc_Y@Q6XZ_YM$9I z*)wmRHn#$2S6+T7q_2lKeF5Mjva{oe_5ggL*+jk+*T z!)~%H1_kHx2A}!ne<3^SIYO<1pEnjKH)zI3b8q$f{s%=?ARTpNz?VPZBYj%rd|+_S ze}Tv*3iRM&OYivBkBUw|#L7%|k zeMNBm&v-HSqI)u`hj`i!x8K+%p3P*o$=~Xtj)T3=-rLGwlT)sSQW2`JV zuXBpT4(mn&_c+v1=Rf_EKlSphzvA0oKK}8Kzx>5de)8o{{cnH569Z2F{ZCwB#~04; zzdCzDftJa-N)MWAmW`%+4iXx`95Xf79K4ZEY}!P*=rWBNd^nm7hG941UMLtDM{p-s zh;T_SY5n6Imx$^=1IDvKpi>^g%^vb@pv5)^NT&Wl9#@KC$0iJkSv(TNu+ry6I`k}6 z^I?nt+^spsu3R|Vbv}6;K!B5n9LQ)mJmXGr;-+l?BQr3@4Z!#(nAWHAnq*8o@Eh~x zK=VxLONAY0DmA(C?hQ`W$samf?8}`QJainUS+9xB4lua`VoaBw>54FQO|8-7Kb)=S z*k6-F1cYZ#pC6rm>8VeHW%SNCA3jqLghX3l>MPW}LrkNlW> zQURF!i8Ehr`s1T9040V9(>NEl5i@JGRJs7TkR9$k05H|3uK1hj{Tg$xicX){u5*V( zxw08&DsPVWa}n73I%6G%A+>pwK-f3KuoW4%VYhqMA*Ben(1q*lHE`O|4HEUzkg&&F2k;RuP>UhH}` zDnI-2VDEbaTe80Da1fC(4;}YKV}v?Fx9I2!p8>J+8k*8Dp+u9ZQZ zm;2+m@pcyy-l*T3?jyU48F&97DB9QvuH+Rl(1CZ)#42Cx^MEccu= zH!w7`#s^<@@a-)x67LH*VGLK@UE_^OHA)wWzMcuqup-)8qFg)U2?l;xIdl}CDeihk z<$Vi1egN}oK%J~Sy+fU&sz8%C?EQ}!x}lmHDs54!-f?>UCYe6}u9GDp*2=srGK7nB zg%23^O{wQg50LHP{1|Cv*$GU zIJ)lti7qDtzBzBrKiK6hAJ!O>e_H(5=YU+SbA-gWR^`+Jb&M_XBE zpZ~a6dS0GW(`yOoF5-Q>1%9G`#{xa!ztHJJ{6n^38uy-I(Q(SsHuRqGie|xcAw>C^ z&;0z$5B|WPdHFwn;7`B&&=3BgKMB?}=GMnM^6^q3Gzo?;T{^12v(a~2{~N>-HwXXNQMZ009~MUs(-<`s27A+B z94>AaqnB?s(hdLk0tPb~^FHU?p}|}3I_(V_?&|5q(&q(sROVgZT?hEq zE+eLCS~y)hdTt!eh5QGb4q0&%6?F2&vb>LQb;WHL6o4EL#H?a|^ths~8K{UiOS zPqlk{d|QDp%?kYB@Bf1@fBnZk)suhr1K;#6f8G(h|CdgbKt}F=>@ihh>{xp@2B4C*AKdP9*ntHCR~@GYXH$tV`=2FR zJ=<9wlv;uu+>@e;EqlxEN888BrfEjdwRLoCo&Z*(^aBsx?^wj=V|@Y{;;qU|$5-QH zqI{I*zqhHq{{xC__kS?0TaDJQr2?A<=H8P^e`v&Ll|ov=4n3kZ^>aW%eyGRxVN`!I zCuZwx?E{K%X^81qGfgGB181T%CRAFDThwO4#jmuPIjHOYcI=Xo_;(KU_Ke_~X& z&p((TccTCc`C~il4_~7UuhBjNzeuyCre7~Bdp9l?tNrB9_@oBu*6==lHFe!>uAZas zGXJMP0(kj@aeW_uuL$&e9qvI!`ZVprMtBmuEFEp~TNqD-F983Jd`|&BP2X4ko_G+Y z(e1sQIr;1b+4bRMpHr1hRJ+X6gQeWwWW58zQ2D{l4WgT3Hp}P_K4WlRKWre;;)_q$ zTK_2VXOYtd%oO4AA3@;q7L0xZYY+(9FwRR?B|82aQ+c@9iAFy;&UV}RIO7CX9$?=X z)&i^3f*}OMAAjh`V$p~hZ%-NhDJZ-M@k4>|%M>K*(CN( z;pAB5*~sDNm4oKNY7^Nj>jf$xa9!Wd4JG`$Ikpy0`NT-xI?I@ugc}+WL{LrFLc|25 zsxfw`(wI4v{K(GwM6T-i2a;G${U!&bxKFDsag3m1kHm$z_KkQHb#%i%45e!AkZ=9h z=iSw&LVtoH3$ED->Ewsu$hIe{d-P&w{RIbq)+&T>x*v#%WnA_ACxFr$3*&=lT&1=- ze-9>N#v2yn>-x)N;_IlKYm4kOe9dI_`aFOP4j_Xa-}Q`RynEGRw*DXd@CRT1>HqTI zfBE>=ea*Ag+xgoHe92Vc(?9vwUjFBQ{Xcs7+%NKEaJ&8)bLsTpwSO+&z39%B9Wd8e z+tBDauC}+$SFQY49`9b zlo0MEAI?mTF+Do`+#m-}wCMaJg6Z|4Z9~v@{8on_tlGcMKeAS#d+%Z-XOcj$<^U&c z>+gg(qGJhZ^?UWixj!=7gu?-x82z!<$U`pn^Z zs6TRqC^O#JGZZ{x)rd&UUp+T2P_L=eF}l`WURd%?Oc!B>CZ|VZn2Vs88yD_rtp(hz z*RKES%o)2hU18uLv1iQv&u69q^aF-E+R%(9*yCQd9(KJKt5hE&nd`Uo_-Y-PyPiIu zHKfWeKO4I>iuYar6E7V2q6Nf<@t^aL=vA~~2*Gbcx@?1`6p^Vfh3Ci6J*+>NR++vz ztR0e*!6mF{Rrm_Zf3|}R7Gw$FTJy@#c0HMQUBMI|OYK3W-6oq0{i;^Re8+Fn_q+fI zx*e`&da^w3S9t`QT?Y&oGd#EH>+`v+-#OkJmf<_)_fC2eeflGS^>EMcK7J;AE*Xn< zEpTfAbAimo&qh(AUhtck^^pZVzGg!r zDI9Nd)3>`WO7#2dbdlCC7btH~o|`d7xP6BDk6-gbb<>eE^)Uwe86&ff5!p62{Sr`l z)=$`j$GD9+ZSZ8^`6zkDm~%+8t{YfH)JD$Kv`hb$dekSpY^Y4 z?U#Rxq3ft@HE$mA$v*+T+JcPO^`MS4H}{M;4Q1LE&^4QUB0{>@)}c7;tPOf!rvj)> z+x4Sw3^GQa>@w{6-#Tc-x+pjM3lpX1)vSeqaw}YCP9(SKQ>W#J;q*N5r{~x)dj$~(mI6Hf1gtX^ZbWzS8&h@;1pqM?2 zR;JlkGA9%;1ar0pfRP)Is^Itj35WOg+7x$>wLC)!lkq!XJOleU#K%4>=x>4P(SkE( z4c0oy4BfXfG~Hv2F3L?NWAAHo1K&GFdtj;2Bz?J?uq)ma81qYwwY73d% zm~76TQ8*j{b_`ttIasp@hRortk0Jufi;e?ST>s`XHmcC!e}L4Ue6Htz<|@zmg`M$8 z&;tl7102!x`ilgeF`%PKK$g|j9@~s0sD#QoD$zLyLtmI=!31=z|2mH_xzISrHU z%dz>(iLKWCb^8XhCu)Pa2e{)m`kSCO##iuB zC|f}KjR4Ur_$XI)Ol}6Nqo;jA`Go*R9cVn9krPtW3jRAD*fBI8;L#WSiF_6P>aM9R!SdZI1 z*{dj&*mhIa)bO~Z(epJSF<=}8euTOCAyjqC9}KVIi4!3P5%?6udd1XF9Mj_s9C>Sr zPm_ZzxDt<{A4d zO$-q!qYosp8gAtDG$3cJ!PG+S=nj7C-X34N7%ohvLiK}SZP(GpzW&i$@A;6zJjO6= zu4Uq)o=U+>yRj6rd67ct#zC--=I{Zo4eqbhEk=gLn8-0kaB8Z!rCk#A)Aoa(M4*I- z`cSio_SI%Q{wggIM^nonVa5MApboBOI^u;SFVvp5sL@B}LlipA=O;o=AWUOS3z*vY zyntOqsP=VcOK?1&^Wh8Iwe{|@5`8) zdM0o(j&uN<)feY$`0Nh-&WvDv;rUf+ONt*;DzFKvHL&Q&2_DC zsc^9b!bSs}=5;i~*?YWRH7vd)!R&=OxLQ>%UF1tEM^r$O>1OOFswld*7*noc_g_hu zrF+xkPh{C|$iV~OiNdY`!+MN(VxI<7RSq>LhOUzWFeWs7;)uG&#N7PHCSs$5 zxDW+1UCP_~PX#Ov26@FF=Qig8F~QH;$~fnGi&0zc@q>oSbQxe$ny|nHP?PaBro1!aI#CSe}+HoO_X|m2!a+F;s#Kg5jD0& z6Xjzwl-OB+DKh5kq0ZQF4&@kmZR&Eu*IqgL4tnFr_~hj{5l{y(8BWOc@BFG~5NVQi zXj~)Ho@_$Kx>&FEUGm;!>VF-ztT@7V4pV2l@lRaxfe{!txT53cXT!(U#(g;>Mhnt@ z2bmolrpV9wCx4v-Dj#t$iNCv3WH*3K3ZBFr9N8 zJ1usBPz8V(+ZF3EA!1Ky&TssTy(ApQpyySvrnR{ZN|%r^_kf{T=~UsQG3?%f;G|@qhmQuYCErpZb|3$Th+>#5LZr*Jxy3FNl!aGftZ^ z*X=g0#l2it>V5#=rmUxk1`O58y#6!q&Vptm>YgET!PzLh{^#MGn6QVo_usKWhKE}W zAwCVdD}WJq6Dl8~aGp0L#N>UgZ}VFMo$6a}?ys%ln2(R(Zf#S!iS#9BlvASKFWA=s za^IVr_c^1A=1;8hrr-Ln*YZtWj#IQ7$&ObUY|BPRDe-#UM;h$++`BB`?zyNe2lH_K>qk!FGyveR+~yTkpK&zm9p-R&eM6ZU!6B98 z;xUc*VCAa>Hsk4x4Q*_<{wG(TYg#AFGzpH|ci+oqlCjT67=N>cR(dQM%Lby)g06vLc^#`kU2HR#%U1$Ayj{_<8QgBcNasGEKO+1Jz zh#>H3clx`Gar1A#x|O{fy}23-=(HU_`Q12#j86P3hbMw32g|cP4&6_63>h_9j`x@U zhd%se@BWVfQY_u3pP@yq^eQYkvA6yqw^NkE5{f=3ZoeG&es%P|G{;G&#-Ys7iETM7 zRrJR_up7QsZ$6q6Cb3zwm0`u0^-#~wl7YW2mmXO$fX?J$tQ|HrjSYhv-+1LD@Q-@| z6hO!L)`)}MJ#Bd%$EFYYH+-|A48xaz}Ic9Oqz+=yzNZGaD|W>|ZktPEKMgr{&jn@>{#~d zolFRB?+~UfYR2Oa;8_Q9VV=%Y4=W~AU1N&xCRTnlg+9HWRPAC)nft+gDug5(s1aYXu1p-;nhni#r~8!Mu^XGDBjYja{% zzB=@6*5CbKs>X5RA%@hjH29Fy1q5zi&bGe}Qq>_@`dx zg4xi>!TNyX{NArM#$PrG<-%h{s7S=?65I&@2#S>Y+$|rk#`Nu-b3btH)#Cj zTO2WmigOYuD!EHJPAk_Vrp7xlGLJ%AbG)y6r10cxW79Q0p$e+bufM+ z_Ps~&rD@LkAdfLC`WD{?iXAb-nFa@Q8ce4aW>ww(HVe;0`i#NmRId7Cms7KCg)@MpK zLMDK?UmuLc0%eYJsma340Zoyczn zI19JVmaDcCK+}&!U5zgDYyHbzl19DQ<49`!FaVQQ5Q8&C0vI~UTf7cPU8|fZTAZHvFi8XdST}cc5L{6w*A3Du1UTiW52nRdbuLYH<#;O>wbca zJ^gS<94sE$fBGYGX8M4@5t7T(*{8VA-uDzaKx)XKEmQc2n09ejt@j-2y-|xFnyo{v zhn+m!3yDF}^6Fsy*JAzcBg4H;z%P4dwm*fF+_@7TNhjE{dEWxj+5*Btn8 zX(0M!efv|>xWr}yjeNY?x2{*5R%jrNv-g&B|I`1SgOq}t^=Af0&&U4U{_d~tWA7SN zgN!MQXucVq^`3k;d_04a$8oT@kLaGiOn^1uz%w6b39Xr32FL_X?U*mBwK4x-8cwjw ztMlUT$46ZJ&H0AmW4x`e5kdP(zV+4X4E=b?fFW}Ep4K1Ka^Z8cnM-a&cukWthkjcf z@y1;Bsh$DgyEQCB$GfHkSxSz)#*e--9yoC;3WU9YQ%JjtFD0Wb+Fdu}RXy^B>yT{> zBY4FC{=D9#j(kn(@`>*lPeLc>A$-y=*PG*=#NK81&U{bt#vtq2OROPxIa`4&gmJgu zB5vQ9Hc|S#oK8HMejJ+?aNhKu(U0dw87qGjJM46_c6M*F_L_@mM>=h z@bgN|xM&h6v9f9KVtoEvE+*5+nSZ<0ugQ}u4G8a!{0@ijl&W9z5eYqf8SpFcd*MSv zmVEKeCfKECt~4^de^w1Q4O%yEc!DDxWvb>NS;oU5fGJ$G$P*y{6%8*?egY0Ie$Uxv z{<^3i^%BS>Q#j2vd6D~mlD>VY%NISlv&E+)gyQXUpq0Q5fYN|@c)^Er)^F_Tx~Z{A zGnwYoK*sRts4)QP`j0O9-JlbAgf$t@`srFtt+^`4#$e=+Y!;j8h)xfueseT;49Tek zch>y3458`15}SN4EB)?!`%HkomJIT$;Pk$)L+q2{sBR6H+Usa zC}}qw&rmD6o~IOfAWi}$R&%FEl-JpBhL6}8Zts2TyfMUr2B2d+YdVC^PmqJ%^%<|; zL7>QsXE$TmUR%5yvj0xrRcql|gP}Ey9Il_}?r-;ndur9Y6$V$%j^n(!6G#1Vyw<;W z0j#K-Im(g)!R6o`03G9&qq+l@@!+*H@5mG12NU?7d-Tv^ij^&#t{GGKV{@%nA-Wp9 zwwi`vC_rJ#I-Y0W2^L6kbFbr`msiiHM&UB&`EO%7^^Afgu?F_76aL7cO%I8?R$@m- z9zOfd1#q3W)UtNwKA+MUa>To?Qz(7$3}yMz?|C`r6LFY-dY=FK448q~`f0o!`&+;k zg*lp7lfTn4=?kXB*>QPm5a6z*xiSwF8fu0GqP#r!J$YHL2vopQR&8?7j+)Fl4FWh8 z%Y_4F3adv=+ZgHZW0fApNXBcWkyg`{tM#sPdt#(*-`OMI6=<|knd|h;dt@~}TyV-8 z?DiAT2Bw9jgIdm#tc=+`=li%wjxn^+H~+_f0stG9Z}70r-k>h`dpN$rm+UQ+Re*>< z4d}J3*aJQB%=lE|*up{k{CpDWF1UMeHGUAiMt#)|KjU&2{-iWqbptL7F&o~A@PN^m zXnDrGnMKXOH&^2l(bYJi3mTT>(2*F2V;BLOa~~RIiqgghQ2YhRBq~m>*&;tIv)9u)t#i&$qkl` zIO_H19W=}oP2 z432+!VxX`cOtdnRUuw^t!c7{C8eXqk@Nm(zNTaQ_jZF#2$Z`g4~C)BAffVT%XKK z+c=A@3)e4zV?!Vi(|hPdpP3UM5~X5U^Kv0%tP=CIt8Q4(0C%*KiV^13fI2R0)Qxek z%vF_t2#d_|np2TCwj}+*{7Uq%|9AhDmydk;+n@fwu}*IlUvd@rs&D>fFMs}j{A0fH zCpq?3t`zS#^Jc(Jp&JK?d8JG1E-=!l3M+?4FYfMD?k(Lhw8RPad;QbPF3(EwGHn3m zDHaW4_nTPD7QxxaG-bD#J@1K@eGIJB>Ai1>LC8%g{csdC(|S7F)P1`uSL`;>HA%mJ z_n@NZn5Itn+!)sXhQU0%))|@i?)2OgXxM4XWO*10uH9g^@+bem_C6x~mGy^%hW}WH z2P*9|IQOHJO?#BIQ%5{%fiN%lHi`_lDPH68nW?MDeJ_i>>!vn3{jEK{f@rm?C&bz@ z*oK=!!nii5FD&cCxd60ZnDL?rYeKKvDEb^R>oj%)r%ThiqaD%{OGxld>-`qAL3-q4 z1Jswl)Y0Kr2a+ArxAl(z?hMDvsw_Z*slmpzJ$yIyEA?I~dK%c3IagY<4s!xJ7=!0A;?0TS z5Z+Iij%!ab3wb@?Qq`w~j{!a{ldC8 zftj?!?-emaz>0EctH1gx7vt#Se?nu}7C9;aUdYQu-!u-tHs%oB+GA@&u)_4>T1VxG z#6`xFg8^06{Q1D-%C6XBG#<9r6Eh%q+~w12q_DA&+xUSQ>&?3#f&f68UW;I2?iyM8 z)=gO%<3oV>wQ8>@hs?%_zO7+w_+HzLiJJ~=|Cr3^kxGaG-$o5`X&v_fP!^9@9K_HM zqAG)<_N>33;@3=HUcYmlcmENcYjLihU@ar@^Ii2+?H10&A}C_>$B!>EQRsOkp9kXX z0}}~?VLj-1c&QPFw8=w6B_=>z8_jTtm7ftj6ZD#4LPNZ^;xa>)ItgK;SuD_uzxf~g zbuS7od1@b`=9*7-+x^bULUz&yaro}?jel5xJHOcE}px{Ymz+% zA=eofTCVZAZk1^rOVsE|ctMQ8Hwd?q z+LX0NZy3;}L0%hr;-1uusUJ#*7|wk44I=?-X>QImickmT34Eq!Fh-I^x$^K5^oVN| zo%f@0M2u{`tb={y?62g{71 zCm`KMt%Xu*5%k!po#A5qgYLWrdx+b@(7;HV2WMY*jcVTs_{q>F*!YJ|v zTu%RcZn&=hm4P?rR{GdykZ*jhdj$6}F>Ia(g&)qbwAQ5Sq5yyU{2Ku^=d&cT@Pmun(i zi_r?FeSrUC}M&Q^Y6w*Xy7Cy(9lC1_^6j zJ_q|g=Fjxc6mN_#F%ZTHCPZLQeR2VNiU%aeK)u+pLJm5ID+U;mZa=_ug3#SA=3YYJ z+ny|A0uQa4HC?&Bxxm@9dkqFVzQ^{8@A9*;lxJhz9&bbzyzW;{ANk14Ihcz-T6M%r z8-FX@-c*`-`HMbr?^N>;!Z}nM&;2(fpmhTUx;~Zz)7W}rTaJ+F-3=P@ae%ED4vh6h#>kE^!_%S@8W0fkUsq^U9`w_ob(TAt`ph}E&XMJ% zYb%ZFq$U3@*XGCQWP{sS++ly>TAxkgkjPWUk!M!0AGg`*;cS{~D#4XwMOE~d)!Yl+Ij&r!nlpn)O2PW+q zT4|5#X6sRZS5;&+&fuq)F9+$BIT}y!UIsEnZQX&b3Rv3l-|2N+%1iPzdJ`b>o1b6$ zYrf;`DFX~r+@vEpL+Sj|Mq_p5W%+dzX8kCeD)2cAq=L~DE=IS-W&MH7R^-i zEkOE)4Wi=_2;B4By%$8l$_j_BEpqOS*Z!Z0J__tQ?EV(n_z&t8Kf`#|4%_pFld*Nc z4r}=Le{*Nos!ZNnBJO9JRMRb!e6c?j4`uZVl~;esqgTWsyqW%({D?qf8Tj>k+REJxyqGKi9|DR(td{ zTw(h79oNSFd_HaHCx7#}+24op-Rj4;aZo1$&Fh@pnK2y=qot$=t*o81Q~V8Ljp?;; zAoe<+qluU>=$Etn%o)|U=XOp2=+^~^LKYMBxFJXDbOMgyDBEp3+t0P5RV)(_>r`LM zpWbpcE(_Gd6%+>K7E zHt5apDgND@?kCR!Pwdnk`*=5iCfxYCpxDjnVK2{9hI?`E#ajEWv-aoY82%fl`bYP1 zn1q%@hfjyq(bK-r{P*EMJW}mX{X*RjVErYc=(0)TGG{h#vIOTqxU{VkpBnBbXbp8Q zj&7wsYR0CsJ(ezP8KBfryKqmY`r+=a&q9>dZq{t$45AJV_|oxX>;Pj zb~A|wV>YH32vXwMb^k!Fc6O&kO3nDU;r?3F*&K*4ir6;n#40*I8Bj+gaN7{_Z<~;f zh;Cw15?%A2T*lV$0Az4C)rJFheBzusZWQ7gNaUGS&~-La4Z9xbjBEI{%b1>TLJo#r z(~+O+BjS!*qjd|mZatPuLJZ*AGYlsR^b<{5=89Ou49GFP^{ck)j4pZefY4aSDSQb8 z8&2)dX3T%9C{KV9McuxBy8is+g8vt`IfIG`=jYsjYKTzPi5K?-Yzu zz{|}HD(rjibc~D~@W+{+EW~}oKlq*R`OW{QfAX)r{BS-1`0Qu)-zyF``NspPH7+UZ z0=JASLr&ZIeH_{5e^)OTJ#rtkdpR<*=|7{Z9wG@0QhU#UGY(kD;xv})mBT>bS`%xv z@`;Nzl^%kOi^c1VBk9>%fVE*r+sP6yceQiu`OE~)t0k^FoBXdh!Hi0yzxpGeeEHVj z^6THzZ?o{h*Ejw{-}UknfAWXoCv2X$z5b1Z+g$cUPHMy7TO&||?2(E34EEm8bwhtu zNfYRfZK{Uf2)0by?|S2DAoaN}6|(;)s5md)9U~^xQ*qBJ7LdI>LQk&-U=lw6kk|Mj zH21vpoU_>YljeB9HKw1-PjPcF=iMKB+Nwn*U!ZLf^qw>MDs2$0Tm2v=j!P|(zAEH6 zvJv=$ha3mHv;Z$Zs@Ezbq1AY2(jb&F`Rw=iFodh0LZbN=^4jK zPnGC~hMTivV)092>G!@j6a8Pl8Ew5|Lu_&~7FGPLj|n1XT}o(&kLI6scl{^g*p)71 z-s3fn4bm-QhMAI^v_i7qa!*a7iKx0v<;o#L$LJUzK`5JVM58bQ;&;=-SjAz0>2vce zTFvNn7JjDK^Zb|Ih0U-*K^G4R9vuBSKXt`@H(1uEH+21X{fQkV_JMGYr02!@bN=9l z+%gnPjQ~(Sf1?L1fY=t)^{-hp;IIuDw$?&?gx0ruPrhiomtZlx_-kU-5nP%dUZP?G z@5w*3DS*F06uEjL2*-8(@4h$BKcO&J>X?{}m%zOy#-DB)y)GjbSGD{tTs?w$XcpB# zD+VUPOuNXF|AS>G)O_lo;1sq2ls@rIJi7|bCKhX}AEtG_`@k#VQHwy19*P7!^w+u` z!Q?jl4f=Kr*~8xeFwn7a47p?+UiX4*y)k~Opt_a4Mi2QGp^ifL1@Jxj+lMB4$I)+p z#eMnH^%t1Gf8+#8X?JlrQ7F$|+;a-x&`kq8TSVr_z@~ZgGpLR$<+yo_L|-HKln57j zaDhkc4TO;=5R!R;VKyi3RWG>k$%R|&gml$!;wl4LaKq=0lyNYHp*svEZh#qI8>kG2 z7g*|KUEI#bgKi+-f!uxbvoVl2Z!wg{~bxxQ# zn|AWg`EOiMP}_dthtakEv0L*AHKm218|MJGvM40!wgUlFHXZOGK`zBy3NGO(A za5J1C-CUvp4Nl$ELvGwLr{BCX_naS{V|?R?7&Bh{F+E(3lq7Dt<*<^W%o9)=hgmR_HRu9U`Kg@V)80a9% z_c#37zqj~zdE}o0{Mi5c{i%KSKhBd4a5>2Z;RZUqMiSk|(3on-tgS2pL#_^s_43;{|!V z7+8k3`m1+h12?YeGw*G&YpT5n!YXI|*G|=@KD;?{hC^e0tWBfGRyz*39`i(nN}oe9 zaj#wafcbiCOQdxU;41T3PTq|q{5YKFpE@7Dm~^Fx*r&MoZ%n?y)$?Gb(?EaCD1IX{ zc6v^s*iifCh>?Z_F(zbF8An2`cP3Mj$O?fcFXv;gVjt!Mld6ozUefwtC}`IIJapC2 z+FP^RoJfetW8_e@?Fb#MvF)>ads8xQbB?{}HN}R4Z3-Duue1W=B_A}XPTR>F z@PvqJ!flWk7hjs?ApV@dyWXy)u&jY58QDDQxxbe#x z*JnWuBcGlH>A%(^=J+5Uev816BkKl&l7^8$$K7y{V;A}Q%doL=NpgM=xDKyAQ#@C? z8%O=LCX6AX?+kSQ_8$cX_7cG25;%$zdr7|7f#S!Z6oj)1gYeMrD! zd}>n;LSfxqH`MxVJXEC?mG_*%&Hxys1v7k}BMBUTrr4mx6uNbGW(MN)5^M6Lczzp5 zfv#tD_^8e3$2Sz%vi>w^PTR32&8hlU#Pu-I$qPJ-s;n#<8@|uFOx$!ll(=T&nDHcH zCs}?n;5wT?$q!einDm1ya>agy==!B>)*p$G@kQNT>#RHW>N%n}py6YU#^&ThIJ_dK z<3Mb#DMG%rsgmJT4?$YjuVdkuObbtZcHP!dRr+$65$ADTBz z@WZRucWpK3VYuvaaOWD@a$LC|cfpn0Ugy=h_FnSb2*7Av|HPzdjL{ny!STJTZDyV2 zAzRoofuFW=r?DST_VPv{{Fr3m$)>Zz((?~p4P57q71=cXt$!Z=)7dDB}!k} zXbxU|Y|wMW-0Po=S=TCE+Ac4p+HC1;I#>h+^cm>f!_?Z0Cum~978v8; z#=PfACJ0JWKJ-Zv#?SJr5m?e`zgV=i^oe20rX6&mv;l+Q!jn^HIfmG^tONZx#5S)* zGC_V~mH<#%X&kcuU(bI-qAg@w%exK!QSJJ3T{oX={nyXb5>FAziXMAP5wV%ka!= zLPfK2W?bC%trs#d;zG5(wD9V;{8H$vqpmBV5|_Z!52BqUkTabgYD@raK$5?vzvo(~ zSFY$@r!V1R9JE4%lP@jT-<_VV9iJ``lX9Fxz9r}E{f$zpF@Z^}P8YfFVQ?k1XC=V7Me z8xI?4V&P=J$An)m#0|B91lxsdY0EPzEcDHP>{iz3g}@&*@dz#sJYU>sxb}=e;_CH} zMU?xd)Nq2~Yd5F$3$?iq2mab(#haK+jO+NA@S^_UhX#uSeHQDK`84Xstkl?)b$k5t z->nckW4>s}G}0K7$lb`nHMU|d{%(Y|KSy|3t5CSPHIRv?F6swBysNK`9QrStp^dQT zM}41Te39?CNER4R7dvt*9XN=Zv-$JpXY#^?HO8VG8h0!|aSmqUMPLo_pp(G0CmuZa zoDz;E_KgK@Y%|YL8z%kuJ#%72ULFUiUH>5oMtd1WfbIYV-ZO0!J#t>rl*iYu9okjs zSM$VxeAfTY$GDlS+1SHBDmv_aK+|DkA_mtR8F8u`9Z+rRbZ~lhK>)myK?hpKtm%sc2fA$8Jt@8}|qo;fQ zNXEo9Gv;QoO!QV=!NwaIxkP83Gitu!+qyw4IS*gKJ0^m1SW_VR;=9*KhG+lRtOo*^ z^$*l$Ojs`mBsO~TicYRf5izIp{NoI1>)K&~5}1e4PFyH4PLJ9)GFaJC)uT{9{sX?Q zKa?Y9NW)dS=57R8v`A(MM0*CWw1R5SG0p2(iE*-Gk#-6ti)FK zD->kOMV}r}2{g9GC+OHBs~o=7VRfCGy$f#bmJ$4|B_?@7alii)k6gsFb*8tC&CC?X zzUo*F7kLsHFYE7G9Z5AR$pw(kjyo)opZkCG8v#AnVt;as??}RBmRW0_Z;(mv5q)R% z!??A<34D7^F}4K)$8zfcKeTj=tkI0bsU+sX;b#1L4QvSDGG29UYg66=kl**e_0jvw zm0vAoOEk@g=SEw^6HVv0BhMLx%6@mPf9A&D`U@b3&55WpZk%&2Jg6g^{pkb{y?giu zG%<8vAO--pC^Mxx#Nmey@sIoUy7$CBC-H0)rF9ODFV_FWKya|3lQlgKW@ZicK70A) z4Y9o8hFWV(XvF29{?rnKyr>!Hg_{_+qnGI5GO!6ZDv-2tA^&{qKMsN>qr{8(xK05G zGp)k=9;_Hun)TusFf~)AVRDm;{Ihp<5;bFYWvLO@159bulYeqxL&Aqj5xYJkPA5WH zFu>Mi*jCV55=&!*p)y7^3@?IL@wHvP3yaNgh2r9W!kf1M@$#%}?Gr=o3sF7j=lG8J z3^w-0^NfErpNaX{zncFCKK7O0+OsYof}zeElow(q*Md9;aG2la;4y%BirvZx;Bk6X zK+;}~?~)bqd|d7~5kQ*Po75==MSV~C2Vctd-I$2|q3!$>Jc54P8&VEk)L1&6YK^U? zxe)2M-D!_ejP=jq?hiW*(zBoY4Gk~jof_@a^vA) z3s8aGnBo&`zJ1snu7~hrh1mK4eehEq$6bvnKtzxZcz8ntQz6(ytqQ35FEEOF)j})4 z_crsrsOmoeVes5Ic8Gn(`X!OMAM1*Z7PG`nE%ru?38`G`gJfEYC=Nq>*l>`+hL9n# z-Q!&UtvMXQJm>EM8Hjw+-+k2Cov(0m#tY5!BG}zquKXi3+b znrq>hS~a$=Ke_>#L%>WgN0{IIIXPh-*g6uu2d;(IuQ+^nbnFh(+C0UAzTX0{`^s

9iXy2P(kNi;ER@QnE;lmu{zhvZ6Sd#u1U{m8#~{ zJl6!SNBKGb?hz&kQ8}D4Z9rkLdCq~F_?CCoOTc`1o+*Uhg&W>2rRFnxQK{lFg#A9} z!jpT~OaAA>-5~ClfA8gkAIYCrdY6rV zNBn*N#_xUk*`N5yF3;A#&(DpKxE}&U%sz^cw(&6R`RTp�+L*O~1pjV>%+wLAYV; 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

x54W3uO;8 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≺lT< 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

#x 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‡CU>CKK+B))^4a?C_?L~FK0inf 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i~I3l%bC{MPAQ`Vur!p>0Th1GXq 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

Wb~{9myJL@2-QqAWpkpdUH{UZJ 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 al SKLabelNode { + let label = SKLabelNode(fontNamed: font) + label.text = text + label.fontSize = fontSize + label.fontColor = color + label.horizontalAlignmentMode = .center + label.verticalAlignmentMode = .center + label.position = CGPoint(x: size.width / 2, y: y) + if let maxWidth { + label.preferredMaxLayoutWidth = maxWidth + label.numberOfLines = 0 + } + addChild(label) + return label + } +} diff --git a/Arcade85/Games/DopeWars/DopeWarsScene.swift b/Arcade85/Games/DopeWars/DopeWarsScene.swift new file mode 100644 index 0000000..1ae7723 --- /dev/null +++ b/Arcade85/Games/DopeWars/DopeWarsScene.swift @@ -0,0 +1,1340 @@ +import SpriteKit +import UIKit + +/// HD remake of the classic Drug Wars (John E. Dell, 1984). `DopeWarsSim` is +/// the faithful engine; this scene dresses its menu-driven flow in a modern +/// touch trading board: a night-city backdrop, live market card with price +/// movement arrows (tier-aware product names), quantity sheets, event +/// interstitials (the original's Pause screens), the Officer Hardass chase, +/// and a net-worth-in-dollars high score. +final class DopeWarsScene: SKScene { + + // MARK: Modes + + private enum AmountMode: Equatable { + case buy(DopeWarsSim.Item), sell(DopeWarsSim.Item), repay, borrow, deposit, withdraw + + var isItemTrade: Bool { + switch self { case .buy, .sell: return true; default: return false } + } + } + + private enum Mode: Equatable { + case ready, board, message(String), offer, chase + case pickTrade(DopeWarsSim.Item) // BUY or SELL this row? + case amount(AmountMode) + case keypad(AmountMode) // type the amount directly + case ride, shark, bank, confirmEnd, gameOver + } + + private var mode: Mode = .ready + private var sim = DopeWarsSim() + private var cardQueue: [String] = [] + private var scoreSubmitted = false + private var newRecord = false + + // Month length chosen on the ready screen (0 = endless, not scored). + private var chosenLen = UserDefaults.standard.object(forKey: "dopewars.monthLen") as? Int ?? 30 + + // Amount sheet state + private var qty = 0 + private var typedAmount = 0 // keypad entry buffer + + // Yesterday's prices, for the ▲▼ movement arrows. Empty until day 2. + private var prevPrices: [Int] = [] + private var lastTierShown = 0 + + // MARK: Layout + + private var topInset: CGFloat = 0 + private var bottomInset: CGFloat = 0 + private var builtSize: CGSize = .zero + private var boardRect: CGRect = .zero + + // MARK: Persistent nodes + + private let dayValue = SKLabelNode(fontNamed: "Menlo-Bold") + private let locationValue = SKLabelNode(fontNamed: "Menlo-Bold") + private let walletValue = SKLabelNode(fontNamed: "Menlo-Bold") + private let debtValue = SKLabelNode(fontNamed: "Menlo-Bold") + private let bankValue = SKLabelNode(fontNamed: "Menlo-Bold") + private let coatValue = SKLabelNode(fontNamed: "Menlo-Bold") + private let statusLine = SKLabelNode(fontNamed: "Menlo-Bold") + + private var rowNames: [SKLabelNode] = [] + private var rowPrices: [SKLabelNode] = [] + private var rowHeld: [SKLabelNode] = [] + private var rowArrows: [SKLabelNode] = [] + private var rowBacks: [SKSpriteNode] = [] + private var lastWalletShown = Int.min + + private var pillNodes: [String: SKShapeNode] = [:] + private let boardGroup = SKNode() + private let sheet = SKNode() // rebuilt per mode + private var hitRects: [(key: String, rect: CGRect)] = [] + + private static let moneyFormatter: NumberFormatter = { + let f = NumberFormatter() + f.numberStyle = .decimal + return f + }() + private func money(_ n: Int) -> String { + let s = Self.moneyFormatter.string(from: NSNumber(value: abs(n))) ?? "\(abs(n))" + return (n < 0 ? "−$" : "$") + s + } + + // MARK: - Lifecycle + + override func didMove(to view: SKView) { + anchorPoint = .zero + scaleMode = .resizeFill + // One-time migration: the high score used to be the 0…100 √ rating; + // it is now final net worth in dollars, so the old best is meaningless. + if !UserDefaults.standard.bool(forKey: "dopewars.moneyScore") { + UserDefaults.standard.set(true, forKey: "dopewars.moneyScore") + HighScoreStore.shared.reset("dopewars") + } + layoutScene() + #if DEBUG + let env = ProcessInfo.processInfo.environment + if env["ARCADE_AUTOPLAY"] == "1" { startRun() } + if env["ARCADE_DEMO"] == "1" { + startRun() + cardQueue.removeAll() + sim.debugClearMessages() + if case .offer = sim.phase { sim.answerOffer(yes: false) } + sim.debugSetDay(12) + sim.debugSetWallet(8450) + sim.debugSetDebt(9205) + sim.debugSetBank(3120) + sim.debugSetLocation(.manhattan) + sim.debugSetGuns(1) + sim.debugSetWounds(9) + sim.debugSetHeld(.acid, 11) + sim.debugSetHeld(.weed, 24) + sim.debugSetHeld(.ludes, 8) + prevPrices = sim.price.map { max(2, $0 - 40) } // deterministic-ish arrows + switch env["ARCADE_DEMO_VIEW"] { // screenshot poses + case "buy": + qty = 5 + setMode(.amount(.buy(.acid))) + case "chase": + sim.debugSetHeld(.ludes, 50) + sim.debugApplyEvent(10) + sim.debugClearMessages() + setMode(.chase) + case "tier3": + sim.debugSetTier(3) + sim.debugSetDay(21) + sim.debugSetWallet(1_837_400) + sim.debugSetBank(920_000) + sim.debugSetDebt(0) + sim.debugSetHeld(.ludes, 0) + sim.debugSetHeld(.weed, 0) + sim.debugSetHeld(.speed, 34) + sim.debugSetPrice(.speed, 118_400) + sim.debugSetPrice(.ludes, 9_200) + prevPrices = [] + setMode(.board) + case "over": + sim.debugSetWallet(9_318_400) + sim.debugSetBank(4_206_300) + sim.debugSetDebt(0) + sim.quit() + syncFromSim() + case "ride": + setMode(.ride) + case "keypad": + typedAmount = 1250 + setMode(.keypad(.buy(.acid))) + case "sharkchase": + sim.debugSetDebt(24_200) + sim.debugTriggerShark() + sim.debugClearMessages() + setMode(.chase) + case "endless": + chosenLen = 0 + startRun() + sim.debugClearMessages() + if case .offer = sim.phase { sim.answerOffer(yes: false) } + sim.debugSetDay(47) + sim.debugSetWallet(214_600) + setMode(.board) + default: + setMode(.board) + } + } + #endif + } + + override func didChangeSize(_ oldSize: CGSize) { + guard view != nil, size != builtSize, size.width > 0 else { return } + layoutScene() + } + + private func layoutScene() { + builtSize = size + removeAllChildren() + pillNodes.removeAll() + backgroundColor = Palette.space1 + + let insets = view?.safeAreaInsets ?? .zero + topInset = insets.top + bottomInset = insets.bottom + + buildBackdrop() + buildHUD() + buildBoard() + buildActionBar() + + sheet.zPosition = 40 + addChild(sheet) + + refreshAll() + applyMode() + } + + // MARK: - Night-city backdrop + + private func buildBackdrop() { + let bg = SKSpriteNode(texture: SceneArt.verticalGradient(size: size, top: Palette.space0, bottom: Palette.space1)) + bg.anchorPoint = .zero + bg.zPosition = -10 + addChild(bg) + + let stars = SceneArt.starfield(size: size, count: 46, seed: 0xD09E) + stars.zPosition = -9.5 + addChild(stars) + + // Sodium-lamp glow rising from the streets. + let glow = SKSpriteNode(texture: SceneArt.verticalGradient( + size: CGSize(width: size.width, height: 190), + top: UIColor.clear, bottom: Palette.amber.withAlphaComponent(0.16))) + glow.anchorPoint = .zero + glow.position = .zero + glow.blendMode = .add + glow.zPosition = -9 + addChild(glow) + + // Two silhouette skyline layers, windows lit here and there. + let far = SKSpriteNode(texture: skylineTexture( + width: size.width, maxHeight: 150, seed: 0x8541, + body: UIColor(red: 0.045, green: 0.065, blue: 0.125, alpha: 1), litAlpha: 0.45)) + far.anchorPoint = .zero + far.position = .zero + far.zPosition = -8.5 + addChild(far) + + let near = SKSpriteNode(texture: skylineTexture( + width: size.width, maxHeight: 96, seed: 0x1984, + body: UIColor(red: 0.022, green: 0.032, blue: 0.070, alpha: 1), litAlpha: 0.7)) + near.anchorPoint = .zero + near.position = .zero + near.zPosition = -8 + addChild(near) + + // Calm the ground floor so the action pills stay legible. + let groundScrim = SKSpriteNode(texture: SceneArt.verticalGradient( + size: CGSize(width: size.width, height: 150), + top: UIColor.clear, bottom: Palette.space1.withAlphaComponent(0.85))) + groundScrim.anchorPoint = .zero + groundScrim.position = .zero + groundScrim.zPosition = -7.5 + addChild(groundScrim) + } + + /// A procedurally built row of tower silhouettes with a scattering of lit + /// windows — amber mostly, the odd cyan office floor. + private func skylineTexture(width: CGFloat, maxHeight: CGFloat, seed: UInt64, + body: UIColor, litAlpha: CGFloat) -> SKTexture { + var rng = SeededGenerator(seed: seed) + let renderer = UIGraphicsImageRenderer(size: CGSize(width: width, height: maxHeight)) + let image = renderer.image { ctx in + let cg = ctx.cgContext + var x: CGFloat = -8 + while x < width { + let w = CGFloat.random(in: 22...52, using: &rng) + let h = CGFloat.random(in: maxHeight * 0.30...maxHeight * 0.96, using: &rng) + let top = maxHeight - h + body.setFill() + cg.fill(CGRect(x: x, y: top, width: w, height: h)) + // rooftop bulkhead or antenna + if Bool.random(using: &rng) { + cg.fill(CGRect(x: x + w * 0.3, y: top - 6, width: w * 0.28, height: 6)) + } else if Int.random(in: 0...3, using: &rng) == 0 { + cg.fill(CGRect(x: x + w / 2 - 1, y: top - 14, width: 2, height: 14)) + } + // windows: sparse grid of lit cells + let cols = max(2, Int(w / 9)) + let rows = max(3, Int(h / 13)) + for c in 0.. SKLabelNode { + let label = SKLabelNode(fontNamed: "Menlo-Bold") + label.text = text + label.fontSize = 10 + label.fontColor = Palette.white40 + label.horizontalAlignmentMode = align + label.verticalAlignmentMode = .center + label.position = CGPoint(x: x, y: y) + label.zPosition = 20 + return label + } + + private func hudValue(_ node: SKLabelNode, size fontSize: CGFloat, color: UIColor, + x: CGFloat, y: CGFloat, align: SKLabelHorizontalAlignmentMode) { + node.removeFromParent() + node.fontSize = fontSize + node.fontColor = color + node.horizontalAlignmentMode = align + node.verticalAlignmentMode = .center + node.position = CGPoint(x: x, y: y) + node.zPosition = 20 + addChild(node) + } + + private func buildHUD() { + let hudY = size.height - topInset - 26 + + // A soft scrim so the HUD reads as its own layer over the sky. + let scrim = SKSpriteNode(texture: SceneArt.verticalGradient( + size: CGSize(width: size.width, height: topInset + 96), + top: Palette.space1.withAlphaComponent(0.9), bottom: UIColor.clear)) + scrim.anchorPoint = .zero + scrim.position = CGPoint(x: 0, y: size.height - topInset - 96) + scrim.zPosition = 15 + addChild(scrim) + + addChild(caption("DAY", x: 74, y: hudY + 12, align: .left)) + hudValue(dayValue, size: 18, color: .white, x: 74, y: hudY - 8, align: .left) + + addChild(caption("BOROUGH", x: size.width / 2, y: hudY + 12, align: .center)) + hudValue(locationValue, size: 18, color: Palette.cyan, x: size.width / 2, y: hudY - 8, align: .center) + + addChild(caption("CASH", x: size.width - 20, y: hudY + 12, align: .right)) + hudValue(walletValue, size: 18, color: .white, x: size.width - 20, y: hudY - 8, align: .right) + + let row2 = hudY - 40 + addChild(caption("DEBT", x: 20, y: row2 + 11, align: .left)) + hudValue(debtValue, size: 14, color: Palette.red, x: 20, y: row2 - 6, align: .left) + addChild(caption("BANK", x: size.width / 2, y: row2 + 11, align: .center)) + hudValue(bankValue, size: 14, color: Palette.mint, x: size.width / 2, y: row2 - 6, align: .center) + addChild(caption("COAT", x: size.width - 20, y: row2 + 11, align: .right)) + hudValue(coatValue, size: 14, color: Palette.amber, x: size.width - 20, y: row2 - 6, align: .right) + } + + // MARK: - Market board + + private func buildBoard() { + boardGroup.removeAllChildren() + boardGroup.removeFromParent() + boardGroup.zPosition = 5 + addChild(boardGroup) + rowNames.removeAll(); rowPrices.removeAll(); rowHeld.removeAll() + rowArrows.removeAll(); rowBacks.removeAll() + + let hudBottom = size.height - topInset - 82 + let barTop = bottomInset + 88 + boardRect = CGRect(x: 16, y: barTop + 34, width: size.width - 32, + height: hudBottom - (barTop + 34) - 8) + + // Explicit z layering inside the group: card < row backs < text. + // (Sibling order alone is not guaranteed when sprites and labels mix.) + let card = SKSpriteNode(texture: SceneArt.panelTexture( + size: boardRect.size, cornerRadius: 18, + top: UIColor(red: 0.075, green: 0.105, blue: 0.185, alpha: 0.94), + bottom: UIColor(red: 0.035, green: 0.050, blue: 0.100, alpha: 0.94), + stroke: Palette.mint.withAlphaComponent(0.28))) + card.anchorPoint = .zero + card.position = boardRect.origin + card.zPosition = 0 + boardGroup.addChild(card) + + let header = SKLabelNode(fontNamed: "Menlo-Bold") + header.text = "TAP A DRUG TO BUY / SELL" + header.fontSize = 10 + header.fontColor = Palette.white40 + header.horizontalAlignmentMode = .center + header.verticalAlignmentMode = .center + header.position = CGPoint(x: boardRect.midX, y: boardRect.maxY - 18) + header.zPosition = 2 + boardGroup.addChild(header) + + let rowsTop = boardRect.maxY - 32 + let rowsBottom = boardRect.minY + 30 + let rowH = (rowsTop - rowsBottom) / 6 + + for i in 0..<6 { + let item = DopeWarsSim.Item(rawValue: i)! + let rowY = rowsTop - rowH * CGFloat(i) - rowH / 2 + + let backSize = CGSize(width: boardRect.width - 16, height: rowH - 8) + let back = SKSpriteNode(texture: SceneArt.panelTexture( + size: backSize, cornerRadius: 12, + top: UIColor(white: 1, alpha: 0.10), bottom: UIColor(white: 1, alpha: 0.04), + stroke: UIColor(white: 1, alpha: 0.09))) + back.position = CGPoint(x: boardRect.midX, y: rowY) + back.zPosition = 1 + boardGroup.addChild(back) + rowBacks.append(back) + + let name = SKLabelNode(fontNamed: "AvenirNext-DemiBold") + name.text = sim.displayName(item) + name.fontSize = 19 + name.fontColor = .white + name.horizontalAlignmentMode = .left + name.verticalAlignmentMode = .center + name.position = CGPoint(x: boardRect.minX + 26, y: rowY + 11) + name.zPosition = 2 + boardGroup.addChild(name) + rowNames.append(name) + + let held = SKLabelNode(fontNamed: "Menlo-Bold") + held.fontSize = 12 + held.fontColor = Palette.amber + held.horizontalAlignmentMode = .left + held.verticalAlignmentMode = .center + held.position = CGPoint(x: boardRect.minX + 26, y: rowY - 13) + held.zPosition = 2 + boardGroup.addChild(held) + rowHeld.append(held) + + let price = SKLabelNode(fontNamed: "Menlo-Bold") + price.fontSize = 19 + price.fontColor = Palette.mint + price.horizontalAlignmentMode = .right + price.verticalAlignmentMode = .center + price.position = CGPoint(x: boardRect.maxX - 26, y: rowY + 10) + price.zPosition = 2 + boardGroup.addChild(price) + rowPrices.append(price) + + let arrow = SKLabelNode(fontNamed: "Menlo-Bold") + arrow.fontSize = 11 + arrow.horizontalAlignmentMode = .right + arrow.verticalAlignmentMode = .center + arrow.position = CGPoint(x: boardRect.maxX - 26, y: rowY - 13) + arrow.zPosition = 2 + boardGroup.addChild(arrow) + rowArrows.append(arrow) + } + + statusLine.removeFromParent() + statusLine.fontSize = 11 + statusLine.fontColor = Palette.white70 + statusLine.horizontalAlignmentMode = .center + statusLine.verticalAlignmentMode = .center + statusLine.position = CGPoint(x: boardRect.midX, y: boardRect.minY + 15) + statusLine.zPosition = 2 + boardGroup.addChild(statusLine) + } + + private func rowRect(_ i: Int) -> CGRect { + let rowsTop = boardRect.maxY - 32 + let rowsBottom = boardRect.minY + 30 + let rowH = (rowsTop - rowsBottom) / 6 + return CGRect(x: boardRect.minX + 8, y: rowsTop - rowH * CGFloat(i + 1) + 3, + width: boardRect.width - 16, height: rowH - 6) + } + + // MARK: - Action bar + + private func buildActionBar() { + let labels: [(String, String, UIColor)] = [ + ("act.subway", "SUBWAY", Palette.mint), + ("act.shark", "SHARK", Palette.amber), + ("act.bank", "BANK", Palette.cyan), + ("act.end", "END", Palette.white40), + ] + let gap: CGFloat = 10 + let sideMargin: CGFloat = 16 + let w = (size.width - sideMargin * 2 - gap * 3) / 4 + let h: CGFloat = 52 + let y = bottomInset + 24 + + for (i, (key, text, color)) in labels.enumerated() { + let x = sideMargin + (w + gap) * CGFloat(i) + let rect = CGRect(x: x, y: y, width: w, height: h) + let pill = SKShapeNode(rect: rect, cornerRadius: 14) + pill.fillColor = color.withAlphaComponent(0.13) + pill.strokeColor = color.withAlphaComponent(0.55) + pill.lineWidth = 1.5 + pill.glowWidth = 1.5 + pill.zPosition = 20 + let label = SKLabelNode(fontNamed: "Menlo-Bold") + label.text = text + label.fontSize = 13 + label.fontColor = color + label.horizontalAlignmentMode = .center + label.verticalAlignmentMode = .center + label.position = CGPoint(x: rect.midX, y: rect.midY) + pill.addChild(label) + addChild(pill) + pillNodes[key] = pill + } + } + + private func actionRect(_ index: Int) -> CGRect { + let gap: CGFloat = 10 + let sideMargin: CGFloat = 16 + let w = (size.width - sideMargin * 2 - gap * 3) / 4 + return CGRect(x: sideMargin + (w + gap) * CGFloat(index), y: bottomInset + 24, width: w, height: 52) + } + + // MARK: - Refresh + + private func refreshAll() { + dayValue.text = sim.monthLen == Int.max + ? "\(sim.day)" + : "\(min(sim.day, sim.monthLen))/\(sim.monthLen)" + locationValue.text = sim.location.name.uppercased() + locationValue.fontColor = sim.inBronx ? Palette.mint : Palette.cyan + walletValue.text = money(sim.wallet) + if lastWalletShown != Int.min, lastWalletShown != sim.wallet { + walletValue.removeAllActions() + walletValue.setScale(1) + walletValue.run(.sequence([.scale(to: 1.18, duration: 0.08), .scale(to: 1, duration: 0.14)])) + } + lastWalletShown = sim.wallet + debtValue.text = money(sim.debt) + bankValue.text = money(sim.bank) + coatValue.text = "\(sim.coatFree)/\(sim.coatTotal)" + + // A tier shift renames slots mid-run; yesterday's prices belong to the + // old products, so the ▲▼ arrows sit out the swap day. + if sim.tier != lastTierShown { + if lastTierShown != 0 { prevPrices = [] } + lastTierShown = sim.tier + } + + for i in 0..<6 { + let item = DopeWarsSim.Item(rawValue: i)! + rowNames[i].text = sim.displayName(item) + rowPrices[i].text = money(sim.price[i]) + let count = sim.held[i] + rowHeld[i].text = count == 0 ? "—" : "HOLDING \(count)" + rowHeld[i].fontColor = count == 0 ? Palette.white40 : Palette.amber + if prevPrices.count == 6 { + let delta = sim.price[i] - prevPrices[i] + let pct = min(abs(delta) * 100 / max(prevPrices[i], 1), 999) + if delta == 0 || pct == 0 { + rowArrows[i].text = "" + } else { + rowArrows[i].text = (delta > 0 ? "▲" : "▼") + "\(pct)%" + rowArrows[i].fontColor = delta > 0 ? Palette.mint : Palette.red + } + } else { + rowArrows[i].text = "" + } + } + + var status: [String] = [] + if sim.guns > 0 { status.append("GUNS \(sim.guns)") } + if sim.wounds > 0 { status.append("WOUNDS \(sim.wounds)/50") } + if status.isEmpty { // keep the line inside the card + status.append(sim.inBronx ? "LOAN SHARK & BANK AVAILABLE" : "SHARK & BANK ARE IN THE BRONX") + } + statusLine.text = status.joined(separator: " · ") + statusLine.fontColor = sim.wounds >= 30 ? Palette.red : Palette.white70 + + // Absolute alphas every refresh — the sheet dim in applyMode() must + // never stick to a pill after the board returns. + pillNodes["act.subway"]?.alpha = 1 + pillNodes["act.end"]?.alpha = 1 + pillNodes["act.shark"]?.alpha = sim.inBronx ? 1 : 0.35 + pillNodes["act.bank"]?.alpha = sim.inBronx ? 1 : 0.35 + } + + /// Called after a day roll: remember today's prices for tomorrow's arrows + /// and flash the rows whose prices moved. + private func notePriceMovement(from old: [Int]) { + prevPrices = old + guard rowBacks.count == 6 else { return } + for i in 0..<6 where old.count == 6 && old[i] != sim.price[i] { + let up = sim.price[i] > old[i] + let tint: UIColor = up ? Palette.mint : Palette.red + rowBacks[i].run(.sequence([ + .colorize(with: tint, colorBlendFactor: 0.30, duration: 0.10), + .wait(forDuration: 0.25), + .colorize(withColorBlendFactor: 0, duration: 0.5), + ])) + } + } + + // MARK: - Mode machine + + private func setMode(_ new: Mode) { + mode = new + applyMode() + } + + /// Central sync: drain sim messages into cards, then land on whatever view + /// the sim's phase demands. + private func syncFromSim() { + while let m = sim.popMessage() { cardQueue.append(m) } + refreshAll() + if !cardQueue.isEmpty { + setMode(.message(cardQueue.removeFirst())) + } else if sim.offerPrompt != nil { + setMode(.offer) + } else if sim.phase == .chase { + setMode(.chase) + } else if sim.phase == .gameOver { + if !scoreSubmitted { + scoreSubmitted = true + // Endless runs are for fun — they never post to the leaderboard. + newRecord = sim.monthLen == Int.max + ? false + : HighScoreStore.shared.submit(id: "dopewars", score: max(0, sim.finalNet)) + if sim.endCause == .monthOver || sim.endCause == .quit { Haptics.success() } else { Haptics.error() } + } + setMode(.gameOver) + } else { + setMode(.board) + } + } + + private func applyMode() { + sheet.removeAllChildren() + hitRects.removeAll() + let boardVisible: Bool + switch mode { + case .ready: boardVisible = false + case .gameOver: boardVisible = false + default: boardVisible = true + } + boardGroup.alpha = boardVisible ? 1 : 0.12 + if boardVisible { + refreshAll() // also restores every pill's alpha + } else { + for pill in pillNodes.values { pill.alpha = 0.2 } + } + + switch mode { + case .ready: buildReadySheet() + case .board: break + case .message(let text): buildMessageSheet(text) + case .offer: buildOfferSheet() + case .chase: buildChaseSheet() + case .pickTrade(let item): buildPickTradeSheet(item) + case .amount(let am): buildAmountSheet(am) + case .keypad(let am): buildKeypadSheet(am) + case .ride: buildRideSheet() + case .shark: buildSharkSheet() + case .bank: buildBankSheet() + case .confirmEnd: buildConfirmEndSheet() + case .gameOver: buildGameOverSheet() + } + } + + // MARK: - Sheet builders + + private func dimLayer(_ alpha: CGFloat = 0.6) { + let dim = SKSpriteNode(color: UIColor(white: 0.02, alpha: alpha), size: size) + dim.anchorPoint = .zero + dim.zPosition = 0 + sheet.addChild(dim) + } + + private func sheetCard(height: CGFloat) -> CGRect { + let w = min(size.width - 44, 380) + let rect = CGRect(x: (size.width - w) / 2, y: (size.height - height) / 2 + 20, width: w, height: height) + let card = SKSpriteNode(texture: SceneArt.panelTexture( + size: rect.size, cornerRadius: 20, + top: UIColor(red: 0.085, green: 0.115, blue: 0.20, alpha: 0.98), + bottom: UIColor(red: 0.04, green: 0.055, blue: 0.105, alpha: 0.98), + stroke: Palette.mint.withAlphaComponent(0.4))) + card.anchorPoint = .zero + card.position = rect.origin + card.zPosition = 1 // dim < card < labels/buttons + sheet.addChild(card) + return rect + } + + private func sheetLabel(_ text: String, font: String = "AvenirNext-Medium", size fontSize: CGFloat, + color: UIColor, x: CGFloat, y: CGFloat, maxWidth: CGFloat? = nil, + align: SKLabelHorizontalAlignmentMode = .center) -> SKLabelNode { + let label = SKLabelNode(fontNamed: font) + label.text = text + label.fontSize = fontSize + label.fontColor = color + label.horizontalAlignmentMode = align + label.verticalAlignmentMode = .center + label.position = CGPoint(x: x, y: y) + if let maxWidth { + label.preferredMaxLayoutWidth = maxWidth + label.numberOfLines = 0 + } + label.zPosition = 2 + sheet.addChild(label) + return label + } + + @discardableResult + private func sheetButton(_ key: String, _ text: String, color: UIColor, + rect: CGRect, fontSize: CGFloat = 15, + sub: String? = nil) -> SKShapeNode { + let node = SKShapeNode(rect: rect, cornerRadius: 12) + node.fillColor = color.withAlphaComponent(0.16) + node.strokeColor = color.withAlphaComponent(0.6) + node.lineWidth = 1.5 + if let sub { + let subLabel = SKLabelNode(fontNamed: "Menlo") + subLabel.text = sub + subLabel.fontSize = 9.5 + subLabel.fontColor = Palette.white40 + subLabel.horizontalAlignmentMode = .center + subLabel.verticalAlignmentMode = .center + subLabel.position = CGPoint(x: rect.midX, y: rect.midY - 10) + node.addChild(subLabel) + } + let label = SKLabelNode(fontNamed: "Menlo-Bold") + label.text = text + label.fontSize = fontSize + label.fontColor = color + label.horizontalAlignmentMode = .center + label.verticalAlignmentMode = .center + label.position = CGPoint(x: rect.midX, y: sub == nil ? rect.midY : rect.midY + 8) + node.addChild(label) + node.zPosition = 2 + sheet.addChild(node) + hitRects.append((key, rect)) + return node + } + + private func tapPrompt(_ text: String, x: CGFloat, y: CGFloat) { + let prompt = sheetLabel(text, font: "Menlo-Bold", size: 13, color: Palette.mint, x: x, y: y) + prompt.run(.repeatForever(.sequence([.fadeAlpha(to: 0.35, duration: 0.7), .fadeAlpha(to: 1, duration: 0.7)]))) + } + + private func buildReadySheet() { + dimLayer(0.45) + let cx = size.width / 2 + let midY = size.height * 0.6 + + let glow = SceneArt.glowSprite(color: Palette.mint, radius: 150) + glow.position = CGPoint(x: cx, y: midY + 124) + glow.alpha = 0.5 + sheet.addChild(glow) + sheetLabel("DOPE WARS", font: "AvenirNext-Heavy", size: 36, color: .white, x: cx, y: midY + 128) + sheetLabel("Buy low. Sell high. Square the loan shark.", + size: 15, color: Palette.white70, x: cx, y: midY + 92, maxWidth: size.width - 70) + + let rules = [ + chosenLen == 0 ? "No clock — deal until they get you." + : "\(chosenLen) days, then the month ends and you're scored.", + "You owe the shark $5,500. Debt grows 10% a day.", + "A ride burns a day. Every borough prices its own way.", + "Your trench coat holds 100 units.", + "50+ units in the coat draws Officer Hardass.", + "The Bronx is home: loan shark + 6%-a-day bank.", + chosenLen == 0 ? "Endless runs are for fun — no score is posted." + : "Score = final net worth (cash + bank − debt).", + ] + let rulesLeft = cx - (size.width - 80) / 2 + for (i, rule) in rules.enumerated() { + sheetLabel("• " + rule, font: "AvenirNext-Medium", size: 12.5, color: Palette.white70, + x: rulesLeft, y: midY + 44 - CGFloat(i) * 31, align: .left) + } + + sheetLabel("Get rich enough and word spreads — bigger product finds you.", + font: "AvenirNext-DemiBold", size: 12, color: Palette.amber, + x: cx, y: midY - 186, maxWidth: size.width - 84) + + // Month length picker: 30 / 60 / 90 / endless. The first rules bullet + // restates the selection in words, so the chips stay bare numbers. + let options: [(len: Int, label: String)] = [(30, "30"), (60, "60"), (90, "90"), (0, "∞")] + let chipW: CGFloat = 62, chipH: CGFloat = 38, gap: CGFloat = 10 + let rowW = chipW * 4 + gap * 3 + for (i, opt) in options.enumerated() { + let x = cx - rowW / 2 + CGFloat(i) * (chipW + gap) + let chosen = opt.len == chosenLen + let chip = sheetButton("len.\(opt.len)", opt.label, + color: chosen ? Palette.mint : Palette.white40, + rect: CGRect(x: x, y: midY - 258, width: chipW, height: chipH), + fontSize: 15) + if chosen { chip.fillColor = Palette.mint.withAlphaComponent(0.30) } + } + + tapPrompt("TAP TO HIT THE STREETS", x: cx, y: midY - 296) + } + + private func buildMessageSheet(_ text: String) { + dimLayer(0.55) + let rect = sheetCard(height: 190) + sheetLabel(text, font: "AvenirNext-DemiBold", size: 17, color: .white, + x: rect.midX, y: rect.midY + 18, maxWidth: rect.width - 44) + tapPrompt("TAP", x: rect.midX, y: rect.minY + 30) + } + + private func buildOfferSheet() { + guard let prompt = sim.offerPrompt else { return } + dimLayer(0.55) + let rect = sheetCard(height: 230) + sheetLabel(prompt, font: "AvenirNext-DemiBold", size: 17, color: .white, + x: rect.midX, y: rect.midY + 34, maxWidth: rect.width - 44) + let bw = (rect.width - 60) / 2 + sheetButton("offer.yes", "YES", color: Palette.mint, + rect: CGRect(x: rect.minX + 22, y: rect.minY + 22, width: bw, height: 50)) + sheetButton("offer.no", "NO", color: Palette.red, + rect: CGRect(x: rect.maxX - 22 - bw, y: rect.minY + 22, width: bw, height: 50)) + } + + private func buildChaseSheet() { + dimLayer(0.68) + + // Cop-light strobe: red and blue washes sweeping opposite edges. + let redLight = SceneArt.glowSprite(color: Palette.red, radius: 260) + redLight.position = CGPoint(x: 40, y: size.height * 0.72) + redLight.alpha = 0 + redLight.run(.repeatForever(.sequence([ + .fadeAlpha(to: 0.55, duration: 0.22), .fadeAlpha(to: 0.05, duration: 0.22)]))) + sheet.addChild(redLight) + // Cops flash red/blue; the shark's goons come under sodium amber. + let blueLight = SceneArt.glowSprite(color: sim.sharkChase ? Palette.amber : Palette.cyan, radius: 260) + blueLight.position = CGPoint(x: size.width - 40, y: size.height * 0.72) + blueLight.alpha = 0.4 + blueLight.run(.repeatForever(.sequence([ + .fadeAlpha(to: 0.05, duration: 0.22), .fadeAlpha(to: 0.55, duration: 0.22)]))) + sheet.addChild(blueLight) + + let rect = sheetCard(height: 320) + let shark = sim.sharkChase + let title = sheetLabel(shark ? "LEG-BREAKERS!" : "COPS!", + font: "AvenirNext-Heavy", size: 28, color: Palette.red, + x: rect.midX, y: rect.maxY - 40) + title.run(.repeatForever(.sequence([.fadeAlpha(to: 0.55, duration: 0.35), .fadeAlpha(to: 1, duration: 0.35)]))) + sheetLabel(shark ? "The shark wants his money" : "Officer Hardass wants your stash", + size: 13, color: Palette.white70, x: rect.midX, y: rect.maxY - 68) + + let stats = [ + (shark ? "GOONS LEFT" : "COPS LEFT", "\(sim.chaseCops + 1)", Palette.red), + ("GUNS", "\(sim.guns)", Palette.cyan), + ("WOUNDS", "\(sim.wounds)/50", sim.wounds >= 30 ? Palette.red : Palette.amber), + ] + for (i, (cap, value, color)) in stats.enumerated() { + let y = rect.maxY - 110 - CGFloat(i) * 34 + sheetLabel(cap, font: "Menlo-Bold", size: 12, color: Palette.white40, + x: rect.minX + 30, y: y, align: .left) + sheetLabel(value, font: "Menlo-Bold", size: 16, color: color, + x: rect.maxX - 30, y: y, align: .right) + } + + let bw = (rect.width - 60) / 2 + sheetButton("chase.run", "RUN", color: Palette.mint, + rect: CGRect(x: rect.minX + 22, y: rect.minY + 22, width: bw, height: 56)) + sheetButton("chase.fight", "FIGHT", color: Palette.red, + rect: CGRect(x: rect.maxX - 22 - bw, y: rect.minY + 22, width: bw, height: 56)) + } + + private func buildPickTradeSheet(_ item: DopeWarsSim.Item) { + dimLayer(0.5) + let rect = sheetCard(height: 250) + sheetLabel(sim.displayName(item), font: "AvenirNext-Heavy", size: 22, color: .white, + x: rect.midX, y: rect.maxY - 36) + sheetLabel("Price \(money(sim.price[item.rawValue])) · Holding \(sim.held[item.rawValue])", + font: "Menlo-Bold", size: 13, color: Palette.mint, x: rect.midX, y: rect.maxY - 66) + let bw = rect.width - 44 + sheetButton("pick.buy", "BUY", color: Palette.mint, + rect: CGRect(x: rect.minX + 22, y: rect.midY - 12, width: bw, height: 48)) + sheetButton("pick.sell", "SELL", color: Palette.amber, + rect: CGRect(x: rect.minX + 22, y: rect.midY - 70, width: bw, height: 48)) + sheetButton("sheet.cancel", "CANCEL", color: Palette.white40, + rect: CGRect(x: rect.minX + 22, y: rect.minY + 14, width: bw, height: 40), fontSize: 13) + } + + private func amountLimit(_ am: AmountMode) -> Int { + switch am { + case .buy(let item): return min(sim.affordable(item), sim.coatFree) + case .sell(let item): return sim.sellable(item) + case .repay: return min(sim.wallet, sim.debt) + case .borrow: return 5000 + case .deposit: return sim.wallet + case .withdraw: return sim.bank + } + } + + private func amountTitle(_ am: AmountMode) -> String { + switch am { + case .buy(let item): return "BUY \(sim.displayName(item).uppercased())" + case .sell(let item): return "SELL \(sim.displayName(item).uppercased())" + case .repay: return "REPAY THE SHARK" + case .borrow: return "BORROW FROM THE SHARK" + case .deposit: return "DEPOSIT" + case .withdraw: return "WITHDRAW" + } + } + + private func amountContext(_ am: AmountMode) -> String { + switch am { + case .buy(let item): + return "Price \(money(sim.price[item.rawValue])) · Afford \(sim.affordable(item)) · Space \(sim.coatFree)" + case .sell(let item): + return "Price \(money(sim.price[item.rawValue])) · You have \(sim.sellable(item))" + case .repay: return "Debt \(money(sim.debt)) · Cash \(money(sim.wallet))" + case .borrow: return "He'll front up to $5,000 per visit" + case .deposit: return "Cash \(money(sim.wallet)) · Earns 6% a day" + case .withdraw: return "Balance \(money(sim.bank))" + } + } + + private func buildAmountSheet(_ am: AmountMode) { + dimLayer(0.5) + let rect = sheetCard(height: 330) + sheetLabel(amountTitle(am), font: "AvenirNext-Heavy", size: 19, color: .white, + x: rect.midX, y: rect.maxY - 32) + sheetLabel(amountContext(am), font: "Menlo", size: 11.5, color: Palette.white70, + x: rect.midX, y: rect.maxY - 58, maxWidth: rect.width - 36) + + let qtyLabel = sheetLabel(am.isItemTrade ? "\(qty)" : money(qty), + font: "Menlo-Bold", size: 34, color: Palette.mint, + x: rect.midX, y: rect.maxY - 102) + qtyLabel.name = "amount.qty" + // The number itself is a button: tap it to type the amount. + let typeRect = CGRect(x: rect.midX - 105, y: rect.maxY - 126, width: 210, height: 48) + let typeBox = SKShapeNode(rect: typeRect, cornerRadius: 12) + typeBox.fillColor = .clear + typeBox.strokeColor = Palette.mint.withAlphaComponent(0.30) + typeBox.lineWidth = 1 + typeBox.zPosition = 2 + sheet.addChild(typeBox) + hitRects.append(("amt.type", typeRect)) + sheetLabel("tap the number to type it", font: "Menlo", size: 9.5, + color: Palette.white40, x: rect.midX, y: rect.maxY - 150) + + let totalLabel = sheetLabel("", font: "Menlo-Bold", size: 13, color: Palette.amber, + x: rect.midX, y: rect.maxY - 134) + totalLabel.name = "amount.total" + updateAmountLabels(am) + + let steps = am.isItemTrade ? [1, 10, 100] : [10, 100, 1000] + let chipW = (rect.width - 44 - 5 * 8) / 6 + let chipY = rect.maxY - 186 + let chips: [(String, String)] = [ + ("amt.m\(steps[2])", "−\(steps[2])"), ("amt.m\(steps[1])", "−\(steps[1])"), ("amt.m\(steps[0])", "−\(steps[0])"), + ("amt.p\(steps[0])", "+\(steps[0])"), ("amt.p\(steps[1])", "+\(steps[1])"), ("amt.p\(steps[2])", "+\(steps[2])"), + ] + for (i, (key, text)) in chips.enumerated() { + let x = rect.minX + 22 + (chipW + 8) * CGFloat(i) + sheetButton(key, text, color: Palette.cyan, + rect: CGRect(x: x, y: chipY, width: chipW, height: 40), fontSize: 11) + } + sheetButton("amt.max", "MAX \(am.isItemTrade ? "\(amountLimit(am))" : money(amountLimit(am)))", + color: Palette.violet, + rect: CGRect(x: rect.minX + 22, y: chipY - 50, width: rect.width - 44, height: 40), fontSize: 12) + + let bw = (rect.width - 60) / 2 + sheetButton("amt.confirm", "CONFIRM", color: Palette.mint, + rect: CGRect(x: rect.minX + 22, y: rect.minY + 16, width: bw, height: 48)) + sheetButton("sheet.cancel", "CANCEL", color: Palette.white40, + rect: CGRect(x: rect.maxX - 22 - bw, y: rect.minY + 16, width: bw, height: 48), fontSize: 13) + } + + private func updateAmountLabels(_ am: AmountMode) { + guard let qtyLabel = sheet.childNode(withName: "//amount.qty") as? SKLabelNode, + let totalLabel = sheet.childNode(withName: "//amount.total") as? SKLabelNode else { return } + qtyLabel.text = am.isItemTrade ? "\(qty)" : money(qty) + switch am { + case .buy(let item): totalLabel.text = "COST \(money(qty * sim.price[item.rawValue]))" + case .sell(let item): totalLabel.text = "YOU GET \(money(qty * sim.price[item.rawValue]))" + case .repay: totalLabel.text = "DEBT AFTER \(money(sim.debt - qty))" + case .borrow: totalLabel.text = "DEBT AFTER \(money(sim.debt + qty))" + case .deposit, .withdraw: totalLabel.text = "" + } + } + + /// In-scene numeric keypad: type any amount, DONE clamps to the limit. + private func buildKeypadSheet(_ am: AmountMode) { + dimLayer(0.55) + let rect = sheetCard(height: 470) + sheetLabel(amountTitle(am), font: "AvenirNext-Heavy", size: 18, color: .white, + x: rect.midX, y: rect.maxY - 30) + + let value = sheetLabel(am.isItemTrade ? "\(typedAmount)" : money(typedAmount), + font: "Menlo-Bold", size: 30, color: Palette.mint, + x: rect.midX, y: rect.maxY - 68) + value.name = "pad.value" + let limit = amountLimit(am) + sheetLabel("LIMIT \(am.isItemTrade ? "\(limit)" : money(limit)) · DONE trims to it", + font: "Menlo", size: 10.5, color: Palette.white40, + x: rect.midX, y: rect.maxY - 98) + + let keys: [[(String, String, UIColor)]] = [ + [("pad.1", "1", Palette.cyan), ("pad.2", "2", Palette.cyan), ("pad.3", "3", Palette.cyan)], + [("pad.4", "4", Palette.cyan), ("pad.5", "5", Palette.cyan), ("pad.6", "6", Palette.cyan)], + [("pad.7", "7", Palette.cyan), ("pad.8", "8", Palette.cyan), ("pad.9", "9", Palette.cyan)], + [("pad.del", "⌫", Palette.amber), ("pad.0", "0", Palette.cyan), ("pad.done", "DONE", Palette.mint)], + ] + let kw = (rect.width - 44 - 16) / 3 + for (r, row) in keys.enumerated() { + let y = rect.maxY - 124 - CGFloat(r + 1) * 58 + for (c, (key, text, color)) in row.enumerated() { + sheetButton(key, text, color: color, + rect: CGRect(x: rect.minX + 22 + (kw + 8) * CGFloat(c), y: y, + width: kw, height: 50), + fontSize: key == "pad.done" ? 13 : 17) + } + } + sheetButton("sheet.cancel", "CANCEL", color: Palette.white40, + rect: CGRect(x: rect.minX + 22, y: rect.minY + 14, width: rect.width - 44, height: 40), + fontSize: 13) + } + + private func updateKeypadValue(_ am: AmountMode) { + guard let value = sheet.childNode(withName: "//pad.value") as? SKLabelNode else { return } + value.text = am.isItemTrade ? "\(typedAmount)" : money(typedAmount) + value.fontColor = typedAmount > amountLimit(am) ? Palette.amber : Palette.mint + } + + /// Each borough's economy hint, tier-aware for the swappable slots. + private func boroughCaption(_ loc: DopeWarsSim.Location) -> String { + switch loc { + case .bronx: return "home turf · shark & bank" + case .ghetto: return "heroin & \(sim.displayName(.speed).lowercased()) run cheap" + case .park: return "acid & weed run cheap" + case .manhattan: return "rich buyers pay top dollar" + case .coney: return "everything cheap & sleepy" + case .brooklyn: return "fences pay over market" + } + } + + private func buildRideSheet() { + dimLayer(0.5) + let rect = sheetCard(height: 478) + sheetLabel("TAKE THE SUBWAY", font: "AvenirNext-Heavy", size: 19, color: .white, + x: rect.midX, y: rect.maxY - 32) + sheetLabel("A ride burns a day: debt +10%, bank +6%", font: "Menlo", size: 11, + color: Palette.white70, x: rect.midX, y: rect.maxY - 58) + + for (i, loc) in DopeWarsSim.Location.allCases.enumerated() { + let here = sim.location == loc + let y = rect.maxY - 114 - CGFloat(i) * 52 + let title = here ? "\(loc.name.uppercased()) (HERE)" : loc.name.uppercased() + let button = sheetButton("dest.\(loc.rawValue)", title, color: Palette.cyan, + rect: CGRect(x: rect.minX + 22, y: y, width: rect.width - 44, height: 44), + fontSize: 13, sub: boroughCaption(loc)) + if here { button.alpha = 0.45 } + } + sheetButton("sheet.cancel", "CANCEL", color: Palette.white40, + rect: CGRect(x: rect.minX + 22, y: rect.minY + 14, width: rect.width - 44, height: 40), fontSize: 13) + } + + private func buildSharkSheet() { + dimLayer(0.5) + let rect = sheetCard(height: 268) + sheetLabel("LOAN SHARK", font: "AvenirNext-Heavy", size: 20, color: .white, + x: rect.midX, y: rect.maxY - 32) + sheetLabel("Debt \(money(sim.debt)) · Cash \(money(sim.wallet))", + font: "Menlo-Bold", size: 13, color: Palette.red, x: rect.midX, y: rect.maxY - 62) + let bw = rect.width - 44 + sheetButton("shark.repay", "REPAY DEBT", color: Palette.mint, + rect: CGRect(x: rect.minX + 22, y: rect.midY - 8, width: bw, height: 48)) + sheetButton("shark.borrow", "BORROW (UP TO $5,000)", color: Palette.amber, + rect: CGRect(x: rect.minX + 22, y: rect.midY - 66, width: bw, height: 48), fontSize: 13) + sheetButton("sheet.cancel", "CANCEL", color: Palette.white40, + rect: CGRect(x: rect.minX + 22, y: rect.minY + 14, width: bw, height: 40), fontSize: 13) + } + + private func buildBankSheet() { + dimLayer(0.5) + let rect = sheetCard(height: 268) + sheetLabel("BANK", font: "AvenirNext-Heavy", size: 20, color: .white, + x: rect.midX, y: rect.maxY - 32) + sheetLabel("Balance \(money(sim.bank)) · +6% every day", + font: "Menlo-Bold", size: 13, color: Palette.mint, x: rect.midX, y: rect.maxY - 62) + let bw = rect.width - 44 + sheetButton("bank.deposit", "DEPOSIT", color: Palette.mint, + rect: CGRect(x: rect.minX + 22, y: rect.midY - 8, width: bw, height: 48)) + sheetButton("bank.withdraw", "WITHDRAW", color: Palette.amber, + rect: CGRect(x: rect.minX + 22, y: rect.midY - 66, width: bw, height: 48)) + sheetButton("sheet.cancel", "CANCEL", color: Palette.white40, + rect: CGRect(x: rect.minX + 22, y: rect.minY + 14, width: bw, height: 40), fontSize: 13) + } + + private func buildConfirmEndSheet() { + dimLayer(0.55) + let rect = sheetCard(height: 210) + sheetLabel(sim.monthLen == Int.max ? "End the run and count your money?" + : "End the month early and get scored?", + font: "AvenirNext-DemiBold", size: 16, + color: .white, x: rect.midX, y: rect.midY + 34, maxWidth: rect.width - 44) + let bw = (rect.width - 60) / 2 + sheetButton("end.yes", "END GAME", color: Palette.red, + rect: CGRect(x: rect.minX + 22, y: rect.minY + 20, width: bw, height: 48), fontSize: 13) + sheetButton("sheet.cancel", "KEEP PLAYING", color: Palette.mint, + rect: CGRect(x: rect.maxX - 22 - bw, y: rect.minY + 20, width: bw, height: 48), fontSize: 12) + } + + private func buildGameOverSheet() { + dimLayer(0.66) + let cx = size.width / 2 + let midY = size.height * 0.58 + + let (title, color): (String, UIColor) + switch sim.endCause { + case .monthOver: (title, color) = ("MONTH OVER", Palette.mint) + case .quit: (title, color) = ("CASHED OUT", .white) + case .gunnedDown: (title, color) = ("GUNNED DOWN", Palette.red) + case .badTrip: (title, color) = ("BAD TRIP", Palette.violet) + case .sharkCollected: (title, color) = ("THE SHARK COLLECTED", Palette.red) + case nil: (title, color) = ("GAME OVER", .white) + } + let glow = SceneArt.glowSprite(color: color, radius: 130) + glow.position = CGPoint(x: cx, y: midY + 96) + glow.alpha = 0.4 + sheet.addChild(glow) + sheetLabel(title, font: "AvenirNext-Heavy", size: 28, color: color, x: cx, y: midY + 96, + maxWidth: size.width - 60) + + sheetLabel("NET WORTH", font: "Menlo-Bold", size: 13, color: Palette.white40, x: cx, y: midY + 52) + sheetLabel(money(sim.finalNet), font: "AvenirNext-Heavy", size: 40, + color: sim.finalNet < 0 ? Palette.red : Palette.mint, x: cx, y: midY + 12) + sheetLabel("CASH + BANK − DEBT", font: "Menlo", size: 11, color: Palette.white40, + x: cx, y: midY - 24) + if sim.monthLen == Int.max { + sheetLabel("ENDLESS RUN · NOT SCORED", font: "Menlo-Bold", size: 13, + color: Palette.white40, x: cx, y: midY - 56) + } else { + sheetLabel("BEST \(money(HighScoreStore.shared.best("dopewars")))", + font: "Menlo-Bold", size: 13, color: .white, x: cx, y: midY - 56) + if newRecord { + sheetLabel("★ NEW BEST ★", font: "Menlo-Bold", size: 14, color: Palette.amber, + x: cx, y: midY - 84) + } + } + tapPrompt("TAP TO PLAY AGAIN", x: cx, y: midY - 126) + } + + // MARK: - Run control + + private func startRun() { + sim = DopeWarsSim(monthLen: chosenLen) + cardQueue.removeAll() + scoreSubmitted = false + newRecord = false + qty = 0 + prevPrices = [] + lastTierShown = 0 + lastWalletShown = Int.min + syncFromSim() // day 1 already rolled — may open with an event + } + + // MARK: - Touch handling + + override func touchesBegan(_ touches: Set, with event: UIEvent?) { + guard let touch = touches.first else { return } + let p = touch.location(in: self) + + switch mode { + case .ready: + if let key = hitKey(at: p), key.hasPrefix("len.") { + chosenLen = Int(key.dropFirst(4)) ?? 30 + UserDefaults.standard.set(chosenLen, forKey: "dopewars.monthLen") + Haptics.selection() + applyMode() // repaint the picker + bullets + return + } + Haptics.selection() + startRun() + + case .board: + handleBoardTap(p) + + case .message: + Haptics.selection() + advanceCards() + + case .offer: + if let key = hitKey(at: p) { + Haptics.selection() + sim.answerOffer(yes: key == "offer.yes") + syncFromSim() + } + + case .chase: + if let key = hitKey(at: p) { + Haptics.impact(.medium, intensity: 0.8) + let before = sim.price + if key == "chase.run" { sim.chaseRun() } else { sim.chaseFight() } + if sim.price != before { notePriceMovement(from: before) } // escape reroll + syncFromSim() + } + + case .pickTrade(let item): + switch hitKey(at: p) { + case "pick.buy": qty = 0; setMode(.amount(.buy(item))); Haptics.selection() + case "pick.sell": qty = 0; setMode(.amount(.sell(item))); Haptics.selection() + case "sheet.cancel": setMode(.board); Haptics.selection() + default: break + } + + case .amount(let am): + handleAmountTap(p, am) + + case .keypad(let am): + handleKeypadTap(p, am) + + case .ride: + if let key = hitKey(at: p) { + if key == "sheet.cancel" { setMode(.board); Haptics.selection(); return } + if key.hasPrefix("dest."), let raw = Int(key.dropFirst(5)), + let dest = DopeWarsSim.Location(rawValue: raw) { + Haptics.impact(.light, intensity: 0.6) + let before = sim.price + if sim.ride(to: dest) { + cardQueue.append("Riding the subway…") + notePriceMovement(from: before) + } + syncFromSim() + } + } + + case .shark: + switch hitKey(at: p) { + case "shark.repay": qty = 0; setMode(.amount(.repay)); Haptics.selection() + case "shark.borrow": qty = 0; setMode(.amount(.borrow)); Haptics.selection() + case "sheet.cancel": setMode(.board); Haptics.selection() + default: break + } + + case .bank: + switch hitKey(at: p) { + case "bank.deposit": qty = 0; setMode(.amount(.deposit)); Haptics.selection() + case "bank.withdraw": qty = 0; setMode(.amount(.withdraw)); Haptics.selection() + case "sheet.cancel": setMode(.board); Haptics.selection() + default: break + } + + case .confirmEnd: + switch hitKey(at: p) { + case "end.yes": + sim.quit() + syncFromSim() + case "sheet.cancel": setMode(.board); Haptics.selection() + default: break + } + + case .gameOver: + Haptics.selection() + setMode(.ready) + } + } + + private func hitKey(at p: CGPoint) -> String? { + hitRects.first { $0.rect.insetBy(dx: -6, dy: -6).contains(p) }?.key + } + + private func handleBoardTap(_ p: CGPoint) { + for i in 0..<6 where rowRect(i).contains(p) { + guard let item = DopeWarsSim.Item(rawValue: i) else { continue } + Haptics.selection() + setMode(.pickTrade(item)) + return + } + if actionRect(0).contains(p) { Haptics.selection(); setMode(.ride); return } + if actionRect(1).contains(p) { + Haptics.selection() + if sim.inBronx { setMode(.shark) } else { cardQueue.append("The loan shark works out of the Bronx."); advanceCards() } + return + } + if actionRect(2).contains(p) { + Haptics.selection() + if sim.inBronx { setMode(.bank) } else { cardQueue.append("Your bank branch is in the Bronx…"); advanceCards() } + return + } + if actionRect(3).contains(p) { Haptics.selection(); setMode(.confirmEnd); return } + } + + private func handleAmountTap(_ p: CGPoint, _ am: AmountMode) { + guard let key = hitKey(at: p) else { return } + let limit = amountLimit(am) + switch key { + case "sheet.cancel": + Haptics.selection() + // Money sheets return to their parent menu; trades to the board. + switch am { + case .repay, .borrow: setMode(.shark) + case .deposit, .withdraw: setMode(.bank) + default: setMode(.board) + } + return + case "amt.max": + qty = limit + case "amt.type": + typedAmount = 0 + Haptics.selection() + setMode(.keypad(am)) + return + case "amt.confirm": + confirmAmount(am) + return + default: + guard key.hasPrefix("amt.") else { return } + let body = key.dropFirst(4) + let sign = body.hasPrefix("m") ? -1 : 1 + let step = Int(body.dropFirst()) ?? 0 + qty = max(0, min(limit, qty + sign * step)) + } + Haptics.selection() + updateAmountLabels(am) + } + + private func handleKeypadTap(_ p: CGPoint, _ am: AmountMode) { + guard let key = hitKey(at: p) else { return } + switch key { + case "sheet.cancel": + Haptics.selection() + setMode(.amount(am)) // keep the old qty + case "pad.done": + qty = min(typedAmount, amountLimit(am)) + Haptics.selection() + setMode(.amount(am)) + case "pad.del": + typedAmount /= 10 + Haptics.selection() + updateKeypadValue(am) + default: + guard key.hasPrefix("pad."), let digit = Int(key.dropFirst(4)) else { return } + typedAmount = min(typedAmount * 10 + digit, 999_999_999) + Haptics.selection() + updateKeypadValue(am) + } + } + + private func confirmAmount(_ am: AmountMode) { + let ok: Bool + switch am { + case .buy(let item): ok = sim.buy(item, count: qty) + case .sell(let item): ok = sim.sell(item, count: qty) + case .repay: ok = sim.repay(qty) + case .borrow: ok = sim.borrow(qty) + case .deposit: ok = sim.deposit(qty) + case .withdraw: ok = sim.withdraw(qty) + } + if ok && qty > 0 { Haptics.success() } else { Haptics.selection() } + qty = 0 + syncFromSim() + } + + private func advanceCards() { + if !cardQueue.isEmpty { + setMode(.message(cardQueue.removeFirst())) + } else { + syncFromSim() + } + } +} diff --git a/Arcade85/Games/DopeWars/DopeWarsSim.swift b/Arcade85/Games/DopeWars/DopeWarsSim.swift new file mode 100644 index 0000000..4d01042 --- /dev/null +++ b/Arcade85/Games/DopeWars/DopeWarsSim.swift @@ -0,0 +1,628 @@ +import Foundation + +/// The classic "Drug Wars" (John E. Dell, 1984) — one month on the New York +/// streets: $2,000 in cash, $5,500 owed to the loan shark, a 100-pocket trench +/// coat, and the subway between six boroughs. Buy low, sell high, and settle up. +/// +/// The engine is the verbatim TI-85 port of Joey Gannon's NerdWars (2000), +/// which turned out to be Dell's game with the serial numbers filed off — its +/// BASIC kept Dell's item variables C,H,A,W,S,L (Cocaine, Heroin, Acid, Weed, +/// Speed, Ludes) and merely rescaled the price bands. This restores the classic +/// setup: Dell's six drugs at their iconic prices, the Bronx as home base +/// (loan shark + bank), Officer Hardass on your tail, $400 guns and $200 +/// trench coats. Interest (debt 10%/day, bank 6%/day), the 0…20 daily event +/// roll, chase/punch mechanics, and √(net ÷ 31.5) scoring are untouched. +/// +/// Quirks kept from the source engine: +/// - The dead-dude giveaway rolls int(rand*5) = 0…4 over the cheap-to-dear +/// item order, so you can never find free cocaine. +/// - Smoking the weed you find on the sidewalk (event 14) is always fatal. +/// - Day-31 arrival ends the month with no final price roll. +/// Quirk dropped with the re-theme: NerdWars matched trade items BY PRICE +/// (`If F==C …`), a bug that could fill or empty several pockets at once. +/// Trading here is by item, the way Dell's original worked. +/// +/// Remake extension — the market grows with you. Below $100k net worth the +/// game is exactly the classic. Cross $100k and word gets around: the ludes +/// slot retires (any stock is bought out at yesterday's price) and METH moves +/// in at $2,000–16,000 — the widest swing on the board. Cross $1M and the +/// speed slot retires for CHINA WHITE at $40,000–160,000, the whale product +/// that dwarfs even a cocaine spike. Tier shifts are one-way, checked on +/// arrival, and bring their own events (meth lab bust/superlab glut, cartel +/// dock flood) on formerly idle rolls of the 0…20 event table. +/// +/// Remake extensions, round 5 — the streets get real: +/// - **Borough economies**: each borough multiplies the daily band rolls +/// (the Bronx is the neutral reference; event prices are absolute news and +/// ignore the bias). Heroin runs cheap in the Ghetto, acid and weed in the +/// Park, everything's sleepy-cheap on Coney, Manhattan's buyers pay up, +/// Brooklyn's fences pay a little over. +/// - **Word on the street**: some days a tip names a product and a borough +/// for tomorrow — ride there and find out if it was good (×3 spike, ÷3 +/// glut) or street garbage (~1 in 4). Rumors and shark muscle roll on a +/// SEPARATE rng stream, so classic price/event sequences per seed are +/// untouched. +/// - **The shark collects**: run a tab of $15,000+ past day 10 and you get +/// one warning; after that his leg-breakers find you — the classic chase +/// engine with the shark's collection money as the prize and a nastier +/// ending if they put you down. +/// - **Month lengths**: 30/60/90 days, or endless (no clock, no leaderboard; +/// debt and bank interest cap at $999,999,999,999 so long runs stay sane). +struct DopeWarsSim { + + // MARK: Items & locations + + /// Dell's C,H,A,W,S,L — priciest to cheapest. + enum Item: Int, CaseIterable { + case cocaine = 0, heroin, acid, weed, speed, ludes + + var name: String { + switch self { + case .cocaine: return "Cocaine" + case .heroin: return "Heroin" + case .acid: return "Acid" + case .weed: return "Weed" + case .speed: return "Speed" + case .ludes: return "Ludes" + } + } + /// Lowercase form used by the dead-dude loot message. + var lootName: String { name.lowercased() } + } + + /// The subway map. Mechanically the original only distinguishes the Bronx + /// (loan shark + bank) from everywhere else, but the boroughs are the game. + enum Location: Int, CaseIterable { + case bronx = 0, ghetto, park, manhattan, coney, brooklyn + var name: String { + ["Bronx", "Ghetto", "Central Park", "Manhattan", "Coney Island", "Brooklyn"][rawValue] + } + } + + // MARK: Interaction model + + enum Offer: Equatable { + case coat // +10 pockets for $200 + case gun(String) // $400, takes 5 pockets + case weed // smoking it is fatal + case doctor // $1000 clears all wounds + } + + enum EndCause: Equatable { case monthOver, quit, gunnedDown, badTrip, sharkCollected } + + enum Phase: Equatable { case trading, offer(Offer), chase, gameOver } + + /// A next-day tip: a product, a borough, and whether the street was right. + struct Rumor: Equatable { + let slot: Int + let location: Location + let dayDue: Int + let isSpike: Bool + let isTrue: Bool + } + + /// Percent price multipliers per borough (rows follow `Location` order), + /// applied to the daily band rolls. The Bronx is the neutral reference + /// market; event prices are absolute news and ignore the bias. + static let boroughBias: [[Int]] = [ + [100, 100, 100, 100, 100, 100], // Bronx — home turf + [ 95, 75, 90, 100, 85, 90], // Ghetto — heroin & speed country + [105, 110, 75, 80, 100, 95], // Central Park — acid & weed run cheap + [130, 115, 110, 115, 110, 110], // Manhattan — rich buyers pay up + [ 90, 95, 95, 85, 90, 80], // Coney Island — sleepy boardwalk prices + [110, 105, 105, 105, 105, 105], // Brooklyn — fences pay over market + ] + + // MARK: State (original BASIC variable in comments) + + private(set) var wallet = 2000 // Z + private(set) var debt = 5500 // Y — the classic's $5,500 + private(set) var bank = 0 // V + private(set) var day = 1 // B (reaching 31 ends the game) + private(set) var coatTotal = 100 // T + private(set) var coatFree = 100 // K = T − ΣMNOPQR + private(set) var guns = 0 // I + private(set) var wounds = 0 // J (50 = death) + private(set) var location: Location = .bronx // home flag: 2 home / 1 away + private(set) var price = [Int](repeating: 0, count: 6) // C H A W S L + private(set) var held = [Int](repeating: 0, count: 6) // M N O P Q R + private(set) var chaseCops = 0 // D deputies; −1 ⇔ all down + private(set) var phase: Phase = .trading + /// Market tier — 1 classic, 2 (net ≥ $100k) meth replaces ludes, + /// 3 (net ≥ $1M) China White replaces speed. One-way per run. + private(set) var tier = 1 + /// Round-5 extension state. + private(set) var rumor: Rumor? + private(set) var sharkChase = false // current chase is leg-breakers + private var sharkWarned = false + private var lastSharkDay = 0 + /// Days in the month; `Int.max` = endless (never ends on its own). + let monthLen: Int + /// Interstitial texts, shown one per tap like the original's Pause screens. + private(set) var messages: [String] = [] + private(set) var finalScore = 0 + private(set) var finalNet = 0 + private(set) var endCause: EndCause? + + var inBronx: Bool { location == .bronx } + var totalHeld: Int { held.reduce(0, +) } + var netWorth: Int { bank + wallet - debt } + + /// What a market slot is called at the current tier: the ludes slot deals + /// meth from tier 2, the speed slot deals China White from tier 3. + func displayName(_ item: Item) -> String { + switch item { + case .ludes where tier >= 2: return "Meth" + case .speed where tier >= 3: return "China White" + default: return item.name + } + } + func lootName(_ item: Item) -> String { displayName(item).lowercased() } + + var offerPrompt: String? { + guard case .offer(let offer) = phase else { return nil } + switch offer { + case .coat: return "Will you buy a new trench coat with more pockets for $200?" + case .gun(let name): return "Will you buy \(name)?" + case .weed: return "There's some weed on the sidewalk that smells like good stuff. Will you smoke it?" + case .doctor: return "Will you pay $1000 for a doctor to sew you up?" + } + } + + private var rng: SeededGenerator + /// Separate stream for the round-5 extras (rumors, shark muscle) so the + /// classic price/event sequence per seed stays byte-identical. + private var extRng: SeededGenerator + + init(seed: UInt64? = nil, monthLen: Int = 30) { + let s = seed ?? UInt64.random(in: 1...UInt64.max) + rng = SeededGenerator(seed: s) + extRng = SeededGenerator(seed: s ^ 0x5EED_0FF5) + self.monthLen = monthLen <= 0 ? Int.max : monthLen + rollDay() // G8 runs before the first menu + } + + /// TI-85 `rand`: uniform in [0, 1). + private mutating func rand() -> Double { + #if DEBUG + if !debugForcedRolls.isEmpty { return debugForcedRolls.removeFirst() } + #endif + return Double(rng.next() >> 11) * 0x1.0p-53 + } + + /// Extension-stream uniform in [0, 1) — see `extRng`. + private mutating func extRand() -> Double { + #if DEBUG + if !debugExtForcedRolls.isEmpty { return debugExtForcedRolls.removeFirst() } + #endif + return Double(extRng.next() >> 11) * 0x1.0p-53 + } + + // MARK: - Day roll (Lbl G8) + + /// Fresh prices at the tier's bands, then the day's 0…20 event roll + /// (most values do nothing). Roll shapes mirror the BASIC's ×100/×10 + /// quantisation for the cheaper drugs. One rand() per slot at every tier, + /// so classic (tier 1) runs stay roll-for-roll identical to the original. + private mutating func rollDay() { + checkMarketShift() + price[Item.cocaine.rawValue] = Int((rand() * 15000 + 15000).rounded()) // 15000…30000 + price[Item.heroin.rawValue] = Int((rand() * 9000 + 5000).rounded()) // 5000…14000 + price[Item.acid.rawValue] = Int((rand() * 35 + 10).rounded()) * 100 // 1000…4500 + price[Item.weed.rawValue] = Int((rand() * 60 + 30).rounded()) * 10 // 300…900 + price[Item.speed.rawValue] = tier >= 3 + ? Int((rand() * 1200 + 400).rounded()) * 100 // CW: 40000…160000 + : Int((rand() * 16 + 9).rounded()) * 10 // 90…250 + price[Item.ludes.rawValue] = tier >= 2 + ? Int((rand() * 140 + 20).rounded()) * 100 // meth: 2000…16000 + : Int((rand() * 5 + 1).rounded()) * 10 // 10…60 + let bias = Self.boroughBias[location.rawValue] + for i in 0..<6 { price[i] = max(1, price[i] * bias[i] / 100) } + resolveRumor() + applyEvent(Int((rand() * 20).rounded())) + if phase == .trading { sharkPressure() } + if phase == .trading { maybeSpawnRumor() } + } + + // MARK: - Word on the street (remake extension) + + /// A due rumor pays out (or doesn't) only if you actually rode to the + /// named borough; ride anywhere else and it just expires unverified. + private mutating func resolveRumor() { + guard let r = rumor, day >= r.dayDue else { return } + rumor = nil + guard day == r.dayDue, location == r.location else { return } + let name = displayName(Item(rawValue: r.slot)!) + if !r.isTrue { + messages.append("The word was garbage. \(name) is trading like any other day.") + } else if r.isSpike { + price[r.slot] *= 3 + messages.append("The word was good — \(name) is going crazy here today!!") + } else { + price[r.slot] = max(1, price[r.slot] / 3) + messages.append("The word was good — \(name) is practically free here today!") + } + } + + private mutating func maybeSpawnRumor() { + guard rumor == nil, day < monthLen else { return } + guard extRand() < 0.35 else { return } + let slot = min(5, Int(extRand() * 6)) + let loc = Location(rawValue: min(5, Int(extRand() * 6)))! + let spike = extRand() < 0.5 + let isTrue = extRand() < 0.75 + rumor = Rumor(slot: slot, location: loc, dayDue: day + 1, isSpike: spike, isTrue: isTrue) + let name = displayName(Item(rawValue: slot)!).lowercased() + messages.append(spike + ? "Word on the street: \(name) is about to go scarce in \(loc.name) — tomorrow it pays." + : "Word on the street: a big load of \(name) hits \(loc.name) tomorrow — prices'll tank.") + } + + // MARK: - The shark collects (remake extension) + + /// Run a $15k+ tab past day 10 and the shark sends people: one warning, + /// then a 30%-per-arrival chance his two leg-breakers jump you — the + /// classic chase engine with nastier stakes. + private mutating func sharkPressure() { + guard debt >= 15_000, day >= 10, day != lastSharkDay else { return } + if !sharkWarned { + sharkWarned = true + lastSharkDay = day + messages.append("A kid runs up: \"The shark says your tab's a problem. Square it, or his boys will.\"") + return + } + guard extRand() < 0.30 else { return } + lastSharkDay = day + sharkChase = true + chaseCops = 1 // two goons; D counts down to −1 + messages.append("Two of the loan shark's leg-breakers step out of a doorway!!") + phase = .chase + } + + /// One-way tier promotion, checked as a day begins. Retiring a slot buys + /// out any stock at yesterday's price — the collector always pays. + private mutating func checkMarketShift() { + if tier < 2, netWorth >= 100_000 { + tier = 2 + messages.append("Word on the street: you're a heavy roller now. Nobody wants ludes anymore — but a new product called METH is moving, and it moves big.") + liquidate(.ludes, calledAs: "ludes") + } + if tier < 3, netWorth >= 1_000_000 { + tier = 3 + messages.append("Word is out: you're a millionaire. Speed is small-time — the cartel wants a buyer for CHINA WHITE. Pure, scarce, priced like it.") + liquidate(.speed, calledAs: "speed") + } + } + + private mutating func liquidate(_ item: Item, calledAs name: String) { + let n = held[item.rawValue] + guard n > 0 else { return } + let payout = price[item.rawValue] * n + wallet += payout + held[item.rawValue] = 0 + recomputeFree() + messages.append("A collector bought out your \(n) units of \(name) for $\(payout). That market is done.") + } + + private mutating func applyEvent(_ d: Int) { + switch d { + case 1: + if tier >= 2 { + // The ludes slot deals meth now — its crash event becomes a spike. + messages.append("A meth lab blew up in Jersey! Local product is suddenly precious!!") + price[Item.ludes.rawValue] = Int(30000 + rand() * 18000) // 30000…47999 + } else { + messages.append("Rival dealers raided a pharmacy and are selling cheap ludes!!") + price[Item.ludes.rawValue] = 2 + } + case 2: + messages.append("The market has been flooded with cheap home-grown weed!") + price[Item.weed.rawValue] = 122 + case 3: + messages.append("The market has been flooded with cheap heroin!") + price[Item.heroin.rawValue] = Int(850 + rand() * 1150) // 850…1999 + case 4, 5: + messages.append("Cops made a big bust! Heroin prices are outrageous!") + price[Item.heroin.rawValue] = Int(18000 + rand() * 25000) // 18000…42999 + case 6, 7: + messages.append("Addicts are buying cocaine at outrageous prices!") + price[Item.cocaine.rawValue] = Int(80000 + rand() * 60000) // 80000…139999 + case 8: + messages.append("You were mugged in the subway!") + wallet = (wallet / 3) * 2 // int(Z/3) then ×2 — keep ~2/3 + case 9, 10, 11: + guard totalHeld >= 50 else { return } // big carriers draw the heat + chaseCops = d == 9 ? 1 : (d == 10 ? 3 : 4) + messages.append("Officer Hardass and \(chaseCops) of his deputies are chasing you!!") + phase = .chase + case 12, 13: + guard wallet >= 500, coatFree >= 5 else { return } + let names = ["a $400 Baretta", "a $400 .38 Special", "a $400 Saturday Night Special"] + phase = .offer(.gun(names[Int((rand() * 2).rounded())])) + case 14: + phase = .offer(.weed) + case 15: + guard wallet >= 300 else { return } + phase = .offer(.coat) + case 16: + guard coatFree >= 8 else { return } + let f = Int(rand() * 7 + 1) // 1…7 units + let items: [Item] = [.ludes, .speed, .weed, .acid, .heroin, .cocaine] + let item = items[Int(rand() * 5)] // 0…4 — cocaine unreachable + held[item.rawValue] += f + recomputeFree() + messages.append("You found \(f) units of \(lootName(item)) on a dead dude in the subway!") + case 17: + messages.append("The market has been flooded with cheap home-made acid!") + price[Item.acid.rawValue] = Int(250 + rand() * 550) // 250…799 + case 18: + guard tier >= 3 else { return } // idle roll in the classic game + messages.append("The cartel flooded the docks! China White is going for nothing!!") + price[Item.speed.rawValue] = Int(8000 + rand() * 12000) // 8000…19999 + case 19: + guard tier >= 2 else { return } // idle roll in the classic game + messages.append("A superlab upstate dumped its stock — meth is dirt cheap!!") + price[Item.ludes.rawValue] = Int(400 + rand() * 600) // 400…999 + default: + break // 0, 20 and gated rolls + } + } + + private mutating func recomputeFree() { // (T−M−N−O−P−Q−R)→K + coatFree = coatTotal - totalHeld + } + + // MARK: - Trading + + /// int(Z/F): how many the wallet covers at today's price. + func affordable(_ item: Item) -> Int { + let f = price[item.rawValue] + return f > 0 ? wallet / f : 0 + } + + func sellable(_ item: Item) -> Int { + held[item.rawValue] + } + + @discardableResult + mutating func buy(_ item: Item, count: Int) -> Bool { + guard phase == .trading, messages.isEmpty, count >= 0 else { return false } + guard count <= coatFree, count <= affordable(item) else { return false } + wallet -= price[item.rawValue] * count + held[item.rawValue] += count + recomputeFree() + return true + } + + @discardableResult + mutating func sell(_ item: Item, count: Int) -> Bool { + guard phase == .trading, messages.isEmpty, count >= 0 else { return false } + guard count <= sellable(item) else { return false } + held[item.rawValue] -= count + wallet += price[item.rawValue] * count + recomputeFree() + return true + } + + // MARK: - The subway (Lbl G5/S) + + /// Rides to a borough: day advances, debt grows 10%, bank grows 6% + /// (int-truncated exactly like the calculator's decimal arithmetic), then + /// either the month ends or a fresh day is rolled. Returns false for + /// "You're already in the Bronx!". + @discardableResult + mutating func ride(to destination: Location) -> Bool { + guard phase == .trading, messages.isEmpty else { return false } + if destination == .bronx && inBronx { + messages.append("You're already in the Bronx!") + return false + } + location = destination + day += 1 + // int(Y*1.1) / int(V*1.06), capped so endless runs can't overflow. + debt = min(debt * 11 / 10, 999_999_999_999) + bank = min(bank * 106 / 100, 999_999_999_999) + if day > monthLen { endGame(.monthOver) } else { rollDay() } + return true + } + + // MARK: - Loan shark (Lbl G6) & bank (Lbl G7) — Bronx only + + @discardableResult + mutating func repay(_ amount: Int) -> Bool { + guard phase == .trading, messages.isEmpty, inBronx else { return false } + guard amount >= 0, amount <= wallet, amount <= debt else { return false } + debt -= amount + wallet -= amount + return true + } + + /// The shark fronts at most $5,000 per visit. + @discardableResult + mutating func borrow(_ amount: Int) -> Bool { + guard phase == .trading, messages.isEmpty, inBronx else { return false } + guard amount >= 0, amount <= 5000 else { return false } + debt += amount + wallet += amount + return true + } + + @discardableResult + mutating func deposit(_ amount: Int) -> Bool { + guard phase == .trading, messages.isEmpty, inBronx else { return false } + guard amount >= 0, amount <= wallet else { return false } + bank += amount + wallet -= amount + return true + } + + @discardableResult + mutating func withdraw(_ amount: Int) -> Bool { + guard phase == .trading, messages.isEmpty, inBronx else { return false } + guard amount >= 0, amount <= bank else { return false } + bank -= amount + wallet += amount + return true + } + + // MARK: - Offers + + mutating func answerOffer(yes: Bool) { + guard case .offer(let offer) = phase, messages.isEmpty else { return } + phase = .trading + guard yes else { return } // every "No" path just continues + switch offer { + case .coat: + coatTotal += 10 // (T+10)→T + recomputeFree() + wallet -= 200 + case .gun: + guns += 1 // (I+1)→I + wallet -= 400 + coatTotal -= 5 // a gun costs 5 pockets + recomputeFree() + case .weed: + messages.append("You hallucinated for three days on the wildest trip of your life.") + messages.append("Then you wandered onto the tracks at 42nd Street. Game over, dealer.") + endGame(.badTrip) + case .doctor: + wallet -= 1000 + wounds = 0 + } + } + + // MARK: - The chase (Lbl M/K/L/O/N) + + /// 50/50: lose them in an alley (fresh G8 roll — new prices, possibly a + /// new event) or fail and take a fire round. + mutating func chaseRun() { + guard phase == .chase, messages.isEmpty else { return } + if Int(rand().rounded()) == 0 { + messages.append("You lost them in an alley!") + sharkChase = false + phase = .trading + rollDay() + } else { + messages.append("You can't shake them!") + fireRound() + } + } + + /// Needs a gun; 50/50 miss or drop one deputy. Either way (unless the last + /// one falls) they answer with a fire round, exactly like the original's + /// fall-through to Lbl O. + mutating func chaseFight() { + guard phase == .chase, messages.isEmpty else { return } + guard guns > 0 else { + messages.append("You don't have any guns! You have to run!") + return + } + if Int(rand().rounded()) == 0 { + messages.append("You missed!!!") + } else { + chaseCops -= 1 + messages.append("You dropped one!!!") + if chaseCops == -1 { // If D==(−1) Goto N + chaseVictory() + return + } + } + fireRound() + } + + private mutating func fireRound() { + if Int(rand().rounded()) == 0 { + messages.append("They're firing at you! They missed!!!") + } else { + wounds += 3 + messages.append("They're firing at you! You've been hit!") + if wounds >= 50 { + if sharkChase { + messages.append("The shark collected — in blood.") + endGame(.sharkCollected) + } else { + messages.append("They wasted you, man!!!") + endGame(.gunnedDown) + } + } + } + } + + private mutating func chaseVictory() { + if sharkChase { + sharkChase = false + let loot = Int(rand() * 500 + 250) // 250…749 collection money + wallet += loot + messages.append("You took them both down!!!") + messages.append("You found $\(loot) of the shark's collection money. He won't forget this.") + phase = wallet >= 1200 ? .offer(.doctor) : .trading + return + } + let loot = Int(rand() * 1250 + 750) // 750…1999 + wallet += loot + messages.append("You took them all down!!!") + messages.append("You found $\(loot) on Officer Hardass's body.") + phase = wallet >= 1200 ? .offer(.doctor) : .trading + } + + // MARK: - Ending (Lbl C) + + mutating func quit() { + guard phase == .trading, messages.isEmpty else { return } + endGame(.quit) + } + + /// Score = √((bank + wallet − debt) / 31.5), floored at 0 and capped at + /// 100 — so a perfect 100 takes a net worth of $315,000. + private mutating func endGame(_ cause: EndCause) { + let net = bank + wallet - debt + finalNet = net + finalScore = net < 0 ? 0 : min(100, Int((Double(net) / 31.5).squareRoot().rounded())) + endCause = cause + phase = .gameOver + } + + // MARK: - Message queue (the original's Pause screens) + + mutating func popMessage() -> String? { + messages.isEmpty ? nil : messages.removeFirst() + } + + // MARK: - Debug hooks + + #if DEBUG + /// Values consumed by `rand()` before the real generator — lets tests force + /// specific 50/50 outcomes and price rolls. + var debugForcedRolls: [Double] = [] + /// Same, for the extension stream (rumor spawn, shark pressure chance). + var debugExtForcedRolls: [Double] = [] + + mutating func debugSetRumor(slot: Int, location: Location, dayDue: Int, + isSpike: Bool, isTrue: Bool) { + rumor = Rumor(slot: slot, location: location, dayDue: dayDue, + isSpike: isSpike, isTrue: isTrue) + } + mutating func debugTriggerShark() { + sharkChase = true + chaseCops = 1 + messages.append("Two of the loan shark's leg-breakers step out of a doorway!!") + phase = .chase + } + mutating func debugClearRumor() { rumor = nil } + + mutating func debugSetWallet(_ v: Int) { wallet = v } + mutating func debugSetDebt(_ v: Int) { debt = v } + mutating func debugSetBank(_ v: Int) { bank = v } + mutating func debugSetDay(_ v: Int) { day = v } + mutating func debugSetGuns(_ v: Int) { guns = v } + mutating func debugSetWounds(_ v: Int) { wounds = v } + mutating func debugSetCoatTotal(_ v: Int) { coatTotal = v; recomputeFree() } + mutating func debugSetLocation(_ l: Location) { location = l } + mutating func debugSetPrice(_ item: Item, _ v: Int) { price[item.rawValue] = v } + mutating func debugSetTier(_ t: Int) { tier = min(3, max(1, t)) } + mutating func debugSetHeld(_ item: Item, _ v: Int) { held[item.rawValue] = v; recomputeFree() } + mutating func debugApplyEvent(_ d: Int) { applyEvent(d) } + mutating func debugRollDay() { rollDay() } + mutating func debugClearMessages() { messages.removeAll() } + #endif +} diff --git a/Arcade85/Games/Galaxian/GalaxianData.swift b/Arcade85/Games/Galaxian/GalaxianData.swift new file mode 100644 index 0000000..490cfa7 --- /dev/null +++ b/Arcade85/Games/Galaxian/GalaxianData.swift @@ -0,0 +1,229 @@ +import Foundation + +/// Static data for Galaxian, transcribed verbatim from `GALAXIAN.ASM` +/// (Patrick Davidson, v3.0, 1998): every sprite bitmap, the six formation +/// patterns, and the 20-level campaign table. +enum GalaxianData { + + // MARK: - Sprites + + /// A 1-bit sprite. `rows[i]` holds row `i` with bit 31 as the leftmost + /// pixel (the ASM's row bytes packed big-endian, as drawn by `drw_spr`). + struct Sprite { + let w: Int + let h: Int + let rows: [UInt32] + + init(_ w: Int, _ h: Int, _ byteRows: [[UInt8]]) { + self.w = w + self.h = h + self.rows = byteRows.map { bytes in + var v: UInt32 = 0 + for (i, b) in bytes.enumerated() { v |= UInt32(b) << (24 - 8 * i) } + return v + } + } + } + + enum Img: Hashable { + case enemy1, enemy2, enemy3, enemy4, cross, operatorShip + case boss1, boss2, boss3 + case ship, playerBullet, enemyBullet + case x1, x2, x3, x4, x5, x6, x7, x8 // explosion frames + } + + static let explosionFrames: [Img] = [.x1, .x2, .x3, .x4, .x5, .x6, .x7, .x8] + + static let sprites: [Img: Sprite] = [ + // enemy_warped (the "cross" trainer) + .cross: Sprite(7, 7, [ + [0b1100_0110], [0b1110_1110], [0b0111_1100], [0b0011_1000], + [0b0111_1100], [0b1110_1110], [0b1100_0110], + ]), + .enemy1: Sprite(6, 6, [ + [0b1000_0100], [0b1000_0100], [0b1111_1100], [0b1111_1100], + [0b0111_1000], [0b0011_0000], + ]), + .enemy2: Sprite(6, 7, [ + [0b1000_0100], [0b1100_1100], [0b1111_1100], [0b1000_0100], + [0b1000_0100], [0b0100_1000], [0b0011_0000], + ]), + .enemy3: Sprite(6, 5, [ + [0b1000_0100], [0b1111_1100], [0b1000_0100], [0b0100_1000], + [0b0011_0000], + ]), + .enemy4: Sprite(7, 5, [ + [0b1000_0010], [0b1100_0110], [0b1010_1010], [0b1001_0010], + [0b1000_0010], + ]), + .operatorShip: Sprite(7, 7, [ + [0b0111_1100], [0b1111_1110], [0b1100_0110], [0b1100_0110], + [0b1100_0110], [0b1111_1110], [0b0111_1100], + ]), + .boss1: Sprite(16, 8, [ + [0b1000_0000, 0b0000_0001], [0b1100_0000, 0b0000_0011], + [0b1011_1111, 0b1111_1101], [0b1000_0001, 0b1000_0001], + [0b1000_0001, 0b1000_0001], [0b0100_0001, 0b1000_0010], + [0b0010_0001, 0b1000_0100], [0b0001_1111, 0b1111_1000], + ]), + .boss2: Sprite(16, 8, [ + [0b1111_1111, 0b1111_1111], [0b1110_0000, 0b0000_0111], + [0b1110_0000, 0b0000_0111], [0b1110_0000, 0b0000_0111], + [0b1110_0000, 0b0000_0111], [0b1111_0000, 0b0000_1111], + [0b1110_1000, 0b0001_0111], [0b0100_0111, 0b1110_0010], + ]), + .boss3: Sprite(31, 8, [ + [0b1111_1111, 0b1111_1111, 0b1111_1111, 0b1111_1110], + [0b1010_1000, 0b0000_0000, 0b0000_0000, 0b0010_1010], + [0b1010_1001, 0b0101_0101, 0b0101_0101, 0b0010_1010], + [0b1010_1000, 0b0000_0000, 0b0000_0000, 0b0010_1010], + [0b1010_1000, 0b0000_0111, 0b1100_0000, 0b0010_1010], + [0b1000_1111, 0b1100_0010, 0b1000_0111, 0b1110_0010], + [0b0101_0000, 0b0010_0001, 0b0000_1000, 0b0001_0100], + [0b0010_0000, 0b0001_1111, 0b1111_0000, 0b0000_1000], + ]), + .enemyBullet: Sprite(3, 3, [ + [0b0100_0000], [0b1110_0000], [0b0100_0000], + ]), + .playerBullet: Sprite(3, 5, [ + [0b0100_0000], [0b1110_0000], [0b1110_0000], [0b1110_0000], + [0b1110_0000], + ]), + .ship: Sprite(7, 7, [ + [0b0001_0000], [0b0011_1000], [0b1011_1010], [0b1011_1010], + [0b1011_1010], [0b1111_1110], [0b1111_1110], + ]), + .x1: Sprite(8, 6, [ + [0b0000_0000], [0b0001_1100], [0b0011_1110], [0b0101_0110], + [0b0011_1000], [0b0000_0000], + ]), + .x2: Sprite(8, 6, [ + [0b0011_0000], [0b0100_1110], [0b1011_1110], [0b0100_1111], + [0b0011_1000], [0b0001_1010], + ]), + .x3: Sprite(8, 6, [ + [0b1111_0011], [0b0100_1110], [0b1011_0101], [0b0100_0101], + [0b0011_1110], [0b1101_1010], + ]), + .x4: Sprite(8, 6, [ + [0b1111_0011], [0b0100_1110], [0b1011_0101], [0b0100_0101], + [0b0011_1110], [0b1101_1010], + ]), + .x5: Sprite(8, 6, [ + [0b0100_0001], [0b0010_0110], [0b0001_0101], [0b0100_0100], + [0b0001_0010], [0b1001_1010], + ]), + .x6: Sprite(8, 6, [ + [0b0100_0010], [0b0010_0000], [0b0000_0001], [0b0100_0100], + [0b0010_0010], [0b1000_1010], + ]), + .x7: Sprite(8, 6, [ + [0b0000_1000], [0b1100_0010], [0b0000_0000], [0b0010_0000], + [0b0000_0001], [0b0011_0000], + ]), + .x8: Sprite(8, 6, [ + [0b0000_0100], [0b0000_0000], [0b0100_0000], [0b0000_0000], + [0b0000_0001], [0b0010_0100], + ]), + ] + + // MARK: - Formation patterns + + /// 20 (x, depth) pairs per pattern. The depth byte does double duty in the + /// original: an enemy triggers its entry when `timer & 127 == 128 - depth` + /// and descends 1 px/frame until the timer wraps — arriving at row `depth` + /// exactly on the wrap. + typealias Pattern = [(x: Int, y: Int)] + + static let pattern1: Pattern = [ + (10, 16), (20, 16), (30, 16), (40, 16), (50, 16), + (5, 24), (15, 24), (25, 24), (35, 24), (45, 24), + (50, 32), (10, 32), (20, 32), (30, 32), (40, 32), + (5, 40), (15, 40), (25, 40), (35, 40), (45, 40), + ] + + static let pattern2: Pattern = [ + (1, 16), (14, 16), (27, 16), (40, 16), (53, 16), + (1, 24), (14, 24), (27, 24), (40, 24), (53, 24), + (1, 32), (14, 32), (27, 32), (40, 32), (53, 32), + (1, 40), (14, 40), (27, 40), (40, 40), (53, 40), + ] + + /// Shared by levels 3/7/11/16 (the boss levels): formation sits lower. + static let patternBoss: Pattern = [ + (1, 26), (14, 26), (27, 26), (40, 26), (53, 26), + (1, 34), (14, 34), (27, 34), (40, 34), (53, 34), + (1, 42), (14, 42), (27, 42), (40, 42), (53, 42), + (1, 50), (14, 50), (27, 50), (40, 50), (53, 50), + ] + + /// Shared by the mixed-type levels 4/8/12 (7 + 6 + 7 layout). + static let patternWeak: Pattern = [ + (5, 18), (13, 18), (21, 18), (29, 18), (37, 18), (45, 18), (53, 18), + (9, 28), (17, 28), (25, 28), (33, 28), (41, 28), (49, 28), + (5, 38), (13, 38), (21, 38), (29, 38), (37, 38), (45, 38), (53, 38), + ] + + /// Level 6's ring of enemies. + static let patternRing: Pattern = [ + (53, 28), (52, 32), (48, 35), (42, 38), (35, 39), (27, 40), (19, 39), + (12, 38), (6, 35), (2, 32), (1, 28), (2, 24), (6, 21), (12, 18), + (19, 17), (27, 16), (35, 17), (42, 18), (48, 21), (52, 24), + ] + + /// Levels 10/14: four columns of five. + static let patternColumns: Pattern = [ + (1, 16), (1, 22), (1, 28), (1, 34), (1, 40), + (19, 16), (19, 22), (19, 28), (19, 34), (19, 40), + (37, 16), (37, 22), (37, 28), (37, 34), (37, 40), + (55, 16), (55, 22), (55, 28), (55, 34), (55, 40), + ] + + // MARK: - Levels + + enum LevelKind { + /// 20 formation enemies of one type. + case standard + /// 20 formation enemies + a patrolling boss (21 to clear). + case boss(img: Img, pwr: Int) + /// 13 weak (power-1, enemy-1 art, slots 0…12) + 7 of the level type. + case weak + /// 10 bouncing cross trainers (half of them can flee). + case cross + /// 10 bouncing operator ships that fire aimed shots. + case operators + /// Sweeping superboss (98 hits) + 8 formation enemies + drone deploys. + case superBoss + } + + struct Level { + let kind: LevelKind + let enemyImg: Img + let enemyPwr: Int + let pattern: Pattern + } + + /// levels[0] is level 1. Mirrors `levels_jump_table` exactly. + static let levels: [Level] = [ + Level(kind: .standard, enemyImg: .enemy1, enemyPwr: 1, pattern: pattern1), + Level(kind: .standard, enemyImg: .enemy1, enemyPwr: 1, pattern: pattern2), + Level(kind: .boss(img: .boss1, pwr: 10), enemyImg: .enemy1, enemyPwr: 1, pattern: patternBoss), + Level(kind: .weak, enemyImg: .enemy2, enemyPwr: 2, pattern: patternWeak), + Level(kind: .cross, enemyImg: .cross, enemyPwr: 5, pattern: pattern1), + Level(kind: .standard, enemyImg: .enemy2, enemyPwr: 2, pattern: patternRing), + Level(kind: .boss(img: .boss2, pwr: 10), enemyImg: .enemy2, enemyPwr: 2, pattern: patternBoss), + Level(kind: .weak, enemyImg: .enemy3, enemyPwr: 3, pattern: patternWeak), + Level(kind: .cross, enemyImg: .cross, enemyPwr: 5, pattern: pattern1), + Level(kind: .standard, enemyImg: .enemy3, enemyPwr: 3, pattern: patternColumns), + Level(kind: .boss(img: .boss2, pwr: 10), enemyImg: .enemy3, enemyPwr: 3, pattern: patternBoss), + Level(kind: .weak, enemyImg: .enemy4, enemyPwr: 4, pattern: patternWeak), + Level(kind: .cross, enemyImg: .cross, enemyPwr: 5, pattern: pattern1), + Level(kind: .standard, enemyImg: .enemy4, enemyPwr: 4, pattern: patternColumns), + Level(kind: .operators, enemyImg: .operatorShip, enemyPwr: 8, pattern: pattern1), + Level(kind: .boss(img: .boss2, pwr: 10), enemyImg: .enemy4, enemyPwr: 4, pattern: patternBoss), + Level(kind: .operators, enemyImg: .operatorShip, enemyPwr: 8, pattern: pattern1), + Level(kind: .superBoss, enemyImg: .enemy1, enemyPwr: 1, pattern: pattern1), + Level(kind: .operators, enemyImg: .operatorShip, enemyPwr: 8, pattern: pattern1), + Level(kind: .superBoss, enemyImg: .enemy4, enemyPwr: 4, pattern: pattern1), + ] +} diff --git a/Arcade85/Games/Galaxian/GalaxianScene.swift b/Arcade85/Games/Galaxian/GalaxianScene.swift new file mode 100644 index 0000000..a9e588a --- /dev/null +++ b/Arcade85/Games/Galaxian/GalaxianScene.swift @@ -0,0 +1,679 @@ +import SpriteKit +import UIKit + +/// HD remake of Galaxian 3.0. `GalaxianSim` is the faithful Z80 port; this +/// scene renders the original sprites as neon pixel art, drives the ship with +/// drag-anywhere touch + autofire, puts the limited lasers on a button, and +/// wraps the 20-level campaign in ready / game-over / victory flow. +final class GalaxianScene: SKScene { + + typealias D = GalaxianData + + // MARK: State + private enum GameState { case ready, playing, paused, gameOver, victory } + private var state: GameState = .ready + + private var sim = GalaxianSim() + + // MARK: Timing + private var lastUpdate: TimeInterval = 0 + private var accumulator: TimeInterval = 0 + private var fireCooldown = 0 + + // MARK: Layout + private var unit: CGFloat = 4 // scene points per sim unit, horizontal + private var unitY: CGFloat = 5 // vertical — unit × 1.25 (taller pixels) + private var fieldRect = CGRect.zero // visible window: 96 × 64 sim units (y 16…79) + private var topInset: CGFloat = 0 + + // MARK: Touch control + private var moveTouch: UITouch? + private var touchAnchor = CGPoint.zero + private var shipAnchor = CGPoint.zero + private var targetX = 70 + private var targetY = 70 + private var pendingLaser = false + + // MARK: Nodes + private let worldCrop = SKCropNode() + private var playerNode = SKSpriteNode() + private var bossNode = SKSpriteNode() + private var bossBoomNode = SKSpriteNode() + private var enemyNodes: [SKSpriteNode] = [] + private var pbNodes: [SKSpriteNode] = [] + private var ebNodes: [SKSpriteNode] = [] + private var textureCache: [String: SKTexture] = [:] + + // HUD + private let scoreValue = SKLabelNode(fontNamed: "Menlo-Bold") + private let waveValue = SKLabelNode(fontNamed: "Menlo-Bold") + private let livesValue = SKLabelNode(fontNamed: "Menlo-Bold") + private let laserButton = ControlButton(symbol: "bolt.fill") + private let laserCount = SKLabelNode(fontNamed: "Menlo-Bold") + private let pauseButton = SKShapeNode(circleOfRadius: 16) + private let waveBanner = SKLabelNode(fontNamed: "AvenirNext-Heavy") + + // Overlays + private let readyOverlay = SKNode() + private let pausedOverlay = SKNode() + private let gameOverOverlay = SKNode() + private let victoryOverlay = SKNode() + private let gameOverDetail = SKLabelNode(fontNamed: "Menlo-Bold") + private let gameOverRecord = SKLabelNode(fontNamed: "Menlo-Bold") + private let victoryDetail = SKLabelNode(fontNamed: "Menlo-Bold") + private let victoryRecord = SKLabelNode(fontNamed: "Menlo-Bold") + + private var builtSize: CGSize = .zero + #if DEBUG + private var demoFreeze = false + #endif + + // MARK: Sprite tints + + static func tint(for img: D.Img) -> UIColor { + switch img { + case .enemy1: return Palette.mint + case .enemy2: return Palette.cyan + case .enemy3: return UIColor(red: 0.55, green: 0.80, blue: 1.0, alpha: 1) + case .enemy4: return Palette.violet + case .cross: return UIColor(red: 1.0, green: 0.45, blue: 0.85, alpha: 1) + case .operatorShip: return UIColor(red: 1.0, green: 0.62, blue: 0.25, alpha: 1) + case .boss1, .boss2: return Palette.red + case .boss3: return UIColor(red: 1.0, green: 0.55, blue: 0.30, alpha: 1) + case .ship: return .white + case .playerBullet: return Palette.mint + case .enemyBullet: return Palette.amber + case .x1, .x2, .x3, .x4, .x5, .x6, .x7, .x8: return Palette.amber + } + } + + // MARK: - Lifecycle + + override func didMove(to view: SKView) { + anchorPoint = .zero + scaleMode = .resizeFill + layoutScene() + #if DEBUG + let env = ProcessInfo.processInfo.environment + if env["ARCADE_AUTOPLAY"] == "1" { startGame() } + if env["ARCADE_DEMO"] == "1" { + startGame() + sim.debugSetLevel(6) // the ring formation + for _ in 0..<300 { sim.tick(GalaxianSim.Input()) } + sim.debugPlacePlayer(x: 44, y: 70) + demoFreeze = true + renderFrame() + } + #endif + } + + override func didChangeSize(_ oldSize: CGSize) { + guard view != nil, size != builtSize, size.width > 0 else { return } + layoutScene() + } + + // MARK: - Textures + + private func texture(for img: D.Img) -> SKTexture { + let key = "\(img)" + if let t = textureCache[key] { return t } + let sprite = D.sprites[img]! + let cell: CGFloat = 10 + let renderer = UIGraphicsImageRenderer(size: CGSize(width: CGFloat(sprite.w) * cell, + height: CGFloat(sprite.h) * cell)) + let color = Self.tint(for: img) + let image = renderer.image { ctx in + let cg = ctx.cgContext + cg.setShadow(offset: .zero, blur: cell * 0.6, color: color.withAlphaComponent(0.85).cgColor) + for pass in 0..<2 { + if pass == 1 { cg.setShadow(offset: .zero, blur: 0, color: nil) } + for (row, bits) in sprite.rows.enumerated() { + for col in 0..> UInt32(col))) != 0 { + let rect = CGRect(x: CGFloat(col) * cell, y: CGFloat(row) * cell, + width: cell, height: cell) + color.setFill() + UIBezierPath(roundedRect: rect.insetBy(dx: cell * 0.05, dy: cell * 0.05), + cornerRadius: cell * 0.18).fill() + } + } + } + } + let t = SKTexture(image: image) + textureCache[key] = t + return t + } + + // MARK: - Layout + + private func layoutScene() { + builtSize = size + removeAllChildren() + textureCache.removeAll() + backgroundColor = Palette.space1 + + let insets = view?.safeAreaInsets ?? .zero + topInset = insets.top + let bottomInset = insets.bottom + + let bg = SKSpriteNode(texture: SceneArt.verticalGradient(size: size, top: Palette.space0, bottom: Palette.space1)) + bg.anchorPoint = .zero + bg.zPosition = -10 + addChild(bg) + let stars = SceneArt.starfield(size: size, count: 90, seed: 0x6A1AC5) + stars.zPosition = -9 + addChild(stars) + + // Field: 96 × 64 visible sim units (rows 16…79 of the back buffer), + // width-fit, drawn with 1.25× tall pixels for a fuller portrait field. + let margin: CGFloat = 14 + unit = (size.width - margin * 2) / 96 + unitY = unit * 1.25 + let fieldH = unitY * 64 + let hudBottom = size.height - topInset - 92 + fieldRect = CGRect(x: margin, y: hudBottom - fieldH, width: unit * 96, height: fieldH) + + let frame = SKShapeNode(rect: fieldRect.insetBy(dx: -6, dy: -6), cornerRadius: 14) + frame.strokeColor = Palette.mint.withAlphaComponent(0.30) + frame.lineWidth = 1.5 + frame.glowWidth = 1 + frame.fillColor = UIColor(white: 0, alpha: 0.30) + frame.zPosition = -1 + addChild(frame) + + worldCrop.removeAllChildren() + let mask = SKSpriteNode(color: .white, size: fieldRect.size) + mask.position = CGPoint(x: fieldRect.midX, y: fieldRect.midY) + worldCrop.maskNode = mask + worldCrop.zPosition = 0 + addChild(worldCrop) + + buildEntityNodes() + buildHUD(bottomInset: bottomInset) + buildReadyOverlay() + buildPausedOverlay() + buildGameOverOverlay() + buildVictoryOverlay() + + applyStateVisibility() + renderFrame() + } + + private func buildEntityNodes() { + func makeNode() -> SKSpriteNode { + let n = SKSpriteNode() + n.isHidden = true + worldCrop.addChild(n) + return n + } + enemyNodes = (0..<20).map { _ in let n = makeNode(); n.zPosition = 4; return n } + pbNodes = (0..<10).map { _ in let n = makeNode(); n.zPosition = 3; return n } + ebNodes = (0..<10).map { _ in let n = makeNode(); n.zPosition = 3; return n } + bossNode = makeNode() + bossNode.zPosition = 4 + bossBoomNode = makeNode() + bossBoomNode.zPosition = 5 + playerNode = makeNode() + playerNode.zPosition = 5 + } + + /// Sim → scene coordinates (sim y grows downward; visible window starts at 16). + private func point(x: Int, y: Int, w: Int, h: Int) -> CGPoint { + CGPoint(x: fieldRect.minX + (CGFloat(x) + CGFloat(w) / 2) * unit, + y: fieldRect.maxY - (CGFloat(y) - CGFloat(GalaxianSim.visibleTop) + CGFloat(h) / 2) * unitY) + } + + private func place(_ node: SKSpriteNode, img: D.Img, x: Int, y: Int) { + let sprite = D.sprites[img]! + node.texture = texture(for: img) + node.size = CGSize(width: CGFloat(sprite.w) * unit, height: CGFloat(sprite.h) * unitY) + node.position = point(x: x, y: y, w: sprite.w, h: sprite.h) + node.isHidden = false + } + + // MARK: - HUD + + private func buildHUD(bottomInset: CGFloat) { + let hudY = size.height - topInset - 26 + + addChild(caption("LIVES", x: 74, y: hudY + 12, align: .left)) + livesValue.fontSize = 17 + livesValue.fontColor = .white + livesValue.horizontalAlignmentMode = .left + livesValue.verticalAlignmentMode = .center + livesValue.position = CGPoint(x: 74, y: hudY - 8) + livesValue.zPosition = 20 + addChild(livesValue) + + addChild(caption("WAVE", x: size.width / 2, y: hudY + 12, align: .center)) + waveValue.fontSize = 17 + waveValue.fontColor = .white + waveValue.horizontalAlignmentMode = .center + waveValue.verticalAlignmentMode = .center + waveValue.position = CGPoint(x: size.width / 2, y: hudY - 8) + waveValue.zPosition = 20 + addChild(waveValue) + + addChild(caption("SCORE", x: size.width - 20, y: hudY + 12, align: .right)) + scoreValue.fontSize = 17 + scoreValue.fontColor = .white + scoreValue.horizontalAlignmentMode = .right + scoreValue.verticalAlignmentMode = .center + scoreValue.position = CGPoint(x: size.width - 20, y: hudY - 8) + scoreValue.zPosition = 20 + addChild(scoreValue) + + // Laser button in the thumb zone, count badge underneath the bolt. + let ly = max(bottomInset + 96, fieldRect.minY - 116) + laserButton.configure(radius: 40, tint: Palette.cyan) + laserButton.position = CGPoint(x: size.width - 66, y: ly) + laserButton.zPosition = 20 + addChild(laserButton) + laserCount.fontSize = 13 + laserCount.fontColor = Palette.cyan + laserCount.horizontalAlignmentMode = .center + laserCount.verticalAlignmentMode = .center + laserCount.position = CGPoint(x: size.width - 66, y: ly - 58) + laserCount.zPosition = 20 + addChild(laserCount) + + pauseButton.fillColor = UIColor(white: 1, alpha: 0.08) + pauseButton.strokeColor = UIColor(white: 1, alpha: 0.25) + pauseButton.lineWidth = 1 + pauseButton.position = CGPoint(x: fieldRect.maxX - 6, y: fieldRect.maxY - 6) + pauseButton.zPosition = 22 + pauseButton.removeAllChildren() + if let tex = SceneArt.symbolTexture("pause.fill", pointSize: 13, color: Palette.white70) { + let icon = SKSpriteNode(texture: tex) + icon.size = tex.size() + pauseButton.addChild(icon) + } + addChild(pauseButton) + + // Wave banner (fades in/out on level entry). + waveBanner.fontSize = 24 + waveBanner.fontColor = Palette.mint + waveBanner.horizontalAlignmentMode = .center + waveBanner.verticalAlignmentMode = .center + waveBanner.position = CGPoint(x: fieldRect.midX, y: fieldRect.midY) + waveBanner.zPosition = 24 + waveBanner.alpha = 0 + addChild(waveBanner) + + let hintY = bottomInset + (max(fieldRect.minY - bottomInset, 60)) * 0.30 + addChild(caption("DRAG ANYWHERE TO FLY — CANNON AUTO-FIRES", x: size.width / 2, + y: max(bottomInset + 16, hintY), align: .center)) + } + + private func caption(_ text: String, x: CGFloat, y: CGFloat, align: SKLabelHorizontalAlignmentMode) -> SKLabelNode { + let label = SKLabelNode(fontNamed: "Menlo-Bold") + label.text = text + label.fontSize = 10 + label.fontColor = Palette.white40 + label.horizontalAlignmentMode = align + label.verticalAlignmentMode = .center + label.position = CGPoint(x: x, y: y) + label.zPosition = 20 + return label + } + + // MARK: - Overlays + + private func bigLabel(_ text: String, fontNamed: String = "AvenirNext-Heavy", size fontSize: CGFloat, + color: UIColor, x: CGFloat, y: CGFloat, maxWidth: CGFloat? = nil) -> SKLabelNode { + let label = SKLabelNode(fontNamed: fontNamed) + label.text = text + label.fontSize = fontSize + label.fontColor = color + label.horizontalAlignmentMode = .center + label.verticalAlignmentMode = .center + label.position = CGPoint(x: x, y: y) + if let maxWidth { + label.preferredMaxLayoutWidth = maxWidth + label.numberOfLines = 0 + } + return label + } + + private func buildReadyOverlay() { + readyOverlay.removeAllChildren() + readyOverlay.zPosition = 40 + addChild(readyOverlay) + let dim = SKSpriteNode(color: UIColor(white: 0.02, alpha: 0.66), size: size) + dim.anchorPoint = .zero + readyOverlay.addChild(dim) + + let cx = size.width / 2 + let midY = size.height * 0.62 + readyOverlay.addChild(bigLabel("GALAXIAN", size: 36, color: .white, x: cx, y: midY + 64)) + readyOverlay.addChild(bigLabel("20 waves. 9 lives. 9 lasers. Hold the line.", + fontNamed: "AvenirNext-Medium", size: 14.5, + color: Palette.white70, x: cx, y: midY + 30)) + readyOverlay.addChild(bigLabel("Cannon auto-fires — the LASER button wipes a column", + fontNamed: "AvenirNext-Medium", size: 13, + color: Palette.white40, x: cx, y: midY - 2, + maxWidth: size.width - 80)) + + let prompt = bigLabel("TAP TO LAUNCH", fontNamed: "Menlo-Bold", size: 16, color: Palette.mint, + x: cx, y: midY - 64) + prompt.run(.repeatForever(.sequence([.fadeAlpha(to: 0.35, duration: 0.7), .fadeAlpha(to: 1, duration: 0.7)]))) + readyOverlay.addChild(prompt) + } + + private func buildPausedOverlay() { + pausedOverlay.removeAllChildren() + pausedOverlay.zPosition = 40 + addChild(pausedOverlay) + let dim = SKSpriteNode(color: UIColor(white: 0.01, alpha: 0.80), size: size) + dim.anchorPoint = .zero + pausedOverlay.addChild(dim) + pausedOverlay.addChild(bigLabel("PAUSED", size: 30, color: .white, x: size.width / 2, y: size.height * 0.55)) + let hint = bigLabel("TAP TO RESUME", fontNamed: "Menlo-Bold", size: 15, color: Palette.mint, + x: size.width / 2, y: size.height * 0.55 - 44) + hint.run(.repeatForever(.sequence([.fadeAlpha(to: 0.35, duration: 0.7), .fadeAlpha(to: 1, duration: 0.7)]))) + pausedOverlay.addChild(hint) + } + + private func buildGameOverOverlay() { + gameOverOverlay.removeAllChildren() + gameOverOverlay.zPosition = 40 + addChild(gameOverOverlay) + let dim = SKSpriteNode(color: UIColor(white: 0.02, alpha: 0.72), size: size) + dim.anchorPoint = .zero + gameOverOverlay.addChild(dim) + let cx = size.width / 2 + let midY = size.height * 0.6 + gameOverOverlay.addChild(bigLabel("FLEET DESTROYED", size: 30, color: Palette.red, x: cx, y: midY + 36)) + gameOverDetail.fontSize = 15 + gameOverDetail.fontColor = .white + gameOverDetail.horizontalAlignmentMode = .center + gameOverDetail.position = CGPoint(x: cx, y: midY - 4) + gameOverOverlay.addChild(gameOverDetail) + gameOverRecord.fontSize = 14 + gameOverRecord.fontColor = Palette.amber + gameOverRecord.horizontalAlignmentMode = .center + gameOverRecord.position = CGPoint(x: cx, y: midY - 30) + gameOverOverlay.addChild(gameOverRecord) + let prompt = bigLabel("TAP TO FLY AGAIN", fontNamed: "Menlo-Bold", size: 16, color: Palette.mint, + x: cx, y: midY - 70) + prompt.run(.repeatForever(.sequence([.fadeAlpha(to: 0.35, duration: 0.7), .fadeAlpha(to: 1, duration: 0.7)]))) + gameOverOverlay.addChild(prompt) + } + + private func buildVictoryOverlay() { + victoryOverlay.removeAllChildren() + victoryOverlay.zPosition = 40 + addChild(victoryOverlay) + let dim = SKSpriteNode(color: UIColor(white: 0.02, alpha: 0.82), size: size) + dim.anchorPoint = .zero + victoryOverlay.addChild(dim) + let cx = size.width / 2 + let midY = size.height * 0.60 + victoryOverlay.addChild(bigLabel("INVASION REPELLED", size: 28, color: Palette.mint, x: cx, y: midY + 48)) + victoryDetail.fontSize = 17 + victoryDetail.fontColor = Palette.amber + victoryDetail.horizontalAlignmentMode = .center + victoryDetail.position = CGPoint(x: cx, y: midY) + victoryOverlay.addChild(victoryDetail) + victoryRecord.fontSize = 14 + victoryRecord.fontColor = Palette.amber + victoryRecord.horizontalAlignmentMode = .center + victoryRecord.position = CGPoint(x: cx, y: midY - 28) + victoryOverlay.addChild(victoryRecord) + let prompt = bigLabel("TAP TO RETURN", fontNamed: "Menlo-Bold", size: 15, color: Palette.mint, + x: cx, y: midY - 68) + prompt.run(.repeatForever(.sequence([.fadeAlpha(to: 0.35, duration: 0.7), .fadeAlpha(to: 1, duration: 0.7)]))) + victoryOverlay.addChild(prompt) + } + + // MARK: - Game flow + + private func startGame() { + sim = GalaxianSim() + targetX = 70 + targetY = 70 + accumulator = 0 + fireCooldown = 0 + pendingLaser = false + state = .playing + applyStateVisibility() + renderFrame() + } + + private func applyStateVisibility() { + readyOverlay.isHidden = state != .ready + pausedOverlay.isHidden = state != .paused + gameOverOverlay.isHidden = state != .gameOver + victoryOverlay.isHidden = state != .victory + pauseButton.isHidden = state != .playing + laserButton.alpha = state == .playing ? 1 : 0.25 + } + + private func endGame(won: Bool) { + let record = HighScoreStore.shared.submit(id: "galaxian", score: sim.score) + if won { + victoryDetail.text = "SCORE \(sim.score)" + victoryRecord.text = record ? "★ NEW BEST ★" : "BEST \(HighScoreStore.shared.best("galaxian"))" + state = .victory + Haptics.success() + } else { + gameOverDetail.text = "WAVE \(max(1, sim.level))/20 · SCORE \(sim.score)" + gameOverRecord.text = record ? "★ NEW BEST ★" : "BEST \(HighScoreStore.shared.best("galaxian"))" + state = .gameOver + Haptics.error() + } + applyStateVisibility() + } + + // MARK: - Game loop + + override func update(_ currentTime: TimeInterval) { + if lastUpdate == 0 { lastUpdate = currentTime } + var dt = currentTime - lastUpdate + lastUpdate = currentTime + if dt > 0.25 { dt = 0.25 } + guard state == .playing else { return } + #if DEBUG + if demoFreeze { return } + #endif + + let interval = 1.0 / GalaxianSim.fps + accumulator += dt + var steps = 0 + while accumulator >= interval, steps < 5 { + accumulator -= interval + steps += 1 + stepSim() + if state != .playing { break } + } + renderFrame() + } + + private func stepSim() { + var input = GalaxianSim.Input() + let dx = targetX - sim.playerX + let dy = targetY - sim.playerY + if dx != 0 { input.dx = dx > 0 ? 1 : -1 } + if dy != 0 { input.dy = dy > 0 ? 1 : -1 } + if fireCooldown > 0 { fireCooldown -= 1 } + if fireCooldown == 0 { + input.fire = true + fireCooldown = 6 // ~6 shots/sec at 35 fps + } + if pendingLaser { + input.laser = true + pendingLaser = false + } + sim.tick(input) + + for event in sim.events { + switch event { + case .levelLoaded(let n): + showWaveBanner(n) + case .enemyDestroyed: + Haptics.impact(.light, intensity: 0.5) + case .bossDestroyed: + Haptics.success() + case .playerHit: + Haptics.impact(.heavy, intensity: 0.9) + case .laserFired(let x): + fireLaserBeam(atColumn: x) + Haptics.impact(.medium, intensity: 0.8) + case .droneDeployed: + Haptics.warning() + case .crossFled: + break + case .gameOver: + endGame(won: false) + case .victory: + endGame(won: true) + } + } + } + + private func showWaveBanner(_ n: Int) { + waveBanner.removeAllActions() + waveBanner.text = "WAVE \(n) / 20" + waveBanner.alpha = 0 + waveBanner.run(.sequence([ + .fadeIn(withDuration: 0.2), + .wait(forDuration: 1.0), + .fadeOut(withDuration: 0.5), + ])) + Haptics.selection() + } + + // MARK: - Rendering + + private func renderFrame() { + // Player: normal, invulnerable shimmer, or explosion frames. + if sim.over && !sim.won { + playerNode.isHidden = true + } else if let frame = sim.playerExplosionFrame { + place(playerNode, img: D.explosionFrames[frame], x: sim.playerX, y: sim.playerY) + playerNode.alpha = 1 + } else { + place(playerNode, img: .ship, x: sim.playerX, y: sim.playerY) + playerNode.alpha = sim.playerInvulnerable ? 0.45 : 1.0 + } + + // Enemies (formation, swoopers, bouncers, explosions). + for (i, node) in enemyNodes.enumerated() { + if let d = sim.enemyDisplay(i) { + place(node, img: d.img, x: d.x, y: d.y) + } else { + node.isHidden = true + } + } + + // Boss: patrolling sprite or twin explosions. + if sim.bossStatus > 0, let img = sim.bossImg { + place(bossNode, img: img, x: sim.bossX, y: sim.bossY) + bossBoomNode.isHidden = true + } else if sim.bossStatus < 0 { + let f = D.explosionFrames[min(sim.bossPwr >> 1, 7)] + place(bossNode, img: f, x: sim.bossX, y: sim.bossY) + place(bossBoomNode, img: f, x: sim.bossX + 8, y: sim.bossY + 4) + } else { + bossNode.isHidden = true + bossBoomNode.isHidden = true + } + + // Bullets. + for (i, node) in pbNodes.enumerated() { + let b = sim.playerBullets[i] + if b.active { place(node, img: .playerBullet, x: b.x, y: b.y) } + else { node.isHidden = true } + } + for (i, node) in ebNodes.enumerated() { + let b = sim.enemyBullets[i] + if b.type != 0 { place(node, img: .enemyBullet, x: b.x, y: b.y) } + else { node.isHidden = true } + } + + // HUD. + scoreValue.text = "\(sim.score)" + waveValue.text = "\(max(1, sim.level))/20" + livesValue.text = "\(max(0, sim.lives))" + laserCount.text = "LASER ×\(sim.lasers)" + laserButton.setPressed(false) + laserButton.alpha = state != .playing ? 0.25 : (sim.lasers > 0 ? 1.0 : 0.3) + } + + // MARK: - Effects + + private func fireLaserBeam(atColumn x: Int) { + let bx = fieldRect.minX + (CGFloat(x) + 0.5) * unit + let path = CGMutablePath() + path.move(to: CGPoint(x: bx, y: fieldRect.minY)) + path.addLine(to: CGPoint(x: bx, y: fieldRect.maxY)) + let beam = SKShapeNode(path: path) + beam.strokeColor = Palette.cyan + beam.lineWidth = 2.5 + beam.glowWidth = 6 + beam.zPosition = 8 + worldCrop.addChild(beam) + beam.run(.sequence([.fadeOut(withDuration: 0.28), .removeFromParent()])) + } + + // MARK: - Touch handling + + override func touchesBegan(_ touches: Set, with event: UIEvent?) { + for touch in touches { + let p = touch.location(in: self) + switch state { + case .ready: + Haptics.selection() + startGame() + case .paused: + Haptics.selection() + state = .playing + applyStateVisibility() + case .gameOver, .victory: + Haptics.selection() + state = .ready + applyStateVisibility() + case .playing: + let dp = hypot(p.x - pauseButton.position.x, p.y - pauseButton.position.y) + if dp <= 30 { + Haptics.selection() + state = .paused + moveTouch = nil + applyStateVisibility() + continue + } + if laserButton.covers(p) { + if sim.lasers > 0 { + pendingLaser = true + laserButton.setPressed(true) + } else { + Haptics.warning() + } + continue + } + moveTouch = touch + touchAnchor = p + shipAnchor = CGPoint(x: CGFloat(sim.playerX), y: CGFloat(sim.playerY)) + targetX = sim.playerX + targetY = sim.playerY + } + } + } + + override func touchesMoved(_ touches: Set, with event: UIEvent?) { + guard state == .playing, let moveTouch, touches.contains(moveTouch) else { return } + let p = moveTouch.location(in: self) + // Finger travel maps ~1.35× on-screen ship travel (per-axis). + targetX = Int(shipAnchor.x + (p.x - touchAnchor.x) * 1.35 / unit) + targetY = Int(shipAnchor.y - (p.y - touchAnchor.y) * 1.35 / unitY) + targetX = min(max(targetX, 1), 88) + targetY = min(max(targetY, 61), 72) + } + + override func touchesEnded(_ touches: Set, with event: UIEvent?) { + if let moveTouch, touches.contains(moveTouch) { self.moveTouch = nil } + } + + override func touchesCancelled(_ touches: Set, with event: UIEvent?) { + if let moveTouch, touches.contains(moveTouch) { self.moveTouch = nil } + } +} diff --git a/Arcade85/Games/Galaxian/GalaxianSim.swift b/Arcade85/Games/Galaxian/GalaxianSim.swift new file mode 100644 index 0000000..7f4fa64 --- /dev/null +++ b/Arcade85/Games/Galaxian/GalaxianSim.swift @@ -0,0 +1,628 @@ +import Foundation + +/// A faithful port of Galaxian 3.0 (Patrick Davidson, 1998) from +/// `GALAXIAN.ASM`. Runs the original's exact main-loop order, enemy state +/// machine, timers, random rolls, hitboxes and scoring at ~35 fps. +/// +/// Coordinates: the original composes into a 96-wide back buffer whose rows +/// 16…79 are copied to the LCD — so x is 0…95, y grows downward, and the +/// visible window is y 16…79. Enemies stage above (y < 16) and bullets die +/// just below (y = 81). The player roams x 1…88, y 61…72. +/// +/// Enemy slots are 4 "bytes" (type, pwr, x, y) exactly as in TEXT_MEM — and +/// on cross/operator levels the bounce velocities live in the *following* +/// (empty) slot's pwr/x fields, faithfully mirroring the original's layout. +struct GalaxianSim { + typealias D = GalaxianData + + static let fps = 35.0 // per the doc: "approximately 35 fps" + static let fieldWidth = 96 + static let visibleTop = 16 // first LCD row of the back buffer + static let visibleHeight = 64 + + // MARK: - State + + struct Enemy { + var type = 0 // 0 empty · 1 waiting · 2 descending + // 3 formation · 4 exploding + // 5…12 swoop stages · 13 warp/bounce + var pwr = 0 + var x = 0 + var y = 0 + } + + struct PlayerBullet { var active = false; var x = 0; var y = 0 } + struct EnemyBullet { var type = 0; var x = 0; var y = 0 } // 1 straight · 2/4 left · 3/5 right + + enum Event: Equatable { + case levelLoaded(Int) + case enemyDestroyed(x: Int, y: Int) + case bossDestroyed + case playerHit + case laserFired(x: Int) + case droneDeployed + case crossFled + case gameOver + case victory + } + + struct Input { + var dx = 0 // -1 / 0 / +1 + var dy = 0 // -1 up / +1 down + var fire = false // one cannon shot (per press) + var laser = false // one laser (per press) + init(dx: Int = 0, dy: Int = 0, fire: Bool = false, laser: Bool = false) { + self.dx = dx; self.dy = dy; self.fire = fire; self.laser = laser + } + } + + private(set) var enemies = [Enemy](repeating: Enemy(), count: 20) + private(set) var playerBullets = [PlayerBullet](repeating: PlayerBullet(), count: 10) + private(set) var enemyBullets = [EnemyBullet](repeating: EnemyBullet(), count: 10) + + private(set) var playerX = 70 + private(set) var playerY = 70 + private(set) var yourStatus = 0 // 0 normal · 16…31 exploding · 1…15 respawn shield + private(set) var lives = 9 + private(set) var lasers = 9 + private(set) var score = 0 + private(set) var level = 0 // 1…20 once loaded + private(set) var enemiesRemaining = 0 + private(set) var timer: UInt8 = 0 + + private(set) var bossStatus = 0 // 0 none · 1…4 patrol · 5/6 super sweep · -1 exploding + private(set) var bossPwr = 0 // hit points; explosion frame while exploding + private(set) var bossX = 0 + private(set) var bossY = 0 + + private(set) var over = false + private(set) var won = false + private(set) var events: [Event] = [] + + private var rng: SeededGenerator + + init(seed: UInt64? = nil) { + rng = SeededGenerator(seed: seed ?? UInt64.random(in: 1...UInt64.max)) + } + + // MARK: - Level config helpers + + var currentLevel: D.Level { D.levels[max(0, min(level, 20) - 1)] } + + private var isWeakLevel: Bool { if case .weak = currentLevel.kind { return true }; return false } + private var isWarpLevel: Bool { + switch currentLevel.kind { case .cross, .operators: return true; default: return false } + } + private var isOperatorLevel: Bool { if case .operators = currentLevel.kind { return true }; return false } + private var isSuperBoss: Bool { if case .superBoss = currentLevel.kind { return true }; return false } + + /// R-register read: pseudo-random 0…127. + private mutating func randR() -> Int { Int(rng.next() & 0x7F) } + /// One `rra`-on-R carry test: ~50/50. + private mutating func rngBit() -> Bool { rng.next() & 1 == 1 } + + private mutating func subScore(_ n: Int) { score = max(0, score - n) } + + // MARK: - Main loop (original call order) + + mutating func tick(_ input: Input) { + guard !over else { return } + events.removeAll(keepingCapacity: true) + + if enemiesRemaining == 0 { nextLevel() } + if over { return } + timer &+= 1 + + youShoot(input) + youShootLaser(input) + yourShip(input) + if over { return } + moveYourBullets() + enemySwoop() + handleEnemies() + enemiesHitYou() + boss() + bossShootPeriodic() + enemiesShootYou() + moveEnemyBullets() + } + + // MARK: - Level loading (Next_Level) + + private mutating func nextLevel() { + enemies = [Enemy](repeating: Enemy(), count: 20) + timer = 0 + score += 200 + level += 1 + if level == 21 { + score += 5000 + won = true + over = true + events.append(.victory) + return + } + + bossStatus = 0 + let lev = currentLevel + + func fillFormation(_ count: Int) { + for i in 0.. 0 else { return } + lasers -= 1 + let lx = playerX + 3 + events.append(.laserFired(x: lx)) + for i in 0..<20 { + let t = enemies[i].type + if t == 0 || t == 1 || t == 4 { continue } + let dx = lx - enemies[i].x + if dx >= 0 && dx <= 7 { // beam crosses the 8-px sprite + enemies[i].pwr = 0 + enemies[i].type = 4 + events.append(.enemyDestroyed(x: enemies[i].x, y: enemies[i].y)) + } + } + } + + // MARK: - Player ship (Your_Ship) + + private mutating func yourShip(_ input: Input) { + if yourStatus & 16 != 0 { // exploding: -16 points a frame + subScore(16) + yourStatus -= 1 + return + } + if yourStatus != 0 { + yourStatus -= 1 + if lives == 0 { + over = true + events.append(.gameOver) + return + } + } + // Original key order: down, left, right, up — each edge-blocked. + if input.dy > 0, playerY + 1 != 73 { playerY += 1 } + if input.dx < 0, playerX - 1 != 0 { playerX -= 1 } + if input.dx > 0, playerX + 1 != 89 { playerX += 1 } + if input.dy < 0, playerY - 1 != 60 { playerY -= 1 } + } + + private mutating func damageYou() { + yourStatus = 31 + lives -= 1 + events.append(.playerHit) + } + + // MARK: - Player bullets (Move_Your_Bullets) + + private mutating func moveYourBullets() { + for b in 0..<10 where playerBullets[b].active { + playerBullets[b].y -= 1 + if playerBullets[b].y == 0 { playerBullets[b].active = false; continue } + playerBullets[b].y -= 1 + if playerBullets[b].y == 0 { playerBullets[b].active = false; continue } + + let bx = playerBullets[b].x + let by = playerBullets[b].y + + // Enemies. Original quirk kept: every overlapped enemy is hit + // (+10 each), stopping only when one is destroyed. + var killed = false + for i in 0..<20 { + let t = enemies[i].type + if t == 0 || t == 1 || t == 4 { continue } + let dx = enemies[i].x - bx + 5 + if dx < 0 || dx >= 8 { continue } + let dy = enemies[i].y - by + 5 + if dy < 0 || dy >= 10 { continue } + + playerBullets[b].active = false + score += 10 + enemies[i].pwr -= 1 + if enemies[i].pwr == 0 { + enemies[i].type = 4 // pwr doubles as explosion frame + events.append(.enemyDestroyed(x: enemies[i].x, y: enemies[i].y)) + killed = true + break + } + } + if killed { continue } + + // Boss (SMC-widened hitbox for the superboss). + if bossStatus > 0 { + let k1 = isSuperBoss ? 31 : 15 + let k2 = isSuperBoss ? 34 : 18 + let dx = bossX - bx + k1 + let dy = bossY - by + 8 + if dx >= 0 && dx < k2 && dy >= 0 && dy < 13 { + playerBullets[b].active = false + score += 25 + bossPwr -= 1 + if bossPwr == 0 { bossStatus = -1 } // pwr now counts the explosion + } + } + } + } + + // MARK: - Swoop trigger (Enemy_Swoop) + + private mutating func enemySwoop() { + guard timer & 3 == 2 else { return } + let r = randR() + guard r < 19 else { return } + guard enemies[r].type == 3 else { return } + var t = 5 + (rngBit() ? 1 : 0) + let x = enemies[r].x + if x & 64 != 0 { t = 6 } // right side: swoop left + else if x & 32 == 0 { t = 5 } // left side: swoop right + enemies[r].type = t // middle keeps the random pick + } + + // MARK: - Enemy state machine (Handle_Enemies) + + private mutating func handleEnemies() { + for i in 0..<20 { + switch enemies[i].type { + case 1: enemyWaiting(i) + case 2: enemyDescending(i) + case 3: enemyFormation(i) + case 4: enemyExploding(i) + case 5: swoopStage(i, dx: 1, dy: -1, next: 7) + case 6: swoopStage(i, dx: -1, dy: -1, next: 8) + case 7: swoopStage(i, dx: 1, dy: 0, next: 9) + case 8: swoopStage(i, dx: -1, dy: 0, next: 10) + case 9: swoopStage(i, dx: 1, dy: 1, next: 11) + case 10: swoopStage(i, dx: -1, dy: 1, next: 11) + case 11: swoopStage(i, dx: 0, dy: 1, next: 12) + case 12: enemyDiving(i) + case 13: enemyWarp(i) + default: break + } + } + } + + /// Type 1: enters when the masked timer matches its pattern byte. The + /// pattern byte is both entry time and formation depth: the enemy descends + /// 1 px/frame and the timer wraps exactly `depth` frames later. + private mutating func enemyWaiting(_ i: Int) { + let pair = currentLevel.pattern[19 - i] // original indexes coords from the end + guard (Int(timer) & 127) == 128 - pair.y else { return } + enemies[i].type = 2 + enemies[i].x = pair.x + enemies[i].y = 0 + } + + /// Type 2: descend until the 128-frame wrap, then join the formation. + private mutating func enemyDescending(_ i: Int) { + if timer == 0 || timer == 128 { + enemies[i].type = 3 + enemyFormation(i) // original falls through + return + } + enemies[i].y += 1 + } + + /// Type 3: formation sway — even frames only, direction from timer bit 6. + private mutating func enemyFormation(_ i: Int) { + guard timer & 1 == 0 else { return } + enemies[i].x += 1 + if timer & 64 != 0 { enemies[i].x -= 2 } + } + + /// Type 4: 16-frame explosion, then +100 and the slot frees up. + private mutating func enemyExploding(_ i: Int) { + if enemies[i].pwr == 15 { + enemies[i].type = 0 + enemiesRemaining -= 1 + score += 100 + return + } + enemies[i].pwr += 1 + } + + /// Types 5…11: constant-velocity swoop stages, advancing every 4th frame. + private mutating func swoopStage(_ i: Int, dx: Int, dy: Int, next: Int) { + enemies[i].x += dx + enemies[i].y += dy + if timer & 3 == 0 { enemies[i].type = next } + } + + /// Type 12: fast dive off the bottom, then rejoin the entry queue (-1 pt). + private mutating func enemyDiving(_ i: Int) { + enemies[i].y += 2 + if enemies[i].y > 78 { + enemies[i].type = 1 + subScore(1) + } + } + + /// Type 13: cross/operator bounce box. Velocities live in the next slot + /// (pwr = vx, x = vy). Half of the crosses can flee off the top (-50). + private mutating func enemyWarp(_ i: Int) { + var vx = enemies[i + 1].pwr + var vy = enemies[i + 1].x + + let nx = enemies[i].x + vx + if nx == 1 { vx = 1 } + if nx == 23 { vx = rngBit() ? 1 : -1 } + if nx == 45 { vx = rngBit() ? 1 : -1 } + if nx == 87 { vx = -1 } + enemies[i].x = nx + enemies[i + 1].pwr = vx + + var ny = enemies[i].y + vy + if ny == 0 { // escaped off the top + enemies[i].type = 0 + enemiesRemaining -= 1 + subScore(50) + events.append(.crossFled) + return + } + if ny == 15 { vy = 1 } + if ny == 27 { vy = rngBit() ? 1 : -1 } + if ny == 39 { + vy = -1 + if !rngBit(), !rngBit(), // 1-in-4 roll + !isOperatorLevel, (40 - 2 * i) & 8 != 0 { + vy = -2 // flee: rises 2/frame to exactly 0 + ny -= 1 + } + } + enemies[i].y = ny + enemies[i + 1].x = vy + } + + // MARK: - Enemies ram you (Enemies_Hit_You) + + private mutating func enemiesHitYou() { + guard yourStatus == 0 else { return } + for i in 0..<20 { + guard enemies[i].type != 0 else { continue } + let dx = enemies[i].x - playerX + 6 + if dx < 0 || dx >= 12 { continue } + let dy = enemies[i].y - playerY + 6 + if dy < 0 || dy >= 12 { continue } + enemies[i].pwr = 0 + enemies[i].type = 4 + events.append(.enemyDestroyed(x: enemies[i].x, y: enemies[i].y)) + damageYou() + return // one ram per frame + } + } + + // MARK: - Boss (Boss) + + private mutating func boss() { + switch bossStatus { + case 0: + return + case ..<0: // exploding + if bossPwr == 15 { + bossStatus = 0 + enemiesRemaining -= 1 + score += 1000 + events.append(.bossDestroyed) + } else { + bossPwr += 1 + } + case 1: // patrol: down to y 20 + bossY += 1 + if bossY == 20 { bossStatus = 2 } + case 2: // right to x 80 + bossX += 1 + if bossX == 80 { bossStatus = 3 } + case 3: // up to y 16 + bossY -= 1 + if bossY == 16 { bossStatus = 4 } + case 4: // left to x 0 + bossX -= 1 + if bossX == 0 { bossStatus = 1 } + case 5: // superboss: sweep left to 0 + bossX -= 1 + if bossX == 0 { bossStatus = 6 } + deployEnemies() + case 6: // descend to y 16, sweep right to 65 + if bossY != 16 { + bossY += 1 + } else { + bossX += 1 + if bossX == 65 { bossStatus = 5 } + } + deployEnemies() + default: + break + } + } + + /// Superboss drone factory: ~7/128 chance a frame, into slots 0…6 (-200). + private mutating func deployEnemies() { + let r = randR() + guard r < 7 else { return } + guard enemies[r].type == 0 else { return } + enemies[r] = Enemy(type: 11, pwr: currentLevel.enemyPwr, x: bossX + 12, y: 24) + enemiesRemaining += 1 + subScore(200) + events.append(.droneDeployed) + } + + // MARK: - Firing (Boss_Shoot / Enemies_Shoot_You) + + /// The original's 5-zone aim: picks a straight/drifting bullet type from + /// the player's horizontal offset against the muzzle x. + private mutating func spawnAimedBullet(fromX d: Int, y e: Int) { + guard let slot = enemyBullets.firstIndex(where: { $0.type == 0 }) else { return } + var t = 1 + let a = playerX - d + 18 + if a < 0 { + t = 2 + if a + 18 < 0 { t = 4 } + } else if a - 54 >= 0 { + t = 3 + if a - 72 >= 0 { t = 5 } + } + enemyBullets[slot] = EnemyBullet(type: t, x: d, y: e) + } + + private mutating func spawnStraightBullet(x: Int, y: Int) { + guard let slot = enemyBullets.firstIndex(where: { $0.type == 0 }) else { return } + enemyBullets[slot] = EnemyBullet(type: 1, x: x, y: y) + } + + private mutating func bossShootPeriodic() { + guard timer & 63 == 0, bossStatus > 0 else { return } + let e = bossY + 5 + if isSuperBoss { + for off in [0, 10, 20, 30] { spawnAimedBullet(fromX: bossX + off, y: e) } + } else { + spawnAimedBullet(fromX: bossX, y: e) + spawnAimedBullet(fromX: bossX + 13, y: e) + } + } + + private mutating func enemiesShootYou() { + let r = randR() + guard r < 19 else { return } + let t = enemies[r].type + guard t != 0, t != 1 else { return } + let d = enemies[r].x + 2 + let e = enemies[r].y + 5 + if isOperatorLevel { + spawnAimedBullet(fromX: d, y: e) // operators aim like bosses + } else { + spawnStraightBullet(x: d, y: e) + } + } + + // MARK: - Enemy bullets (Move_Enemy_Bullets) + + private mutating func moveEnemyBullets() { + for b in 0..<10 { + let t = enemyBullets[b].type + guard t != 0 else { continue } + + switch t { + case 2: + if timer & 1 == 0 { + enemyBullets[b].x -= 1 + if enemyBullets[b].x == 0 { enemyBullets[b].type = 0; continue } + } + case 4: + enemyBullets[b].x -= 1 + if enemyBullets[b].x == 0 { enemyBullets[b].type = 0; continue } + case 3: + if timer & 1 == 0 { + enemyBullets[b].x += 1 + if enemyBullets[b].x == 95 { enemyBullets[b].type = 0; continue } + } + case 5: + enemyBullets[b].x += 1 + if enemyBullets[b].x == 95 { enemyBullets[b].type = 0; continue } + default: + break + } + + if enemyBullets[b].y == 81 { enemyBullets[b].type = 0; continue } + enemyBullets[b].y += 1 + + if yourStatus == 0 { + let dx = playerX - enemyBullets[b].x + 6 + let dy = playerY - enemyBullets[b].y + 6 + if dx >= 0 && dx < 9 && dy >= 0 && dy < 9 { + damageYou() + enemyBullets[b].type = 0 + } + } + } + } + + // MARK: - Display helpers + + /// What to draw for enemy slot `i`, or nil if nothing. + func enemyDisplay(_ i: Int) -> (img: D.Img, x: Int, y: Int)? { + let e = enemies[i] + switch e.type { + case 0, 1: + return nil + case 4: + return (D.explosionFrames[min(e.pwr >> 1, 7)], e.x, e.y) + default: + let img: D.Img = (isWeakLevel && i <= 12) ? .enemy1 : currentLevel.enemyImg + return (img, e.x, e.y) + } + } + + var bossImg: D.Img? { + guard bossStatus != 0 else { return nil } + if case .boss(let img, _) = currentLevel.kind { return img } + if isSuperBoss { return .boss3 } + return nil + } + + /// Player explosion frame (0…7) while exploding, else nil. + var playerExplosionFrame: Int? { + guard yourStatus & 16 != 0 else { return nil } + return ((((yourStatus - 1) & 14) ^ 14) >> 1) + } + var playerInvulnerable: Bool { yourStatus != 0 } + + #if DEBUG + mutating func debugSetLevel(_ n: Int) { // next tick loads level n + level = n - 1 + enemiesRemaining = 0 + enemies = [Enemy](repeating: Enemy(), count: 20) + bossStatus = 0 + } + mutating func debugPlacePlayer(x: Int, y: Int) { playerX = x; playerY = y } + mutating func debugSetLives(_ n: Int) { lives = n } + mutating func debugSetLasers(_ n: Int) { lasers = n } + mutating func debugSetScore(_ n: Int) { score = n } + mutating func debugSetTimer(_ t: UInt8) { timer = t } + mutating func debugSetEnemy(_ i: Int, type: Int, pwr: Int, x: Int, y: Int) { + enemies[i] = Enemy(type: type, pwr: pwr, x: x, y: y) + } + mutating func debugSetRemaining(_ n: Int) { enemiesRemaining = n } + mutating func debugSetBoss(status: Int, pwr: Int, x: Int, y: Int) { + bossStatus = status; bossPwr = pwr; bossX = x; bossY = y + } + #endif +} diff --git a/Arcade85/Games/Lander/LanderScene.swift b/Arcade85/Games/Lander/LanderScene.swift new file mode 100644 index 0000000..f305f94 --- /dev/null +++ b/Arcade85/Games/Lander/LanderScene.swift @@ -0,0 +1,1016 @@ +import SpriteKit +import UIKit + +/// HD remake of TI-85 Lunar Lander. The simulation (`LanderSim`) is the faithful +/// original in a 128×64 integer space; this scene scales it into a framed +/// "viewport", renders crisp neon art, drives it with multi-touch thruster pads, +/// and wraps it in ready / landed / game-over flow. +final class LanderScene: SKScene { + + // MARK: State + private enum GameState { case ready, playing, landed, gameOver } + private var state: GameState = .ready + + private var sim = LanderSim() + private var totalScore = 0 + + // Difficulty selected on the ready screen (fuel 30…80 as in the original; + // speed 4…7 — the original allowed 3, but there terminal velocity equals + // the safe-touchdown limit and the game can't be lost). The classic's own + // defaults (40/7) are its hardest speed setting, so the remake defaults + // gentler and remembers the player's last choice. Gravity is the remake's + // third knob: heavier worlds fall harder, keep sideways momentum, and pay + // ×2/×3 score. + private var chosenFuel = UserDefaults.standard.object(forKey: "lander.fuel") as? Int ?? 60 + private var chosenVel = max(4, UserDefaults.standard.object(forKey: "lander.vel") as? Int ?? 4) + private var chosenGravity = LanderSim.Gravity( + rawValue: UserDefaults.standard.object(forKey: "lander.gravity") as? Int ?? 0) ?? .moon + + // MARK: Timing + /// One tick per pass of the original game loop. LANDER.C ends every pass + /// with `delay(20)` — the same delay() whose `delay(200)` calls are the + /// ~2-second message pauses — so the classic ran at roughly 5 loops/sec. + /// Rendering interpolates between ticks, so motion stays smooth. + private let simInterval: TimeInterval = 0.2 + private var accumulator: TimeInterval = 0 + private var lastUpdate: TimeInterval = 0 + private var stateEnteredTime: TimeInterval = 0 + private var prevX = 0, prevY = 0 + + // MARK: Controls + private var thrustLeft = false, thrustUp = false, thrustRight = false + private var lastLeft = false, lastUp = false, lastRight = false + // A tap can begin and end inside one 200 ms tick; latch it so it still + // burns for exactly one tick (one keypress-loop in the original). + private var latchLeft = false, latchUp = false, latchRight = false + private var activeTouches = Set() + + // MARK: Layout metrics + private var fieldOriginX: CGFloat = 0 + private var fieldOriginY: CGFloat = 0 + private var unit: CGFloat = 3 // scene points per logical pixel + private var topInset: CGFloat = 0 + private var controlBarHeight: CGFloat = 190 + + // MARK: Nodes + private let worldCrop = SKCropNode() + private var terrainSprite = SKSpriteNode() + private var ridgeSprite = SKSpriteNode() + private var padLine = SKShapeNode() + private let padPostL = SKShapeNode(circleOfRadius: 3) + private let padPostR = SKShapeNode(circleOfRadius: 3) + private var padCone = SKSpriteNode() + private var padBeacons: [SKShapeNode] = [] + private var lander = SKSpriteNode() + private var mainJet = SKEmitterNode() + private var leftJet = SKEmitterNode() + private var rightJet = SKEmitterNode() + private var engineGlow = SKSpriteNode() + + // HUD + private let scoreValue = SKLabelNode(fontNamed: "Menlo-Bold") + private let vspdValue = SKLabelNode(fontNamed: "Menlo-Bold") + private let fuelBarBg = SKShapeNode() + private let fuelBarFill = SKShapeNode() + private var fuelBarWidth: CGFloat = 130 + + // Controls + private let btnLeft = ControlButton(symbol: "arrowtriangle.left.fill") + private let btnUp = ControlButton(symbol: "flame.fill") + private let btnRight = ControlButton(symbol: "arrowtriangle.right.fill") + + // Overlays + private let readyOverlay = SKNode() + private let landedOverlay = SKNode() + private let gameOverOverlay = SKNode() + private let fuelValueLabel = SKLabelNode(fontNamed: "Menlo-Bold") + private let speedValueLabel = SKLabelNode(fontNamed: "Menlo-Bold") + private let gravityValueLabel = SKLabelNode(fontNamed: "Menlo-Bold") + private var stepperRects: [String: CGRect] = [:] + private let landedTitle = SKLabelNode(fontNamed: "AvenirNext-Heavy") + private let landedDetail = SKLabelNode(fontNamed: "Menlo-Bold") + private let gameOverTitle = SKLabelNode(fontNamed: "AvenirNext-Heavy") + private let gameOverDetail = SKLabelNode(fontNamed: "Menlo-Bold") + private let gameOverRecord = SKLabelNode(fontNamed: "Menlo-Bold") + + private var builtSize: CGSize = .zero + #if DEBUG + private var demoFreeze = false + #endif + + // MARK: - Lifecycle + + override func didMove(to view: SKView) { + anchorPoint = CGPoint(x: 0, y: 0) + scaleMode = .resizeFill + layoutScene() + #if DEBUG + let env = ProcessInfo.processInfo.environment + if env["ARCADE_AUTOPLAY"] == "1" { + startFromReady() + } + if env["ARCADE_DEMO"] == "1" { + startFromReady() + sim.debugPose(x: max(0, sim.padStart - 6), y: 42, vy: -2) + prevX = sim.x; prevY = sim.y + thrustUp = true + updateButtonVisuals() + demoFreeze = true + renderLander(currentTime: 0) + updateHUD() + } + #endif + } + + override func didChangeSize(_ oldSize: CGSize) { + guard view != nil, size != builtSize, size.width > 0 else { return } + layoutScene() + } + + // MARK: - Coordinate mapping + + private func scenePoint(_ lx: CGFloat, _ ly: CGFloat) -> CGPoint { + CGPoint(x: fieldOriginX + lx * unit, y: fieldOriginY + ly * unit) + } + + // MARK: - Build / layout + + private func layoutScene() { + builtSize = size + removeAllChildren() + backgroundColor = Palette.space1 + + let insets = view?.safeAreaInsets ?? .zero + topInset = insets.top + let bottomInset = insets.bottom + + // Background gradient + stars fill the whole scene. + let bg = SKSpriteNode(texture: SceneArt.verticalGradient(size: size, top: Palette.space0, bottom: Palette.space1)) + bg.anchorPoint = .zero + bg.zPosition = -10 + addChild(bg) + + // Two star layers for depth: dim far field + brighter near field. + let farStars = SceneArt.starfield(size: size, count: 70, seed: 0xFA57) + farStars.zPosition = -9.5 + farStars.alpha = 0.5 + farStars.setScale(0.7) + addChild(farStars) + let stars = SceneArt.starfield(size: size, count: 60, seed: 0xA11E5) + stars.zPosition = -9 + addChild(stars) + + // Soft nebula blooms in the upper sky. + let nebula1 = SceneArt.glowSprite(color: Palette.violet, radius: 210) + nebula1.position = CGPoint(x: size.width * 0.78, y: size.height * 0.80) + nebula1.alpha = 0.16 + nebula1.zPosition = -9.2 + addChild(nebula1) + let nebula2 = SceneArt.glowSprite(color: Palette.cyan, radius: 150) + nebula2.position = CGPoint(x: size.width * 0.14, y: size.height * 0.62) + nebula2.alpha = 0.10 + nebula2.zPosition = -9.2 + addChild(nebula2) + + let dust = SceneArt.ambientDust(size: size) + dust.position = CGPoint(x: size.width / 2, y: size.height / 2) + dust.zPosition = -8.8 + addChild(dust) + + // The field spans the full width — the world, not a windowed port. + // (128×96 logical: the original terrain plus the taller remake sky.) + unit = size.width / CGFloat(LanderSim.fieldWidth) + fieldOriginX = 0 + let fieldH = CGFloat(LanderSim.fieldHeight) * unit + let fieldW = CGFloat(LanderSim.fieldWidth) * unit + + controlBarHeight = max(bottomInset + 176, size.height * 0.24) + let hudHeight: CGFloat = 58 + let viewportTop = size.height - topInset - hudHeight + let viewportBottom = controlBarHeight + // Sit the field just above the controls; the remaining slack becomes + // open sky above (the space the lander descends from). + let slack = max(0, (viewportTop - viewportBottom) - fieldH) + fieldOriginY = viewportBottom + min(slack, 30) + + let fieldRect = CGRect(x: fieldOriginX, y: fieldOriginY, width: fieldW, height: fieldH) + + // Bedrock continues the terrain below the field so the ground runs + // under the control pads instead of stopping at an arbitrary line. + let bedrock = SKSpriteNode(texture: SceneArt.verticalGradient( + size: CGSize(width: size.width, height: fieldOriginY + 2), + top: UIColor(red: 0.045, green: 0.070, blue: 0.098, alpha: 1), // = terrain rockBottom + bottom: UIColor(red: 0.018, green: 0.030, blue: 0.046, alpha: 1))) + bedrock.anchorPoint = .zero + bedrock.position = .zero + bedrock.zPosition = -1 + addChild(bedrock) + + // Crop node clips the lander to the field (enforces the ceiling/edges). + worldCrop.removeAllChildren() + let mask = SKSpriteNode(color: .white, size: fieldRect.size) + mask.position = CGPoint(x: fieldRect.midX, y: fieldRect.midY) + worldCrop.maskNode = mask + worldCrop.position = .zero + worldCrop.zPosition = 0 + addChild(worldCrop) + + let vignette = SceneArt.vignette(size: size, alpha: 0.42) + vignette.position = CGPoint(x: size.width / 2, y: size.height / 2) + addChild(vignette) + + buildLander() + buildHUD() + buildControls(bottomInset: bottomInset) + buildReadyOverlay(fieldRect: fieldRect) + buildLandedOverlay(fieldRect: fieldRect) + buildGameOverOverlay() + + refreshTerrain() + prevX = sim.x; prevY = sim.y + + // Restore visuals for the current state (layout can happen mid-run on rotation). + applyStateVisibility() + renderLander(currentTime: lastUpdate) + updateHUD() + } + + private func buildLander() { + let px = CGFloat(LanderSim.landerSize) * unit + lander = SKSpriteNode(texture: SceneArt.landerTexture()) + // Drawn a touch over the 8×8 logical footprint for presence; the sim's + // collision box is unchanged. + lander.size = CGSize(width: px * 1.18, height: px * 1.18) + lander.zPosition = 5 + + // Particle exhaust jets replace the old triangle flames. Birth rates + // are toggled from renderLander; target the world so plumes linger. + mainJet = SceneArt.thrustEmitter(color: Palette.amber, angle: -.pi / 2, + speed: 180, birthRate: 0, scale: 0.34, lifetime: 0.32) + mainJet.position = CGPoint(x: 0, y: -px * 0.52) + leftJet = SceneArt.thrustEmitter(color: Palette.cyan, angle: .pi, + speed: 130, birthRate: 0, scale: 0.22, lifetime: 0.22) + leftJet.position = CGPoint(x: -px * 0.55, y: -px * 0.08) + rightJet = SceneArt.thrustEmitter(color: Palette.cyan, angle: 0, + speed: 130, birthRate: 0, scale: 0.22, lifetime: 0.22) + rightJet.position = CGPoint(x: px * 0.55, y: -px * 0.08) + [mainJet, leftJet, rightJet].forEach { + $0.zPosition = -1 + lander.addChild($0) + $0.targetNode = worldCrop + } + + engineGlow = SceneArt.glowSprite(color: Palette.amber, radius: px * 0.7) + engineGlow.position = CGPoint(x: 0, y: -px * 0.45) + engineGlow.alpha = 0 + engineGlow.zPosition = -2 + lander.addChild(engineGlow) + + worldCrop.addChild(lander) + } + + /// Rebuilds terrain + pad geometry from the current sim (call after new terrain). + private func refreshTerrain() { + let s = sim.surface + let fieldW = CGFloat(LanderSim.fieldWidth) * unit + let fieldH = CGFloat(LanderSim.fieldHeight) * unit + + // A distant ridge behind the terrain — pure set dressing for depth. + ridgeSprite.removeFromParent() + ridgeSprite = SKSpriteNode(texture: ridgeTexture(width: fieldW, height: fieldH * 0.5)) + ridgeSprite.anchorPoint = .zero + ridgeSprite.position = CGPoint(x: fieldOriginX, y: fieldOriginY) + ridgeSprite.alpha = 0.55 + ridgeSprite.zPosition = 0.5 + worldCrop.addChild(ridgeSprite) + + terrainSprite.removeFromParent() + terrainSprite = SKSpriteNode(texture: terrainTexture(width: fieldW, height: fieldH)) + terrainSprite.anchorPoint = .zero + terrainSprite.position = CGPoint(x: fieldOriginX, y: fieldOriginY) + terrainSprite.zPosition = 1 + worldCrop.addChild(terrainSprite) + + let padY = CGFloat(sim.padHeight) + let padL = scenePoint(CGFloat(sim.padStart), padY) + let padR = scenePoint(CGFloat(sim.padStart + LanderSim.padWidth), padY) + + // Landing light cone rising from the pad. + padCone.removeFromParent() + padCone = SKSpriteNode(texture: SceneArt.verticalGradient( + size: CGSize(width: padR.x - padL.x, height: 64), + top: UIColor.clear, bottom: Palette.amber.withAlphaComponent(0.16))) + padCone.anchorPoint = CGPoint(x: 0.5, y: 0) + padCone.position = CGPoint(x: (padL.x + padR.x) / 2, y: padL.y) + padCone.blendMode = .add + padCone.zPosition = 2.5 + padCone.run(.repeatForever(.sequence([ + .fadeAlpha(to: 0.55, duration: 1.1), .fadeAlpha(to: 1.0, duration: 1.1)]))) + worldCrop.addChild(padCone) + + let pad = CGMutablePath() + pad.move(to: padL) + pad.addLine(to: padR) + padLine.removeFromParent() + padLine = SKShapeNode(path: pad) + padLine.strokeColor = Palette.amber + padLine.lineWidth = 3 + padLine.lineCap = .round + padLine.glowWidth = 3 + padLine.zPosition = 3 + worldCrop.addChild(padLine) + + padPostL.fillColor = Palette.amber + padPostR.fillColor = Palette.amber + padPostL.strokeColor = .clear + padPostR.strokeColor = .clear + padPostL.zPosition = 3 + padPostR.zPosition = 3 + padPostL.position = padL + padPostR.position = padR + padPostL.removeFromParent(); padPostR.removeFromParent() + worldCrop.addChild(padPostL); worldCrop.addChild(padPostR) + + // Blinking approach beacons along the pad. + padBeacons.forEach { $0.removeFromParent() } + padBeacons.removeAll() + for k in 0..<3 { + let beacon = SKShapeNode(circleOfRadius: 2.2) + beacon.fillColor = Palette.mint + beacon.strokeColor = .clear + beacon.glowWidth = 3 + let t = CGFloat(k + 1) / 4 + beacon.position = CGPoint(x: padL.x + (padR.x - padL.x) * t, y: padL.y + 4) + beacon.zPosition = 3.5 + beacon.alpha = 0.15 + beacon.run(.repeatForever(.sequence([ + .wait(forDuration: 0.22 * Double(k)), + .fadeAlpha(to: 1, duration: 0.16), + .fadeAlpha(to: 0.15, duration: 0.5), + .wait(forDuration: 0.22 * Double(2 - k)), + ]))) + worldCrop.addChild(beacon) + padBeacons.append(beacon) + } + } + + /// Renders the sim's surface as gradient rock with speckle grain and a + /// glowing rim light along the skyline. + private func terrainTexture(width: CGFloat, height: CGFloat) -> SKTexture { + let s = sim.surface + let n = LanderSim.fieldWidth + let renderer = UIGraphicsImageRenderer(size: CGSize(width: width, height: height)) + let image = renderer.image { ctx in + let cg = ctx.cgContext + let path = CGMutablePath() + path.move(to: CGPoint(x: 0, y: height)) + for i in 0.. SKTexture { + var rng = SeededGenerator(seed: 0x51D6E) + let renderer = UIGraphicsImageRenderer(size: CGSize(width: width, height: height)) + let image = renderer.image { ctx in + let cg = ctx.cgContext + let path = CGMutablePath() + path.move(to: CGPoint(x: 0, y: height)) + var y = CGFloat.random(in: height * 0.35...height * 0.7, using: &rng) + var x: CGFloat = 0 + while x < width { + let step = CGFloat.random(in: 26...64, using: &rng) + x += step + y = max(height * 0.16, min(height * 0.85, + y + CGFloat.random(in: -height * 0.28...height * 0.28, using: &rng))) + path.addLine(to: CGPoint(x: x, y: y)) + } + path.addLine(to: CGPoint(x: width, y: height)) + path.closeSubpath() + cg.addPath(path) + UIColor(red: 0.058, green: 0.086, blue: 0.155, alpha: 1).setFill() + cg.fillPath() + } + return SKTexture(image: image) + } + + // MARK: - HUD + + private func buildHUD() { + let hudY = size.height - topInset - 26 + + // V-SPEED (left, clear of the back button); the caption teaches the + // original's landing rule — touchdown is survivable at descent ≤3. + let vspdCaption = caption("V-SPEED · SAFE ≤3", x: 74, y: hudY + 12, align: .left) + addChild(vspdCaption) + vspdValue.fontSize = 20 + vspdValue.horizontalAlignmentMode = .left + vspdValue.verticalAlignmentMode = .center + vspdValue.position = CGPoint(x: 74, y: hudY - 8) + vspdValue.fontColor = Palette.mint + vspdValue.zPosition = 20 + addChild(vspdValue) + + // SCORE (right) + let scoreCaption = caption("SCORE", x: size.width - 20, y: hudY + 12, align: .right) + addChild(scoreCaption) + scoreValue.fontSize = 20 + scoreValue.horizontalAlignmentMode = .right + scoreValue.verticalAlignmentMode = .center + scoreValue.position = CGPoint(x: size.width - 20, y: hudY - 8) + scoreValue.fontColor = .white + scoreValue.zPosition = 20 + addChild(scoreValue) + + // FUEL bar (center) + fuelBarWidth = min(150, size.width * 0.36) + let fuelCaption = caption("FUEL", x: size.width / 2, y: hudY + 12, align: .center) + addChild(fuelCaption) + let barY = hudY - 8 + let barRect = CGRect(x: -fuelBarWidth / 2, y: -5, width: fuelBarWidth, height: 10) + fuelBarBg.path = CGPath(roundedRect: barRect, cornerWidth: 5, cornerHeight: 5, transform: nil) + fuelBarBg.fillColor = UIColor(white: 1, alpha: 0.10) + fuelBarBg.strokeColor = UIColor(white: 1, alpha: 0.18) + fuelBarBg.lineWidth = 1 + fuelBarBg.position = CGPoint(x: size.width / 2, y: barY) + fuelBarBg.zPosition = 20 + addChild(fuelBarBg) + fuelBarFill.position = CGPoint(x: size.width / 2 - fuelBarWidth / 2, y: barY) + fuelBarFill.zPosition = 21 + fuelBarFill.strokeColor = .clear + addChild(fuelBarFill) + } + + private func caption(_ text: String, x: CGFloat, y: CGFloat, align: SKLabelHorizontalAlignmentMode) -> SKLabelNode { + let label = SKLabelNode(fontNamed: "Menlo-Bold") + label.text = text + label.fontSize = 10 + label.fontColor = Palette.white40 + label.horizontalAlignmentMode = align + label.verticalAlignmentMode = .center + label.position = CGPoint(x: x, y: y) + label.zPosition = 20 + return label + } + + // MARK: - Controls + + private func buildControls(bottomInset: CGFloat) { + let cy = bottomInset + (controlBarHeight - bottomInset) * 0.5 + let sideR: CGFloat = 46 + let upR: CGFloat = 54 + + btnLeft.configure(radius: sideR, tint: Palette.cyan) + btnRight.configure(radius: sideR, tint: Palette.cyan) + btnUp.configure(radius: upR, tint: Palette.mint) + + btnLeft.position = CGPoint(x: size.width * 0.19, y: cy) + btnRight.position = CGPoint(x: size.width * 0.81, y: cy) + btnUp.position = CGPoint(x: size.width * 0.5, y: cy - 2) + [btnLeft, btnUp, btnRight].forEach { $0.zPosition = 20; addChild($0) } + } + + // MARK: - Overlays + + private func buildReadyOverlay(fieldRect: CGRect) { + readyOverlay.removeAllChildren() + readyOverlay.zPosition = 40 + addChild(readyOverlay) + + let dim = SKSpriteNode(color: UIColor(white: 0.02, alpha: 0.62), size: size) + dim.anchorPoint = .zero + readyOverlay.addChild(dim) + + let cx = size.width / 2 + let midY = size.height * 0.62 + + readyOverlay.addChild(bigLabel("LUNAR LANDER", size: 32, color: .white, x: cx, y: midY + 70)) + readyOverlay.addChild(bigLabel("Kill your descent. Set down gently on the pad.", + fontNamed: "AvenirNext-Medium", size: 15, color: Palette.white70, + x: cx, y: midY + 36, maxWidth: size.width - 70)) + + // Difficulty steppers (fuel/speed are the original's title-screen + // settings; gravity is the remake's third knob). + buildStepper(title: "FUEL", value: fuelValueLabel, valueText: "\(chosenFuel)", + y: midY - 18, keyMinus: "fuelMinus", keyPlus: "fuelPlus", + hint: "more fuel = easier · smaller bonus") + buildStepper(title: "MAX SPEED", value: speedValueLabel, valueText: "\(chosenVel)", + y: midY - 86, keyMinus: "speedMinus", keyPlus: "speedPlus", + hint: "top fall speed · touch down at ▼3 or slower") + buildStepper(title: "GRAVITY", value: gravityValueLabel, valueText: chosenGravity.name, + y: midY - 154, keyMinus: "gravMinus", keyPlus: "gravPlus", + hint: "heavier world: harder pull, real drift · score ×2 ×3") + + let prompt = bigLabel("TAP TO LAUNCH", fontNamed: "Menlo-Bold", size: 16, color: Palette.mint, + x: cx, y: midY - 216) + prompt.run(.repeatForever(.sequence([.fadeAlpha(to: 0.35, duration: 0.7), .fadeAlpha(to: 1, duration: 0.7)]))) + readyOverlay.addChild(prompt) + + readyOverlay.addChild(bigLabel("◄ ► side thrusters ▲ main thrust", + fontNamed: "Menlo", size: 12, color: Palette.white40, + x: cx, y: max(controlBarHeight + 26, midY - 248))) + } + + private func buildStepper(title: String, value: SKLabelNode, valueText: String, y: CGFloat, + keyMinus: String, keyPlus: String, hint: String) { + let cx = size.width / 2 + readyOverlay.addChild(bigLabel(title, fontNamed: "Menlo-Bold", size: 12, color: Palette.white70, + x: cx, y: y + 26)) + readyOverlay.addChild(bigLabel(hint, fontNamed: "Menlo", size: 11, color: Palette.white40, + x: cx, y: y - 30)) + + let minusX = cx - 78 + let plusX = cx + 78 + let btnSize = CGSize(width: 44, height: 40) + readyOverlay.addChild(stepperButton("−", center: CGPoint(x: minusX, y: y))) + readyOverlay.addChild(stepperButton("+", center: CGPoint(x: plusX, y: y))) + stepperRects[keyMinus] = CGRect(x: minusX - btnSize.width / 2, y: y - btnSize.height / 2, + width: btnSize.width, height: btnSize.height) + stepperRects[keyPlus] = CGRect(x: plusX - btnSize.width / 2, y: y - btnSize.height / 2, + width: btnSize.width, height: btnSize.height) + + value.text = valueText + value.fontSize = 26 + value.fontColor = .white + value.horizontalAlignmentMode = .center + value.verticalAlignmentMode = .center + value.position = CGPoint(x: cx, y: y) + readyOverlay.addChild(value) + } + + private func stepperButton(_ glyph: String, center: CGPoint) -> SKNode { + let node = SKShapeNode(rectOf: CGSize(width: 44, height: 40), cornerRadius: 12) + node.fillColor = UIColor(white: 1, alpha: 0.10) + node.strokeColor = Palette.mint.withAlphaComponent(0.5) + node.lineWidth = 1 + node.position = center + let label = SKLabelNode(fontNamed: "Menlo-Bold") + label.text = glyph + label.fontSize = 24 + label.fontColor = Palette.mint + label.verticalAlignmentMode = .center + label.horizontalAlignmentMode = .center + node.addChild(label) + return node + } + + private func buildLandedOverlay(fieldRect: CGRect) { + landedOverlay.removeAllChildren() + landedOverlay.zPosition = 40 + addChild(landedOverlay) + let cx = size.width / 2 + let y = fieldRect.maxY + 30 + + landedTitle.text = "THE HAWK HAS LANDED" + landedTitle.fontSize = 22 + landedTitle.fontColor = Palette.mint + landedTitle.horizontalAlignmentMode = .center + landedTitle.position = CGPoint(x: cx, y: min(y + 18, size.height - topInset - 40)) + landedOverlay.addChild(landedTitle) + + landedDetail.fontSize = 15 + landedDetail.fontColor = .white + landedDetail.horizontalAlignmentMode = .center + landedDetail.position = CGPoint(x: cx, y: landedTitle.position.y - 26) + landedOverlay.addChild(landedDetail) + } + + private func buildGameOverOverlay() { + gameOverOverlay.removeAllChildren() + gameOverOverlay.zPosition = 40 + addChild(gameOverOverlay) + + let dim = SKSpriteNode(color: UIColor(white: 0.02, alpha: 0.66), size: size) + dim.anchorPoint = .zero + gameOverOverlay.addChild(dim) + + let cx = size.width / 2 + let midY = size.height * 0.6 + gameOverTitle.fontSize = 34 + gameOverTitle.horizontalAlignmentMode = .center + gameOverTitle.position = CGPoint(x: cx, y: midY + 40) + gameOverOverlay.addChild(gameOverTitle) + + gameOverDetail.fontSize = 16 + gameOverDetail.fontColor = .white + gameOverDetail.horizontalAlignmentMode = .center + gameOverDetail.position = CGPoint(x: cx, y: midY) + gameOverOverlay.addChild(gameOverDetail) + + gameOverRecord.fontSize = 14 + gameOverRecord.fontColor = Palette.amber + gameOverRecord.horizontalAlignmentMode = .center + gameOverRecord.position = CGPoint(x: cx, y: midY - 26) + gameOverOverlay.addChild(gameOverRecord) + + let prompt = bigLabel("TAP TO PLAY AGAIN", fontNamed: "Menlo-Bold", size: 16, color: Palette.mint, + x: cx, y: midY - 66) + prompt.run(.repeatForever(.sequence([.fadeAlpha(to: 0.35, duration: 0.7), .fadeAlpha(to: 1, duration: 0.7)]))) + gameOverOverlay.addChild(prompt) + } + + private func bigLabel(_ text: String, fontNamed: String = "AvenirNext-Heavy", size fontSize: CGFloat, + color: UIColor, x: CGFloat, y: CGFloat, maxWidth: CGFloat? = nil) -> SKLabelNode { + let label = SKLabelNode(fontNamed: fontNamed) + label.text = text + label.fontSize = fontSize + label.fontColor = color + label.horizontalAlignmentMode = .center + label.verticalAlignmentMode = .center + label.position = CGPoint(x: x, y: y) + if let maxWidth { + label.preferredMaxLayoutWidth = maxWidth + label.numberOfLines = 0 + } + return label + } + + // MARK: - Game loop + + override func update(_ currentTime: TimeInterval) { + if lastUpdate == 0 { lastUpdate = currentTime; stateEnteredTime = currentTime } + #if DEBUG + if demoFreeze { renderLander(currentTime: currentTime); updateHUD(); return } + #endif + var dt = currentTime - lastUpdate + lastUpdate = currentTime + if dt > 0.25 { dt = 0.25 } + + if state == .playing { + accumulator += dt + while accumulator >= simInterval { + prevX = sim.x; prevY = sim.y + let outcome = sim.tick(left: thrustLeft || latchLeft, + up: thrustUp || latchUp, + right: thrustRight || latchRight) + latchLeft = false; latchUp = false; latchRight = false + accumulator -= simInterval + if outcome != .flying { handleOutcome(outcome); break } + } + } else if state == .landed, currentTime - stateEnteredTime > 1.9 { + advanceToNextTerrain() + } + + renderLander(currentTime: currentTime) + updateHUD() + } + + private func renderLander(currentTime: TimeInterval) { + let frac: CGFloat = state == .playing ? CGFloat(min(1, accumulator / simInterval)) : 0 + let rx = state == .playing ? lerp(prevX, sim.x, frac) : CGFloat(sim.x) + let ry = state == .playing ? lerp(prevY, sim.y, frac) : CGFloat(sim.y) + // Sprite centre sits at the middle of the 8×8 footprint. + lander.position = scenePoint(rx + 3.5, ry - 3.5) + + let firing = state == .playing && sim.fuel > 0 + mainJet.particleBirthRate = (firing && thrustUp) ? 150 : 0 + leftJet.particleBirthRate = (firing && thrustLeft) ? 90 : 0 + rightJet.particleBirthRate = (firing && thrustRight) ? 90 : 0 + let glowTarget: CGFloat = (firing && thrustUp) ? 0.75 : 0 + engineGlow.alpha += (glowTarget - engineGlow.alpha) * 0.35 + } + + private func updateHUD() { + scoreValue.text = "\(totalScore)" + + let rate = sim.descentRate + if rate > 0 { vspdValue.text = "▼\(rate)" } + else if rate < 0 { vspdValue.text = "▲\(-rate)" } + else { vspdValue.text = "0" } + vspdValue.fontColor = sim.isSafeDescent ? Palette.mint : Palette.red + + let frac = CGFloat(sim.fuelFraction) + let w = max(0, fuelBarWidth * frac) + fuelBarFill.path = CGPath(roundedRect: CGRect(x: 0, y: -5, width: w, height: 10), + cornerWidth: 5, cornerHeight: 5, transform: nil) + fuelBarFill.fillColor = frac > 0.5 ? Palette.mint : (frac > 0.22 ? Palette.amber : Palette.red) + } + + private func lerp(_ a: Int, _ b: Int, _ t: CGFloat) -> CGFloat { + CGFloat(a) + (CGFloat(b) - CGFloat(a)) * t + } + + // MARK: - State transitions + + private func handleOutcome(_ outcome: LanderSim.Outcome) { + renderLander(currentTime: lastUpdate) // settle the sprite on the outcome position + switch outcome { + case .landed: + totalScore += sim.lastLandingScore + enter(.landed) + landedDetail.text = "+\(sim.lastLandingScore) · SCORE \(totalScore) · TAP TO CONTINUE" + spawnTouchdownDust() + worldCrop.run(SceneArt.shake(intensity: 3, duration: 0.2)) + Haptics.success() + case .crashed: + let record = HighScoreStore.shared.submit(id: "lander", score: totalScore) + spawnCrashExplosion() + enter(.gameOver) + gameOverTitle.text = "CRASHED" + gameOverTitle.fontColor = Palette.red + gameOverDetail.text = "SCORE \(totalScore) BEST \(HighScoreStore.shared.best("lander"))" + gameOverRecord.text = record ? "★ NEW BEST ★" : "" + Haptics.error() + case .flying: + break + } + thrustLeft = false; thrustUp = false; thrustRight = false + latchLeft = false; latchUp = false; latchRight = false + updateButtonVisuals() + } + + /// A soft ring of kicked-up dust on a good touchdown. + private func spawnTouchdownDust() { + let dust = SceneArt.sparkBurst(color: UIColor(white: 0.85, alpha: 1), + count: 18, speed: 70, lifetime: 0.8, scale: 0.16) + dust.position = CGPoint(x: lander.position.x, y: lander.position.y - lander.size.height * 0.45) + dust.emissionAngle = .pi / 2 + dust.emissionAngleRange = .pi * 0.9 + dust.yAcceleration = -140 + dust.zPosition = 6 + worldCrop.addChild(dust) + } + + /// Flash + two-tone spark burst + tumbling debris + a hard shake. + private func spawnCrashExplosion() { + let at = lander.position + addChild(SceneArt.flash(size: size, color: Palette.amber, peak: 0.26, duration: 0.3)) + + let fire = SceneArt.sparkBurst(color: Palette.amber, count: 34, speed: 250, lifetime: 0.8, scale: 0.3) + fire.position = at + fire.zPosition = 7 + worldCrop.addChild(fire) + let embers = SceneArt.sparkBurst(color: Palette.red, count: 22, speed: 150, lifetime: 1.0, scale: 0.24) + embers.position = at + embers.zPosition = 7 + worldCrop.addChild(embers) + + let core = SceneArt.glowSprite(color: Palette.amber, radius: 60) + core.position = at + core.zPosition = 6.5 + core.run(.sequence([ + .group([.scale(to: 2.2, duration: 0.28), .fadeOut(withDuration: 0.32)]), + .removeFromParent()])) + worldCrop.addChild(core) + + for _ in 0..<6 { + let chunk = SKSpriteNode(color: Palette.mint.withAlphaComponent(0.9), + size: CGSize(width: 4, height: 4)) + chunk.position = at + chunk.zPosition = 6 + let dx = CGFloat.random(in: -70...70) + let dy = CGFloat.random(in: 20...110) + chunk.run(.sequence([ + .group([ + .moveBy(x: dx, y: dy, duration: 0.5), + .rotate(byAngle: CGFloat.random(in: -6...6), duration: 0.5), + .sequence([.wait(forDuration: 0.25), .fadeOut(withDuration: 0.25)]), + ]), + .removeFromParent()])) + worldCrop.addChild(chunk) + } + + worldCrop.run(SceneArt.shake(intensity: 11, duration: 0.5)) + } + + private func advanceToNextTerrain() { + sim.newTerrain() + refreshTerrain() + prevX = sim.x; prevY = sim.y + accumulator = 0 + enter(.playing) + } + + private func startFromReady() { + sim.setDifficulty(maxFuel: chosenFuel, maxVel: chosenVel, gravity: chosenGravity) + sim.resetLander() + totalScore = 0 + prevX = sim.x; prevY = sim.y + accumulator = 0 + enter(.playing) + } + + private func gameOverToReady() { + sim.newTerrain() + refreshTerrain() + prevX = sim.x; prevY = sim.y + enter(.ready) + } + + private func enter(_ newState: GameState) { + state = newState + stateEnteredTime = lastUpdate + applyStateVisibility() + } + + private func applyStateVisibility() { + readyOverlay.isHidden = state != .ready + landedOverlay.isHidden = state != .landed + gameOverOverlay.isHidden = state != .gameOver + lander.isHidden = state == .ready || state == .gameOver + let controlsVisible = state == .playing + [btnLeft, btnUp, btnRight].forEach { $0.alpha = controlsVisible ? 1 : 0.28 } + } + + // MARK: - Touch handling + + override func touchesBegan(_ touches: Set, with event: UIEvent?) { + for touch in touches { + let p = touch.location(in: self) + // A tap that drives a state transition is consumed — it must not + // double as a thruster press (a start tap on the flame button used + // to burn on the very first tick). + switch state { + case .ready: + if !handleStepperTap(at: p) { startFromReady() } + continue + case .landed: + advanceToNextTerrain() + continue + case .gameOver: + gameOverToReady() + continue + case .playing: + activeTouches.insert(touch) + } + } + recomputeControls() + } + + override func touchesMoved(_ touches: Set, with event: UIEvent?) { + recomputeControls() + } + + override func touchesEnded(_ touches: Set, with event: UIEvent?) { + for touch in touches { activeTouches.remove(touch) } + recomputeControls() + } + + override func touchesCancelled(_ touches: Set, with event: UIEvent?) { + for touch in touches { activeTouches.remove(touch) } + recomputeControls() + } + + private func handleStepperTap(at p: CGPoint) -> Bool { + for (key, rect) in stepperRects where rect.contains(p) { + switch key { + case "fuelMinus": chosenFuel = max(30, chosenFuel - 1) + case "fuelPlus": chosenFuel = min(80, chosenFuel + 1) + case "speedMinus": chosenVel = max(4, chosenVel - 1) + case "speedPlus": chosenVel = min(7, chosenVel + 1) + case "gravMinus": + chosenGravity = LanderSim.Gravity(rawValue: max(0, chosenGravity.rawValue - 1)) ?? .moon + case "gravPlus": + chosenGravity = LanderSim.Gravity(rawValue: min(2, chosenGravity.rawValue + 1)) ?? .earth + default: break + } + fuelValueLabel.text = "\(chosenFuel)" + speedValueLabel.text = "\(chosenVel)" + gravityValueLabel.text = chosenGravity.name + UserDefaults.standard.set(chosenFuel, forKey: "lander.fuel") + UserDefaults.standard.set(chosenVel, forKey: "lander.vel") + UserDefaults.standard.set(chosenGravity.rawValue, forKey: "lander.gravity") + Haptics.selection() + return true + } + return false + } + + private func recomputeControls() { + var l = false, u = false, r = false + if state == .playing { + for touch in activeTouches { + let p = touch.location(in: self) + if btnLeft.covers(p) { l = true } + if btnUp.covers(p) { u = true } + if btnRight.covers(p) { r = true } + } + } + thrustLeft = l; thrustUp = u; thrustRight = r + + // Rising edges: latch for the next tick + haptic feedback. + if l && !lastLeft { latchLeft = true } + if u && !lastUp { latchUp = true } + if r && !lastRight { latchRight = true } + if (l && !lastLeft) || (u && !lastUp) || (r && !lastRight) { + Haptics.impact(.light, intensity: 0.5) + } + lastLeft = l; lastUp = u; lastRight = r + updateButtonVisuals() + } + + private func updateButtonVisuals() { + btnLeft.setPressed(thrustLeft) + btnUp.setPressed(thrustUp) + btnRight.setPressed(thrustRight) + } +} + +/// A round on-screen control pad with an SF-symbol glyph and a pressed state. +final class ControlButton: SKNode { + private let base = SKShapeNode() + private let glyph = SKSpriteNode() + private let symbolName: String + private var radius: CGFloat = 46 + private var tint: UIColor = .white + + init(symbol: String) { + self.symbolName = symbol + super.init() + } + required init?(coder: NSCoder) { fatalError("init(coder:) has not been used") } + + func configure(radius: CGFloat, tint: UIColor) { + self.radius = radius + self.tint = tint + base.removeFromParent() + glyph.removeFromParent() + base.path = CGPath(ellipseIn: CGRect(x: -radius, y: -radius, width: radius * 2, height: radius * 2), transform: nil) + base.fillColor = tint.withAlphaComponent(0.12) + base.strokeColor = tint.withAlphaComponent(0.55) + base.lineWidth = 1.5 + base.glowWidth = 0.5 + addChild(base) + + if let tex = SceneArt.symbolTexture(symbolName, pointSize: radius * 0.9, color: tint) { + glyph.texture = tex + glyph.size = tex.size() + let maxDim = radius * 0.9 + let s = min(maxDim / max(tex.size().width, 1), maxDim / max(tex.size().height, 1)) + glyph.size = CGSize(width: tex.size().width * s, height: tex.size().height * s) + addChild(glyph) + } + } + + func covers(_ p: CGPoint) -> Bool { + let dx = p.x - position.x, dy = p.y - position.y + return dx * dx + dy * dy <= (radius + 8) * (radius + 8) + } + + func setPressed(_ pressed: Bool) { + base.fillColor = tint.withAlphaComponent(pressed ? 0.34 : 0.12) + setScale(pressed ? 1.06 : 1.0) + } +} diff --git a/Arcade85/Games/Lander/LanderSim.swift b/Arcade85/Games/Lander/LanderSim.swift new file mode 100644 index 0000000..682ce2a --- /dev/null +++ b/Arcade85/Games/Lander/LanderSim.swift @@ -0,0 +1,214 @@ +import Foundation + +/// A faithful port of the TI-85 "Lunar Lander" (Tiger/Istar, 1997) game logic +/// from `LANDER.C`. Physics, terrain generation, landing tolerances and scoring +/// are the original's integer rules verbatim on the Moon setting; the SpriteKit +/// scene scales the field up for HD rendering. +/// +/// Coordinate convention (from the original): `y` is height above the floor, +/// larger = higher; gravity decrements `vy` each tick; `x` is the left edge of +/// the 8-wide lander. `surface[i]` is the terrain height (0…32) at column `i`. +/// +/// HD-remake liberties (everything else is the original's integer rules): +/// - The field is 128×96 instead of 128×64 — extra sky above the same 0…32 +/// terrain, giving a phone-shaped playfield and room to fly the descent. +/// - The field edges are soft walls: drifting into the top or sides stops the +/// lander instead of ending the run (the original's screen edge was fatal, +/// which on touch turned a mistimed start tap into an instant loss). +/// - A gravity setting (Moon/Mars/Earth). Moon is the original: pull 1/tick, +/// side drift auto-damped every tick. Heavier worlds pull harder AND keep +/// more of your sideways momentum, so you must burn to counter-correct — +/// and multiply the landing score ×2/×3. +struct LanderSim { + static let fieldWidth = 128 + static let fieldHeight = 96 // original: 64 (see header note) + static let landerSize = 8 // sprite is 8 px wide/tall in the original + static let padWidth = 10 + + /// The gravity/handling worlds. `pull(_:)`/`damps(_:)` are phase patterns + /// over the tick counter so everything stays integer-exact: + /// - moon: pull 1 every tick, damping every tick (the original) + /// - mars: pull 2 every 4th, damping every other tick (avg 1.25) + /// - earth: pull 2 every other, no damping — Newtonian (avg 1.5) + enum Gravity: Int, CaseIterable { + case moon = 0, mars, earth + var name: String { ["MOON", "MARS", "EARTH"][rawValue] } + var scoreMultiplier: Int { rawValue + 1 } + func pull(_ phase: Int) -> Int { + switch self { + case .moon: return 1 + case .mars: return phase % 4 == 3 ? 2 : 1 + case .earth: return phase % 2 == 1 ? 2 : 1 + } + } + func damps(_ phase: Int) -> Bool { + switch self { + case .moon: return true + case .mars: return phase % 2 == 0 + case .earth: return false + } + } + } + + // Difficulty — fuel/speed are the original's main-menu settings (fuel + // 30…80, speed now 4…7: at 3 terminal velocity equals the safe landing + // speed and the game can't be lost). Gravity is the remake's third knob. + var maxFuel: Int + var maxVel: Int + var gravity: Gravity = .moon + + // Terrain + private(set) var surface = [Int](repeating: 0, count: fieldWidth) + private(set) var padStart = 0 + private(set) var padHeight = 0 + + // Lander state + private(set) var x = 0 + private(set) var y = 0 + private(set) var vx = 0 + private(set) var vy = 0 + private(set) var fuel = 0 + + enum Outcome: Equatable { case flying, landed, crashed } + private(set) var outcome: Outcome = .flying + private(set) var lastLandingScore = 0 + private var gravPhase = 0 + + private var rng: SeededGenerator + + init(maxFuel: Int = 40, maxVel: Int = 7, gravity: Gravity = .moon, seed: UInt64? = nil) { + self.maxFuel = maxFuel + self.maxVel = maxVel + self.gravity = gravity + self.rng = SeededGenerator(seed: seed ?? UInt64.random(in: 1...UInt64.max)) + newTerrain() + } + + /// 15-bit pseudo-random value, mirroring the original C `rand()` range. + private mutating func rand() -> Int { Int(rng.next() & 0x7FFF) } + + // MARK: - Terrain + + /// Generates a fresh landscape + landing pad and resets the lander. This is + /// the "landscape generator" from LANDER.C (© Dape/Istar) plus pad carving. + mutating func newTerrain() { + var s = [Int](repeating: 0, count: Self.fieldWidth) + + s[0] = (rand() & 0x1F) + (rand() & 0x1F) + if s[0] > 32 { s[0] = 32 } + for i in 1.. 32 { k = 32 } + if k < 0 { k = 0 } + s[i] = k + } + + // Erosion: repeated weighted smoothing passes. + let passes = (rand() & 0x0F) + 2 + for _ in 0..> 2 + } + } + + // Carve a flat landing pad, dropped 4 below the surrounding terrain. + let start = 32 + (rand() & 0x3F) // 32…95 + var h = s[start] - 4 + if h < 0 { h = 0 } + for i in start.. Outcome { + guard outcome == .flying else { return outcome } + + vy -= gravity.pull(gravPhase) // gravity (original: −1 every tick) + if left, fuel > 0 { vx -= 2; fuel -= 1 } + if right, fuel > 0 { vx += 2; fuel -= 1 } + if up, fuel > 0 { vy += 2; fuel -= 1 } + + if gravity.damps(gravPhase) { // horizontal damping (Moon: every tick) + if vx > 0 { vx -= 1 } else if vx < 0 { vx += 1 } + } + gravPhase += 1 + + vx = clamp(vx, -maxVel, maxVel) + vy = clamp(vy, -maxVel, maxVel) + + x += vx + y += vy + + // Soft walls: the field edge stops the lander, it doesn't end the run. + if y > Self.fieldHeight - 1 { y = Self.fieldHeight - 1; if vy > 0 { vy = 0 } } + if x < 0 { x = 0; if vx < 0 { vx = 0 } } + if x > Self.fieldWidth - Self.landerSize { + x = Self.fieldWidth - Self.landerSize + if vx > 0 { vx = 0 } + } + + // Landing / crash test across the 8-pixel footprint. + let l = surface[x] + var flat = 0 + for i in x..<(x + Self.landerSize) { + let sfc = surface[i] + if sfc > y - 9 && sfc == l && vy >= -3 { + flat += 1 + } else if (sfc > y - 9 && vy < -3) || (sfc > y - 4) { + outcome = .crashed + return outcome + } + } + if flat > 6 { + outcome = .landed + lastLandingScore = ((90 - maxFuel) * fuel / maxFuel) * maxVel * gravity.scoreMultiplier + } + return outcome + } + + // MARK: - Derived values for the HUD + + /// Positive when descending; this is the value the original crash test gates on. + var descentRate: Int { -vy } + /// A landing at the current vertical speed would be survivable (vy >= -3). + var isSafeDescent: Bool { vy >= -3 } + var fuelFraction: Double { maxFuel > 0 ? Double(fuel) / Double(maxFuel) : 0 } + + private func clamp(_ v: Int, _ lo: Int, _ hi: Int) -> Int { min(max(v, lo), hi) } + + #if DEBUG + /// Places the lander at a fixed state for screenshots/tests. + mutating func debugPose(x: Int, y: Int, vx: Int = 0, vy: Int = -2) { + self.x = x; self.y = y; self.vx = vx; self.vy = vy; self.outcome = .flying + } + #endif +} diff --git a/Arcade85/Games/Phoenix/PhoenixData.swift b/Arcade85/Games/Phoenix/PhoenixData.swift new file mode 100644 index 0000000..fe9034d --- /dev/null +++ b/Arcade85/Games/Phoenix/PhoenixData.swift @@ -0,0 +1,390 @@ +import Foundation + +/// Data tables for Phoenix 4.0 (Patrick Davidson, 2008), transcribed from +/// `images.asm` and `levels.asm`. Sprites are stored as 16-bit rows with bit 15 +/// = leftmost pixel; multi-part wide sprites from the original are already +/// merged. The campaign is the original's level list, command for command +/// (L_GOTO chains are inlined, which is exactly what the interpreter did). +enum PhoenixData { + + // MARK: - Sprites + + struct Sprite { + let w: Int + let h: Int + let rows: [UInt16] // bit 15 = leftmost pixel of the sprite + } + + enum Img: Hashable { + case enemy1, enemy2, enemy2a, enemy4, silo // silo = img_operator + case bounce, boss, boss2, swoop + case spin1a, spin1b, spin1c, spin1d + case spin2a, spin2b, spin2c, spin2d + case enemy3a, enemy3b, enemy3c, enemy3d + case playerShip, playerShipDamaged, companion + case pb0, pb1, pb2l, pb2r, pb3, pb5, pbQuad + case eb1, eb2, eb3, eb4, money + case x1, x2, x3, x4, x5, x6, x7, x8 + } + + /// Animated image sequences: (frame image, duration in game frames). + /// All original sequences loop from the start; the explosion instead ends + /// with a kill marker, which the sim special-cases. + enum Anim { + case spin1, spin2, enemy3, swoop + var frames: [(img: Img, time: Int)] { + switch self { + case .spin1: return [(.spin1a, 2), (.spin1b, 2), (.spin1c, 2), (.spin1d, 2)] + case .spin2: return [(.spin2a, 2), (.spin2b, 2), (.spin2c, 2), (.spin2d, 2)] + case .enemy3: return [(.enemy3a, 4), (.enemy3b, 4), (.enemy3c, 4), (.enemy3d, 4)] + case .swoop: return [(.swoop, 2), (.swoop, 2)] + } + } + } + + static let explosionFrames: [Img] = [.x1, .x2, .x3, .x4, .x5, .x6, .x7, .x8] + + private static func s8(_ w: Int, _ h: Int, _ rows: [UInt8]) -> Sprite { + Sprite(w: w, h: h, rows: rows.map { UInt16($0) << 8 }) + } + + static let sprites: [Img: Sprite] = [ + // Standard enemies + .enemy4: s8(7, 9, [0b10000010, 0b11000110, 0b11111110, 0b10000010, 0b10000010, + 0b10000010, 0b11111110, 0b01111100, 0b00111000]), + .enemy1: s8(6, 6, [0b10000100, 0b10000100, 0b11111100, 0b11111100, 0b01111000, 0b00110000]), + .enemy2: s8(8, 5, [0b10000001, 0b11011011, 0b11111111, 0b11011011, 0b10000001]), + .enemy2a: s8(5, 5, [0b10001000, 0b11111000, 0b10001000, 0b01010000, 0b00100000]), + .silo: s8(8, 8, [0b01111110, 0b11111111, 0b11000011, 0b11000011, 0b11000011, + 0b11000011, 0b11111111, 0b01111110]), + // Spinners (4-frame rotations) + .spin1a: s8(8, 8, [0b00100000, 0b00111100, 0b01111111, 0b01100110, 0b01100110, + 0b11111110, 0b00111100, 0b00000100]), + .spin1b: s8(8, 8, [0b00001000, 0b00111100, 0b01111110, 0b11100110, 0b01100111, + 0b01111110, 0b00111100, 0b00010000]), + .spin1c: s8(8, 8, [0b00000010, 0b10111100, 0b01111110, 0b01100110, 0b01100110, + 0b01111110, 0b00111101, 0b01000000]), + .spin1d: s8(8, 8, [0b01000000, 0b01111111, 0b01111110, 0b01100110, 0b01100110, + 0b01111110, 0b11111110, 0b00000010]), + .spin2a: s8(8, 8, [0b00100000, 0b00111100, 0b01111111, 0b01111110, 0b01111110, + 0b11111110, 0b00111100, 0b00000100]), + .spin2b: s8(8, 8, [0b00001000, 0b00111100, 0b01111110, 0b11111110, 0b01111111, + 0b01111110, 0b00111100, 0b00010000]), + .spin2c: s8(8, 8, [0b00000010, 0b10111100, 0b01111110, 0b01111110, 0b01111110, + 0b01111110, 0b00111101, 0b01000000]), + .spin2d: s8(8, 8, [0b01000000, 0b01111111, 0b01111110, 0b01111110, 0b01111110, + 0b01111110, 0b11111110, 0b00000010]), + // Bouncers & ring enemies + .bounce: s8(8, 9, [0b00011000, 0b00011000, 0b00011000, 0b00100100, 0b01000010, + 0b10000001, 0b10011001, 0b10100101, 0b11000011]), + .enemy3a: s8(8, 8, [0b00111100, 0b01000010, 0b10000001, 0b11111111, 0b11111111, + 0b10000001, 0b01000010, 0b00111100]), + .enemy3b: s8(8, 8, [0b00111100, 0b01000110, 0b10001111, 0b10011101, 0b10111001, + 0b11110001, 0b01100010, 0b00111100]), + // Note: row 4 of enemy3c assembles from the original's 7-digit literal + // (%1011001); the shipped byte is $59, kept faithfully. + .enemy3c: s8(8, 8, [0b00111100, 0b01011010, 0b10011001, 0b01011001, 0b10011001, + 0b10011001, 0b01011010, 0b00111100]), + .enemy3d: s8(8, 8, [0b00111100, 0b01100010, 0b11110001, 0b10111001, 0b10011101, + 0b10001111, 0b01000110, 0b00111100]), + // Bosses (16 wide, merged from the two 8-px sections) + .boss2: Sprite(w: 16, h: 12, rows: [ + 0b11111000_00011111, 0b10001111_11110001, 0b10001000_00010001, 0b10001000_00010001, + 0b10001000_00010001, 0b10001000_00010001, 0b10001000_00010001, 0b10001111_11110001, + 0b11111000_00011111, 0b11111000_00011111, 0b01110000_00001110, 0b00100000_00000100, + ]), + .boss: Sprite(w: 16, h: 12, rows: [ + 0b10000000_00000001, 0b11000000_00000011, 0b11100000_00000111, 0b11111111_11111111, + 0b11000111_11100011, 0b11000011_11000011, 0b11000001_10000011, 0b11000001_10000011, + 0b11100001_10000111, 0b01110001_10001110, 0b00111111_11111100, 0b00011111_11111000, + ]), + // Swooper (11 wide, merged from 8+3 sections) + .swoop: Sprite(w: 11, h: 8, rows: [ + 0b11100000_11100000, 0b10101110_10100000, 0b11101110_11100000, 0b10111111_10100000, + 0b11111111_11100000, 0b10101110_10100000, 0b11101110_11100000, 0b10100100_10100000, + ]), + // Player craft + .playerShip: s8(8, 6, [0b10000001, 0b10000001, 0b10011001, 0b10100101, 0b11000011, 0b10000001]), + .playerShipDamaged: s8(8, 6, [0b10000000, 0b00000001, 0b10010000, 0b00000101, 0b11000000, 0b00000001]), + .companion: s8(7, 7, [0b00010000, 0b00111000, 0b10111010, 0b10111010, 0b10111010, + 0b11111110, 0b11111110]), + // Player bullets + .pb0: s8(2, 6, [0b11000000, 0b11000000, 0b11000000, 0b11000000, 0b11000000, 0b11000000]), + .pb1: s8(4, 8, [0b01100000, 0b11110000, 0b10100000, 0b01010000, 0b10100000, + 0b01010000, 0b10100000, 0b01010000]), + .pb2l: s8(3, 7, [0b00100000, 0b01100000, 0b11100000, 0b11100000, 0b11100000, 0b11000000, 0b10000000]), + .pb2r: s8(3, 7, [0b10000000, 0b11000000, 0b11100000, 0b11100000, 0b11100000, 0b01100000, 0b00100000]), + .pb3: s8(4, 4, [0b01100000, 0b11110000, 0b11110000, 0b01100000]), + .pb5: s8(5, 7, [0b00100000, 0b01110000, 0b11111000, 0b11111000, 0b11111000, 0b11011000, 0b10001000]), + .pbQuad: s8(3, 5, [0b01000000, 0b11100000, 0b11100000, 0b11100000, 0b11100000]), + // Enemy bullets & drops + .eb1: s8(2, 2, [0b11000000, 0b11000000]), + .eb3: s8(3, 3, [0b01000000, 0b11100000, 0b01000000]), + .eb2: s8(3, 7, [0b10100000, 0b11100000, 0b11100000, 0b01000000, 0b01000000, 0b11100000, 0b01000000]), + .money: s8(5, 7, [0b00100000, 0b11111000, 0b10100000, 0b11111000, 0b00101000, 0b11111000, 0b00100000]), + .eb4: s8(5, 5, [0b01110000, 0b11111000, 0b11111000, 0b11111000, 0b01110000]), + // Explosion frames + .x1: s8(8, 6, [0b00000000, 0b00011100, 0b00111110, 0b01010110, 0b00111000, 0b00000000]), + .x2: s8(8, 6, [0b00110000, 0b01001110, 0b10111110, 0b01001111, 0b00111000, 0b00011010]), + .x3: s8(8, 6, [0b11110011, 0b01001110, 0b10110101, 0b01000101, 0b00111110, 0b11011010]), + .x4: s8(8, 6, [0b11110011, 0b01001110, 0b10110101, 0b01000101, 0b00111110, 0b11011010]), + .x5: s8(8, 6, [0b01000001, 0b00100110, 0b00010101, 0b01000100, 0b00010010, 0b10011010]), + .x6: s8(8, 6, [0b01000010, 0b00100000, 0b00000001, 0b01000100, 0b00100010, 0b10001010]), + .x7: s8(8, 6, [0b00001000, 0b11000010, 0b00000000, 0b00100000, 0b00000001, 0b00110000]), + .x8: s8(8, 6, [0b00000100, 0b00000000, 0b01000000, 0b00000000, 0b00000001, 0b00100100]), + ] + + // MARK: - Movement / firing / weapon constants (phoenixz.i values) + + enum Move { + static let standard = 0, none = 3, boss = 4, bounce = 7 + static let patternStart = 10, patternWait = 13, patternMain = 16 + static let rampage = 19, rampageWait = 22 + static let swoopHoriz = 25, swoopDown = 28, swoopUp = 31, swoopWait = 34 + static let rampageInit = 37 + } + + enum Fire { + static let random = 0, none = 2, periodic = 3 + } + + enum Weapon { + static let normal = 0, double = 3, semiAim = 6, big = 9, huge = 12 + static let arrow = 15, singleBig = 18, singleHuge = 21 + } + + /// Swoop path table: (Y destination, X destination, X entry) per pattern. + static let swoopPaths: [(yDest: Int, xDest: Int, xEntry: Int)] = [ + (59, 102, 14), (50, 30, 90), (41, 78, 42), (32, 54, 66), + ] + + /// Big/huge bullet velocity table indexed by angle code: (yv, xv) in + /// half-pixels per frame (`speed_table`). + static let bigBulletSpeeds: [(yv: Int, xv: Int)] = [ + (1, -2), (2, -2), (2, -1), (2, 0), (2, 1), (2, 2), (1, 2), + ] + + // MARK: - Patterns (velocities in 16ths of a pixel per frame) + + struct Pattern { + let segments: [(time: Int, xv: Int, yv: Int)] + let loopStart: Int // segment index the terminating goto returns to + } + + enum PatternID: Hashable { case hugeOval, figureEight, circle, oval } + + static let patterns: [PatternID: Pattern] = [ + .hugeOval: Pattern(segments: [ + (32, 0, 19), + (64, 20, 0), (10, 16, 0), (8, 12, -12), (28, 0, -12), (8, -12, -12), (10, -16, 0), + (64, -20, 0), (10, -16, 0), (8, -12, 12), (28, 0, 12), (8, 12, 12), (10, 16, 0), + ], loopStart: 1), + .figureEight: Pattern(segments: [ + (32, 0, 12), + (12, 12, 12), (16, 16, 0), (34, 16, -12), (16, 15, 0), (12, 12, 12), (8, 0, 14), + (12, -12, 12), (16, -15, 0), (34, -16, -12), (16, -16, 0), (12, -12, 12), (8, 0, 16), + ], loopStart: 1), + .circle: Pattern(segments: [ + (32, 0, 14), + (8, 12, 12), (16, 16, 0), (8, 12, -12), (16, 0, -16), + (8, -12, -12), (16, -16, 0), (8, -12, 12), (16, 0, 16), + ], loopStart: 1), + .oval: Pattern(segments: [ + (32, 0, 16), + (4, 12, 12), (76, 16, 0), (4, 12, -12), (6, 0, -16), + (4, -12, -12), (76, -16, 0), (4, -12, 12), (6, 0, 16), + ], loopStart: 1), + ] + + // MARK: - Campaign (levels.asm, L_GOTO chains inlined) + + enum ImageRef { + case still(Img) + case anim(Anim) + } + + enum Cmd { + case setPower(Int) + case setMoveType(Int) + case setMoveData(Int, Int) // movedata bytes 0 and 1 + case setMovePattern(PatternID) // word form of L_SET_MOVEDATA + case image(ImageRef) + case setFireType(Int) + case setFireRate(Int) + case setWeapon(Int) + case setFirePower(Int) + case installOne(x: Int, y: Int) + case installRow(x: Int, y: Int, n: Int, spacing: Int) + } + + enum LevelKind { + case combat(enemies: Int, commands: [Cmd]) + case shop + case gameEnd + } + + /// Shared command chunks (the original's labeled fragments reused by L_GOTO). + private static let lev1x: [Cmd] = [.installRow(x: 18, y: 10, n: 6, spacing: 15), + .installRow(x: 18, y: 0, n: 6, spacing: 15), + .installRow(x: 18, y: 20, n: 6, spacing: 15)] + private static let lev1y: [Cmd] = [.installRow(x: 18, y: 0, n: 6, spacing: 15), + .installRow(x: 18, y: 20, n: 6, spacing: 15)] + private static let lev1z: [Cmd] = [.installRow(x: 18, y: 20, n: 6, spacing: 15)] + private static let lev2x: [Cmd] = [.installRow(x: 20, y: 10, n: 6, spacing: 15)] + lev1y + private static let bossBlock: [Cmd] = [ // lev3y + .setMoveType(Move.boss), .setPower(61), .setMoveData(0, 32), + .image(.still(.boss)), .setFireType(Fire.periodic), .setFireRate(64), + .setWeapon(Weapon.double), .installOne(x: 90, y: 1), + ] + private static let lev3x: [Cmd] = [.installRow(x: 18, y: 20, n: 6, spacing: 15)] + bossBlock + private static let boss2Block: [Cmd] = [ // lev12x + .setMoveType(Move.boss), .setPower(101), .setMoveData(0, 31), + .image(.still(.boss2)), .setFirePower(2), .setFireType(Fire.periodic), + .setFireRate(64), .setWeapon(Weapon.big), .installOne(x: 90, y: 1), + ] + private static let lev13x: [Cmd] = [.setWeapon(Weapon.semiAim), .setMoveType(Move.rampageWait), + .setFireRate(8)] + lev1x + private static let lev14x: [Cmd] = [.setWeapon(Weapon.semiAim), .setMoveType(Move.rampageWait), + .setFireRate(8), + .installRow(x: 19, y: 10, n: 6, spacing: 15), + .installRow(x: 12, y: 0, n: 6, spacing: 15), + .installRow(x: 12, y: 20, n: 6, spacing: 15)] + private static let lev15x: [Cmd] = [.setWeapon(Weapon.semiAim), .setMoveType(Move.rampageWait), + .setFireRate(8), + .installRow(x: 16, y: 12, n: 7, spacing: 15), + .installRow(x: 22, y: 21, n: 6, spacing: 15)] + boss2Block + private static let levswx: [Cmd] = [.image(.anim(.swoop)), .setMoveType(Move.swoopWait), + .setFireRate(4), .setPower(14), + .installRow(x: 0, y: 0, n: 9, spacing: 0)] + private static let levox: [Cmd] = [.setMoveType(Move.rampageInit), .setFireRate(4), + .setPower(41), .image(.still(.silo)), + .setWeapon(Weapon.semiAim), + .installRow(x: 0, y: 0, n: 12, spacing: 0)] + private static let levl: LevelKind = .combat(enemies: 18, commands: [ + .setPower(14), .image(.anim(.enemy3)), .setMoveType(Move.patternStart), + .setFireRate(4), .setWeapon(Weapon.semiAim), .setMovePattern(.hugeOval), + .installRow(x: 14, y: 18, n: 17, spacing: 15), + .setMoveType(Move.boss), .setPower(151), .setMoveData(0, 31), + .image(.still(.boss2)), .setFirePower(2), .setFireType(Fire.periodic), + .setFireRate(64), .setWeapon(Weapon.huge), .installOne(x: 90, y: 15), + ]) + + /// The full built-in level table, in play order. + static let campaign: [LevelKind] = [ + // Stage 1 + .combat(enemies: 18, commands: lev1x), // lev1 + .combat(enemies: 18, commands: lev2x), // lev2 + .combat(enemies: 7, commands: lev3x), // lev3 (boss) + .shop, + // Stage 2 + .combat(enemies: 18, commands: [.setPower(6), .image(.still(.enemy2))] + lev1x), // lev4 + .combat(enemies: 18, commands: [.setPower(6), .image(.still(.enemy2))] + lev2x), // lev5 + .combat(enemies: 6, commands: bounceLevel(n: 6)), // bounce6 + .combat(enemies: 7, commands: [.setPower(6), .image(.still(.enemy2))] + lev3x), // lev6 + .shop, + // Stage 3 + .combat(enemies: 18, commands: [.setPower(6), .image(.still(.enemy2)), // lev4a + .installRow(x: 18, y: 0, n: 6, spacing: 15), + .setPower(8), .image(.still(.enemy2a)), + .installRow(x: 18, y: 10, n: 6, spacing: 15)] + lev1z), + .combat(enemies: 18, commands: [.setPower(8), .image(.still(.enemy2a))] + lev2x), // lev5a + .combat(enemies: 8, commands: bounceLevel(n: 8)), // bounce8 + .combat(enemies: 13, commands: [.setPower(6), .image(.still(.enemy2)), // lev6a + .installRow(x: 18, y: 15, n: 6, spacing: 15), + .setPower(8), .image(.still(.enemy2a)), + .installRow(x: 18, y: 23, n: 6, spacing: 15)] + bossBlock), + .shop, + // Stage 4 + .combat(enemies: 14, commands: [.setPower(14), .image(.anim(.enemy3)), // lev7 + .setMoveType(Move.patternStart), .setFireRate(4), + .setWeapon(Weapon.semiAim), .setMovePattern(.circle), + .installRow(x: 14, y: 18, n: 7, spacing: 27), + .installRow(x: 29, y: 74, n: 7, spacing: 27)]), + .combat(enemies: 13, commands: [.setPower(14), .image(.anim(.enemy3)), // lev8 + .setMoveType(Move.patternStart), .setFireRate(4), + .setWeapon(Weapon.semiAim), .setMovePattern(.figureEight), + .installRow(x: 14, y: 18, n: 13, spacing: 15)]), + .combat(enemies: 10, commands: bounceLevel(n: 10)), // bounce10 + .combat(enemies: 14, commands: [.setPower(14), .image(.anim(.enemy3)), // lev9 + .setMoveType(Move.patternStart), .setFireRate(4), + .setWeapon(Weapon.semiAim), .setMovePattern(.oval), + .installRow(x: 14, y: 18, n: 13, spacing: 15)] + bossBlock), + .shop, + // Stage 5 + .combat(enemies: 18, commands: [.setPower(17), .image(.still(.enemy4)), // lev10 + .setWeapon(Weapon.arrow)] + lev2x), + .combat(enemies: 18, commands: [.setPower(17), .image(.still(.enemy4)), // lev11 + .setWeapon(Weapon.arrow)] + lev1x), + .combat(enemies: 13, commands: [.setPower(6), .image(.still(.enemy2)), // lev12 + .installRow(x: 18, y: 12, n: 6, spacing: 15), + .installRow(x: 18, y: 21, n: 6, spacing: 15)] + boss2Block), + .shop, + // Stage 6 + .combat(enemies: 18, commands: [.image(.anim(.spin1)), .setPower(21)] + lev13x), // lev13 + .combat(enemies: 18, commands: [.image(.anim(.spin1)), .setPower(21)] + lev14x), // lev14 + .combat(enemies: 14, commands: [.image(.anim(.spin1)), .setPower(21)] + lev15x), // lev15 + .shop, + // Stage 7 + .combat(enemies: 18, commands: [.image(.anim(.spin2)), .setPower(31)] + lev13x), // lev13a + .combat(enemies: 18, commands: [.image(.anim(.spin2)), .setPower(31)] + lev14x), // lev14a + .combat(enemies: 14, commands: [.image(.anim(.spin2)), .setPower(31)] + lev15x), // lev15a + .shop, + // Stage 8 + .combat(enemies: 9, commands: [.setWeapon(Weapon.singleBig)] + levswx), // levsw1 + levl, // levl + .shop, + // Stage 9 + .combat(enemies: 8, commands: [.setMoveType(Move.rampageInit), .setFireRate(4), // levo1 + .setPower(41), .image(.still(.silo)), + .setWeapon(Weapon.semiAim), + .installRow(x: 0, y: 0, n: 8, spacing: 0)]), + .combat(enemies: 12, commands: levox), // levo2 + .combat(enemies: 13, commands: [.setMoveType(Move.boss), .setPower(151), // levo3 + .setMoveData(0, 31), .image(.still(.boss2)), + .setFirePower(2), .setFireType(Fire.periodic), + .setFireRate(64), .setWeapon(Weapon.huge), + .installOne(x: 90, y: 1), + .setFirePower(1)] + levox), + .shop, + // Stage 10 + .combat(enemies: 9, commands: [.setWeapon(Weapon.singleHuge)] + levswx), // levsw2 + levl, // levl (again) + .gameEnd, + ] + + private static func bounceLevel(n: Int) -> [Cmd] { + [.image(.still(.bounce)), .setMoveType(Move.bounce), .setPower(36), + .setMoveData(3, 3), .setFireRate(4), .setWeapon(Weapon.semiAim), + .installRow(x: 14, y: 20, n: n, spacing: 10)] + } + + // MARK: - Settings tables (title16.asm) + + /// Speed options: label, frames/sec (per the readme's TI-85 rates), bonus. + static let speedOptions: [(label: String, fps: Double, bonus: Int)] = [ + ("SLOW", 25, 0), ("MEDIUM", 29, 1000), ("FAST", 35, 5000), + ] + + /// Difficulty options: label, value of each $ drop, bonus. + static let difficultyOptions: [(label: String, moneyValue: Int, bonus: Int)] = [ + ("EASY", 100, 0), ("MEDIUM", 50, 5000), ("HARD", 25, 15000), + ] + + // MARK: - Shop (shop16.asm order and prices) + + struct ShopItem { + let name: String + let price: Int + let detail: String + } + + static let shopItems: [ShopItem] = [ + ShopItem(name: "Extra Shield", price: 100, detail: "+1 shield step (max 16)"), + ShopItem(name: "Weapon F2", price: 300, detail: "Twin cannons, faster shots"), + ShopItem(name: "Companion", price: 500, detail: "Escort ship, 5× firepower"), + ShopItem(name: "Weapon Plus", price: 750, detail: "Auto-fire + double F1 power"), + ShopItem(name: "Weapon F3", price: 1000, detail: "Triple spread"), + ShopItem(name: "Weapon F4", price: 1250, detail: "Alternating heavy shots"), + ShopItem(name: "Weapon F5", price: 2000, detail: "The most powerful of all"), + ] +} diff --git a/Arcade85/Games/Phoenix/PhoenixScene.swift b/Arcade85/Games/Phoenix/PhoenixScene.swift new file mode 100644 index 0000000..7b936e5 --- /dev/null +++ b/Arcade85/Games/Phoenix/PhoenixScene.swift @@ -0,0 +1,1035 @@ +import SpriteKit +import UIKit + +/// HD remake of Phoenix 4.0. `PhoenixSim` is the faithful Z80 port; this scene +/// renders the original sprites as neon pixel art, drives the ship with a +/// drag-anywhere touch control (original speed limits still apply), and wraps +/// the campaign in title / shop / victory / game-over flow. +final class PhoenixScene: SKScene { + + typealias D = PhoenixData + + // MARK: State + private enum GameState { case ready, playing, shop, paused, gameOver, victory } + private var state: GameState = .ready + + private var sim = PhoenixSim() + private var chosenSpeed = 2 // SLOW/MEDIUM/FAST (original default: fast) + private var chosenDifficulty = 0 + + // MARK: Timing + private var lastUpdate: TimeInterval = 0 + private var accumulator: TimeInterval = 0 + + // MARK: Layout + private var unit: CGFloat = 3 // scene points per sim unit, horizontal + private var unitY: CGFloat = 3.9 // vertical POSITION scale (unit × stretch) + private var unitYSprite: CGFloat = 3.6 // vertical SPRITE scale (mild arcade stretch) + private var fieldRect = CGRect.zero // visible field (128 × 64 sim units) + private var topInset: CGFloat = 0 + + // MARK: Touch control + private var moveTouch: UITouch? + private var touchAnchor = CGPoint.zero + private var shipAnchor = CGPoint.zero // sim coords at touch start + private var targetX = 60 + private var targetY = 70 + + // MARK: Nodes + private let worldCrop = SKCropNode() + private var playerNode = SKSpriteNode() + private var companionNode = SKSpriteNode() + private var enemyNodes: [SKSpriteNode] = [] + private var pbNodes: [SKSpriteNode] = [] + private var ebNodes: [SKSpriteNode] = [] + private var textureCache: [String: SKTexture] = [:] + + // HUD + private var shieldCells: [SKShapeNode] = [] + private let cashValue = SKLabelNode(fontNamed: "Menlo-Bold") + private let waveValue = SKLabelNode(fontNamed: "Menlo-Bold") + private var weaponButtons: [ControlButton] = [] + private let pauseButton = SKShapeNode(circleOfRadius: 16) + + // Overlays + private let readyOverlay = SKNode() + private let shopOverlay = SKNode() + private let pausedOverlay = SKNode() + private let gameOverOverlay = SKNode() + private let victoryOverlay = SKNode() + private let difficultyValueLabel = SKLabelNode(fontNamed: "Menlo-Bold") + private let speedValueLabel = SKLabelNode(fontNamed: "Menlo-Bold") + private var stepperRects: [String: CGRect] = [:] + private let shopCashLabel = SKLabelNode(fontNamed: "Menlo-Bold") + private var shopRowRects: [CGRect] = [] + private var shopRowLabels: [SKLabelNode] = [] + private var shopRowStates: [SKLabelNode] = [] + private var shopDoneRect = CGRect.zero + private let gameOverDetail = SKLabelNode(fontNamed: "Menlo-Bold") + private let gameOverRecord = SKLabelNode(fontNamed: "Menlo-Bold") + private let victoryLines = SKLabelNode(fontNamed: "Menlo-Bold") + private let victoryTotal = SKLabelNode(fontNamed: "AvenirNext-Heavy") + private let victoryRecord = SKLabelNode(fontNamed: "Menlo-Bold") + + private var builtSize: CGSize = .zero + #if DEBUG + private var demoFreeze = false + #endif + + // MARK: Sprite tints + + static func tint(for img: D.Img) -> UIColor { + switch img { + case .enemy1: return Palette.mint + case .enemy2: return Palette.cyan + case .enemy2a: return UIColor(red: 0.55, green: 0.80, blue: 1.0, alpha: 1) + case .enemy4: return Palette.amber + case .silo: return UIColor(red: 0.45, green: 0.95, blue: 0.45, alpha: 1) + case .bounce: return Palette.red + case .boss: return Palette.red + case .boss2: return UIColor(red: 1.0, green: 0.55, blue: 0.30, alpha: 1) + case .swoop: return UIColor(red: 1.0, green: 0.45, blue: 0.85, alpha: 1) + case .spin1a, .spin1b, .spin1c, .spin1d: return UIColor(red: 1.0, green: 0.62, blue: 0.25, alpha: 1) + case .spin2a, .spin2b, .spin2c, .spin2d: return UIColor(red: 1.0, green: 0.40, blue: 0.30, alpha: 1) + case .enemy3a, .enemy3b, .enemy3c, .enemy3d: return Palette.violet + case .playerShip, .playerShipDamaged: return .white + case .companion: return Palette.cyan + case .pb0, .pb1, .pb2l, .pb2r, .pb3, .pb5, .pbQuad: return Palette.mint + case .eb1, .eb2, .eb3, .eb4: return Palette.amber + case .money: return UIColor(red: 1.0, green: 0.85, blue: 0.30, alpha: 1) + case .x1, .x2, .x3, .x4, .x5, .x6, .x7, .x8: return Palette.amber + } + } + + // MARK: - Lifecycle + + override func didMove(to view: SKView) { + anchorPoint = .zero + scaleMode = .resizeFill + layoutScene() + #if DEBUG + let env = ProcessInfo.processInfo.environment + if env["ARCADE_AUTOPLAY"] == "1" { startGame() } + if env["ARCADE_DEMO"] == "1" { + startGame() + sim.debugGiveWeapons() + sim.debugSetCash(3200) + sim.debugSetLevel(14) // lev7: circling enemies + sim.debugSetShield(11) + _ = sim.buy(itemIndex: 2) // companion on escort + for _ in 0..<150 { sim.tick(PhoenixSim.Input(fire: true, selectWeapon: 2)) } + demoFreeze = true + renderFrame() + } + if env["ARCADE_SHOP"] == "1" { + startGame() + sim.debugSetCash(1450) + sim.debugSetShield(12) + state = .shop + refreshShop() + applyStateVisibility() + } + if env["ARCADE_GAMEOVER"] == "1" { // screenshot pose: death score card + startGame() + sim.debugSetCash(900) + for _ in 0..<12 { sim.loadLevel() } // walk a third of the campaign + endGame() + } + #endif + } + + override func didChangeSize(_ oldSize: CGSize) { + guard view != nil, size != builtSize, size.width > 0 else { return } + layoutScene() + } + + // MARK: - Textures + + private func texture(for img: D.Img) -> SKTexture { + let key = "\(img)" + if let t = textureCache[key] { return t } + let sprite = D.sprites[img]! + let cell: CGFloat = 10 + let renderer = UIGraphicsImageRenderer(size: CGSize(width: CGFloat(sprite.w) * cell, + height: CGFloat(sprite.h) * cell)) + let color = Self.tint(for: img) + // Rows shade from lit (top) to shadowed (bottom) so sprites read as + // solid bodies instead of flat pixel clusters. + func shaded(_ row: Int) -> UIColor { + let frac = sprite.h > 1 ? CGFloat(row) / CGFloat(sprite.h - 1) : 0 + var r: CGFloat = 0, g: CGFloat = 0, b: CGFloat = 0, a: CGFloat = 0 + color.getRed(&r, green: &g, blue: &b, alpha: &a) + let lift = 0.30 * (1 - frac) // toward white at the top + let drop = 0.28 * frac // toward black at the bottom + return UIColor(red: min(1, r + (1 - r) * lift) * (1 - drop), + green: min(1, g + (1 - g) * lift) * (1 - drop), + blue: min(1, b + (1 - b) * lift) * (1 - drop), + alpha: a) + } + let image = renderer.image { ctx in + let cg = ctx.cgContext + cg.setShadow(offset: .zero, blur: cell * 0.7, color: color.withAlphaComponent(0.9).cgColor) + for pass in 0..<2 { + if pass == 1 { cg.setShadow(offset: .zero, blur: 0, color: nil) } + for (row, bits) in sprite.rows.enumerated() { + for col in 0..> UInt16(col))) != 0 { + let rect = CGRect(x: CGFloat(col) * cell, y: CGFloat(row) * cell, + width: cell, height: cell) + (pass == 0 ? color : shaded(row)).setFill() + UIBezierPath(roundedRect: rect.insetBy(dx: cell * 0.05, dy: cell * 0.05), + cornerRadius: cell * 0.18).fill() + } + } + } + } + let t = SKTexture(image: image) + textureCache[key] = t + return t + } + + // MARK: - Layout + + private func layoutScene() { + builtSize = size + removeAllChildren() + textureCache.removeAll() + backgroundColor = Palette.space1 + + let insets = view?.safeAreaInsets ?? .zero + topInset = insets.top + let bottomInset = insets.bottom + + let bg = SKSpriteNode(texture: SceneArt.verticalGradient(size: size, top: Palette.space0, bottom: Palette.space1)) + bg.anchorPoint = .zero + bg.zPosition = -10 + addChild(bg) + + // Deep space: static far stars, two drifting near layers (the fleet is + // moving), nebula blooms, sparse dust. + let farStars = SceneArt.starfield(size: size, count: 50, seed: 0x0F0E17) + farStars.zPosition = -9.6 + farStars.alpha = 0.5 + farStars.setScale(0.7) + addChild(farStars) + addScrollingStars(count: 46, seed: 0xF17A, duration: 34, alpha: 0.8, z: -9.4) + addScrollingStars(count: 26, seed: 0xF17B, duration: 18, alpha: 1.0, z: -9.2) + + let nebula1 = SceneArt.glowSprite(color: Palette.violet, radius: 230) + nebula1.position = CGPoint(x: size.width * 0.20, y: size.height * 0.74) + nebula1.alpha = 0.15 + nebula1.zPosition = -9.5 + addChild(nebula1) + let nebula2 = SceneArt.glowSprite(color: UIColor(red: 0.9, green: 0.4, blue: 0.4, alpha: 1), radius: 170) + nebula2.position = CGPoint(x: size.width * 0.85, y: size.height * 0.42) + nebula2.alpha = 0.10 + nebula2.zPosition = -9.5 + addChild(nebula2) + + let dust = SceneArt.ambientDust(size: size) + dust.position = CGPoint(x: size.width / 2, y: size.height / 2) + dust.zPosition = -8.8 + addChild(dust) + + // Field: 128 × 64 visible sim units, full-bleed width. The TI-85 window + // is 2:1, which reads cramped on a tall phone, so entity POSITIONS are + // mapped with a 2× vertical stretch while sprites themselves keep a + // mild 1.25× arcade-monitor stretch. Sim geometry, collisions and the + // visible window are untouched (they can't widen: the original parks + // and spawns entities just outside y 32…96). + unit = size.width / 128 + unitY = unit * 2.0 + unitYSprite = unit * 1.25 + let fieldH = unitY * 64 + let hudBottom = size.height - topInset - 92 + fieldRect = CGRect(x: 0, y: hudBottom - fieldH, width: unit * 128, height: fieldH) + + worldCrop.removeAllChildren() + let mask = SKSpriteNode(color: .white, size: fieldRect.size) + mask.position = CGPoint(x: fieldRect.midX, y: fieldRect.midY) + worldCrop.maskNode = mask + worldCrop.zPosition = 0 + addChild(worldCrop) + + let vignette = SceneArt.vignette(size: size, alpha: 0.40) + vignette.position = CGPoint(x: size.width / 2, y: size.height / 2) + addChild(vignette) + + buildEntityNodes() + buildHUD(bottomInset: bottomInset) + buildReadyOverlay() + buildShopOverlay() + buildPausedOverlay() + buildGameOverOverlay() + buildVictoryOverlay() + + applyStateVisibility() + renderFrame() + } + + private func buildEntityNodes() { + func makeNode() -> SKSpriteNode { + let n = SKSpriteNode() + n.isHidden = true + worldCrop.addChild(n) + return n + } + enemyNodes = (0.. CGPoint { + CGPoint(x: fieldRect.minX + (CGFloat(x) + CGFloat(w) / 2) * unit, + y: fieldRect.maxY - (CGFloat(y) - 32 + CGFloat(h) / 2) * unitY) + } + + private func place(_ node: SKSpriteNode, img: D.Img, x: Int, y: Int) { + let sprite = D.sprites[img]! + node.texture = texture(for: img) + // Positions use the stretched map; the sprite itself stays near-square, + // drawn slightly over its logical cell for presence (hitboxes are sim-side). + node.size = CGSize(width: CGFloat(sprite.w) * unit * 1.15, + height: CGFloat(sprite.h) * unitYSprite * 1.15) + node.position = point(x: x, y: y, w: sprite.w, h: sprite.h) + node.isHidden = false + } + + // MARK: - HUD + + private func buildHUD(bottomInset: CGFloat) { + let hudY = size.height - topInset - 26 + + addChild(caption("SHIELD", x: 74, y: hudY + 12, align: .left)) + shieldCells = (0..<16).map { i in + let cell = SKShapeNode(rectOf: CGSize(width: 7, height: 12), cornerRadius: 2) + cell.position = CGPoint(x: 74 + 4 + CGFloat(i) * 9, y: hudY - 8) + cell.strokeColor = UIColor(white: 1, alpha: 0.15) + cell.lineWidth = 1 + cell.zPosition = 20 + addChild(cell) + return cell + } + + addChild(caption("CASH", x: size.width - 20, y: hudY + 12, align: .right)) + cashValue.fontSize = 17 + cashValue.fontColor = UIColor(red: 1.0, green: 0.85, blue: 0.30, alpha: 1) + cashValue.horizontalAlignmentMode = .right + cashValue.verticalAlignmentMode = .center + cashValue.position = CGPoint(x: size.width - 20, y: hudY - 8) + cashValue.zPosition = 20 + addChild(cashValue) + + addChild(caption("WAVE", x: size.width - 110, y: hudY + 12, align: .right)) + waveValue.fontSize = 17 + waveValue.fontColor = .white + waveValue.horizontalAlignmentMode = .right + waveValue.verticalAlignmentMode = .center + waveValue.position = CGPoint(x: size.width - 110, y: hudY - 8) + waveValue.zPosition = 20 + addChild(waveValue) + + // Weapon selector row under the field. + let wy = fieldRect.minY - 44 + weaponButtons = (0..<5).map { i in + let b = ControlButton(symbol: "\(i + 1).circle.fill") + b.configure(radius: 26, tint: Palette.mint) + b.position = CGPoint(x: size.width * (0.14 + 0.18 * CGFloat(i)), y: wy) + b.zPosition = 20 + addChild(b) + return b + } + + pauseButton.fillColor = UIColor(white: 1, alpha: 0.08) + pauseButton.strokeColor = UIColor(white: 1, alpha: 0.25) + pauseButton.lineWidth = 1 + pauseButton.position = CGPoint(x: fieldRect.maxX - 28, y: fieldRect.maxY - 24) + pauseButton.zPosition = 22 + pauseButton.removeAllChildren() + if let tex = SceneArt.symbolTexture("pause.fill", pointSize: 13, color: Palette.white70) { + let icon = SKSpriteNode(texture: tex) + icon.size = tex.size() + pauseButton.addChild(icon) + } + addChild(pauseButton) + + // The open area below the weapons row is the thumb zone — put the hint + // in its middle so the space reads as the control surface it is. + let zoneTop = wy - 30 + let hintY = bottomInset + (zoneTop - bottomInset) * 0.5 + let hint = caption("DRAG ANYWHERE TO FLY — WEAPONS AUTO-FIRE", x: size.width / 2, + y: max(bottomInset + 16, hintY), align: .center) + addChild(hint) + } + + private func caption(_ text: String, x: CGFloat, y: CGFloat, align: SKLabelHorizontalAlignmentMode) -> SKLabelNode { + let label = SKLabelNode(fontNamed: "Menlo-Bold") + label.text = text + label.fontSize = 10 + label.fontColor = Palette.white40 + label.horizontalAlignmentMode = align + label.verticalAlignmentMode = .center + label.position = CGPoint(x: x, y: y) + label.zPosition = 20 + return label + } + + // MARK: - Overlays + + private func bigLabel(_ text: String, fontNamed: String = "AvenirNext-Heavy", size fontSize: CGFloat, + color: UIColor, x: CGFloat, y: CGFloat, maxWidth: CGFloat? = nil) -> SKLabelNode { + let label = SKLabelNode(fontNamed: fontNamed) + label.text = text + label.fontSize = fontSize + label.fontColor = color + label.horizontalAlignmentMode = .center + label.verticalAlignmentMode = .center + label.position = CGPoint(x: x, y: y) + if let maxWidth { + label.preferredMaxLayoutWidth = maxWidth + label.numberOfLines = 0 + } + return label + } + + private func buildReadyOverlay() { + readyOverlay.removeAllChildren() + readyOverlay.zPosition = 40 + addChild(readyOverlay) + let dim = SKSpriteNode(color: UIColor(white: 0.02, alpha: 0.66), size: size) + dim.anchorPoint = .zero + readyOverlay.addChild(dim) + + let cx = size.width / 2 + let midY = size.height * 0.62 + readyOverlay.addChild(bigLabel("PHOENIX", size: 36, color: .white, x: cx, y: midY + 78)) + readyOverlay.addChild(bigLabel("31 waves. Bank the cash. Upgrade the ship.", + fontNamed: "AvenirNext-Medium", size: 14.5, + color: Palette.white70, x: cx, y: midY + 44)) + + buildStepper(into: readyOverlay, title: "DIFFICULTY", value: difficultyValueLabel, + valueText: D.difficultyOptions[chosenDifficulty].label, + y: midY - 14, keyMinus: "diffMinus", keyPlus: "diffPlus") + buildStepper(into: readyOverlay, title: "SPEED", value: speedValueLabel, + valueText: D.speedOptions[chosenSpeed].label, + y: midY - 66, keyMinus: "speedMinus", keyPlus: "speedPlus") + + let prompt = bigLabel("TAP TO LAUNCH", fontNamed: "Menlo-Bold", size: 16, color: Palette.mint, + x: cx, y: midY - 126) + prompt.run(.repeatForever(.sequence([.fadeAlpha(to: 0.35, duration: 0.7), .fadeAlpha(to: 1, duration: 0.7)]))) + readyOverlay.addChild(prompt) + } + + private func buildStepper(into parent: SKNode, title: String, value: SKLabelNode, valueText: String, + y: CGFloat, keyMinus: String, keyPlus: String) { + let cx = size.width / 2 + parent.addChild(bigLabel(title, fontNamed: "Menlo-Bold", size: 12, color: Palette.white70, x: cx, y: y + 25)) + let minusX = cx - 92, plusX = cx + 92 + parent.addChild(stepperButton("−", center: CGPoint(x: minusX, y: y))) + parent.addChild(stepperButton("+", center: CGPoint(x: plusX, y: y))) + stepperRects[keyMinus] = CGRect(x: minusX - 22, y: y - 20, width: 44, height: 40) + stepperRects[keyPlus] = CGRect(x: plusX - 22, y: y - 20, width: 44, height: 40) + value.text = valueText + value.fontSize = 22 + value.fontColor = .white + value.horizontalAlignmentMode = .center + value.verticalAlignmentMode = .center + value.position = CGPoint(x: cx, y: y) + parent.addChild(value) + } + + private func stepperButton(_ glyph: String, center: CGPoint) -> SKNode { + let node = SKShapeNode(rectOf: CGSize(width: 44, height: 40), cornerRadius: 12) + node.fillColor = UIColor(white: 1, alpha: 0.10) + node.strokeColor = Palette.mint.withAlphaComponent(0.5) + node.lineWidth = 1 + node.position = center + let label = SKLabelNode(fontNamed: "Menlo-Bold") + label.text = glyph + label.fontSize = 24 + label.fontColor = Palette.mint + label.verticalAlignmentMode = .center + label.horizontalAlignmentMode = .center + node.addChild(label) + return node + } + + private func buildShopOverlay() { + shopOverlay.removeAllChildren() + shopOverlay.zPosition = 40 + addChild(shopOverlay) + let dim = SKSpriteNode(color: UIColor(white: 0.01, alpha: 0.90), size: size) + dim.anchorPoint = .zero + shopOverlay.addChild(dim) + + let cx = size.width / 2 + let top = size.height - topInset - 60 + shopOverlay.addChild(bigLabel("PHOENIX SHOP", size: 26, color: Palette.amber, x: cx, y: top)) + + shopCashLabel.fontSize = 16 + shopCashLabel.fontColor = UIColor(red: 1.0, green: 0.85, blue: 0.30, alpha: 1) + shopCashLabel.horizontalAlignmentMode = .center + shopCashLabel.verticalAlignmentMode = .center + shopCashLabel.position = CGPoint(x: cx, y: top - 30) + shopOverlay.addChild(shopCashLabel) + + shopRowRects = [] + shopRowLabels = [] + shopRowStates = [] + let rowH: CGFloat = 58 + let startY = top - 66 + for (i, item) in D.shopItems.enumerated() { + let y = startY - CGFloat(i) * rowH - rowH / 2 + let rect = CGRect(x: 22, y: y - rowH / 2 + 4, width: size.width - 44, height: rowH - 8) + let box = SKShapeNode(rect: rect, cornerRadius: 12) + box.fillColor = UIColor(white: 1, alpha: 0.06) + box.strokeColor = Palette.mint.withAlphaComponent(0.25) + box.lineWidth = 1 + shopOverlay.addChild(box) + shopRowRects.append(rect) + + let name = SKLabelNode(fontNamed: "AvenirNext-Bold") + name.text = "\(item.name) $\(item.price)" + name.fontSize = 15 + name.fontColor = .white + name.horizontalAlignmentMode = .left + name.verticalAlignmentMode = .center + name.position = CGPoint(x: rect.minX + 14, y: y + 9) + shopOverlay.addChild(name) + shopRowLabels.append(name) + + let detail = SKLabelNode(fontNamed: "AvenirNext-Medium") + detail.text = item.detail + detail.fontSize = 11.5 + detail.fontColor = Palette.white40 + detail.horizontalAlignmentMode = .left + detail.verticalAlignmentMode = .center + detail.position = CGPoint(x: rect.minX + 14, y: y - 11) + shopOverlay.addChild(detail) + + let stateLabel = SKLabelNode(fontNamed: "Menlo-Bold") + stateLabel.fontSize = 12 + stateLabel.horizontalAlignmentMode = .right + stateLabel.verticalAlignmentMode = .center + stateLabel.position = CGPoint(x: rect.maxX - 14, y: y) + shopOverlay.addChild(stateLabel) + shopRowStates.append(stateLabel) + } + + let doneY = startY - CGFloat(D.shopItems.count) * rowH - 30 + let doneRect = CGRect(x: cx - 110, y: doneY - 24, width: 220, height: 48) + let doneBox = SKShapeNode(rect: doneRect, cornerRadius: 14) + doneBox.fillColor = Palette.mint.withAlphaComponent(0.18) + doneBox.strokeColor = Palette.mint + doneBox.lineWidth = 1.5 + shopOverlay.addChild(doneBox) + shopOverlay.addChild(bigLabel("CONTINUE MISSION", fontNamed: "Menlo-Bold", size: 15, + color: Palette.mint, x: cx, y: doneY)) + shopDoneRect = doneRect + } + + private func refreshShop() { + shopCashLabel.text = "BANK $\(sim.cash)" + for (i, item) in D.shopItems.enumerated() { + let state: String + let color: UIColor + switch i { + case 0 where sim.playerPwr >= 16: state = "FULL"; color = Palette.white40 + case 2 where sim.companionPwr == 16: state = "ACTIVE"; color = Palette.white40 + case 3 where sim.weaponUpgrade: state = "OWNED"; color = Palette.white40 + case 1 where sim.hasWeapon[1], 4 where sim.hasWeapon[2], + 5 where sim.hasWeapon[3], 6 where sim.hasWeapon[4]: + state = "OWNED"; color = Palette.white40 + default: + if sim.cash >= item.price { state = "BUY"; color = Palette.mint } + else { state = "$\(item.price)"; color = Palette.red.withAlphaComponent(0.7) } + } + shopRowStates[i].text = state + shopRowStates[i].fontColor = color + } + } + + private func buildPausedOverlay() { + pausedOverlay.removeAllChildren() + pausedOverlay.zPosition = 40 + addChild(pausedOverlay) + let dim = SKSpriteNode(color: UIColor(white: 0.01, alpha: 0.80), size: size) + dim.anchorPoint = .zero + pausedOverlay.addChild(dim) + pausedOverlay.addChild(bigLabel("PAUSED", size: 30, color: .white, x: size.width / 2, y: size.height * 0.55)) + let hint = bigLabel("TAP TO RESUME", fontNamed: "Menlo-Bold", size: 15, color: Palette.mint, + x: size.width / 2, y: size.height * 0.55 - 44) + hint.run(.repeatForever(.sequence([.fadeAlpha(to: 0.35, duration: 0.7), .fadeAlpha(to: 1, duration: 0.7)]))) + pausedOverlay.addChild(hint) + } + + private func buildGameOverOverlay() { + gameOverOverlay.removeAllChildren() + gameOverOverlay.zPosition = 40 + addChild(gameOverOverlay) + let dim = SKSpriteNode(color: UIColor(white: 0.02, alpha: 0.72), size: size) + dim.anchorPoint = .zero + gameOverOverlay.addChild(dim) + let cx = size.width / 2 + let midY = size.height * 0.6 + gameOverOverlay.addChild(bigLabel("SHIP DESTROYED", size: 30, color: Palette.red, x: cx, y: midY + 36)) + gameOverDetail.fontSize = 15 + gameOverDetail.fontColor = .white + gameOverDetail.horizontalAlignmentMode = .center + gameOverDetail.position = CGPoint(x: cx, y: midY - 4) + gameOverOverlay.addChild(gameOverDetail) + gameOverRecord.fontSize = 14 + gameOverRecord.fontColor = Palette.amber + gameOverRecord.horizontalAlignmentMode = .center + gameOverRecord.position = CGPoint(x: cx, y: midY - 32) + gameOverOverlay.addChild(gameOverRecord) + let prompt = bigLabel("TAP TO FLY AGAIN", fontNamed: "Menlo-Bold", size: 16, color: Palette.mint, + x: cx, y: midY - 52) + prompt.run(.repeatForever(.sequence([.fadeAlpha(to: 0.35, duration: 0.7), .fadeAlpha(to: 1, duration: 0.7)]))) + gameOverOverlay.addChild(prompt) + } + + private func buildVictoryOverlay() { + victoryOverlay.removeAllChildren() + victoryOverlay.zPosition = 40 + addChild(victoryOverlay) + let dim = SKSpriteNode(color: UIColor(white: 0.02, alpha: 0.82), size: size) + dim.anchorPoint = .zero + victoryOverlay.addChild(dim) + let cx = size.width / 2 + let midY = size.height * 0.60 + victoryOverlay.addChild(bigLabel("EARTH IS SAFE", size: 30, color: Palette.mint, x: cx, y: midY + 84)) + + victoryLines.fontSize = 15 + victoryLines.fontColor = .white + victoryLines.horizontalAlignmentMode = .center + victoryLines.verticalAlignmentMode = .center + victoryLines.numberOfLines = 0 + victoryLines.position = CGPoint(x: cx, y: midY + 8) + victoryOverlay.addChild(victoryLines) + + victoryTotal.fontSize = 30 + victoryTotal.fontColor = Palette.amber + victoryTotal.horizontalAlignmentMode = .center + victoryTotal.position = CGPoint(x: cx, y: midY - 74) + victoryOverlay.addChild(victoryTotal) + + victoryRecord.fontSize = 14 + victoryRecord.fontColor = Palette.amber + victoryRecord.horizontalAlignmentMode = .center + victoryRecord.position = CGPoint(x: cx, y: midY - 106) + victoryOverlay.addChild(victoryRecord) + + let prompt = bigLabel("TAP TO RETURN", fontNamed: "Menlo-Bold", size: 15, color: Palette.mint, + x: cx, y: midY - 142) + prompt.run(.repeatForever(.sequence([.fadeAlpha(to: 0.35, duration: 0.7), .fadeAlpha(to: 1, duration: 0.7)]))) + victoryOverlay.addChild(prompt) + } + + // MARK: - Game flow + + private func startGame() { + sim = PhoenixSim(speed: chosenSpeed, difficulty: chosenDifficulty) + targetX = 60 + targetY = 70 + accumulator = 0 + state = .playing + applyStateVisibility() + renderFrame() + } + + private func applyStateVisibility() { + readyOverlay.isHidden = state != .ready + shopOverlay.isHidden = state != .shop + pausedOverlay.isHidden = state != .paused + gameOverOverlay.isHidden = state != .gameOver + victoryOverlay.isHidden = state != .victory + pauseButton.isHidden = state != .playing + let playing = state == .playing + weaponButtons.forEach { $0.alpha = playing ? 1 : 0.25 } + } + + // MARK: - Game loop + + override func update(_ currentTime: TimeInterval) { + if lastUpdate == 0 { lastUpdate = currentTime } + var dt = currentTime - lastUpdate + lastUpdate = currentTime + if dt > 0.25 { dt = 0.25 } + guard state == .playing else { return } + #if DEBUG + if demoFreeze { return } + #endif + + let interval = 1.0 / sim.fps + accumulator += dt + var steps = 0 + while accumulator >= interval, steps < 4 { + accumulator -= interval + steps += 1 + stepSim() + if state != .playing { break } + } + renderFrame() + } + + private func stepSim() { + var input = PhoenixSim.Input() + let dx = targetX - sim.playerX + let dy = targetY - sim.playerY + if abs(dx) >= 2 { input.dx = dx > 0 ? 1 : -1 } + if abs(dy) >= 1 { input.dy = dy > 0 ? 1 : -1 } + input.fire = true + input.selectWeapon = pendingWeapon + pendingWeapon = nil + sim.tick(input) + + for event in sim.events { + switch event { + case .enemyDestroyed(let x, let y): + Haptics.impact(.light, intensity: 0.5) + spawnBoom(at: point(x: x, y: y, w: 8, h: 6)) + case .playerHit: + Haptics.impact(.heavy, intensity: 0.9) + flashPlayer() + worldCrop.run(SceneArt.shake(intensity: 7, duration: 0.3)) + addChild(SceneArt.flash(size: size, color: Palette.red, peak: 0.14, duration: 0.2)) + case .moneyCollected: + Haptics.selection() + popCash() + case .enteredShop: + state = .shop + refreshShop() + applyStateVisibility() + Haptics.success() + case .gameOver: + endGame() + case .gameFinished: + showVictory() + case .levelLoaded: + showBanner("WAVE \(waveNumber())", color: .white) + case .bossLevel: + showBanner("BOSS", color: Palette.red) + } + } + } + + private func endGame() { + state = .gameOver + // A death still posts the run's progress (waves beaten + $ earned). + let score = sim.progressScore + let record = HighScoreStore.shared.submit(id: "phoenix", score: score) + gameOverDetail.text = "WAVE \(waveNumber())/31 · SCORE \(score)" + gameOverRecord.text = record ? "★ NEW BEST ★" : "BEST \(HighScoreStore.shared.best("phoenix"))" + applyStateVisibility() + Haptics.error() + } + + private func showVictory() { + // Victory = run progress + the original score16 tally on top. + let score = sim.progressScore + sim.finalScore + let record = HighScoreStore.shared.submit(id: "phoenix", score: score) + victoryLines.text = """ + PROGRESS \(sim.progressScore) + SHIELDS \(sim.shieldScore) + TIME \(sim.timeScore) + BONUS \(sim.bonusScore) + MONEY \(sim.cash) + """ + victoryTotal.text = "\(score)" + victoryRecord.text = record ? "★ NEW BEST ★" : "BEST \(HighScoreStore.shared.best("phoenix"))" + state = .victory + applyStateVisibility() + Haptics.success() + } + + /// Combat waves completed+current out of 31 (shops don't count). + private func waveNumber() -> Int { + var n = 0 + for i in 0.. 0 { + place(companionNode, img: .companion, x: sim.companionX, y: sim.companionY) + } else if sim.companionPwr < 0 { + place(companionNode, img: D.explosionFrames[min(sim.companionExplodeFrame, 7)], + x: sim.companionX, y: sim.companionY) + } else { + companionNode.isHidden = true + } + + // Enemies + for (i, node) in enemyNodes.enumerated() { + let e = sim.enemies[i] + if e.pwr == 0 { node.isHidden = true; continue } + place(node, img: e.currentImg, x: e.x, y: e.y) + } + + // Player bullets + for (i, node) in pbNodes.enumerated() { + let b = sim.playerBullets[i] + guard b.type != 0 else { node.isHidden = true; continue } + let img: D.Img + switch b.type { + case 3: img = .pb1 + case 6: img = .pb0 + case 9: img = .pb2l + case 12: img = .pb2r + case 15, 18, 21: img = .pb3 + case 24, 27, 30, 36, 39: img = .pbQuad + case 33: img = .pb5 + default: img = .pb0 + } + place(node, img: img, x: b.x, y: b.y) + } + + // Enemy bullets / money / impact explosions + for (i, node) in ebNodes.enumerated() { + let b = sim.enemyBullets[i] + guard b.type != 0 else { node.isHidden = true; continue } + let img: D.Img + switch b.type { + case -5: img = D.explosionFrames[min(b.data, 7)] + case 6: img = .money + case 21: img = .eb2 + case 24...30: img = .eb3 + case 33...39: img = .eb4 + default: img = .eb1 + } + place(node, img: img, x: b.x, y: b.y) + } + + // HUD + for (i, cell) in shieldCells.enumerated() { + cell.fillColor = i < sim.playerPwr + ? (sim.playerPwr <= 4 ? Palette.red : (sim.playerPwr <= 8 ? Palette.amber : Palette.mint)) + : UIColor(white: 1, alpha: 0.06) + } + cashValue.text = "$\(sim.cash)" + waveValue.text = "\(waveNumber())/31" + + for (i, button) in weaponButtons.enumerated() { + let owned = sim.hasWeapon[i] + button.setPressed(sim.chosenWeapon == i && owned) + button.alpha = state != .playing ? 0.25 : (owned ? 1.0 : 0.30) + } + } + + // MARK: - Effects + + private func spawnBoom(at p: CGPoint) { + let core = SceneArt.glowSprite(color: Palette.amber, radius: 26) + core.position = p + core.zPosition = 6 + worldCrop.addChild(core) + core.run(.sequence([.group([.scale(to: 2.0, duration: 0.22), .fadeOut(withDuration: 0.25)]), + .removeFromParent()])) + let sparks = SceneArt.sparkBurst(color: Palette.amber, count: 14, speed: 150, + lifetime: 0.5, scale: 0.20) + sparks.position = p + sparks.zPosition = 6 + worldCrop.addChild(sparks) + } + + private func flashPlayer() { + playerNode.removeAction(forKey: "hitflash") + let flash = SKAction.sequence([ + .colorize(with: .red, colorBlendFactor: 0.8, duration: 0.05), + .wait(forDuration: 0.08), + .colorize(withColorBlendFactor: 0, duration: 0.15), + ]) + playerNode.run(flash, withKey: "hitflash") + } + + private func popCash() { + let label = SKLabelNode(fontNamed: "Menlo-Bold") + label.text = "+$\(sim.moneyValue)" + label.fontSize = 13 + label.fontColor = UIColor(red: 1.0, green: 0.85, blue: 0.30, alpha: 1) + label.position = point(x: sim.playerX, y: sim.playerY - 6, w: 8, h: 0) + label.zPosition = 8 + addChild(label) + label.run(.sequence([.group([.moveBy(x: 0, y: 22, duration: 0.55), .fadeOut(withDuration: 0.55)]), + .removeFromParent()])) + } + + // MARK: - Touch handling + + override func touchesBegan(_ touches: Set, with event: UIEvent?) { + for touch in touches { + let p = touch.location(in: self) + switch state { + case .ready: + if handleStepperTap(at: p) { continue } + Haptics.selection() + startGame() + case .paused: + Haptics.selection() + state = .playing + applyStateVisibility() + case .gameOver, .victory: + Haptics.selection() + state = .ready + applyStateVisibility() + case .shop: + handleShopTap(at: p) + case .playing: + let dp = hypot(p.x - pauseButton.position.x, p.y - pauseButton.position.y) + if dp <= 30 { + Haptics.selection() + state = .paused + moveTouch = nil + applyStateVisibility() + continue + } + if let index = weaponButtons.firstIndex(where: { $0.covers(p) }) { + if sim.hasWeapon[index] { + Haptics.selection() + pendingWeapon = index + } else { + Haptics.warning() + } + continue + } + // Movement drag anchor + moveTouch = touch + touchAnchor = p + shipAnchor = CGPoint(x: CGFloat(sim.playerX), y: CGFloat(sim.playerY)) + targetX = sim.playerX + targetY = sim.playerY + } + } + } + + private var pendingWeapon: Int? + + override func touchesMoved(_ touches: Set, with event: UIEvent?) { + guard state == .playing, let moveTouch, touches.contains(moveTouch) else { return } + let p = moveTouch.location(in: self) + // Finger travel maps ~1.35× on-screen ship travel for comfortable reach + // (per-axis, so the stretched field keeps the same feel both ways). + targetX = Int(shipAnchor.x + (p.x - touchAnchor.x) * 1.35 / unit) + targetY = Int(shipAnchor.y - (p.y - touchAnchor.y) * 1.35 / unitY) + targetX = min(max(targetX, 12), 108) + targetY = min(max(targetY, 68), 90) + } + + override func touchesEnded(_ touches: Set, with event: UIEvent?) { + if let moveTouch, touches.contains(moveTouch) { self.moveTouch = nil } + } + + override func touchesCancelled(_ touches: Set, with event: UIEvent?) { + if let moveTouch, touches.contains(moveTouch) { self.moveTouch = nil } + } + + private func handleStepperTap(at p: CGPoint) -> Bool { + for (key, rect) in stepperRects where rect.contains(p) { + switch key { + case "diffMinus": chosenDifficulty = max(0, chosenDifficulty - 1) + case "diffPlus": chosenDifficulty = min(2, chosenDifficulty + 1) + case "speedMinus": chosenSpeed = max(0, chosenSpeed - 1) + case "speedPlus": chosenSpeed = min(2, chosenSpeed + 1) + default: break + } + difficultyValueLabel.text = D.difficultyOptions[chosenDifficulty].label + speedValueLabel.text = D.speedOptions[chosenSpeed].label + Haptics.selection() + return true + } + return false + } + + private func handleShopTap(at p: CGPoint) { + if shopDoneRect.contains(p) { + Haptics.selection() + state = .playing + applyStateVisibility() + return + } + for (i, rect) in shopRowRects.enumerated() where rect.contains(p) { + switch sim.buy(itemIndex: i) { + case .bought: + Haptics.success() + case .insufficientFunds: + Haptics.warning() + case .alreadyOwned, .shieldFull: + Haptics.selection() + } + refreshShop() + renderFrame() + return + } + } +} diff --git a/Arcade85/Games/Phoenix/PhoenixSim.swift b/Arcade85/Games/Phoenix/PhoenixSim.swift new file mode 100644 index 0000000..5d75892 --- /dev/null +++ b/Arcade85/Games/Phoenix/PhoenixSim.swift @@ -0,0 +1,975 @@ +import Foundation + +/// A faithful port of Phoenix 4.0 (Patrick Davidson, 2008) game logic from the +/// Z80 sources. Runs in the original coordinate space: X 0…127, Y increases +/// downward, with the visible window being Y 32…95 (the region above is +/// off-screen staging that enemies descend from). All movement, firing, +/// collision, shop and scoring rules are ported routine-for-routine; see +/// PhoenixData for the campaign/sprite tables. +struct PhoenixSim { + + typealias D = PhoenixData + + // MARK: - Playfield constants + + static let fieldW = 128 + static let screenTop = 32 // first visible Y + static let screenBottom = 96 // bullets die at y >= 96 + static let maxEnemies = 18 + static let maxPlayerBullets = 16 + static let maxEnemyBullets = 15 + + // MARK: - Entities + + struct Enemy { + var pwr = 0 // 0 = empty slot, -1 = exploding + var moveType = D.Move.standard + var move0 = 0, move1 = 0, move2 = 0 // e_movedata (byte semantics where needed) + var pattern: D.PatternID? = nil // pattern pointer (word movedata) + var patternIndex = 0 // segment index within pattern + var x = 0, w = 0, y = 0, h = 0 + var image: D.ImageRef = .still(.enemy1) + var animIndex = 0 + var animCountdown = 0 // e_imageseq (0 = still image) + var exploding = false // pwr == -1 with explosion animation + var fireType = D.Fire.random + var fireRate = 2 + var fireData = 0 + var fireWeapon = D.Weapon.normal + var firePower = 1 + + var currentImg: D.Img { + if exploding { return D.explosionFrames[min(animIndex, 7)] } + switch image { + case .still(let img): return img + case .anim(let anim): return anim.frames[animIndex % anim.frames.count].img + } + } + } + + struct PlayerBullet { + var type = 0 // 0 = empty; type codes from shoot.asm + var dmg = 0 + var x = 0, w = 0, y = 0, h = 0 + var data = 0 + } + + struct EnemyBullet { + var type = 0 // 0 = empty, -5 = impact explosion effect + var dmg = 0 // 0 => money drop + var x = 0, w = 0, y = 0, h = 0 + var data = 0 // explosion phase for type -5 + } + + // MARK: - Game state + + private(set) var enemies = [Enemy](repeating: Enemy(), count: maxEnemies) + private(set) var playerBullets = [PlayerBullet](repeating: PlayerBullet(), count: maxPlayerBullets) + private(set) var enemyBullets = [EnemyBullet](repeating: EnemyBullet(), count: maxEnemyBullets) + + private(set) var playerX = 60 + private(set) var playerY = 70 + private(set) var playerPwr = 16 // shield, max 16 + private(set) var cash = 0 + private(set) var weaponUpgrade = false + private(set) var hasWeapon = [true, false, false, false, false] // F1…F5 + private(set) var chosenWeapon = 0 // 0…4 + private var fireCounter = 0 + private var weapon4Side = false + private var weapon5Alt = false + + private(set) var companionPwr = 0 // 0 none, -1 exploding + private(set) var companionX = 0 + private(set) var companionY = 0 + private(set) var companionExplodeFrame = 0 + private var posQueue: [(y: Int, x: Int)] = [] + + private(set) var level = 0 // index of NEXT level to load + private(set) var enemiesLeft = 0 + private(set) var gameTimer = 0 + private(set) var timeScore = 19000 + private(set) var bonusScore = 0 + // Remake addition: run progress for the high-score system. The original + // only scored a finished campaign (score16.asm); these track how far a + // run got so a death still posts a score. + private(set) var wavesCleared = 0 // combat levels fully cleared + private(set) var totalEarned = 0 // lifetime $ collected (shop spending doesn't reduce it) + private(set) var moneyValue = 100 // per $ collected + private(set) var moneyCounter = 4 // kills until next $ drop + private(set) var over = false + private(set) var finished = false + + let speedOption: Int + let difficultyOption: Int + var fps: Double { D.speedOptions[speedOption].fps } + + private var rng: TetrisRNG + + enum Event: Equatable { + case enteredShop + case levelLoaded(Int) + case gameOver + case gameFinished + case enemyDestroyed(x: Int, y: Int) + case playerHit + case moneyCollected + case bossLevel + } + private(set) var events: [Event] = [] + + // MARK: - Init + + init(speed: Int = 2, difficulty: Int = 0, seed: UInt64? = nil) { + self.speedOption = min(max(speed, 0), 2) + self.difficultyOption = min(max(difficulty, 0), 2) + self.rng = TetrisRNG(seed: seed ?? UInt64.random(in: 1...UInt64.max)) + self.moneyValue = D.difficultyOptions[difficultyOption].moneyValue + self.bonusScore = D.difficultyOptions[difficultyOption].bonus + D.speedOptions[speedOption].bonus + } + + private mutating func rand() -> Int { Int(rng.next() & 0xFF) } + + /// `Div_A_16`: divide by 16 with frame-averaged fractions — the timer's low + /// nibble is bit-reversed and added before the shift so x/16 rounds up on + /// exactly x of every 16 frames. + private func divA16(_ a: Int) -> Int { + let t = gameTimer & 15 + let rev = ((t & 1) << 3) | ((t & 2) << 1) | ((t & 4) >> 1) | ((t & 8) >> 3) + return (a + rev) >> 4 + } + + // MARK: - Level loading (init.asm) + + /// Loads the next level. Returns without enemies for shop/game-end levels + /// (events signal what happened). + mutating func loadLevel() { + // The previous level just finished; if it was a combat wave, bank it. + if level > 0, case .combat = D.campaign[level - 1] { wavesCleared += 1 } + guard level < D.campaign.count else { finished = true; return } + let def = D.campaign[level] + level += 1 + + switch def { + case .shop: + // Original only opens the shop if you have money; either way the + // level is over immediately and the next one loads next frame. + if cash > 0 { events.append(.enteredShop) } + enemiesLeft = 0 + return + case .gameEnd: + finished = true + events.append(.gameFinished) + return + case .combat(let count, let commands): + enemiesLeft = count + runLoader(commands) + events.append(.levelLoaded(level)) + } + } + + private mutating func runLoader(_ commands: [D.Cmd]) { + // default_data + var buf = Enemy() + buf.pwr = 4 + buf.moveType = D.Move.standard + buf.move0 = 0; buf.move1 = -60; buf.move2 = 0 + buf.x = 10; buf.y = 10 + buf.image = .still(.enemy1) + buf.fireType = D.Fire.random + buf.fireRate = 2 + buf.fireWeapon = D.Weapon.normal + buf.firePower = 1 + + var slot = 0 + func install(_ x: Int, _ y: Int) { + guard slot < Self.maxEnemies else { return } + var e = buf + e.x = x & 0xFF + e.y = y + let img = e.currentImg + let sprite = D.sprites[img]! + e.w = sprite.w + e.h = sprite.h + // Animated images start at their first frame's countdown. + if case .anim(let anim) = e.image { + e.animIndex = 0 + e.animCountdown = anim.frames[0].time + } else { + e.animCountdown = 0 + } + enemies[slot] = e + slot += 1 + } + + for cmd in commands { + switch cmd { + case .setPower(let p): buf.pwr = p + case .setMoveType(let t): buf.moveType = t + case .setMoveData(let a, let b): buf.move0 = a; buf.move1 = b; buf.pattern = nil + case .setMovePattern(let p): buf.pattern = p; buf.patternIndex = 0 + case .image(let ref): buf.image = ref; buf.animIndex = 0 + case .setFireType(let t): buf.fireType = t + case .setFireRate(let r): buf.fireRate = r + case .setWeapon(let w): buf.fireWeapon = w + case .setFirePower(let p): buf.firePower = p + case .installOne(let x, let y): + install(x, y) + case .installRow(let x, let y, let n, let spacing): + install(x, y) + var cx = x + for _ in 1.. 0 { timeScore -= 1 } + } + + // MARK: - Player (player16.asm + shoot.asm) + + private mutating func doPlayer(_ input: Input) { + if let sel = input.selectWeapon, sel >= 0, sel < 5, hasWeapon[sel] { + chosenWeapon = sel + } + + // Fire: cooldown 10 frames base, 4 with the upgrade; releasing resets. + if !input.fire { + fireCounter = 0 + } else { + if fireCounter == 0 { + fireCounter = weaponUpgrade ? 4 : 10 + playerShoot() + } else { + fireCounter -= 1 + } + } + + // Movement, exact bound checks from do_player (blocked at the limit). + if input.dy > 0 { + let ny = playerY + 1 + if ny != 90 { playerY = ny } + } else if input.dy < 0 { + let ny = playerY - 1 + if ny != 68 { playerY = ny } + } + if input.dx < 0 { + let nx = playerX - 2 + if nx != 12 { playerX = nx } + } else if input.dx > 0 { + let nx = playerX + 2 + if nx != 108 { playerX = nx } + } + } + + private mutating func firePlayerBullet(type: Int, dmg: Int, w: Int, h: Int, xOff: Int) { + guard let i = playerBullets.firstIndex(where: { $0.type == 0 }) else { return } + playerBullets[i] = PlayerBullet(type: type, dmg: dmg, + x: playerX + xOff, w: w, + y: playerY - 3, h: h, data: 7) + } + + private mutating func playerShoot() { + switch chosenWeapon { + case 0: + if weaponUpgrade { + firePlayerBullet(type: 3, dmg: 4, w: 4, h: 8, xOff: 4) + } else { + firePlayerBullet(type: 6, dmg: 2, w: 2, h: 6, xOff: 5) + } + case 1: + firePlayerBullet(type: 9, dmg: 2, w: 3, h: 7, xOff: 1) + firePlayerBullet(type: 12, dmg: 2, w: 3, h: 7, xOff: 8) + case 2: + firePlayerBullet(type: 21, dmg: 4, w: 4, h: 4, xOff: 4) + firePlayerBullet(type: 15, dmg: 3, w: 4, h: 4, xOff: 2) + firePlayerBullet(type: 18, dmg: 3, w: 4, h: 4, xOff: 6) + case 3: + weapon4Side.toggle() + let side = weapon4Side ? 7 : 0 + firePlayerBullet(type: 27, dmg: 8, w: 3, h: 5, xOff: side + 2) + firePlayerBullet(type: 24, dmg: 8, w: 3, h: 5, xOff: side) + case 4: + weapon5Alt.toggle() + firePlayerBullet(type: 33, dmg: 20, w: 5, h: 7, xOff: weapon5Alt ? 4 : 3) + firePlayerBullet(type: 36, dmg: 8, w: 4, h: 4, xOff: 0) + firePlayerBullet(type: 39, dmg: 8, w: 4, h: 4, xOff: 8) + default: break + } + } + + // MARK: - Player bullets (bullets.asm) + + private mutating func movePlayerBullets() { + for i in 0..= 124 { playerBullets[i].type = 0; continue } + bulletUp(i, dy: -4) + case 24, 27: // quad: up 4, drifting ±0.5/frame + if gameTimer & 1 == 0 { + playerBullets[i].x += (playerBullets[i].type == 27) ? 1 : -1 + if playerBullets[i].x <= 0 || playerBullets[i].x >= 124 { + playerBullets[i].type = 0; continue + } + } + bulletUp(i, dy: -4) + case 30: // companion shot: straight up 4 + bulletUp(i, dy: -4) + case 33: // super: up 5 + bulletUp(i, dy: -5) + case 36, 39: // swing: sideways 1, arcing Y + playerBullets[i].x += (playerBullets[i].type == 36) ? 1 : -1 + if playerBullets[i].x <= 0 || playerBullets[i].x >= 124 { + playerBullets[i].type = 0; continue + } + playerBullets[i].data -= 1 + let dy = playerBullets[i].data >> 1 // arithmetic: 3,2,2,1…0,-1… + bulletUp(i, dy: dy) + default: + playerBullets[i].type = 0 + } + } + } + + private mutating func bulletUp(_ i: Int, dy: Int) { + playerBullets[i].y += dy + if playerBullets[i].y < 24 { playerBullets[i].type = 0 } + } + + // MARK: - Bullets vs enemies (enemyhit.asm) + + private mutating func hitEnemies() { + for bi in 0.. 0 else { continue } + guard rectsOverlap(x1: e.x, w1: e.w, y1: e.y, h1: e.h, + x2: b.x, w2: b.w, y2: b.y, h2: b.h) else { continue } + playerBullets[bi].type = 0 + enemies[ei].pwr -= b.dmg + if enemies[ei].pwr <= 0 { + startExplosion(ei) + } + break + } + } + } + + private mutating func startExplosion(_ ei: Int) { + enemies[ei].pwr = -1 + enemies[ei].exploding = true + enemies[ei].moveType = D.Move.none + enemies[ei].animIndex = 0 + enemies[ei].animCountdown = 2 + enemies[ei].fireType = D.Fire.none + events.append(.enemyDestroyed(x: enemies[ei].x, y: enemies[ei].y)) + } + + // MARK: - Enemies (enemies.asm / emove.asm / eshoot.asm) + + private mutating func doEnemies() { + var swoopUsedThisFrame = 0 // misc_flags, reset each frame + for i in 0..= 9 { standardSwing(i) } + else { + enemies[i].moveType = D.Move.rampage + enemies[i].move1 = -1 + enemies[i].move2 = -1 + rampageApply(i) + } + case D.Move.swoopHoriz: swoopHoriz(i) + case D.Move.swoopDown: swoopDown(i) + case D.Move.swoopUp: + enemies[i].y -= 1 + if enemies[i].y == 0 { enemies[i].moveType = D.Move.swoopWait } + case D.Move.swoopWait: swoopWaitMove(i, flags: &swoopFlags) + case D.Move.rampageInit: + enemies[i].moveType = D.Move.rampage + enemies[i].move1 = 1 + enemies[i].move2 = 1 + enemies[i].x = (rand() & 63) + 28 + enemies[i].y = rand() & 8 + default: break + } + } + + /// EM_STANDARD: byte timer counts up (from -60 on entry), moves on odd + /// ticks, phase advances at 17 cycling down/right/up/left. + private mutating func standardSwing(_ i: Int) { + let phase = enemies[i].move0 + enemies[i].move1 = (enemies[i].move1 + 1) & 0xFF + let timer = enemies[i].move1 + guard timer & 1 == 1 else { return } + if timer == 17 { + enemies[i].move1 = 0 + enemies[i].move0 = (phase + 4) & 12 + } + switch phase { + case 0: enemies[i].y += 1 + case 4: enemies[i].x += 1 + case 8: enemies[i].y -= 1 + default: enemies[i].x -= 1 + } + } + + private mutating func bossMove(_ i: Int) { + if enemies[i].move0 == 0 { + enemies[i].move1 -= 1 + if enemies[i].move1 == 0 { + enemies[i].move0 = -1 + enemies[i].move1 = 83 + } else { + enemies[i].y += 1 + } + } else { + enemies[i].move1 -= 1 + if enemies[i].move1 == 0 { + enemies[i].move0 = -enemies[i].move0 + enemies[i].move1 = 90 + } + enemies[i].x += enemies[i].move0 + } + } + + /// EM_BOUNCE: move0 = Y velocity code, move1 = X velocity code. + /// Bit 1 = direction (down/right), bit 0 = fast (every frame vs every other). + private mutating func bounceMove(_ i: Int) { + let yv = enemies[i].move0 + let xv = enemies[i].move1 + if (gameTimer | xv) & 1 == 1 { + if xv & 2 != 0 { + enemies[i].x += 1 + if enemies[i].x == 107 { enemies[i].move1 = rand() & 1 } + } else { + enemies[i].x -= 1 + if enemies[i].x == 13 { enemies[i].move1 = (rand() & 1) | 2 } + } + } + if (gameTimer | yv) & 1 == 1 { + if yv & 2 != 0 { + enemies[i].y += 1 + if enemies[i].y == 60 { enemies[i].move0 = rand() & 1 } + } else { + enemies[i].y -= 1 + if enemies[i].y == 31 { enemies[i].move0 = (rand() & 1) | 2 } + } + } + } + + /// EM_PATTERNSTART: X was installed as the entry delay, Y as the start X. + private mutating func patternInit(_ i: Int) { + enemies[i].moveType = D.Move.patternWait + let givenY = enemies[i].y + let givenX = enemies[i].x + enemies[i].y = 110 // parked off-screen while waiting + enemies[i].x = givenY + enemies[i].move2 = givenX & 0xFF // delay counter + if enemies[i].move2 == 0 { enemies[i].move2 = 256 } + } + + private mutating func patternWait(_ i: Int) { + enemies[i].move2 -= 1 + if enemies[i].move2 == 0 { + enemies[i].move2 = -1 // original double-decrements + enemies[i].moveType = D.Move.patternMain + enemies[i].y = 24 + } + } + + private mutating func patternMove(_ i: Int) { + guard let pid = enemies[i].pattern, let pattern = D.patterns[pid] else { return } + var index = enemies[i].patternIndex + enemies[i].move2 += 1 + if enemies[i].move2 == pattern.segments[index].time { + index += 1 + if index >= pattern.segments.count { index = pattern.loopStart } + enemies[i].patternIndex = index + enemies[i].move2 = 0 + } + let seg = pattern.segments[index] + enemies[i].x += divA16(seg.xv) + enemies[i].y += divA16(seg.yv) + } + + private mutating func rampageApply(_ i: Int) { rampageMove(i) } + + private mutating func rampageMove(_ i: Int) { + var xv = enemies[i].move1 + var yv = enemies[i].move2 + let nx = enemies[i].x + xv + enemies[i].x = nx + if nx < 16 { xv = 1 } + else if nx == 40 || nx == 71 || nx == 93 { xv = (rand() & 1) == 1 ? -1 : 1 } + else if nx >= 105 { xv = -1 } + let ny = enemies[i].y + yv + enemies[i].y = ny + if ny < 41 { yv = 1 } + else if ny == 51 { yv = (rand() & 1) == 1 ? -1 : 1 } + else if ny >= 59 { yv = -1 } + enemies[i].move1 = xv + enemies[i].move2 = yv + } + + private mutating func swoopWaitMove(_ i: Int, flags: inout Int) { + guard gameTimer & 15 == 0 else { return } + let pick = rand() & 3 + let bit = 1 << pick + guard flags & bit == 0 else { return } + flags |= bit + let path = D.swoopPaths[pick] + enemies[i].moveType = D.Move.swoopDown + enemies[i].move1 = path.yDest + enemies[i].move2 = path.xDest + enemies[i].x = path.xEntry + enemies[i].y = 2 + } + + private mutating func swoopDown(_ i: Int) { + enemies[i].y += 1 + if enemies[i].y == enemies[i].move1 { + enemies[i].move1 = enemies[i].move2 >= 64 ? 2 : -2 + enemies[i].moveType = D.Move.swoopHoriz + } + } + + private mutating func swoopHoriz(_ i: Int) { + enemies[i].x += enemies[i].move1 + if enemies[i].x == enemies[i].move2 { + enemies[i].moveType = D.Move.swoopUp + } + } + + // --- Firing --- + + private mutating func enemyShoot(_ i: Int) { + let e = enemies[i] + switch e.fireType { + case D.Fire.random: + guard rand() < e.fireRate else { return } + case D.Fire.periodic: + enemies[i].fireData += 1 + guard enemies[i].fireData == e.fireRate else { return } + enemies[i].fireData = 0 + default: + return + } + fireEnemyWeapon(i) + } + + private mutating func fireEnemyWeapon(_ i: Int) { + let e = enemies[i] + switch e.fireWeapon { + case D.Weapon.normal: + spawnEnemyBullet(type: 3, from: e, dmg: e.firePower, w: 2, h: 2) + case D.Weapon.double: + fireAimed(from: e, xShift: 0) + fireAimed(from: e, xShift: 14) + case D.Weapon.semiAim: + fireSemiAim(i) + case D.Weapon.big: + fireLarge(i, huge: false, xShift: 0) + fireLarge(i, huge: false, xShift: 13) + case D.Weapon.huge: + fireLarge(i, huge: true, xShift: 0) + fireLarge(i, huge: true, xShift: 11) + case D.Weapon.arrow: + spawnEnemyBullet(type: 21, from: e, dmg: e.firePower, w: 3, h: 7) + case D.Weapon.singleBig: + fireLarge(i, huge: false, xShift: 2) + case D.Weapon.singleHuge: + fireLarge(i, huge: true, xShift: 1) + default: break + } + } + + /// W_DOUBLE component: straight, or diagonal when the player is >30 off. + private mutating func fireAimed(from e: Enemy, xShift: Int) { + var shifted = e + shifted.x += xShift + if playerX + 30 < shifted.x { + spawnEnemyBullet(type: 9, from: shifted, dmg: e.firePower, w: 2, h: 2) + } else if playerX - 30 > shifted.x { + spawnEnemyBullet(type: 12, from: shifted, dmg: e.firePower, w: 2, h: 2) + } else { + spawnEnemyBullet(type: 3, from: shifted, dmg: e.firePower, w: 2, h: 2) + } + } + + /// W_SEMIAIM: straight down, or half-angle toward the player. + private mutating func fireSemiAim(_ i: Int) { + let e = enemies[i] + let dy = playerY - e.y + guard dy >= 0 else { return } + let b = (dy >> 2) + (dy >> 3) // (3/8) * dy + guard b != 0 else { return } + let dx = playerX - e.x + if abs(dx) < b { + spawnEnemyBullet(type: 3, from: e, dmg: e.firePower, w: 2, h: 2) + } else if dx < 0 { + spawnEnemyBullet(type: 15, from: e, dmg: e.firePower, w: 2, h: 2) + } else { + spawnEnemyBullet(type: 18, from: e, dmg: e.firePower, w: 2, h: 2) + } + } + + /// W_BIG / W_HUGE: fully-aimed shot in one of 7 angle buckets. + private mutating func fireLarge(_ i: Int, huge: Bool, xShift: Int) { + var e = enemies[i] + e.x += xShift + let dy = playerY - e.y + guard dy >= 0 else { return } + let b = (dy >> 2) + (dy >> 3) + guard b != 0 else { return } + var dx = playerX - e.x + let left = dx < 0 + if left { dx = -dx } + var c = 0 + var rem = dx - b + while rem >= 0 && c < 3 { // get_angle buckets 0…3 + c += 1 + rem -= b + if c == 2 { rem -= b } // the doubled step in the original + } + let angle = left ? -min(c, 3) : min(c, 3) + let type = (huge ? 36 : 27) + angle // big 24…30, huge 33…39 + spawnEnemyBullet(type: type, from: e, dmg: e.firePower, + w: huge ? 5 : 5, h: huge ? 5 : 5) + } + + private mutating func spawnEnemyBullet(type: Int, from e: Enemy, dmg: Int, w: Int, h: Int) { + guard let i = enemyBullets.firstIndex(where: { $0.type == 0 }) else { return } + enemyBullets[i] = EnemyBullet(type: type, dmg: dmg, + x: e.x + 2, w: w, y: e.y + 7, h: h, data: 0) + } + + // --- Animation & death (enemy_display / kill_enemy) --- + + private mutating func enemyAnimate(_ i: Int) { + if enemies[i].exploding { + enemies[i].animCountdown -= 1 + if enemies[i].animCountdown == 0 { + enemies[i].animIndex += 1 + if enemies[i].animIndex >= D.explosionFrames.count { + killEnemy(i) + } else { + enemies[i].animCountdown = 2 + } + } + return + } + guard case .anim(let anim) = enemies[i].image, enemies[i].animCountdown > 0 else { return } + enemies[i].animCountdown -= 1 + if enemies[i].animCountdown == 0 { + enemies[i].animIndex = (enemies[i].animIndex + 1) % anim.frames.count + enemies[i].animCountdown = anim.frames[enemies[i].animIndex].time + } + } + + private mutating func killEnemy(_ i: Int) { + let x = enemies[i].x + let y = enemies[i].y + enemies[i] = Enemy() // free the slot + enemiesLeft -= 1 + moneyCounter -= 1 + if moneyCounter == 0 { + moneyCounter = (rand() & 7) + 4 + // Drop money at the dead enemy's position (a dmg-0 bonus bullet). + if let bi = enemyBullets.firstIndex(where: { $0.type == 0 }) { + enemyBullets[bi] = EnemyBullet(type: 6, dmg: 0, x: x + 2, w: 5, y: y + 7, h: 7, data: 0) + } + } + } + + // MARK: - Enemy bullets (ebullets.asm) + + private mutating func moveEnemyBullets() { + for i in 0..= 8 { enemyBullets[i].type = 0 } + } + case 3: // straight down 1 + ebDown(i, 1) + case 6: // money: falls every other frame + if gameTimer & 1 == 0 { ebDown(i, 1) } + case 9: // diagonal left + enemyBullets[i].x -= 1 + if enemyBullets[i].x <= 0 { enemyBullets[i].type = 0; continue } + ebDown(i, 1) + case 12: // diagonal right + enemyBullets[i].x += 1 + if enemyBullets[i].x >= 126 { enemyBullets[i].type = 0; continue } + ebDown(i, 1) + case 15: // half-left: alternate straight/diag + if gameTimer & 1 == 1 { + enemyBullets[i].x -= 1 + if enemyBullets[i].x <= 0 { enemyBullets[i].type = 0; continue } + } + ebDown(i, 1) + case 18: // half-right + if gameTimer & 1 == 1 { + enemyBullets[i].x += 1 + if enemyBullets[i].x >= 126 { enemyBullets[i].type = 0; continue } + } + ebDown(i, 1) + case 21: // arrow: straight down 1 + ebDown(i, 1) + case 24...30: // big, angle-coded + ebLarge(i, index: type - 24) + case 33...39: // huge, angle-coded + ebLarge(i, index: type - 33) + default: + enemyBullets[i].type = 0 + } + } + } + + private mutating func ebDown(_ i: Int, _ dy: Int) { + enemyBullets[i].y += dy + if enemyBullets[i].y >= Self.screenBottom { enemyBullets[i].type = 0 } + } + + /// Big/huge bullets: velocities in half-pixels with timer-dithered halves. + private mutating func ebLarge(_ i: Int, index: Int) { + guard index >= 0, index < D.bigBulletSpeeds.count else { enemyBullets[i].type = 0; return } + let speeds = D.bigBulletSpeeds[index] + let dx = halfStep(speeds.xv) + let dy = halfStep(speeds.yv) + enemyBullets[i].x += dx + if enemyBullets[i].x < 0 || enemyBullets[i].x >= Self.fieldW { + enemyBullets[i].type = 0 + return + } + ebDown(i, dy) + } + + /// div_by_2 with timer-based fraction: a/2, remainder applied on odd frames. + private func halfStep(_ v: Int) -> Int { + var out = v >> 1 + if v & 1 != 0, gameTimer & 1 != 0 { out += 1 } + return out + } + + // MARK: - Enemy bullets vs player/companion (hityou.asm) + + private mutating func hitPlayer() { + scanHits(targetX: playerX, targetW: 8, targetY: playerY, targetH: 6, isCompanion: false) + if companionPwr > 0 { + scanHits(targetX: companionX, targetW: 7, targetY: companionY, targetH: 7, isCompanion: true) + } + } + + private mutating func scanHits(targetX: Int, targetW: Int, targetY: Int, targetH: Int, isCompanion: Bool) { + for i in 0.. 0 else { continue } + guard rectsOverlap(x1: targetX, w1: targetW, y1: targetY, h1: targetH, + x2: b.x, w2: b.w, y2: b.y, h2: b.h) else { continue } + if b.dmg == 0 { + // Money pickup + enemyBullets[i].type = 0 + cash = min(cash + moneyValue, 9900) + totalEarned += moneyValue + events.append(.moneyCollected) + continue + } + // Convert the bullet into a small impact explosion. + enemyBullets[i].type = -5 + enemyBullets[i].data = 0 + enemyBullets[i].x -= 3 + enemyBullets[i].y -= 2 + if isCompanion { + companionPwr -= b.dmg + if companionPwr <= 0 { + companionPwr = -1 + companionExplodeFrame = 0 + } + } else { + playerPwr -= b.dmg + events.append(.playerHit) + if playerPwr < 0 { + over = true + events.append(.gameOver) + return + } + } + } + } + + // MARK: - Companion (helper.asm) + + private mutating func doCompanion() { + if companionPwr < 0 { + // Explosion animation, one frame every other tick. + if gameTimer & 1 == 0 { + companionExplodeFrame += 1 + if companionExplodeFrame >= 8 { companionPwr = 0 } + } + return + } + guard companionPwr > 0 else { return } + + // Age the position queue; the player's live position feeds the tail. + posQueue.append((y: playerY, x: playerX)) + if posQueue.count > 11 { posQueue.removeFirst(posQueue.count - 11) } + guard let oldest = posQueue.first else { return } + + // Destination: just above the oldest position, offset to the side. + let destY = oldest.y - 1 + let destX = oldest.x < 60 ? oldest.x + 11 : oldest.x - 10 + + if companionY < destY { companionY += 1 } else if companionY > destY { companionY -= 1 } + if companionX < destX { companionX += 1 } else if companionX > destX { companionX -= 1 } + + // Fires a heavy shot every 8 frames. + if gameTimer & 7 == 0 { + if let i = playerBullets.firstIndex(where: { $0.type == 0 }) { + playerBullets[i] = PlayerBullet(type: 30, dmg: 10, + x: companionX + 2, w: 3, + y: companionY - 5, h: 5, data: 0) + } + } + } + + // MARK: - Shop (shop16.asm) + + enum ShopResult { case bought, insufficientFunds, alreadyOwned, shieldFull } + + mutating func buy(itemIndex: Int) -> ShopResult { + let price = D.shopItems[itemIndex].price + switch itemIndex { + case 0: // extra shield + guard playerPwr < 16 else { return .shieldFull } + guard cash >= price else { return .insufficientFunds } + cash -= price + playerPwr += 1 + return .bought + case 2: // companion + guard companionPwr != 16 else { return .alreadyOwned } + guard cash >= price else { return .insufficientFunds } + cash -= price + companionPwr = 16 + companionY = 90 + companionX = 60 + posQueue.removeAll() + return .bought + case 3: // weapon upgrade + guard !weaponUpgrade else { return .alreadyOwned } + guard cash >= price else { return .insufficientFunds } + cash -= price + weaponUpgrade = true + return .bought + default: // weapons F2…F5 (items 1, 4, 5, 6 → weapons 1…4) + let weapon = [0: 0, 1: 1, 4: 2, 5: 3, 6: 4][itemIndex] ?? 0 + guard !hasWeapon[weapon] else { return .alreadyOwned } + guard cash >= price else { return .insufficientFunds } + cash -= price + hasWeapon[weapon] = true + chosenWeapon = weapon + return .bought + } + } + + // MARK: - Final score (score16.asm) + + var finalScore: Int { + max(0, playerPwr) * 1000 + timeScore + bonusScore + cash + } + + var shieldScore: Int { max(0, playerPwr) * 1000 } + + /// Remake addition: how far the run got, scoreable at any moment — waves + /// beaten plus everything ever earned. A death posts this; a victory posts + /// this plus the original score16 tally on top. + var progressScore: Int { wavesCleared * 400 + totalEarned } + + // MARK: - Helpers + + private func rectsOverlap(x1: Int, w1: Int, y1: Int, h1: Int, + x2: Int, w2: Int, y2: Int, h2: Int) -> Bool { + x1 < x2 + w2 && x2 < x1 + w1 && y1 < y2 + h2 && y2 < y1 + h1 + } + + #if DEBUG + mutating func debugSetCash(_ amount: Int) { cash = amount } + mutating func debugSetLevel(_ n: Int) { level = n } + mutating func debugSetShield(_ n: Int) { playerPwr = n } + mutating func debugGiveWeapons() { + hasWeapon = [true, true, true, true, true] + weaponUpgrade = true + } + mutating func debugPlacePlayer(x: Int, y: Int) { playerX = x; playerY = y } + #endif +} diff --git a/Arcade85/Games/SceneArt.swift b/Arcade85/Games/SceneArt.swift new file mode 100644 index 0000000..c3ae12b --- /dev/null +++ b/Arcade85/Games/SceneArt.swift @@ -0,0 +1,295 @@ +import SpriteKit +import UIKit + +/// Reusable procedural art for the SpriteKit scenes: gradients, starfields, +/// SF-symbol textures, and an HD rendering of the original TI-85 lander sprite. +enum SceneArt { + + /// A vertical gradient texture (top color at the top of the node). + static func verticalGradient(size: CGSize, top: UIColor, bottom: UIColor) -> SKTexture { + let renderer = UIGraphicsImageRenderer(size: size) + let image = renderer.image { ctx in + let cg = ctx.cgContext + let colorSpace = CGColorSpaceCreateDeviceRGB() + let gradient = CGGradient(colorsSpace: colorSpace, + colors: [top.cgColor, bottom.cgColor] as CFArray, + locations: [0, 1])! + cg.drawLinearGradient(gradient, + start: CGPoint(x: 0, y: 0), + end: CGPoint(x: 0, y: size.height), + options: []) + } + return SKTexture(image: image) + } + + /// A node full of small stars scattered across `size`. A handful twinkle. + static func starfield(size: CGSize, count: Int, seed: UInt64) -> SKNode { + let node = SKNode() + var rng = SeededGenerator(seed: seed) + for i in 0.. SKTexture? { + let config = UIImage.SymbolConfiguration(pointSize: pointSize, weight: .semibold) + guard let image = UIImage(systemName: name, withConfiguration: config)? + .withTintColor(color, renderingMode: .alwaysOriginal) + else { return nil } + return SKTexture(image: image) + } + + // MARK: - HD toolkit (shared by the per-game overhauls) + + /// A soft radial falloff — the building block for glows and particles. + static func radialGlowTexture(color: UIColor, radius: CGFloat) -> SKTexture { + let side = radius * 2 + let renderer = UIGraphicsImageRenderer(size: CGSize(width: side, height: side)) + let image = renderer.image { ctx in + let cg = ctx.cgContext + let colors = [color.withAlphaComponent(0.85).cgColor, + color.withAlphaComponent(0.25).cgColor, + color.withAlphaComponent(0).cgColor] as CFArray + let gradient = CGGradient(colorsSpace: CGColorSpaceCreateDeviceRGB(), + colors: colors, locations: [0, 0.35, 1])! + cg.drawRadialGradient(gradient, + startCenter: CGPoint(x: radius, y: radius), startRadius: 0, + endCenter: CGPoint(x: radius, y: radius), endRadius: radius, + options: []) + } + return SKTexture(image: image) + } + + /// An additive-blended glow sprite ready to drop behind any node. + static func glowSprite(color: UIColor, radius: CGFloat) -> SKSpriteNode { + let sprite = SKSpriteNode(texture: radialGlowTexture(color: color, radius: radius)) + sprite.blendMode = .add + return sprite + } + + /// A small soft dot used as the particle texture everywhere. + static let particleTexture: SKTexture = radialGlowTexture(color: .white, radius: 12) + + /// Rounded panel with a vertical gradient fill, hairline stroke, and a + /// faint top highlight — the standard card/HUD surface. + static func panelTexture(size: CGSize, cornerRadius: CGFloat, + top: UIColor, bottom: UIColor, + stroke: UIColor = UIColor(white: 1, alpha: 0.10)) -> SKTexture { + let renderer = UIGraphicsImageRenderer(size: size) + let image = renderer.image { ctx in + let cg = ctx.cgContext + let rect = CGRect(origin: .zero, size: size).insetBy(dx: 0.5, dy: 0.5) + let path = UIBezierPath(roundedRect: rect, cornerRadius: cornerRadius) + cg.saveGState() + path.addClip() + let gradient = CGGradient(colorsSpace: CGColorSpaceCreateDeviceRGB(), + colors: [top.cgColor, bottom.cgColor] as CFArray, + locations: [0, 1])! + cg.drawLinearGradient(gradient, start: .zero, + end: CGPoint(x: 0, y: size.height), options: []) + // top highlight line (remember: UIKit origin is top-left here) + cg.setFillColor(UIColor(white: 1, alpha: 0.07).cgColor) + cg.fill(CGRect(x: cornerRadius * 0.6, y: 1, width: size.width - cornerRadius * 1.2, height: 1.5)) + cg.restoreGState() + stroke.setStroke() + path.lineWidth = 1 + path.stroke() + } + return SKTexture(image: image) + } + + /// One-shot spark burst (explosions, impacts). Self-removing. + static func sparkBurst(color: UIColor, count: Int = 26, speed: CGFloat = 190, + lifetime: CGFloat = 0.7, scale: CGFloat = 0.24) -> SKEmitterNode { + let e = SKEmitterNode() + e.particleTexture = particleTexture + e.particleBirthRate = CGFloat(count) * 40 + e.numParticlesToEmit = count + e.particleLifetime = lifetime + e.particleLifetimeRange = lifetime * 0.6 + e.emissionAngleRange = .pi * 2 + e.particleSpeed = speed + e.particleSpeedRange = speed * 0.8 + e.particleAlpha = 0.95 + e.particleAlphaSpeed = -1.4 / lifetime + e.particleScale = scale + e.particleScaleRange = scale * 0.5 + e.particleScaleSpeed = -scale / lifetime + e.particleColor = color + e.particleColorBlendFactor = 1 + e.particleBlendMode = .add + e.yAcceleration = -60 + e.run(.sequence([.wait(forDuration: Double(lifetime) * 2), .removeFromParent()])) + return e + } + + /// Continuous engine/thruster flame pointing along `angle` (radians). + static func thrustEmitter(color: UIColor, angle: CGFloat, speed: CGFloat = 150, + birthRate: CGFloat = 130, scale: CGFloat = 0.30, + lifetime: CGFloat = 0.28) -> SKEmitterNode { + let e = SKEmitterNode() + e.particleTexture = particleTexture + e.particleBirthRate = birthRate + e.particleLifetime = lifetime + e.particleLifetimeRange = lifetime * 0.5 + e.emissionAngle = angle + e.emissionAngleRange = 0.45 + e.particleSpeed = speed + e.particleSpeedRange = speed * 0.4 + e.particleAlpha = 0.9 + e.particleAlphaSpeed = -3.0 + e.particleScale = scale + e.particleScaleSpeed = -scale * 2.2 + e.particleColor = color + e.particleColorBlendFactor = 1 + e.particleBlendMode = .add + return e + } + + /// A lingering world-space trail behind a moving node. Set `targetNode` + /// to the scene (or a world layer) after adding, so the ribbon stays put. + static func trailEmitter(color: UIColor, scale: CGFloat = 0.20, + lifetime: CGFloat = 0.45, birthRate: CGFloat = 60) -> SKEmitterNode { + let e = SKEmitterNode() + e.particleTexture = particleTexture + e.particleBirthRate = birthRate + e.particleLifetime = lifetime + e.particleSpeed = 0 + e.particleAlpha = 0.5 + e.particleAlphaSpeed = -0.5 / lifetime - 0.6 + e.particleScale = scale + e.particleScaleSpeed = -scale / lifetime + e.particleColor = color + e.particleColorBlendFactor = 1 + e.particleBlendMode = .add + return e + } + + /// Slow ambient dust drifting through the playfield — cheap depth. + static func ambientDust(size: CGSize, color: UIColor = UIColor(white: 1, alpha: 1)) -> SKEmitterNode { + let e = SKEmitterNode() + e.particleTexture = particleTexture + e.particleBirthRate = 3 + e.particleLifetime = 14 + e.particleLifetimeRange = 6 + e.particlePositionRange = CGVector(dx: size.width, dy: size.height) + e.particleSpeed = 10 + e.particleSpeedRange = 8 + e.emissionAngle = .pi / 2 * 3 + e.emissionAngleRange = 0.6 + e.particleAlpha = 0.0 + e.particleAlphaSequence = SKKeyframeSequence(keyframeValues: [0.0, 0.28, 0.28, 0.0], + times: [0, 0.15, 0.75, 1]) + e.particleScale = 0.10 + e.particleScaleRange = 0.08 + e.particleColor = color + e.particleColorBlendFactor = 1 + e.particleBlendMode = .add + e.advanceSimulationTime(20) // pre-warm so it never starts empty + return e + } + + /// Darkened corners that focus the eye on the playfield. + static func vignette(size: CGSize, alpha: CGFloat = 0.55) -> SKSpriteNode { + let renderer = UIGraphicsImageRenderer(size: size) + let image = renderer.image { ctx in + let cg = ctx.cgContext + let colors = [UIColor.black.withAlphaComponent(0).cgColor, + UIColor.black.withAlphaComponent(0).cgColor, + UIColor.black.withAlphaComponent(alpha).cgColor] as CFArray + let gradient = CGGradient(colorsSpace: CGColorSpaceCreateDeviceRGB(), + colors: colors, locations: [0, 0.62, 1])! + let center = CGPoint(x: size.width / 2, y: size.height / 2) + cg.drawRadialGradient(gradient, startCenter: center, startRadius: 0, + endCenter: center, + endRadius: max(size.width, size.height) * 0.72, + options: []) + } + let sprite = SKSpriteNode(texture: SKTexture(image: image)) + sprite.zPosition = 900 + sprite.isUserInteractionEnabled = false + return sprite + } + + /// Quick camera-less screen shake: run it on a world container node. + static func shake(intensity: CGFloat, duration: TimeInterval = 0.35) -> SKAction { + var actions: [SKAction] = [] + var amp = intensity + while amp > 0.5 { + let dx = CGFloat.random(in: -amp...amp) + let dy = CGFloat.random(in: -amp...amp) + actions.append(.moveBy(x: dx, y: dy, duration: 0.02)) + actions.append(.moveBy(x: -dx, y: -dy, duration: 0.02)) + amp *= 0.72 + } + let count = max(actions.count, 1) + let step = duration / Double(count) + return .sequence(actions.map { a in a.duration = step; return a }) + } + + /// Additive white flash overlay for hits/explosions. Self-removing. + static func flash(size: CGSize, color: UIColor = .white, peak: CGFloat = 0.32, + duration: TimeInterval = 0.22) -> SKSpriteNode { + let sprite = SKSpriteNode(color: color, size: size) + sprite.alpha = peak + sprite.blendMode = .add + sprite.zPosition = 850 + sprite.run(.sequence([.fadeOut(withDuration: duration), .removeFromParent()])) + return sprite + } + + /// The original TI-85 Lunar Lander sprite (8×8, MSB = leftmost pixel), + /// taken verbatim from LANDER.C, rendered as crisp rounded neon pixels. + static let landerBitmap: [UInt8] = [ + 0b00011010, + 0b00111111, + 0b01001010, + 0b11111110, + 0b01111110, + 0b00100100, + 0b01000010, + 0b11100111, + ] + + static func landerTexture(cell: CGFloat = 40, color: UIColor = Palette.mint) -> SKTexture { + let side = cell * 8 + let renderer = UIGraphicsImageRenderer(size: CGSize(width: side, height: side)) + let image = renderer.image { ctx in + let cg = ctx.cgContext + // First pass: a soft glow behind the whole silhouette. + cg.setShadow(offset: .zero, blur: cell * 0.5, color: color.withAlphaComponent(0.9).cgColor) + for (row, bits) in landerBitmap.enumerated() { + for col in 0..<8 where (bits & (0x80 >> UInt8(col))) != 0 { + let rect = CGRect(x: CGFloat(col) * cell, y: CGFloat(row) * cell, width: cell, height: cell) + color.setFill() + UIBezierPath(rect: rect.insetBy(dx: cell * 0.06, dy: cell * 0.06)).fill() + } + } + // Second pass: crisp merged pixels (no shadow) so the shape reads solid. + cg.setShadow(offset: .zero, blur: 0, color: nil) + for (row, bits) in landerBitmap.enumerated() { + for col in 0..<8 where (bits & (0x80 >> UInt8(col))) != 0 { + let rect = CGRect(x: CGFloat(col) * cell, y: CGFloat(row) * cell, width: cell, height: cell) + color.setFill() + UIBezierPath(roundedRect: rect.insetBy(dx: cell * 0.04, dy: cell * 0.04), cornerRadius: cell * 0.16).fill() + } + } + } + return SKTexture(image: image) + } +} diff --git a/Arcade85/Games/ZMercury/MercuryData.swift b/Arcade85/Games/ZMercury/MercuryData.swift new file mode 100644 index 0000000..edefd58 --- /dev/null +++ b/Arcade85/Games/ZMercury/MercuryData.swift @@ -0,0 +1,142 @@ +import Foundation + +/// Static data for ZMercury 0.34 (Patrick Davidson, 2004), transcribed from +/// the original sources: terrain tiles (`terrain.inc`), the looping level map +/// (`map0.inc`), the sine table (`sines.inc`) and every sprite (`images.asm`, +/// `sprites/`). Sprites in the original are stored as height + H mask rows + +/// H image rows and drawn `(bg | mask) ^ image`; the visible ink is the image +/// (XOR) half, which is what's transcribed here. +enum MercuryData { + + // MARK: - Sprites (all ≤ 8 px wide; bit 7 = leftmost pixel) + + struct Sprite { + let h: Int + let rows: [UInt8] + } + + enum Img: Hashable { + case player, bullet1, ebullet1, ebullet2 + case enemy1, enemy2, base, boss + case spin1, spin2, spin3, spin4, spin5 + case spint1, spint2, spint3, spint4 + case x1, x2, x3, x4, x5, x6, x7, x8 + } + + static let spinFrames: [Img] = [.spin1, .spin2, .spin3, .spin4, .spin5] + static let spintFrames: [Img] = [.spint1, .spint2, .spint3, .spint4] + static let explosionFrames: [Img] = [.x1, .x2, .x3, .x4, .x5, .x6, .x7, .x8] + + static let sprites: [Img: Sprite] = [ + .player: Sprite(h: 12, rows: [0xFF, 0xFE, 0xC0, 0xC0, 0xFE, 0xC3, + 0xC3, 0xFE, 0xC0, 0xC0, 0xFE, 0xFF]), + .bullet1: Sprite(h: 4, rows: [0x7E, 0xFF, 0xFF, 0x7E]), + .ebullet1: Sprite(h: 4, rows: [0x60, 0xF0, 0xF0, 0x60]), + .ebullet2: Sprite(h: 2, rows: [0xFF, 0xFF]), + .enemy1: Sprite(h: 8, rows: [0x1F, 0x07, 0x7F, 0xFF, 0xFF, 0x7F, 0x07, 0x1F]), + .enemy2: Sprite(h: 10, rows: [0xFF, 0x07, 0x0E, 0x1C, 0x38, 0x38, 0x1C, 0x0E, 0x07, 0xFF]), + // The base dome: mask half is used — its image half is just the core, + // and on-calc the dome shape comes from the mask carving the terrain. + .base: Sprite(h: 8, rows: [0x3C, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x3C]), + .boss: Sprite(h: 16, rows: [0x7F, 0xC1, 0xC1, 0x7F, 0x07, 0x0F, 0x7F, 0xFF, + 0xFF, 0x7F, 0x0F, 0x07, 0x7F, 0xC1, 0xC1, 0x7F]), + .spin1: Sprite(h: 8, rows: [0x81, 0x7E, 0x42, 0x42, 0x42, 0x42, 0x7E, 0x81]), + .spin2: Sprite(h: 8, rows: [0x20, 0x3C, 0x43, 0x42, 0x42, 0xC2, 0x3C, 0x04]), + .spin3: Sprite(h: 8, rows: [0x10, 0x3C, 0x42, 0x43, 0xC2, 0x42, 0x3C, 0x08]), + .spin4: Sprite(h: 8, rows: [0x08, 0x3C, 0x42, 0xC2, 0x43, 0x42, 0x3C, 0x10]), + .spin5: Sprite(h: 8, rows: [0x04, 0x3C, 0xC2, 0x42, 0x42, 0x43, 0x3C, 0x20]), + .spint1: Sprite(h: 8, rows: [0x20, 0x40, 0xB8, 0x24, 0x24, 0x1D, 0x02, 0x04]), + .spint2: Sprite(h: 8, rows: [0x3C, 0x10, 0x1C, 0x24, 0x24, 0x18, 0x08, 0x3C]), + .spint3: Sprite(h: 8, rows: [0x04, 0x02, 0x1D, 0x24, 0x24, 0xB8, 0x40, 0x20]), + .spint4: Sprite(h: 8, rows: [0x00, 0x00, 0x99, 0xA7, 0xE5, 0x9D, 0x00, 0x00]), + .x1: Sprite(h: 8, rows: [0b0000_1000, 0b0001_1100, 0b1011_1110, 0b0011_1111, + 0b0101_0110, 0b1111_1010, 0b0011_1000, 0b0001_0000]), + .x2: Sprite(h: 8, rows: [0b0011_0000, 0b0111_0010, 0b0100_1110, 0b1011_1110, + 0b0100_1111, 0b0011_1000, 0b0110_0111, 0b0001_1010]), + .x3: Sprite(h: 8, rows: [0b0011_0101, 0b1111_0011, 0b0100_1110, 0b1011_0101, + 0b0100_0101, 0b0011_1110, 0b1101_1010, 0b0011_0110]), + .x4: Sprite(h: 8, rows: [0b0011_0100, 0b1111_0011, 0b0100_1110, 0b1010_0011, + 0b1011_0101, 0b0100_0101, 0b0011_1110, 0b0101_1010]), + .x5: Sprite(h: 8, rows: [0b0010_0110, 0b0100_0001, 0b0010_0110, 0b0100_0101, + 0b0000_0101, 0b0100_0100, 0b0001_0010, 0b1001_1010]), + .x6: Sprite(h: 8, rows: [0b0001_1000, 0b0100_0010, 0b0010_0000, 0b0000_0001, + 0b0100_0100, 0b0010_0010, 0b1000_1010, 0b0010_0100]), + .x7: Sprite(h: 8, rows: [0b0000_1000, 0b0000_0001, 0b1100_0010, 0b0000_0000, + 0b0010_0000, 0b0100_0000, 0b0000_0001, 0b0011_0000]), + .x8: Sprite(h: 8, rows: [0b0000_0100, 0b0000_0000, 0b0000_0000, 0b0100_0000, + 0b0000_0000, 0b0000_0000, 0b0000_0001, 0b0010_0100]), + ] + + // MARK: - Terrain tiles (terrain.inc) + // + // Original polarity: bit set = open sky, bit clear = solid rock. Each tile + // is 8×8 (one byte per row). + + static let tiles: [[UInt8]] = [ + [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF], // 0 open + [0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE], // 1 slope + [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], // 2 solid + [0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF], // 3 slope + [0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01], // 4 slope + [0xFE, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x00], // 5 slope + [0x01, 0x83, 0xC7, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF], // 6 spike + [0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0xC7, 0x83, 0x01], // 7 spike + [0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x7C, 0xFE], // 8 notch + [0xFE, 0x7C, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00], // 9 notch + [0x00, 0x08, 0x40, 0x02, 0x00, 0x88, 0x20, 0x00], // 10 base pad + ] + + // MARK: - Level map (map0.inc) + // + // Rows 0…7 are tile indices (64 looping columns); row 8 is the enemy-wave + // trigger for each column (0 = none, 1…7 = entry routine). + + static let map: [[Int]] = [ + [0x01, 0x02, 0x03, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x00, 0x00, + 0x00, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x02, 0x02, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], + [0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x01, 0x02, 0x02, 0x03, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x02, 0x02, 0x02, 0x08, 0x02, 0x02, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x08, 0x0A, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x02, 0x0A, 0x03, 0x01, 0x08, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], + [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], + [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], + [Int](repeating: 0, count: 64), + [0x00, 0x00, 0x05, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], + [0x00, 0x05, 0x02, 0x02, 0x04, 0x05, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x05, 0x0A, 0x02, 0x09, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], + [0x05, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x05, 0x02, 0x02, 0x02, 0x02, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], + [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x04, 0x00, + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x07, 0x05, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04], + ] + + // MARK: - Sine table (sines.inc) — 128 entries, values 40…80 + + static let sines: [Int] = [ + 60, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 71, 72, 73, + 74, 74, 75, 76, 76, 77, 77, 78, 78, 78, 79, 79, 79, 79, 79, 79, + 80, 79, 79, 79, 79, 79, 79, 78, 78, 78, 77, 77, 76, 76, 75, 74, + 74, 73, 72, 71, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, + 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 48, 47, 46, + 45, 45, 44, 43, 43, 42, 42, 41, 41, 41, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 41, 41, 41, 42, 42, 43, 43, 44, 45, + 45, 46, 47, 48, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + ] +} diff --git a/Arcade85/Games/ZMercury/MercuryScene.swift b/Arcade85/Games/ZMercury/MercuryScene.swift new file mode 100644 index 0000000..26c1dfd --- /dev/null +++ b/Arcade85/Games/ZMercury/MercuryScene.swift @@ -0,0 +1,813 @@ +import SpriteKit +import UIKit + +/// HD remake of ZMercury. `MercurySim` is the faithful Z80 port; this scene +/// renders the scrolling terrain from prebuilt map-column textures, the +/// original sprites as neon pixel art, adds parallax stars, and drives the +/// ship with drag-anywhere touch + autofire. +final class MercuryScene: SKScene { + + typealias D = MercuryData + + // MARK: State + private enum GameState { case ready, playing, paused, gameOver } + private var state: GameState = .ready + + private var sim = MercurySim() + + // MARK: Timing + private var lastUpdate: TimeInterval = 0 + private var accumulator: TimeInterval = 0 + private var fireCooldown = 0 + private var lastHitHaptic: TimeInterval = 0 + + // MARK: Layout + private var unit: CGFloat = 3 // scene points per sim unit, horizontal + private var unitY: CGFloat = 3.9 // vertical POSITION/terrain scale + private var unitYSprite: CGFloat = 3.6 // vertical SPRITE scale (mild stretch) + private var fieldRect = CGRect.zero // visible window: 128 × 58 sim units (y 35…92) + private var topInset: CGFloat = 0 + + // MARK: Touch control + private var moveTouch: UITouch? + private var touchAnchor = CGPoint.zero + private var shipAnchor = CGPoint.zero + private var targetX = 42 + private var targetY = 60 + + // MARK: Nodes + private let worldCrop = SKCropNode() + private var playerNode = SKSpriteNode() + private var enemyNodes: [SKSpriteNode] = [] + private var pbNodes: [SKSpriteNode] = [] + private var ebNodes: [SKSpriteNode] = [] + private var textureCache: [String: SKTexture] = [:] + + // Terrain: one texture per map column, nodes keyed by spawn scroll. + private var columnTextures: [SKTexture] = [] + private var terrainNodes: [(node: SKSpriteNode, spawnScroll: Int)] = [] + + // HUD + private let shieldValue = SKLabelNode(fontNamed: "Menlo-Bold") + private let sectorValue = SKLabelNode(fontNamed: "Menlo-Bold") + private let scoreValue = SKLabelNode(fontNamed: "Menlo-Bold") + private let pauseButton = SKShapeNode(circleOfRadius: 16) + private let banner = SKLabelNode(fontNamed: "AvenirNext-Heavy") + + // Overlays + private let readyOverlay = SKNode() + private let pausedOverlay = SKNode() + private let gameOverOverlay = SKNode() + private let gameOverDetail = SKLabelNode(fontNamed: "Menlo-Bold") + private let gameOverRecord = SKLabelNode(fontNamed: "Menlo-Bold") + + private var builtSize: CGSize = .zero + #if DEBUG + private var demoFreeze = false + #endif + + // MARK: Tints + + static let terrainColor = UIColor(red: 0.95, green: 0.52, blue: 0.28, alpha: 1) + + static func tint(for img: D.Img) -> UIColor { + switch img { + case .player: return .white + case .bullet1: return Palette.mint + case .ebullet1, .ebullet2: return Palette.amber + case .enemy1: return Palette.mint + case .enemy2: return Palette.cyan + case .base: return UIColor(red: 1.0, green: 0.62, blue: 0.25, alpha: 1) + case .boss: return Palette.red + case .spin1, .spin2, .spin3, .spin4, .spin5: return Palette.violet + case .spint1, .spint2, .spint3, .spint4: + return UIColor(red: 1.0, green: 0.45, blue: 0.85, alpha: 1) + case .x1, .x2, .x3, .x4, .x5, .x6, .x7, .x8: return Palette.amber + } + } + + // MARK: - Lifecycle + + override func didMove(to view: SKView) { + anchorPoint = .zero + scaleMode = .resizeFill + layoutScene() + #if DEBUG + let env = ProcessInfo.processInfo.environment + if env["ARCADE_AUTOPLAY"] == "1" { startGame() } + if env["ARCADE_DEMO"] == "1" { + startGame() + sim.debugWarpToColumn(0) // canyon + first waves + for _ in 0..<175 { stepSimRaw() } + demoFreeze = true + renderFrame() + } + #endif + } + + override func didChangeSize(_ oldSize: CGSize) { + guard view != nil, size != builtSize, size.width > 0 else { return } + layoutScene() + } + + // MARK: - Textures + + /// Neon pixel texture for an 8-px-wide sprite (bit 7 = leftmost). + private func texture(for img: D.Img) -> SKTexture { + let key = "\(img)" + if let t = textureCache[key] { return t } + let sprite = D.sprites[img]! + let cell: CGFloat = 10 + let renderer = UIGraphicsImageRenderer(size: CGSize(width: 8 * cell, + height: CGFloat(sprite.h) * cell)) + let color = Self.tint(for: img) + let image = renderer.image { ctx in + let cg = ctx.cgContext + cg.setShadow(offset: .zero, blur: cell * 0.6, color: color.withAlphaComponent(0.85).cgColor) + for pass in 0..<2 { + if pass == 1 { cg.setShadow(offset: .zero, blur: 0, color: nil) } + for (row, bits) in sprite.rows.enumerated() { + for col in 0..<8 where (bits & UInt8(0x80 >> col)) != 0 { + let rect = CGRect(x: CGFloat(col) * cell, y: CGFloat(row) * cell, + width: cell, height: cell) + color.setFill() + UIBezierPath(roundedRect: rect.insetBy(dx: cell * 0.05, dy: cell * 0.05), + cornerRadius: cell * 0.18).fill() + } + } + } + } + let t = SKTexture(image: image) + textureCache[key] = t + return t + } + + /// One rock texture per map column (8 × 64 sim px): glowing rim pixels on + /// every edge facing open air, dark rock mass inside — cave walls with lit + /// edges instead of flat orange slabs. + private func buildColumnTextures() { + columnTextures = (0..<64).map { col in + // Solid grid for the column (bit clear = rock, per the inverted map). + var solid = [[Bool]](repeating: [Bool](repeating: false, count: 64), count: 8) + for tileRow in 0..<8 { + let tile = D.tiles[D.map[tileRow][col]] + for k in 0..<8 { + let bits = tile[k] + for px in 0..<8 where (bits & UInt8(0x80 >> px)) == 0 { + solid[px][tileRow * 8 + k] = true + } + } + } + // Out-of-column neighbours count as rock so column seams stay dark. + func isSolid(_ x: Int, _ y: Int) -> Bool { + guard y >= 0, y < 64 else { return true } + guard x >= 0, x < 8 else { return true } + return solid[x][y] + } + + let cell: CGFloat = 6 + let renderer = UIGraphicsImageRenderer(size: CGSize(width: 8 * cell, height: 64 * cell)) + let rim = Self.terrainColor + let rock = UIColor(red: 0.255, green: 0.130, blue: 0.075, alpha: 1) + let rockDeep = UIColor(red: 0.210, green: 0.105, blue: 0.065, alpha: 1) + let image = renderer.image { ctx in + let cg = ctx.cgContext + // pass 0: glow behind rim pixels; pass 1: crisp fills + cg.setShadow(offset: .zero, blur: cell * 1.1, + color: rim.withAlphaComponent(0.75).cgColor) + for pass in 0..<2 { + if pass == 1 { cg.setShadow(offset: .zero, blur: 0, color: nil) } + for px in 0..<8 { + for y in 0..<64 where solid[px][y] { + let isRim = !isSolid(px, y - 1) || !isSolid(px, y + 1) + || !isSolid(px - 1, y) || !isSolid(px + 1, y) + if pass == 0 { + guard isRim else { continue } + rim.setFill() + } else if isRim { + rim.setFill() + } else { + // checker the interior slightly for grain + ((px + y) % 2 == 0 ? rock : rockDeep).setFill() + } + cg.fill(CGRect(x: CGFloat(px) * cell, y: CGFloat(y) * cell, + width: cell, height: cell)) + } + } + } + } + return SKTexture(image: image) + } + } + + /// Far cave wall silhouettes: stalactites along the top, stalagmites along + /// the bottom. Pure parallax dressing behind the real terrain. + private func cavernTexture(width: CGFloat, height: CGFloat, seed: UInt64) -> SKTexture { + var rng = SeededGenerator(seed: seed) + let renderer = UIGraphicsImageRenderer(size: CGSize(width: width, height: height)) + let body = UIColor(red: 0.11, green: 0.075, blue: 0.065, alpha: 1) + let image = renderer.image { ctx in + let cg = ctx.cgContext + for top in [true, false] { + let path = CGMutablePath() + let baseY: CGFloat = top ? 0 : height + path.move(to: CGPoint(x: 0, y: baseY)) + var x: CGFloat = 0 + while x < width { + let step = CGFloat.random(in: 30...80, using: &rng) + let depth = CGFloat.random(in: height * 0.03...height * 0.16, using: &rng) + path.addLine(to: CGPoint(x: x + step * 0.5, + y: top ? depth : height - depth)) + x += step + path.addLine(to: CGPoint(x: x, y: baseY)) + } + path.addLine(to: CGPoint(x: width, y: baseY)) + path.closeSubpath() + cg.addPath(path) + body.setFill() + cg.fillPath() + } + } + return SKTexture(image: image) + } + + // MARK: - Layout + + private func layoutScene() { + builtSize = size + removeAllChildren() + textureCache.removeAll() + terrainNodes.removeAll() + backgroundColor = Palette.space1 + + let insets = view?.safeAreaInsets ?? .zero + topInset = insets.top + let bottomInset = insets.bottom + + let bg = SKSpriteNode(texture: SceneArt.verticalGradient(size: size, top: Palette.space0, bottom: Palette.space1)) + bg.anchorPoint = .zero + bg.zPosition = -10 + addChild(bg) + let stars = SceneArt.starfield(size: size, count: 60, seed: 0x2E4C) + stars.zPosition = -9 + addChild(stars) + let nebula = SceneArt.glowSprite(color: UIColor(red: 0.95, green: 0.5, blue: 0.3, alpha: 1), radius: 220) + nebula.position = CGPoint(x: size.width * 0.80, y: size.height * 0.72) + nebula.alpha = 0.12 + nebula.zPosition = -9.4 + addChild(nebula) + + // Field: 128 × 58 visible sim units (y 35…92), full-bleed width. + // Positions and terrain map with a 1.9× vertical stretch (the canyon + // passages open up on a tall phone); ship/enemy sprites keep a mild + // 1.35× arcade stretch. Sim geometry and collisions are untouched. + unit = size.width / 128 + unitY = unit * 1.9 + unitYSprite = unit * 1.35 + let fieldH = unitY * 58 + let hudBottom = size.height - topInset - 92 + fieldRect = CGRect(x: 0, y: hudBottom - fieldH, width: unit * 128, height: fieldH) + + worldCrop.removeAllChildren() + let mask = SKSpriteNode(color: .white, size: fieldRect.size) + mask.position = CGPoint(x: fieldRect.midX, y: fieldRect.midY) + worldCrop.maskNode = mask + worldCrop.zPosition = 0 + addChild(worldCrop) + + // Parallax inside the cave: drifting stars plus a slow far-wall + // silhouette band (stalactites above, stalagmites below). + for (speed, count, seed) in [(14.0, 22, 0xAA01), (26.0, 14, 0xAA02)] { + let strip = SKNode() + let w = fieldRect.width + for i in 0..<2 { + let layer = SceneArt.starfield(size: CGSize(width: w, height: fieldRect.height), + count: count, seed: UInt64(seed)) + layer.position = CGPoint(x: fieldRect.minX + CGFloat(i) * w, y: fieldRect.minY) + strip.addChild(layer) + } + strip.zPosition = 0.5 + strip.run(.repeatForever(.sequence([ + .moveBy(x: -w, y: 0, duration: Double(w) / speed / Double(unit)), + .moveBy(x: w, y: 0, duration: 0), + ]))) + worldCrop.addChild(strip) + } + do { + let strip = SKNode() + let w = fieldRect.width + let tex = cavernTexture(width: w, height: fieldRect.height, seed: 0xCA4E) + for i in 0..<2 { + let layer = SKSpriteNode(texture: tex) + layer.anchorPoint = .zero + layer.position = CGPoint(x: fieldRect.minX + CGFloat(i) * w, y: fieldRect.minY) + strip.addChild(layer) + } + strip.alpha = 0.5 + strip.zPosition = 0.7 + strip.run(.repeatForever(.sequence([ + .moveBy(x: -w, y: 0, duration: Double(w) / 8.0 / Double(unit)), + .moveBy(x: w, y: 0, duration: 0), + ]))) + worldCrop.addChild(strip) + } + + let vignette = SceneArt.vignette(size: size, alpha: 0.40) + vignette.position = CGPoint(x: size.width / 2, y: size.height / 2) + addChild(vignette) + + buildColumnTextures() + buildEntityNodes() + buildHUD(bottomInset: bottomInset) + buildReadyOverlay() + buildPausedOverlay() + buildGameOverOverlay() + + applyStateVisibility() + rebuildTerrainNodes() + renderFrame() + } + + private func buildEntityNodes() { + func makeNode() -> SKSpriteNode { + let n = SKSpriteNode() + n.isHidden = true + worldCrop.addChild(n) + return n + } + enemyNodes = (0..<12).map { _ in let n = makeNode(); n.zPosition = 4; return n } + pbNodes = (0..<13).map { _ in let n = makeNode(); n.zPosition = 3; return n } + ebNodes = (0..<12).map { _ in let n = makeNode(); n.zPosition = 3; return n } + lastEnemyImgs = [D.Img?](repeating: nil, count: 12) + playerNode = makeNode() + playerNode.zPosition = 5 + + playerTrail.removeFromParent() + playerTrail = SceneArt.thrustEmitter(color: Palette.cyan, angle: .pi, + speed: 140, birthRate: 0, scale: 0.22, lifetime: 0.30) + playerTrail.position = CGPoint(x: -13, y: -1) + playerTrail.zPosition = -1 + playerNode.addChild(playerTrail) + playerTrail.targetNode = worldCrop + } + + private var playerTrail = SKEmitterNode() + private var lastEnemyImgs: [D.Img?] = [] + + /// Sim → scene coordinates. The visible window is sprite-space x 8…135, + /// y 35…92 (y grows downward). + private func point(x: CGFloat, y: CGFloat, w: CGFloat, h: CGFloat) -> CGPoint { + CGPoint(x: fieldRect.minX + (x - CGFloat(MercurySim.visibleLeft) + w / 2) * unit, + y: fieldRect.maxY - (y - CGFloat(MercurySim.minY) + h / 2) * unitY) + } + + private func place(_ node: SKSpriteNode, img: D.Img, x: Int, y: Int) { + let sprite = D.sprites[img]! + node.texture = texture(for: img) + // Positions/terrain use the stretched map; sprites stay near-square, + // drawn slightly over their cell for presence (hitboxes are sim-side). + node.size = CGSize(width: 8 * unit * 1.12, height: CGFloat(sprite.h) * unitYSprite * 1.12) + node.position = point(x: CGFloat(x), y: CGFloat(y), w: 8, h: CGFloat(sprite.h)) + node.isHidden = false + } + + // MARK: - Terrain nodes + + private func rebuildTerrainNodes() { + for (node, _) in terrainNodes { node.removeFromParent() } + terrainNodes.removeAll() + } + + private func spawnTerrainColumn(mapColumn: Int) { + let node = SKSpriteNode(texture: columnTextures[mapColumn]) + node.size = CGSize(width: 8 * unit, height: 64 * unitY) + node.zPosition = 1 + worldCrop.addChild(node) + terrainNodes.append((node, sim.totalScroll)) + positionTerrainNode(terrainNodes.count - 1) + } + + private func positionTerrainNode(_ i: Int) { + let (node, spawnScroll) = terrainNodes[i] + // A fresh column occupies the staging band (sprite x 136…143) and + // scrolls left 1 px per tick from there. + let leftEdge = CGFloat(136 - (sim.totalScroll - spawnScroll)) + // Column spans sim y 32…95; centre it against the visible window. + node.position = point(x: leftEdge, y: CGFloat(MercurySim.terrainTop), w: 8, h: 64) + } + + private func updateTerrainNodes() { + var i = 0 + while i < terrainNodes.count { + let leftEdge = 136 - (sim.totalScroll - terrainNodes[i].spawnScroll) + if leftEdge < 0 { + terrainNodes[i].node.removeFromParent() + terrainNodes.remove(at: i) + } else { + positionTerrainNode(i) + i += 1 + } + } + } + + // MARK: - HUD + + private func buildHUD(bottomInset: CGFloat) { + let hudY = size.height - topInset - 26 + + addChild(caption("SHIELD", x: 74, y: hudY + 12, align: .left)) + shieldValue.fontSize = 17 + shieldValue.fontColor = Palette.mint + shieldValue.horizontalAlignmentMode = .left + shieldValue.verticalAlignmentMode = .center + shieldValue.position = CGPoint(x: 74, y: hudY - 8) + shieldValue.zPosition = 20 + addChild(shieldValue) + + addChild(caption("SECTOR", x: size.width / 2, y: hudY + 12, align: .center)) + sectorValue.fontSize = 17 + sectorValue.fontColor = .white + sectorValue.horizontalAlignmentMode = .center + sectorValue.verticalAlignmentMode = .center + sectorValue.position = CGPoint(x: size.width / 2, y: hudY - 8) + sectorValue.zPosition = 20 + addChild(sectorValue) + + addChild(caption("SCORE", x: size.width - 20, y: hudY + 12, align: .right)) + scoreValue.fontSize = 17 + scoreValue.fontColor = .white + scoreValue.horizontalAlignmentMode = .right + scoreValue.verticalAlignmentMode = .center + scoreValue.position = CGPoint(x: size.width - 20, y: hudY - 8) + scoreValue.zPosition = 20 + addChild(scoreValue) + + pauseButton.fillColor = UIColor(white: 1, alpha: 0.08) + pauseButton.strokeColor = UIColor(white: 1, alpha: 0.25) + pauseButton.lineWidth = 1 + pauseButton.position = CGPoint(x: fieldRect.maxX - 28, y: fieldRect.maxY - 24) + pauseButton.zPosition = 22 + pauseButton.removeAllChildren() + if let tex = SceneArt.symbolTexture("pause.fill", pointSize: 13, color: Palette.white70) { + let icon = SKSpriteNode(texture: tex) + icon.size = tex.size() + pauseButton.addChild(icon) + } + addChild(pauseButton) + + banner.fontSize = 22 + banner.fontColor = Palette.red + banner.horizontalAlignmentMode = .center + banner.verticalAlignmentMode = .center + banner.position = CGPoint(x: fieldRect.midX, y: fieldRect.midY + fieldRect.height * 0.22) + banner.zPosition = 24 + banner.alpha = 0 + addChild(banner) + + let hintY = bottomInset + (max(fieldRect.minY - bottomInset, 60)) * 0.35 + addChild(caption("DRAG ANYWHERE TO FLY — CANNON AUTO-FIRES", x: size.width / 2, + y: max(bottomInset + 16, hintY), align: .center)) + } + + private func caption(_ text: String, x: CGFloat, y: CGFloat, align: SKLabelHorizontalAlignmentMode) -> SKLabelNode { + let label = SKLabelNode(fontNamed: "Menlo-Bold") + label.text = text + label.fontSize = 10 + label.fontColor = Palette.white40 + label.horizontalAlignmentMode = align + label.verticalAlignmentMode = .center + label.position = CGPoint(x: x, y: y) + label.zPosition = 20 + return label + } + + // MARK: - Overlays + + private func bigLabel(_ text: String, fontNamed: String = "AvenirNext-Heavy", size fontSize: CGFloat, + color: UIColor, x: CGFloat, y: CGFloat, maxWidth: CGFloat? = nil) -> SKLabelNode { + let label = SKLabelNode(fontNamed: fontNamed) + label.text = text + label.fontSize = fontSize + label.fontColor = color + label.horizontalAlignmentMode = .center + label.verticalAlignmentMode = .center + label.position = CGPoint(x: x, y: y) + if let maxWidth { + label.preferredMaxLayoutWidth = maxWidth + label.numberOfLines = 0 + } + return label + } + + private func buildReadyOverlay() { + readyOverlay.removeAllChildren() + readyOverlay.zPosition = 40 + addChild(readyOverlay) + let dim = SKSpriteNode(color: UIColor(white: 0.02, alpha: 0.66), size: size) + dim.anchorPoint = .zero + readyOverlay.addChild(dim) + + let cx = size.width / 2 + let midY = size.height * 0.62 + readyOverlay.addChild(bigLabel("ZMERCURY", size: 36, color: .white, x: cx, y: midY + 64)) + readyOverlay.addChild(bigLabel("Skim the caves. Duck the fire. Survive the run.", + fontNamed: "AvenirNext-Medium", size: 14.5, + color: Palette.white70, x: cx, y: midY + 30)) + readyOverlay.addChild(bigLabel("Terrain touch drains shields fast — thread the gaps", + fontNamed: "AvenirNext-Medium", size: 13, + color: Palette.white40, x: cx, y: midY - 2, + maxWidth: size.width - 80)) + + let prompt = bigLabel("TAP TO LAUNCH", fontNamed: "Menlo-Bold", size: 16, color: Palette.mint, + x: cx, y: midY - 64) + prompt.run(.repeatForever(.sequence([.fadeAlpha(to: 0.35, duration: 0.7), .fadeAlpha(to: 1, duration: 0.7)]))) + readyOverlay.addChild(prompt) + } + + private func buildPausedOverlay() { + pausedOverlay.removeAllChildren() + pausedOverlay.zPosition = 40 + addChild(pausedOverlay) + let dim = SKSpriteNode(color: UIColor(white: 0.01, alpha: 0.80), size: size) + dim.anchorPoint = .zero + pausedOverlay.addChild(dim) + pausedOverlay.addChild(bigLabel("PAUSED", size: 30, color: .white, x: size.width / 2, y: size.height * 0.55)) + let hint = bigLabel("TAP TO RESUME", fontNamed: "Menlo-Bold", size: 15, color: Palette.mint, + x: size.width / 2, y: size.height * 0.55 - 44) + hint.run(.repeatForever(.sequence([.fadeAlpha(to: 0.35, duration: 0.7), .fadeAlpha(to: 1, duration: 0.7)]))) + pausedOverlay.addChild(hint) + } + + private func buildGameOverOverlay() { + gameOverOverlay.removeAllChildren() + gameOverOverlay.zPosition = 40 + addChild(gameOverOverlay) + let dim = SKSpriteNode(color: UIColor(white: 0.02, alpha: 0.72), size: size) + dim.anchorPoint = .zero + gameOverOverlay.addChild(dim) + let cx = size.width / 2 + let midY = size.height * 0.6 + gameOverOverlay.addChild(bigLabel("SHIELDS DOWN", size: 30, color: Palette.red, x: cx, y: midY + 36)) + gameOverDetail.fontSize = 15 + gameOverDetail.fontColor = .white + gameOverDetail.horizontalAlignmentMode = .center + gameOverDetail.position = CGPoint(x: cx, y: midY - 4) + gameOverOverlay.addChild(gameOverDetail) + gameOverRecord.fontSize = 14 + gameOverRecord.fontColor = Palette.amber + gameOverRecord.horizontalAlignmentMode = .center + gameOverRecord.position = CGPoint(x: cx, y: midY - 30) + gameOverOverlay.addChild(gameOverRecord) + let prompt = bigLabel("TAP TO FLY AGAIN", fontNamed: "Menlo-Bold", size: 16, color: Palette.mint, + x: cx, y: midY - 70) + prompt.run(.repeatForever(.sequence([.fadeAlpha(to: 0.35, duration: 0.7), .fadeAlpha(to: 1, duration: 0.7)]))) + gameOverOverlay.addChild(prompt) + } + + // MARK: - Game flow + + private func startGame() { + sim = MercurySim() + targetX = 42 + targetY = 60 + accumulator = 0 + fireCooldown = 0 + rebuildTerrainNodes() + state = .playing + applyStateVisibility() + renderFrame() + } + + private func applyStateVisibility() { + readyOverlay.isHidden = state != .ready + pausedOverlay.isHidden = state != .paused + gameOverOverlay.isHidden = state != .gameOver + pauseButton.isHidden = state != .playing + } + + private func endGame() { + // The ship goes out with a proper blast. + addChild(SceneArt.flash(size: size, color: Palette.amber, peak: 0.22, duration: 0.28)) + let fire = SceneArt.sparkBurst(color: Palette.amber, count: 30, speed: 220, lifetime: 0.7, scale: 0.26) + fire.position = playerNode.position + fire.zPosition = 7 + worldCrop.addChild(fire) + let core = SceneArt.glowSprite(color: Palette.red, radius: 46) + core.position = playerNode.position + core.zPosition = 6.5 + core.run(.sequence([.group([.scale(to: 2.4, duration: 0.3), .fadeOut(withDuration: 0.34)]), + .removeFromParent()])) + worldCrop.addChild(core) + worldCrop.run(SceneArt.shake(intensity: 10, duration: 0.45)) + + let record = HighScoreStore.shared.submit(id: "zmercury", score: sim.score) + gameOverDetail.text = "SECTOR \(sim.totalScroll / 512 + 1) · SCORE \(sim.score)" + gameOverRecord.text = record ? "★ NEW BEST ★" : "BEST \(HighScoreStore.shared.best("zmercury"))" + state = .gameOver + applyStateVisibility() + Haptics.error() + } + + // MARK: - Game loop + + override func update(_ currentTime: TimeInterval) { + if lastUpdate == 0 { lastUpdate = currentTime } + var dt = currentTime - lastUpdate + lastUpdate = currentTime + if dt > 0.25 { dt = 0.25 } + guard state == .playing else { return } + #if DEBUG + if demoFreeze { return } + #endif + + let interval = 1.0 / MercurySim.fps + accumulator += dt + var steps = 0 + while accumulator >= interval, steps < 5 { + accumulator -= interval + steps += 1 + stepSim(currentTime) + if state != .playing { break } + } + renderFrame() + } + + /// Advances the sim + terrain node bookkeeping without effects (for demos). + private func stepSimRaw() { + var input = MercurySim.Input() + if fireCooldown > 0 { fireCooldown -= 1 } + if fireCooldown == 0 { input.fire = true; fireCooldown = 6 } + sim.tick(input) + for event in sim.events { + switch event { + case .columnDrawn(let col): spawnTerrainColumn(mapColumn: col) + case .terrainCleared: rebuildTerrainNodes() + default: break + } + } + updateTerrainNodes() + } + + private func stepSim(_ now: TimeInterval) { + var input = MercurySim.Input() + let dx = targetX - sim.playerX + let dy = targetY - sim.playerY + if dx != 0 { input.dx = dx > 0 ? 1 : -1 } + if dy != 0 { input.dy = dy > 0 ? 1 : -1 } + if fireCooldown > 0 { fireCooldown -= 1 } + if fireCooldown == 0 { + input.fire = true + fireCooldown = 6 // ~5 shots/sec at 28.6 fps + } + sim.tick(input) + + for event in sim.events { + switch event { + case .columnDrawn(let col): + spawnTerrainColumn(mapColumn: col) + case .terrainCleared: + rebuildTerrainNodes() + case .waveStarted(let type): + if type == 7 { showBanner("WARSHIP CONTACT") } + case .enemyKilled: + Haptics.impact(.light, intensity: 0.5) + case .playerHit: + // Terrain scrape can hit 4× a frame — throttle the buzz. + if now - lastHitHaptic > 0.12 { + lastHitHaptic = now + Haptics.impact(.medium, intensity: 0.7) + let sparks = SceneArt.sparkBurst(color: Palette.amber, count: 8, + speed: 90, lifetime: 0.35, scale: 0.15) + sparks.position = playerNode.position + sparks.zPosition = 6 + worldCrop.addChild(sparks) + worldCrop.run(SceneArt.shake(intensity: 4, duration: 0.18)) + } + flashPlayer() + case .gameOver: + endGame() + } + } + updateTerrainNodes() + } + + private func showBanner(_ text: String) { + banner.removeAllActions() + banner.text = text + banner.alpha = 0 + banner.run(.sequence([ + .fadeIn(withDuration: 0.2), + .wait(forDuration: 1.2), + .fadeOut(withDuration: 0.5), + ])) + Haptics.warning() + } + + private func flashPlayer() { + playerNode.removeAction(forKey: "hitflash") + playerNode.run(.sequence([ + .colorize(with: .red, colorBlendFactor: 0.8, duration: 0.05), + .wait(forDuration: 0.06), + .colorize(withColorBlendFactor: 0, duration: 0.12), + ]), withKey: "hitflash") + } + + // MARK: - Rendering + + private func renderFrame() { + place(playerNode, img: .player, x: sim.playerX, y: sim.playerY) + playerNode.isHidden = state == .gameOver + playerTrail.particleBirthRate = state == .playing ? 90 : 0 + let bank = max(-1, min(1, CGFloat(targetY - sim.playerY) / 5)) + playerNode.zRotation = playerNode.zRotation * 0.8 + (bank * -0.09) * 0.2 + + for (i, node) in enemyNodes.enumerated() { + let e = sim.enemies[i] + if e.type != 0 { + place(node, img: e.img, x: e.x, y: e.y) + // First explosion frame → pop sparks at the kill site. + if e.img == .x1, lastEnemyImgs[i] != .x1, lastEnemyImgs[i] != nil { + let sparks = SceneArt.sparkBurst(color: Palette.amber, count: 12, + speed: 130, lifetime: 0.45, scale: 0.18) + sparks.position = node.position + sparks.zPosition = 6 + worldCrop.addChild(sparks) + } + lastEnemyImgs[i] = e.img + } else { + node.isHidden = true + lastEnemyImgs[i] = nil + } + } + + for (i, node) in pbNodes.enumerated() { + let b = sim.playerBullets[i] + if b.active { place(node, img: .bullet1, x: b.x, y: b.y) } + else { node.isHidden = true } + } + for (i, node) in ebNodes.enumerated() { + let b = sim.enemyBullets[i] + if b.active { place(node, img: b.img, x: b.x, y: b.y) } + else { node.isHidden = true } + } + + let s = max(0, sim.shield) + shieldValue.text = "\(s)" + shieldValue.fontColor = s > 50 ? Palette.mint : (s > 20 ? Palette.amber : Palette.red) + sectorValue.text = "\(sim.totalScroll / 512 + 1)" + scoreValue.text = "\(sim.score)" + } + + // MARK: - Touch handling + + override func touchesBegan(_ touches: Set, with event: UIEvent?) { + for touch in touches { + let p = touch.location(in: self) + switch state { + case .ready: + Haptics.selection() + startGame() + case .paused: + Haptics.selection() + state = .playing + applyStateVisibility() + case .gameOver: + Haptics.selection() + state = .ready + applyStateVisibility() + case .playing: + let dp = hypot(p.x - pauseButton.position.x, p.y - pauseButton.position.y) + if dp <= 30 { + Haptics.selection() + state = .paused + moveTouch = nil + applyStateVisibility() + continue + } + moveTouch = touch + touchAnchor = p + shipAnchor = CGPoint(x: CGFloat(sim.playerX), y: CGFloat(sim.playerY)) + targetX = sim.playerX + targetY = sim.playerY + } + } + } + + override func touchesMoved(_ touches: Set, with event: UIEvent?) { + guard state == .playing, let moveTouch, touches.contains(moveTouch) else { return } + let p = moveTouch.location(in: self) + // Finger travel maps ~1.35× on-screen ship travel (per-axis). + targetX = Int(shipAnchor.x + (p.x - touchAnchor.x) * 1.35 / unit) + targetY = Int(shipAnchor.y - (p.y - touchAnchor.y) * 1.35 / unitY) + targetX = min(max(targetX, 8), 56) + targetY = min(max(targetY, 32), 84) + } + + override func touchesEnded(_ touches: Set, with event: UIEvent?) { + if let moveTouch, touches.contains(moveTouch) { self.moveTouch = nil } + } + + override func touchesCancelled(_ touches: Set, with event: UIEvent?) { + if let moveTouch, touches.contains(moveTouch) { self.moveTouch = nil } + } +} diff --git a/Arcade85/Games/ZMercury/MercurySim.swift b/Arcade85/Games/ZMercury/MercurySim.swift new file mode 100644 index 0000000..88c5c05 --- /dev/null +++ b/Arcade85/Games/ZMercury/MercurySim.swift @@ -0,0 +1,451 @@ +import Foundation + +/// A faithful port of ZMercury 0.34 (Patrick Davidson, 2004). Reproduces the +/// original's main-loop order, terrain scroller, wave table, enemy behaviors, +/// BCD scoring and collision rules. The game is fully deterministic — the +/// original uses no randomness at all; waves come from the looping map and +/// fire cadence from per-slot stagger. +/// +/// Field: 136 sim units wide (128 visible + an 8-px staging column at the +/// right where new terrain is drawn), y grows downward with the visible +/// window at y 35…92. The player roams x 8…56, y 32…84 with an 8×12 hitbox. +/// Terrain scrolls left 1 px/frame; a new 8-px tile column enters every 8 +/// frames from a 64-column looping map. Frame rate: the original waits 7 +/// ticks of the ~200 Hz interrupt per frame ≈ 28.6 fps. +struct MercurySim { + typealias D = MercuryData + + static let fps = 200.0 / 7.0 + static let fieldWidth = 136 + static let visibleLeft = 8 // screen shows sprite-space x 8…135 + static let visibleWidth = 128 + static let minY = 35 // first visible row + static let maxY = 93 // bullets/sprites clipped at y ≥ 93 + static let visibleHeight = 58 + static let terrainTop = 32 // terrain buffer covers y 32…95 + + // MARK: - Entities + + struct Enemy { + var type = 0 // 0 none · 1 exploding · 4 basic · 7 phoenix + // 10 spin-sine · 13 base turret · 16 spin-T · 19 boss + var x = 0 + var w = 0 + var y = 0 + var h = 0 + var dmg = 0 // hit points; enemy survives at exactly 0 + var img = D.Img.enemy1 + var counter = 0 + var phase = 0 + var anim = 0 // animation/explosion frame index + } + + struct PlayerBullet { var active = false; var x = 0; var y = 0 } // 8×4, dmg 3 + struct EnemyBullet { + var active = false + var x = 0 + var y = 0 + var vy = 0 // -1 / 0 / +1, aimed at spawn + var img = D.Img.ebullet1 + } // 4×4, dmg 5, moves left 4 px/frame + + enum Event: Equatable { + case columnDrawn(mapColumn: Int) + case terrainCleared + case waveStarted(Int) + case enemyKilled(x: Int, y: Int) + case playerHit + case gameOver + } + + struct Input { + var dx = 0 + var dy = 0 + var fire = false // one shot per press + init(dx: Int = 0, dy: Int = 0, fire: Bool = false) { + self.dx = dx; self.dy = dy; self.fire = fire + } + } + + // MARK: - State + + private(set) var enemies = [Enemy](repeating: Enemy(), count: 12) + private(set) var playerBullets = [PlayerBullet](repeating: PlayerBullet(), count: 13) + private(set) var enemyBullets = [EnemyBullet](repeating: EnemyBullet(), count: 12) + + private(set) var playerX = 42 + private(set) var playerY = 60 + private(set) var shield = 100 // BCD "0100" in the original + private(set) var score = 0 // 6-digit BCD, capped + private(set) var gameTimer = 0 + private(set) var gameStatus = 0 // 0 scroll · 1 open space until wave cleared + private(set) var enemiesLeft = 0 // last frame's live count (incl. explosions) + private(set) var over = false + private(set) var events: [Event] = [] + + // Terrain: 64 rows × 17 bytes, original polarity (bit set = open sky). + // Byte 16 (px 128…135) is the off-screen staging column. + private(set) var terrain = [[UInt8]](repeating: [UInt8](repeating: 0xFF, count: 17), count: 64) + private(set) var terrainCount = 3 // bit phase within the current column + private(set) var terrainX = -1 // map column last entered (wraps 0…63) + private(set) var totalScroll = 0 // total pixels scrolled (for renderers) + + init() {} + + /// True if the terrain pixel at sprite-space (x, y) is solid rock. The + /// original offsets the terrain buffer one byte against sprite space + /// (`add hl,bc / dec hl`): terrain byte 0 covers sprite x 8…15, and the + /// staging column (byte 16) sits at sprite x 136…143, off the right edge. + func solid(x: Int, y: Int) -> Bool { + let row = y - Self.terrainTop + let byte = (x >> 3) - 1 + guard row >= 0, row < 64, byte >= 0, byte < 17 else { return false } + return terrain[row][byte] & UInt8(0x80 >> (x & 7)) == 0 + } + + // MARK: - Main loop (original call order) + + mutating func tick(_ input: Input) { + guard !over else { return } + events.removeAll(keepingCapacity: true) + + gameTimer &+= 1 + scrollTerrain() + movePlayer(input) + handlePlayerBullets() + processEnemies() + processEnemyBullets() + hitEnemy() + + if shield < 0 { + over = true + events.append(.gameOver) + } + } + + // MARK: - Terrain scroller + + private mutating func scrollTerrain() { + for r in 0..<64 { + var row = terrain[r] + for i in 0..<16 { row[i] = (row[i] << 1) | (row[i + 1] >> 7) } + row[16] = (row[16] << 1) | 1 + terrain[r] = row + } + totalScroll += 1 + + terrainCount += 1 + guard terrainCount == 8 else { return } + terrainCount = 0 + + if gameStatus != 0 { + if enemiesLeft != 0 { + // Wave gate: wipe the terrain and hold the map position. + for r in 0..<64 { terrain[r] = [UInt8](repeating: 0xFF, count: 17) } + events.append(.terrainCleared) + return + } + gameStatus = 0 + } + + terrainX = (terrainX + 1) % 64 + + for tileRow in 0..<8 { + let tile = D.tiles[D.map[tileRow][terrainX]] + for k in 0..<8 { terrain[tileRow * 8 + k][16] = tile[k] } + } + events.append(.columnDrawn(mapColumn: terrainX)) + + let wave = D.map[8][terrainX] + if wave != 0 { + events.append(.waveStarted(wave)) + enemyEntry(wave) + } + } + + // MARK: - Wave entry (entry.asm) + + private mutating func enemyEntry(_ wave: Int) { + func install(count: Int, xStep: Int, yStep: Int, phaseStep: Int, _ template: Enemy) { + var t = template + for _ in 0.. 0, playerY + 1 != 96 - 12 + 1 { playerY += 1 } + if input.dx < 0, playerX - 1 != 7 { playerX -= 1 } + if input.dx > 0, playerX + 1 != 57 { playerX += 1 } + if input.dy < 0, playerY - 1 != 31 { playerY -= 1 } + + if input.fire { playerShoot() } + + // Terrain collision: each of the ship's four corners drains 1 shield. + for (cx, cy) in [(playerX, playerY), (playerX, playerY + 11), + (playerX + 7, playerY), (playerX + 7, playerY + 11)] + where solid(x: cx, y: cy) { + hitPlayer() + } + } + + private mutating func hitPlayer() { + shield -= 1 + events.append(.playerHit) + } + + private mutating func playerShoot() { + guard let slot = playerBullets.firstIndex(where: { !$0.active }) else { return } + playerBullets[slot] = PlayerBullet(active: true, x: playerX + 2, y: playerY + 4) + } + + private mutating func handlePlayerBullets() { + for b in 0..<13 where playerBullets[b].active { + if playerBullets[b].x + 4 >= 136 { + playerBullets[b].active = false + } else { + playerBullets[b].x += 4 + } + } + } + + // MARK: - Enemies (enemies.asm) + + private mutating func processEnemies() { + enemiesLeft = 0 + for i in 0..<12 { + guard enemies[i].type != 0 else { continue } + enemiesLeft += 1 + processEnemy(i) + guard enemies[i].type > 1 else { continue } + if aabb(enemies[i].x, enemies[i].w, enemies[i].y, enemies[i].h, + playerX, 8, playerY, 12) { + hitPlayer() + damageEnemy(i, 1) + } + } + } + + private mutating func processEnemy(_ i: Int) { + switch enemies[i].type { + case 1: // exploding: advance every other frame + if gameTimer & 1 == 0 { + enemies[i].anim += 1 + if enemies[i].anim >= 8 { + enemies[i].type = 0 + addScore(20) + } else { + enemies[i].img = D.explosionFrames[enemies[i].anim] + } + } + case 4: // basic: left 1.5 px/frame, straight shots + guard moveLeftOneAndAHalf(i) else { return } + if fireDue(i, mask: 63) { + fireBullet(from: i, yOff: 2, img: .ebullet1, aimed: false) + } + case 7: // phoenix: left 1.5, aimed shots + guard moveLeftOneAndAHalf(i) else { return } + if fireDue(i, mask: 63) { + fireBullet(from: i, yOff: 4, img: .ebullet2, aimed: true) + } + case 10: // spin-sine: approach then bob on the sine + enemies[i].anim = (enemies[i].anim + 1) % 5 + enemies[i].img = D.spinFrames[enemies[i].anim] + if enemies[i].counter != 0 { + enemies[i].counter -= 1 + enemies[i].x -= 1 + } + enemies[i].phase += 1 + enemies[i].y = D.sines[enemies[i].phase & 127] + if fireDue(i, mask: 63) { + fireBullet(from: i, yOff: 2, img: .ebullet1, aimed: true) + } + case 13: // base turret: rides the terrain + enemies[i].x -= 1 + if enemies[i].x == 0 { enemies[i].type = 0; return } + if fireDue(i, mask: 31) { + fireBullet(from: i, yOff: 2, img: .ebullet1, aimed: true) + } + case 16: // spin-T: fast sine crosser + enemies[i].anim = (enemies[i].anim + 1) % 4 + enemies[i].img = D.spintFrames[enemies[i].anim] + enemies[i].phase += 3 + enemies[i].x -= 1 + if enemies[i].x == 0 { enemies[i].type = 0; return } + enemies[i].y = D.sines[enemies[i].phase & 127] / 2 + 30 + if fireDue(i, mask: 63) { + fireBullet(from: i, yOff: 2, img: .ebullet1, aimed: true) + } + case 19: // boss: approach x=128, triangle sweep + if enemies[i].x != 128 { enemies[i].x -= 1 } + var a = gameTimer & 255 + if a & 32 != 0 { a = ~a & 255 } + enemies[i].y = (a & 31) + 40 + enemies[i].counter += 1 + if enemies[i].counter == 0 { + enemies[i].counter = -44 + fireBullet(from: i, yOff: 1, img: .ebullet2, aimed: false) + fireBullet(from: i, yOff: 13, img: .ebullet2, aimed: false) + } + default: + break + } + } + + /// Left 1 px/frame plus an extra on odd frames; false once despawned. + private mutating func moveLeftOneAndAHalf(_ i: Int) -> Bool { + enemies[i].x -= 1 + if enemies[i].x == 0 { enemies[i].type = 0; return false } + if gameTimer & 1 == 1 { + enemies[i].x -= 1 + if enemies[i].x == 0 { enemies[i].type = 0; return false } + } + return true + } + + /// The original staggers fire by the enemy slot's memory address; slots + /// are 10 bytes apart, so (timer + slot*10) keeps the same relative phases. + private func fireDue(_ i: Int, mask: Int) -> Bool { + (gameTimer + i * 10) & mask == 0 + } + + private mutating func damageEnemy(_ i: Int, _ amount: Int) { + enemies[i].dmg -= amount + guard enemies[i].dmg < 0 else { return } // survives at exactly 0 + enemies[i].type = 1 + enemies[i].img = .x1 + enemies[i].anim = 0 + addScore(1) + events.append(.enemyKilled(x: enemies[i].x, y: enemies[i].y)) + } + + private mutating func addScore(_ n: Int) { + score = min(999999, score + n) + } + + // MARK: - Enemy fire (eshoot.asm) + + private mutating func fireBullet(from i: Int, yOff: Int, img: D.Img, aimed: Bool) { + guard let slot = enemyBullets.firstIndex(where: { !$0.active }) else { return } + let bx = enemies[i].x + let by = enemies[i].y + yOff + var vy = 0 + if aimed { + let dy = by - playerY - 5 + let dx = bx - playerX + if dx >= 0 { // only aim while right of the player + let q = dx >> 2 + if dy < 0 { + if q + dy < 0 { vy = 1 } // player far below: angle down + } else if q < dy { + vy = -1 // player far above: angle up + } + } + } + enemyBullets[slot] = EnemyBullet(active: true, x: bx, y: by, vy: vy, img: img) + } + + // MARK: - Enemy bullets (ebullets.asm) + + private mutating func processEnemyBullets() { + for b in 0..<12 where enemyBullets[b].active { + if enemyBullets[b].x <= 4 { // reached the left edge + enemyBullets[b].active = false + continue + } + enemyBullets[b].x -= 4 + enemyBullets[b].y += enemyBullets[b].vy + let y = enemyBullets[b].y + if y < Self.minY - 10 || y >= Self.maxY { + enemyBullets[b].active = false + continue + } + if aabb(enemyBullets[b].x, 4, y, 4, playerX, 8, playerY, 12) { + enemyBullets[b].active = false + for _ in 0..<5 { hitPlayer() } // dmg 5, applied per point + } + } + } + + // MARK: - Player bullets vs enemies (hitenemy.asm) + + private mutating func hitEnemy() { + for b in 0..<13 where playerBullets[b].active { + let bx = playerBullets[b].x + let by = playerBullets[b].y + for i in 0..<12 where enemies[i].type >= 2 { + if aabb(enemies[i].x, enemies[i].w, enemies[i].y, enemies[i].h, bx, 8, by, 4) { + playerBullets[b].active = false + damageEnemy(i, 3) + } + // No break: one bullet can damage several overlapping enemies. + } + } + } + + /// The original's exclusive AABB overlap test (collide.asm). + private func aabb(_ x1: Int, _ w1: Int, _ y1: Int, _ h1: Int, + _ x2: Int, _ w2: Int, _ y2: Int, _ h2: Int) -> Bool { + x1 - x2 < w2 && x2 - x1 < w1 && y1 - y2 < h2 && y2 - y1 < h1 + } + + #if DEBUG + mutating func debugSetShield(_ n: Int) { shield = n } + mutating func debugPlacePlayer(x: Int, y: Int) { playerX = x; playerY = y } + mutating func debugSetScore(_ n: Int) { score = n } + /// Position the map so column `col` is the next one drawn (8 ticks away). + mutating func debugWarpToColumn(_ col: Int) { + terrainX = (col + 63) % 64 + terrainCount = 7 + } + mutating func debugSpawnEnemy(_ e: Enemy, slot: Int) { enemies[slot] = e } + mutating func debugClearEnemies() { + enemies = [Enemy](repeating: Enemy(), count: 12) + enemiesLeft = 0 + } + #endif +} diff --git a/Arcade85/Games/ZTetris/TetrisScene.swift b/Arcade85/Games/ZTetris/TetrisScene.swift new file mode 100644 index 0000000..3b2b4cd --- /dev/null +++ b/Arcade85/Games/ZTetris/TetrisScene.swift @@ -0,0 +1,898 @@ +import SpriteKit +import UIKit + +/// HD remake of ZTetris. `TetrisSim` is the faithful ASM port; this scene draws +/// the 10×16 well in crisp neon, adds the original's per-level background +/// patterns, and drives play with touch buttons (DAS auto-repeat on the move +/// keys, held soft drop, tap hard drop / rotates). +final class TetrisScene: SKScene { + + // MARK: State + private enum GameState { case ready, playing, paused, gameOver } + private var state: GameState = .ready + + private var sim = TetrisSim() + private var chosenLevel = 0 // 0…9 + private var chosenHigh = 0 // 0…5 + + // MARK: Timing + private var lastUpdate: TimeInterval = 0 + private var gravityNext: TimeInterval = 0 + + // DAS (delayed auto-shift) for held ◄/►, and held soft drop. + private let dasDelay: TimeInterval = 0.167 + private let dasRepeat: TimeInterval = 0.050 + private let softRepeat: TimeInterval = 0.050 + private var dasDirection = 0 // -1 left, +1 right, 0 none + private var dasNext: TimeInterval = 0 + private var softHeld = false + private var softNext: TimeInterval = 0 + + // MARK: Layout + private var cellSize: CGFloat = 30 + private var boardOrigin = CGPoint.zero // bottom-left of the visible well + private var topInset: CGFloat = 0 + private var controlBarHeight: CGFloat = 190 + private var boardFrameRect = CGRect.zero + + // MARK: Nodes + private var cellSprites: [[SKSpriteNode]] = [] // [row(visible, 0=bottom)][col] + private var pieceSprites: [SKSpriteNode] = [] + private var ghostSprites: [SKSpriteNode] = [] + private var nextSprites: [SKSpriteNode] = [] + private var blockTexture: SKTexture? + private var patternStrips: [SKSpriteNode] = [] + private var appliedPattern = -1 + + // HUD + private let scoreValue = SKLabelNode(fontNamed: "Menlo-Bold") + private let levelValue = SKLabelNode(fontNamed: "Menlo-Bold") + private let linesValue = SKLabelNode(fontNamed: "Menlo-Bold") + private let pauseButton = SKShapeNode(circleOfRadius: 16) + + // Controls + private let btnLeft = ControlButton(symbol: "arrowtriangle.left.fill") + private let btnRight = ControlButton(symbol: "arrowtriangle.right.fill") + private let btnHard = ControlButton(symbol: "arrow.down.to.line") + private let btnSoft = ControlButton(symbol: "chevron.down") + private let btnCW = ControlButton(symbol: "arrow.clockwise") + private let btnCCW = ControlButton(symbol: "arrow.counterclockwise") + private var activeTouches = Set() + private var lastLeft = false, lastRight = false, lastSoft = false + private var lastHard = false, lastCW = false, lastCCW = false + + // Overlays + private let readyOverlay = SKNode() + private let pausedOverlay = SKNode() + private let gameOverOverlay = SKNode() + private let levelValueLabel = SKLabelNode(fontNamed: "Menlo-Bold") + private let highValueLabel = SKLabelNode(fontNamed: "Menlo-Bold") + private var stepperRects: [String: CGRect] = [:] + private let gameOverDetail = SKLabelNode(fontNamed: "Menlo-Bold") + private let gameOverRecord = SKLabelNode(fontNamed: "Menlo-Bold") + + private var builtSize: CGSize = .zero + #if DEBUG + private var demoFreeze = false + #endif + + // Piece palette (J, L, O, T, S, Z, I) + trash gray. HD modernization: the + // original well was monochrome; colors follow the familiar convention. + static let pieceColors: [UIColor] = [ + UIColor(red: 0.36, green: 0.55, blue: 1.00, alpha: 1), // J blue + UIColor(red: 1.00, green: 0.62, blue: 0.25, alpha: 1), // L orange + UIColor(red: 0.96, green: 0.82, blue: 0.25, alpha: 1), // O yellow + UIColor(red: 0.71, green: 0.50, blue: 1.00, alpha: 1), // T purple + UIColor(red: 0.42, green: 0.94, blue: 0.60, alpha: 1), // S green + UIColor(red: 1.00, green: 0.35, blue: 0.40, alpha: 1), // Z red + UIColor(red: 0.36, green: 0.85, blue: 1.00, alpha: 1), // I cyan + UIColor(white: 0.62, alpha: 1), // trash + ] + + /// The original's 16 per-level 8×8 background patterns (`Pattern` table in + /// ZTETRIS.ASM), used here to texture the side rails beside the well. + static let levelPatterns: [[UInt8]] = [ + [0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55], + [0x88, 0xFF, 0x22, 0xFF, 0x88, 0xFF, 0x22, 0xFF], + [0xFF, 0x99, 0x99, 0xFF, 0xFF, 0x99, 0x99, 0xFF], + [0x50, 0xD7, 0x14, 0xF7, 0x00, 0xF7, 0x14, 0xD7], + [0xEA, 0xAA, 0xAE, 0x00, 0x57, 0x55, 0x75, 0x00], + [0xFE, 0xAA, 0xAA, 0xAA, 0x28, 0xAA, 0xFE, 0x00], + [0x55, 0x55, 0xAA, 0xAA, 0x55, 0x55, 0xAA, 0xAA], + [0x80, 0xFE, 0x02, 0xFB, 0x08, 0xEF, 0x20, 0xBF], + [0xEE, 0xEE, 0xEE, 0x00, 0x77, 0x77, 0x77, 0x00], + [0x66, 0xCC, 0x99, 0x33, 0x66, 0xCC, 0x99, 0x33], + [0xCC, 0x33, 0xCC, 0x33, 0xCC, 0x33, 0xCC, 0x33], + [0xFE, 0x82, 0xBA, 0xAA, 0xBA, 0x82, 0xFE, 0x00], + [0xCC, 0xCC, 0x33, 0x33, 0xCC, 0xCC, 0x33, 0x33], + [0xFF, 0xAA, 0xFF, 0xAA, 0xFF, 0xAA, 0xFF, 0xAA], + [0x7C, 0xFE, 0x7C, 0x00, 0x7C, 0xFE, 0x7C, 0x00], + [0xFF, 0xEF, 0x47, 0x12, 0xB8, 0xFD, 0xFF, 0xFF], + ] + + // MARK: - Lifecycle + + override func didMove(to view: SKView) { + anchorPoint = .zero + scaleMode = .resizeFill + layoutScene() + #if DEBUG + let env = ProcessInfo.processInfo.environment + if env["ARCADE_AUTOPLAY"] == "1" { startFromReady() } + if env["ARCADE_DEMO"] == "1" { + chosenLevel = 3 + startFromReady() + buildDemoStack() + demoFreeze = true + refreshBoard() + refreshPiece() + updateHUD() + } + #endif + } + + override func didChangeSize(_ oldSize: CGSize) { + guard view != nil, size != builtSize, size.width > 0 else { return } + layoutScene() + } + + // MARK: - Layout + + private func layoutScene() { + builtSize = size + removeAllChildren() + backgroundColor = Palette.space1 + + let insets = view?.safeAreaInsets ?? .zero + topInset = insets.top + let bottomInset = insets.bottom + + let bg = SKSpriteNode(texture: SceneArt.verticalGradient(size: size, top: Palette.space0, bottom: Palette.space1)) + bg.anchorPoint = .zero + bg.zPosition = -10 + addChild(bg) + let stars = SceneArt.starfield(size: size, count: 60, seed: 0x7E7215) + stars.zPosition = -9 + addChild(stars) + + controlBarHeight = max(bottomInset + 172, size.height * 0.235) + let hudHeight: CGFloat = 64 + let boardTop = size.height - topInset - hudHeight + let boardBottom = controlBarHeight + 12 + let availableH = boardTop - boardBottom + let availableW = size.width - 24 + cellSize = min(availableH / CGFloat(TetrisSim.visibleRows), availableW / CGFloat(TetrisSim.cols)) + let boardW = cellSize * CGFloat(TetrisSim.cols) + let boardH = cellSize * CGFloat(TetrisSim.visibleRows) + boardOrigin = CGPoint(x: (size.width - boardW) / 2, y: boardBottom + (availableH - boardH) / 2) + boardFrameRect = CGRect(x: boardOrigin.x, y: boardOrigin.y, width: boardW, height: boardH) + + // Frame + let frame = SKShapeNode(rect: boardFrameRect.insetBy(dx: -5, dy: -5), cornerRadius: 12) + frame.strokeColor = Palette.mint.withAlphaComponent(0.30) + frame.lineWidth = 1.5 + frame.glowWidth = 1 + frame.fillColor = UIColor(white: 0, alpha: 0.25) + frame.zPosition = -1 + addChild(frame) + + buildPatternStrips() + buildBoardNodes() + buildHUD() + buildControls(bottomInset: bottomInset) + buildReadyOverlay() + buildPausedOverlay() + buildGameOverOverlay() + + appliedPattern = -1 + applyLevelPattern() + refreshBoard() + refreshPiece() + refreshNext() + updateHUD() + applyStateVisibility() + } + + private func makeBlockTexture() -> SKTexture { + let px: CGFloat = 64 + let renderer = UIGraphicsImageRenderer(size: CGSize(width: px, height: px)) + let image = renderer.image { ctx in + let cg = ctx.cgContext + let rect = CGRect(x: 2, y: 2, width: px - 4, height: px - 4) + let path = UIBezierPath(roundedRect: rect, cornerRadius: 10) + UIColor(white: 0.92, alpha: 1).setFill() + path.fill() + // top-edge highlight + bottom shade for a subtle bevel + cg.saveGState() + path.addClip() + UIColor.white.setFill() + UIBezierPath(rect: CGRect(x: 0, y: 0, width: px, height: px * 0.30)).fill() + UIColor(white: 0.72, alpha: 1).setFill() + UIBezierPath(rect: CGRect(x: 0, y: px * 0.72, width: px, height: px * 0.28)).fill() + cg.restoreGState() + UIColor(white: 0.45, alpha: 0.9).setStroke() + path.lineWidth = 3 + path.stroke() + } + return SKTexture(image: image) + } + + private func buildBoardNodes() { + let texture = makeBlockTexture() + blockTexture = texture + + cellSprites = (0.. [SKSpriteNode] { + (0.. 12 else { return } + for side in 0..<2 { + let node = SKSpriteNode(color: .clear, size: CGSize(width: stripW - 8, height: boardFrameRect.height)) + node.position = CGPoint( + x: side == 0 ? (boardFrameRect.minX - 5) / 2 : size.width - (boardFrameRect.minX - 5) / 2, + y: boardFrameRect.midY) + node.zPosition = -2 + addChild(node) + patternStrips.append(node) + } + } + + private func applyLevelPattern() { + let index = min(state == .ready ? chosenLevel : sim.level, 15) + guard index != appliedPattern, !patternStrips.isEmpty else { return } + appliedPattern = index + let texture = Self.patternTexture(Self.levelPatterns[index], + size: patternStrips[0].size, + dotSize: 3.2, + color: Palette.mint.withAlphaComponent(0.16)) + patternStrips.forEach { $0.texture = texture } + } + + /// Renders an 8×8 1-bit pattern tiled over `size` (MSB = leftmost pixel). + static func patternTexture(_ bytes: [UInt8], size: CGSize, dotSize: CGFloat, color: UIColor) -> SKTexture { + let renderer = UIGraphicsImageRenderer(size: size) + let image = renderer.image { _ in + color.setFill() + let tile = dotSize * 8 + var ty: CGFloat = 0 + while ty < size.height { + var tx: CGFloat = 0 + while tx < size.width { + for (row, byte) in bytes.enumerated() { + for bit in 0..<8 where (byte & (0x80 >> UInt8(bit))) != 0 { + UIBezierPath(rect: CGRect(x: tx + CGFloat(bit) * dotSize, + y: ty + CGFloat(row) * dotSize, + width: dotSize, height: dotSize)).fill() + } + } + tx += tile + } + ty += tile + } + } + return SKTexture(image: image) + } + + // MARK: - Coordinates + + /// visibleRow 0 = bottom of the well (absolute y = 2). + private func cellCenter(col: Int, visibleRow: Int) -> CGPoint { + CGPoint(x: boardOrigin.x + (CGFloat(col) + 0.5) * cellSize, + y: boardOrigin.y + (CGFloat(visibleRow) + 0.5) * cellSize) + } + + private func centerFor(absX: Int, absY: Int) -> CGPoint { + cellCenter(col: absX - TetrisSim.playfieldMinX, visibleRow: absY - TetrisSim.bottomRowY) + } + + // MARK: - HUD + + private func buildHUD() { + let hudY = size.height - topInset - 28 + + addChild(caption("LEVEL", x: 74, y: hudY + 14, align: .left)) + levelValue.fontSize = 17 + levelValue.fontColor = Palette.violet + levelValue.horizontalAlignmentMode = .left + levelValue.verticalAlignmentMode = .center + levelValue.position = CGPoint(x: 74, y: hudY - 5) + levelValue.zPosition = 20 + addChild(levelValue) + + addChild(caption("LINES", x: 134, y: hudY + 14, align: .left)) + linesValue.fontSize = 17 + linesValue.fontColor = .white + linesValue.horizontalAlignmentMode = .left + linesValue.verticalAlignmentMode = .center + linesValue.position = CGPoint(x: 134, y: hudY - 5) + linesValue.zPosition = 20 + addChild(linesValue) + + addChild(caption("SCORE", x: size.width * 0.56, y: hudY + 14, align: .center)) + scoreValue.fontSize = 21 + scoreValue.fontColor = .white + scoreValue.horizontalAlignmentMode = .center + scoreValue.verticalAlignmentMode = .center + scoreValue.position = CGPoint(x: size.width * 0.56, y: hudY - 5) + scoreValue.zPosition = 20 + addChild(scoreValue) + + // NEXT preview box at the right + addChild(caption("NEXT", x: size.width - 44, y: hudY + 14, align: .center)) + let box = SKShapeNode(rectOf: CGSize(width: 66, height: 36), cornerRadius: 9) + box.fillColor = UIColor(white: 1, alpha: 0.06) + box.strokeColor = UIColor(white: 1, alpha: 0.14) + box.lineWidth = 1 + box.position = CGPoint(x: size.width - 44, y: hudY - 6) + box.zPosition = 20 + addChild(box) + + nextSprites.forEach { $0.removeFromParent() } + nextSprites = (0..<4).map { _ in + let node = SKSpriteNode(texture: blockTexture) + node.size = CGSize(width: 13, height: 13) + node.colorBlendFactor = 1 + node.zPosition = 21 + addChild(node) + return node + } + + // Pause toggle at the board frame's top-right corner + pauseButton.fillColor = UIColor(white: 1, alpha: 0.08) + pauseButton.strokeColor = UIColor(white: 1, alpha: 0.25) + pauseButton.lineWidth = 1 + pauseButton.position = CGPoint(x: boardFrameRect.maxX - 6, y: boardFrameRect.maxY - 6) + pauseButton.zPosition = 22 + pauseButton.removeAllChildren() + if let tex = SceneArt.symbolTexture("pause.fill", pointSize: 13, color: Palette.white70) { + let icon = SKSpriteNode(texture: tex) + icon.size = tex.size() + pauseButton.addChild(icon) + } + addChild(pauseButton) + } + + private func caption(_ text: String, x: CGFloat, y: CGFloat, align: SKLabelHorizontalAlignmentMode) -> SKLabelNode { + let label = SKLabelNode(fontNamed: "Menlo-Bold") + label.text = text + label.fontSize = 10 + label.fontColor = Palette.white40 + label.horizontalAlignmentMode = align + label.verticalAlignmentMode = .center + label.position = CGPoint(x: x, y: y) + label.zPosition = 20 + return label + } + + // MARK: - Controls + + private func buildControls(bottomInset: CGFloat) { + let cy = bottomInset + (controlBarHeight - bottomInset) * 0.42 + + btnLeft.configure(radius: 37, tint: Palette.cyan) + btnRight.configure(radius: 37, tint: Palette.cyan) + btnHard.configure(radius: 40, tint: Palette.amber) + btnSoft.configure(radius: 24, tint: Palette.amber) + btnCW.configure(radius: 37, tint: Palette.mint) + btnCCW.configure(radius: 27, tint: Palette.mint) + + btnLeft.position = CGPoint(x: size.width * 0.12, y: cy) + btnRight.position = CGPoint(x: size.width * 0.315, y: cy) + btnHard.position = CGPoint(x: size.width * 0.5, y: cy) + btnSoft.position = CGPoint(x: size.width * 0.5, y: cy + 74) + btnCCW.position = CGPoint(x: size.width * 0.675, y: cy + 8) + btnCW.position = CGPoint(x: size.width * 0.87, y: cy) + [btnLeft, btnRight, btnHard, btnSoft, btnCW, btnCCW].forEach { $0.zPosition = 20; addChild($0) } + } + + // MARK: - Overlays + + private func buildReadyOverlay() { + readyOverlay.removeAllChildren() + readyOverlay.zPosition = 40 + addChild(readyOverlay) + + let dim = SKSpriteNode(color: UIColor(white: 0.02, alpha: 0.66), size: size) + dim.anchorPoint = .zero + readyOverlay.addChild(dim) + + let cx = size.width / 2 + let midY = size.height * 0.62 + readyOverlay.addChild(bigLabel("ZTETRIS", size: 34, color: .white, x: cx, y: midY + 78)) + readyOverlay.addChild(bigLabel("Stack. Clear. Don't top out.", + fontNamed: "AvenirNext-Medium", size: 15, + color: Palette.white70, x: cx, y: midY + 44)) + + buildStepper(title: "START LEVEL", value: levelValueLabel, valueText: "\(chosenLevel)", + y: midY - 14, keyMinus: "levelMinus", keyPlus: "levelPlus") + buildStepper(title: "START HEIGHT", value: highValueLabel, valueText: "\(chosenHigh)", + y: midY - 66, keyMinus: "highMinus", keyPlus: "highPlus") + + let prompt = bigLabel("TAP TO START", fontNamed: "Menlo-Bold", size: 16, color: Palette.mint, + x: cx, y: midY - 126) + prompt.run(.repeatForever(.sequence([.fadeAlpha(to: 0.35, duration: 0.7), .fadeAlpha(to: 1, duration: 0.7)]))) + readyOverlay.addChild(prompt) + + readyOverlay.addChild(bigLabel("◄ ► move ⟳ ⟲ rotate ⌄ soft ⤓ drop", + fontNamed: "Menlo", size: 11.5, color: Palette.white40, + x: cx, y: max(controlBarHeight + 22, midY - 162))) + } + + private func buildStepper(title: String, value: SKLabelNode, valueText: String, y: CGFloat, + keyMinus: String, keyPlus: String) { + let cx = size.width / 2 + readyOverlay.addChild(bigLabel(title, fontNamed: "Menlo-Bold", size: 12, color: Palette.white70, + x: cx, y: y + 25)) + let minusX = cx - 78, plusX = cx + 78 + let btnSize = CGSize(width: 44, height: 40) + readyOverlay.addChild(stepperButton("−", center: CGPoint(x: minusX, y: y))) + readyOverlay.addChild(stepperButton("+", center: CGPoint(x: plusX, y: y))) + stepperRects[keyMinus] = CGRect(x: minusX - 22, y: y - 20, width: btnSize.width, height: btnSize.height) + stepperRects[keyPlus] = CGRect(x: plusX - 22, y: y - 20, width: btnSize.width, height: btnSize.height) + + value.text = valueText + value.fontSize = 26 + value.fontColor = .white + value.horizontalAlignmentMode = .center + value.verticalAlignmentMode = .center + value.position = CGPoint(x: cx, y: y) + readyOverlay.addChild(value) + } + + private func stepperButton(_ glyph: String, center: CGPoint) -> SKNode { + let node = SKShapeNode(rectOf: CGSize(width: 44, height: 40), cornerRadius: 12) + node.fillColor = UIColor(white: 1, alpha: 0.10) + node.strokeColor = Palette.mint.withAlphaComponent(0.5) + node.lineWidth = 1 + node.position = center + let label = SKLabelNode(fontNamed: "Menlo-Bold") + label.text = glyph + label.fontSize = 24 + label.fontColor = Palette.mint + label.verticalAlignmentMode = .center + label.horizontalAlignmentMode = .center + node.addChild(label) + return node + } + + private func buildPausedOverlay() { + pausedOverlay.removeAllChildren() + pausedOverlay.zPosition = 40 + addChild(pausedOverlay) + // Opaque enough to hide the well — the original cleared the screen on pause. + let dim = SKSpriteNode(color: UIColor(white: 0.01, alpha: 0.93), size: size) + dim.anchorPoint = .zero + pausedOverlay.addChild(dim) + pausedOverlay.addChild(bigLabel("PAUSED", size: 30, color: .white, + x: size.width / 2, y: size.height * 0.55)) + let hint = bigLabel("TAP TO RESUME", fontNamed: "Menlo-Bold", size: 15, color: Palette.mint, + x: size.width / 2, y: size.height * 0.55 - 44) + hint.run(.repeatForever(.sequence([.fadeAlpha(to: 0.35, duration: 0.7), .fadeAlpha(to: 1, duration: 0.7)]))) + pausedOverlay.addChild(hint) + } + + private func buildGameOverOverlay() { + gameOverOverlay.removeAllChildren() + gameOverOverlay.zPosition = 40 + addChild(gameOverOverlay) + + let dim = SKSpriteNode(color: UIColor(white: 0.02, alpha: 0.70), size: size) + dim.anchorPoint = .zero + gameOverOverlay.addChild(dim) + + let cx = size.width / 2 + let midY = size.height * 0.6 + let title = bigLabel("GAME OVER", size: 34, color: Palette.red, x: cx, y: midY + 40) + gameOverOverlay.addChild(title) + + gameOverDetail.fontSize = 15 + gameOverDetail.fontColor = .white + gameOverDetail.horizontalAlignmentMode = .center + gameOverDetail.position = CGPoint(x: cx, y: midY) + gameOverOverlay.addChild(gameOverDetail) + + gameOverRecord.fontSize = 14 + gameOverRecord.fontColor = Palette.amber + gameOverRecord.horizontalAlignmentMode = .center + gameOverRecord.position = CGPoint(x: cx, y: midY - 26) + gameOverOverlay.addChild(gameOverRecord) + + let prompt = bigLabel("TAP TO PLAY AGAIN", fontNamed: "Menlo-Bold", size: 16, color: Palette.mint, + x: cx, y: midY - 66) + prompt.run(.repeatForever(.sequence([.fadeAlpha(to: 0.35, duration: 0.7), .fadeAlpha(to: 1, duration: 0.7)]))) + gameOverOverlay.addChild(prompt) + } + + private func bigLabel(_ text: String, fontNamed: String = "AvenirNext-Heavy", size fontSize: CGFloat, + color: UIColor, x: CGFloat, y: CGFloat) -> SKLabelNode { + let label = SKLabelNode(fontNamed: fontNamed) + label.text = text + label.fontSize = fontSize + label.fontColor = color + label.horizontalAlignmentMode = .center + label.verticalAlignmentMode = .center + label.position = CGPoint(x: x, y: y) + return label + } + + // MARK: - Rendering + + private func refreshBoard() { + for row in 0..= dasNext { + let moved = dasDirection < 0 ? sim.moveLeft() : sim.moveRight() + if moved { refreshPiece(); Haptics.impact(.light, intensity: 0.3) } + dasNext = currentTime + dasRepeat + } + + // Held soft drop — also resets gravity like the original's Down key. + if softHeld, currentTime >= softNext { + softNext = currentTime + softRepeat + gravityNext = currentTime + sim.gravityInterval + handle(step: sim.softDropStep(), at: currentTime) + } + + // Gravity + if currentTime >= gravityNext { + gravityNext = currentTime + sim.gravityInterval + handle(step: sim.gravityStep(), at: currentTime) + } + } + + private func handle(step: TetrisSim.Step, at time: TimeInterval) { + switch step { + case .fell: + refreshPiece() + case .locked(let lock): + didLock(lock, at: time) + } + } + + private func didLock(_ lock: TetrisSim.Lock, at time: TimeInterval) { + refreshBoard() + refreshPiece() + refreshNext() + updateHUD() + + if lock.clearedYs.isEmpty { + Haptics.impact(.light, intensity: 0.6) + } else { + Haptics.success() + flashRows(lock.clearedYs) + popScore("+\(lock.scoreGained)") + gravityNext = time + sim.gravityInterval + 0.26 // brief beat for the flash + } + if lock.leveledUp { + Haptics.impact(.medium) + applyLevelPattern() + popScore("LEVEL \(sim.level)", color: Palette.violet, dy: 40) + } + if lock.gameOver { endGame() } + } + + private func flashRows(_ absYs: [Int]) { + for y in absYs where y <= TetrisSim.topVisibleY { + let flash = SKSpriteNode(color: .white, + size: CGSize(width: boardFrameRect.width, height: cellSize)) + flash.position = CGPoint(x: boardFrameRect.midX, + y: boardOrigin.y + (CGFloat(y - TetrisSim.bottomRowY) + 0.5) * cellSize) + flash.zPosition = 4 + flash.alpha = 0.85 + addChild(flash) + flash.run(.sequence([.fadeOut(withDuration: 0.26), .removeFromParent()])) + } + } + + private func popScore(_ text: String, color: UIColor = Palette.amber, dy: CGFloat = 0) { + let label = SKLabelNode(fontNamed: "Menlo-Bold") + label.text = text + label.fontSize = 20 + label.fontColor = color + label.position = CGPoint(x: boardFrameRect.midX, y: boardFrameRect.midY + dy) + label.zPosition = 30 + label.setScale(0.6) + addChild(label) + label.run(.sequence([ + .group([.scale(to: 1.0, duration: 0.14), + .moveBy(x: 0, y: 26, duration: 0.7), + .sequence([.wait(forDuration: 0.35), .fadeOut(withDuration: 0.35)])]), + .removeFromParent(), + ])) + } + + // MARK: - State transitions + + private func startFromReady() { + sim = TetrisSim(startLevel: chosenLevel, high: chosenHigh) + appliedPattern = -1 + state = .playing + gravityNext = lastUpdate + sim.gravityInterval + dasDirection = 0 + softHeld = false + applyLevelPattern() + refreshBoard() + refreshPiece() + refreshNext() + updateHUD() + applyStateVisibility() + } + + private func endGame() { + let final = sim.score + let record = HighScoreStore.shared.submit(id: "ztetris", score: final) + state = .gameOver + gameOverDetail.text = "SCORE \(final) LINES \(sim.lines) LEVEL \(sim.level)" + gameOverRecord.text = record ? "★ NEW BEST ★" : "BEST \(HighScoreStore.shared.best("ztetris"))" + Haptics.error() + applyStateVisibility() + } + + private func applyStateVisibility() { + readyOverlay.isHidden = state != .ready + pausedOverlay.isHidden = state != .paused + gameOverOverlay.isHidden = state != .gameOver + pauseButton.isHidden = state != .playing + let controlsActive = state == .playing + [btnLeft, btnRight, btnHard, btnSoft, btnCW, btnCCW].forEach { $0.alpha = controlsActive ? 1 : 0.28 } + refreshPiece() + } + + // MARK: - Touch handling + + override func touchesBegan(_ touches: Set, with event: UIEvent?) { + for touch in touches { + let p = touch.location(in: self) + switch state { + case .ready: + if handleStepperTap(at: p) { continue } + Haptics.selection() + startFromReady() + case .paused: + Haptics.selection() + state = .playing + gravityNext = lastUpdate + sim.gravityInterval + applyStateVisibility() + case .gameOver: + Haptics.selection() + state = .ready + applyStateVisibility() + case .playing: + let dp = hypot(p.x - pauseButton.position.x, p.y - pauseButton.position.y) + if dp <= 30 { + Haptics.selection() + state = .paused + dasDirection = 0; softHeld = false + applyStateVisibility() + continue + } + activeTouches.insert(touch) + } + } + recomputeControls() + } + + override func touchesMoved(_ touches: Set, with event: UIEvent?) { + recomputeControls() + } + + override func touchesEnded(_ touches: Set, with event: UIEvent?) { + touches.forEach { activeTouches.remove($0) } + recomputeControls() + } + + override func touchesCancelled(_ touches: Set, with event: UIEvent?) { + touches.forEach { activeTouches.remove($0) } + recomputeControls() + } + + private func handleStepperTap(at p: CGPoint) -> Bool { + for (key, rect) in stepperRects where rect.contains(p) { + switch key { + case "levelMinus": chosenLevel = max(0, chosenLevel - 1) + case "levelPlus": chosenLevel = min(TetrisSim.maxStartLevel, chosenLevel + 1) + case "highMinus": chosenHigh = max(0, chosenHigh - 1) + case "highPlus": chosenHigh = min(TetrisSim.maxHigh, chosenHigh + 1) + default: break + } + levelValueLabel.text = "\(chosenLevel)" + highValueLabel.text = "\(chosenHigh)" + Haptics.selection() + return true + } + return false + } + + private func recomputeControls() { + var left = false, right = false, soft = false, hard = false, cw = false, ccw = false + if state == .playing { + for touch in activeTouches { + let p = touch.location(in: self) + if btnLeft.covers(p) { left = true } + if btnRight.covers(p) { right = true } + if btnSoft.covers(p) { soft = true } + if btnHard.covers(p) { hard = true } + if btnCW.covers(p) { cw = true } + if btnCCW.covers(p) { ccw = true } + } + } + + // Move: immediate step on the rising edge, then DAS repeat in update(). + if left && !lastLeft { + dasDirection = -1 + dasNext = lastUpdate + dasDelay + if sim.moveLeft() { refreshPiece(); Haptics.impact(.light, intensity: 0.4) } + } + if right && !lastRight { + dasDirection = 1 + dasNext = lastUpdate + dasDelay + if sim.moveRight() { refreshPiece(); Haptics.impact(.light, intensity: 0.4) } + } + // Releases: fall back to a still-held direction (re-armed), or stop. + if dasDirection == -1 && !left { + dasDirection = right ? 1 : 0 + dasNext = lastUpdate + dasDelay + } else if dasDirection == 1 && !right { + dasDirection = left ? -1 : 0 + dasNext = lastUpdate + dasDelay + } + + // Rotations and hard drop: single action per press. + if cw && !lastCW, sim.rotate() { refreshPiece(); Haptics.impact(.light, intensity: 0.5) } + if ccw && !lastCCW, sim.rotateBack() { refreshPiece(); Haptics.impact(.light, intensity: 0.5) } + if hard && !lastHard, state == .playing { + Haptics.impact(.medium, intensity: 0.8) + handle(step: sim.hardDrop(), at: lastUpdate) + gravityNext = lastUpdate + sim.gravityInterval + } + + // Soft drop: immediate step on press, repeats in update(). + if soft && !lastSoft { + softNext = lastUpdate + softRepeat + gravityNext = lastUpdate + sim.gravityInterval + handle(step: sim.softDropStep(), at: lastUpdate) + } + softHeld = soft + + lastLeft = left; lastRight = right; lastSoft = soft + lastHard = hard; lastCW = cw; lastCCW = ccw + + btnLeft.setPressed(left) + btnRight.setPressed(right) + btnSoft.setPressed(soft) + btnHard.setPressed(hard) + btnCW.setPressed(cw) + btnCCW.setPressed(ccw) + } + + // MARK: - Demo (screenshots) + + #if DEBUG + private func buildDemoStack() { + // A believable mid-game stack across the bottom rows. + let rows: [[Int]] = [ + [1, 1, 5, 5, 0, 3, 3, 2, 2, 8], + [4, 1, 5, 5, 6, 3, 3, 0, 2, 8], + [4, 4, 0, 7, 6, 6, 0, 2, 2, 8], + [4, 0, 0, 7, 0, 6, 0, 0, 8, 8], + ] + for (i, row) in rows.enumerated() { // rows[0] = top of stack + for (col, value) in row.enumerated() where value != 0 { + sim.debugSetCell(col: col, y: TetrisSim.bottomRowY + (rows.count - 1 - i), kind: value) + } + } + sim.debugPose(kind: 3, rot: 0, x: 6, y: 9) // T piece mid-fall + } + #endif +} diff --git a/Arcade85/Games/ZTetris/TetrisSim.swift b/Arcade85/Games/ZTetris/TetrisSim.swift new file mode 100644 index 0000000..1852f4a --- /dev/null +++ b/Arcade85/Games/ZTetris/TetrisSim.swift @@ -0,0 +1,327 @@ +import Foundation + +/// A faithful port of ZTetris 3.0 (Jimmy Mårdell, 1998) game logic from +/// `ZTETRIS.ASM`. The well, piece data, movement rules, scoring and level +/// behavior reproduce the original exactly; the SpriteKit scene renders this in +/// HD and drives it with touch controls. +/// +/// Original coordinate system (kept verbatim): `y` increases *upward* and +/// pieces fall by decrementing y. The board is a 16-wide bit-grid where columns +/// 0–2 and 13–15 are walls and column 3…12 is the 10-wide playfield; row y=1 is +/// the floor. Pieces spawn at (x=6, y=16); rows 2…17 are visible (18/19 are +/// headroom above the visible well). Each piece rotation is stored as four +/// (dy,dx) offsets packed into one 16-bit word — ported bit-for-bit from the +/// ASM's `BitData` table and decoded the same way `Uncrunch` does. +struct TetrisSim { + + // MARK: - Original data tables (verbatim from ZTETRIS.ASM) + + /// 7 pieces × 4 rotations. Each word packs 4 blocks × (dy,dx), 2 bits each, + /// least-significant pair first — exactly the `BitData` table. + static let bitData: [UInt16] = [ + 0b0001_0101_1001_1000, 0b0110_0101_0000_0100, 0b0010_0001_0101_1001, 0b0110_1010_0101_0100, // J + 0b0001_0101_1001_0000, 0b0010_0110_0101_0100, 0b0001_0101_1001_1010, 0b0110_0101_0100_1000, // L + 0b0101_1001_0100_1000, 0b0101_1001_0100_1000, 0b0101_1001_0100_1000, 0b0101_1001_0100_1000, // O + 0b0001_0101_1001_0100, 0b0001_0110_0101_0100, 0b0001_0110_0101_1001, 0b0110_0101_0100_1001, // T + 0b0000_0101_0100_1001, 0b0010_0001_0101_0100, 0b0000_0101_0100_1001, 0b0010_0001_0101_0100, // S + 0b0001_0101_0100_1000, 0b0001_0000_0110_0101, 0b0001_0101_0100_1000, 0b0001_0000_0110_0101, // Z + 0b0001_0101_1001_1101, 0b0111_0110_0101_0100, 0b0001_0101_1001_1101, 0b0111_0110_0101_0100, // I + ] + + /// Gravity delay per level 0–20, in main-loop iterations (`levelcnts`). + /// One iteration = 4 HALTs ≈ 20 ms on the TI-85, so seconds = count × 0.02. + static let levelCounts = [40, 36, 32, 28, 25, 22, 19, 17, 15, 13, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1] + + /// Base score for clearing 1–4 lines (`Scoring`), multiplied by (level+1). + static let lineScores = [4, 10, 30, 120] + + /// Piece kind order as stored in `BitData` (index 0…6). + enum Kind: Int, CaseIterable { case j = 0, l, o, t, s, z, i } + + // MARK: - Geometry constants (original values) + + static let gridWidth = 16 // bit-grid width incl. walls + static let gridHeight = 20 // y = 0…19 + static let playfieldMinX = 3 // playfield columns 3…12 + static let playfieldMaxX = 12 + static let floorY = 1 // solid floor row + static let bottomRowY = 2 // lowest playable row + static let topVisibleY = 17 // rows 2…17 are drawn (16 rows) + static let headroomY = 19 // rows 18/19 exist but are off-screen + static let spawnX = 6, spawnY = 16 // `ld hl,$0610` in CreateNew + static let cols = 10, visibleRows = 16 + static let maxStartLevel = 9 // level select 0…9 + static let maxHigh = 5 // "start high" option 0…5 (rows = high×2) + + /// Cell contents: 0 = empty, 1…7 = locked piece (Kind+1), 8 = trash line. + static let trashCell = 8 + + struct Piece { + var kind: Int // 0…6 + var rot: Int // 0…3 + var x: Int + var y: Int + } + + enum Step { + case fell + case locked(Lock) + } + + /// Everything the renderer needs to react to a piece locking down. + struct Lock { + var clearedYs: [Int] // absolute y of rows removed (before shifting) + var scoreGained: Int // displayed-score delta from this lock + var leveledUp: Bool + var gameOver: Bool + } + + // MARK: - State + + private(set) var grid: [[Int]] // [y][x] + private(set) var current: Piece + private(set) var nextKind: Int + private(set) var score = 0 // displayed score (`Score`) + private(set) var scoreUnits = 0 // hidden tenths (`scoreU`) + private(set) var lines = 0 + private(set) var level: Int + private(set) var startLevel: Int + private(set) var high: Int + private(set) var over = false + + private var rng: TetrisRNG + + // MARK: - Setup + + init(startLevel: Int = 0, high: Int = 0, seed: UInt64? = nil) { + let clampedLevel = min(max(startLevel, 0), Self.maxStartLevel) + let clampedHigh = min(max(high, 0), Self.maxHigh) + self.startLevel = clampedLevel + self.high = clampedHigh + self.level = clampedLevel + self.rng = TetrisRNG(seed: seed ?? UInt64.random(in: 1...UInt64.max)) + + // Empty grid with walls: columns 0–2 / 13–15 and rows 0–1 are solid. + var g = [[Int]](repeating: [Int](repeating: 0, count: Self.gridWidth), count: Self.gridHeight) + for y in 0.. Self.playfieldMaxX { + g[y][x] = Self.trashCell + 1 // wall sentinel (never drawn) + } + } + for x in 0.. 0 { addTrashRows(count: clampedHigh * 2) } + } + + /// Scrambled trash rows as in `AddTrashRow`: each row starts full and gets + /// 5 randomly-placed holes punched (duplicates allowed, so 1–5 holes). + private mutating func addTrashRows(count: Int) { + for i in 0.. [(dx: Int, dy: Int)] { + var word = bitData[kind * 4 + (rot & 3)] + var result: [(dx: Int, dy: Int)] = [] + for _ in 0..<4 { + let dy = Int(word & 3); word >>= 2 + let dx = Int(word & 3); word >>= 2 + result.append((dx: dx, dy: dy)) + } + return result + } + + static func absBlocks(_ p: Piece) -> [(x: Int, y: Int)] { + blocks(kind: p.kind, rot: p.rot).map { (x: p.x + $0.dx, y: p.y + $0.dy) } + } + + var currentBlocks: [(x: Int, y: Int)] { Self.absBlocks(current) } + + /// Where the current piece would come to rest (for the ghost outline). + var ghostPiece: Piece { + var p = current + while fits(applying: { $0.y -= 1 }, to: p) { p.y -= 1 } + return p + } + + /// `TestNewB`: the piece fits iff all four blocks land on empty cells. + private func fits(_ p: Piece) -> Bool { + for b in Self.absBlocks(p) { + guard b.x >= 0, b.x < Self.gridWidth, b.y >= 0, b.y < Self.gridHeight else { return false } + if grid[b.y][b.x] != 0 { return false } + } + return true + } + + private func fits(applying change: (inout Piece) -> Void, to piece: Piece) -> Bool { + var p = piece + change(&p) + return fits(p) + } + + // MARK: - Player moves (fail silently, like the original's revert) + + @discardableResult + mutating func moveLeft() -> Bool { tryChange { $0.x -= 1 } } + + @discardableResult + mutating func moveRight() -> Bool { tryChange { $0.x += 1 } } + + @discardableResult + mutating func rotate() -> Bool { tryChange { $0.rot = ($0.rot + 1) & 3 } } // 2nd/Up key + + @discardableResult + mutating func rotateBack() -> Bool { tryChange { $0.rot = ($0.rot + 3) & 3 } } // Alpha key + + private mutating func tryChange(_ change: (inout Piece) -> Void) -> Bool { + guard !over else { return false } + var p = current + change(&p) + guard fits(p) else { return false } + current = p + return true + } + + // MARK: - Falling + + /// One gravity step (`FallDown`): move down or lock. + mutating func gravityStep() -> Step { + guard !over else { return .fell } + if fits(applying: { $0.y -= 1 }, to: current) { + current.y -= 1 + return .fell + } + return .locked(lockPiece()) + } + + /// Down key (`MoveDown`): +1 hidden unit, then a gravity step. The unit is + /// granted even on the step that locks — exactly as in the original. + mutating func softDropStep() -> Step { + guard !over else { return .fell } + scoreUnits += 1 + return gravityStep() + } + + /// Drop key (`Drop`): +1 unit per attempted step (including the final + /// blocked one), then lock immediately. + mutating func hardDrop() -> Step { + guard !over else { return .fell } + while true { + scoreUnits += 1 + if fits(applying: { $0.y -= 1 }, to: current) { + current.y -= 1 + } else { + return .locked(lockPiece()) + } + } + } + + // MARK: - Locking (`BotReached` → `NewB`) + + private mutating func lockPiece() -> Lock { + let scoreBefore = score + + for b in currentBlocks where b.y < Self.gridHeight { + grid[b.y][b.x] = current.kind + 1 + } + + // scoreU rollover happens on every new piece (`NewB`). + score += scoreUnits / 10 + scoreUnits %= 10 + + // Scan for full rows (`CheckLines`/`RepScan`), remove and shift down. + var cleared: [Int] = [] + var y = Self.bottomRowY + while y <= Self.headroomY - 1 { + let full = (Self.playfieldMinX...Self.playfieldMaxX).allSatisfy { grid[y][$0] != 0 } + if full { + cleared.append(y + cleared.count) // report original position + for yy in y..<(Self.gridHeight - 1) { + for x in Self.playfieldMinX...Self.playfieldMaxX { + grid[yy][x] = grid[yy + 1][x] + } + } + for x in Self.playfieldMinX...Self.playfieldMaxX { + grid[Self.gridHeight - 1][x] = 0 + } + lines += 1 + // do not advance y: the shifted-down row needs rescanning + } else { + y += 1 + } + } + + if !cleared.isEmpty { + score += Self.lineScores[cleared.count - 1] * (level + 1) + } + + // Level = lines DIV 10, only ever increasing (capped at 20 per the doc). + var leveled = false + let target = min(lines / 10, 20) + if target > level { + level = target + leveled = true + } + + // Spawn the next piece (`CreateNew`); if it doesn't fit, game over. + current = Piece(kind: nextKind, rot: 0, x: Self.spawnX, y: Self.spawnY) + nextKind = Int(rng.next() % 7) + if !fits(current) { over = true } + + return Lock(clearedYs: cleared, + scoreGained: score - scoreBefore, + leveledUp: leveled, + gameOver: over) + } + + // MARK: - Derived + + /// Seconds per gravity row at the current level (levelcnts × ~20 ms). + var gravityInterval: TimeInterval { 0.02 * Double(Self.levelCounts[min(level, 20)]) } + + /// Cell lookup in playfield coordinates (col 0…9, absolute y). + func cell(col: Int, y: Int) -> Int { + grid[y][col + Self.playfieldMinX] + } + + #if DEBUG + // Test/screenshot hooks — never in Release builds. + mutating func debugSetCell(col: Int, y: Int, kind: Int) { + grid[y][col + Self.playfieldMinX] = kind + } + mutating func debugSetLines(_ n: Int) { lines = n } + mutating func debugPose(kind: Int, rot: Int, x: Int, y: Int) { + current = Piece(kind: kind, rot: rot, x: x, y: y) + } + #endif +} + +/// SplitMix64 — deterministic, seedable stand-in for the original's LFSR +/// (`PRandom`); piece selection is uniform 0…6 in both. +struct TetrisRNG { + private var state: UInt64 + init(seed: UInt64) { state = seed == 0 ? 0xBAD_5EED : seed } + mutating func next() -> UInt64 { + state &+= 0x9E3779B97F4A7C15 + var z = state + z = (z ^ (z >> 30)) &* 0xBF58476D1CE4E5B9 + z = (z ^ (z >> 27)) &* 0x94D049BB133111EB + return z ^ (z >> 31) + } +} diff --git a/Arcade85/Shell/GameCatalog.swift b/Arcade85/Shell/GameCatalog.swift new file mode 100644 index 0000000..820502e --- /dev/null +++ b/Arcade85/Shell/GameCatalog.swift @@ -0,0 +1,63 @@ +import SwiftUI +import SpriteKit + +/// Metadata for one title in the collection. +struct GameInfo: Identifiable { + let id: String + let title: String + let tagline: String + let origin: String // author · year of the original TI-85 program + let symbol: String // SF Symbol shown on the home card + let tint: Color + let playable: Bool // false → routes to the "coming soon" preview scene + var scoreIsMoney = false // BEST renders as dollars (Dope Wars nets) +} + +/// The five TI-85 classics being remade, plus a factory that builds the +/// SpriteKit scene for a given id. +enum GameCatalog { + static let games: [GameInfo] = [ + GameInfo(id: "lander", title: "Lunar Lander", tagline: "Cut your descent and set her down gently on the pad.", + origin: "Istar · 1997", symbol: "moon.stars.fill", tint: Theme.accent, playable: true), + // Galaxian's slot: swapped for a trading game (too much overlap with + // Phoenix). The Galaxian port stays in Games/Galaxian, dormant — + // restore by swapping this entry back. Dope Wars runs the NerdWars + // TI-85 engine re-skinned back to Dell's classic 1984 setup. + GameInfo(id: "dopewars", title: "Dope Wars", tagline: "Buy low, sell high, dodge Hardass, square the loan shark.", + origin: "J.E. Dell · 1984", symbol: "dollarsign.circle.fill", tint: Theme.accent2, playable: true, + scoreIsMoney: true), + GameInfo(id: "phoenix", title: "Phoenix", tagline: "Blast through waves, bank credits, upgrade your ship.", + origin: "P. Davidson · 2008", symbol: "flame.fill", tint: Theme.warning, playable: true), + GameInfo(id: "ztetris", title: "ZTetris", tagline: "Stack the falling blocks, clear lines, chase the count.", + origin: "J. Mårdell · 1998", symbol: "square.grid.3x3.fill", tint: Theme.violet, playable: true), + GameInfo(id: "zmercury", title: "ZMercury", tagline: "Skim the terrain and outshoot everything that moves.", + origin: "P. Davidson · 2004", symbol: "bolt.fill", tint: Theme.danger, playable: true), + ] + + static func game(id: String) -> GameInfo { + games.first { $0.id == id } ?? games[0] + } + + @MainActor + static func makeScene(id: String, size: CGSize) -> SKScene { + let scene: SKScene + switch id { + case "lander": + scene = LanderScene(size: size) + case "galaxian": // dormant, no catalog entry (see above) + scene = GalaxianScene(size: size) + case "dopewars": + scene = DopeWarsScene(size: size) + case "phoenix": + scene = PhoenixScene(size: size) + case "ztetris": + scene = TetrisScene(size: size) + case "zmercury": + scene = MercuryScene(size: size) + default: + scene = ComingSoonScene(size: size, info: game(id: id)) + } + scene.scaleMode = .resizeFill + return scene + } +} diff --git a/Arcade85/Shell/GameHostView.swift b/Arcade85/Shell/GameHostView.swift new file mode 100644 index 0000000..3e8adb6 --- /dev/null +++ b/Arcade85/Shell/GameHostView.swift @@ -0,0 +1,47 @@ +import SwiftUI +import SpriteKit + +/// Full-screen host for a game's SpriteKit scene, with a floating back button. +/// The scene is built once at the measured size and owns its own HUD. +struct GameHostView: View { + let info: GameInfo + @Environment(\.dismiss) private var dismiss + @State private var scene: SKScene? + + var body: some View { + GeometryReader { geo in + ZStack(alignment: .topLeading) { + Color.black.ignoresSafeArea() + + if let scene { + SpriteView(scene: scene, + options: [.ignoresSiblingOrder]) + .ignoresSafeArea() + } + + Button { + Haptics.selection() + dismiss() + } label: { + Image(systemName: "chevron.left") + .font(.system(size: 17, weight: .bold)) + .foregroundStyle(.white.opacity(0.9)) + .frame(width: 38, height: 38) + .background(.ultraThinMaterial, in: Circle()) + .overlay(Circle().stroke(.white.opacity(0.15), lineWidth: 1)) + } + .padding(.top, 6) + .padding(.leading, 14) + } + .onAppear { + if scene == nil { + let size = geo.size == .zero ? UIScreen.main.bounds.size : geo.size + scene = GameCatalog.makeScene(id: info.id, size: size) + } + } + } + .background(Color.black.ignoresSafeArea()) + .statusBarHidden(true) + .persistentSystemOverlays(.hidden) + } +} diff --git a/Arcade85/Shell/Haptics.swift b/Arcade85/Shell/Haptics.swift new file mode 100644 index 0000000..341312c --- /dev/null +++ b/Arcade85/Shell/Haptics.swift @@ -0,0 +1,15 @@ +import UIKit + +/// Thin wrapper over UIKit feedback generators so games can add tactile feel +/// without repeating boilerplate. All calls are cheap and safe to fire often. +enum Haptics { + static func impact(_ style: UIImpactFeedbackGenerator.FeedbackStyle, intensity: CGFloat = 1.0) { + let generator = UIImpactFeedbackGenerator(style: style) + generator.impactOccurred(intensity: intensity) + } + + static func success() { UINotificationFeedbackGenerator().notificationOccurred(.success) } + static func warning() { UINotificationFeedbackGenerator().notificationOccurred(.warning) } + static func error() { UINotificationFeedbackGenerator().notificationOccurred(.error) } + static func selection() { UISelectionFeedbackGenerator().selectionChanged() } +} diff --git a/Arcade85/Shell/HighScoreStore.swift b/Arcade85/Shell/HighScoreStore.swift new file mode 100644 index 0000000..b9102a7 --- /dev/null +++ b/Arcade85/Shell/HighScoreStore.swift @@ -0,0 +1,43 @@ +import Foundation +import Combine + +/// Persists a best score per game id in UserDefaults. Shared across the shell +/// (to show "BEST" on cards) and the SpriteKit scenes (to submit results). +final class HighScoreStore: ObservableObject { + static let shared = HighScoreStore() + + private let storageKey = "arcade85.highscores.v1" + @Published private(set) var scores: [String: Int] = [:] + + private init() { load() } + + func best(_ id: String) -> Int { scores[id] ?? 0 } + + /// Records `score` for `id` if it beats the stored best. Returns true on a new record. + @discardableResult + func submit(id: String, score: Int) -> Bool { + guard score > (scores[id] ?? 0) else { return false } + scores[id] = score + save() + return true + } + + /// Clears the stored best for one game (used when a game's scoring scale changes). + func reset(_ id: String) { + guard scores[id] != nil else { return } + scores[id] = nil + save() + } + + private func load() { + guard let data = UserDefaults.standard.data(forKey: storageKey), + let decoded = try? JSONDecoder().decode([String: Int].self, from: data) + else { return } + scores = decoded + } + + private func save() { + guard let data = try? JSONEncoder().encode(scores) else { return } + UserDefaults.standard.set(data, forKey: storageKey) + } +} diff --git a/Arcade85/Shell/RootView.swift b/Arcade85/Shell/RootView.swift new file mode 100644 index 0000000..a125e52 --- /dev/null +++ b/Arcade85/Shell/RootView.swift @@ -0,0 +1,200 @@ +import SwiftUI + +/// Home screen: a starfield backdrop, the "ARCADE 85" wordmark, and a stack of +/// game cards. Tapping a card presents the game full screen. +struct RootView: View { + @StateObject private var scores = HighScoreStore.shared + @State private var active: GameInfo? + + var body: some View { + ZStack { + LinearGradient(colors: [Theme.backgroundHi, Theme.background], + startPoint: .top, endPoint: .bottom) + .ignoresSafeArea() + StarfieldView() + .ignoresSafeArea() + .allowsHitTesting(false) + + ScrollView { + VStack(alignment: .leading, spacing: 16) { + header + .padding(.top, 12) + .padding(.bottom, 6) + ForEach(GameCatalog.games) { game in + GameCard(info: game, best: scores.best(game.id)) { + Haptics.selection() + active = game + } + } + footer + } + .padding(.horizontal, 20) + .padding(.bottom, 32) + } + } + .fullScreenCover(item: $active) { game in + GameHostView(info: game) + } + .onAppear { + #if DEBUG + if let id = ProcessInfo.processInfo.environment["ARCADE_DIRECT_GAME"], + let info = GameCatalog.games.first(where: { $0.id == id }) { + active = info + } + #endif + } + } + + private var header: some View { + VStack(alignment: .leading, spacing: 6) { + (Text("ARCADE ").foregroundStyle(.white) + Text("85").foregroundStyle(Theme.accent)) + .font(Theme.title(40)) + .kerning(1) + Text("Five TI-85 classics, remade for touch.") + .font(Theme.rounded(15, .medium)) + .foregroundStyle(.white.opacity(0.55)) + } + .frame(maxWidth: .infinity, alignment: .leading) + } + + private var footer: some View { + Text("Faithful HD remakes, ported from the original calculator sources.") + .font(Theme.rounded(12, .regular)) + .foregroundStyle(.white.opacity(0.35)) + .padding(.top, 8) + } +} + +/// One tappable game entry on the home screen. +struct GameCard: View { + let info: GameInfo + let best: Int + let action: () -> Void + + var body: some View { + Button(action: action) { + HStack(spacing: 14) { + ZStack { + RoundedRectangle(cornerRadius: 16, style: .continuous) + .fill(info.tint.opacity(0.16)) + Image(systemName: info.symbol) + .font(.system(size: 28, weight: .semibold)) + .foregroundStyle(info.tint) + } + .frame(width: 66, height: 66) + + VStack(alignment: .leading, spacing: 3) { + HStack(spacing: 8) { + Text(info.title) + .font(Theme.title(19)) + .foregroundStyle(.white) + if !info.playable { + Text("SOON") + .font(Theme.mono(9, .bold)) + .padding(.horizontal, 6).padding(.vertical, 3) + .background(Capsule().fill(.white.opacity(0.10))) + .foregroundStyle(.white.opacity(0.6)) + } + } + Text(info.tagline) + .font(Theme.rounded(12.5, .regular)) + .foregroundStyle(.white.opacity(0.55)) + .lineLimit(2) + .fixedSize(horizontal: false, vertical: true) + Text(info.origin) + .font(Theme.mono(10, .medium)) + .foregroundStyle(.white.opacity(0.35)) + .padding(.top, 1) + } + + Spacer(minLength: 4) + + VStack(alignment: .trailing, spacing: 2) { + if info.playable { + Text("BEST") + .font(Theme.mono(8, .bold)) + .foregroundStyle(.white.opacity(0.35)) + Text(info.scoreIsMoney ? Self.compactMoney(best) : "\(best)") + .font(Theme.mono(15, .bold)) + .foregroundStyle(info.tint) + } + Spacer(minLength: 0) + Image(systemName: "chevron.right") + .font(.system(size: 12, weight: .bold)) + .foregroundStyle(.white.opacity(0.30)) + } + .frame(height: 66) + } + .padding(13) + .background( + RoundedRectangle(cornerRadius: 22, style: .continuous) + .fill(Theme.panel.opacity(0.85)) + .overlay( + RoundedRectangle(cornerRadius: 22, style: .continuous) + .stroke(info.tint.opacity(0.22), lineWidth: 1) + ) + ) + } + .buttonStyle(CardButtonStyle()) + } + + /// "$318,240" up to six figures, then "$13.4M" — card space is tight. + private static func compactMoney(_ n: Int) -> String { + switch n { + case 1_000_000_000...: return String(format: "$%.1fB", Double(n) / 1_000_000_000) + case 1_000_000...: return String(format: "$%.1fM", Double(n) / 1_000_000) + default: + let f = NumberFormatter() + f.numberStyle = .decimal + return "$" + (f.string(from: NSNumber(value: n)) ?? "\(n)") + } + } +} + +/// Subtle press-scale for the cards. +private struct CardButtonStyle: ButtonStyle { + func makeBody(configuration: Configuration) -> some View { + configuration.label + .scaleEffect(configuration.isPressed ? 0.975 : 1) + .animation(.easeOut(duration: 0.12), value: configuration.isPressed) + } +} + +/// A static field of stars rendered with Canvas. Positions are deterministic so +/// the sky doesn't shuffle on every redraw. +struct StarfieldView: View { + private let stars: [Star] = { + var rng = SeededGenerator(seed: 0x5EED_1985) + return (0..<90).map { _ in + Star(x: .random(in: 0...1, using: &rng), + y: .random(in: 0...1, using: &rng), + r: .random(in: 0.5...1.7, using: &rng), + a: .random(in: 0.10...0.85, using: &rng)) + } + }() + + var body: some View { + Canvas { context, size in + for s in stars { + let rect = CGRect(x: s.x * size.width, y: s.y * size.height, + width: s.r * 2, height: s.r * 2) + context.fill(Path(ellipseIn: rect), with: .color(.white.opacity(s.a))) + } + } + } + + struct Star { let x, y, r, a: CGFloat } +} + +/// Tiny deterministic RNG so the starfield (and any other decorative layout) is stable. +struct SeededGenerator: RandomNumberGenerator { + private var state: UInt64 + init(seed: UInt64) { state = seed == 0 ? 0xDEAD_BEEF : seed } + mutating func next() -> UInt64 { + state &+= 0x9E3779B97F4A7C15 + var z = state + z = (z ^ (z >> 30)) &* 0xBF58476D1CE4E5B9 + z = (z ^ (z >> 27)) &* 0x94D049BB133111EB + return z ^ (z >> 31) + } +} diff --git a/Arcade85/Shell/Theme.swift b/Arcade85/Shell/Theme.swift new file mode 100644 index 0000000..d476355 --- /dev/null +++ b/Arcade85/Shell/Theme.swift @@ -0,0 +1,35 @@ +import SwiftUI + +/// Shared visual language for the collection: a dark, neon-retro palette that +/// every game and the shell draw from so the app reads as one product. +enum Theme { + // SwiftUI colors (shell UI) + static let background = Color(red: 0.020, green: 0.027, blue: 0.059) + static let backgroundHi = Color(red: 0.043, green: 0.071, blue: 0.149) + static let panel = Color(red: 0.071, green: 0.102, blue: 0.165) + static let accent = Color(red: 0.42, green: 0.94, blue: 0.80) // neon mint + static let accent2 = Color(red: 0.36, green: 0.72, blue: 1.00) // cyan + static let warning = Color(red: 0.96, green: 0.78, blue: 0.23) // amber + static let danger = Color(red: 1.00, green: 0.35, blue: 0.40) // red + static let violet = Color(red: 0.71, green: 0.50, blue: 1.00) + + static func title(_ size: CGFloat) -> Font { .system(size: size, weight: .heavy, design: .rounded) } + static func rounded(_ size: CGFloat, _ weight: Font.Weight = .semibold) -> Font { .system(size: size, weight: weight, design: .rounded) } + static func mono(_ size: CGFloat, _ weight: Font.Weight = .semibold) -> Font { .system(size: size, weight: weight, design: .monospaced) } +} + +/// UIColor / SKColor mirrors of the palette, for use inside SpriteKit scenes. +enum Palette { + static let space0 = UIColor(red: 0.043, green: 0.071, blue: 0.149, alpha: 1) // upper sky + static let space1 = UIColor(red: 0.016, green: 0.024, blue: 0.055, alpha: 1) // lower sky + static let mint = UIColor(red: 0.42, green: 0.94, blue: 0.80, alpha: 1) + static let mintDim = UIColor(red: 0.42, green: 0.94, blue: 0.80, alpha: 0.35) + static let cyan = UIColor(red: 0.36, green: 0.72, blue: 1.00, alpha: 1) + static let amber = UIColor(red: 0.96, green: 0.78, blue: 0.23, alpha: 1) + static let red = UIColor(red: 1.00, green: 0.35, blue: 0.40, alpha: 1) + static let violet = UIColor(red: 0.71, green: 0.50, blue: 1.00, alpha: 1) + static let terrain = UIColor(red: 0.055, green: 0.086, blue: 0.114, alpha: 1) + static let ink = UIColor(red: 0.055, green: 0.086, blue: 0.129, alpha: 1) + static let white70 = UIColor(white: 1, alpha: 0.7) + static let white40 = UIColor(white: 1, alpha: 0.4) +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..f43ba73 --- /dev/null +++ b/README.md @@ -0,0 +1,416 @@ +# Arcade 85 + +A 5-in-1 iOS collection of faithful **HD remakes** of five classic TI-85 +calculator games. Native **SwiftUI + SpriteKit**. + +The games (from the original sources in this repo's sibling folders): + +| Game | Original | Status | +|------|----------|--------| +| **Lunar Lander** | Tiger/Istar, 1997 (`lander/LANDER.C`) | ✅ Playable | +| **ZTetris** | J. Mårdell, 1998 (`zetris/ZTETRIS.ASM`) | ✅ Playable | +| **Phoenix** | P. Davidson, 2008 (`phx4.0ti85/`) | ✅ Playable | +| **Dope Wars** | J.E. Dell, 1984 · engine via J. Gannon's NerdWars, 2000 | ✅ Playable | +| **ZMercury** | P. Davidson, 2004 (`zmercury-ti85/`) | ✅ Playable | +| **Galaxian** | P. Davidson, 1998 (`galaxian-ti85/`) | 💤 Ported, dormant | + +All five collection slots are playable. Galaxian was fully ported, then swapped +out of the line-up for a trading game (too much overlap with Phoenix); its code +stays in the project and swapping one `GameCatalog.swift` entry restores it. +The trading slot first shipped as NerdWars (the TI-85's Drugwars clone), then +was restored to the classic **Dope Wars** setup it secretly was all along — +see the Dope Wars section. + +## Running it + +Requires Xcode 16+ (developed against Xcode 26). + +```sh +open Arcade85/Arcade85.xcodeproj +# pick an iPhone simulator, then Cmd-R +``` + +Or from the command line: + +```sh +cd Arcade85 +xcodebuild -scheme Arcade85 -sdk iphonesimulator \ + -destination 'platform=iOS Simulator,name=iPhone 17' build +``` + +There is no third-party dependency and no code-signing needed for the simulator. +The project uses Xcode "synchronized file groups", so **new files added under +`Arcade85/Arcade85/` are picked up automatically** — no `.pbxproj` editing. + +## Project layout + +``` +Arcade85/Arcade85/ + Arcade85App.swift @main entry point + Shell/ the collection UI, shared across every game + Theme.swift palette + fonts (SwiftUI + SpriteKit mirrors) + Haptics.swift feedback helpers + HighScoreStore.swift per-game best scores (UserDefaults) + GameCatalog.swift game metadata + SKScene factory + RootView.swift home screen (starfield + game cards) + GameHostView.swift full-screen SpriteView host + back button + Games/ + SceneArt.swift procedural gradients, starfields, symbol + sprite textures + ComingSoonScene.swift placeholder scene for the four unbuilt games + Lander/ + LanderSim.swift faithful port of LANDER.C (pure logic) + LanderScene.swift HD rendering, multi-touch thrusters, game flow + ZTetris/ + TetrisSim.swift faithful port of ZTETRIS.ASM (pure logic) + TetrisScene.swift HD rendering, DAS touch controls, game flow + Phoenix/ + PhoenixData.swift sprites (images.asm) + campaign (levels.asm), verbatim + PhoenixSim.swift faithful port of the Z80 game logic + PhoenixScene.swift HD rendering, drag-to-fly control, shop, flow + Galaxian/ (dormant — swapped out of the catalog for Dope Wars) + GalaxianData.swift sprites, formation patterns + 20-level table, verbatim + GalaxianSim.swift faithful port of GALAXIAN.ASM + GalaxianScene.swift HD rendering, drag-to-fly + laser button, flow + DopeWars/ + DopeWarsSim.swift the NerdWars engine restored to Dell's classic setup + DopeWarsScene.swift night-city trading board, event cards, cop chase, flow + ZMercury/ + MercuryData.swift terrain tiles, map, sine table + sprites, verbatim + MercurySim.swift faithful port of the multi-file Z80 sources + MercuryScene.swift HD terrain scroller, parallax, drag-to-fly, flow + Assets.xcassets/ app icon (procedurally generated) + accent color +``` + +## Design approach + +Each game is split into a **pure simulation** and a **SpriteKit scene** that +renders and drives it. The simulation reproduces the original's mechanics +exactly; the scene is where the HD glass goes (neon vector art, particles, +haptics, touch controls). This keeps the remakes honest — the feel comes from +the original numbers, not an approximation. + +### Lunar Lander (the reference implementation) + +`LanderSim` ports `LANDER.C` line-for-line in the original integer space: + +- the Dape/Istar landscape generator (random walk + erosion smoothing passes), +- the 10-wide landing pad carved 4 below the surrounding terrain, +- gravity, the ±2 thruster impulses, horizontal friction, velocity clamping, +- the 8-pixel-footprint landing/crash test (must be flat under all 8 columns + with descent speed ≥ −3), and +- the original scoring: `((90 − maxFuel) × fuel / maxFuel) × maxVel`. + +The sim ticks at the original's real pace — LANDER.C ends every loop pass with +`delay(20)` ≈ 200 ms (the same `delay()` whose 200-unit calls are the ~2 s +message pauses), i.e. **~5 loops/sec** — with rendering interpolated between +ticks so motion stays smooth. Taps shorter than one tick are latched so they +still burn for exactly one loop, like one keypress in the original. + +Deliberate HD liberties (everything else is the original's integer rules, +which hold verbatim on the Moon setting): + +- The field is **128×96** instead of 128×64 — extra sky above the same 0…32 + terrain for a phone-shaped playfield and a longer descent. Every rule is + height-relative, so nothing else changes. +- **Soft walls.** In the original the screen edge was fatal; on touch that + turned a mistimed start tap into an instant "lost in space". Now the top and + sides stop the lander (velocity zeroed) instead of ending the run, the + lander spawns with 7 px of ceiling headroom, and a tap that starts a run is + consumed by the transition — it can never double as a first-tick burn. + Crashing into terrain is the only way to die. +- A **GRAVITY** setting — the remake's third difficulty knob, added because + the original's self-braking lateral friction leaves little to fight: + - **MOON** — the original: pull 1/tick, drift damped every tick; + - **MARS** — pull 1,1,1,2 (avg 1.25), damping every *other* tick; + - **EARTH** — pull 1,2 alternating (avg 1.5), **no damping** — Newtonian + drift you must counter-burn, landing scores **×3** (Mars ×2). + The patterns are phase tables over the tick counter, so the sim stays + integer-exact. + +The scene renders the actual TI-85 8×8 lander bitmap as crisp merged neon +pixels and adds on-screen thruster pads (with true multi-touch so you can fire +lateral + main thrust together), a live V-SPEED / FUEL / SCORE HUD, and +ready / landed / game-over flow. The original's adjustable **FUEL (30–80)** +lives on the ready screen next to **MAX SPEED (4–7)** — the original allowed +speed 3, but there terminal velocity *equals* the safe-touchdown limit and the +game cannot be lost, so the floor is 4. The classic's own defaults (40/7) are +its hardest speed setting, so the remake defaults to a gentler **60 fuel / +speed 4 / Moon**, remembers the player's last choice, and teaches the rule on +screen (`V-SPEED · SAFE ≤3` plus stepper hints). The score formula already +pays more for harder settings; the gravity multiplier extends that to the new +worlds. A 20-assertion standalone harness pins the spawn headroom, wall +clamps, all three pull/damping patterns, the score multipliers, and that +speed 4 remains losable. + +### ZTetris + +`TetrisSim` ports `ZTETRIS.ASM` mechanically — several of its tables are +embedded **verbatim**: + +- the 28-word `BitData` piece table (7 pieces × 4 rotations, four (dy,dx) + offsets packed 2 bits each), decoded exactly like the ASM's `Uncrunch`; +- the well geometry: 10 columns, 16 visible rows + 2 rows of hidden headroom, + spawn at the original (6,16), no wall kicks, moves fail silently; +- `levelcnts` gravity (level 0–20), converted at the TI-85's real interrupt + timing: one main-loop iteration = 4 HALTs ≈ 20 ms, so level 0 = 0.8 s/row; +- scoring: line clears `4/10/30/120 × (level+1)`, plus the hidden units + counter (`scoreU`) — +1 per Down/Drop step *including the blocked one* — + carried into the displayed score ÷10 on each new piece, exactly as `NewB` + does it; +- level = lines ÷ 10 (only increasing, capped at 20), start level 0–9; +- "start high" trash (0–5 → ×2 rows), each row punched with 5 random gaps; +- the 16 per-level background patterns, tiled on the rails beside the well. + +The scene adds the HD glass: colored beveled blocks, a ghost landing outline, +next-piece preview, DAS auto-repeat on held ◄ ► (0.167 s delay, 50 ms repeat), +held soft drop, tap hard drop, both rotation directions, pause, and line-clear +flash/score-pop feedback. The sim has a standalone test harness (68 assertions) +covering piece decode, drop scoring, clears, leveling, trash rows and top-out. + +### Phoenix + +The deepest port: the entire Phoenix 4.0 campaign and economy, extracted from +the Z80 sources file by file: + +- **Campaign** (`levels.asm`): all 31 combat waves + 9 shop stops, with every + power/movement/weapon/fire-rate value and the four pattern paths (circle, + oval, figure-eight, huge oval) transcribed literally; `L_GOTO` chains inlined. +- **Enemy AI** (`emove.asm`): the synchronized rectangle formation wobble + (byte-timer, odd-tick moves, 17-tick phases, −60 entry descent), bosses + (descend then 83/90-px sweeps), bouncers, pattern followers driven by the + original's bit-reversed-timer fractional velocities (`Div_A_16`), rampagers + with the exact trigger columns, and the 4-path swoop system. +- **Weapons**: player F1–F5 with the original damage/speed/offsets (including + F4's alternating sides and F5's arcing swing shots), enemy weapons from + straight drops to the 7-angle-bucket aimed big/huge shots. +- **Economy**: money as dmg-0 "bonus bullets" dropped every 4–11 kills, $ value + by difficulty (100/50/25), cash cap 9900, and the shop's 7 items with the + original prices and purchase rules (shield cap 16, one-time weapons that + auto-select, companion refill). +- **Companion** (`helper.asm`): position-queue follower, 10-damage shots every + 8 frames, its own 16-point shield and explosion. +- **Scoring** (`score16.asm`): shields×1000 + time bonus (19000 counting down + every other frame) + difficulty/speed bonus + cash, awarded on finishing. +- **Sprites** (`images.asm`): all 44 bitmaps rendered as neon pixel art, + including the 16-wide bosses and the 8-frame explosion. + +Touch layer: drag anywhere to fly (original ±2/±1-px-per-frame speed limits +still govern the ship), always-on autofire at the original 10/4-frame cadence, +tap weapon selector, pause, and full title → shop → victory/game-over flow at +the original 25/29/35 fps speed options. Sim verified by a 172-assertion +standalone harness (progress additions covered by a follow-up suite). + +**Progress scoring (remake addition).** The original only scored a *finished* +campaign (`score16.asm`), which on the phone meant the high score sat at 0 +until you beat all 31 waves. The sim now tracks `wavesCleared` and +`totalEarned` (lifetime $, unspent or not), and every run posts +`waves × 400 + earnings` — a death shows `WAVE n/31 · SCORE`, and a victory +adds the untouched score16 tally (shields/time/bonus/cash) on top, itemised +as a PROGRESS line in the classic victory breakdown. + +The 2:1 TI-85 window is drawn **full-bleed** with a **2× vertical stretch on +entity positions** while the sprites themselves keep a mild 1.25× arcade-monitor +stretch — the battle fills the phone instead of sitting in a letterboxed strip, +and the pixel art stays crisp. Sim geometry and collisions are untouched — the +visible window itself can't widen, because the original parks and spawns +entities just outside the y 32…96 band. + +### Galaxian + +`GalaxianSim` ports `GALAXIAN.ASM` (v3.0) at its ~35 fps frame rate: + +- **Formation choreography**: each slot's pattern byte is *both* entry time + and formation depth — an enemy triggers when `timer & 127 == 128 - depth`, + descends 1 px/frame, and the 128-frame timer wrap locks it into formation + exactly at its row. The whole formation then sways ±32 px on timer bit 6. +- **Swoops**: the original's 8-stage dive state machine (types 5–12: up/out, + arc over, dive at double speed), started by the R-register roll + (`R < 19/128` on every 4th frame), aimed away from the screen edge, and + rejoining the entry queue at the bottom for −1 point. +- **20 levels** from `levels_jump_table`: plain waves, the ring formation, + mixed weak/strong waves (13 power-1 + 7 of the level type), bouncing cross + trainers (exactly half of which can flee, −50), aim-shooting "operator" + ships, patrolling 10-hit bosses, and two 98-hit superbosses that deploy + drones mid-fight (−200 each). +- **Weapons**: one cannon bullet per press from a 10-slot pool (+10 per hit, + +100 per kill), and 9 lasers that wipe an entire column but never hurt a + boss. Enemy bullets come in 5 drift types picked by your position. +- **Scoring** exactly as documented: +200 per level, +25 per boss hit, +1000 + per boss kill, −16×16 per death, +5000 victory. + +The scene adds drag-to-fly (4-way, original 1 px/frame speed), always-on +autofire, a big LASER button with the remaining count, wave banners, and the +9-lives / 9-lasers HUD. Sim verified by a 129-assertion standalone harness. + +### ZMercury + +`MercurySim` ports the multi-file 2004 sources — a fully deterministic +horizontal cave-shooter (the original contains *no* randomness at all): + +- **Terrain scroller**: 1 px/frame leftward; every 8 frames a new 8-px tile + column enters from a 64-column looping map (9th map row = wave triggers). + The buffer's polarity quirk (bits set = open sky) and the one-byte offset + between sprite space and terrain space are both preserved. +- **Waves**: straight flyers, aimed-fire phoenixes, sine-bobbing spinners, + turret bases mounted on their map pad tiles (ceiling *and* floor), spin-T + sine crossers, an open-space gate that halts the map until the field is + clear, and a 50-hit boss that holds the right edge firing bullet pairs. +- **Damage model**: 100 shield points; every ship corner touching rock costs + 1 per frame, enemy bullets cost 5, rams cost 1 (and hurt the enemy back). + Kills pay +1 immediately and +20 when the explosion finishes — the + original's BCD scoring, faithfully odd. +- **Aimed fire**: the shallow-cone rule — bullets angle up/down only when + the vertical offset beats deltaX/4 — plus per-slot fire stagger. + +The scene renders the terrain from prebuilt map-column textures that slide +with the sim's scroll counter — full-bleed, positions/terrain stretched 1.9× +vertically (sprites 1.35×), every rock pixel facing open air lit as a glowing +rim over a dark rock mass — plus drifting star layers, a slower stalactite +silhouette band for cave depth, and the original ~28.6 fps (`timer ≥ 7` +against the ~200 Hz interrupt). Sim verified by an 81-assertion standalone +harness. + +### Dope Wars + +The genre swap for the fifth slot — and a restoration story. The engine is the +verbatim port of **NerdWars** (J. Gannon, 2000), the TI-85's only +Drugwars-style game, decoded from its `.85p`. Reading the BASIC revealed that +Gannon had kept John E. Dell's original **Drug Wars (1984)** item variables +`C,H,A,W,S,L` — Cocaine, Heroin, Acid, Weed, Speed, Ludes — and merely +rescaled the price bands and renamed the nouns. `DopeWarsSim` reverses the +re-skin: Dell's classic setup on Gannon's proven engine. + +- **The month**: $2,000 cash, the classic **$5,500** debt to the loan shark + growing 10%/day, a 6%/day bank (shark and bank live in the Bronx), a + 100-pocket trench coat, and 30 subway rides between six boroughs (Bronx, + Ghetto, Central Park, Manhattan, Coney Island, Brooklyn); each ride rerolls + the six prices plus one 0…20 event roll. +- **Market** (Dell's iconic bands): Cocaine 15000–30000 · Heroin 5000–14000 · + Acid 1000–4500 · Weed 300–900 · Speed 90–250 · Ludes 10–60, bent by events: + cheap heroin at 850–1999, "Cops made a big bust!" heroin at 18000–42999, + $80,000+ cocaine manias, $2 pharmacy-raid ludes, weed and acid floods, a + subway mugging (keep 2/3), $200-coat and $400-gun offers (Baretta / + .38 Special / Saturday Night Special), free drugs on a dead dude — and the + weed on the sidewalk that always ends in one last wild trip. +- **Officer Hardass**: carrying 50+ units can trigger a chase — run (50/50; + escaping rerolls the day, possibly straight into another event) or fight + with a gun; every fight round draws return fire (+3 wounds, 50 = death), + and dropping the whole squad loots Hardass's body ($750–1999) with a + $1,000 doctor offer if you can afford it. +- **Scoring**: your **final net worth in dollars** (cash + bank − debt) is + the high score — "$13.4M" beats "$2.1M", the way a trading game should + brag. (Dell's `√(net ÷ 31.5)` 0–100 rating is still computed in the sim + for the curious; the old 0–100 stored best migrates to $0 once.) +- **The market grows with you (remake extension).** Below $100k net worth + the game is exactly the classic. Cross **$100k** and the ludes slot + retires — any stock is bought out at yesterday's price — and **METH** + moves in at $2,000–16,000, the widest swing on the board. Cross **$1M** + and speed retires for **CHINA WHITE** at $40,000–160,000, the whale + product that dwarfs even a cocaine mania. Shifts are one-way, announced + as street-word cards on arrival, and bring their own events on formerly + idle rolls of the 0…20 table: a Jersey meth-lab explosion spikes local + product to $30–48k (the tier-2 face of the old $2-ludes roll), a superlab + dump floors meth at $400–999, and the cartel flooding the docks drops + China White to $8–20k. The dead-dude loot names the tier's product — + yes, you can find china white on a dead dude in the subway. +- **The streets got real (round-5 extensions).** Each borough now prices its + own way — multipliers on the daily band rolls (Bronx neutral; event prices + are absolute news and ignore the bias): heroin and speed run cheap in the + Ghetto, acid and weed in the Park, everything's sleepy-cheap on Coney, + Manhattan's rich buyers pay up to +30%, Brooklyn's fences pay a little + over — so routing (buy in the Park, sell in Manhattan) is a real strategy, + and the subway sheet captions each borough's economy. Some days **word on + the street** names a product and a borough for tomorrow — ride there to + find out if the tip was good (×3 spike or ÷3 glut) or street garbage + (about 1 in 4). And the debt finally has teeth: run a **$15,000+ tab past + day 10** and you get one warning before the shark's two leg-breakers start + jumping you — the classic chase engine with his collection money as loot, + amber sodium strobe, and a nastier ending ("THE SHARK COLLECTED") if they + put you down. Rumors and shark muscle roll on a separate RNG stream, so + classic price/event sequences per seed stay byte-identical. +- **Month lengths**: 30 / 60 / 90 days or **endless** on the ready screen — + endless has no clock and posts no score (interest caps keep marathon runs + from overflowing). Amount sheets have a MAX chip, and tapping the number + opens an in-game keypad to type any amount directly (DONE trims to the + limit). +- **Engine quirks kept**: the dead-dude loot roll can never grant cocaine + (`int(rand*5)` is 0…4 over the cheap-to-dear order); the shark fronts at + most $5,000 *per visit* but unlimited visits; the final ride ends the month + with no fresh roll. One NerdWars quirk was *dropped* with the re-theme: + trading matched items **by price** (`If F==C …`), which could fill/empty + several pockets at once — no longer authentic to the classic fiction, so + trading is by item, the way Dell's original worked (the harness pins the + new behaviour with a regression test). + +The scene wraps it in a night-city board — skyline silhouettes with lit +windows, sodium-lamp glow, gradient market rows with day-over-day ▲▼ movement +arrows and reroll flashes (arrows sit out a tier-shift day, since yesterday's +prices belong to retired products) — plus quantity-chip trade sheets, +SUBWAY / SHARK / BANK / END actions, the original's Pause screens as +tap-through event cards, and a RUN / FIGHT chase overlay under red/blue +strobe light. The ready screen states the rules as a plain bulleted list and +carries the 30/60/90/∞ month picker. Sim verified by a 133-assertion +standalone harness covering the classic engine end-to-end plus every +extension: tier mechanics (bands, liquidation, one-way + double promotion, +tier events and their tier-1 no-ops, tier-aware loot naming), borough bias +math and event-absolute pricing, rumor spawn/payout/garbage/missed/final-day +gating, the shark warning → chase → loot/death paths, and month-length / +endless / interest-cap behaviour. + +## The HD art pass + +A collection-wide visual up-level (round 3 of feedback: "still a little too +simple… as if they are straight ports"). Shared toolkit in `SceneArt.swift`: +radial glow textures, gradient panel textures, programmatic particle emitters +(spark bursts, thrust/trail flames, ambient dust), vignettes, screen-shake and +flash actions. Per game, all render-layer only — every sim stays verbatim: + +- **Lander**: full-bleed field; terrain rebuilt as gradient rock with speckle + grain and a lit crust hugging the skyline, over a distant ridge silhouette; + particle exhaust jets + engine glow instead of triangle flames; pulsing pad + light-cone and sequenced approach beacons; touchdown dust ring; crash + flash + spark burst + tumbling debris + screen shake; nebula blooms, + two-depth starfield, drifting dust, vignette. +- **Phoenix**: full-bleed field (2× position / 1.25× sprite stretch); sprites + shaded top-lit so they read as bodies, not flat clusters; engine trail and + banking tilt on the ship; particle explosions; screen shake + red flash on + hits; WAVE / BOSS banners; two scrolling star layers over static far stars. +- **ZMercury**: full-bleed canyon (1.9× / 1.35×); terrain columns re-rendered + with glowing rim pixels on every air-facing edge over dark rock; a slow + stalactite/stalagmite silhouette band behind the real walls; engine trail, + scrape sparks + shake, kill sparks synced to the original explosion frames, + and a proper going-out blast. +- **Dope Wars**: built HD from the start (see its section). +- **ZTetris**: untouched — it set the bar. + +## Porting notes + +Tip from the ZTetris port: the 1990s sources use extended-ASCII + CRLF, which +makes `grep` treat them as binary — strip with +`tr -d '\r' < FILE | tr -c '[:print:]\n\t' '?'` first, then the ASM tables +(pieces, speeds, scoring) can be read and ported directly. + +NerdWars (the Dope Wars engine) arrived as a `.85p` Graph Link file rather +than source — but that format's ASCII mode stores TI-85 BASIC nearly as plain +text, so a ~20-line decoder mapping the few special bytes (0xD6 newline, +0x1C the STO→ arrow, 0x19 ≥, 0x1A negate, 0x10 √) recovers the entire +listing. + +## Notes + +- Portrait-only, status bar hidden, targets iOS 17+. +- The app icon is generated by `scripts`-free CoreGraphics (see the git history + / the 1024px asset in `Assets.xcassets`). +- `#if DEBUG` launch hooks exist for screenshots/tests and are stripped from + Release builds: + - `ARCADE_DIRECT_GAME=` — open straight into a game. + - `ARCADE_AUTOPLAY=1` — start the run immediately (any game). + - `ARCADE_DEMO=1` — freeze a staged mid-game pose (any game). + - `ARCADE_DEMO_VIEW=buy|chase|tier3|over|ride|keypad|sharkchase|endless` — + with Dope Wars' demo, pose the buy sheet, cop chase, tier-3 board + (Meth + China White), net-worth game-over, borough-captioned subway + sheet, amount keypad, leg-breaker chase, or an endless-mode board. + - `ARCADE_SHOP=1` — open Phoenix's shop stocked with cash. + - `ARCADE_GAMEOVER=1` — pose Phoenix's death card mid-campaign (progress score). + + e.g. `SIMCTL_CHILD_ARCADE_DIRECT_GAME=lander xcrun simctl launch booted com.albanese.arcade85`