From e52293d78a61b7fa61b0e1589b60a544166c1a4e Mon Sep 17 00:00:00 2001 From: NunoSempere Date: Sun, 11 Feb 2024 22:13:53 +0100 Subject: [PATCH] tweak README to add architecture, tweak makefile to make fast. --- README.md | 27 ++++++++++++++++++++------- makefile | 53 +++++++++++++++++++---------------------------------- rose | Bin 42896 -> 44856 bytes 3 files changed, 39 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index 77b4a15..104e778 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,6 @@ Rosenrot is a small browser forked from an earlier version of [rose](https://git ![](https://raw.githubusercontent.com/NunoSempere/rosenrot-browser/master/images/6-hello-world.png) -![](https://raw.githubusercontent.com/NunoSempere/rosenrot-browser/master/images/0-architecture.png) - ### Installation You can see detailed instructions [here](./user-scripts/ubuntu-20.04/install-with-dependencies.sh), for Ubuntu 20.04 in particular—though they should generalize easily to other distributions. Or a video installing rosenrot in a fresh Ubuntu 20.04 virtual machine [here](https://video.nunosempere.com/w/t3oAvJLPHTSAMViQ6zbwTV). @@ -52,12 +50,27 @@ You can also create a rose.desktop file so that it will show up in your desktop You can see some screenshots in the [images](./images) folder. +## Architecture + +![](https://raw.githubusercontent.com/NunoSempere/rosenrot-browser/master/images/0-architecture.png) + ## Relationship with [rose](https://github.com/mini-rose/rose) - Rose is a minimal browser based on webkit2gtk. Previously, it described itself as aiming to be a "basement for creating your own browser using [the] gtk and webkit libraries". - Rosenrot is my (@NunoSempere's) fork from rose. It has accumulated quality of life features/cruft that I like, like a "readability" plugin that simplifies annoying websites like [Matt Levine's Money Stuff newsletter](https://www.bloomberg.com/opinion/articles/2022-10-18/matt-levine-s-money-stuff-credit-suisse-was-a-reverse-meme-stock). It also incorporates ad-blocking. - Rosenrot is also a song by the German hardcore rock band [Rammstein](https://www.youtube.com/watch?v=af59U2BRRAU). +## Comparison with [surf](https://git.suckless.org/surf/file/surf.c.html) + +- Surf is another browser based on GTK/Webkit, from the suckless community. +- It is more complex: surf.c has [2170](https://git.suckless.org/surf/file/surf.c.html) lines, vs rose.c's [454](https://git.nunosempere.com/open.source/rosenrot/src/branch/master/rose.c) +- I find its code messier and harder to understand +- Conversely, surf has significantly more configuration options, and digs deeper into webkit internals. +- Anecdotically, surf feels slower, though I haven't tested this rigorously. +- surf has a larger community, with patches and modifications +- surf is more opinionated, but also less amateurish. For instance, rosenrot +- My recommendation would be to use rose, and if you find some feature missing, either look how surf does it and import it to rose, or move to surf. + ### Contribute - Contribute upstream to [github.com/mini-rose/rose](https://github.com/mini-rose/) for core functionality changes. @@ -84,16 +97,14 @@ About my own system: #### Quality of life: -- [ ] Add css for js alerts - - [x] Add custom alert whose css can be customized - - [ ] Debug problems, e.g., this version is non-blocking. -- [ ] Figure out better way to have plugins -- [ ] Double check newtab/next-tab behavior - [ ] Document creating new applications, e.g., as in [Asana for Linux](https://git.nunosempere.com/NunoSempere/asana-for-linux) - [ ] Add list of similar projects: #### Maintenance +- [x] Add css for js alerts + - [x] Add custom alert whose css can be customized + - [ ] ~~Debug problems, e.g., this version is non-blocking.~~ => will leave as is - [ ] Set [`webkit_web_context_set_sandbox_enabled`](), as recommended [here]() - [ ] Use something other than Whatsapp as an example syslink. - [ ] Fix bug about distorted audio. Maybe related to [this pipewire issue]()? @@ -101,6 +112,8 @@ About my own system: #### Previously done +- [x] Figure out better way to have plugins => stand_in code seems superfluous +- [x] Double check newtab/next-tab behavior => custom style now loading correctly. - [x] Add a shortcut for hiding the search tab. => Already exists: Ctrl+K - [x] Find out what each of the css elements refers to. => done, see make inspect - [x] Figure out if downloading files is doable. => it is diff --git a/makefile b/makefile index 4413e59..7c60183 100644 --- a/makefile +++ b/makefile @@ -1,31 +1,19 @@ -# make -# make build -# (sudo) make install -# make format -# make clean -# make uninstall -## C compiler -CC=gcc # gcc: more options. Also I don't know whether tcc has error messages/debug options. -## CC=tcc # tcc: much faster compilation -## other alternatives; clang, zig cc +# C compiler +CC=gcc # other options: tcc, clang, zig cc WARNINGS=-Wall -OPTIMIZED=-O3 #-Ofast -LOCAL=-march=native # binary will not be compatible with other computers, but may be much faster - -## Main file -SRC=rose.c - -## Dependencies -DEPS='webkit2gtk-4.0' DEBUG= #'-g' +OPTIMIZED_SOME=-O3 +OPTIMIZED_MORE=-Ofast -march=native -funit-at-a-time -flto # binary will not be compatible with other computers, but may be much faster +# Dependencies +DEPS='webkit2gtk-4.0' INCS=`pkg-config --cflags ${DEPS}` LIBS=`pkg-config --libs ${DEPS}` -## Optional adblocking -## depends on https://github.com/jun7/wyebadblock -ADBLOCK=#'-L/usr/lib/wyebrowser/adblock.so' +# Code +SRC=rose.c +CONFIG=config.h ## Plugins LIBRE_REDIRECT=./plugins/libre_redirect/libre_redirect.c ./plugins/libre_redirect/str_replace_start.c ./plugins/libre_redirect/str_init.c @@ -33,22 +21,14 @@ CUSTOM_STYLES=./plugins/style/style.c READABILITY=./plugins/readability/readability.c SHORTCUTS=./plugins/shortcuts/shortcuts.c STAND_IN=./plugins/stand_in/stand_in.c # gives function definitions for the above, which do nothing - PLUGINS=$(LIBRE_REDIRECT) $(READABILITY) $(CUSTOM_STYLES) $(SHORTCUTS) -# PLUGINS=$(STAND_IN) -# Note that if you want some plugins but not others, -# You should edit the stand_in.c file - -# CONFIG -CONFIG=config.h -# cp -f config.def.h config.h +ADBLOCK='-L/usr/lib/wyebrowser/adblock.so' ## optional adblocking; depends on https://github.com/jun7/wyebadblock ## Formatter STYLE_BLUEPRINT=webkit FORMATTER=clang-format -i -style=$(STYLE_BLUEPRINT) -## Commands -## Hardcoded paths +# Change hardcoded paths when building ## Cache USER=`whoami` DEFAULT_CACHE_DIR=/home/loki/.cache/rose @@ -71,11 +51,16 @@ build: $(SRC) $(PLUGINS) $(CONFIG) sed -i "s|$(DEFAULT_DIR)|$(CURRENT_DIR)|g" {} + # Compile rosenrot GIO_MODULE_DIR=/usr/lib/x86_64-linux-gnu/gio/modules/ - $(CC) $(WARNINGS) $(OPTIMIZED) $(DEBUG) $(INCS) $(PLUGINS) $(SRC) -o rose $(LIBS) $(ADBLOCK) + $(CC) $(WARNINGS) $(OPTIMIZED_SOME) $(DEBUG) $(INCS) $(PLUGINS) $(SRC) -o rose $(LIBS) $(ADBLOCK) -local: $(SRC) $(PLUGINS) $(CONFIG) +fast: $(SRC) $(PLUGINS) $(CONFIG) + rm -f *.gcda GIO_MODULE_DIR=/usr/lib/x86_64-linux-gnu/gio/modules/ - $(CC) $(WARNINGS) $(OPTIMIZED) $(LOCAL) $(INCS) $(PLUGINS) $(SRC) -o rose $(LIBS) $(ADBLOCK) + $(CC) $(WARNINGS) $(OPTIMIZED_MORE) -fprofile-generate $(INCS) $(PLUGINS) $(SRC) -o rose $(LIBS) $(ADBLOCK) + @echo "Now use the browser for a while to gather some profiling data" + ./rose + $(CC) $(WARNINGS) $(OPTIMIZED_MORE) -fprofile-use $(INCS) $(PLUGINS) $(SRC) -o rose $(LIBS) $(ADBLOCK) + rm -f *.gcda lint: clang-tidy $(SRC) $(PLUGINS) -- -Wall -O3 `pkg-config --cflags 'webkit2gtk-4.0'` -o rose `pkg-config --libs 'webkit2gtk-4.0'` diff --git a/rose b/rose index dfb2d6ebc16d95e7a6b1084e39d4c8a92580deb5..b98aa8ca9097cef99dc77bbe5af127da437225fd 100755 GIT binary patch literal 44856 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

WLKgo?_li#HyLP~B{& zib?$en8*fqQ@ptujffR28BHOg3nqVx4uo}WBFyYg-JT%2aWf?nZx4FB{?>4i`ZQJn zGQlDvk}^X~1u6Ss3My(ehrRG9C1yrp33-~_K~IxEm?KFFr%vA;^EC0Oyql91ADv*P z|3%{$G%gix_7Y$k9 z31WC{1J5FI+-wQlrP)b(+S~o;gw0Ymbu<0Z#PVXXl;M(s;o}(U5ATYzoK2nxp_4F^ z&8j@oY%?z=&V-|^7W>RvOm&)%!DZ+1Nkk=+0G zjpkpEiA8f5W@_zmOd8ziZZSAfn7i2%2x`s9-b+z~5NY$b!89V2P_s7}M&oHi%?*S@clUMw`^KY72TvW`|M@nKcl}?+2m!>#_3a-|GN(Coh$YYLzQ{M8ZQE=&N3ey!F z1!x|P3NDI}g{@HVv8J@9tyb`H3f`*V;}yJJ!5s>|UcpNgyi>ttouuHc3QoU~$)iWX z)pe;m75qdg47yFhCo1>@3O-4}w=4Kb3cf?ZPgd|=1*hL=tKg10Mp zg@UhF@Ja>mRPZVV->Tr}DR_^9&rt9?6%^2EBFotpQGTt z3O-lC_bd1X3f`ySVkwn{9#rs)6#0Gy7efdOH5B|3MSf7hYZQD)!CeZjiTUaH_?sf~qBR`3Oiyi>s!D)@8-*A=`{!Rr-#j)GsR;57=qNWpalZ&2_?1z)V- zD-`@P1z)Y;OBB3S!5bC4UBNF`@bwBVmcChNr-F;6QHF0-aItjE@E!%{PgL+s?o{wA zImG^NQ*f~a%J2siTrBM}e7k~Qt)#OOU#lP!`w~O`eqG#P$7V7Ga<){1f#O~rp_C(*oA9fy+&v7OsvBxJ;fFtd0#-nLI629UC~)-`%Rt}oM6An(?Zj+fghMWEil1;lc$9x z*l+T*palC(o)$D=zsb|W66`m5T2O-hCQl1Vu;1iQXZ)EaPYXxK1}2z1Ef^ge$TN9b zC^|Oq-f?Nalku;bJS_~tev_vKA=q#7v=9XQO`aBjV86-J!Vl~>d0Oy+{U%QfJ+R;8 zX@Lj!n>;P-z^FH@h=KhkPYW=x-{fiG1@@afEx5pblc$9i*l+T*zykYCo)%VMzsb{r z3hXy|T1bKYCVvs*&op^j@P_>+PYWq1f0L&L6qNs`(*7F8ziRTdU;_J1o)$`Azsb`A z3G6p{S{Q--CSS+++f1GoNMOIo)4~YsH+fnRf&C^=3n8%IPqOgiEqsxMKMs}E z{64hs?^yUZEc`1L{sjyFjD_E0;h(VZk68GJEd2cz{%#9@yM<3#_$~{7gN2V<_%;jg zxA3bh{BjGw*uvLY_-YG3%fgpg_-PjY3=2QW!jHG`MHc=zs&H2MTljY@{2Lbj6$}4@ zg@4Av@3HVtSolXQ{6iN0ehYuMg}>dxr!0Jzg}=eV$1QxDh4)+dRTh4^gnwb= zg`Z{N%Pjmf3x9@%pJd_3TlgXie;i#}R{2}_cP#uH7XB3r|AK{o#=`Hh@K0FyM=bn9 z7XE$IE}ABl7UYHgg||AkFgF@5#w3R#~ycLF5QrP7q~&= zpK&fpe*{)f7VUr%##o2~=&t@LajTGGRoWOuQR$V4Cp$5h=F(rM@G=BQjVASDo~U<^ zUyA_5Zz7VKbqJF!<4P!wkgEU*>F!BC#i$0c3%S^C602ZhvnqK4XMz|(WB_$i)mLMZ zXS@rQdF~$|w((&;^aFD(jVg2v$&2-Xn?DL;+t$Dx1vNdrb35r&R`9;noz`bS{& z)TB2tA&06u>F_h8Y1{#?=-sovLBY&5aavuc~npADmH#`B8qbE;aGK|`Z3HHM(f>WAAxRqSqk)% zJCjF~dySJ|6lzV?)2JB9eJFq90KyPCzRP$C3eo*qRqwT{Tq|9xc0sA1BON%TgjBg} z64UeBfQ%6Nzq`7HuFpffBRgsSQ1woI^4WjWldtKC*9RMyHKd9j#T^8y=p~F)Plw;q zlb*sX=Yt-Ug(=o+_y99;&FPQwSpAtFeb3Hkz z?|kd7}^<6y`F zFvh?~C~+TD+*`C9eBLU=HS?$V104ty`VilcT845?yx#9hM~0RoE!S19E9;YK(QaK= zEY)v(yBFE`^zOoG@FDW6+mH5{{uoYAzNsg786V(MPrh28+^gTICwfctD;MdFl||MgoiCHF?M z>s)9HKJQ;nco5aH`*uoh2UXB>UP}DEYV&1EWrUyf?p6DJ`i#?=nI&EOA*iSPeb>6K zp}OSyHL;O{Kpjprfz%`INNxAwPtMw(2azs_Q1~t+_-ndG zKraP+%9tDG?9AJ9d~;VN#SzIYK{96iZA$z@YW#Fo{6;1IH`Mq~D)CPe0WAOLvf?wH zDStEL2_(!Fznf{t6yJSVXk6E`XQ-oRQTN1)8{z;zI)PwXo;9)$b4AE7ct#WOZxWu-omu8HqJA3#6~!BxEjvk{568=aR=5ddTG zgLIned!~wi%&Yhx>ys}mtxtYNZ2+T_)A%xyX-J|%?@HEAJ>58&u}5)TsN-L;F^T~n z6H|(Fvhg93evI{ch;mS;jF+*i}3C;HEF2DjiJjzt*fuyL!4l z(!I;3PTq8WY7-PcGEPtFdDM%XjRxZ?d30Q%YtFdQu>oGK;DwKkOW%iyPak=h+gI21 z^rm2as&0xaRiAD+XHZWJU0ib0iBKi+$rnp*8iR}4t zlJ4DG?|pi4YGt8wacZJtacZN(S)aP7aPi!iTqWP$)i5^=vajxhPhE+_D8_pbr8aeK z+I7zRuEeL%ECs-oJXF;Sq&E2%so$Q@!{bJicH{D;c5fp%@oImnu*x;}_t4MVfMU2) zKj(M#sc|PkzlnugC+3lMD5}jzUFW>#N=-aP_dfR+ExWn)7M`S`qOsMZs$Q~ZBiVD& zC>jXUz53ig#g7b}jrxR+svd?Y#+OW~(O4O5g)%bzBllzmFR}i&RQLW@*P%@(rk19k zbRthZ{giRvG3pQZ?Jb<5UArq2gRKuPUy8BlOOVu)pR%>aRP|ykIT@Ykxb@^73>@+C zM`rW#-CCfhcVW;oyeRg>P&)qZ-U9TVyNiKcyK3MeWTR-@+=E%k)wsPUiN_~G7d8}M zy9&e30jzQjJcNpy(MIUc^!YYgb4H(Oq|YFPZS{E`IS<$8j2!wrjpc_N`qYv>XXMf+ z=Xk_h>Tw!x5fNh&W|T;^(>f-dhL(uV!tlPwx(FJZR^XBiCj0*7A>?kj)RkJu$ELp} zyMm}V;Q#fpiQaeazMYaY$EN9<=TUiPjYm4f{+aP;1rlQO2HtU?Z~Pd;#|}(rjWI`Q zJi1DbN1wh6=cLB}nC7~vqWeIU@#rqF4XL&svrqpT067@_fUf0W^g3hYU^IL%_+BRB z-7GZ6V6dorSv4l}7z{pUgFz!rMrknkSPlm7%E91cHW+*#rgT3-PNTk`)&nsZIOD%= zNPa{>CxS5;JjMrutnvCb8V~wmx;Y-Odz81#(*2;(u2wK5iG|aIV|RzzrB?8dxwp~ zR1MMD;l^z}jKug&vw2MF$+l4lB%7ann-}emn61pu-S7N!elFSa6O{4r=_Y(Va4SND zKE@)Jv@FH4e=_y|z7*q_WxQ#;f*Tc9UPp~@p<_b%#p;9$US{=AxFAlqFUdE>Jq_K^ z6u^b#g5Mm0D^KQCnC6$PY8<&&RDx$9b>!#9N$?XNFGPJlZv2W_a&%R4?|^|MkXZ;}=*5KoL7-D4dJ3VB3iJe^h(8_}RvESdJ@P}P`CzNaN z@7oEL(~m-)fqK>2va z=kw=7X~Q|d`)}7Ww6zauCe>Z^@I3U;y|Kx-cZki$9r4ZJY4U-kfPqE>)^%4W0U56& zE~ZfR$=ybhxtEp|ehUG1o3_t5fWhR*Z)yCkzMAA8&d6VF%HK)}q66yyeT?~W0xLD# z=aH`)VI+PgTIV3$rJ!l5)5RLu|2$;e`zDnL`@IGJ$ITP()@W_7m^p}b z?RO(r)}Y@NU7PV$awMO>QklH`w=4%S|B!F6q=hPa082v4m$DlxENlH2I2xkZoE8(o zZCJ@s+=hEGT1YJV6U4658gcb|Ts6X%zlN^Jb26Iden3e0AP9B6siFiDxlX&1#3{Wi z_2heW{UHRf2EwlMFp<6z`R}0Q5SFGe2Hy#aR(sWC0t>w zLZa8fl7pDSJ&zFAGGy71d<(;9YWzb0ki$NTF%vPaxmxdDIknha-iTL`Q^YEn=r8r| zi>6k6Bnzt?in8L{Yb=FwM{YG9gk?&V=%J+|UY9?sPkx96skbZ9WM*GtDVgb2z4fSs zA!tE9nN0>_Y@a~3$nPfPXLv}d?&@pkdK%(k z8HaNCCg8bD!p+sM8rV;ASQ*GQJmsmzqLnZbL!4hOK@H_H|xxP&P z=q|bk=}~eR&$oONCeu7DZuFQ*?R|~A=I4U`h#5wA;;~c7WhWskRE;G_26YJzGbU2p z?&?{Dq-OmLOPa>BuQKRVK*n-buV$S@!QItogRB~u0F1_yPc9^G7o=gYG1gSVB{F}E zGViW_31UdPo>oiI4x*GgJk?E7-POA(l&g}2az}0w?N^q6^24QAT)^DzXQVnS!&i|) z;?pm5RHN!Wg2G3k>)yh<^t`@{X_;EwA0dk!BFZi!gsXJ#cM<>NPm?biC9vRHHf!QV zjQMDydOS24U2;nzpA4c(5phhM6=k)9hNPY;< z*D(2&MbDrJN&XE$hDP!Fp9f}usuP>at>Gaqc zY5btkJ1+6biSgH}dWX%Ayie=N7xh$Oy{miUjl}~&%p)_s5ug9Lu4+hCUw9ryYs@fS zr2DWBUCUg_&z9?{vU341Z8(P}hQ&ts&oF=I@q*ZtszaiEHzbc??5Rz@=}J%hD}FY^ zV(}~Sx2WIc<2V}?6a&bLDNT|je&iVOz=#J%JTT&c5f6-bAmf2NOyuNJW=BUy zIX>Ou3&hI3;kGPzLpUCbH~F*hmT-qA^{<8$7`XK9-dg(&7&V;?XP!pP9;~_=Z?HzR}}v3q->>Wxz`K#NT2YJgq4TlA$%^V4PSQS2Akm-^CAJnj^ZPJ<@g-inrH?0 zu}p`)ga(1~SlH*;P$5x!`yHF*MKHW3 zP*ICdWYLGBq7~k7#9t8&H^=ZjJAVZ}Qxt8jm|qcrC1p*Ka0kBl$Cywg9II####;iR zXod169rd~#U)7=Ge=Q&OQJ)I-pVD5cFS%mb{N>A>bt@WOm(`xBo!J~}rhi`T%+?T{ zO{UNBxua61$W_t9tSP@0i4 ze0VM5iE8m!bJ-kCd~&S}A6vqQ-eRin%h}fpS?OuMKy*zRl?96W=LRgafg5l?(a&>(MndDOhVX79EzaFWfc^+f;!P3N;5>n7*RS@yR-k zz6MyvKEoD@m5Hx7(%14hhHucpYW5XQ?Mn;l=ugY~_!R#TlvbwAN2Mh>CrZi5KNfd^ zb6Rwawv>H=P+NenQPOA5%7ni?p+Fn^G-6c4C$Y-dH?hi42Kcy|4@HW$r_nbP*P+)E z)ygbNd|}F8?u&cZ(Ag5Es)yFx7Oc2rZS^!X5s?FZB(qF>NU|*RDaNuEBp*jRgk_O+ z0k6NTBOF-+C-9GhMz~UnkF{`fGir*z3}17@rvO>_F#lTGrBXN01E5FnN6VvYNpT3u zdY`*rL(Rq4I%Ct%UKS2JQ6L+f^v%3;o%li*>ut!#9_Hn6$bU8-U}auab%QVQ6+zUz z$eOZPtG`V;up%CfR76pc{S^#GM}uxisSDE47P=k3jP~N}!`Y8>5N9dY^J{RniG+*-D&^ID2qfl4fin{(ycwrM;2}`l%df>$`M(atWu8U2^MFA6}eyTET?} z5r(HcwW<5lX_dMW9=-=nx|wD;oa^x*N+92I%Xcg>dAC*h~#EPf%KW~)gtcq5U=&cgOBOVy>z=#J%JTT&c5f6-bV8jC>9{B&t1M<7^@;mW#+ewF&#>LH##4jw) zmaDh$t1Ns-@Z)$ibH8X>gQMf%3QkYq#QeVfX@VEg*_s+b@;mpm4nv0w|M2s4nD}kD zSEWPVvsJRyD88mhcn{sv;h;4`I$jeOxD{mwThG81o}I zmhD*h7lb46KojGo9U}SvH6r)ZwkB9v$&ngC8wFi0XuF`Dg7yfyP0;Ov_6pi3XuqI? zf@)PfpHe}cf>sJzBWR@Z`vmP5bWl(Y&t1_`DyUP?Nkwzj3)cXY<#RH`_XJ1ql#?*NN-gO;fq^=Y ze&rMXe;smk;Covv->nvTH}G6`(eIc{f4tqH9zlVxw&0ruF6UP=&h5A$d#79UzmMU= z%lG#p9XVf<>HL|=53eU50nerXXgDetewq#bWgDD+%gmL|MK-vdKj}sEJpB6ia+|a$ zLvy8nC6hm8*#5hBp?vdmw8tjM(=1NT7iH>Efy;fABz_Z1e|USL-`4Ulo3pmBvoOKT zr(c*WWeS|$&(a^>-szo$JnTCw#|0Vd7WBWgKe2V6<2{f^tsQps+u%bs_!A<1P1Mf{ zk>XhR%{eS}P5UJ#qNI;?AK$YfpG%*GHh8lQ-f4sPFuYW=?i0MtM*dMDZ{6p3uZ{dc z8~i=sXXWt2c;>g^0W*X@t^4?1ZX@4fgMZTo|F#YOYv84*Kh}PGH^YbTOWkLa&RaJ4 zD0Hy7%6EzlKEnpT+y)QW;NNCA>YI!ETJB37LVc$FwypbW-!J5?`#|pi?i^lR+CH0n z582=!+u&o--gElL2A^(&yKHbT!%H>mKGSP$VP;dF)%-cHPkSZZRxR8VF84+AI z2;90~`%0U1I&AQ*Huya@_|F)QdMn1YLGZZl90FVTYp&Ky;tz~?AZyrWaA*m z)c;d#@EJDvLNT89UdmIE>pLrLb1kl)j~ELtTkfvYMIL(X z6@Yxvu$%9wJZxk5matnqGoCAmo+%gGSJ%|YEse2ZvAcfRVrWG87*Ubh~r`U zH827sis!%iX42w8d)hUc?fuPn@TUEi|G}p15XNrs*!Wx7YP=)BHaBm@J1?+{?TT$~ zbImtD5BaeFbEd+X+dzu~K+*gC8Cz&0W{M}D`e%F5i#DZ9L8& ze#ai&A?$Q--Gkb?({>AXwr{}}-;_d#w#H`Ld5e^>bGMHrO)qYsA@HZ?;X%BkKpL}c zz!fcM2WzIiB_b6+-pP>rgDZQ5Qz}{eV4It)TX!|jm_C!`ZN^eJeCL~;XGF=h|Iike z6z?s_|9tCr+PRw*2-{9vy4K^vuJV!aIuv_^>Z_agCd1nzdXZtr4au|o8u7P<*ZKM0^}-uwT{A1V zL@Yb03;E2u9Bz6=1g20;i}=^Z>0O|#+?X3ZP41wl$scsbWL?3FFB$h`w?W>vSc*(M zd*gL;_x2Xw8h50n$pb_1UQl+Xl%U*xJ!^OOX6Wh7c9Ph#9vh|mBa!SNYh8}u{Uq!w z-?X9K1NGTEME|%x(JuDu0^xX6ie)!OR>$zdQ#25bq5nZSha+gD%og4s312WLlIyG* zk=tW|STIK%R#7aQ+56WAVmVD@)l9sDB)bYXRdM!enwwRorm5sY)7R)aq%X?>k5_Jxr2ERj-W(X|D9E#DB}>z67LViBD{i& z%yYQc4s9^IUf#)Ny+@_=-NV}qX@vo^gU=t(OCsY|4^?4*b6`EQK#T(< zDeZEHo35iyl!_vI&}K2R+5po9Z|1eZv{);R&K+**d9rK2(wAT+GpssL<}{IU2kBip ztp(GJpr83$lxq!i4g0LS&rXNRsTFT)qRXOz zh0M0r3T9?J5>NwVmrB~BOZEEExZ1)#7+{S}5;Os5iG<^9EDDArQphsMFssD~#kvuS z>y4v{wedX@pstQ2q@pK?KsVY4?i0&^Viq4}Vt zOncpUx0ZCJL_K(sFhYGBLo(AoPY|5~z3+-WeQBa-*X7v}StUINJzJ zO+t1B%N@ifh~ywD7wJTny;&B#WR>oeVrGT%9)Wd=_@OPjp^Z9#a&$zT;yqM;g&O9M zv}@%Qxx6J5FGrKY7!%u|Kuz&L&{r1l3CK0CzAWZx(U>^8wN|a%w;_ZqIE_Vk2z#?T z9Li$c2!qo-6hU0I2V+_}>q5(Mi5K3%(nZwo)yi2@EJs@nKpJm>$2?lOzg67twEB>m z7{s+2GXpE3ghjhonB6*MKEEaDHVVW+I+CAde7VjR07fRu{N-~B zlFH}5Ai@qxLp|1lp=YaPeEB?sq(eej>M!La-Gp#@R!j2oxd%xbMSQFN0@hNvAfL+k z^7#l!?ffV0|Bi@1Pb4UxqmZ;lIE?hCI9C7t02uj1+GqaWDSr2~J{e#w|LXXr*ch~&)}r|WqkP@ili@- zkaAe_KZGzfzIr0+qjM2Rnd&)@z} z#y^g@RCi_m@^}0lB7TiN^3ryR5#4?d=T5amu&~