From 485e657296c38b1801505b649871f51e0ad237c8 Mon Sep 17 00:00:00 2001 From: Winter Hille Date: Mon, 27 Jan 2025 00:00:47 -0800 Subject: [PATCH] initial --- .gitignore | 1 + Cargo.lock | 142 ++++++ Cargo.toml | 8 + flake.lock | 61 +++ flake.nix | 27 + site/assets/favicon.svg | 3 + site/pages/about.md | 7 + site/pages/main.md | 3 + site/styles/style.css | 271 ++++++++++ site/templates/error.html | 54 ++ site/templates/main.html | 34 ++ site/wasm/cursor/.cargo/config.toml | 2 + site/wasm/cursor/Cargo.lock | 144 ++++++ site/wasm/cursor/Cargo.toml | 10 + site/wasm/cursor/build.rs | 22 + site/wasm/cursor/pkg/wasm_cursor.d.ts | 37 ++ site/wasm/cursor/pkg/wasm_cursor.js | 474 ++++++++++++++++++ site/wasm/cursor/pkg/wasm_cursor_bg.wasm | Bin 0 -> 150802 bytes site/wasm/cursor/pkg/wasm_cursor_bg.wasm.d.ts | 10 + site/wasm/cursor/src/lib.rs | 99 ++++ src/main.rs | 139 +++++ 21 files changed, 1548 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 site/assets/favicon.svg create mode 100644 site/pages/about.md create mode 100644 site/pages/main.md create mode 100644 site/styles/style.css create mode 100644 site/templates/error.html create mode 100644 site/templates/main.html create mode 100644 site/wasm/cursor/.cargo/config.toml create mode 100644 site/wasm/cursor/Cargo.lock create mode 100644 site/wasm/cursor/Cargo.toml create mode 100644 site/wasm/cursor/build.rs create mode 100644 site/wasm/cursor/pkg/wasm_cursor.d.ts create mode 100644 site/wasm/cursor/pkg/wasm_cursor.js create mode 100644 site/wasm/cursor/pkg/wasm_cursor_bg.wasm create mode 100644 site/wasm/cursor/pkg/wasm_cursor_bg.wasm.d.ts create mode 100644 site/wasm/cursor/src/lib.rs create mode 100644 src/main.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..eb5a316 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..3946387 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,142 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "bunbun_dev" +version = "0.1.0" +dependencies = [ + "fluffle", + "markdown", +] + +[[package]] +name = "fluffle" +version = "0.1.0" +source = "git+https://codeberg.org/bunbun/fluffle#7e7a9a9a9a5a1a2137e3635d182a1b920f21a91c" +dependencies = [ + "lazy-regex", +] + +[[package]] +name = "lazy-regex" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d8e41c97e6bc7ecb552016274b99fbb5d035e8de288c582d9b933af6677bfda" +dependencies = [ + "lazy-regex-proc_macros", + "once_cell", + "regex", +] + +[[package]] +name = "lazy-regex-proc_macros" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76e1d8b05d672c53cb9c7b920bbba8783845ae4f0b076e02a3db1d02c81b4163" +dependencies = [ + "proc-macro2", + "quote", + "regex", + "syn", +] + +[[package]] +name = "markdown" +version = "1.0.0-alpha.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6491e6c702bf7e3b24e769d800746d5f2c06a6c6a2db7992612e0f429029e81" +dependencies = [ + "unicode-id", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + +[[package]] +name = "proc-macro2" +version = "1.0.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "syn" +version = "2.0.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-id" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10103c57044730945224467c09f71a4db0071c123a0648cc3e818913bde6b561" + +[[package]] +name = "unicode-ident" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..694c483 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "bunbun_dev" +version = "0.1.0" +edition = "2021" + +[dependencies] +fluffle = { git = "https://codeberg.org/bunbun/fluffle", features = [] } +markdown = "1.0.0-alpha.21" diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..bce9093 --- /dev/null +++ b/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1730785428, + "narHash": "sha256-Zwl8YgTVJTEum+L+0zVAWvXAGbWAuXHax3KzuejaDyo=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "4aa36568d413aca0ea84a1684d2d46f55dbabad7", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..a7ad271 --- /dev/null +++ b/flake.nix @@ -0,0 +1,27 @@ +{ + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = { self, nixpkgs, flake-utils }: + flake-utils.lib.eachDefaultSystem (system: + let pkgs = nixpkgs.legacyPackages.${system}; + in with pkgs; { + packages.default = rustPlatform.buildRustPackage { + inherit ((lib.importTOML ./Cargo.toml).package) name; + + src = ./.; + + cargoLock.lockFile = ./Cargo.lock; + + nativeBuildInputs = [ pkg-config ]; + }; + + devShells.default = mkShell { + nativeBuildInputs = [ pkg-config ]; + + buildInputs = [ rustc cargo wasm-bindgen-cli lld ]; + }; + }); +} diff --git a/site/assets/favicon.svg b/site/assets/favicon.svg new file mode 100644 index 0000000..a3cfe80 --- /dev/null +++ b/site/assets/favicon.svg @@ -0,0 +1,3 @@ + + + diff --git a/site/pages/about.md b/site/pages/about.md new file mode 100644 index 0000000..ba89cd1 --- /dev/null +++ b/site/pages/about.md @@ -0,0 +1,7 @@ +### About Me + +... + +### About the Website + +... diff --git a/site/pages/main.md b/site/pages/main.md new file mode 100644 index 0000000..93bf3ad --- /dev/null +++ b/site/pages/main.md @@ -0,0 +1,3 @@ +## Welcome to my Website + +Hello! I'm Winter and this is my website... _Why are you here?_ diff --git a/site/styles/style.css b/site/styles/style.css new file mode 100644 index 0000000..2ebd029 --- /dev/null +++ b/site/styles/style.css @@ -0,0 +1,271 @@ +@import url("https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap"); +@import url("https://fonts.googleapis.com/css2?family=Roboto+Condensed:ital,wght@0,100..900;1,100..900&display=swap"); +@import url("https://fonts.googleapis.com/css2?family=Roboto+Flex:opsz,wght@8..144,100..1000&display=swap"); +@import url("https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,100..700;1,100..700&display=swap"); +@import url("https://fonts.googleapis.com/css2?family=Roboto+Serif:ital,opsz,wght@0,8..144,100..900;1,8..144,100..900&display=swap"); +@import url("https://fonts.googleapis.com/css2?family=Roboto+Slab:wght@100..900&display=swap"); + +:root { + --serif-font: "Roboto Serif", serif; + --sans-serif-font: "Roboto", sans-serif; + --monospace-font: "Roboto Mono", monospace; + + --white-10: #ffffff; + --white-20: #ebebeb; + --white-30: #d6d6d6; + --white-40: #c2c2c2; + --white-50: #adadad; + + --black-10: #525252; + --black-20: #3d3d3d; + --black-30: #292929; + --black-40: #141414; + --black-50: #000000; +} + +:root { + --foreground: var(--white-10); + --background: var(--black-50); + + --accent-10: var(--black-10); + --accent-20: var(--black-20); + --accent-30: var(--black-30); + --accent-40: var(--black-40); + --accent-50: var(--white-50); +} + +@media (prefers-color-scheme: light) { + :root { + --foreground: var(--black-50); + --background: var(--white-10); + + --accent-10: var(--white-50); + --accent-20: var(--white-40); + --accent-30: var(--white-30); + --accent-40: var(--white-20); + --accent-50: var(--black-10); + } +} + +* { + cursor: none; +} + +body { + display: flex; + flex-direction: column; + box-sizing: border-box; + margin: 0; + background: var(--background); + padding: 2em; + min-height: 100vh; + color: var(--foreground); + font-family: var(--sans-serif-font); +} + +body>header { + display: flex; + position: sticky; + top: 0; + justify-content: space-between; + margin-top: -1em; + border-bottom: 0.1em solid var(--accent-50); + background: var(--background); + padding: 0.5em; +} + +body>header>a { + color: var(--foreground); + font-weight: 500; + font-size: 2em; + text-decoration: none; + + &::after { + content: "_"; + } + + &:hover::after { + animation: blink 0.5s alternate infinite; + } +} + +@keyframes blink { + to { + opacity: 0; + } + + from { + opacity: 1; + } +} + +body>header>nav { + display: flex; + align-items: center; +} + +body>header>nav>a { + color: var(--foreground); + text-decoration: none; + + &:hover { + text-decoration: underline; + } +} + +body>.content { + flex: 1; + padding: 1em; + overflow-y: hidden; +} + +body>.content>main { + min-width: auto; +} + +body>.content>main { + min-width: 60ch; + + /* paragraphs */ + p { + margin: 0; + color: var(--accent-50); + } + + >p { + margin-block-start: 1em; + margin-block-end: 1em; + } + + /* headings */ + h1, + h2, + h3, + h4, + h5, + h6 { + margin: 0; + } + + > :is(h1, h2, h3, h4, h5, h6) { + margin-block-start: 1em; + margin-block-end: 1em; + } + + /* links */ + a { + color: var(--foreground); + text-decoration: none; + + &:hover { + text-decoration: underline; + } + } + + /* images */ + img { + border-radius: 0.26em; + } + + /* block qutoes */ + blockquote { + display: block; + margin: 0; + margin-left: 1em; + margin-block-start: 1em; + border-left: 0.2em solid var(--accent-40); + padding-left: 0.5em; + } + + /* lists */ + ul, + ol { + margin: 0; + padding-left: 2em; + color: var(--accent-50); + + li { + margin: 0; + } + + li::marker { + color: var(--foreground); + } + } + + > :is(ul, ol) { + margin-block-start: 1em; + margin-block-end: 1em; + } + + /* horizontal rule */ + hr { + margin: 1em 0; + border: none; + border-bottom: 0.1em solid var(--accent-50); + } + + /* inline code */ + p>code { + display: inline-block; + border-radius: 0.23em; + background: var(--accent-40); + padding: 0.2em; + color: var(--foreground); + font-size: 0.8em; + line-height: 1; + font-family: var(--monospace-font); + } + + /* code blocks */ + pre { + display: block; + margin: 1em 0; + border-radius: 0.26em; + background: var(--accent-40); + padding: 0.8em; + width: fit-content; + overflow: hidden; + } + + pre>code { + font-size: 0.8em; + font-family: var(--monospace-font); + } +} + +body>footer { + padding: 0.5em; + color: var(--accent-10); + white-space: nowrap; +} + +body>footer>a { + display: inline-block; + margin: -0.2em 0; + border-radius: 0.23em; + background: #42a5f54d; + padding: 0.2em; + color: #42a5f5; + line-height: 1; + text-decoration: none; + + &:hover { + text-decoration: underline; + } +} + +.cursor { + position: fixed; + transform: translate(-50%, -50%); + visibility: visible; + z-index: 999; + backdrop-filter: invert(100%); + transition: + width 200ms, + height 200ms; + border-radius: 50%; + width: 12px; + height: 12px; + pointer-events: none; +} diff --git a/site/templates/error.html b/site/templates/error.html new file mode 100644 index 0000000..b9d94ba --- /dev/null +++ b/site/templates/error.html @@ -0,0 +1,54 @@ + + + + + + {{code}} {{message}} + + + + +

{{code}}

+

{{message}}

+ + diff --git a/site/templates/main.html b/site/templates/main.html new file mode 100644 index 0000000..b4db63a --- /dev/null +++ b/site/templates/main.html @@ -0,0 +1,34 @@ + + + + + + + + bunbun.dev + + + +
+ bunbun.dev + +
+
+
{{content}}
+
+ + + + + diff --git a/site/wasm/cursor/.cargo/config.toml b/site/wasm/cursor/.cargo/config.toml new file mode 100644 index 0000000..f4e8c00 --- /dev/null +++ b/site/wasm/cursor/.cargo/config.toml @@ -0,0 +1,2 @@ +[build] +target = "wasm32-unknown-unknown" diff --git a/site/wasm/cursor/Cargo.lock b/site/wasm/cursor/Cargo.lock new file mode 100644 index 0000000..2b8a4c9 --- /dev/null +++ b/site/wasm/cursor/Cargo.lock @@ -0,0 +1,144 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "js-sys" +version = "0.3.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + +[[package]] +name = "proc-macro2" +version = "1.0.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "syn" +version = "2.0.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" + +[[package]] +name = "wasm-bindgen" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +dependencies = [ + "cfg-if", + "once_cell", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" + +[[package]] +name = "wasm_cursor" +version = "0.0.0" +dependencies = [ + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +dependencies = [ + "js-sys", + "wasm-bindgen", +] diff --git a/site/wasm/cursor/Cargo.toml b/site/wasm/cursor/Cargo.toml new file mode 100644 index 0000000..3da642f --- /dev/null +++ b/site/wasm/cursor/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "wasm_cursor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +wasm-bindgen = "=0.2.95" +web-sys = { version = "0.3.72", features = ["CssStyleDeclaration", "Document", "HtmlElement", "MouseEvent", "NodeList", "Window"] } diff --git a/site/wasm/cursor/build.rs b/site/wasm/cursor/build.rs new file mode 100644 index 0000000..70b3a8b --- /dev/null +++ b/site/wasm/cursor/build.rs @@ -0,0 +1,22 @@ +use std::{path::Path, process::Command}; + +fn main() { + /* + println!("cargo::rerun-if-changed=target/wasm32-unknown-unknown/debug/wasm_cursor.wasm"); + + let out = Command::new("wasm-bindgen") + .args(&[ + "./target/wasm32-unknown-unknown/debug/wasm_cursor.wasm", + "--out-dir", + "pkg", + "--target", + "web", + ]) + .output() + .unwrap(); + + if !out.status.success() { + panic!("{}", String::from_utf8_lossy(&out.stderr)); + } + */ +} diff --git a/site/wasm/cursor/pkg/wasm_cursor.d.ts b/site/wasm/cursor/pkg/wasm_cursor.d.ts new file mode 100644 index 0000000..6e9cf7c --- /dev/null +++ b/site/wasm/cursor/pkg/wasm_cursor.d.ts @@ -0,0 +1,37 @@ +/* tslint:disable */ +/* eslint-disable */ +export function main(): void; + +export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; + +export interface InitOutput { + readonly memory: WebAssembly.Memory; + readonly main: () => void; + readonly __wbindgen_malloc: (a: number, b: number) => number; + readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; + readonly __wbindgen_export_2: WebAssembly.Table; + readonly _dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h00af0edcf808575b: (a: number, b: number, c: number) => void; + readonly __wbindgen_exn_store: (a: number) => void; + readonly __wbindgen_start: () => void; +} + +export type SyncInitInput = BufferSource | WebAssembly.Module; +/** +* Instantiates the given `module`, which can either be bytes or +* a precompiled `WebAssembly.Module`. +* +* @param {{ module: SyncInitInput }} module - Passing `SyncInitInput` directly is deprecated. +* +* @returns {InitOutput} +*/ +export function initSync(module: { module: SyncInitInput } | SyncInitInput): InitOutput; + +/** +* If `module_or_path` is {RequestInfo} or {URL}, makes a request and +* for everything else, calls `WebAssembly.instantiate` directly. +* +* @param {{ module_or_path: InitInput | Promise }} module_or_path - Passing `InitInput` directly is deprecated. +* +* @returns {Promise} +*/ +export default function __wbg_init (module_or_path?: { module_or_path: InitInput | Promise } | InitInput | Promise): Promise; diff --git a/site/wasm/cursor/pkg/wasm_cursor.js b/site/wasm/cursor/pkg/wasm_cursor.js new file mode 100644 index 0000000..437d54b --- /dev/null +++ b/site/wasm/cursor/pkg/wasm_cursor.js @@ -0,0 +1,474 @@ +let wasm; + +const heap = new Array(128).fill(undefined); + +heap.push(undefined, null, true, false); + +function getObject(idx) { return heap[idx]; } + +let heap_next = heap.length; + +function dropObject(idx) { + if (idx < 132) return; + heap[idx] = heap_next; + heap_next = idx; +} + +function takeObject(idx) { + const ret = getObject(idx); + dropObject(idx); + return ret; +} + +function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + + heap[idx] = obj; + return idx; +} + +function debugString(val) { + // primitive types + const type = typeof val; + if (type == 'number' || type == 'boolean' || val == null) { + return `${val}`; + } + if (type == 'string') { + return `"${val}"`; + } + if (type == 'symbol') { + const description = val.description; + if (description == null) { + return 'Symbol'; + } else { + return `Symbol(${description})`; + } + } + if (type == 'function') { + const name = val.name; + if (typeof name == 'string' && name.length > 0) { + return `Function(${name})`; + } else { + return 'Function'; + } + } + // objects + if (Array.isArray(val)) { + const length = val.length; + let debug = '['; + if (length > 0) { + debug += debugString(val[0]); + } + for(let i = 1; i < length; i++) { + debug += ', ' + debugString(val[i]); + } + debug += ']'; + return debug; + } + // Test for built-in + const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); + let className; + if (builtInMatches.length > 1) { + className = builtInMatches[1]; + } else { + // Failed to match the standard '[object ClassName]' + return toString.call(val); + } + if (className == 'Object') { + // we're a user defined class or Object + // JSON.stringify avoids problems with cycles, and is generally much + // easier than looping through ownProperties of `val`. + try { + return 'Object(' + JSON.stringify(val) + ')'; + } catch (_) { + return 'Object'; + } + } + // errors + if (val instanceof Error) { + return `${val.name}: ${val.message}\n${val.stack}`; + } + // TODO we could test for more things here, like `Set`s and `Map`s. + return className; +} + +let WASM_VECTOR_LEN = 0; + +let cachedUint8ArrayMemory0 = null; + +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; +} + +const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); + +const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' + ? function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +} + : function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; +}); + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8ArrayMemory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +let cachedDataViewMemory0 = null; + +function getDataViewMemory0() { + if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) { + cachedDataViewMemory0 = new DataView(wasm.memory.buffer); + } + return cachedDataViewMemory0; +} + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); +} + +const CLOSURE_DTORS = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(state => { + wasm.__wbindgen_export_2.get(state.dtor)(state.a, state.b) +}); + +function makeMutClosure(arg0, arg1, dtor, f) { + const state = { a: arg0, b: arg1, cnt: 1, dtor }; + const real = (...args) => { + // First up with a closure we increment the internal reference + // count. This ensures that the Rust closure environment won't + // be deallocated while we're invoking it. + state.cnt++; + const a = state.a; + state.a = 0; + try { + return f(a, state.b, ...args); + } finally { + if (--state.cnt === 0) { + wasm.__wbindgen_export_2.get(state.dtor)(a, state.b); + CLOSURE_DTORS.unregister(state); + } else { + state.a = a; + } + } + }; + real.original = state; + CLOSURE_DTORS.register(real, state, state); + return real; +} +function __wbg_adapter_16(arg0, arg1, arg2) { + wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h00af0edcf808575b(arg0, arg1, addHeapObject(arg2)); +} + +export function main() { + wasm.main(); +} + +function isLikeNone(x) { + return x === undefined || x === null; +} + +function handleError(f, args) { + try { + return f.apply(this, args); + } catch (e) { + wasm.__wbindgen_exn_store(addHeapObject(e)); + } +} + +async function __wbg_load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); + + } catch (e) { + if (module.headers.get('Content-Type') != 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + + } else { + throw e; + } + } + } + + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + + } else { + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + + } else { + return instance; + } + } +} + +function __wbg_get_imports() { + const imports = {}; + imports.wbg = {}; + imports.wbg.__wbindgen_cb_drop = function(arg0) { + const obj = takeObject(arg0).original; + if (obj.cnt-- == 1) { + obj.a = 0; + return true; + } + const ret = false; + return ret; + }; + imports.wbg.__wbindgen_object_clone_ref = function(arg0) { + const ret = getObject(arg0); + return addHeapObject(ret); + }; + imports.wbg.__wbg_instanceof_Window_6575cd7f1322f82f = function(arg0) { + let result; + try { + result = getObject(arg0) instanceof Window; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }; + imports.wbg.__wbg_document_d7fa2c739c2b191a = function(arg0) { + const ret = getObject(arg0).document; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }; + imports.wbg.__wbg_body_8e909b791b1745d3 = function(arg0) { + const ret = getObject(arg0).body; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }; + imports.wbg.__wbg_createElement_e4523490bd0ae51d = function() { return handleError(function (arg0, arg1, arg2) { + const ret = getObject(arg0).createElement(getStringFromWasm0(arg1, arg2)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_querySelectorAll_28e417f74795a70f = function() { return handleError(function (arg0, arg1, arg2) { + const ret = getObject(arg0).querySelectorAll(getStringFromWasm0(arg1, arg2)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_setclassName_4b7637091f940659 = function(arg0, arg1, arg2) { + getObject(arg0).className = getStringFromWasm0(arg1, arg2); + }; + imports.wbg.__wbg_instanceof_HtmlElement_aab18e065dc9207d = function(arg0) { + let result; + try { + result = getObject(arg0) instanceof HTMLElement; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }; + imports.wbg.__wbg_style_04eb1488bc2ceffc = function(arg0) { + const ret = getObject(arg0).style; + return addHeapObject(ret); + }; + imports.wbg.__wbg_setProperty_b9a2384cbfb499fb = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) { + getObject(arg0).setProperty(getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4)); + }, arguments) }; + imports.wbg.__wbg_type_739ef24b64f58229 = function(arg0, arg1) { + const ret = getObject(arg1).type; + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbg_addEventListener_4357f9b7b3826784 = function() { return handleError(function (arg0, arg1, arg2, arg3) { + getObject(arg0).addEventListener(getStringFromWasm0(arg1, arg2), getObject(arg3)); + }, arguments) }; + imports.wbg.__wbg_clientX_a8eebf094c107e43 = function(arg0) { + const ret = getObject(arg0).clientX; + return ret; + }; + imports.wbg.__wbg_clientY_ffe0a79af8089cd4 = function(arg0) { + const ret = getObject(arg0).clientY; + return ret; + }; + imports.wbg.__wbg_appendChild_bc4a0deae90a5164 = function() { return handleError(function (arg0, arg1) { + const ret = getObject(arg0).appendChild(getObject(arg1)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_length_9a6b70327f5f86e1 = function(arg0) { + const ret = getObject(arg0).length; + return ret; + }; + imports.wbg.__wbg_get_602f2a39a831c929 = function(arg0, arg1) { + const ret = getObject(arg0)[arg1 >>> 0]; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }; + imports.wbg.__wbg_newnoargs_1ede4bf2ebbaaf43 = function(arg0, arg1) { + const ret = new Function(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_call_a9ef466721e824f2 = function() { return handleError(function (arg0, arg1) { + const ret = getObject(arg0).call(getObject(arg1)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_globalThis_05c129bf37fcf1be = function() { return handleError(function () { + const ret = globalThis.globalThis; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_self_bf91bf94d9e04084 = function() { return handleError(function () { + const ret = self.self; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_window_52dd9f07d03fd5f8 = function() { return handleError(function () { + const ret = window.window; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_global_3eca19bb09e9c484 = function() { return handleError(function () { + const ret = global.global; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbindgen_is_undefined = function(arg0) { + const ret = getObject(arg0) === undefined; + return ret; + }; + imports.wbg.__wbindgen_debug_string = function(arg0, arg1) { + const ret = debugString(getObject(arg1)); + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbindgen_object_drop_ref = function(arg0) { + takeObject(arg0); + }; + imports.wbg.__wbindgen_throw = function(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }; + imports.wbg.__wbindgen_rethrow = function(arg0) { + throw takeObject(arg0); + }; + imports.wbg.__wbindgen_closure_wrapper66 = function(arg0, arg1, arg2) { + const ret = makeMutClosure(arg0, arg1, 13, __wbg_adapter_16); + return addHeapObject(ret); + }; + + return imports; +} + +function __wbg_init_memory(imports, memory) { + +} + +function __wbg_finalize_init(instance, module) { + wasm = instance.exports; + __wbg_init.__wbindgen_wasm_module = module; + cachedDataViewMemory0 = null; + cachedUint8ArrayMemory0 = null; + + + wasm.__wbindgen_start(); + return wasm; +} + +function initSync(module) { + if (wasm !== undefined) return wasm; + + + if (typeof module !== 'undefined') { + if (Object.getPrototypeOf(module) === Object.prototype) { + ({module} = module) + } else { + console.warn('using deprecated parameters for `initSync()`; pass a single object instead') + } + } + + const imports = __wbg_get_imports(); + + __wbg_init_memory(imports); + + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } + + const instance = new WebAssembly.Instance(module, imports); + + return __wbg_finalize_init(instance, module); +} + +async function __wbg_init(module_or_path) { + if (wasm !== undefined) return wasm; + + + if (typeof module_or_path !== 'undefined') { + if (Object.getPrototypeOf(module_or_path) === Object.prototype) { + ({module_or_path} = module_or_path) + } else { + console.warn('using deprecated parameters for the initialization function; pass a single object instead') + } + } + + if (typeof module_or_path === 'undefined') { + module_or_path = new URL('wasm_cursor_bg.wasm', import.meta.url); + } + const imports = __wbg_get_imports(); + + if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) { + module_or_path = fetch(module_or_path); + } + + __wbg_init_memory(imports); + + const { instance, module } = await __wbg_load(await module_or_path, imports); + + return __wbg_finalize_init(instance, module); +} + +export { initSync }; +export default __wbg_init; diff --git a/site/wasm/cursor/pkg/wasm_cursor_bg.wasm b/site/wasm/cursor/pkg/wasm_cursor_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..501b37edfb56c6a58411ef6089e1fb4b8c77b084 GIT binary patch literal 150802 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≤y#uYxoO`{fS@B_wt6n z$X)0za!cI>?tHf_AF#p3{$hm`xTLrz_A7u~(eTfA&v%!&i}UXp2Jemi3j{>|3(0>W z3r?ea0SnHsa8Ke_x|L%XWXLZf|3#=(B?ezy?2r9RNP9`cuX3y0i`@De{Cc-u=o@lF`GM4L z5XLSg_tJ*n=r;Px+-1sbxQ22!VKelb$=%%Wm%Gc|2Dd4{K<(ce`z;E|-dgO9{Wf5> zHT|PtYJ#nD2>tp{WpkUdte{)>yiTzC~By-bSV#nW`WA~=Gq_!Jk|5gJA z>}>*j8+}6KO5I!eKry492NQpD>~5BQr(Ct5;q3x`J22N*i<^Y(cgRxg->Kwx(iHkS ze?Yw>E^&Ty?B8Wg0rqZzy_?dug5SjlOE_)Q2;ZZu_fW&Fv4c+D8@u<$B0~u6eadB14kGy|$k!}=EOs9?z>mfGiz)SSfqk4p?4CE? z2mpqO)ZIayx1>djzf-Y0iDABZOy&Pb34cVwUS)qmu}=`YEiHbhY)llXyNiTI3se2Rp-kOKXu75g-?yVK%&wT<~Bb$63+k1GF+VxJ*)Z(2N>_|Gc( zSqAjE*nKYc_h8RY{pXeVc@kN1Ux@t|V|P#Nz8L3c6y5&bxY(b1adr14Aif+s{_f@L zE3xX^uZ;afzZyIKl<~FLeJz&0^+@Wz61zvz{xm9_|GHJAE!Euz)HhYTNZmJM_ZL=ChyP=%=sSY{4p7)?`1@nNzH1eUeY)=v{eJBD zQwFA)2d$#NOx<^5_m@^t?tfqv{ZQ~f1nN&>$KMb5`jJ)iV`co9=ucwDpE7 zTskcQqrZ{9@Ea2Ln{3F!`%&V5p(=jCEbguryS2;?#Kn`5|D}?DNqxVH9e+R_XfCsz z{?}x7Cs+GN1oQ}HZIS(&511P(>@Sr57Zm)FQSEBzbcKj&=TiR1HPWXR|-M_@{-{_g49q7MSSN|Hc z??w&H{J*R4zf3J=3i%wbg|!)6c0xJ^#Xo9z;8$#e|r-5x+G`u0lLD!(Lk5` z8w7Mi!t6;Ae9Pj651uUb>{{m04d zP6oWBRd)xq-XiROoR3?Z<^>wRQ@MAN_;{r_Aj0?~q=v|ULdla_1#43{`l6y=q+TS-dlUbq#C<8r zKcaQ^W#xQ1vHgq<_bZBi1wibzNJU>w+*gyFy$O-Szk}w*AtJq_dd&l*1n;v zZ;lWzY#0ew&7uJZ9+jhhc-#j5|l#{GSb`xed2gNb`E8CA<}tNI_P z=np8dPett`lW_4vrT>t2|0HpLl6XX)A0-kleysE#1Ajn-rjG}zND@Cuoc&3X_-W$! zQ&v>mk@<&I0&}(hS>k?{_@5`mKK0~J6Zdli{L=*4;hRc&Sdb5^?yP9_f2P=<5ql&n z?p5}mE8)*ccvRWHQ0y1P9?OC-fw4Pv2S|84W555UV!tHzL>7dJUn${NBs`fRO#E80 zUlV&OEAGiWW_0!j`uG=#`-{Z?CCfVVf2G8~BJt70X+uifUncH1Nq&Ce{9h-|gxW^NT1HWZYNZfC2&+PCVJyFp=2>u^{ z`p3la_xF4~VHN#O8NVa?Pl@AC8ULKPf3}JqOWhN+YZc}GNvr5z1phBU{cGa*!Mqm)baN;@UKcWv{x(R z)nr_sI{uXL8hAaMcI5vS;hu4;BJJWp|DB-!j)dJ6mbCM)Rs6M-ejSFRir=Fs#|ZxQ zse2upK#E-&y6y6BAfr2R{*3~7BbJ|iBDXj2aR(o0Diwc&R_Ki>ThN=}@u|C!{UM#~ z-<(45Z%!e2>gOl|QJ?zXlDfB~{;kOIY5q}(i*I8v70=N{>TV|g?eKY|eZJn2ifG@d zjCT^nI>nzd-j%v{(K75lb?<=R%K)ZP0&V;IhGuc zxZ7sxu8O}KIXq>*3cJ`0RO-JafN#-(rz*wc8pQo+ z@lfQyt>kZ0?vGQ)A5ixU*doiGYSzV9miyA=K&{5HGxdFp=*ch)fFh4m9<{Up^s z)+XluQ^kJ@=tFSk)c*{5J!K<7 zzbQMJ?PE73{s7tCOo#tv>LT|`29*&WAdF;l{gq1piqgM^^I~_M*mgr6e<0p9HS)FM zaoJU|^>4zg+Ja5?{%?a&orQ7GHHi^$N~WXo4nEuY#CAG`&k1}^=t~>{t@IFJD()qy z^d$oX9IDSJK)gMmLq6F3BQYY+A$%Xwz}7kuLu-r6Sz2UwC-X71w#cx$Sh2H9K-UY z`G)Uwoqj5xQ)ORPsR7?bv`aSE5Mn7M8Oz!U&iNDF2^d;WbSEwH-B1^nR5xuH+v>>( z)Y#+=YbYqz`g8@o7+71}bZRG6hSj}sfn{PQk(mvDiaQ0u|mKE#?bH+5lEng89CWIq!#4Xl@4@elFI~7<+4< z>(6HiqTSC^Q1_<;aJn5>wzzrbVL|eq*w1H#XHdzR?o4-vn?D)z=vl#z1J-q}JZcqf zac7(5hjP9C9M!tmFLVoK9rcUcxo*(~{yZvM?9OwGhp~yaxFz$VpPCL5nmS))uqQ1g z>wHEh+%Glzuf=z3)WomX2_`*S=9Xc@`^Ewcs1f$l=V4qUav?w$m`6y9yHLPPh*`3h z)AmI`UhFQ$th#)%zeE)3E(w&0scVG*v3)(C8djLOxy3!-jNvw;$j=rcFD2oI_kz%!7ZSn18oKi$fUv*{Q5aYk%GZuo7W)^|o0l+aE8I)?_rc60wUyZl zH4KHM4L}T`_Nayph|pN3Vob0tVO&b+>VB9wAf`^WS6}!R{E7hu54hJy$Yjji@VzVYHV?1&Y_l7m}afAm%D4+ zIUK6IJl~UHk!^9W=u1{AYbA!+7Pqr6AyDj<#9nERI2Oe+C`&~vUyG#=@ zD%=f!yxP{fN?#W{%(d?`jIZ>s5?)^=0GsNoG2Ak#*UND6niz|%yIzLe$=GYH*4N5( z5&74t)axiUQdWC4He8bSkc2uAK1Qs@5gB%6*QMAS&4~L3S#T#~+O-;Qphk6k#NVhI zZlng(gz&K~&?@HL7EHK($u_HTo6Nkj@={~4@Iqd1rpC918sA#hxJ?$`7PIgkP>nM6 zq6g5{Vi|Zt0-}ElwqDqGxiB!{z8%wvRw^dmNEY6A64zqAMTOo0tk%aZgbQVncw0cG zRj&+Hwovk(tv98xEEj4d12PD=xOZV~d3TICShn95Y`?63>(+obj(aN!*Q;Cl*awK& z?cXcd_mZ+Fp;zyVF$@zm+i(lkVR#_6hO#S)-eCnX{O?u4y`;b~4DcQ$2;?q}?*od- zDtxz$%q3miW!7XGzB~39kXtY-hf#lsaG}k@0vVTqSSZ7CglRcQ1Gf=I+U+qgx44hc z!P{dD%aR86x5mQ~29Ty=4qhv+x=9DGoZr^8ySEdtyO&4UOi)dW5}en>_Yoc>uC^3i zNDa84G>{nD5EXQ8j5AQ)r~Ga|fe{@7aj^As!a8BH&xsuBa!ytcWj8;}9lpp z$sIB5j}!@x{p*g@NjepEv8mUzsWTx~Z-;^zZ09xCp$(DnXxq^&J|#q*!)T*313JNu z&$NAZfuBrdikpJSPvlqtkpXlX&#`I;rz}Ms2_SaIHT?1Jcy|>0;?enALUCs7W;FQR6+x1~r|; z&M&4QAJp6_4Mc=fIaIB=9_WPtq>Tu4gd^6Pn+3a3>}n*2nk0suitY4sn3-NT2Wg;} zV^#M33y}t5q=9}nFpM-%b93iK*IB1`a&U@M$L^~U1?F*ZdOByN^W7O2_%kVR7Q6ph z!+rq;7R-xaakZHg^M%4!#r|wpxU+}-IY2Ii<1QR#)33R6=S8nBt6oHOkqF)fcb>Ywn_kHh+H!pO@I?1ng?Rf=)l5d13$N7_0W_^$#f|{%{N?2r~i}vQZH5k_iX~{2IUz3D{q1 zZjFg@BqPwQRW_pBI?~sMP9q_#V%+OVSwGt8A;GQk8%RVxIG}2f4<1oS{Dv~l)&Lk{ z+NBCHUTq}*Qpxf)w^4(NImE3=f+z>o5ZrP^h?;9?pRc)1Z176lh)hAS84;o;(c)1x zak&Zp7T2mK+M(4JNx%pUU@MVrZd+gg!@wX~2ox!z^teZipxzE7h)Bo2QmPOt;G!|o zM9qyf5Gbw?2YqL2yyZDLC{5Jm^7HVg7r-K=SmB{}fQWqNT0(nmv_}>!Gr$?EbcY1E ziNH-j=OUPhz6D(F@&I=zk;B|!0q$@B(4WL?4)064$-)~Yz#TyZbtu4zeIC)5%pib^ z_K<~I6yS~~V%$;vn+yPqw3h(BI6#*1N{!=KBFDMoLVd>r0LPq9fOfRNC7vbZ+`LFj zmCb|6)8?UBWdjOad$ISz>oVh?UZR_^(TxSvU_7(|)9k__<&h|`%7#D5odkb8!FA)Z z2v0M@nFfiROkd=NaW=4#kxO*)o1y6Y7y4{@;; zqAPR^a~j{LHDIiL_^Q<8tFpg@zAtvYqdOP=Dq*7L($+jTFHFGcl$cv~`*d}iOx#rh zWT|ll$g?2dGXfQ#g+mwETR_SJaR7EkbmD@liUwTxZ1k?0J0~!xpnuie!jb_IhP@x< z*VwZd5{)i$XlL?Qsk!sSbVyoE{fk43B-Ke-LJIuYT4dzLr5mv3rQ*wOnV6LBzdc=p zLHEL)FMt(4&t16Go7&};yNibX#p9;=VomeRXc2xa(!4HlD~9F9GKw?PrbM)(+LVY} zY#40{t|7L&O%t_QoLAd5ELRNJcnCcAv6vnc*V-p4tgYe`wj0S$;9Di@ZHVW(m*Ifa zn{)I^O_|uQHWBR}uv0M%n6SisHlsDf)}U#r0`b#z4VdU!^dVKiIW8sJy)n|dF;W<) zDu92Y4v;zGFQq3N!6=?CZlk+&vTq~{Tq98Zh`6M7ag7iz3CA}^XuOy>yg1Tw)S!rJ zVlL+s9;rbA3&HLrfIxR!Uv|PZsSxdUD{xyvN!X>(v5ge;FKmo$VvJ&>T%+3Vwu>>| z(-QA7LsOz-T<&wYR1UovvL)M(_z-=7OB6GFh0h9i8(mexXO5W*&YAx#g>Ux2H?#4g zWlR34xNumZvf#hhgIt-7x$kj$h(}`=@+E=uhZS#pGe)h$Ih>e;q4g<&HwHx>?0LD1NjRmncZ_V<P~T|4#U)X$_~p3XcowWhb<^> zy@_(Oiziil4z54FMXNszvvnT;eGOzj(g*l96Hq@!pg9PGvmsd$ySXchYM~@Y zcebR${0DJ_i&zBr$;5GBJo1v0=Rnq0d`5j=Ty*;-#iRN>-z|1a-1+%$b@egQXqQrK zDbjE8DpkBJjP?Si=6Q_vLagq~0g&Tdai7dQnY*}wuy+y6y2fEA{P8jVguD zb1U(d!+wL|#zsp|1_3_EAx^5S4QMSn2xRlafYyZpt!F?(3}^$yb149Fj4S5DE;4sn z1AELy*MQw@aO>Pq7*9J)gRa+M8kwZ1Wdtw>kfE*ma>jFcIiBTkgG^jtMHtUk#&w-0tctL=MD7|KpW0vtFDL)y z4a_aCz{s*Q|8eYJNh-H`-L(ze+;(|5)9yI`Ni4fbGr9V z!mm-zYsh)6{M2MCd0m{}jt6ceBT0slgyS&TK*YH|-IBa6-c`L8y*QCW^0RqYH$~uG z?C3TN#=qcbkRG?VOXp>H7&kG@Iwrqmu02R12IL@ymdULCh?1Ke%^earnr);BGG8WR zITCy}jjdI^%;;x-x>1V;Hs=m)NESqs24JI{^$y2bj~gc1*C&xbsex*Jgg>&l<&Dh8 zQ7YC!az_K6b~Iw&ktjjOvtDLPax$4>9;2;1))tFV7KdX-E0u*+I*RsGCT(R(;imZG`^=bkm7paUYVQTKz%*g z&B(t35LXppUj!X6u7}j?Q;Ul4DO_Mz4fxaygsjZXX&_|5gxsmF2ktgAkaHJe6@^{k zU9yP-dYak5Nqz#iU?{r3r06H5%fi-V6E7Zl18vQPrsow;$paW(W*)%UuYaVhGm8W2 z%~`O&dDybyOM#|k#~$Nec=sC7okQ9=4fvNV*ylp$fm#-kj3zt6oS(<%c@2c6#fV3l z#H0J;B7t#b(qJDDSs2Tb?z#-QD3f6tk*gc|C^K(gcVXaJ5*#Uc5y=;smI=l&o8F+I z-vG+7LF|+3Z^_aw5eJ)wL@Nv53M_o07bIn4Xbowyh)qT>D^>1AlzUMFruAYt)(hcK zFA=?5FM%j?s~YH_FZC}|`GYvs%W&Qm!K{_L*g7Ch)Ir#3z@8|)fus!$Sk$FT!gp6B zbD0~G=4T`W40gs0J7a%(H5E1ZmMK~F8LN^{?GHdbxAdk$$2+( z*Wmb2Qq9Yunpa2)+DZD(hJ1GYwSj7O6;G-=aIKfSSGa54E(iBA-p)8+VHpgJll~ai zg{c?QuE>YJqK{UC3S)SJQ=Xu6FYYzrwPgz^^Jg5rlVjp}SUGTSE#f{Hh}L z6yDXv;a+9zaIYeMg%Xg!ohs5y;a%K;gLl!{3f(Pv*I`5sYrwY-hfM*nQM_%Ecw69I zN08q<&I`2IA>MT~$)m@2GR{p7ylV>S&GS3)uH%Ux-+*s9@7-|-T_VL!*v(Wjroyz~ zO|Y;N;9Vz@a-uOUrC^K`Ax=Z*oF+n~YxBicD`KngF4^WPb_s&YX7D+q0k@hC_knj+ zBnzFQActwaS@YggWPTPLZ#JN_8-5PFtCvr^w;&;^$8o{IodWNo)D)N&K?mw!Md~2D ztD>t5Pg>RRt^uf!%L{bNZl}y88y&F8yXHZKr;B&ZCw+bcS?dg#mhrB$io4aD1#qs@ zO`=-R%g&3;DjV0pD5`sA$Cav zzO@1_1q8ec?)H3fx4^qz0Kf|x2wX4pD+9f}NWAOCBsV3kAX}BZ>!oD8RNC9i{GfQ( zYT~OK=x1xNcMZC=Mlgs}5&Buht%qsBnqXlY#Jesf=~81_NmBuE%dSI$h{aq#Tf}OI!NI0(h0#eNt{@{;QDV>!9W0C28JfzP~r#m#XH1E?FubqLQku%t(o$Q-V9X#P$4oKWyE3O0EZ%h--6 z@GzjjQIeY)!Gs1=D)yii0(?vZA!@R6Pz+^8ii5FMT;j>Y*eg5u!2LW)l(=I4g!>fCaC7N zyP0mg8b=@iW(P1k`qNxEV*>VRry;yUy_qF}c{T~+V`zZ0kiSSq+$ybDO6hm~qUiy| zGNdYvf3Aw5Ai8-CgsRisT!bo$nIhOQzW`G33YeB^gP!k3LT}O>3eVgX{pmJ2`HUB_ zn2U3y5=y$F+uK+J3*D7s1UWp5n^fqAYIID%QWCsMJv$$B73@kqTMDdB1_W#3RRd1- zJSAP|E);UELhHLq^~Oy(Yb9-84A87l2wg(T%V_Ln4dkvt z$ziMAYL(oH_PA59vNlD*+63%45p0cdGr_(R+tVurOK-*mGD%}O4lg$K*gY-8?#ZQ6 zL^LfucbP3a6Uk(Q%-@h{$z1-Uz^qK2 ziTb%O)x~fc%{sXNJ6sS|UwFi1SVk<>Ufx8OaI_a`Ng=F>{$s1k7q>Mz%vjj0F40|D zaH1>QizXPF)SzyuE8Y4_4XTHZjb6m3&4x8XM%hD98k(ow=jz;Okv96fo7?*dPlbU8 zV$H|GxTr-;kA-F7v9PT9SQxG%$=N(MkkcNP_$lg~-h6`H(mWS}K*&gEWteWmfEm0x z%#j3emhUQ@d4%Vk$btuGc;w&(sZqgP#kWg5(x=f;0aacZ9sppbJBBy_JBeKv{av15{I1cqE5D3Jr&^W zDT0dELZAgb!NyeZ1X~uKU`tucxMz;NoYu)(TMV0P6r{!@OiLzP=(yVO-c)Zo%RZDn zN`%~wgL@>CP_;RU6|$N8X2&%Qku~GrpBB3soh0mM>L$b@Z6)uC^^8Y>!9$CffUYJ5 z)5CDBeRCuQ+dQIU|I@=A`_q7iKcIqQm#&7Rf%te(VwwIVxPi&pC#AGxvDHEZDBDoS8VF96}F`5<+#|Xr;9|XZrd32;I>>wkt z&J9TkZKoyTXzcMC7J8d#QM*tg5^T|vdo{eGit3fyi|bx>eSO#^uqrXnq|8gk@+_zR zdvn^KGe@Mv(*Tfi1Y?$4vYbuCb}L{A)YY#np1$s>8ZC#gQCzn>+g#*V@*D(8sa{kN zkF28J42z3(8t1py0_i$ju-SDZidw*HcwXu`h9}nJYK7q$pywQo5N%7@x;BLc{_LJ< z3GgZ&D23&~R)#g(N-8p5!+|7q#G+M2%Fbb*Hd8=--LVcpNRxnoh(~FT$T(`G;?W#% z!P*r)CIOMWo+XM*jG0pFXoWzkN(RaVH_5l&_JwM^N=Md_)M+h=coUP8bg8#u=;^%Z zCFrX#8=lON1tDLrU3LnDNzmbIg`?&~)1pUwAhsOGC$i)RMBuzcXR*rm24;c@j#p~( z_Z!3vByJ$O{X}$UZA*DW^0qvK^1TMpi_8s#{CpFgXU``%tS?zm#8?RuH;KL}f4)D$ z(0qj9_(*b&EOQnhnkPEpUMM5Jxa6p%^O*cEQ;FyK?_xiN3XerZKX%w3r<$0u<3J-- zFGM&`bfi5H8gkCD$izgb&y(dFzSDJjjGy@@bc+BBLKn$+_u%A%Xntb;xG~X_NIZ#N zspx@^?8h8hv|(1j*EfH=UQ$Tp;Ilk`Uxuij$fIXPQOBT=m_b3O!>8~qaa{)X9=^?` zcP7SyS^4wSw{~Q4f;u*Z9GgNi{w;)$#mbt5Ie{QYC{JWgkVt|xVVP=Vc%?(Hj+FCH zr)u(a5}P(pcSe3!DpSgtB%Wy!Izsq@{D-kGz+Tg32h5$rEc{j@TnK5LTikFvpNkN! zaoG*0FZ5xtKhLlX&1%Sc*x-i=B6%XS=YSRnK+6!$6A9<5IJY5tDKV@G1C}}8FH;S) zw@foNGkOV*yL$Kl_nl!0?7`7%K9YJ8oLA^8E&H^NjjXZLooi$^#eCahhF3@72;w5+17rB=0scNoj^4 zlbI5+&uR%-vQIg@)r>ld_OR_+3J45c?bN`+X0B~_Tx1;kkS|O0C5?(ikQ0p9<7NP}QSO!-5XVN7@iDpLbkSvK}9^!V$fn-(Gb@uox z)hw0ii+3Dsj!l8c;i^Ixtq6U3OO{;b&%{C*JMbaO53NM>5?^V_waSv*FJ-z-HaXk-X%K_g2|BO6svOe^EzTC_6Oeb5%^_H$@uT6X$Z8UjljOh^ZjOn_)- zu6>E=AgSpf>6i{8J#+N+W+^XGC)72ngFw%krqS9Y#hQSm&a^w$ifKhb2LWG71TCf& zL1yG?IjP4CHk7ddrHR4`oqYD2YLE^&(#dQpHS#3rWN8qdnCQBPaMRGbX<=#>B#vv{ z`Zi8W)m)pFs@j`#UXoypnnB;8FAMi+#!0hh#KzHxRk;tKKo)?MG&8ZS?caH>ztmZ@ zw8SfHF;786ni=^0bUb43GtM}r6Oj}%h8~v19IB_hlLZM&mS?nWrAoxGlr(TjCIl|2 zy$dMVE8N7Kfo07og-itdz_!sgeXCeaDlVzb%u?Vb^cVM;&h}Bp$kT?SywJ6e7c$$& zbIDjzo490a;F2a}sw&@ZwT@QkV`^dKToD@+GINyg!GM9`U07GeBJhV6q+=-2N(w!1V-Fesg zC1*P%P@IPLAbKvn9Y3)s_=%l|RRcom$vUUph(Zw4+=p zQFfAP{;Hg41{dKj0J^lXP=oU)5IaGR*QIBryfY?l^1SipyWL4a7g@?-L5v1+vYS5a zXSf+b)rtH}H#1zhIfZt)IuP#L^iU%%vh+|Mv2r5jeKz*=`xp4xL^u?{CQ3vnoU_B3 zGp>Z{`e`f+oG|47Ngk7{BT72AKwagUp@IeIDR$h6i?|(s-mDOXMb)9c*tu6PnhUT4 zTt2Aigy9y!a0bdzk;NB=sLm&u;$=E3Tul#MLO+ztdd;3D-EYz zC|Ratk2yoK3rz`Iy$g$gRRZ^80THzOT9Z~l6+*p4_E-+6u>?~VOr7~4hek74!Q6=*A&#K2{usDQpBPGrx}aJ+>PXQ#L4|6I1)oMSMz(mu)rTq z#GK3TC2|BXDChz`0#Kcz9m)5R%_k0VF_O0df=SN#7!KxiPiJGtxT7aG)o-l`)a~Qk z@r%48-#h30u=aiNzd=EprzPqhaH0M3pE8 zGou=gk~$2#&@CUvQ4(?<^D06|zG!0GtrCmCXH(~U;OSRr7suSguc4TXs$c&=%GCKz zkUy&=2SR7(vzJQ4gS@C^2;tfGCG4tvZNem2N6mNAgY1w9yP(-uM<*O8smHcaN*TcK zPGgiZU>Eu_ETqVo+;pSK&ML(_DPrdlKvu)^!TiFDWH2!l)(AWS$!&Wfi8NyWKq!&{ zPVcCqA*zNqU`QqLCxPI$)=_!6U>fBP8Uqw037LTh`~)K z1>@>6J~fOPx^qy9H#fa~0gS#BZ*C^i1AvJ)cEP7d2t7Gqk*#8xT3E(zVAp;SJ1ktR z)Wuk0?bakhh=mK4x{&R{ZdB}5DmN=`E5m&XA%{C+Hz!n2raDJjj}1gVV${&n6q``V zbtfY#AX@I#noGXxmu&I>Cwk@<>>oQ4;YVkM zEr$KIU1qLWUv)HW4w*+}u0gvu?TAA~RDSGEQUM}Uh$HMD+L7!rcPvm&k^};{%#K~u zCmSo)QW-jFxjh`1VyeZT!XD~ZBOH>UQtLf@WOoE_J6xC)exoKXDkJPUGBBtMXN~nh z9=M?+47qwxXYAK)#yW!uY^*cd7$q8Dui&VaZb`FHXQnh}Mv>u>NJq%&=CfU&SVh?6 z_^)YDROd-QB#om44pgJNfwDv(Mu#~>FF*Hm2$LkHES zn)qeBwons6S(Bd7R!toQY`J>mN561JK7C+Rd>o8vgo1!#8R;EJ4%RB0Mg&2_jx$su zM~+rOJ1)03FT`!GgjZIHXoB zv_V5)NJ}DDn&fxFBwckg<(l7G(A$$|FridhRP*9cvee?1(ZEC(yF=LhCgyY7 ziaO#$T#66E;$a-zauX!jI3_7WLIN@cqmiOvN=AR$LBS*W?V zs9)!%xH-z?lj+*;wh&VpVm-KDqcFNt&Hs_j-0r_|EkJKc;M%A?S654BOAOAvX@4M@VUx&(x<7ojC8rFFh5w`oqr?M)v)#8Q88RL9!}VrO0Sm*?NY5Kkq7Q+F7m)Ra?Y?=dZQ5=M#*@_;->YNf}BxEEV! zTk)U}bw=?K{YVD4LT?#O_I;8cPG~%SE~dFdNgx9ANB@X0KBC znHEh`A0|{b&?rb-{Xk>c=i)C^0me#~B+=51S#s*=HQeVCzStmla&QVzZ$!VAK{Oo4cw`-aFj?1sn`2;@0$h=iLQCSCNW%Oy80mvrG~kKL@0 z^g{2EQl_Q3$sBX=_Af*}O`!~lEEC;?Yb8{&faN;b^$O9rumK03($YQ_EFQ~+1W9C3 zd1Y6)c18C%X-pY-tw~Ia!W{# zC?lpH`IBv3HjOVPw=EmJ9x#K7?ZTW%V-m68V#|cngE&Q3174rS z)3i%fb-rS}VUu_R*>!P@)dZO5bVvvr*+{?^w3z^5d>e+tn|Mxw7+hq8x5@r7g^O^U zh?IxjUVc(-cCAtN#{7?C`>if^B>CPz0(J3^odgq1@asSzs)six^rKM|avr$_ate%t zpaYtyOXNlXtc#Ce-*RIIkCPZ!rEH=LHbMyp|EP<9AR^YqRc_LyrK9+6%I5BfvJJg= zMu~2yqOPrr1G2hIcUYrZogTP=TJqMS2ToHjuX5-AZo}z?NGRFkkK+*Gcyi0@N1VXu zU173hn(q71xRSv3FcMe#sWz)q&7{^v4g&mgtt2v6!IkO~ar5VB-iRY?B~ax8m3o$sNVh#>~0$F;rHusn1A#;Td zJZ0d!Ae5>!+%64Vwt%qBkU)lPl@pu}+$KODXlNHSU%InnX!^k$wxNTEQ_bNz7L`-0 z?J6_al+o0}+dW4TF}X!A)^q>>X^1rhK)(xt&QTs59wRO}hHSq|>Ulim4p9=s~wqaPd4`>rPzcPoimc zej5Ls>`n@j3Vy9RI18s}Gg!45!&&<*g-0@jQ^pg<@cVTiW+F$&QRHN zVokgF0(1V{XQ&7{qi3jc=qt}q;VvR7b|9fJCx-Zti!5pw9ZVg=S3q6i614OL?Gx|< z&R4`54lZsAJH>5V${-0UtwRpH-Jng|&R3m_9PcCMd&?Ud_N><)Ox8!yDSOE41|r-z zk>sIPppb)GG0k49!n$lvJxG4c*+=5?=CmvX)1jp?wO$#Hf2N01OAlz!>;QODg(b{D|LHWA;=NV@Zd_KwS#hOgQESsI@z4xbgw?RW{Xc=R2l zl*<}}iZ&aGAT<#Lwh5tj2U3ox`amot%a zIV)f}OY+Nfno8AE;b{;f9paL^ ziH)G)1hO$R^1_z3%_=^qAM2Zi%|qhezoYwJ_(gsU73g zf8f;KO)LM+Q~N2J_%E7TRrQRi{dk(3va2=NNP9+Ea#0B@7-m#B^gPrI`%O>rjUMP* zys5lELI#f`x*oBZ4i+P>hbD^&bQYi!0M&1GvZs=vXJlsyG>7drO`igt4d|FOF4HFl z0twt$h*^wr`Iv-2=a4ccWh(>AfJ6L_f|bwoO z+;}FhvJHm|J%MAFd|Q`$zNcbGQtT)z#-)1|D|PDNfOkxAS?hpjMqKW(XVC23wkbS= zcB~cSo{x$hM{DM7H0;5CC?)|Y;(3rRJt1aqwRILXCP|&_AcmqRNqnDQ`By?G5J^2CAZbJisX9WomQRc^AMG*9#?#b}e7&NL(Gr*ytxr`FCAjRMg=EgcMGY58=CQk>98#-k#M zG&Bn^`he^_YO50;9BW)Y<+zGuoOuZslE0GCHdGLI7x|Iki^Cz%_Odd0m(W79bD#)A z*L3+6!IyNB*7m_P?hf(@UQP$eBcsBI78)X?yhbFKj0q%?L=Z@NS^l^caqCn(&g*;$ zZ)uiFyPGf!OB1)_N*qcj^0%ZulRARr!B9w&bV;ChDVjE_V4Rx7N_wVoYJe1^p>b-B z*{Pa8ieY9cgdg>6f$omluW4E%>{{liM<#N~VgdxnWlj$snkc@jDV&(@1MH+AqKxT2 zI-Ru}b(`RZw$8j6OP6|&=G5u1WbN=%8T`SPtn)}Y(M@$H4zr?oV&IGMijdIhFYEsf8maaWk5#}A$(pqPzkYJG8jUD^~Ru|LZWP)^?pR_EAE z*_2=huz{L9ls9#~mDG$5sAH=Me3m;C@}pFA;M?JO1Ui|s30qBo!BK_@cuHQei9{6` zfHREEptN*KO_2ntfgb@AFsq`uQ*wqkNm@EtT@oQBo|ST=rjr>%uaQW5jFHYUfpi9% zQ?yZ;8`-j^jII%g*#cu9!`vAD!#bUcC`ZY2h|*J-Jlf88oxcV*#~CrPVW zc;;d!*M8h1f&q?mlS!;N0tpuO5;mS+dM$Ay>&Bexf-DFt)xraC3M-DFgL$$Su{RT- zm2ZQszcyv5nQz?)atCdfzIFQb4}OZk9iF$d-X;MOUQ5(!q^d5KAb~^4?q=C>W)vhv z9{*lL`D7$epgp362Hfjq`am${wAlOJS_9S=Kk zfP~){kVmvkW>nqIawDj-+{{}}u5>K71?DC;pXEm8f@du^rshNd!y7?bZa1bl5*2|C*GGme%vMdA}%S0Cqhk!<7X7nd&ZkokYt>kpo}|2m@Ek zRfBL_8E&*NZSW5pc?}N@3d3;m4=G(Wk_F*u1l)c{*r&;`E09)S8Va!;<27qS3wI#P z-M?KuPVv%}e3_j)ELRWRpH&d^l!kU%J+=`o*6Sw0!9#v7X10%JM(_R60y(4$1lw>X zA0L=sQeZaFRT+Fx5F$ju5}h9Y?tajdW4Pkg!|&~nik~QTVxxG1jN&m;?13y~pwxCt zM>f(pa=1hJ;ErK%s0o$jxR$itk@BN3ETTj|}#m`1~M=S$|NeL{g|>7MzYA-jpV>9bU4HZR!j^j{=W_JxRt8SA)lidq6Mw z=*q&{5)U7eaveC56V**W*iU~uii8`Dx`0uhfj1Dp#GUt-Z<*MFX zD@K1>F6NCUO_;rA26l<|{F^#l(LFN~StlJT&K?9e!OqVrnaIM(-JwhIz7o;%i#Bpj zz|HvwRVrE115Cm_oMYF#go!0*;|GO8@5cfQ?;}#{{&h=PRju^+XL;|VsG~+2_W}o zt_^}5wnF?ek;$8GS=v~hNaAc)xtAoxZe57hPSO#se?Y%Pco8PtEyS6xKy`(wbtaRw zH+14j$k=T~kgP`$Y+z4Y_VOs zpzG5%G*jOLhY1-NS^qXk{H}_OZqG87vqdmy8KPML=nATZE&&9mxbonQo?w{$;W5UIuV9JU~AvQ%wtQ6&;oi$|VWAmM^o0Y!|wFE0r%=Ul< zXqfGxBbZ?x{mg#cdWthxJ)Dx8sadnUsj2zc>S5+Kq5M>JTFxO0P2^fWtewMyIp{*~ zsM|Z|bos2HO4DuZSc5&Fb7I?%lcZ}`{aHrNtjTZM5lTVoI3wqYh_%LV!YetYk@G~E zBX!_B-pF|pDbF@?o+Qxm{+;k#PTlmoSxuLNrjfH-jN1G=ZEfOXAj_p5s*T*qvIe40 z@~PK!DgP|Xrz)NfVy6o<2bHCfQ%6I%7(CO+IRhi-41wxYu{3h#V6VArjx%!31f??t z8u>0jyWn1I#HDW7HL>lhN%Pe&ma^_`1py7IiO)?4q8PEv&SckwBq^bCzynaUXUd@& z3Myh*DN_RMITg4M-pH^58GCAaL`=pUqc<2LZy=Q>BhG3Tv!aQPa3QQ?nA=4yg4UIH zUB=c8a8i+?#AMYZUU4qrohdOb7|;l2Byeuv?2S~7@JH)x?Hp#Sb}pg$*b1u5b3+3w z3z}M&HQcWHo4HP=F5`BLxEyJ$k(zirZlqD$FT@FAQKmiMgZ$3WA_YM3G31w2Cxj?CU{7{rkspEjb6GlJo7EU)c#h&-= zJ(DC0lijj5L%lXQjIU0jdMerQ+2~czLGMEJgFPvf2%VVyOj@QPS)EFhSKf5T=OJjn zhFU4eE&0SI!h2bNhG{ziks1n?CczyD@I+xDkKq@?;RLCnWXbi!&{^Jg=Z3V5gofh* zf4I^A;o6xb>uOS&fR&1^)G?)uLLfT-N&=QElDp+w!1=Xg?-|;Jft(+(EgAWV55Xai zfrusp5_}Gf`(Bp_upQn?AXg;tEE%dIIh=b*OI0`2cg|M$>-$L-IJ_SgPbqW$|xQVFU~xPVifR6e^Joqf~yq8A&B zwwJ6(hqw>-ZmAAuMpMIJrejbUoz>MRO;)CDcA2m*mqSGU2 zvA7n!1OE3&w0Tp2dj6homuAr^Z{|T&TdMew;ElPzYPQsV_3-I z+IBVK82zy>Rd#%<6PkV7Z>^&3+NP$e%4#>c*min0D&a29O?R*B$femt!od~%lpijp z9bRFi9a=%y*BgcZcVP79|4xiP-%$PkF#2Cdqkkwyf0hIzd4|4hCW$d$_us3WvFBn> zlE#G;hNtRM--;ZBbCPRA(_&e+V@SUBEBhn7l#W9dxL2PO9nMM|E9pnBr~p4D86%Ll zIACAu4?bRZI#7Q=rH-V6ql(A$*&&Szfy#a*ODas7f3`g5;e<(|QR$V`4ztEAVW*Mp zellGPCw@Bfn>;zZqG@kv{(tP937jNnS^v9wW|K{3!}KPBEIFWeS#SfpN#Dn?3F!^w zfIuJ#%3qX8b#>LwB(pP{nb~Y2AOQjd2nuqD5DpFq?ZxIU{L9E#{Zg&jCc0KydzrN#`ec2mc-$s73fBZI7txo|zAjzGQWib!!u*j?7z4&fCnwNPd!P$z_Y`L*aaO zMrXSL)t2$vD73_@O_=YnH~-&Uw6`7EqWx{!J5`eZQIh;E`miVBe7ArB!IlfA*%BA_ za4#3kJ`WWbve(~y11NS(qky1Ed}-$IWQ?+K^^3Uh@}ohw?~H)tV;RIimFdFjco`lm zZc@Z2^P>@TD+@nIT-QzIeZDUZp5slH>D6Ayx)hJvb{#=Tw7A9{vqw1JZxbhkK1?{9rIK!ERkMieRpwT zeYM)GFQJ_Z>m0Jav~dp4(Z)leHA~j_0=MW|Ulu)HU)&eT`m*Tp`ci;QH+3Wkiyp`I zUq;jH61fM`d9`OOx?Ui#*W!;eZnZa~X|W#472=}mNL)^2ku8$f$nFVS$3%fQOVN59 zMEGSR7_)3~ojvOXX>=?C`E92aXsYyui@QmxYa9H(}GpSRjO6ZabZz+ZnrOivp09W#qBUSDJ1}n z;=9sF^_ZUcx_L*+0R>{VKpI^}_=gl=T8S*lvS6FdhbL{XWxO;%vdiYNkEFf(2;hd; zpLX#!0Jpnw-BTeNv4JG#zQqO-#h`#r95egWbD)+~Baq!qU$8R+SYyya0;bMG=ut8< z^3GM;@v~(!#!b!4G?9|EIyQemBKD+?M*6WX6;9oAnAle}kZnfzPBhu)dmd!j=9qPZ z#aQM-Y`E-%2y*0@ys?z}6CTLY{1#!RnVilc=J2y4fEe}uoB_({j!pUk#Ie(|Dkp;V zN$X2;mSfIXL`DU8ony)bcyEbqP5q87ZLayPwD7x_kI9r4o=KCQBsSa`N}1#m2iFQY zM_n-mZl1`xdI*#<Ps_Er>hT-CJJI-aQV-43FIdbWr6}4r0dM%dEh1SE)%c7S;=YYoJR53R6jpV30B7S?{gYT5f3 zhTf!Q?Sr+~q|-Z+!ZUD*?jQ%y8}e1+0x_#Kc6IRr=s)^u=A9mQJHAH-`|Rbln06s#=rBxC(4EzhEZ&Gttr=JWKW4Yz9|z6- z@wsFP@M&E4r%df6o-^`g!E-PG860%tFpr!9@jNAS2IODG!5?a_F!#1l*iXXWbfcm>4X8rie->+KZo2gQYS^cgI71oyCPn_Hb(4#l)_8&d73= zswiiVl?B+AwQ+yeXhdsNb9eT-%Wi(y!bb%ETz2GiSj2X|ZFj4193NdAFzd&U+3h=& zJ)l)Um1x|oRoKcZSpACR$WtOl2#NX@q88yHH=0#O4zIZIf(Cw4<9bpZvL`|Dt$aZC zeoGbg4qO~|~9 zdvc2)jL<$z4m-$ll!%hvN9N~snJQ{ny0Ocmf{2qyLV)a+>=T`+Ai^0eDhTycEq&)> zx5>J_>xxX_WUd(tB7(P4;L(~_gdCw5@>MJ1UIHgW$!=oN5HRJEMj%VZpq3b#EXG_q z{#1>$k#f;|vXtNlPg6RgF{+S05B5CT*phiIb|k?D#|vslTyG3S9i|#L+0LgU36{!-h5=8Nta%WHK1dz>|KMCEv z8`&B!Qm3bYbH@tnK(_Bn*roGP#D-G^X09?dg`7qcZXdn{beX zvOu*QE&E999~CAJU#xrme6d!)SSS8`u~xrWC;fb}`WFiw`=nv^F*t#2Pf+%4T(DZ4 z$_37Zl}e_M-H_q7)p0XcUGvj8t1g0<$dkRy(ONPaV#SbwQT8)P7lMRtZXuu)17n=i zfJCL6j&N_uSt^c2N-MS65v1;IMv4Cm z3pSB@1Pk`J=_6mT-;N>77-paB0BB_!S;;oW5s?&ttRxcasLc7|%!e!bq99OBZHSXJIz|1Q+J{X>Xfol9>cepp5;+jjz57+%?~mD1pW8E{*AB8qqjon&Tlx|T=<5Lmh*>3rJDxCWXkX&^n-+(o&Dd^?8= zMDd}t+DTvpG^~=%1>EgUIt9YbNH66tPAc8%%3#ujK!pY^>dxHEG1(a(`}vB*j`#M8 zyd>@2%keEBqR+1b>k*qUI555?7Qp(7eZjYOvSmZ~7Suz<7g8kO86hDQNgWZm9dQhdnD5N(BND64+aurP$s#IuhjsaSye<#+Dl4qZ zU-YiagFP*XP@sQZ&h$pzx`=hJXI);JPM_dvB@OZf0x@#N0WkuVG$nz#05Q9`05Q4s zK@1*4K@5ksX8wBwyx*4jAs$U`-dhLR8^j2VfS4GJE^rVdF#3daHCqcr6TP4%0dOP+ zu|W8L1TjcF=<$+K1S)`-*yV{p%*p1@IezQ$9f(nAD-eT7V+BDilltxgF#|D)n@ch2 zgS`;*Gmc5$h(Ti_Rb2s-KHR%56RBaCv?q0hm~?lbFyCA?g}J?VUG78*b9Y#mZ><_$ zKGwS~KjZMyA+alQ>c8w=m!EO^vU+&=Xz#lGtisE8o%P`dZI-+eynLj0UG7A9aT3gv z(Tg@o>|0*ut(hRRkuvYModol}Sc0j^_?#GPI_MS4ypmx4sx84t=Dl~#ggPXcm@&mN zFA~fHk$Fvm8FdnjBE>oq%n3^*7$)BisvjGT)C^roN)o`|;kDsSlNUAGEC0d*Tw9St9k`5c_JDgvz|{Ex=bC zDzmxqAuXDP!pN$GeqdoUnO~QQXH>>2DQxCkmg)d#Tf~Y?2FH->F{qp-dZkMM#>hlL ze}!*lx1O^7cvK83;yTk2eqxK&c9Z+3Uwnw4b*R(*=v5t#sKXK0VVa(-6b-qlkKkyfxGf#} zN5fzK=xwRS8I2d=Sa#_SH}i=bceHP;_{5Jr@AzR}T|j-OeBt6Y!U0IfR&Wl87mV+A z7xZGrcr-I_BSDsr*lW!~YZzd`7B22hZ?boadyDO3O_-}_c6D_I1b>$3WrY3e$sl&T?LqU~oo8u;D zbJSc&7LIL>SO=|khOEwZPIHb6jp)E%E(*D%cQTEo=AXbf2*F+wW?xBMs}Th*Jf}I^ zD4Ce0x7xW!n)5e2=k4*J9!n!cbYhi!K8)4YgFOJnHqn}4KWXOLD&i}$Oqlz4i(LH{NV1Cy3!)O=u``=w9x(>Z3Fkixax6OwSv-$m z5zj4%4z51_ICF(FaibA9q%|!Z)U3!B0(hCyz4+=*++D+DH+3c}gZq-n?sAjey=1bR z?oN~a7tg!5pn24G3^?scv4Vq%dC3-T0Av^MZg7qpn>#VLHbtQz!iqVV{uYglrapw_F5SOmFify8Z`$WnWpMr!_ zh>>rYgz_ ziX>6K0T;4B6xPo-AtT=)JbHwkc1NyRR0iAa$Tz=ffedYl;8GNc1)eyk?J=2ei%qdy zA_-8GEo3Wz#_quRu>^6IcB0b&Z2?m*=F5hFb640*^p~UroeBZ-MJ2jB!IO--7`Mv~IJf zNt)P0UO{&`8)$F`6+qan<70pCrB6)Gt?3{vJwT6?GTDwww@w=igRZQN)bZ*FsC&%JDVNo`IS1yr=PgGUC zcrs4klU>7!d9cA9Oi=sbFlAc8pDI(@% zhWKc2?VRvOa;1LX46(BS3Suy`9OI;@d1mNkZYArLjU?|QyG3W&BL`_el_1WqFJnIZ znxuj7YbM@p{rVR8C%-0fbNqUOHZI<|Zj#LC+OqUEW^k{c_1S$o-n$WCwom#414%eF z0Cf^q7V>Ahb0Y6azVUGDR77N{lnWfY?BpbwgheMw2T+SoKk1ca*msUhK+@=vDJq_1Ij2@KGt!1exXGeTAx-uYY83&neE$3$=eYOc zo=86C3{`qhS??lObVizTnzDnuMPRITwT-U0!RO5H5YGBHo_9~lK50;BX@E%vJZ=jI zFY|>(%J9Y&$`$ZH@j@?RhOBFVGbY$B5@dN+j6K6nrF%9GxWd zr|CpH&mLn@-D!*K<{hK__Mm3304yrq#9EdV`k1*{naDPOBM}>7Ki(se)1si*=47N& z+@gO@3V+zBIsM@p=JcMQk~zJ14RiYAyKqjQ^t_D2sa^pE07;Bv>}!v#0yZKxI>zpP z%K~nY5&%+0Uk`9UDwA_6Jj_wxmq;o+fC6dK6OtycB=Hvz)Ke7ToCW`!kOF*)<_hu9 z`X#`CWD;5Uwi}8_BXL$OZ0sIbUFg@M-kH)?ry?z>LIIhQLC0cnkUJ!2C&5Jw9!rm; zYv?0nf}v1%Ku?2%S*LAKDP6y*A|S%Dv@A5-EfDRcVMaT-yEM#bmun{uGt%)r&=0FE zAs@eoK7D-VrC5M+NF)>kw8K0^?|%lT^dVX091HVyrdVzGM2gxGPdQ%%7?!01{M=5f z1_jg}mbAn8H-#uh8nU2mwoj=?^*paPjDqXLC{~mm*GW$_j>;tJjkINVN%w`%G^GEi z*e0bWcohy|o6gn5xs0nZp|99cQUaV57a9fpU5$ym+dSU3&Ut*St*P9W>gTQ?itrCa zP)wcCg-#ak$DjogWz0w(SAUcmVTy|my)oQ(iaE?T^FCBZt!K<5V_hV+5Z1_e9?Kk` z@TsgG%_gjBufFYtBD6Cd-VYO&S+8FixqUbZU@k&j6WGm4q6k3tbsO8?jutzbC}%U5 zSd=r=jjFkd7E3aTi562>BG?aQkPfxeMT@nIE11~?6PP?_8ZR*}airmH9U-r*;$u;l z$%fi`RL6-S8#$pn{n-DLoDC}+8-coJ!_D>2=ADvVP1H)SuKJ~nhOYkBh=@Rcy-Vt) zU9}@^^)5vvRD#k|4eG{IpLYG`neAy_H~AEywNtQCsu3o5r~%ua7M+L0v};eQ)>m&| zsj)wg@ndjpBSohIQYyC!aS%`dQaibHfg7k`Jf`PxUpRu^h=EXntX6N<6kUTcfD1n1 z6m%}qHMoc`aygNGuu4b>q)+SB0f8cmO^t2B*%QXcKI|n)aa6fmHYaY&z??WLuu)1I znV!Yz%8BFF;GDQ^JWoq;PTaOQCyr-9NQt{pO?;7=7kfz-o*QmPO}Cl=92s!r003n|%a7l`VgdNx_L9(t7xD z6m+(%QJHHjYLA=BQ#cNUem*jDBge#B15J`T-B5U zmP#_S!kZ$Qe4{KcP-TTDVyj*@Grl34@r0l7X58j^;{vDwo53!~w*ro$;0oi8GTNo{ zH2J!Xt-x(3!PG8Un~1rI>|6qSB;E*V_f}!npbNjre-QL9I59_$3~=Tw(q4k}n1T3F zM=^8BvJVtma4sL@UwMTE8?LI1B*dT04F2<{eg^-wfir+C9XAAuz|p}d{iCNsu?C?u zt{qVTLp)h6fC7n94z##{*;)4ui;}*Pfh=i5=~wSaI~*75pxVC=w)^3M_xq z)96#8ipd%s$E4usk5`8YUgkyZ`m->-uCl+PL0^)y$wo?XuCB7byU-4g$!v94VAM^6 zGjgP%GR55tb&K*?4H+`ev)z#?n%|Vevmz3hqr2bj+4!e7GUM3SxkZr^mYb^)n73u8 zE}3VT-_cwtQdwgkikvRy55>o^&8dZw7KECyCq>F=$7zBxdJJxR>(RP8u5mxcPpWR> z{JrH(3}$QNJGvZ?yi0(H^4Kg$v7kroVa$=hV|2W&L+Of>O^=LFcR z65fV+W>4y#vH7y6xMJ2x+jiEZK)?l9}y)b_0IN;0EXNm19Ft5_&f^1<*JU ziRb(2X^rQhrwUHfsYypmU+9JT*L&%4cdP&s=>XkFk_3y(|K7}Mq~6S~VQK&M?I-LL zTgOU!gIor$k0U53g?&E2bHeM{0JCmKk(~;c-L>#-6Mpc=jB~v4 zK{mncjjCYt*0zqeWSAPC89<>M?GT>KYX@7MoXmm=BKS-{LK zs@@YDKoiquY{FqVB=7)(F8V@djHFJ#rm^M`-+Uw^{*w(D@gKAaV7A|1z#5B)o49U( z)*}jJ5>Y@59Em^j>=F6jc~U`D zy>u_z$NcXOWB#`_j`{7Lw?)iyQzPqqE?2UCM?*a=lS}c6Xi)LN<{0BxtIg0|enhGM zgq6cn5DJMfO69V`eNx!rgImn-BX)tMM@(}I_wjuy)dxDDKTbH^msAtP zqZ;?C`PRV6u5Ng=0e@FL^A!3kUm0L(>=kPsU-hmW-rGFSON=UV`3Ye(bI^cAaGyA4 z$UdgQBab8DursGz5gECldDQqEeD{V?esz|S_|bIxQLB3{op!`lmd3LzljKwu%`m3{ z5P>S4+hR?^Np_P@x^gEq_ER|I*Tm?b27s43Ah9!NUNDlF9}vzZ(!^q#+yUktG2;(- zV%E?8ly_kbBtWsa9sGbg9FuvPg}lZE3q=8-Q?Tf-NYXXV+$K>s$794i-4*)h(A|Vx zMFSbS%O;)(#S(;NAa@rFNKuU+7jFa>#^FUk66h#U5wR9~b2xook6cN~ZWE15v#DX=Mp@QsiCbd2&QFMYf_WhTvP4%qR1DQDMF*ciM<+^p~DHI^u2amr=~7mq;( z)MboKHnA%?OGZ>3xjge(j{WM|Q%Rgup!`D-_g>lR^`3VRr*38jNGcLN#D%hwq(1{7 z8kxrO#SxYXJ7r_-I5-u`i%r|R(zo+PVh+Y_OdMjFhP~FBZU~)CJYjpCd~VRlT?T4g zQ^ViX#Wi0xTx=CZ0O)BGE+lx|#4riL0KATJ3e0)%$nJo}?3ic{&x)~|eQrzRMbErV zgF%(beA*@Ue0U_K!w);C!7^^myh!qW?;^gmy@*S~Ll~4aY!-1RnEgLp%8K3GP0cCe zdofDGKGNDer==@mi3i$(olev%X}QeKGf37DB6qLai@o$c9PnxD`$AV3TVfk@TcYR- zMymRmeGx3$|BG~Xp{$gEk_&#qoncW`Jl`JU7TrPe7a$XzD@n+SK;6T7RV-5U4$A3A zHUt1q8`&cpi}*RA*j*I7CICf`GjYwp!hwh(=yLBxzUL`V3)nr_|8X`dHT0K zPJBbz87w$R00*H(&J3^ZVye$j0o)XuwrtTYfIpa4x&?3|7#wNlrp(6b%tcE}q4}*? z3rjEMZ;cq3@%Bus;%`VlmEQT!xBNq!if}`gsvvSXciDrrG(&c2hO56BkjQ$ z{dTw@dx>nYQDb_*-Ed6R4II-;JZEkmuy+PVUgo;CG>TT)C5_^(%;=mpbJ4T>!k=WT z^i8JCV`POjdsXH)%)@UHW!keX?5(5%E-0$v5S_4k!PLs*dg?OcvTQrqPgWk+Z?0`z zH+t!eW2lm_y3=9+PvfsRfDt`(F5ssqsM^Od6OcAoZr5%E$lHhK+5rh@ISEga*({cg zGA7d@0k`G!=d^W+CAK_}tZj0H9?6O-30zo?{C1&j71-RZQ46aQyCSCkW$cP?e!*>+ z3wrH}&y9KdD0^wq9i5~SAPEX0BB$IEMy9w26g?c)ZaAU~c%tQ^I0~?_$SB}Tl+`@h z&M6Mc^Sh)UDTZ=Jj7ZJgV!%UPrr7wL-7-G*v^H3;v@o_^+0=!GQ}Ke>5+UM>@VEuB zFNhE1mg^k;VjgA#UgH2|e z($mKQtWs+XGGlAn5@pc%qVa7VUY;@)Mc5*18YpBT1Qt1E9%OWcE@J>Dvdpcf-*?#q zr1bwTW|wRqxI#9LbxL2iPM|(u`$E%x@tf6&W$%up9gE(Q6Oq8-4H{J}eoNAhh3-Vs zHc*ka+C%rp$DZL~baEkl7EPj=vtmw^(vi@fzQZTL`^=4_+f%Xvr4@BY2njd0>;N4* zwUxQAz;FJ?wkRNkh&%gay0yteiYVDk9LaVJcWH~i!!-BQff`AIC>=FPrc-ny%~dOc zSR^D;$S3<@OA;SiOmxU|>~u-F!$_EismLml<5pXqr9n#%XWo_ZW@@8EM1@w6qe>e=!uk&4fF!_Y;zISI(Q9L!%>vEA2-dC&~dlDY6KwbbqOyx zDmz#pQd}LqDCQ5$))_8G8wE)UP(t@`CD2#ii9EW^t;#fyTY&`@OmiC#E%h6Tis%J2T`)nBbguAxs76-CSM*)yQ0xt z;PIl^Vv2@MNhwe*_EiZL>D2@>&qEbpVU1+C80XQJjH*Os>Yq zu5fdd(X-EXZG6cj6PP-ajS=XP0G0Y8Pn@`s^f}pM5SVX!;cbZWjW0|8lYLr&2(;L( zwXdVA3kP-ex))hjUs$%QD-)My@2qUokb&H$d6}Y9Yb`20&JkzNo@H{DL_jk?3|c{g zBHAk$u4)BMe}+dxg;0_@xr3WBXLGX?{>}o9WnL*_)4O;FyrY(ibcy`ZA!!ow60sjR z;agj_k=*|`1W9N9OIB(FdBGu|Bw3|nr55B*r#*KvhCAvSUJ42i6{7l8ux$mzU(u1K;ns_mM}s*IMW@`$1ER55XUs45eac=lS`V8Y7dqVHp8hu z(PkMeNG6>G&?F*4cJui?#(!Hl&P9kRrffxP>;l9_0_pKDtk^~1;EnkWFv2JMfvz>c z?Ec@JUM*yG`OC+$|A>*9_o%5}`SA)TKPF+>4e0PqF6lDu_9NZ6{dTt>>3yE|17fR? zxwP9BuDfkhviu;ySUVw6x$#Y2bBC*>5gdt~o^oVJaN#i=tP8xs3DX=!Ev}`b$44{w zm1%Sfgn^5|I_;!ogkq=8Z_2#eQzYSSzj2!cx}#m}0S8xhnHHzKqlZJarVpSAfCanc zgh0{Ebs;ga%UJ*jV|7*c0%(MF4ZOqD1<*5zZM9n~)AA^9Kh_K_o5zeO>PE^JEh?%( z;(yx!CJo^j282??$|U@QM-pTjADeZ&N=R(dj)l0Xvo@acrbd}&+1$7p1xvIm{hmKM z2e~_TxxJS!qCRw``Vw#~WmFogk`!+02F8$8cP9#d}FD9d!W z@<1UDjI3wgY_&wX%*&fI zZy6CcvQSLRF*?E?-mfmqS0iW zScrb3aAMdQ6#p~A-(JLif}@QCsE2Dl6RI_%$wuq}(2f}_^L7N0gwC6TyYR)^CzZhw!En7(B>-<iF3B-gdhgv2H7)~jTHx>~PAjGr{=VZccD}7?&TA2Yd z$WKl4znqM|ThBkPHUBii%+4`j6y&geZ z=R_Y3pmh_i?9t<6k4sqVAn=x(3mBAB!&5Q;qw%pzhBD$F!;j;|EO6!q)CVJ~EFxuG}!RWfj`02r8Tz7kS3~uj{Zq9?HibV8HpJSo$y{eScYC6y) z#CeQkIQ@v@KwLH}FY{+HY_pJBvqb5HC&V&aN1|J0i#M*V#r4nFX^OowUVm$EGeNAk zwZ{ymlUc+h>0D@PeB8u#U}SIn@p}=Uj?!Vc$7a3&fHOM`fzm>=tH!fh30WN>2 z)t1qz6U=wv@&wS?`+K;c2x{ijuB8s)8y|bba%2TYX(k#dvHZ%hy0S@Z{wT)OjS|_T z#>Xxkf)p{CPi6i)4SI}b-X;5Q?1;dkWV6H35^Fgk#w)h;4B3-MGw)uprHhuEU+fw- zlr;;uQ0mDI=pMkA}@niDJ z-0UE=0~HKwIhG|kOQa_;X~43iQlms>{#i}+@~TIG$)L2?RpT8r&OBthr)UUQ;5~Dn z?cSIkk~Z#PtpVRL(7109=*&yKlks^n#e~RWTL=3U@X{gJ={_QxZg>y&IB{I`j1ZSL zbxj*}y};Y#4C#YtgeU+s0{eF6CSKHMDSb2~4`jzDA*%YYp=-q=X{~rmRSactMM21% z7DFgYAIsLl=ku8wDP36`NRoHjLugkfFv+FK@5PZwy|Q zeS`FcF8rpBsg_kh4`#z7&qGa!JrPR1C(CqoLwV^i+oE?RH*%B<+0f<|A&0VoLz<>o=yI zH*HWm@9nfhQrsZ&u;Mz~yl(HbGjyFzh#f4gxB1GeU2QIz8*Y`~{%jz|}uraDU(V;@np%q#9V=VXN!j>c~(I|_GWtDXq9C)jYEnDze({>eMhYe4>zv+q0s8h+YymKKw9Tq#ySG>H z`ntEjCfZ|aRIK|;olJ}x&T?!7WyBGb5l2ugid1%DBPfarbp!>q-=Yxrx)BVfB?;MQ z6|U15jpUjwNw)9tu?IV=@ZgtaxUj8b@t&hcI@TlEK2~^F37{gY1K-^{)EW&fMZR_R zK~de?)o~{ZSRJqax2BWyU%Dz5iWye#77U zpLM?XqjkRb!)4zazMiBQI3hW4ABNBGKbGxp_X-@m-hegE>Z{SDvu-@J?8TkrmTVcBsGU(YWryPm_}`{#AO_r-O-_xW|c_oZdu z8@}&K?-hQD`L!^;cTIZleb-KFz;$vXRc{W|IAC)e5EZ?E&cudVaFZ!SB(;rRD2 zgWC-+acggQR9;)`$Bi|<_eVsWJ&Z@G)!`LU3)cTy{k?bdaS?Jetg z=Xclf&TH23&U*S;&wOrP$Jk!Gj(4tG$DTfQ9q+7X4J`EJZVGSa-(BO_*0TohUdNu^ zwDg_AN;Je@J8FMRv~!J1@a=WH^NOX@S&{6#Yw0`X^e7=Jt_DnEN+l!(>!!~3!8D-@ zI=+RtV53mP;`rG5-kNCJLQ*nLNHeD}nrtC(h{i2{d7D$!WfdX6Pnnn>;GWq)s_j=j zUPb-3C_VS8*LV?Tb7}dWd)3AE*?VUW+F==524#<+&Y$7*cg2CgciNernO9Ky&i0jD z=)}4*GCr1f!=k313t1ti&})3@W4EOmW0}8FWCw*;{=uUuHdr;0y|J8?Y>pelaxf?t zvMU~CeE19PNH=z>V~tk-kufk3`zuD<;Uko_H=DK$%(HZ1Z|0w()m`f?MUG zwmF~5LW(pZ0Lot3J!tC$H<>pqMVH|ZKX2*7XSzKQy~eJSO%qp`HS3%KM#pt}9rmrv zsj0C&&au!&o+W$Mh}{r|8*6*|fo_&d0PdNRl7XN&yI5ASVUIpz=%f8J%zUgphZu;* z$L zWefxYQe*cYuyOsqpz*PtZc%%Os11M?h}b}LR{78aTxhA`EBzC)ZPW{#U|$%c+*X9T z?{vG~2eU>u7`pYl!b3)=sL!$d&}9~7=sT9{PA!d(?PBTE=eWi9x+*{^GR}g)6c@(P zmbORCCC$U$bi>nWkJs_<8t79tb+PJ#q{mJh1k~+${rp!@{O7CDP4Mo_)u_qjK0XX4 zRi|wDuVNy@f2|+EyD^Rr!G)SA&(JZ~sa8Jx*X3K5ulgtP?((Br{@0cE$ku9mN))L- z_E+^G5y;@3_Zd57C{@x*cags(H19}$Jy|>re$ar5eu+cc(~UYV9y=KQ1WOLt-r=_= zkB<$ycTY`?+>6W~Q58K4XR}a<6O38XG@LN=WJlIPI{h<&3;Zp#PF%4$lkN@DKKm4D!z5mvyaZ8VU)|7CveInIAI6G5eBv!|2JW zF|oul%w6-kcx*h?c(=-9J&0Dm!O9)$p1dBuJH~`Fr)zZMROIuX(zwoxzt}S_2gjOo zhirNbLyb3nOjHYv7sl?vrEv$EM`M!)P1~$-<|fjB_$blB%RF%G7`?)hrN%b%Df6dZ zYHWlak4`mi2ln|)&dTpy=7~}B^`^_toSHijp4mJ!%YSE{5%}}_=gyoD_fIb@&R=`x z!hCS%^lU4<=8Rz8Ukn${n4a5HiSpG}q0nsl`Eo9okIpw@z!?061ACebl@1w5 z;f#9O1`^E7Eie%Jy`Fws^mQ_w9>X>MB|ANP_1u+VD?1+shvpZiuMTIf&Cbnd{b(_q z&o;y9+5Oqp{M^BVAulIwu(LMy4H)+dYu8z~y^i1o_`9lkf!JhmXwZa*>Jwjt6d5c zX4%H<*YK|9qkk{llu1EuQt=+zM%}`_W4U)3f4VNt9ZV(n z9v9y`Jl$HH;&XC;GQK|*PVb*u?A#CH`^j@h@%^-}_w+sA^&ON*W%+AOUoC<;H-Gi? z!gO)r0}V}0NC?(tpEYh2p1BiQ@)?CryH>tsY>)}P6S^Ye4_6Iq)%5O!!5f)Y&mO^8VV z`RoFk&mHYx=0S|{Ui@{o%|6X&&yr_Ezx0gT(9Zn_#P^fuPT~7~`0K2`eX<=%o@wy= z$^5NI4-YL&|5_;A2&TdSjy&nNTG_w{o))t}#C$X}cX;iMEF5aCxsgZB%{~g6Ix#UD z9-eHEXBp~jtiTcC4In|o2%x_pqI2;vnUv3ZUc%q~RdA ze{Z4BZrZv5`#r4BSei8)G7LX;+`-y3fOh{4fwe0Z`qgr$-K0`4rLSM6j{qU(u7T@w z7ZxsEymlshXc)}+m=YkafcR)8laj1^7s7WUx~FcW?9OPEBd=>>mb0S#7iMdYLI zV*}9LGms({u)*y*J(W7a;pOcoIo%}r{tFeRIMpL;f*y^0_AR>Rm}w51!adQ}6EfjQiZP*PgMWjCZJ5SV3co6(~Ol!Uar6 z*~_M6a>`zWggcYHba8Ip-yb^5L$-BjUe?aG@e}oNasE&sfEDb;{{(mA{H-L@EiAUo z%(Q47o+*)fM%Z7wS0*K$ew2o!7p_HyzK(Y#L$A0lv2E?(j2~=-Rc)oYE@xBQc~Ya4qiLi3y*!{Y0fQ9Eph(-@i}Bd<*~0RlF~n4?~#-7Z&~CN^D%% z{Zg6xW>P2Iskr1c^WF4wIsN=PgiHR1r3%B`Ov`MY*|W1aFp}p<@HJdt`n)XIX0z*g z{`mNLeBW3_ffOSo27q9|qPY+D&(9q;Jq7pqokv5$YjD}%w1`YG+?ma!BIYe0g?tOi zcj4Em{Gm%_vH5CynzGl*H=I1PkI$la2M;YwL0jhz&9o#VP0s>CtS%0b*}20uPlw-9 z!4#r^=7qy58vR$p^`+<|Kd|v}OPVL;W7J4jYKQ8% zxVwR`L$p!qAc=aC(_V*Dq_ zM#!iA33v1_@f}P4*T3Yu=*({Z_V9NGe`oTC>BQcZe^`F+0)IvRhRI?W6kBuiXSQY> z5w+l>ipgZjElAr^$NK@}TU2>Dfu~<|z;&wd?+w)LHa-3lkAd8}|C%&g=d) zo!8s%-x~9ghS33n4CdxdHrzs+S|jN*@+CVrim_fr{0jHAz5&3bc}?(_^!Z>u@8wVPPUPUWAkMuP@vdl* zwbdu{zLnoZmoaOZE!oX9l{%a6N&64s^Ev#f{p6ouy1}2HjppVL_=^aC`?HJl{xoqm z2M)TBHODQS6%W#mm~TG!Y+GKD-*A5BTD^+BB=iqtTd-98g`JT`2b|&amw&;{|JRYt zWgBeEzdUf}?4bi#33WZ{!R45lJg=(Qzs26j^e6dh07E8r)u~MuSYsGpgSIU+%nVk>Zcc3}-lSG1VT&MS1~^4NNMY&NUA6P#md_b0Ncm(!Nu>y2Es zcJJdVIO}~;Z^WQ48i3&qsBrrlA z`Zjvp!ZVVOx}G8K0YDBGdmrSP+j(|-@3VyROt(UCIs0qjyyBUD#54Ein)?3N)1$Ng zfiSf-a~MnSq>K1DL!Z6B`+EBKM^i<+A4gtJOiWH5jz3QZ%}E7LPE1VYimgfuP-r%T zFsL?nmc=9Vwxa1e>MnZDbNJ>Pj>FaolXj8 zf>t#G+X_*wpn;c!7k(5J^7UF&DuyG$sydvQXvI$8q_^bzB<=f!pjxa4g=W5<_vxhB z%2&fmy;!O?!(13OM<<7Ll6aOUCOV&*bFFKWPV{-Q7J|6VYCYe~S4-tqQOh4Rh0~Cc zuY1%NrY$sX>OjN5CVDJuGue_#y>P>W+n@@u#~Sx5VLyOujaIAwQ4ih zgyPl5&iC<^GP8V0RaGauDj zrJzw)NIxB zOurl!E6rAU?3ahk*SwFwirmi=6N}d#4B0>jmG%Xk4x>V;St&*3TA^ToQDqgOe0BJ5 z)XY`3Ja5<(tySk(j=M;{z$qs27R)YA&ft6vXT$kPF^)-buO{}5WDGoKjmSl7Pa!T; zBPc<$SSwVjwGwkJLlS~&$g0Ga8M&VTEn=;c`M7)M>egg4DEYZo=tEC^1T^)NFZ-1s zs29Va)btUNGQ-$`deBC=zT77#79>5nZN1n*?}QM+qz6R{R&s@?;1}yY#2*kBOcr3o^;V?{ZHDc%3ddh^1EZW?5AkMAXIo+7dhpn*Gj0z#?BR))#Hlu2;P|D?7t(xBqTD8gv=Pzwj z@S00n)0asfd?_K67V=@OP>OJaPL<(NO}`aD$m>z7*NOy?K74^CA`KWXpk$`@(ehtmz!nS^(pzGFXQf>J4}C2l>*xpR*L}=VKaZ~ za6uW}GJYuxYoJFBoQ{e)fa|nVyOtsjUYJzs06eNvxz9vmVL)Vz%@0U-@u$5Fc)7Dl zFq~$+3M(m;>(!`PXw_@?-Dxv$^1Pm#Mu(X~Zq0?DdLh(vOb1MS8kgi&Ou~^xDZrn)htD2aSFtVQ}FrY{^FJUhOyv zXhdKVBAlT_mczR5@7T9eBc!cK=2HZ3h@7rAa?L1!6xV9SvhU}^`?=lgo%<7?7_aY> zpR8BHatrt@Adl7yRlmOT%%0^kNzalW%(%`AMQ8xDvIQq8MrZ=}ciWxx(e=W?xdlrG z;-yxQt5@@tT(ekemLZD|cq9fBR#5cRg-uLa*aWv0F+;$uFY1sh(EHRHT7oA>O1znno^5vS35|f9*m4kBSfxBH-SU_MR&I%LK z>p|b-NgA#-;TN@Lp_yy79@OYer1Pm~O0DSymKeMG)S+2cY^sHkqkwW&4C_eOwc76T z&<+8Y#c=<;IK@;kA0l&M_^1VbE-cjdRC*xZ*)p{uE(jePFsdl;l>FB9RIWgV3*bJqvVP`+J9F!N>X{{al|#&_B7#$~#f!`j-qFkz<6q*7 zL)jQrC#4o^c76^nRw^KhR0_2gD#$8cD&(SawE$|A%VI^P!u`6YX7izC1cYL_g~%YQ zRSSMqk6Xq&Juv~g@4aldC=*LPH`$!KhCGirU;r}#=uij>;7=i}`bZk9epU1ZCKF&I zt5?HZv3!vm8ofaO7p4OMc7V$jFzZUsbK&;P!Dl(Exu9GNAo%5avC@bKGL&+G=ktJGga^vNK~w~ zkZ~~W73=4$H0PLFvyIWTAir4+f@bJfasdRPP^nMcKW@Q*+!f_RLs@(uD2mHRDF) z&(HfP5CjZBkDNg%hAO*bc4C7oB0vIG;6gz9LVofwJD7dx@s~X~`>0<{fZeq-<&!jB zFZ#uNR4F63=FVQ38$|(mQS;&?5J$enT z4YKb{AtLxu8IxEu->jhFo!c7H;*sdea9Bu81#49fR-dZ|4^7Bs4~RQZXWfu%SbwCc z2!XCzgCf?-`S4*!Mhg6Tu2pDB0l^YcC^pZlI-qPD)gkp3XFTb=GVO6dmxElXitdGV zFDSRp-@n(rId>2!HpBF!8KectSg9{j+(<{%bKsi*y}k*~c{ct8n9t(PXTr5wh-jWK z1Q0>MwtT@k9U$#|>H*h7vopj(wRtv@UanS&>aA*_P|Y=~7oP1#+D?gLyjaS68ScPd7g>*a|4szF%teT>zQI120w4qkiFIeRbD`o&~0 zVRL47IoIWXzzv6>tz`r9`(RP zEbFM~u{w=uJ;(>r0c$?$Su48OvcsXj62|aHvCIcB;PZ9zkl8SNQyH<4!k?S?dLI4o zL_tUttxHYe>VSdPE^t6~oY8)h~()&tyzkabZdMFu>A*z}@_%)izLy8>p5l%^+V!8bd~` zR?CmOYE3jIMiHY$6BCyzan(rC-p60|t7ij0OLABlbFI}vWDaxH3R+^NSp0wIb!bfI zQxCO4BE-f^JOV+NZJJZd=PGEw7;|!w4`}}KMBn1MHN$r7KA8R`U7RsM-$T5qScb}Z zjAhZ|w|0Sy)4_k`Au*X=QuSeocmw&Y1y!s~*gtDQz4fc+KjmT9fQ6h4d$n3>Rs4Jv zVY<=`3;8FkweMmvf&#aKBIucG7Aljg?;Dj6TbTC0irK2xy8PTeXI~t8*GC~9Dr*fp zY~%ucG*@V{6~$T(h8slwg)22;Jj}TpABx?EmSW!{tQx;q9Wyd|V5=N77x$Wy-Ni1O zRJ)l))Wj(rqbKCasiKaWJ=(u^W{#wZw%Nm;otSvEUWtFC$3_22LQChcZxh5(MnWi* z&|Upy^a9i5G0% z7^mv>JWT{>in)AE%<+OXwv$*9r?CI}d14H5Wj|lRU>iMhjV;B7L1$(~Ji-jzEEeHb zgb>tf``0?KWF4juldD+4E5%w96|~iyS}pZT$REa@VpTTEDs&86{q$NJ!1x}O%9XI% zY?kX#ge$_B{Pn03iJpKaJb88ps8%mvRZEz65R6*QYN1uF|(UY|w}_?M~y-u`+dcX$;q#DP`6iA~5a<-&^JlDRHu&aQO}3VyxV%D3_?5%%6% zZEmd%6w%Ef83jyetwPN&A6#n#007RPpo*|v_H$AGsp&ZonpF}t+|0F-Z|Jn zzF93ciBh_HtqtHc$+vLsW0l2aS;`+?YXd>K85Y5>3QP>Ef9{&KHqeqNR=}K&)drt~ zf9+Zu2rCK`Xyrnpxrm!7{Mwou2wHV{#Ojqwh&|JPV$E2eGc8X{#J1&&l$rO4@LDI( z;2j2m3pq9rKM5Gf0yaxeI)4!VGKNRM!{Vf>Kg5Ahz3fX6Tn}=X^oR+lRGUve4%XM2 z!LMSpO}l74o4kP6X3sKJi;AN35kR6Fyx5G` z(Sf^7e|Fb|RkQGsf7=#X{V*Su>V*ixQy`$H`fTq)*ZJyNQao^{ErKkIct$a|<0q*X zpW~f1nD=&^XXyH|*Na)_CK*Ub=ry3_};omi}_rBo_B-S zOJLfnsvH*RsRQHroDBuRTM@fFbRLy}eu>b;MswPBXUN`bl~psyZ%zvU(3f+iVpJw7 zBO(y&H-3U+DMc8rN~I>lA;=`7@SYZEz$F(A)S)x5!;q$#*41)0mnvXF94Z7`Q zuA;8`xm-}e(~KLY@B;7R#5@$g#RmG-D60JSnp;4HEdciCy8n4`bnoWmS@z=He3%L7+bt z#E6L9;8m-94^t2klNih-)`x!K)vJ6jLjJ8`@GV6(zf=w@zw13|Z|mCGI0nRIfv6q+ zb>8eF4=wK9)!2Rd*$=w-(BeVT_0Gy(B9!l=@QFQ56g#%5F-uZ#gZXJiSGmHxnr;rN zh<8#kdpPo&ukjkon8gPMwGl_s1e1z&+~cs+LjASgs%2rKs|jYUg*CrG7*?Tj^Xgx1 z5pYn&M3To7f*@Uco%iq|BX0*0w?A0ONLMs5jzj!!ArbTh7F26d@OudknxWp|o@MQ_ zitVC>fFu&%KreR=%TkMA58_VC0RsQ)y=vbMb;ZlGG1n4}g@=<3DMz_-xk$Jx0-iz- zZ(04DDCU)r=r+HVCl#gohD1Oc4DlwAGztGFUNe*}4UPQwSAGQ}I2%@~*UH2n)$7$a zdN}_Tt~3|xC|zQpE5$n5L9QCC0sL+GzM@*nl{c*!{|PZd=R&5alu9`2a&Pt?masuc zpoOD3yJCkAIMM)MCSb0u`n4R2PPIr*Snl24 zrLkz=hkd(Fhv6)x*v@Eusq&bBQOjqd)gqjn9YR7NFA?$?~SZu2z_5hp>nD zi}Z(Tbj=R((`1(rAB1(tYYUeFDMENP|Im9>yeuZ5IN})JY0i-c2~b`(ckyAOO1nf8 z{IJv}wm{QD8B&7>x{e_aYSR3pVQVGc+y_LmSeQseAM-+I3U5=?mbEJ7YeHp6XF%pe zA^77BX|+O3R=r%SSBa~^SyFuOhO}BmJ1hJ6^GIt_AlIL4NUOC1mR+<{(tGfG)}lZ4 z&h1xB2fAZ=txCKa5Oj!;wJg?^)`g#sD{p!s}j>km{j<_^)`fh4Qf=v zh-^-*8~*#fVIc)B+ihYZxwhI#Xk>n1M+z!L)<;356#5?++DIqnr}N1rnGsS;=sZCK ziti&HI{2Vh?xlV0QV=q3`DE8P^Ayn}grsA|_5BcWqw=9ui9Mu04iS5bB+(KJ9uegh zG>Jj|u(vBF4DqECT3HG4&y$Nregg4j&EPLq)it>^L%PP44dB-C5g|I^qxy*V2*=R7 zB{<{R9rhSSBPe7s4hBAN8*8UC_1-WleNf-l<>eGNL>Hi~?88s_HBzs7Do2 zI-3?6iCOhycU8xD_bNmez>2FRN3_bfC!*j0xh^*E<->f7u;v^*iiEp*@h`n6-vz3R zRnD6ub`UKd>k=kOV*QGomE!-^hEP!~t0cf7MwAuP->QGyo7w>Nd7uzVOlZCylo2>U zmwdDQ3Ge9}!roT|vtEkt7m(xg;4b0E#0Jzp>7C(FClOs@Io`#*vG5^@dAOAQLZyl8 zyVU%Y7ss>@fE8lNR0c-dRR&B7&L<_EG0y-0;(&RaGWk9`ASOh z5D~UJNv`v`M}gjTx(xhSF@k2TP^~qq7f&ynScNIm zUQil}(&|mDtd&AM_5nsAze+Yz{_nj~ZDRXT5Sf$BvE!)R~;!6^%VbEOA(9MkOMY$bV}V zKIiRd?@v2Sgp@d76-yH?@I1bpfAn7B4OTZU+kM_LBD6FB>|oO^3hNDi-_5wq?JjIr zd_puA*0}M>0J*kMcs zd_Cdkz1Ci{;B*v?l?t84-0nu)N@suYSQJSsD&M*{<5qUb`cb6qdqHpWIMs zksDJ4v+y(m7yrBle5{qozr*!QoGr$na^;KOi#B8qPRs0PM!l;OE9FckRy@08A;ciR zg8Q^WS_8UG;Y(h_K~nF=**5~bP@OTN5nMe<3a!Y>^|aOXrGI#&Ns&UG z!@XRktVpx`74KOa0tzBD-GXln&b7cC*H>lDFz( z$9L(7lU6opGIq0;t1{$}>{~)8_4B!}d85j~{JQsqzDUP5Y9>w=4e^q2vB&w^en@lR zmw1%G7MX=D68P(dA~8YO?7p$G$V>?ispy1$AZIjN;WxeRsPIO75E)EG{;I2$be;F>d+=$xfP6A-6^62DXVOgdD2UoAeQLf zzj}vV`vb%{_d_B_!fM#Ey={IrxWbG>oZX2J?_#T3V-i}8yf_TM3XqR5{5QYj?O$8Z zy>0FuOp4gxDdH@UY{=mwt`m<&^WVJLwe>Wx>E${kf~JaRSL8}LUf=cdafeAgr@qt^ z21$krA;^BI6xBm~pyhwx;EfLQco50;M<*y@{foZ0iZK!8LX2{Wkg7WDw^aYWR~fhz zmSobCeU3O-ATksWu=3;cKk$Ym2F4MQPVh+5*dY8`kbEA^wLqpVVmAu>54|`dD)xK- z$h*KT>PkZD6Q6js6{$R9VQTt-B`uRaN$fruaaQ1~7X63UNPsDcksS~#+^c7mFwO}7 zo7Cu7_33RrwZ>Sw-HC7S2I*3kwPqjEVcU<7W3n0?AW_8!|$7!&_tCmz2e zHaTk_f#8U~J>lRaMpQ^oAjU83} z`OFcMb`z3x_dZsfNO@_vk6lu0-59t zw@TF;HfStENbS}BC4g!}M3ICoYC?s- zwT4cqbVq?!TvJ5<)yYJ8;Tqm0Zj{n5q+XNvLexb0Md`=K;<+*gdrjBwhd!MLw}0;* zCWa4b8PV5avj5_A5)Rs{AY14Hw|Ip#F(qeW160&URCr1H8rN@6tZ;YG z;7Tb_JyE@ApxxodR1jjEaey%qw4~svZf%)p^jhJ!(~ntUE&AL7iQwF&+2#C#pQjvJ znfd~(MD)`1{My=dPj|)O_pWvq#>oF^rpu{Ph2mVq)mAC>=3`v{o%Fe`nZZXZ46y(< zsn1B67$Q&!iOTuSm!-E___uSl<2u16_40IF;ifAy(&a?XQfgmMOuDe79A+*QL7=?U z3h^799ZF>TaA8JQ4nLB6cX2N(NT*l^Zlb5wa=^bwM2&{EjDrECvR200dP|~6qm4nx$&+pTImSoYA(ybt6 zl%ZLr5yW4os0$R3!$jeZ62(@^!E4jY2Kh}9ccc(1#z0OrvSe7If^!r$!{*JaezSr? zUW8T$CCWFjqpw?+K-(lAo2)~C0a6;|e{WrlP@R+nTs$KzBh2&l>t09nG}WOblZhO2 zw(XYm1{>-qbQT3v@{WkoXkt}-Lq9`x3gP(|UA(Vx(d5G(_o#<9E^Bl#)Fv=R*daCz z;w1=E{r&WbgVKxNm|nMefenqwjHg-zR;Q?(dsCXi2+HL$n_cYVdUJYDObj|UAxA|V z@gRtm>~L~B^Q3v=n7=ihk4=7E@|!A~CAJeF5yL;)F2$e0zcTi?x1=B0OF04d1&;C< zl$zfpn&Zla$>|8egAya=gbTwwAVnHLvq^?_%YSS7!o&&J%gZ{X#|Gb9#lrEpa;r>D z917Esuj&(B{kl@tt+x*%GlUUWVJrkHVKFM?EAL4E-Y`Rdw+ncfoj(zN6XCO8 zP#6)QT574j~1w%@&mcgY~-MMCENGUUTAz9;?aVJqATnA+g= z?KGTx>RsC=f#5Cl02~oWp3VFpreC*lV|0<$tAvDPe4P^IjMNqS5l3o9HCU1OF9E0c zuKy_gieUq7N6~NaTDIGbKlH66X>&-21dLHM4m;x?r{6GafL;DAi1<45+lC-iPupEz zdIu}-0Y^BX*-#S-TgH3Sw{GZQ*R=CpqwFaM-n0Lh?Wn{^39YDwj@2yw$r_0OSzoY5 zly_=f)(WlCpQe9j*o<9$rPc1snx@(*-PAKV;xo}UaaTbu*qY*>rEzc%t~|fC!L1Va zdWL1p*HK5w>JWKuodKj zIB)(|Hs1+FzvGHPSbr$9!c#mjPwKNXOS!lnC9a zeq=+tEEWcIN#<5W$QgO_RP?MBOCR01E+30PIcQ-^MDDPzI!TFY!#v~I7f6*du8b*ykq8)TAs?|NwS4un z!?lyP7TO-61GKi6U&8dT5VrQqi3;oH&=U`wIDVX%W1CbgN1Vh(1O-(Q%7xDjw-NLd zSYFovmC&0UVAR#x*{c~STa6?IZ-QHJ!b$EQ)6XBa*G}VE&j{U{`v0oN1W_diudGyb zKf)9FPw5v98u%^|u}Tc1B-fEx%y%b~~;SZo6v z1y3p4#u1h+Qcnp=`@-?E$WiisEk^5yi@67gpcl}#RsmC)7DC|u#BZwumwe;nQN2U`&$+00FhfFW4Tk1k09Es<<0^wT} zO|28JLJ1tQ?`!q1uQr^cNFX^Ob(AyJIV;81H`1pM_HaQMlrn}qL)l1j^zuRQ&Ga*e zr6#PUt{EbGPfBj@jwOH)$16Fr9Wp2(Bp6-loP2~6^jqn6DXw;jj!W$LrPWsU%PRq# zlXy5Fn0l72*0+ziMM{GrY!e>RBwU_Ix_@1R8y#62#j{A!0}jve!{T?=@GeII5iD-y zprQ)-E&rCjpzA;lOZva`TFyZ{AaLuH5N~u9DT@J)R2fd7D`8S8H90t|+5B!2o?#9{ zS3}wk3*k5;`J&>}gtA*bdMFLxdVo+NF&Fudd zcOEfv99I~YSZ#r}3G3jSPc&c%N?doIZkjMeK|1&#K@e@rHVmw*6NlDvSKx9b@TQ!p zOo_@lP|i6gIp>^n&NU-|)(=UTWI0 zYxY&70`6poS>%}$l(3%Ia7X8i9B3z(QNn4>#WHP3pLaw@XWQmjuwGs=g3?t&Az_^qgE0`F>*DmWG#>%nQ?Gi0ar76q8cz*w>8vU>x~LN>~9MxmN5hm&al6OJxCr(0658 zpl}RZss$H1U@qyV*NMlv=4%UZV*0DBwUU-U)>j=Am9R_(3C>B<2b}DBaj@$x^va!n zyNhD=k9yl2^8P&&`nrJK9bViU#KT=}8v+`q-@t0w!{6&o&3wpR5E8K=GzItS-PnDm z5B!~nJu5r5*+IcWM`~rdLi5A!1-6(`W`8wr>NbtkMmQNZXWWxuSaSJWy&FRZMKF9S zsPih3djEi!E0Wo6thk7tC+$<(GpfMZ(5^&>&krs?jcFTbpJ|yuD&fE@w@D#Ib;|)s1nkQ z2(@+lxF-hqoCFDFat`<RE`wv?icol@^S*ORX-2~`>__6SmNrR*srSk}9H zU8Nycg2e!W4R8@Bt8z(_luWKT;!-r0Vxt}JUl2)rU+ZT z;DO1DZ8<<-uX9zf0JSgF?n#z>P`rH7)|R*68r&RdbW&Upa!e5?MMG0QGIs}{m5EVVT zo`Stf!7%L+{IGh6X93BS*6T!}0o=BAwd1T?Y*bQ=mX~+z-M5gQlE&zV0=!vTRPO;D zC!$TnNVvo(=ickZ$$3BMw7%VP5%#);ee<~}NDSv3Uv8F+8WoiH%>k?^iI(p(d`qz1XG`45i7x1yZ0thFc7x%b7?XS zZY_O?fjD6ZEI@3TB$@eUQN>KvbC%1eD?Ww3>F|62$3CY@>RR?&R(ZL+E5}d2Rnr~< ziU7H9#UqI>Vf5B=R9jxIIEb0x6^4H`HN4nMi9BYY8JLWz^R`tAsh?A2OhL5-VafdpeEQTW8gBR+Z zs}xp$w+f<8XFIEo>fz9Uy@&)$8K6@BE)jK3|LS1AY;jp;sa7>xy$&@R@J0D5HJFSp zhjXQ%f;aayaM-1az5mzPh4*niKkr8)+ynNMj>o_>noCPr2f zO)JuE5PJTQSZuy~`FbUV$60jE4y8n`3U2gM`Q0*9puW33+C_CJd1#&s5LN&V(Dee_ zh#YeI;nB`63t3-<1rLzg>PaY2{$or{Gx>-(ecMZhT~a4lh?f=?kW$#XwLG6CvI;a_ z-_G-|_OXM|hhg%m5E>4!$7bDQiX${-Z6Xjru2&p?RJ5ZgWsvgWAoi6m+;XbfU5cqJPsUe@FBoQkDf^S1yLw{ z>8C0xtp`sOEiEa9M!oEdc%`Cm!0>@cAc4rn z|B~qBSY1!W$JAeDXzx^-f;hN~gfO0S3tp?F_vNRrDO@y>enr<8N(uCg8X8~SmE3=I`v7Lo6Mb==9v6A=&b&x0DU=YLHUlnNLq<&@)BDuP3p{Q}KVkRllj zTP#t>556wk+&U`S*5p!E#v6};K7dmJfhy9ofb3=85HH9d(>E4)Rq_p1(Xp@)HHa?bKqS66m{9OUosQn$fuI%GgBm*Fu_zd7v;DmS5?}@qA^+@C*pVB=G zhCrqQ?#ztfWAc3gPOWA+7AtsI|KO||*IHDv-y}gGH;Hx|$}2w*N!Q!AdqakGuQrZc ze`5RsE-W{k=8pSA@rtf$hK{%Kibm_hi6Oj&qq^rq#`2@?IoL!yj8_4BvgKnMVZd^s z4B{WJHEw`T$o5tFo}4BCkA5Qd)`x8{N|S8n%{Xy!-jRAzfL^$ev&AT_1L$_~@BDNo z)fN)W!)i(70j2KQlzt1$e^REUUA=cl)nl!RMJ^e#m4-{ zSyqOyoD1bFs?aJS!E*mJ%gT@+M@tZJsvnV#9GQQfX=NdkeFBqNSNk7W>W2lse%5H(w!%Ul;YS+tbfj?+UDD0r{Z40D+}GK z>B{t9GpTmO!s#I%0$Ue30tmCgi1zQQX}zUKrO+4#J(x4o2FrPy!Kh= zx$#2)H4JqeUii^STEKH_|M&k`H|VLrB-@ir7*t0c`|-7Gi_k}_61)}HDl81&dSaHl zSr{Ozfhq@)SuO)oJ}J(d!l*P2nE_ux<)HOrlZY15&PW8};FM2^XIBUz&o^5A37~xx z@epVm;(eg1E-;EfX?OUk9++Xj>64d0Fq-HIJV`F$?h6m65Eo0x1>M34fDV{rUo?$E zE;csO2RrANmUdra%<@>lcz4`H0u)MmYFb`uOv8|DE=FVrYktAl$$T_{6ca9VU{-vY z@xo^GsxKFlg)~tAj>hYng<-pl1cKYE2xM6z;5YYvC?UI7)Dr zPz54^_^be=gwEAQK}gYb?B*$d+J%RTBVHE=wl|-!9!iq?jpvuwsS-_ytaj?4krois za3D9auQApnNRN7Ov#Q9RR3X_kzSd}XXIkQVToX!9A35y^raKI805N>*UuSG8MoPc* z^~Q6n9}B+M8;ph7kd)-!M-*r*To!CFIPwVq-e_1=Sqr&{T;%pe#cihfI<*fFUk74T z@V?{rhY>fpX^dyIZWWH&7<*nuzJ0(**ZW%4c!08zc5AW|@>W6iLBkcG9~7B48>bY? zgZlpm;#xyTP-`*3LhY2~F>ZCpFIw3xhTX!RpT{Bwb;tB0%Bd<5Jg~5l4h~jgAw6`f z@hrVCb?Epuqd=(X28L+92tyKBwKr{<> zU`-1Q!-I!Fxs5;PZewY^Q$cs=)~#nKO5~x-n*e#f9bhG3zLIwZa}dxU|DLj^bk}Rv z;jLTq{X_qy-y<#vU4aLo4GA+?lWFoopx)-&5@VJzz)zN z4||9UME4s`vF{f@id{e79`#76y`R7Y#3JxyKrZWA=>vvCSB^yJ8}k%6PzJtU-2-C> zx6Xq`5zlDpMh!E_dl52)fKHS|D#8%cxPXBa&hO1+?gI}oXHoD*u;M+yhEC7iS~(SsE6YhS#yCs zXKp?=L!H60kVxEYqg%ekGPhXXahs1-TCjUJE9-5u+`PQBvIjr|a+DDxcHB|t$ps2I z%AB()Vv|}VTMBJZ^|!guJL1Hn`LYTymwI>`PB Result<(), JsValue> { + let document = window().unwrap().document().unwrap(); + let body = document.body().unwrap(); + + let cursor = document.create_element("div")?.dyn_into::()?; + cursor.set_class_name("cursor"); + cursor.style().set_property("visibility", "hidden")?; + + body.append_child(&cursor)?; + + let mut first_move = true; + + let cursor_clone = cursor.clone(); + let event_handler = + Closure::wrap( + Box::new(move |event: MouseEvent| match event.type_().as_str() { + "mousemove" => { + if first_move { + cursor_clone + .style() + .set_property("visibility", "visible") + .unwrap(); + first_move = false; + } + + set_cursor_position(&cursor_clone, event.client_x(), event.client_y()) + } + "mousedown" => set_cursor_size(&cursor_clone, 18), + "mouseup" => set_cursor_size(&cursor_clone, 12), + "mouseout" => cursor_clone + .style() + .set_property("visibility", "hidden") + .unwrap(), + "mouseover" => cursor_clone + .style() + .set_property("visibility", "visible") + .unwrap(), + _ => unreachable!(), + }) as Box, + ); + + for event in ["mousemove", "mousedown", "mouseup", "mouseout", "mouseover"] { + document.add_event_listener_with_callback(event, event_handler.as_ref().unchecked_ref())?; + } + + event_handler.forget(); + + let elements = document.query_selector_all("a")?; + for i in 0..elements.length() { + let element = elements.get(i).unwrap(); + + let cursor_clone = cursor.clone(); + let event_handler = + Closure::wrap( + Box::new(move |event: MouseEvent| match event.type_().as_str() { + "mouseenter" => set_cursor_size(&cursor_clone, 24), + "mouseleave" => set_cursor_size(&cursor_clone, 12), + "mousedown" => set_cursor_size(&cursor_clone, 18), + "mouseup" => set_cursor_size(&cursor_clone, 24), + _ => unreachable!(), + }) as Box, + ); + + for event in ["mouseenter", "mouseleave", "mousedown", "mouseup"] { + element + .add_event_listener_with_callback(event, event_handler.as_ref().unchecked_ref())?; + } + + event_handler.forget(); + } + + Ok(()) +} + +fn set_cursor_position(cursor: &HtmlElement, x: i32, y: i32) { + cursor + .style() + .set_property("left", &format!("{}px", x)) + .unwrap(); + cursor + .style() + .set_property("top", &format!("{}px", y)) + .unwrap(); +} + +fn set_cursor_size(cursor: &HtmlElement, size: i32) { + cursor + .style() + .set_property("width", &format!("{}px", size)) + .unwrap(); + cursor + .style() + .set_property("height", &format!("{}px", size)) + .unwrap(); +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..74755ef --- /dev/null +++ b/src/main.rs @@ -0,0 +1,139 @@ +use std::{ + collections::HashMap, + fs::{self, File}, + io::{self, Read}, + path::{Path, PathBuf}, +}; + +use fluffle::{ + http::{ + response::{ResponseLine, Status}, + Request, Response, + }, + HttpVersion, Server, +}; + +const PAGES_DIR: &str = "site/pages"; +const TEMPLATES_DIR: &str = "site/templates"; + +fn walk_dir>(dir: P, depth: i32) -> io::Result> { + let mut entries = Vec::new(); + + if depth == 0 { + return Ok(entries); + } + + for entry in fs::read_dir(dir)? { + let entry = entry?; + let path = entry.path(); + + entries.push(path.clone()); + + if path.is_dir() { + let sub_entries = if depth < 0 { + walk_dir(&path, -1)? + } else { + walk_dir(&path, depth - 1)? + }; + entries.extend(sub_entries); + } + } + + Ok(entries) +} + +fn main() { + let mut server = Server::new("127.0.0.1", 8080); + + server.on_request(|request: Request| -> Response { + println!("{:#?}", request); + + let uri = request.request_line.target; + let uri = uri.trim_start_matches("/"); + + let uri = if uri.is_empty() { "main" } else { uri }; + + for entry in walk_dir(PAGES_DIR, -1).unwrap() { + let file_name = entry.file_name().and_then(|name| name.to_str()).unwrap(); + let file_stem = entry.file_stem().and_then(|stem| stem.to_str()).unwrap(); + let file_ext = entry.extension().and_then(|ext| ext.to_str()).unwrap(); + + if file_name == uri || file_stem == uri { + let mut file = File::open(&entry).unwrap(); + let mut content = String::new(); + file.read_to_string(&mut content).unwrap(); + + let mut template_file = File::open(format!("{}/main.html", TEMPLATES_DIR)).unwrap(); + let mut template_content = String::new(); + template_file.read_to_string(&mut template_content).unwrap(); + + if file_ext == "md" { + content = markdown::to_html(&content); + } + + content = template_content.replace("{{content}}", &content); + + let response_line = ResponseLine::new(HttpVersion::default(), Status::OK); + let content = Some(Vec::from(content)); + + return Response { + response_line, + headers: None, + content, + }; + } + } + + let path = format!("site/{}", uri); + let path = Path::new(&path); + + if path.exists() { + let mut file = File::open(path).unwrap(); + let mut content = Vec::new(); + file.read_to_end(&mut content).unwrap(); + + let file_ext = path.extension().and_then(|ext| ext.to_str()).unwrap(); + + let response_line = ResponseLine::new(HttpVersion::default(), Status::OK); + let headers = match file_ext { + "js" => Some(HashMap::from([("Content-Type", "text/javascript")])), + "wasm" => Some(HashMap::from([("Content-Type", "application/wasm")])), + _ => None, + }; + let content = Some(Vec::from(content)); + + return Response { + response_line, + headers, + content, + }; + } + + if request.headers.get("Accept").unwrap().contains("text/html") { + let mut file = File::open(format!("{}/error.html", TEMPLATES_DIR)).unwrap(); + let mut content = String::new(); + file.read_to_string(&mut content).unwrap(); + + content = content.replace("{{code}}", "404"); + content = content.replace("{{message}}", "Not Found"); + + let response_line = ResponseLine::new(HttpVersion::default(), Status::NotFound); + let content = Some(Vec::from(content)); + + return Response { + response_line, + headers: None, + content, + }; + } + + let response_line = ResponseLine::new(HttpVersion::default(), Status::NotFound); + Response { + response_line, + headers: None, + content: None, + } + }); + + server.run(); +}