From 7145b8a9fae57b042642fa045b957ff937c04c0d Mon Sep 17 00:00:00 2001 From: Nick Date: Sun, 10 Nov 2024 22:55:49 -0600 Subject: [PATCH] feat: init --- .envrc | 0 .gitignore | 0 flake.lock | 19 ++- flake.nix | 11 +- frontend/.gitignore | 7 ++ frontend/README.md | 16 +++ frontend/elm-land.json | 28 +++++ frontend/elm.json | 26 ++++ frontend/review/elm.json | 39 ++++++ frontend/review/src/ReviewConfig.elm | 58 +++++++++ frontend/src/Config/Identity.elm | 4 + frontend/src/Config/Theme.elm | 24 ++++ frontend/src/Pages/Contact.elm | 82 +++++++++++++ frontend/src/Pages/Home_.elm | 170 +++++++++++++++++++++++++++ frontend/src/View.elm | 89 ++++++++++++++ frontend/static/discord.png | Bin 0 -> 24178 bytes frontend/static/mastodon.png | Bin 0 -> 7737 bytes frontend/static/mastodon.svg | 4 + frontend/static/peertube.png | Bin 0 -> 2113 bytes parts/{ => config}/devshells.nix | 8 +- parts/default.nix | 15 ++- 21 files changed, 591 insertions(+), 9 deletions(-) mode change 100644 => 100755 .envrc mode change 100644 => 100755 .gitignore mode change 100644 => 100755 flake.lock mode change 100644 => 100755 flake.nix create mode 100755 frontend/.gitignore create mode 100755 frontend/README.md create mode 100755 frontend/elm-land.json create mode 100755 frontend/elm.json create mode 100644 frontend/review/elm.json create mode 100644 frontend/review/src/ReviewConfig.elm create mode 100644 frontend/src/Config/Identity.elm create mode 100644 frontend/src/Config/Theme.elm create mode 100644 frontend/src/Pages/Contact.elm create mode 100755 frontend/src/Pages/Home_.elm create mode 100755 frontend/src/View.elm create mode 100644 frontend/static/discord.png create mode 100644 frontend/static/mastodon.png create mode 100644 frontend/static/mastodon.svg create mode 100644 frontend/static/peertube.png rename parts/{ => config}/devshells.nix (83%) mode change 100644 => 100755 mode change 100644 => 100755 parts/default.nix diff --git a/.envrc b/.envrc old mode 100644 new mode 100755 diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/flake.lock b/flake.lock old mode 100644 new mode 100755 index 94a0bc8..846d196 --- a/flake.lock +++ b/flake.lock @@ -45,10 +45,27 @@ "url": "https://github.com/NixOS/nixpkgs/archive/cc2f28000298e1269cea6612cd06ec9979dd5d7f.tar.gz" } }, + "nixpkgs-stable": { + "locked": { + "lastModified": 1720535198, + "narHash": "sha256-zwVvxrdIzralnSbcpghA92tWu2DV2lwv89xZc8MTrbg=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "205fd4226592cc83fd4c0885a3e4c9c400efabb5", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-23.11", + "repo": "nixpkgs", + "type": "github" + } + }, "root": { "inputs": { "flake-parts": "flake-parts", - "nixpkgs": "nixpkgs" + "nixpkgs": "nixpkgs", + "nixpkgs-stable": "nixpkgs-stable" } } }, diff --git a/flake.nix b/flake.nix old mode 100644 new mode 100755 index 345bad4..23508b5 --- a/flake.nix +++ b/flake.nix @@ -1,10 +1,9 @@ { description = "Elm Environment"; - inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + nixpkgs-stable.url = "github:NixOS/nixpkgs/nixos-23.11"; }; - outputs = inputs @ { flake-parts, self, @@ -17,5 +16,13 @@ ./parts ]; systems = [system]; + perSystem = {pkgs, ...}: { + _module.args.pkgs = import inputs.nixpkgs { + inherit system; + }; + _module.args.pkgs-stable = import inputs.nixpkgs-stable { + inherit system; + }; + }; }; } diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100755 index 0000000..7295c4f --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,7 @@ +/dist +/.elm-land +/.env +/elm-stuff +/node_modules +.DS_Store +*.pem \ No newline at end of file diff --git a/frontend/README.md b/frontend/README.md new file mode 100755 index 0000000..cca2e01 --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,16 @@ +# frontend +> Built with [Elm Land](https://elm.land) 🌈 + +## Local development + +```bash +# Requires Node.js v18+ (https://nodejs.org) +npx elm-land server +``` + +## Deploying to production + +Elm Land projects are most commonly deployed as static websites. + +Please visit [the "Deployment" guide](https://elm.land/guide/deploying) to learn more +about deploying your app for free using Netlify or Vercel. \ No newline at end of file diff --git a/frontend/elm-land.json b/frontend/elm-land.json new file mode 100755 index 0000000..2ca0790 --- /dev/null +++ b/frontend/elm-land.json @@ -0,0 +1,28 @@ +{ + "app": { + "elm": { + "development": { "debugger": true }, + "production": { "debugger": false } + }, + "env": [], + "html": { + "attributes": { + "html": { "lang": "en" }, + "head": {} + }, + "title": "Elm Land", + "meta": [ + { "charset": "UTF-8" }, + { "http-equiv": "X-UA-Compatible", "content": "IE=edge" }, + { "name": "viewport", "content": "width=device-width, initial-scale=1.0" } + ], + "link": [ + { "rel": "stylesheet", "href": "https://fonts.googleapis.com/css2?family=League+Spartan:wght@100..900&display=swap" } + ], + "script": [] + }, + "router": { + "useHashRouting": false + } + } +} \ No newline at end of file diff --git a/frontend/elm.json b/frontend/elm.json new file mode 100755 index 0000000..c12da99 --- /dev/null +++ b/frontend/elm.json @@ -0,0 +1,26 @@ +{ + "type": "application", + "source-directories": [ + "src", + ".elm-land/src" + ], + "elm-version": "0.19.1", + "dependencies": { + "direct": { + "elm/browser": "1.0.2", + "elm/core": "1.0.5", + "elm/html": "1.0.0", + "elm/json": "1.1.3", + "elm/url": "1.0.0", + "mdgriffith/elm-ui": "1.1.8" + }, + "indirect": { + "elm/time": "1.0.0", + "elm/virtual-dom": "1.0.3" + } + }, + "test-dependencies": { + "direct": {}, + "indirect": {} + } +} diff --git a/frontend/review/elm.json b/frontend/review/elm.json new file mode 100644 index 0000000..fd4ba17 --- /dev/null +++ b/frontend/review/elm.json @@ -0,0 +1,39 @@ +{ + "type": "application", + "source-directories": [ + "src" + ], + "elm-version": "0.19.1", + "dependencies": { + "direct": { + "elm/core": "1.0.5", + "elm/json": "1.1.3", + "elm/project-metadata-utils": "1.0.2", + "jfmengels/elm-review": "2.14.1", + "jfmengels/elm-review-code-style": "1.2.0", + "jfmengels/elm-review-common": "1.3.3", + "jfmengels/elm-review-debug": "1.0.8", + "jfmengels/elm-review-documentation": "2.0.4", + "jfmengels/elm-review-simplify": "2.1.5", + "jfmengels/elm-review-unused": "1.2.3", + "stil4m/elm-syntax": "7.3.7" + }, + "indirect": { + "elm/bytes": "1.0.8", + "elm/html": "1.0.0", + "elm/parser": "1.1.0", + "elm/random": "1.0.0", + "elm/regex": "1.0.0", + "elm/time": "1.0.0", + "elm/virtual-dom": "1.0.3", + "elm-explorations/test": "2.2.0", + "pzp1997/assoc-list": "1.0.0", + "rtfeldman/elm-hex": "1.0.0", + "stil4m/structured-writer": "1.0.3" + } + }, + "test-dependencies": { + "direct": {}, + "indirect": {} + } +} \ No newline at end of file diff --git a/frontend/review/src/ReviewConfig.elm b/frontend/review/src/ReviewConfig.elm new file mode 100644 index 0000000..2a3a988 --- /dev/null +++ b/frontend/review/src/ReviewConfig.elm @@ -0,0 +1,58 @@ +module ReviewConfig exposing (config) + +{-| Do not rename the ReviewConfig module or the config function, because +`elm-review` will look for these. + +To add packages that contain rules, add them to this review project using + + `elm install author/packagename` + +when inside the directory containing this file. + +-} + +import Docs.ReviewAtDocs +import NoConfusingPrefixOperator +import NoDebug.Log +import NoDebug.TodoOrToString +import NoExposingEverything +import NoImportingEverything +import NoMissingTypeAnnotation +import NoMissingTypeAnnotationInLetIn +import NoMissingTypeExpose +import NoPrematureLetComputation +import NoSimpleLetBody +import NoUnused.CustomTypeConstructorArgs +import NoUnused.CustomTypeConstructors +import NoUnused.Dependencies +import NoUnused.Exports +import NoUnused.Parameters +import NoUnused.Patterns +import NoUnused.Variables +import Review.Rule as Rule exposing (Rule) +import Simplify + + +config : List Rule +config = + [ Docs.ReviewAtDocs.rule + , NoConfusingPrefixOperator.rule + , NoDebug.Log.rule + , NoDebug.TodoOrToString.rule + |> Rule.ignoreErrorsForDirectories [ "tests/" ] + , NoExposingEverything.rule + , NoImportingEverything.rule [] + , NoMissingTypeAnnotation.rule + , NoMissingTypeAnnotationInLetIn.rule + , NoMissingTypeExpose.rule + , NoSimpleLetBody.rule + , NoPrematureLetComputation.rule + , NoUnused.CustomTypeConstructors.rule [] + , NoUnused.CustomTypeConstructorArgs.rule + , NoUnused.Dependencies.rule + , NoUnused.Exports.rule + , NoUnused.Parameters.rule + , NoUnused.Patterns.rule + , NoUnused.Variables.rule + , Simplify.rule Simplify.defaults + ] diff --git a/frontend/src/Config/Identity.elm b/frontend/src/Config/Identity.elm new file mode 100644 index 0000000..6d61334 --- /dev/null +++ b/frontend/src/Config/Identity.elm @@ -0,0 +1,4 @@ +module Config.Identity exposing (..) + +myName : String +myName = "The Nutrivore" \ No newline at end of file diff --git a/frontend/src/Config/Theme.elm b/frontend/src/Config/Theme.elm new file mode 100644 index 0000000..33c5a2c --- /dev/null +++ b/frontend/src/Config/Theme.elm @@ -0,0 +1,24 @@ +module Config.Theme exposing (..) + +import Element exposing (..) +import Element.Background as B +import Element.Font as F + + +type alias Theme = + { nonHighlightedText : Color + , nonHighlightedDarkText : Color + , highlightText : Color + , backgroundColour : Color + , debugColour : Color + } + + +colourTheme : Theme +colourTheme = + { nonHighlightedText = rgb255 212 212 212 + , nonHighlightedDarkText = rgb255 126 126 126 + , highlightText = rgb255 204 102 0 + , backgroundColour = rgb255 40 40 40 + , debugColour = rgb255 227 28 121 + } diff --git a/frontend/src/Pages/Contact.elm b/frontend/src/Pages/Contact.elm new file mode 100644 index 0000000..4be50f5 --- /dev/null +++ b/frontend/src/Pages/Contact.elm @@ -0,0 +1,82 @@ +module Pages.Contact exposing (Model, Msg, page) + +import Config.Identity as ID exposing (..) +import Config.Theme as T exposing (..) +import Effect exposing (Effect) +import Element exposing (..) +import Element.Background as B +import Element.Font as F +import Element.Events as E +import Page exposing (Page) +import Route exposing (Route) +import Shared +import View exposing (View) + + +page : Shared.Model -> Route () -> Page Model Msg +page shared route = + Page.new + { init = init + , update = update + , subscriptions = subscriptions + , view = view + } + + + +-- INIT + + +type alias Model = + { num : Int } + + +init : () -> ( Model, Effect Msg ) +init () = + ( { num = 0 } + , Effect.none + ) + + + +-- UPDATE + + +type Msg + = Inc + | Dec + + +update : Msg -> Model -> ( Model, Effect Msg ) +update msg model = + case msg of + Inc -> + ( { model | num = model.num + 1 } + , Effect.none + ) + + Dec -> + ( { model | num = model.num - 1 } + , Effect.none + ) + + + +-- SUBSCRIPTIONS + + +subscriptions : Model -> Sub Msg +subscriptions model = + Sub.none + + + +-- VIEW + + +view : Model -> View Msg +view model = + { title = "" + , attributes = [] + , element = el [E.onClick Inc] (text <| "a string is fun" ++ String.fromInt model.num) + } diff --git a/frontend/src/Pages/Home_.elm b/frontend/src/Pages/Home_.elm new file mode 100755 index 0000000..c39d625 --- /dev/null +++ b/frontend/src/Pages/Home_.elm @@ -0,0 +1,170 @@ +module Pages.Home_ exposing (page) + +import Config.Identity as ID exposing (..) +import Config.Theme as T exposing (..) +import Element exposing (..) +import Element.Background as B +import Element.Font as F +import Element.Region exposing (description) +import View exposing (View) + + + +-- Use this if you fuck something up +-- Element.explain Debug.todo + + +page : View msg +page = + { title = myName + , attributes = [ F.family [ spartanFont ] ] + , element = topLevelContainer + } + + +spartanFont : F.Font +spartanFont = + F.typeface "League Spartan" + + +topLevelContainer : Element msg +topLevelContainer = + el + [ width fill + , height fill + , B.color colourTheme.backgroundColour + ] + linkList + + +linkList : Element msg +linkList = + column + [ spacing 20 + , centerX + , centerY + , F.color (rgb255 67 67 67) + ] + links + + +imageSpacer : Attribute msg +imageSpacer = + spacing 20 + + +titleFormat : List (Attr () msg) +titleFormat = + [ F.size 23 + , F.bold + , F.color colourTheme.highlightText + ] + + +paragraphFontSize : Attr decorative msg +paragraphFontSize = + F.size 17 + + +paragraphLinkFormat : { url : String, label : Element msg } -> Element msg +paragraphLinkFormat = + newTabLink + [ paragraphFontSize + , F.color colourTheme.highlightText + ] + + +paragraphFormat : List (Attr () msg) +paragraphFormat = + [ spacing 8 + , paragraphFontSize + , F.color colourTheme.nonHighlightedText + ] + + +paragraphColumnFormat : List (Attribute msg) +paragraphColumnFormat = + [ spacing 20 + , width <| px 700 + ] + + +imageFormat : List (Attribute msg) +imageFormat = + [ width <| px 150 + , alignTop + ] + + +recommendedClients : Element msg +recommendedClients = + el [ F.bold ] (text "Recommended Clients: ") + + +links : List (Element msg) +links = + [ column + [ spacing 40 ] + [ row [ imageSpacer ] + [ image imageFormat + { src = "mastodon.png" + , description = "mastodon logo" + } + , column paragraphColumnFormat + [ newTabLink titleFormat + { url = "https://the-nutrivore.social/" + , label = text "MASTODON" + } + , paragraph paragraphFormat [ text "Microblogging will now be posted to my own self-hosted Mastodon instance. I've kinda grown tired of microblogging on X, where political correctness and unclear ban policies force me to constantly self-censor. I considered and ultimately rejected several alternative platforms. Eventually, I realized the solution to this problem is to simply self-host my own space―somewhere where I can be myself and speak as I please. And I recently obtained the necessary infrastructure to do this." ] + , paragraph paragraphFormat [ text "This instance is 100% mine, and I can't be censored or fucked with there. I invite everyone who values my content and interactions to follow me on this new platform (whether you agree with my views or not). My instance is a \"single-user\" instances, meaning I'm the only user. But you can still follow me! Just make an account on another instance, like ", paragraphLinkFormat { url = "https://mastodon.social", label = text "Mastodon.social" }, text " (alternatively, you can select whatever instance you wish from the ",paragraphLinkFormat { url = "https://instances.social/", label = text "official index"} , text "), follow me, and turn on notifications." ] + , paragraph paragraphFormat + [ recommendedClients + , paragraphLinkFormat { url = "https://github.com/LucasGGamerM/moshidon", label = text "Moshidon" } + , text " (android) " + , paragraphLinkFormat { url = "https://github.com/mastodon/mastodon-android", label = text "Official" } + , text " (android) " + , paragraphLinkFormat { url = "https://github.com/tuskyapp/Tusky", label = text "Tusky" } + , text " (android) " + , paragraphLinkFormat { url = "https://apps.apple.com/us/app/mastodon/id1571998974", label = text "Official" } + , text " (iOS)" + ] + ] + ] + , row [ imageSpacer ] + [ image imageFormat + { src = "peertube.png" + , description = "mastodon logo" + } + , column paragraphColumnFormat + [ newTabLink titleFormat + { url = "https://video.the-nutrivore.social/" + , label = text "PEERTUBE" + } + , paragraph paragraphFormat [ text "I'm transitioning my video content from YouTube to my self-hosted PeerTube instance, because I strongly believe in freedom of speech, copyleft, and digital autonomy. YouTube has proven unreliable due to both censorship and copyright strikes levied against my channel. This shift allows me to better control my content and avoid these silly pitfalls." ] + , paragraph paragraphFormat [ text "Full-length videos are now exclusively available on PeerTube, while YouTube will only host clips. By registering on PeerTube and subscribing to my channels, you'll have access to all content. Just be sure to enable email notifications to be alerted of new uploads. I believe that those who are truly fans of my work and want the best experience possible will see this as a positive change." ] + , paragraph paragraphFormat [ recommendedClients, text "Unfortunately, I can't recommend any mobile clients for PeerTube at this time. They're all trash. Please use your browser, either on your mobile device or personal computer. Just be use to enable email notifications in your account settings." ] + ] + ] + , row [ imageSpacer ] + [ image imageFormat + { src = "discord.png" + , description = "mastodon logo" + } + , column paragraphColumnFormat + [ newTabLink titleFormat + { url = "https://discord.gg/eeYQ2wJknS" + , label = text "DISCORD" + } + , paragraph paragraphFormat [ text "The Nutrivore Discord server is an evidence-based community dedicated to debunking pseudoscience, especially in the fields of nutrition, health and fitness. Casual discourse is welcome, and includes topics such as cooking, gaming, technology, and more. Current members span many disciplines and include both students and professionals, all levels of interest and expertise are welcome." ] + , paragraph paragraphFormat [ text "The Discord server is not explicitly a debate server. However, we strongly encourage that disagreements be resolved using debate (preferably verbal), as long as it is conducted respectfully and in good faith. Though we also firmly believe that shaming sophistry and bad faith behaviour is a net good overall. The Discord server is planned to be replaced with a Matrix server in future." ] + , paragraph paragraphFormat + [ recommendedClients + , paragraphLinkFormat { url = "https://github.com/Vendicated/Vencord", label = text "Vencord" } + , text " (desktop) " + , paragraphLinkFormat { url = "https://discord.com/download", label = text "Official" } + , text " (multi-platform) " + ] + ] + ] + ] + ] diff --git a/frontend/src/View.elm b/frontend/src/View.elm new file mode 100755 index 0000000..9143e89 --- /dev/null +++ b/frontend/src/View.elm @@ -0,0 +1,89 @@ +module View exposing + ( View, map + , none, fromString + , toBrowserDocument + ) + +{-| + +@docs View, map +@docs none, fromString +@docs toBrowserDocument + +-} + +import Browser +import Element exposing (Attribute, Element, layout, mapAttribute, text) +import Route exposing (Route) +import Shared.Model + + +type alias View msg = + { title : String + , attributes : List (Attribute msg) + , element : Element msg + } + + +{-| Used internally by Elm Land to create your application +so it works with Elm's expected `Browser.Document msg` type. +-} +toBrowserDocument : + { shared : Shared.Model.Model + , route : Route () + , view : View msg + } + -> Browser.Document msg +toBrowserDocument { view } = + { title = view.title + , body = [ layout view.attributes view.element ] + } + + + +-- toBrowserDocument : +-- { shared : Shared.Model.Model +-- , route : Route () +-- , view : View msg +-- } +-- -> Browser.Document msg +-- toBrowserDocument { view } = +-- { title = view.title +-- , body = view.body +-- } + + +{-| Used internally by Elm Land to connect your pages together. +-} +map : (msg1 -> msg2) -> View msg1 -> View msg2 +map fn view = + { title = view.title + , attributes = List.map (mapAttribute fn) view.attributes + , element = Element.map fn view.element + } + + +{-| Used internally by Elm Land whenever transitioning between +authenticated pages. +-} +none : View msg +none = + { title = "" + , attributes = [] + , element = Element.none + } + + +{-| If you customize the `View` module, anytime you run `elm-land add page`, +the generated page will use this when adding your `view` function. + +That way your app will compile after adding new pages, and you can see +the new page working in the web browser! + +-} +fromString : String -> View msg +fromString moduleName = + { title = moduleName + , attributes = [] + , element = text moduleName + } diff --git a/frontend/static/discord.png b/frontend/static/discord.png new file mode 100644 index 0000000000000000000000000000000000000000..2019fb51817e3bc31cd22def8f35c2211f46b3b1 GIT binary patch literal 24178 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 QlK^sqr>mdKI;Vst08%gLc>n+a literal 0 HcmV?d00001 diff --git a/frontend/static/mastodon.png b/frontend/static/mastodon.png new file mode 100644 index 0000000000000000000000000000000000000000..9b78af52b8fa47ede799bee0243aca2d7717c130 GIT binary patch literal 7737 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 literal 0 HcmV?d00001 diff --git a/frontend/static/mastodon.svg b/frontend/static/mastodon.svg new file mode 100644 index 0000000..87ec2c5 --- /dev/null +++ b/frontend/static/mastodon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/static/peertube.png b/frontend/static/peertube.png new file mode 100644 index 0000000000000000000000000000000000000000..6778d24d7b5069fe02b7d1c1e337849555cd8e05 GIT binary patch literal 2113 zcmeAS@N?(olHy`uVBq!ia0y~yU^oH79Lx+1471we)-W(IaRvB{AU1x{|yWc z4Gkb}C_`vyC<6nC`yWIz{Lf{`&CO+CV0aNLUQ$xRz`*b-OEfDhi-CdRb&^O~Ss4QZ z!`oaTh?-B?yp@%e3=9mP(s+xDiy0UgzNB#H=jSspFnrD7f+|kogfQNv36__aGcYi` z&lZ3v{*=mFR8)kl{e1=(MC3y{e_>%E0|Udy3_b|seFhK2Js;A!A!W9hsNzrQFzxA3sZSYv5OY3dKt(LlYAd zGcz*>2M1?oXFor`z`($uprFvu(73p`w6wJH^74+3j+rxOu3EKf_3G7|H*em$b?c5D zI}RT{eC*h<^XJcBym;}_rAt??T)A`S&b@p0o<4p0{Q2{jFJHcY|Ng^=4`082{r2tK z_wV0-{rdI$_wT=d|Ni^;uRZF&83O~WwWo_?NX4zYcUj9r!bOgLj9vQf-Me=VcVj0i zcs5jVU%9)NHA?Hs-Nxc`yLh+;JqcRE=NuF>))52wCJ$(=Y<+pf4A1yzv!H~r`Ghzk)D6D_5w+Zy1%b$p7tW` z^$*1Wp}Vye$}KMZ(Z~CndS1Mo9KAs4S463fiHp7TyQY>G`Bymw1X_Ce7yN8en(&d< zI4Q&I-tQBdD-<3sPMxpsFiWD3cRRDe=HveE8~?12H{QHn>`jZ)Px}tD#IHLwChT&x zlzGd&F<su3NIwb?kVQwQjyskX+GPX|B%BZe&@Bjzpp>;P}IMCZTs29?h95)9Jp0{Ve;26 z7kwpMo{93kPCj~(LH}b=@7K-m_!_2{pFR02x=^MfQ~Z3-hnKZ0n!WQENGuIHCY^TG z)N5(a@g?Td0@+SiXo}D1J(j*_iuO~tl~X=;do#wjKD7AxW6B57mK9t`NcdHqQlJ?th6Kttd!>tSZTt(K&@08rM(w>f;1ls zzU)n#;w9Pdk#Dj%yA}_30cs{y;HjRlfD=e!xQ_ccmIw^o{c)OE4ndK_lUXfmH)q5{UeIy7~aae+<$g^ zVr-*YP9Wb=oyyaf#hFgccANj@@ClixxqG%(z7u-LuATq=^9h-o?y>V<9X%cTxY_^n z?M=3(#S_XaYVUoEJ8`-=@SOGEojLIbQ(hTYzSi2?@z(fP`WuF=$*k`m-OawZsPMw$ zyE&5961rUO`S zlV9pKgVhLujsCqg#BZTd+`H~Wa}K5MVfQ~G@I?QKT*!n^7rmYy-uTZfWWuMf(T?Z% zlXm{mJ(ajZA^CEI<1@2;G5?xF_kD7|%k}B8^UgmqQ_iQqoLad;NpWV_BP{(7nFGt