From fa0340cef20bfb8ef2cdb3c6ea47d3f8b52f50e5 Mon Sep 17 00:00:00 2001 From: TheGeneralist <180094941+thegeneralist01@users.noreply.github.com> Date: Sat, 25 Jul 2026 15:31:25 +0200 Subject: [PATCH] chore: add brand identity, style guide, and favicon (#35) * Add Archivr brand identity and favicon - Brand style guide (docs/branding/style-guide.html): logo, clear space, don'ts, color palette, typography, in-context mockup - Logo assets (docs/branding/assets/): lockup SVGs for dark/light backgrounds, standalone mark, favicon.svg, multi-size favicon.ico - Wire favicon into frontend/index.html (SVG + ICO fallback); frontend/public/ seeded so Vite copies assets on next build - Revert display strings archivr back to Archivr in UI (Topbar, LoginPage, SetupPage, index.html titles, flake.nix) - Update .gitignore to allow docs/branding/ * Build frontend with favicon links and assets * Fix static file serving: serve all of static/ with SPA index.html fallback Previously only /assets/* was served from disk; all other paths (including /favicon.ico, /favicon.svg) hit the index.html fallback. Replace nest_service("/assets") + fallback_service(index.html) with ServeDir on the full static dir and not_found_service(index.html), so any file that exists in static/ is served directly. --- .gitignore | 2 + AGENTS.md | 2 +- ARCHIVR-MENTAL-MODEL.md | 2 +- crates/archivr-server/src/routes.rs | 3 +- crates/archivr-server/static/favicon.ico | Bin 0 -> 302430 bytes crates/archivr-server/static/favicon.svg | 10 + crates/archivr-server/static/index.html | 2 + docs/README.md | 6 +- docs/branding/assets/favicon.ico | Bin 0 -> 302430 bytes docs/branding/assets/favicon.svg | 10 + docs/branding/assets/logo-mark.svg | 10 + docs/branding/assets/logo-on-dark.svg | 15 + docs/branding/assets/logo-on-light.svg | 15 + docs/branding/logo-capital-A.svg | 20 + docs/branding/logo-lower-a.svg | 20 + docs/branding/logo-mark-v0.svg | 20 + docs/branding/logo-v0.svg | 31 + docs/branding/style-guide.html | 954 +++++++++++++++++++++++ frontend/index.html | 2 + frontend/public/favicon.ico | Bin 0 -> 302430 bytes frontend/public/favicon.svg | 10 + 21 files changed, 1127 insertions(+), 7 deletions(-) create mode 100644 crates/archivr-server/static/favicon.ico create mode 100644 crates/archivr-server/static/favicon.svg create mode 100644 docs/branding/assets/favicon.ico create mode 100644 docs/branding/assets/favicon.svg create mode 100644 docs/branding/assets/logo-mark.svg create mode 100644 docs/branding/assets/logo-on-dark.svg create mode 100644 docs/branding/assets/logo-on-light.svg create mode 100644 docs/branding/logo-capital-A.svg create mode 100644 docs/branding/logo-lower-a.svg create mode 100644 docs/branding/logo-mark-v0.svg create mode 100644 docs/branding/logo-v0.svg create mode 100644 docs/branding/style-guide.html create mode 100644 frontend/public/favicon.ico create mode 100644 frontend/public/favicon.svg diff --git a/.gitignore b/.gitignore index 478a663..9c3bd3c 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,8 @@ !docs/ !docs/LICENSE !docs/README* +!docs/branding/ +!docs/branding/** !crates !crates/** diff --git a/AGENTS.md b/AGENTS.md index 420772c..10b5963 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -2,7 +2,7 @@ ## Project Overview -Archivr is a self-hosted archival tool that captures and preserves digital content — YouTube/Twitter/Instagram/TikTok/Reddit posts, arbitrary URLs, full web pages (via SingleFile + Chromium, optionally through a Freedium mirror for paywalled articles), and local files — into self-contained, SQLite-backed archive directories with blob deduplication, hierarchical tags, collections, and role-based auth. Rust workspace + React frontend. +archivr is a self-hosted archival tool that captures and preserves digital content — YouTube/Twitter/Instagram/TikTok/Reddit posts, arbitrary URLs, full web pages (via SingleFile + Chromium, optionally through a Freedium mirror for paywalled articles), and local files — into self-contained, SQLite-backed archive directories with blob deduplication, hierarchical tags, collections, and role-based auth. Rust workspace + React frontend. Read `ARCHIVR-MENTAL-MODEL.md` before making structural changes. diff --git a/ARCHIVR-MENTAL-MODEL.md b/ARCHIVR-MENTAL-MODEL.md index eae3d4c..7f8c3ec 100644 --- a/ARCHIVR-MENTAL-MODEL.md +++ b/ARCHIVR-MENTAL-MODEL.md @@ -11,7 +11,7 @@ This document explains the current project shape after the workspace refactor. ## The Big Model -Archivr is now a Rust workspace with three crates: +archivr is now a Rust workspace with three crates: ```mermaid flowchart LR diff --git a/crates/archivr-server/src/routes.rs b/crates/archivr-server/src/routes.rs index c886874..ec8b474 100644 --- a/crates/archivr-server/src/routes.rs +++ b/crates/archivr-server/src/routes.rs @@ -387,8 +387,7 @@ pub fn app_with_state(state: AppState) -> Router { get(blob_cleanup_scan_handler).delete(blob_cleanup_delete_handler), ) .route("/api/util/resolve-tco", post(resolve_tco_handler)) - .nest_service("/assets", ServeDir::new(static_dir.join("assets"))) - .fallback_service(ServeFile::new(static_dir.join("index.html"))) + .fallback_service(ServeDir::new(&static_dir).not_found_service(ServeFile::new(static_dir.join("index.html")))) .layer(axum::middleware::from_fn_with_state( state.clone(), setup_guard, diff --git a/crates/archivr-server/static/favicon.ico b/crates/archivr-server/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..5575fa67d306ed21738caa4955887ec2e075c920 GIT binary patch literal 302430 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 agHH~m7nTP>X5mwdEC*5x)(a^u$R`2Z3l<&# literal 0 HcmV?d00001 diff --git a/crates/archivr-server/static/favicon.svg b/crates/archivr-server/static/favicon.svg new file mode 100644 index 0000000..ce6071e --- /dev/null +++ b/crates/archivr-server/static/favicon.svg @@ -0,0 +1,10 @@ + + + + + + A + diff --git a/crates/archivr-server/static/index.html b/crates/archivr-server/static/index.html index c662850..210c92a 100644 --- a/crates/archivr-server/static/index.html +++ b/crates/archivr-server/static/index.html @@ -4,6 +4,8 @@ Archivr + + diff --git a/docs/README.md b/docs/README.md index add643c..577acc2 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,4 +1,4 @@ -# archivr +# Archivr An open-source self-hosted archiving tool. Work in progress. @@ -65,9 +65,9 @@ This project aims to provide a reliable solution for archiving important data fr - Direct platform URLs - Platform shorthand inputs such as `tweet:...`, `yt:...`, or `instagram:...` -## Running Archivr +## Running archivr -Archivr currently ships as two binaries: +archivr currently ships as two binaries: - `archivr` - The CLI for creating and writing to one archive. diff --git a/docs/branding/assets/favicon.ico b/docs/branding/assets/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..5575fa67d306ed21738caa4955887ec2e075c920 GIT binary patch literal 302430 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 agHH~m7nTP>X5mwdEC*5x)(a^u$R`2Z3l<&# literal 0 HcmV?d00001 diff --git a/docs/branding/assets/favicon.svg b/docs/branding/assets/favicon.svg new file mode 100644 index 0000000..ce6071e --- /dev/null +++ b/docs/branding/assets/favicon.svg @@ -0,0 +1,10 @@ + + + + + + A + diff --git a/docs/branding/assets/logo-mark.svg b/docs/branding/assets/logo-mark.svg new file mode 100644 index 0000000..6dc0bfb --- /dev/null +++ b/docs/branding/assets/logo-mark.svg @@ -0,0 +1,10 @@ + + + + + + A + diff --git a/docs/branding/assets/logo-on-dark.svg b/docs/branding/assets/logo-on-dark.svg new file mode 100644 index 0000000..9e1714e --- /dev/null +++ b/docs/branding/assets/logo-on-dark.svg @@ -0,0 +1,15 @@ + + + + + + + A + + archivr + diff --git a/docs/branding/assets/logo-on-light.svg b/docs/branding/assets/logo-on-light.svg new file mode 100644 index 0000000..c5cd6ba --- /dev/null +++ b/docs/branding/assets/logo-on-light.svg @@ -0,0 +1,15 @@ + + + + + + + A + + archivr + diff --git a/docs/branding/logo-capital-A.svg b/docs/branding/logo-capital-A.svg new file mode 100644 index 0000000..ba092f6 --- /dev/null +++ b/docs/branding/logo-capital-A.svg @@ -0,0 +1,20 @@ + + + + + + + + + + Archivr + diff --git a/docs/branding/logo-lower-a.svg b/docs/branding/logo-lower-a.svg new file mode 100644 index 0000000..0e3fd92 --- /dev/null +++ b/docs/branding/logo-lower-a.svg @@ -0,0 +1,20 @@ + + + + + + + + + + archivr + diff --git a/docs/branding/logo-mark-v0.svg b/docs/branding/logo-mark-v0.svg new file mode 100644 index 0000000..cabc508 --- /dev/null +++ b/docs/branding/logo-mark-v0.svg @@ -0,0 +1,20 @@ + + + + + + + + + a + diff --git a/docs/branding/logo-v0.svg b/docs/branding/logo-v0.svg new file mode 100644 index 0000000..034cd03 --- /dev/null +++ b/docs/branding/logo-v0.svg @@ -0,0 +1,31 @@ + + + + + + + + + a + + + archivr + diff --git a/docs/branding/style-guide.html b/docs/branding/style-guide.html new file mode 100644 index 0000000..20ad9ae --- /dev/null +++ b/docs/branding/style-guide.html @@ -0,0 +1,954 @@ + + + + + +Archivr — Brand Guidelines + + + + + + + + +
+
Archivr  ·  Brand Guidelines  ·  v1.0  ·  2025
+ +
Preserve what matters. Forever.
+
+ + + +
+
01
+
The Logo
+
The Archivr logo consists of two elements: the mark — a capital A in Cormorant Garamond set inside a rounded square in Terracotta — and the wordmark. Use both together as the primary logo. Never separate them in contexts where the brand is being introduced for the first time.
+ + +
+
+
+
A
+
Archivr
+
+
+
Primary — on dark
+
+ + +
+
+
+
A
+
Archivr
+
+
+
Secondary — on light
+
+
+ +
+ + +
+
02
+
The Mark
+
Use the standalone mark when the wordmark would be redundant (favicon, app icon, avatar) or when the space is too small for the full lockup. The mark is recognizable on its own once the brand is established.
+ +
+
+
A
+
128 px
+
+
+
A
+
64 px
+
+
+
A
+
32 px
+
+
+
A
+
16 px
+
+
+
+ +
+ + +
+
03
+
Clear Space
+
Always maintain a minimum clear space equal to half the mark's height (½H) on all sides of the lockup. Never crowd the logo with other elements.
+ +
+
+
+
½H
+
½H
+
½H
+
½H
+
+
A
+
Archivr
+
+
+
+ +
+
+
Full lockup
+
Minimum width: 120 px
+
+
+
Mark alone
+
Minimum size: 16 × 16 px
+
+
+
+
+ +
+ + +
+
04
+
Don'ts
+
These are the most common mistakes. All of them dilute or distort the brand.
+ +
+ +
+
+
+ Archivr +
✕
+
+
+
Don't stretch or distort the proportions
+
+ +
+
+
+
+
A
+
Archivr
+
+
✕
+
+
+
Don't change or recolor the logo
+
+ +
+
+
+
+
A
+
Archivr
+
+
✕
+
+
+
Don't add shadows, glows, or effects
+
+ +
+
+
+
+
A
+
Archivr
+
+
✕
+
+
+
Don't rotate or tilt the logo
+
+ +
+
+
+
+
A
+ Archivr +
+
✕
+
+
+
Don't substitute a different typeface for the wordmark
+
+ +
+
+
+
+
+
A
+
Archivr
+
+
+
✕
+
+
+
Don't place on busy or patterned backgrounds
+
+ +
+
+ +
+ + +
+
05
+
Color
+
The palette is organized by role. Shell and Paper form the light/dark surface pair. Terracotta is the single brand accent — use it with restraint. Amber is a secondary accent for highlights and metadata. Never introduce colors outside this palette in brand contexts.
+ +
+
Shell & Dark Surfaces
+
+
+
+
Shell
+
#141d18
+
App topbar, dark surfaces
+
+
+
+
Shell 2
+
#1c271f
+
Elevated dark panels
+
+
+
+
Ink
+
#20251f
+
Primary text on light
+
+
+
+ +
+
Paper & Light Surfaces
+
+
+
+
Paper
+
#f5f0e7
+
Primary content bg
+
+
+
+
Paper 2
+
#e9e1d2
+
Rows, alternating bg
+
+
+
+
Paper 3
+
#fffaf0
+
Elevated panels on light
+
+
+
+
Brand Text
+
#f4ead8
+
Text on dark & accent
+
+
+
+ +
+
Accents
+
+
+
+
Terracotta
+
#8d3f30
+
Primary brand accent, logo mark, CTAs, focus rings
+
+
+
+
Amber
+
#b78342
+
Secondary accent, metadata highlights
+
+
+
+
Ocean
+
#245f72
+
Links, informational states
+
+
+
+ +
+
Neutrals & Borders
+
+
+
+
Muted
+
#6b6f66
+
Secondary text, captions
+
+
+
+
Muted 2
+
#8a8d83
+
Tertiary text, placeholders
+
+
+
+
Line
+
#d2c6b5
+
Borders, dividers on light
+
+
+
+
Line Soft
+
#e5dccd
+
Subtle dividers, rules
+
+
+
+
+ +
+ + +
+
06
+
Typography
+
Three typefaces cover every context. Cormorant Garamond is the brand voice — it appears in the logo, headings, and display text. Helvetica Neue handles all interface chrome. Spectral carries long-form reading content.
+ +
+
+
Display
+
Cormorant Garamond
+
Logo wordmark · Headings · Display text · Taglines

Weights: 500, 600
Google Fonts: free
+
+
+
Aa Bb Cc
Preserve what
matters.
+
The archive of a lifetime,
held with care.
+
+
+ +
+
+
Interface
+
Helvetica Neue
+
UI labels · Buttons · Nav · Captions · Body copy

Weights: 400, 550, 700
System font (macOS/iOS)
+
+
+
+ The quick brown fox jumps over the lazy dog.
+ Capture · Archive · Preserve · Retrieve
+ 0123456789 & #%@! +
+
+ Small caps label + Button Text + mono/url/code +
+
+
+ +
+
+
Reading
+
Spectral
+
Article body · Long-form content · Reading mode

Weights: 400, 500
Google Fonts: free
+
+
+
An archive is not a graveyard. It is the opposite — a place where things are kept because they still matter, because the person who saved them believed they would matter again.
+
+
+ + +
+
Display scale (Cormorant Garamond 600)
+
+
72 px
+
Archivr
+
+
+
48 px
+
Archivr
+
+
+
36 px
+
Preserve what matters.
+
+
+
24 px
+
Capture, archive, retrieve. Forever.
+
+
+
+ +
+ + +
+
07
+
In Context
+
The logo as it appears in the application shell. The mark sits at 28 × 28 px in the topbar, framed by a 2 px Terracotta rule at the bottom of the navigation bar.
+ +
+
+
A
+ Archivr +
+
+
Capture
+
+
+
+
+
+
+
+
+
+ +
+ + +
+
08
+
Asset Files
+
All files live in branding/assets/. SVG files embed Cormorant Garamond via Google Fonts — they require a network connection to render the typeface correctly, or the font installed locally.
+ +
+
+
+ +
+
logo-on-dark.svg
+
Full lockup · cream wordmark · use on dark backgrounds
+
+
+
+ +
+
logo-on-light.svg
+
Full lockup · dark wordmark · use on light / paper backgrounds
+
+
+
+ +
+
logo-mark.svg
+
Standalone mark · 48 × 48 · for established contexts, avatars
+
+
+
+ +
+
favicon.svg
+
Favicon · reference from <link rel="icon"> or convert to .ico
+
+
+
+ + + + + diff --git a/frontend/index.html b/frontend/index.html index 454194d..093b9c6 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -4,6 +4,8 @@ Archivr + +
diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..5575fa67d306ed21738caa4955887ec2e075c920 GIT binary patch literal 302430 zcmZQzU}Rur00Bk@1qKZT7KShe1_lQQkhlVah7$urodOGkfdPcSLY0AGSrQ9_f&!E; zz`)?w!NMRQ0O4n_Ffe?Z!NQ;cF_3|Q2_g>SGBB_(@L4l}F@#Sa(#WBg!Pudf!O)?X zLEpZY(b%AqLEpKL%fPWu)xf?l*ucK8%)q{Hih+IK1_S%vvj+CPcMR-%pBmWrelW1_ z{bOL?`+pRVhQSa_1E91EO2eSEeA~dj?+hf3gVTDMfn9H~p-s1np>-#xmfsu(1BX6F zeY-veeOm~oPwu3?E!qxK85A6rFz7i279)pVWqtcze*^p85(E3*Ne1@4 zs}1aX_Zryuo-(lSy=GwF`_RC?_l<#l??(gs-meDsy*~}?d;bl=cpojVM$2qa8UUqT zP#OlMWl)+1rEO3e2c>mTng^x*RiM0}Z{J&N;Lzu%Z`Y@!V=;l*z^<3U(5{a`&we6< zyz@c^P@bZGPNklSAor;|%wW)Vn8ILS-_Kxd-^rluG>yf;p;yVkq1WEPzBkdpzPHQ3 zzIVHUeeYdp-UfxyC?3r#BRviLfaZy92KK$3puA#e*K2QR*QcmsH=V`EzKcQMp^rh& zwVOfDvx`B`t($romkK87+4nK%+D~LKw(DR}aah1;Xy3=BZ{H`OZ{KHT;LuxTVBfnB zTCao3!;v1>qy8T)?{K97Q2qd6P&;9tfn8sfzJ0%$oNgp zg`7(rBS86I-EkI!mcvv=ZHFn`2KIgK2KK#E4D5R^8QAx}G_ddeW?qHy1BBB6C=WdW=P8HY4nzB1CnLLFUQnJh zb)L*%;W~}M%y|lRDsm!C0gX?B#wT=b`xva9x|s~^d({l=dt>$Od*>P0_dXvj*Y4I@6|G}?`=1*@4Y!XRzI5WN6UVirvXrV;D&*HUz?G`1T90yejZ(?en!yv zpuSx%0|=9!!}05c=YPojB%gs@ud{)DFKEslROkO5jeDBM{b+rNS|5(o@Brnt7Y6oy zTMQif-1Qy%1wi#bDDQ(X{#;C+tbtt*1E|jdqV*m6qz&wQlMU>9_dwU^jMR7-_4jCg z9LO~A$-usMzrKBMx}IH+9C+;z4cY((_I=>IZ)n}gWMJ2$U|`>yYhd4dbhN%7t?x(E zz@SJ2Ck*U+3-#@Km38fUnGEduz-x!dtLYKCKy^JB+xIdUI8I z_Pw`9*W?e1GJiDvqo)6n9v+~*2Dc6E`pQ7-20?3wL2K_pn6z9EQ4Lzt0~$-vv+rjx zuDc?D}~0?fX1IV~nF^{%HOmO#?$J4eT?p>vcD@>*dk2?E|mXB{u(q>VFZ* z$&7loy_)*=y_=x>aYxHp%yM=#Oh&_Gu%-dfe&a2M_PyHHPMu7kb^3(zKV<%}j{!7) zU|`p$W?%aNlJH<|`;r-2s+_PuQe4!vsn_Mo+aJq-GGJy?qYb?Z(B zUE5v;dGi(qeY**uJ$&&7_Pw_Z?0Z3LjYh*5cNmX`&1l#R)-(XhyEpXhd*gI%ySdbz z<}v8n^K0KxcHIZbYNUZD`u4q(_3V2jOdR_eB+Z&( z*`Gn*sh2_Dy@%Prq1V*FzW3s2zkjsfKRVYx?9u>e9N?0kU5~kjWjBkiEn*%3yjQ>; zyuQDBwBJAM;+-0G$EX>@qYd&Bbfze5e*mZf09qRi#`fSdxQY+%>T0IvJ(dQ}bVdwWLv{iALF(SHB1PXnNFfKCJZ9z}5d@6gL= z;LsajVBfoQH13Ce+>h4d!=oOjBpyNee;eqoG0=U3ZXW%hJ;J31_PzH<^Z#i6A58-z zA`RRH-8X1x)We`-*UJT+^Zzv(_ah?iDXBX~^$w5r1L(fNN%~HGT)K8Wpu0QPjOP8( zyg!--MpPPDZQ$6eqHos|0=`>lc$90S_0woPj-~DG(rhyTa2Cf;{_f9sj@7-)*-}`7Z?nhMI z59fMq)NjPKZ5|rf_iZq=?>%Q=-}`1X|BvSX(KIlk(g0|!?->L8-g^f2y`X!T$qi9(`Yyir!+8{_eaz7 za7xdkei=>AqiJ9?4UDFN(KIlc21e7sXc`zz1EXnRG!2ZVfzdQDng&MGz-Ss6O#`E8 zU^ESkrh(BkFq#HN)4*sN7)=ACX<#%BjHZFnG%%V5M$^D(8W>FjqiJ9?4UDFN(KIlc z21e7sXc`!TX+Ynu=fAE^_prnuztQ`g4n5o98=lliC!p}rw;NGshYad+(Z*-$e~*Yc z|NY_?{P!O&IDWx@@925|t-YrFH*)NwYxp|_&H#tyunJEqr3+A)xCGDqZ|*jUu5m)| zI$$W-7m=~-f5XIm|0gdwHEi(IWvBml&N}ixBxUh`3-?L?>DCT#=>4Bvz48C##V3bN zSW+!rEQO@6g8D80J;LUU=Kn#^S1@$w{a?_q<^TEvxBs8L|L*^}2g3tjeEi}6z6($O zXI5_bZ{t0MF8LqSrUiv(@4RFG&)j=EY{HV7Y2xhtxBsUuJ^ep4b;)S{AL#sV*ZUuo zUQ1iI|KEA);s0B2z789F_x<<(r*6OgpI5i}zpc;I|DZl6t=nXf{NML~%F@&SZ@wNr zVM(oYar^BzaQd3F_QHQqo0Hb@F={^HF&0q%FKOBSfBVS?|8KndGHfs?t(~~}>VIzS zCc5W;P<#3M%i$B2)JzwkaGAa4{QrpbrK9!#K-d5Fkotc#{}V1JiK$Cq_5W!8$6fY~ z=6~v>HDb~uF=|HZf9l1@X#U5Y?_q6-(fm)n^hQkn#;XR}{|D9oyG}p)59%|+@SS(x z{)5`kpuQidFAIym!9;`H1#%zAogfTy^PTtK!Txyg`RD)Bci#+1`yVv-aO>?iuscBE zdFS2t{~))4+z4_n$lW(z6V5AxDXd9#3&@Wkzk>V>@;fLT?tOs7&D?bt{)dmY{|8O~ zCo*H%|JJDo|Ib^0;s27YSN^ZsbL0P}BX|GrKJ)1Rk*hEMUwHKXKPbI|;t~|6ptvP9 zJy5D1WIxDmkQ+eh3FHRQ82`yzum2yo^z{FZlMnuHICSU#>OD99FWq+a|H4g|{`W69 z0iORecb`a?@qbWR3u;e+#vEp?KKFm&=F9(=@4WVZ?Y>+8HzS27Xbk+?^H1RN733F? zpFn;C`H9kS8Yun9@pJ3VxBr))e*Ayz#>@Y^&p!UY>G0kEt9IY`zj({#|De2I+`R3- zd-&`@lm0>RHqtR@jf{oIr2j4NKYruo z|Fier{=f3UC^2t(AqgW-)a9r z>)HI{=7ZBPs5}786<&V&iQ;raY`VMh^wa+a+!EH5bugU+tqv!rlDqQ`)W$MBI z8xGz64@#?`_A52hA*dY;!k~30OSfPBUq4~r|KyUj|AUei{dWeh9fh>#LGA*%4}?K( z)wk^dxAQ@MAjYrsPy-4}5C*vqgh6iAweJ28ay!VK=I)cg<*Q%p{QuF}%l~KBZ2aFo zpK;kUqE)l($a8=V^Ela`~>nFs7%na>jAe7Kw}6CHeLd+Aq2IrDGgI<>Idch^AFzr z-+1WG|JG>-!R0cj%>{NpxD2LE`Wr5BJ{PLd+B5M2g{s-+#8mVnYP<{$YS@M71`6uADgw)Kxl$v$!{@ee{wqFIWt+w)-3~qA` zhcrFv2hz)J6Xyy4LH$|K8sfd@9)rsOa_cM5*cWJQyryT*f6%zYK=$DWIxT?u2<~CC z|8GC>;6G^2oYFi?E&ZS|O3>b>@U$iWEj=cI*N+c$SdH3GdcLJrn8DhwPC+yNgT{V9 zbB3TX0Z{*)lr#rY4@z6>4&449ld}Tcf25WhhoU*4K7m)%-2Z#dJqE9tCnYRtq4xHh zZ{WVjq{S!yho>zCkF$c@I26Nn)Xmf{FF^fPJHKiF>-zTo-*x&S$@5sSKIP1nXa5H# zECl!WM`}EQ%2d!?Mnb`=|3|OA0Iw6EMV=2FYFaw1Ph#m+GnvVg^^;LK8{%_+wb;Op(qvZ|h zm8nZcY@#+7ltmWXjevtcyYFZq1 z_rR4qpuHf?lMnnqdi@2_?OD*e^4!|Z;QT*Q#+yL(D`h7FKWO|Gw7wtYHe&rTs&2HLKu-gp^S2u&?E4Qo^M;u83R(*= zZ~aB+Uee)zRs^VR4LTzrHh1O!gO{HT_eK<#VL{cG*h4uQ{C0@c67 zl#{el13HhWW9DJ-xg|p}JV)I;xXLEbdN#kf`QZDoK>bQk{f;l~g3iu7cRS1hU_&KUVL2U$3UpOXv1-Kmw(m!0o4Rl8-XwDO~_5oj* z&{7T*AE33yptGDn_m>XWupaf-z?5mAHZEu!uyf|&|A((U{|{>8<4ez=J}_wgNqzrb z@OfCnaSR&NwgzF)I6LS(V|?L3YdKJP3)+7*f5S!a`Oly}+h|@Hn7lF^!yQzAgT}aH za+d#JxBnLSJ`8+m8npfdwD)cKj%(n%;)dh;Q_xyp(D(-Ez7WtpDSY8UYdKJP3%W0{ zsA(Jc+}`0>-VVonHI)1Wx*G#@W)vvBUnSzKKu~-1VME!+aXYYh=@JXv?>EYZGX_+E|V6W1h2W!vxS`ZJ{ZGo)J;Rb>of!qIy84o2CMwG~d?&bsCPX@a433MO9Xxo42 z=dr<@S3qleKy84t_umn9P9SJ40O(vnP}^ZJ`-@n&f!h97UQ_<3SF8u0j{xd>Q<8rv z)eGupf$mlU-SY$rV^G;dtY1dejg}RprUB4c9_Wl;&_18bPd*a0H*ogq^Z#vqrVZ%5 zUZnaHmwHg!-#>1_|0zpPfzQ+hwZAFN!<6U;-9uR0y9XS$qj`TcKjTWb)Dj1!e~<7v z;Jaf$b9}_i1%l4Q0Nw8iYCC}HPinbkAj|>Ht%1%s+IQgz`2I9v`aqQAZ+v<|d$K_H zK1XLQ2k*BWi0~M-b7Yk{p!^G&3taL4z{O|(Z@tF99{^N8g4PX!&Y%RXApn&hLpjaZ z`%nAdFmd01&{;?L@+LjxK=Y2Ex*xPYb0~-DsN08D83M|~pu0SmY`yyb{KNNn`v9Q& z@$$2e|JNV91HONBsK<3IbU!pGe}nu6qUnu6Ypg-{wSn$hODbCPU&m&2%zvn-tD)q6 z&=@o5yo-v?UEqCzgvP)?@}RY;X=UsFgYFmrwIPO*e_?I~ooN8t3k{m{qj#Q1whz>% z0^PONzu?4wpP2b0{=Owx{EX7{X-9zaFKBPMPs}{sWRD2j!`uf=)5sAw~51UZ^cl} z2P4_tIW?QW^&)638lkig+NTPtLqT`r4iyZVzdU~P75Mx!LjI$*JSdE3tUNnGf6$l-XuV(G{A2%pqUVjS_ZviMf3zLe3tr0uS{njoD-i1sTB!q-jaQz1{13WQ$s=s`u)j}Xw2T8eo+3SRo*7X+*@zHf$tS;n|AO& zXx*fqP0wiGceMRKXw!h5@6`XGJ#wJBoS5{z_4qyTSt6i)0SN`G{wEGFPRL*NA9R0K z>$F4QeGLOWp9wnO547G7v`!MV-vYGvYP60V+I8e`jz7?PbkKdF`_2=0J`U*a4A6Ok zpmTM!t-AgXG}g4}{O=er{eMmGp8u!ry#7DX`5&}rV(PLp|3P;RfcjU%Iqi)4ZRnS4 zp#1M2zu^DWWyGD22kQS1ruD2K_k-%%)q8G&&-ek2NfOhJp_Lj?`B>h*^FQeR1p~XG zpFT$O`0$QHQ2P{g#z%VDy8oavKM2*IAbC*xHa2%~+!YAg>sQdQ<^S0SZ;3kJm{$27 zWG-k7W#+20|3gzp*ZYl@8$+ku0L=w}_NIf*#|O1v@r|K@^8caB&;GYhKQt)zvx4T= z`xhLCp}UC)_EM4`Jk}4^!USn(EJ1F zY^Bk>Ke*HRXgP#Geu9%1{hz+#47fjyZyXSmA1*%r@V}ySC%Dd|XSjm$ze~u>|BJU= z0pIBb%7Y;H3 zLx(UJ%`<~5&kU#d0Ofy=h&lh;rXTu$=H6SpbAh0|1DXq*yyO&kpDSn#k=9`WT5lYc zx$OVCeYXb3dcV^T|ChCG|8L;X`yVuhLTmqznm?NNX_*E<<5!@2e?fDB`!7DldsiSR z|AY3sfZD%dsY}6k1Az3?(tV(D|DvX?|IgeV*!6y}u@QRre`p!Dqh^nmEub_2Y6Cb2 z&G^4;+tvRU2;3J6>i>fF-h$2%0PT6vqw!f+zOnQFPh5BcvR`?C*ZYCSNI+}-&D|!^ zZTtfiKcjdwpVBf7fcn^=`L*iq-Tw*AuYtziL4AN#dv5%94Vg*Pv#vm64Egn22E}?m z&^qbONACWQ&s#-PKhrXvN6j8BN3f*W%-`9k`7*|3mr!AOCMSbo)PO?vUE~pOpRxD1XutgZz5=$;ba|_ul;P z7B*}2Z12&!e^}Q2u<{u+7uYlB7{r;Hj7612Ncml3}NzJp=RF9bNTtb)m&cTunM%^*^+v~K5 zBhY#q(0!pxw_W)UTJI0)`{K(_TaMlPU(mP}oc}>t{R$hm4x01*rY<}EA9Q!>ppLWAyg4%RCY|CLR0lf*O#eS) z#o7O-ZsWf%6qNt>o_qWsv~~!zhDgt*o1(ZttoQr;AJ^CesNA772JLk`|M1=avbG)n zLE{ml`G2%sJyOyDs1IP_G3h^OE|AcDp`iJ(a}VBu_vX8X%p!Yy95!}PP`~B>mZJlI zz8`qK-_g7OLFXQW#zaO++>iQmw44LwMNm83Ie6y(c^fVg9D@gq5rEFb0PWKQtsw&G zCnp_&&iCt|e;m9Af!6gqKJ!8T0gXMj&p7m-7VDeH37b(pqxq8FX#jL*aMNVM_l4em z^X>nsJ8%9sPTB`vBLiwbkm6R*oFAy%0F5Dl#u7k%3VivK)^Z^G4_|o>UfTp}`-9v^ zihoAcj^@?jk_JF`{w>*h1@AZ@s1E?z6SQXEt^bi(%fNSpk>Y>Qcmrtcpr&W{|GnoQ z59pj9$SLa3!t$B(3%6#m>Vb$;nH5}Z|yy0bgvJc#+*q>FQaPd zS61lQbpKB&T?@Vg9CS`NY~3Gv9t4Sl#?1TYANvowTZq^=0*w`b+Ww&P^g#Cvf%+2Y zX48`o%Kxi&-vHm~1#;JD+n;`Ejo36Zs*Zkf0&1HFBrN<7x+efM&JP+J!t#Umh3?^V{x?rK2)@tz)|+p5`x^M{riL77z2BroC+U91@o1W+Uz#2bYvRLN z-?j(b4$iFH@c;OYmjwIfXQB6mfa*?S!WlHT7M->HKj<#POHV!$oNJ&)9>-_Kw&VBz zgU%ZRxgFFt0nwwF`1CRwR>Lo>K>5HcYVQAy2k-p9^6b-pP+K2Y9s->mvTXa+|2{GE z{)5H=2(_O<+Pb7?IO^Alu0(}K})uhD-0Xc~Z~0Z<>n&UfnnF6e!s z`1$~#{`0QW5C4PC2nXFW4jS9TS10(zE%-li(Mj-rV_N5NeCC73F2MVlTd2RE8K3`0 z<%VBUdmv2{d+p_Wry73pQQ)?-)1(@Ax_Byb;je!7WGc z4QQVqS93!0YDW7Pq7R87+T^Ndus>{y}$!gZ9G^nhOM#4WM&G!_${S z`vBO(7_?__!h#b--8}>{lU5kiW&xdN);#6Ff6!ecp!Nq&=>#+ zgYF93MPOebC_jPj>Z$79^&fPO4|*Q})SdvH83fv6xN_I^|99VgAMpAgbjA;;eKWe= zZ}_F%(ej9TaT=1c`2X~kXaD0Hs{@S>TzvHYKWIGx&n1|)=b4YDL+Yi&(XbqtumtVV0qu#s@aO~HIvZ3zfc6CB)@}md zm4zH%pz;9JE?Bnx8o2Eb%7dW1I1m`rRsro_2CY2?l}Vto3E8cq?14#Vqv1X{!yS}& zLG5H>?h6H-AJ{ef=zq}q9$0*W+WwHS#1;QRZSH~0`=Ig$G?uw?=k@=A2@C(5I8XQw zav#jCqx9fRgQM{>aPb1l{~qCU{4h87N7cmtCH>r3}2fj84HaXDvBxtV!s4N1l zK^{$mLn{rA#@E2b7pM;ao4*I0lL4yZvE?z47)TB@4={7px&Mv<)4_L(fbI+c$qf_+ zwO2rUjX?LDf%YAP_8^U>r-4gPqhUWZ!yZ%y^vpf>AG9x+P+kVD2aL>E`hVi0fnV=; z>n-%WvWffukDl=}G}GQ_nKAJ323ivgIwN@f{#$t00^EG_^*^YsJ!|#3|De4=u)TJK z$_!e`gW4nqE}_l zwB{d_$7!91DKQ_k-gnuKYySfh7J%0zfW|V1TbzvgXEZO9EesO{f3@7RCPJ_dS)(WpJ6`Ej_W0nnOW&|N{n$&3E)JoOOozCdE~C#}_h z_AP+-B-!`=2f2N?#>=R`M#~&}r2$YMz}|1#|CuY#{y%jG|9zpf&fhrA2e0@03|{N+ z9X)TfjXc`#A58;PN&}!ifThQz|G71r{)6rd1@*CU=EDJ6^9Nh+2Rd&I)Lx-i**I#? zXgxgK(*UR)4a!rXJ^k}HT>L-S#sEQceit8q_zya32sGypTE9Hp<7Cu-qva00(*S61 zPtzpOeWB06>j4H!8vxWEIequd|GK_C|6M?H{x&_MZ9git{pg*>M(rEiQwf{l&Ex!9gVRbXDX;9lAbY3y&%tEWt z^?sxMp3!~}P168qF3>-I0r0^CJr)Q$e}I(x$VTg#p;6C_#?#=8C(wFY8}F(A zv#K`!KYH!OfX@Yh_8o%uCxQC?qiJSvrkT-r8D8-M>H~O2%=r&mYe(q5P+GVDLFWu+ zRTF<7`Dj`kUTJYOKItEydN$qv?R=;G@0@w$|Dh|-2c!)EntK4<>DfK!*nf|RIW+C_ zjHWUAr?Js6AG~1>>H~nz2#(5L{(s&6+yC#rr~mz4puNZ^Z@v1TU%&akkz@a8{vRFp z8chRqOaq{^fk5}^K<*3uMAx}M(0N0k^?oaMUi%Nae{A%8zrkBqjMn4BG;ZvA|AWrd zFK^%ZA2k0)>wZ46`Jg#J(7gkoJH0@6`hmtHM$_3aO=onh(?-(}>1habU+9b#XTWFe zBj-_CvO#l>`!78CAC|i0KWI(z=z2fW<83spkA@jF(tx@9r2pmZJN}=4NT2&YKyCjs z_ul-UxBdcny`P?K_h`Rww2mB20|S%>w5_}TgYF93eDv=B%TGW42d&4YW!(>2?*lrA zq^No8f6#p+qiz4udW;(N*r*xgr6bUKd(c{dw&{odpSk;n=5v9dwm;}BLa(T~|Bapd zN6+{fpmKjSzmS(-hFiFS<^n-$@1nC;{6BR0`TyH*zR`3p0Mz#HntkLy=x&nX7M7#_ z8O>8eF%5v);Gp|Lmu$WIAG9ZcmVJOV`)>WutVG;5J`}@i)Xk&$d^n{6(0V}7eW6ud zyZ?jk0Rzp?(P9h$wC1O4_R;_D;iK#QhEw_(^~=yM4?%qZ6Xyy40}>Yg2c5kS>Z4OT z|6hOc`TwcgZ~lYN_H`KA;We7xN8@ierUB46K+oKx;JW~+ng2oM$%RMn!RHQv?jiw= zIS$A08}-v@xiD1I0Bj8o_`c8s`0ooPwQK}uX>Ho=FufcZ(f%fU*%h!bD zKy81}*}ikup8xL{F#Z2%+kdqF9M1LUQ1=@se}ekxi?>|<59+g1Iu{6P`)@z_;D15m zmeKWoqjle)ult62{-xCYpuV|d;B@f5{N+2Y{@;A$F8G`v&{;v`;4Me*{Rj0YJi_OU z?)4eX|D*YTu%`jL-v1`f{os2z(#zNV&#&A3Kd*KZ*%)-bM@0J4(K9{FjqiJ9?4UDFN(KIlc21e7sXc`zz1EXnRG!2ZVfzdQDng&MGz-Ss6O#`E8 zU^ESkrh(BkFq#HN)4*sN7)=ACX<#%BjHZFnG%%V5M$^D(8W>FjqiJ9?4UDFN(KIlc z21e7sXc`zz1EXnRG!2ZVfzdQDng&MGz-Ss6O#`E8U^ESkrh(BkFq#HN)4*sN7)=AC zX<#%BjHZFnG%%V5M$^D(8W>FjqiJ9?4UDFN(KIlc28MAO_&1FGHhTW|=sDA)X#jT` z0OkE(2KK#wN6UcGI&L%#jHomK%JZPS|H;6<7etSileo*t(Xbf}o8guQKzaV7fqm~w z1N+`@qhE$yh&p$V?@4aVW-wSF3jD{iUVK^FQqhU5w(*UUMzinvW zd(ObV_swYiKU)8frhyTa23{N3_ntAZ@7-)*-}`7Z?nhMI57jzr)ZNr;Z#^`y@7rKt z-#g8~zW4fQ{vXZ%qiJA7rGaY(_Pvw!?fWVW?0Zj-#{Gzj`_X!odiCf~4a-vo_Pu5L z4!xlU_PzT?^Z#i6A58-zDh=#4uc#ekEXjl!EGyuxmZw>7Gl2q*{vFO_OgY&XN4VCmd z>Q3sGt)M+W`wi^-9E@Gs7~GTn7(l?lzL&wku1CqhzPHA}zW3E=A8@n`7)=AiG7W(C z`c@e@^eTbsdtQd#4-N_dXjf14he$(KIlu(!f*DIv;(zUI|mD zeg-L%7I57UBFxPvG3eX%GU(a&a_QUkdXBCK9#-)_6zi!`H&ef@vd_@2&)vwbkITTW zk3rqK6O{GgSi`!DLDsC5QPaAM+rYlJ19~pdXgp9q9!A4-G)(E820&waon{sjdF=G2 zGn$!Cg6De}L&dV4!NRGZLBqO}$rS^^saA4?He3z z98li9X<*+QZ(!fcZDTNv!N{hM0o31zXM7}vp?wbn2!rPX?fcXX?EAV#`vIeQf3*A` zvT5Ljp?zYry)WKxz0GjW^n%yx34Q(bf=sR_Q$_icshaPVO``!bi`F}M3 zkEVekl?L|f+xL0u+xPM4*!44*kdpsxCxP-lgT7-2qk%)Wpn-jFs)2p)(b4!HQt?mk z`exL=!PCw-u5aI)u4~^Xpk+6KQQy9gft30m)F3c$=!T31ICL`@*>_7D+V|ue*!P0Y z3(<}6W610F&Y=JH1Nm3zW1tueQ$xDU5}ieeIIB|4+Dq>xn4Ger50M*N&b3G~y?E91q?EAoL`atXYNX_>!_29e@ zniFv7VK8#)0j&#=GqCF^9^E4_+7B4*3l6$8aMQq{x52=^Pr<;xp9wUF2g>^(49m~t z(uSb=-@b=I->RF*z^+HZ(7q>kbUa|t#s6p>Jn(h!K*hmH1Bc#X1BYHUeaAj#(3w7< z`k&nVj!mC|T@QnyT@PrVFlanL#?Zb8G$sf-FJScUz>%Bo1}eRe+6zf@pY$Pfa~XyX zJ@Vju4?4@kp%+^grdSNtA24w2V=#2=6Etw>1I-PB)(3$06@%6qjm8TkUPi-VG#qG| z20(cYl;^gB=J-J4{JM7i3Wpml$?_%LAF?>!o@Ahm{wGj(y?d&Q+xJ-*+V{3W&kq|0vL^DBWckI)L zw6mRz?0R_(?Rvp$dO+*?NL|}QYF;O#9#r<&8cqT2D`EoeG1j;1^@5%w1UgF$wDEZ_M&zClDWdP-WLiv(j z@}T^0XfuI9&7+gSR&N@kfn6V$o?Wk`o?VYQ^h{CE{(-ln=Lw9?8IGgP5KIfC)*GYhhh|#?lo#$B*!S)z*tv~C z+kOr!^qwKmU1MbikUK{~_YQ;Z9zShh-+SG_zV{*Y4ieCs0#N%0bWb6uJRD8eLo;2E z^mqfMT~HbZrDaf>egjS8pnWu;G!IJqpgaJ&f49`Yp*O(5u2#n>d#l`JM@O? z+V!e|?%;Ow0L|a`G8)+RG8ou`?&F|O`~Ls`{|(slE&~JOe-QYAOPYZ}9wdJNw>&dQ z9;fk83kb;n!EHPPgZ=;ic$^1z-~)X6+5i71B#*~?3=GV8LJwpwPeQ&gZeILkA;I&GI4t)rZ zGcbVnJcIpj*9+S747w+I&k*%9t~dgP#a;vZUN1w(2~42%XQ1^cpg;hvKLz{UzL(v= zzPH4{z8ADc9hW&nUHqMaeQ%k89oVl7hW5P-Aph&y^?~BO)WE(Mw4ZIL`;n0QL4GVX zvjQ-iA-%&z9^_Y0J_q?9R4#z>#&Gc)vHsYjk0|Fs&Dso-OGZ z-@ZU{%|v$x$Q*q3P(#iwZ1(@i%w_*0GKj;G8O#2MrY`w!?luu;{CGyrCCN-|c7xpH z95fTB9n|nUD119+9{zv%>Bs*U9=-p6{vimz`+xo+HvAr}=F*c7|BqaI@!vOQJ~-WA zbH}vhXZ~M#_6e;10@zG^=AzpLu?OU)n%+G)?Z9R)sbczez5jD+HvM0{=jQ)|m!AE< z`ux-XTW`MpzxnzL3I>T?d-3`IvFk7YZ$5JO|IAfq|AXQN6n@z3ENk2Gf9<|o|M#7L z^8eg}cTlr1&BbQV^_QRjAG-4V|LQ$A{->0z{g2BIZ1$2XX68Eazf17U{{;a z`2Wq|fk;S4H&{Noq=-*)^yI30l8 z2ug>krR)CdSa*TbA}GxeYd*+K9qaD@o)L5YAHVquC0s#f!!XG2hp#;UACYxOyB8o2r9>;IN12gq_8D6LqyPXgymZxA0OzW?IW|E{64 z=#tlo2`f;X#pkd3fAP`#|F_?M`@jCc?f;e@lmCPKLyUfy8jv|LIV-^R3aA_b`4=67 z{NFq8*np*Xm|Kx)kUv4?+`9d@!2So7;h=gS7)rL16;Q zXJKhe$x2^@?59K?{pgrxWf>GzDB^B+{Mfyy_Kf6+0>+$CGD{5Nx* zFsR}m6mFoh+bwkV{{t7Fg44jR(~tf;_)iCygCM^V!l3f9x_dX?IuF#|0JT3rW`XP+ zjJR+9ad7$twdX+T!98p?xIP2bX}B<`oe+?)@c-tc_rQA5;~m5Y#r@9H5C1y^OdmAm z9(wqL;w3zN>Ho9$A$1|BeGIC{PuzU24A^{?tf4@2x`ZJ^6H&;-~Mku@!-F$&(!~*b}guk zL&qTT`U(5+mV2PGB&%xUppSc4Sb)Nyb=pB_d-&7;tf~!I-40S`=Q|Ch|A3wcKyeT1 zPl4(Zkb0OMgP8{90Z@5<;?^s0UASQ5rT-?*m}wWJF1>s`csv2!-!MKX?}Nf}sQ4Wg zFQ7ib+;tbg{s)!qfe8yS(twF`|NnXGFM!KRn17LJkl(?26EXF|>=~>yC~iUH5tpBQ z1m}b1DF;yMZIC>u?+i*KAb%qJ8^#8ueOzg0u=*S3E>NGq#(T>DO^5IP2bF`MF#=Ft zhoxf>-86YWIBa14MW;c1>5K~OWe3cj!AyhV7}QS(`3p2Il2*13oCiRD2ZhD96NqsW zkQ!tRihEGqVedB$CEW~W|DwAMbsdPC#h@F{bhL ze{J91|9)``{)7Anieuz74`YMUKB!&*)eq?A4K+Tf90ZMNt=fI#|DAW=|8F{S_y2^2 zCvc{FP#A#93Q+z4h22o|FE;mr{87}j72LlA^@BijCm?@f!=Si_)D=^QY`KRX2B7lZ zIe6y(z2_c7^89PaTmd%!gZhk(llBiAzaxi5*X$z@|3l|W(ESf84?tz4f7}9aJ&CM$ zsIx(N05rFA`tBQ?Z5~kCht-io-M`q}59+@!+;kad8UU4hsikX&UEIUM0+a?aD>wWH zwQJGSJ}Bb|D*%-jFg?SG2Kfuz?nRm}goOjB+-sPyZ&;Rl$Z-e?gNBLwzjUcNZZfubMLG#ruQxE>{oOSqr=ghPAoD+?>l`VAscB?%M@&HwbG& z_xys&gn@Q5F8e`w7gY9u+{&OFR1I=B2!r^ihERJQA9$&B=k*C&uQk{0~}t3<@jIS~QT^pl}Ao6^M-sgVcc5y>37G06fPF zo8Jb}pt)YqK4s8;0FWJo%)(^{vEn^*kAc@+g4W=I!ipIC^lZETgVvs5Tbl`5w*Zm@ zxt&-ykgE<9j=@Qb{)5)bfYNF>k$e6?YX%o=1g)+7hO)*E6!u%`yuJeBmP_C`Xb10I z!oN=$!&|GlH;($)Q-ybN+PXgwil-C^_O1K_<#pfyJ57_?R&w6}2o zg{N5aEvPO4t=lCg+^DGrlqNv?gFxv4RQ7@50z_lOAUWi4hp|Ct2_zJ(rfb;4!T{uc zpXho2kKK6r|JsXB|EDfJ{U5X@zP5MIe`E|=>kU!^@+ZvQAR3gGHXOS1-^z>h{nRiw zP)dX19Tfkd`VE(e(m|E|De39XVVRC z^Md>VI*Vi9g(q0^E$D0&YPS){@jEE|K>L9~VT`=S6C@5=`-Gl%LF?f_`4$v!AT{LJ zNliVVa0Z>ZaPaao@Y;RYc{ZSPeOBzejy3E-=O7T3l#fAsX+iswLHPjWW@HQsdr&zG>Q95p-GO#5Hv2(-0IeSd zrE_Gr!`PrRkp^Sf!~6nr8@9clApab?{OrGb`0PQy4jQzN4^)qV(hDryLF`G3PyPpu z^T7N%SZPokfX*X89xDOWx1hahAi2TnZkW43dDGf!GI;&;?A7P~&t7xxf7`T!;PDlZ z98BF%ph4w42oD9fj=B-PeiGdN9wFf|)aNfib1*|SzCdmt%JX+1w^ zZU?O>GO+Jq&<>psaz6-z))Rp811MjB^7ddTTS0CBxdr4VSbAr0h*|-1FUSj{cmP8H zv`!0jix22dANV>g0qpCv4D5SZ4eWa(4eWc58rb)KrD6L7WH!i-NCW#mke#6WR6umO zfqm~s8rqAV?>`yX_f{bJ8^lLfLu)?BPEeR1qocpk{RD~&(0U(qaeDDV=>e--;e7%b?_6~EZ||3T{;;XjfN0PeLNIv{O%4Xx5AqvmP6u?R9Egu@4oD0%1_Bzx z1dU~aFlhcAbiO`F4qZJte9+h~=xi%%uPNZUWRSTq3^ETS5Ark2@1Xew(D~>fIZ83e z9?<%kQ@3A(&!z92bp*Ws9JB`=bY?GTegL%Y0~GHd`$6+Epfn1bZ=%$Gkbcmd2`GL+ z=cIzp$OE074a1=GbCLZHIuqYHXa-fs13~lppgAW{Isnbhg2Dt`PIyiJzwyu=_|rQ{N9+(*T-J1+Du5-Io9gcTlGl8??3r6z(7lig(aiMW8qWg%i3yYVkpFo>8$Lyf)y-)fez{ zaX|Ki;s%r^sbv>7b3lFr&4q*J#6e{}$nT(Z2RdUMRA+(W2%A1?ih=9^%|(Lj1=$aB z$I@+A>2}sF$bQheoZ~lMg4ZcsfBEG<==@$#+)&e>_{;*;r%jXg|6jZBCV2fOsICUZ z4L&{8mIJu~)cyeF32K`?g3KG}_V+;cKR|Xz8QAxN`a)Ry0W?epAUi?*FHrvz)E5Nt z>E#BHT_8I_c7w)CKs3lLpzxq&dH|UXvI7+6AUg+egaTqUXq-ZTfdPEuFnpYX1?xD4 zC3JiOH10%fJb~1L`nWK?#Ogy=2QmX>7F--u)`Bo{`ULSobpr^a)x#)yL2YT!eMO+N z`9Wv7gUs-bo(Ep5+BN&=|L!?Q|Ce{{{0~|ajb;wmevmk*FEW3_#s8qQZbAA%)fW`?xYsEos2c5+R zG7~0G3=L9W*t8XV{|%^30pb&*4_OT;96)_=0&56R(jc;a5F6wd5RC(a^n&sLIQ`*J agHH~m7nTP>X5mwdEC*5x)(a^u$R`2Z3l<&# literal 0 HcmV?d00001 diff --git a/frontend/public/favicon.svg b/frontend/public/favicon.svg new file mode 100644 index 0000000..ce6071e --- /dev/null +++ b/frontend/public/favicon.svg @@ -0,0 +1,10 @@ + + + + + + A +