From b0e4c491f1e69f8138208abebcfb31806e5d8fbb Mon Sep 17 00:00:00 2001 From: Jay Wright <90924187+JayWright31@users.noreply.github.com> Date: Fri, 19 Apr 2024 15:14:32 +0100 Subject: [PATCH 001/160] create author profile --- _data/authors.yml | 4 ++++ jcwright/atom.xml | 4 ++++ jcwright/feed.xml | 4 ++++ jcwright/index.html | 5 +++++ jwright/index.html | 1 - 5 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 jcwright/atom.xml create mode 100644 jcwright/feed.xml create mode 100644 jcwright/index.html diff --git a/_data/authors.yml b/_data/authors.yml index eefdea3374..73b05a5364 100644 --- a/_data/authors.yml +++ b/_data/authors.yml @@ -54,6 +54,7 @@ active-authors: - jarnstein - jbeckles - jbickleywallace + - jcwright - jdunleavy - jgrant - jharris @@ -474,6 +475,9 @@ authors: picture: picture.jpg jcardy: name: "Jonathan Cardy" + jcwright: + name: "Jay Wright" + author-summary: "
I'm a developer at Scott Logic, based in Newcastle. My primary interest is in backend development, primarily in Java, and cloud technologies. I also have experience building web applications in React.
\n
Away from work I'm a keen petrol head and avid Formula One fan. I support McLaren, in case you were wondering.
" jdunkerley: author-summary: "I am a Technical Architect at Scott Logic, based in London. I have many years of using C# within financial services. My current interests are in data analytics and visualisation, particularly using Tableau and Alteryx. I also enjoying learning about new big data technologies and machine learning.
" name: "James Dunkerley" diff --git a/jcwright/atom.xml b/jcwright/atom.xml new file mode 100644 index 0000000000..f3035cd520 --- /dev/null +++ b/jcwright/atom.xml @@ -0,0 +1,4 @@ +--- +author: jcwright +layout: atom_feed +--- \ No newline at end of file diff --git a/jcwright/feed.xml b/jcwright/feed.xml new file mode 100644 index 0000000000..65518fd0b6 --- /dev/null +++ b/jcwright/feed.xml @@ -0,0 +1,4 @@ +--- +author: jcwright +layout: rss_feed +--- \ No newline at end of file diff --git a/jcwright/index.html b/jcwright/index.html new file mode 100644 index 0000000000..c08f767ed3 --- /dev/null +++ b/jcwright/index.html @@ -0,0 +1,5 @@ +--- +author: jcwright +title: Jay Wright +layout: default_author +--- diff --git a/jwright/index.html b/jwright/index.html index 34ac61824a..963cbe3050 100644 --- a/jwright/index.html +++ b/jwright/index.html @@ -3,4 +3,3 @@ author: jwright layout: default_author --- - From 95e7f321aa59a7a5aca2b9f4d53ad9b718d99478 Mon Sep 17 00:00:00 2001 From: Jay Wright <90924187+JayWright31@users.noreply.github.com> Date: Fri, 19 Apr 2024 16:30:26 +0100 Subject: [PATCH 002/160] add draft text --- ...-19-measuring-energy-usage-in-the-cloud.md | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 _posts/2024-04-19-measuring-energy-usage-in-the-cloud.md diff --git a/_posts/2024-04-19-measuring-energy-usage-in-the-cloud.md b/_posts/2024-04-19-measuring-energy-usage-in-the-cloud.md new file mode 100644 index 0000000000..8e851a667e --- /dev/null +++ b/_posts/2024-04-19-measuring-energy-usage-in-the-cloud.md @@ -0,0 +1,57 @@ +--- +title: Measuring energy consumption in the cloud +date: 2024-04-19 00:00:00 Z +categories: + - jcwright + - Sustainability +layout: default_post +summary: A look into one approach to measuring energy consumption of CPU benchmarks on AWS. +--- + +Measuring energy consumption in the cloud is deceptively hard. You would think that the cloud providers, with their God-like omniscience, would be able to rustle up a chart or two. Alas this data remains frustratingly absent from most cloud providers’ reporting tools. As the world becomes more aware of the impending climate crisis, businesses that wish to keep an eye on their energy (and by extension carbon) impact are left at the mercy of their cloud provider to give them some kind of idea of how they’re doing. Often all that’s available is a generic carbon footprint report that, if you’re lucky, is updated once a month. + +This blog post is one in a series of posts from an internal project undertaken here at Scott Logic. The aim of the project was to investigate the carbon footprint of mobile computation. A slight misnomer in that we’re also comparing mobile to the server. I won’t go into the actual results as that’s a topic for a different blog post. Instead I wanted to talk through the steps we took to solve the problem for our use case. + +### What we were trying to solve + +Before we could actually start building anything we needed to know what data we needed to capture or generate. I knew from the mobile apps the team had already built before I joined that we would be running some CPU benchmarks. Although the project has the words ‘carbon footprint’ in the name, the actual point of comparison between the three platforms (iOS, Androids, and the server) would be energy consumption. + +So we needed some sort of test harness that could be deployed to the cloud (provider TBD) from which we could run these CPU benchmarks, record how long they take to complete, and calculate the energy consumption. Easy enough, right? + +### Non Starters + +Our first idea was to make use of the built in carbon footprint reporting tools. We determined that Google Cloud Platform (GCP) would be the best provider here. Our theory was we would be able to take the carbon footprint number, given in kilograms of CO2 equivalent, and calculate it back into a figure for energy used. However, after reading the white paper and diving into the GCP console it became clear that this approach would not work at all. There were too many unknowns about exactly how Google was calculating the carbon footprint, particularly the embodied carbon they were including. Also the report is generated monthly and is an aggregate across the services so this approach was swiftly shelved. + +My background is primarily in AWS so while doing research into GCP I came across a blog post by Etsy on their Cloud Jewels. Truthfully, I think I found it by Googling something like “how to measure energy consumption on GCP”, a blatant shot in the dark hoping someone had already done the heavy lifting for me. The Cloud Jewel approach looked promising enough, although it still seemed a little too vague. For instance it assumes a figure of 2.1Wh per vCPU. Any vCPU, regardless of instance type. So that got moved to the back burner. It would be good enough if we couldn’t find anything else but we wanted to keep digging. + +Around the same time, our Principal Architect on the project pointed me in the direction of a post by Teads. They had created a carbon footprint estimator for AWS instances and helpfully had created a spreadsheet with energy figures for almost every instance. This was the data we needed. We would run the benchmarks, capture the CPU utilisation from CloudWatch, then use the Teads energy figures for the instance type we were using and the duration of the run to calculate energy. + +### Running Benchmarks + +Now armed with a rough idea of what to do it was time to start building. So that we could compare the server results to the mobile results we would need to implement the benchmarks in Java and Swift. I decided to start with Java as it’s a language I’m already familiar with. I decided to create a simple Java Spring Boot application that would act as the test runner. I created a REST controller from which we could select the benchmark to run, the complexity, and a number of iterations. That last part will become important when it comes to measuring the energy. + +The benchmarks used were: + +- Fannkuch +- Mandelbrot +- Spectral + +I was able to lift the benchmark code directly from the Android app repo. + +The test runner was Dockerised and ran on ECS using EC2. I started with the t2 instance family but the boosting ability meant that run durations weren’t consistent. I changed to an m4.large. This gave me 2 vCPU cores and 8GB of memory. The memory was somewhat irrelevant as utilisation never got higher than around 9.5%. The m4.large was fine until it came time to implement the WebAssembly versions of the benchmarks. For whatever reason the wasm binaries would refuse to run and exit with a 132 exit code. Changing to a more modern m6i.large instance fixed that. We were never able to get to the bottom of it. + +For Swift, rather than creating an entirely new test harness application, I was able to run it from the same Docker container as the Java benchmarks using another Spring REST controller and the Java ProcessBuilder API. + +It was much the same story for WebAssembly. I included a WASM interpreter along with the benchmark binaries and again used the ProcessBuilder to run the benchmarks. + +### Measuring Energy + +So what approach did we take? Because the Teads spreadsheet gave us energy figures for basically every instance, I figured I could write a simple method that would take the CPU utilisation data and estimate the energy consumption by comparing it to the Teads data. Better still, if I could integrate this into the test runner app all I would need to do is set the benchmarks away running and wait for the results. + +Fortunately, because our test harness is a Java Spring application, that gives us the ability to use the AWS SDK for Java to programmatically get CPU utilisation metrics from CloudWatch. This presented a slight problem. CloudWatch utilisation data is an average of CPU utilisation for the last minute. If the benchmark doesn’t run for long enough, the CPU utilisation percentage won’t be accurate. To combat this there are two options: increase the complexity of the benchmark, or run lots of benchmarks consecutively. We needed to keep the complexity values consistent across runs on all platforms so that just left running consecutive benchmarks. + +Having the energy calculation functionality built into the Java test harness was a big reason behind the decision to run the Swift and Wasm benchmarks from it. There are almost certainly better ways of doing it but we found this approach worked well for us. + +### Potential Future Steps + +As is the case with most research projects, the work is seldom finished. Our server experimentation only covers CPU benchmarks. The mobile work started looking at JavaScript, GPU benchmarks, and video encoding. Expanding the server testing to cover these areas is the logical next step in the project. Unfortunately we ran out of time to complete them as part of this project, but perhaps it’s something that we or another team could circle back to. From bfb9ce117d933e34da35a03cc549273847611ac6 Mon Sep 17 00:00:00 2001 From: Jay Wright <90924187+JayWright31@users.noreply.github.com> Date: Fri, 19 Apr 2024 16:34:44 +0100 Subject: [PATCH 003/160] add author to post --- _posts/2024-04-19-measuring-energy-usage-in-the-cloud.md | 1 + 1 file changed, 1 insertion(+) diff --git a/_posts/2024-04-19-measuring-energy-usage-in-the-cloud.md b/_posts/2024-04-19-measuring-energy-usage-in-the-cloud.md index 8e851a667e..fb3c1df4f8 100644 --- a/_posts/2024-04-19-measuring-energy-usage-in-the-cloud.md +++ b/_posts/2024-04-19-measuring-energy-usage-in-the-cloud.md @@ -4,6 +4,7 @@ date: 2024-04-19 00:00:00 Z categories: - jcwright - Sustainability +author: jcwright layout: default_post summary: A look into one approach to measuring energy consumption of CPU benchmarks on AWS. --- From e95c0ebb66e191462b0fa1f3131433770609cd03 Mon Sep 17 00:00:00 2001 From: Gurveer ArorawBULJZpSoi^V&Be|aCVg(S5l+l~Qdc-R0_X6o;lr3=W-#7+Q*jiT z8mI#AcB#q!e%JK>SK~oW3ox!lHD68xwT+OOFUu1;8&mTXU1Z$Z)FW?jA8%bh7I}OQ zHA}ekVsdEVhFq?)u6Q>RN$l!{toUXeN);E9jWs{HHEi3T%cQZUA&6R(uY;iZa>2Zw&Wu %^73(KH5U)`gu6r&9&l_A}1U+ zm>v%`#WEp~fVV 78l1TVpixp!gvDY zeTGE7OVj$P>)fcd-^^*o94QeuBU-&(rOf_~sET`+p&U#qf|^h1=H?%z!lC3pLfOWH zU$DT50^O`X&N{)M`s<7BKV868=KMQ*Z&9w?HQLRW^&sa(GK=|5mOWPnkB`ncT9s!; z4~)m9uIY=BZxhC7CA>dbNxIxWavp3ybgDQ!N8~jYevB*QAR`SZ>EUg%fDj)C4VE;{ z%Vp-w*6-uRWn$bk4f&}FHX}qfvI?zT0SurFn~qMpihb?mi?gN>&oK~?lD{MFtu@$H z3Q@r&M_Y<5a~Ik1nBmC2g5o0ogqGI+3D4sAtUfT@-rN|j&_F|UK*zoPyzq<~8n~z^ z;r183_9N#6aQ0l& S5mI500AqpU)ds#EI1s z)rll6Oio`2mAj(iDx`(!#;caGu~LX!3U&o^iyht$gidCq`rV91Y^s(G_sA-C41JSr zwjWeV4oOdb3feupN02t_-^>M&k!v9XMfJ6X^>6@%T>0bL2)K(qMAvXLgJj$D3tII5 zp$cZSR9ut0hPCTKA+jHV`}FG%hHjwGJkK|&Y%;%NhS&e(xv!1CJ)_Z@sFVP1Lg3dO zo%;>$YTeL^OS=6m@}3({3 PuutO98;A|;Z8{!3Yd zGP38xDJryOnI->~(6uYs=81~Eti+HeRb~UbYkMlH36d)`v8aKw)tD1!Mum59TtIYM zuoJf?kgy7eP5NEO$-8gKQ@r=F=++DjCJj!{+5W8aa&mRvcdiO~x(Yh@Ok4SV$iVoC zbmTs^%%lUi29&~q!OQxf*8Kh)u-VTU;K=q9_N_ORSkvRJZO&t5CGhwj5k6#zJ;hEu zO4UQ?DevL%7y^z;V~S@OBRQH8I5ROC?gqG;M92vg4dzYqeCDnG@GWfDYm3g@Rdpw7 zFRW?V!)U*jb5i1xx=~`oa%WSMkn)*Y+s;}-%=a^5_UN$oudvQZs-(awZtWQ2Dr(2} z(U?hF?5`)O0n_|j1ug&7pkT~9(REpv^g+P)UdN)8pbJ5b`6@GN2Y3ZZolK zP9&E(b{n21;lXZtEX-jX=qYY4DxS$tL#sd;J*V1@ zXi2$(qSHR+85_s)Jf#>#8*H0i3 6a` zl_o{X=EDa^-qRLsA0jVY_>XRDC}5=*`#!x>3F9z5t@x`>M0@C6vr7+bQpiFa+CWq{ zLrUkO`Yft6HLNraZP8zLu_uM^Uc*wb!PN@7i86&5l2ZUiODs^-ok0Z+_k|izzr!iI z;|qkh4BQ{yW1)c)4rL3D0GM)@x@itrxFa$wYj_z>5ncT&vE0-Bkb&Cwlj+F;kr>}5 zg-mG#l(cO9_-AZH&}K%@7B86fuv6n-qW^&?-x7G=Y^TNY w9Q20*ds{efF z7d^X2Im+|{n{#9pmo4Vr&JV|xLL{AyM5`J4W$9JG0^-EhOu2@q0eL{`n){lB&c@c$ zSFU@9q^^jID4K|A_`gPpISjM 5rclt_GFzk7iR+jWx!E(A9!Q&%zi<%2lIv{e*Hg`9D0QX5{q;D_%;^$W z+Q~L7n|i)$;mpqXb%V=OkQY|O?oSN)pjU=6Htc7LseWD qyKg&OOS9bw8bz%PpkXfti z)=9iEy@#`MYy0@<*2psf*OO=B!G_L?x4}-DInoDl?^(-Rk6}rJeWT-2jOjV@p1HDn z61K_yw2B3{U>l0t1aTDTQ2NK4c$r6a>kS(>&d8PSRh+3U0Mg=lPt1%|v1l3&J!#kQ ziSI3@FBP!2BL;rNPLhb>UVZH_wsVN%QaD$Z=ZJ|AV|wF~{Cv*LMpmw?9>xGlkMZl| z{+3KDMtR)D`9k`qnTg_j_=a!1{gs`ahR^Unpv y9z!KiCc6 z*ekoqQScJ^=ksTLE4FEoSptKt%G&0SUAC#N%~#b{-era_Z<{YpmYZC&(PQ{1W<}VI zFfH_)06jB!X!MmLUntF@vr~@~$~Min*DCEl>PjX$ ;UOtnho*#BQa|FYkMq)JC5gn><^K z(2FE469GSRX54E&ra3+TXY*Y37nRvq`4ATH4zfBuJ37lveWWOmof6=~k@b;wB5%QG zTLp)((pvQ}Ye3Djh5;Y(p9aHn VlE~<|?uCU MTCi*}o;2NP~g_T~y*=Dmc6vMN;K zihN1R5xhy^ka kA?w6su %#fSSf3Ub?lKgs(9 zNth6o-hAodPBd-U%O|lyJRYLAWl!(>=*EPUjw}tbIunR1r&uVoX0KqtR3)j-lp RW5}rh!$b(^=NTN89JpCZVr0tV7CYE?S#(;`Fl}A=!6^v@Det^^!{hbTqC#FB mus%*MJJaB7M90G0&7pAG`uH1J5tee#hgu@+YoCklgkt1 z4?FpA$eH(kOcKP3a4La#)NwDd^?mcLEOl>s{>FWJt2^_K3rm)N$Rl{x4pS4q%GNLE zoXA_*IGifR3Yjt;*ALRTT_wvdU?PyXd%6{KM(7anB%=;6Q$*JgF{##smSriXRJE#d z3r9+G*ehKRC#-(Z*>05gY}@o|nM%+jHGYAUZ>KoyTGsPE(fer$G2b|8+yvydp0n_U z%|~q6?Zxhy%N1&6ByxwR!(!~#tNP9PIHD9WvgX_z_Z(-YQ`q=oz5xr(#6cpTNg!tP zAdC%voAX&f0woGD-NcFGmlIe=Xhn2O!O)j~Jj8D&7oI6@YsyG8dYRNVvKl>8S~ewS z6f<+K%am82KR)<$Yf2ht7%48o=p$3pTC*M3VD$;%aV2f<(Ft?48WD=vT5Ik+8@yd@ zU}uLbNa+ku&O6>@mMbt18Gj9C6Tak)G<&qP-6M EYlR{sMl%p*Pk56x z(5MM#Cc?ufs9oNhqGI{uj?Q4A->RHSb@*e>!>}TnUK#^nte~d{r+q+DTb5g^teV83 zOJYzCT2biYM^&fgzS62kKrQR{(zt)06mTl5UR*9^0sck9Uu^l0n+7Sko|?SK9lmQ2 zfzk4$^J1rgO?=WGl?h?ZNaVkJy1o{Ab=xd!;5E~5;$l*A{@PnRjzS2W>20PwB |!*;4|V53vW6D8B$DD=!aGjk__-5r>E;=+CM#$ubEewq8ljnWypyN0 z)MWVQb>TDZHB3fmn>TxJ+KqoZ6@CyY7rLoAd~q)MVm?bV?G;+s#eoAP6Rx|OD-mee z*K-bU*WcE7?qdA(w2T%exl{SZVPh#CL1}XA`;Rr*_mRpx`$htZTD?3`(zy8bBGs9d zb`<@l1C}~SM)Fu~0T%l90hh}|6=tN^)yyPCZB=I!{qU3+XCUms7`&0$xG&E?Sd`)# z*Pg1` nx&03)fLuD6!dER{`p)J@r-Ht-2MAA*Yskuk`LGtQHLXn^tk=rL{y2n;F9lnUx zun$78rZrf!8<@x^mc8He8)!C zE!Lu*xiwr?1n2A{dY?AAsco4qfq1&;eHhn7o&eUH0g~`d!x7DWLHGWp7cQTls ZaSMOoO@-cC8KTS&xw&M_G!{+V^zOp?H+oX{TW;^%jpqauld-3yfP9qYOr6 zTovG8@AEp1NnC@N)6tb~ky#Yu)V^1$mut$}af|rWf%@ZO$ZPPcZzs9N@{dQCGq+aV z(UhsaqN0?{6WK~1ffmV^R?31}E5c>uz%0#=Qgu^hJXq}mHrlfm>w7MgCj&SG&?R`F z=Tt Gz>WJWE#&p;CJvppvrg&5fTqX2TW3$tthg@7kdlZ? z48!R#TD!fu=B#6~2RODOvrWlS9sKn{`(R{f`zXJrY;Gv^eHy(yvnZa0C9^-2rx*lm z?pf-Ch9{2aBl6Th*62GZ`cYXtTDI_b39$AlS-Bl?iEEE9&AZFPmS+uiSJEx)LehEe z?T3_b?C-A9Zgy{vZQA#Od2wTRlL>@q7785pmSQ~G;K-r$hHy9ij2y;s=mP19CX;;4 z#yP#!q^z;P1ADT*> -=>8QlMbH2c9do9 zw%O|m7%hzOTtCPye60iLxv3E%xW_rfl%u!Np4r*I89+X?v)goxS2O4UA*e=x5LChv zy642g{F&60Q&Q^bflxZzH5r+FtOpX{XUph5&I7abRnq2341IBO%5?ga3rLF#38S@d zUfu& d9xp!FC(ykM|f%du@=m5Th-NN88jzPAhCn}r*Cm~ba^ZlC+7pN)V zjkcsIK6L0+ YV3EtpyBMRtjE}u6V*}&RRAy3ZN__gYSK@A1S-)a2_oD;`Vh$ z#5jAaWqJF1{@osm*o^+T11U#=2lR{ Ail8-m3YEn~XIC4H~(T)qBcaMJf9T<|Q z36Am63u-(VdxQZ}UEBS#@uI=MWothalQe&<$aV*3MoZf{FTwSRBa93*jrSZy#$kyl ztGDY-!=oXiT8>rpt^J#)>{KWnL@S6-%d^QP=%rq`xjI^;B6%*+I+Y4@#`#o5GG9EC z2#wwRT@RzB5A>IoDw )_@Zc!K z8)e;*FS 1dk|BKB4NWDDwG55~zHgnE#U@b=|+6O3{H${Hl&cna7HE9Go7Pur1Ya#x95AJ({M zR1@6RY3#=vqUJUpLf_XWvaXouGCDbz`ElspsB9XgkY$VZSxK?? BiP1epZ+Ftsk!1&9yAy{xqZUBT7AuF1GGenh0EE~euh-=(c2^&p5MqEYuxxv@{f z+3q?8zBalJF(W|-vq!fjas2Pu4Z#nG5Z>2a W}^3@t46Y$q^-6eF`COM{Eqo{2G>ZrNd7tzC{IciGtEOQ1&AI?=8c`F z3WVAhCvky>ne)^ul@E^7wAR)U D`# z5P$1LWB5xqcc_;ihmpKcwwoEo5bNFi)l(C#k*{o)z@og5XEDs%vg^+Z$&xP-xJ lqU`D6xACNVy4j#)#u3Nm8nMtLKQQ<$AMl(s5^ zIq)|c!oboR5rln8rFQ-0^*^LQ7ak(sXnza5khiD1F|&S?UuRW$As4o~H8(uXy%yL@ z{o0}vyzY`vwOq-jwQMcQf=HgvtKq??$URffXQbD4X?z#Ei0`+0Lxo*mh;&+A;wshQ z>n~S~=4P{=Tql1?oEybes_~7!q2DUM6=@?0nkHvH0ViHK>On3Jd12ECeg0b(F#IuZ zaNxFkXoT0sho~Bsp>u=a-lyvm*c%t01rHYVVa5jMJ`7O1WzY5(3=+9mDPlA}?(xld zLUYPu4{Lw@;pjW=advoIp#qNjR+a_wj%%3E<7^m|wp7k_Uu>(~HS+9|B6w+IvQ54C zJ%sFhbY;Sp5N{~Ww0F%}@VCQAHgSjRq~efoh7THuCK^`@cowuQK#~tNVm2NQK~|NC z&n(j3_V2tt*;k09|KOW*epX33H!$XUU(pO=4!`2FHs8lO#Rtl>El}>S)D>BCTcxQf z4>+u8sjQbRR{XL3B=O- Q=iBe^9+` zqCx2h_FK!n;5T1AF6KbY^%*?bUoy|(S81VHc8kI}UMZtJv2ecZ*7yO<31#g}Uz_&Z z$s^6J<%PMItK~NF?jec95FghLn!=pl_Jwpl>}7zE8QFXEx>XX$t%~_`_he$cn9Nf3 zDznDdrroO9 d3FtBuXSu!JC4Bq&-Oz*%8mj93*CoIX+iq<{vA0#a!}LtPXaTK+pescMT- z#ErUnWH?)V^7$VyNT))nBG!$X18&x<4}lVYfi$)9CF7f+npe=n0ks*wxBYU*(vgOU z3@`UA#{P~>$_>fhYJeIW8p6<95k3G=rvU_8+w89*)pWlHCF$h+h*V&AfU<$i)FHY7^ zY;?Pimv#EWa8ER|drQ@fexwU z@!2M*yH!;1OxAv6X z8k7my@zWUkdb(jE5%v?sLa583RoDG&q)mN*-CSR811^P>^6wEyO`wl9J=%T@rSrrp zV+8ctwsCS}OT?e=KChA_#2>%1$+wkwLFgv{2Is?1Dv!`;8GwelU7{n`y3b< 8F7kiw(2aPn -gZOyRD6F@%>+J0@Uz^fP#_QM@eLv&bG>2?nM@w1PJoR0gTv#n?_WOAM)G#zX z_~X|O`-uwIh7&sjFARfEUd|Z2(#hU ?Kj%JAgEb;Zks79WT2TLC{zO ztw-ng{e)9G!q*rwH{vvm;#TurOyJiH*eubO(*Xh`;-Tz;er j=D$!577I)y84?j z7z~$^OV$$o0=S1~>dQmrB4w4RpTKCQPAOyiUD?G?0RyX(%$E0EQWEGic+BNQxqPYa z*)y04HCBcCqIo+{xNnHe20Q{l 4W{Wsh5OalI;lHpI_Wy&p=X^si}k|GmkY0% zJeP>M*uA&<^5rQ)zpWQ%7KtWhm-JP%VwmoT%};~!(P#FG?=-oRK#6h&Odf(u38A8B zhj51ohe(I03d?nG^pX8U)6MGP_It;-lPLEqsqUvqu<)w%Rf3)Zs{lZ`K3+m28r~^- z|Acf3PsXi@7hi1-T&kaC7-HsA+k`jZLOKt09{N{rW1*pLL&a_3iXKA?S~`A!8-u>F z@w%pgWQ^GcairH*FN=i81l4J$(NyhXCj7Tr|Acr9UF@0dt8l$Rm^Ogd;R2A~ Xt$lO0ZRkuJrLZkYW~lP1|_&m-B)S%@3V4n%&4=YJgU0#9;&&&Z =(2GKYoWyJ5#wOOKVJ8)f&cv^G(w&q~&el zjShDm!W?uyN 9M>E_?>C(<3@KOwNsjRcr&w=Ju-d>Oja#=Y9Ic#|X(=^4%Y(H6Rd8;t3} z4H6+6%S#@?)kM!B^7W|!gw*HTrS1AZen5VKhYGmt2=X)xE L SrcWs?-{o3|md6>A+yoMa^ELI&6%7 zB5CEQwf+9pm0(D0=hVp8aj~)E(#hUC2SHWg=_0r?EI@o&Nwpy5bj#)KhKZNn_$yd) z6OPz!)P6N!xRF7f#?E5K<`;1|x`=crWtaH%Q#miUSd4Wy;^C*mtzJsZszd3IAeSk< zv^1#D!`)9$2#cQ$(-wC)MoUxpd;k75S#=e!o;L*uuys>AQwv&84U*{6R&~1&$WKu% zCAH^FJWtFfKiK`ccb7a=l)1#@>DXAWAtbewAZWb4Bt>Cx(O_e Msn3TK?yng@O3sa_RYzocdhuqIqYwyx3blMGn p?kKadJ#K7L zUC1exLpXlvBCW@~`U~>vXx5F(7?YH@f>-0bkz~0U$6*AmIK8BN_%&02h+8N0IeNYE z-8CC7iCWr{l9C|lV;O0(-RgY$w?AD11x?#_WXb0 z-ew>rN-ch!W_W?Zu;MF6Ey2{aPZ`Y`n?TAQ>*B^KyUPQd{$(PyY@ZC4fW5{R&&e1> zcb@RAd<~uZSipl~Y(unK!IEDUaP`qdzLLA)i0wk9BhQpxhof=!$WFOz$G>5?a6jnN z=q+(YQ&U -;>Zps%r)p(ph$yX=+Cv?XL z`T)nD?T2SRoqwytW1^>b{GHat-PLRG*Ep;FopcKl%a#4q2A%BB<2aUULPt>{mRAm4 z$FvBP*?;%F{IX?G8W-DP^U)>Uf|ye)7qPo)4lk`xJ35}g;v>WjT%ESFqfMN3M>lrr z={YPJm986UFBJ56Uyt-g(+u!H^z@o_v++`1V&;mLu(;T{=|OnObrrtv9yaZXKYG~w kWN7pM@`nRuW}oV6SKYT(hnLR)OVtAg=S}q9=s?5&13XEPN&o-= literal 0 HcmV?d00001 diff --git a/garora/assets/2024-04-23/random_labels.mp4 b/garora/assets/2024-04-23/random_labels.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..52ffbe5cf97768450d1d328fe959238a9e9a137a GIT binary patch literal 42343 zcmbrmc_38n8#k_!$WDc17b^RfvTq?-in5#R`<@I9BU#3tC2QzOQ4xuXY+;bbQWTY~ z86hcVNCsohd(VjH`S!kl{eCK)Idf*tec#vi`CQj^9~v4OLH8@+fnFg2el#?@X(<1L zfAUUOUF7@%73FAXXz1O8-P~wsl5_lAovuvmra1@RQ NvppvVz zvXhfCc*9T{Tp(j&u5TcvD5!l&7hLJ;<^tZ(4G0YPb#uQWC@(9kASEv=F9%L~Ubzx@ zT1F-;EKK^Um#bTVuam!YK(L1l i%xE%b31-q)tNy~yu zz%M~RFSwg4jPhNSPr!nm{5{;%<&*_oJc9%LoM7Oia)MWa-F$t$LckR&a1~dVE8xH- z$PfH>b#ro!2=I4PmzR^2lM{4z3b_Ic4Ds;_1RwhI1wnzZ0C)EgH_C^ucm{(Hgs3YE z`UV8}IC+8>u T0@$z%JLK%ja{}s1jUng)8IPdHm8tfDf za|!SZbfOLjtj(2RCog~S72v{PC(1SM!A^c|lyQf-d3ktV2?R$zZsFiqp}wH5RQVBUdLQSB4K;?Ec7dE LsT z-DLZiFWre1cE!x27anP!>Q-6#fLx++y``K`uP1e{ftz)Wdw2w28@*30Y|KzmaHF1` zAX>SH_k6FMje(->eUo!cjOBv+2Y#R$oy}iIUS@6xt$7Qd(KtCbdZqp2?s5iiX=Y2Q zXK3p@#H3+K@vgL7_UwYF)Yu!Y+44HB q4OX)ltHCI)k$)NC59Ym6j8K7g9Rt_W0W){!%Fc=(w)vw4u88 zCI(3g#B`m@;bAquIu`)FS9U8Od&J-R=Y8FCFQ9x5>z>RG!InMg;^ni@178f^FTRzl z +-0fbL*RYxtenW4<~Crg={Jg zRDTZn_M?GZv;i*qC5pYMun_C(yxHREW@cwxb?C|)=l6UhD^{uWjrC)PHWpimvrG?* zdF&iKdmyIARmJP`X(4AH55UwkXcui4Ct*DD!P2TM@{@!t=_i<}CsR^ndDkZx@QQMB zo~ecMs@ti{4&spquP7&{#Eh9*dE}|rf{%!u>p#^lQ;Gkz;O!qQ{Cc0CJAYB1dg#cJ zrFJ!C 5%M=;PdcRlN~L8(UkxIal_+23uPKYc_BzH#5^%A$;;GD=~S# z0sm1qG*>q1*L2nP%CFzQiQuL3uhFRA;QjI; sChWCBLwSpPuza z{`^@I_G{fqiAE|Tx7232odr*PQN!?nB_RB3s@@d(&A!kzWz_rRDjDM>buB~eVCi0L z?Z)NTT jG8>Dn0-LSmO?+~6Z~lO- zZ1A3+R^R=-y})%-x4j Z6fXkaP~DoO+mdxPVJ&r6~gXaQIMxhFs|xx$pZQ*^#8k`p@@9 zzIw4X_5M&pz|tdKg|TH=`y*Y#JY?x<>$!UDu;R&d^NSZIr!{e-yIZhk5aZ>ewqKMt z!dtxEr6*PEJl~GZ*=Wo>Gr0;Z7`Qa*kL`Tb%l}`0Uu|K%ZNx`&Q@cRuj#;dl5Q@Mr zf`+HF $KAi9v-}J(=lKy)xw2x?)yV z!gF20qW| a4(z&Bu}GdMi15O-&X$#sh3%ycFt>%O-+0aC4J;;? zvA1(;8yZDECu%!HYO>YGp{0coLJ|&LHZCF_WHZcAr8rPMa`CCj qto3TE9S3Iu@k%ZP_0+^&`Z;<8l$w {>jx6F$J99;+?KOkA0Cg2?zMTo%Qzob@X@zY0gBgzy#Y#BfS1JqqX=D zW+^BDtvUY_9%QPAEFvLW*YA^$oUfQJB0|R(A AlhBnUMLnnB?a+i)e_A>u*G&|`pI;p%1{+cIkzKK^fQcd46!ISYGPUY#>B9F zO6@*H%WEXENC}e@MeVvb9xb-RgK{8&X@`~cRm%5~D_S()G-4_5PHlb&8x}#I<%GZf zghlf3Y7WdINTzIsoO?w7SKVpuY8OPGrF|zrF~c1h$WY7?tEN| RP;7_DgP4AOWIl*mC~&(pD|-kM>${4lu@g3wVM|8Gq^tzB@(mc@z50GqNk z)?g=wh*gZFht1)3ezw-g-%N1$iDuKEOU4I2J&}jM8m(bvF1o6DBb~Wq 4%g4uh5Jj C_p$VdAGm{xvjY7I%O~ ?fL)q=P#sEy}UPW^qC(X76`L>CmA4W&GEa zgXmtWt_65ibM<9gxHvW-4urT^mi4yCJXn2k9-eWn?%MHm89r8{#^Ov};Sj?gwOE?l zdA%4Gdy1JcX7{8JatE+`&boF*aVvT)li5iAY`OG@Zd|CrCv3U0sLO@%#}bhE&4vl6 zA1DS=Q-dvq;bp?lS%(lZ0A+%4EyuNYHNg)=*$eHl{7dR@v @&FNYn8GS>*;nL6cp9;;L}E$^b)kW$qMMl?$(jxtsD$4pO8%a 0EIr%RQ;=$WGs7arkT3 zH?saTn)Xrs$I
v(J2ucWNa~C=B$3 z@7a}$D$OtSno{#fnfaM1qUOOhz#B>w!5nVD8+@=3UeX=(UkegUlNW3GO3XBETE9P? z(iLR2m-CC~wU6X*3~sTj-l1o$I(g!s@>U#nwWR0{aaA+0-AbmUz*4S_IhP$La0%R+ zYEA5Ui9xipNr)|FjXKFLO^rvf_zlU|DuXi-(;yx!BkU$A^O;3+3|Sw(^S^T1m7!fo z - z?On0^xmhX^=bj1sEQOfA$8s#`IDWrt!rcQGYcn|UYJilnL2{YrYBMWPX5mI!mN&t8 zPMp?1pP*0o rWrKh?cJ^ivwgBSkmHUw&sbmYUppW&v@ZeK#(sld0 zj$#}&;i~6#d}r%#&G`pt9+bE&`>U|-Jp1((Kg}QYS{(Sq>LvY&Kl-veWHwe!@M+3_ zqdj@4L&6Um*MvtN(SFFQS^cB-Uu7zZnH%Ki?i;_{FfEgnJUt*SSODP*$6j?ma8Mht z@0yswGU!P%oBywXXdY@83VH*jGeGUQEWQ <;2bTl>z#NdD`=DK@1$2r6hS;_>m2Z6}*S)8~)5=9W 8t@f_aRMXt6h9Oyj9Eh`Xy($mtKMRV*KwB-W?r_6HY03rb1;l{uc5dcQjavo0W z0sCf4mYaXcWn8=PvNyAU%wN-7akWl6xwYaRz Wi=RWcMxieO+t~)lD=028X|0($qhRQQ92Owrmsnz7QYW~SDrD IPJiR6 z=l!zd^TxCbqqo!#gkJVLR0T*QnMp#eJX7i+mVPf {B(2FFu}=;p%HvnnGl(wk+6d6=W!pTul&XL~vXH*W%PBsIw$n z_Y7#in*U3rUD}0rY?(s>qILoTP+&3}K91PmU_2sIWkID76tOBi iQ5vbq+dr*&9O*OAl=I* (>QcPP@npnWhT};KO!bYiw=b-3WehYin&R zJ)fA2J=8Laq^G}^)dG`o>^J={$WiEun4fg4YS!+gDS|p`%#Se4ioJ4V^ANBTKtjKp z)tK=+5_+LsAm}ZCYA=Dj9+%w(VF~yJN@QxJNR~40lEPw+tr=W0YZDi@F;0{WkUkc} z2%96CS-88Ox_0Z}l-wS*hO?_Dcw2F5p{2I(2)iGOE-Y4wblWOD7GM*>-1dXV1fv_! z4Ab3V7}P)?3V@!iJ1rv?0hC!@#)+J6@@P-m9Y*?`Cu(LP=O5nq#Z&wtw80{=cl^0$ z3eR4#;~j*s!)zCj hX^K*w}oUNy|1JxY)tsz96uh@!=EahhM8l* zkc1hclwaN&Ws$&~QNXBnU4tI{c)rM&^BjgpS>3zVAtM@bTz`^eI3Vg>x!WfDVs3A9 z$GD`rvky<~zB$#N^hP``U8%EX;(bsU)Ld3Ow;IP)99yog3Dk3bx~8fcurdhS$?8@= zU}6DX8YLfajNrKa3yM1+k8yt7beLodkpz#w3bJ3jd;v?prBEx;C@Oi}ld>btCP2M` zGzr|PN46!2h5>)_9kQybc5n>f`LL~tW%EO!h(#_GZA$<@zF6ROlVSRejc#X>VVZ?@ zS9O;&LHP8U>JAgzGu4UgguKQ8CKb#XiaDWNF;EM)`T6Om^=~A3dXuJPpvlk+Yj9wq zGX$(s3YuZ{S~c3s#LFQ{P+znz(-=*E|6V4H9mglyB4}VFC0c*|u<5su*j>5oB&zJm z!Z3 K@)3uhYe{^HlG P2J&-X6$^EI-#x=f>T zBSmOr2p=;tM_@!*S!zYnfI+PZ0c!u9CGtr0WQEkOSS5l=W+l2*@Yp}AwIDD^4DJ N ={D*<$-#JnC@nbZ-<0NRq%0>5y zddhl@_>D*3n(CuX7G}?1dvnCHz{k59Y8gf7^lkY`R62;+#M^ovDG*m9-E2Zjm6eqs z;$P_8PNA3rvCLD6h(Fmxem1lw(CH}08nb_OS#BbLXZB0x?N3kbg-^59C?gEA*wo n83sQVGa~G&NbhBBMrTOwNL%o`ZPOb zRx87Io2UxC=^yFsSjCvgr?5ZVOR7}3D4ZbjYnUU NhKK|f)Izx3i+IahpP=S2JT2vSa8fzp71QN|lxn1F> zYxey5Yn=HMo`o2n*x|qgfmj&|@{qAA85p@w5WWWDG1ZM|0w{Q4CD>kAOiiqQFRy&J zs|CIoaM8BBo3cFcdb+30jT)s{g~V26cZh2!ppY@vMB;LPCb(V+iH&Wti!I0fGk4PS zg8v|Wnr!In!lzUUvAvu!)KtsqSs2JDi~PsU0bccz!mHrA5as6=Lh;xQghxv?=f7IP z^C1rgl6`Y~PUW6RY3Uw07BMZuNe}C)H}R$4bNm=FRj)uH( hdKgyU^NgrAveH z+5JLE1joFZO8+@CbZ?TpI6lyap_2G7O+EQ1ZzZgNoA@1uLYp2i->nLf{ok5jxEPii zmZVAESHI(M8!1%h&+@K*ozFI?diY-Ft+t1;ANl34mWJc$2miCwZD-2VN1x|aJwN&- zU1Y>75S4fB{zFc?cACKw`lM(crO8Ty&!G5Kcl5JY$KZMAIj#M}S%!M%FNi%u2en>w zDdrcsF;;*2tED4p4X5&GUqfJMPsmwrIjll%Vn@PP>_bjlJ$;2`?UO?`$@>(kER9-Q zpb)iI052)&IFNUs2R!R|B7*k7U+e1+n9R=l=2pS%%OJ<(ZT(dPTI1jdrle4DqT(NZ z&Y3rFxaA3QUy=Nr_9J2d(;uHAbC5!41r~hB!bU99_=W1KC&uVEnXVQu<;7~3&zAlR z$3R&9B64SE2|oeGv9pAW6_ZklKl;WKJ*j4+z7i~sF454WLMo!kK$h>i`X&qnn#4e# zg^~H+e(4YyAgp>VXt>_Q1C7E>9T3fV2+!jz7#cteDeMz3t~c>PH91?p8$lZgd(LSW zA8kL#sPS#0MVKxsuPSjSWk1Br;KWvJ>(0deIv*3e_d@d|HNe(885)?VD=vGkl0MHI zfRP7M(28S#W1V$tt~r)>9=UeB oU~2NWX1#0HOg!096(9Tjo!ciU>#)hBG> z@I0-j1q)34Y^T&-^tfLeVW+Fp>YiJ-d1y$~au>b()Y-0afuwThbdeMkk6yl&@3ks2 zWP|a8_RCQE2i_>kyX}`?U9f|!UEfuL40pD~KcM20dGEfv?UcwTog`=2+65M#@C!Og zhuvE7{_>V*--HO)V`6E05>*?QuzRUks5xS{*pA$SDO|*UbP`3i$W3C+kpQaYT@prk zq|CnqvkDEGhtZxAd4EZitv6BTl&rQ%IP%5fd9?wwNwF`c%e5EI&$>K& am z!32}$i$bbG(bA!X>^xJNBP~^t_EnUSC-mk2TF?SP+wBDf`1{R?Ey(7Pvcw1SgDKyC z2^ncy>(yi^{S!4J! T1nJ)Uhmwd-t4kF3mQwI7ymlA z-~q(MHg2;@S&CyQMlJbhlE?}%iF6Ntjt0%&E_|Gc(^eFW#Mq0~c~%CRUuEQQ6gPse z_r=b6zYsG %8?%2}2i}kN1 zenP?e+e`d)F+J5f-67)7GMgQpjG_+k+oH^+T>8XH*_db1s~@~({Z|$6P7kuq$h)7; z{RWa~T6rT3)hUUUM7 {-zO#63Roef$;Sv{l5orEyjPPYJP%E<@m0J*-=X1c zu|M+%YQ!F;;Gs?D+-fboKbQ!F@CN|Y1HIS`rWo4l%={457Cow(w_-~Pr6@<%9JjiF zBkX_O&+y=W+jm})3mSz-<^?S#vIEw5?bX042cVjSXBQs-N^a#4!RFSb2hM;xaIwvV z!sO;TFUhV 9m^R6vn6OCt!}SvGEo_f>k*YcH z0f%ezA4cv7U;b 2sy *Z z#AncO%r_bIMZE%3_oIvH43+L|0{0_K7a$Iivk$FUB$PgvotjXDR!)`G7M!YLvn_Mc zL`xsA@tQ7&(5PI=sZ(|-L)hKpOIRkVovuw%gC);M4P#_Pm&~1Q_X8vXtO9uQIAq19 zJ=B-|zC)uS5(p;>ppNy{59I2VD=iAuXMmJ&W+ei^Cp!6rH+c-;PQis9`^m8L8*pUk zo8+7HnT0 I-Pw3Z9JtW z82V3g(r)3uB=ZE|>mAAb2cS?6msj#-_V;FSmiqB~nj%{A(n!K0d!YL4Rjyb)?M<2u zY@B7i0QtS7O5Ir2o0~nFD{@&pP^_LyqzCUydyo}_?R3^898}$*hQqmJ&hN*1J9im( zehm86YIGDcXxukw6g(%ITX-+yNi;bN5X66yPGg91m#JA-d~~W~(h@+qAp5vWX>0so z <$OYC;I+D4v1jVQvMq zOW0X~n6!OR!fGiUJVDJYhJ&!ED=o c$ylcm7b7v_qz9^*fBZ}cqm2*cpHV$~7J` zLai%r*1UDB(|H!NawO4PV5hd3&jZK`Gg3~3fexw-m(52%CutEIZyf85(QVSXN$(RM zw+E7L&$bKSiA=2I`&L*N#N^9tjN-f?_Hs`eJ^$OT`ere=llm~OjtB>#o)gO }+V7Bl(j?bb)wZ3D^G{A_XKpY4i|)nw5N}<8ty9b #vVRs4jMV0^xWX5HYHL!JT9YodS7;k8x!`=k}Fft zNqMqv`mFjLpSh@9@vumwg>V%Ifk$E$Dd5LEIF#z=m8C$^Z^;QKUA_Aj_A)|`+))3z z0E6j}b5g+3hDDtglHX3iMFmisN}>>YwC{H&Q1f4!FkjI#QnqFETlSxa>bGS%ElSAK zf6sXR%K@UErMn1y$%W;@?w?s &-Aa$FtmUP7|DVdQ-waEck+f&a>RIxCsS! zF{0R*iA~@iZVRUn-CU|#l?;G}C~3Cnf Uc=V-Weut5x7IY{dS6$9d~q%svXN@AxC@tm2V92 zt)cAe4}|2!J#>_ICwrZ~SW3#DqUO}n@po!@mQrApqKle8tqJW90&qQL z6*`DH9ZW~@IjZkYUior#vKm2p!Hhw7JlsFR&}SXLjuW;K!Yh%htblKl3)j(kk=QRWkD98|6qySp1rokdLR|=A6gcgeQxlObXYrecGw>X~O zeqALGx;yqG9x`R|9#s;DP=%DVz *ez@ z7ik4zdj3Bq!Ps5D_ZVGQ7Y~c#w(ubSsP{hlqu<>GvtNdEOUb9|?462uE;7%!+NtA8 z9DUiy u_}owC~UR~#a(AYr}Uw8cSU&VINygM(;`O$pW+vPH%$T1#xQFfDfE>EbOA4@YGfAzSh>qym)%n zCZewC9H^Ufp=D?%Io%uJ@=r12mePnWWAx~wjyQIuns<3xQ5hdkp%ZgMW?7CILW%i& z3#IA#Yp4BMvHB3DRHbrWH{}IUuHiet^QB=ONxT?ju1hnhXN{QQ??MAQ7U`>T2S5|h zqs8>4Dl*%Z%rMY!H9u)xQ3 <%@V>j?Cq;-)8 !z##bGBZ!W*`7~6nHonc!FxIXz1PP%x-`ji2P zC(4gIo=$z{Rv=hDHf7_+gUk_~YqxEW)XUvbS0Q?Mv~jN?x|Tyuq8lYHCp4TU$g#>H zCy7omN>M453V!>3x_r&z=L^Dam3f1-Iw?=wz7hYaTkbX@F4M%8waL@7c4!&nSW(cG zyPtbU6y;RX@vkzatr1Ijrd0AH)7(|IYITI`CsW2pm`jN5$l32b*P2cqAzzLuwY4>h zTB|X}$V+?_agn3Ry&pMF7P;e8CUaqUPr?DWQc5E{Xq4ZKEUORF8o>B4HBlNMp~X>> zL6`HqGrm1LjVI8!qf#CV;o6hv!lWwYsqOR-iqinpqt1jC{^=kC_598q)7}~OdrB@J zuKV?~55-53$$;wG1N5cLW<_C0+d+_8vW{^$$6eyWE=T_zCqv(wtijISAtjnB&Fyx- z9TW<4<86%&+Y5_eb8<57cO)reC Q6ClW^d7f!_<0=b+%BaRT&FqEAq& zoym*zEcddS`?;Bcg?F~rE&;3<=d_n<=!}#9x24xoS;>}Y=qLNvMo!P#&lkB LjP7`o>egU7|BOFdeoRCR|zGxvM4%WmC& z+EuRe+gFe{7B9>MnV{G$>rRFTaRQ=Fv2F$xd>fLO&c2egJ7z~fKLDrLCWD+?qx>Tn zh6XNG?5zecT3{Bt14N*d)MBnKCz{7%$~s66Pc99ZT!w-sJ?frv%h-J^JNxazBB9$& zDo+mg69*(0AqyV4qS$t#o`JO68*C>ah7@Q#MHdDAbdr6}$ruOdVQmX2bAxm)7Mb7M zEyKyf>A*_O6AhO!@dQRgVfPjm+mrSUS$1E0@C_nK)V|H0Er<3?MCKf(*gr%(Z|+tK zTu3Q|zYBaraS2J{pWoI#l!jx7sAbj&3Qp`r*XG{~MK$XlvP4VLlKyfHSio4o+}VjP z5JWPA;5s!L;%H+2zy5)upA1d%FG|)XnI6v)^0W*(31Zhn7TDQ6jirThvFvQ2uXUyV zk*p6gm#f<9&F*=rHyNuJbkW?!gBYYWGM%ty6{R`3dBIo=Xl+r>#Shfh`<4P^`kO>W z7sjeuiQHr?`uY+!DDeC}d;j36l9N0={*E$J@2&=PE@4A*)eZ#D^7J(1@CMRFViI^a z$tAuSE-QEME@5{G99$qXxW4LcmdP)960`Vwl**maGM%7?PXSN6Tz16VPbD}1x(^DT zGnfXDC~LNxQsw>%_JcvMp{EM$Joo~LII`-`N!iX)Xwvlg<+J5MN07) CgMTxu8nw1s@A4bs1ZWQsDejnz|`noXk|W z0MBpmpI-^DFF0@4I89YyHP9JsGrT+gFF}IY-PwVFf1FCiEWAmGhk(2bTB%bAx5vEC zxwG@pM#|g8NxoXF=L; Uoq*s-9=62zT9NGJ#n6 z)_a;PQ*h%vL(sQ0!Ii$p$mFKq-cEBT-O!0y=wautn?u6AE;gK3qfY2+Xe$p@SPK4! zNuaeZ{R?e_sjTOJr6vbegUn8OI7LfA@~_MeQq!*fTy>8qG3zzeKXRh5?p )o!+l9QW(-;$2tqVpN9wR;vgC0kkP15O}3|{_8+K9wf zd3@bu_>&DzYun$C?#D{4DaqK|6A#0Sn~*Y~*ZE0fh5;sQS=S8N*;etobXve%X{qam zKaIYXG!`09m%ToE&^2L1#^DsafL&a@U5s_fMOEwvG1?4>&ojEiYyay}lTlzEf;Dh$ zXM9X2c5iY!BNvLmb};ZSwR-f25>Z0e|N2HS&&}Yh>Vb+ZCw93ErMD{h0tzYDvs4%R zX)c(zf4x 3&|asfAxwJ`pn@nytE+rL1w_g-uEH#u}i+MP2UQ?MP{6 z8Pc&f@{K4*5y5hy-|#Mn^hy}tbY}&d^f?g84zUz`K>5i_#uu1;!oM~(o;m-A^=n_- zDgg@~{{wmeqE4W)p*SRE%p|j@C{u3_#5QtUUitpDaj`2r;uo272`5{abK7Tqab^Ak zL^43NKT0nQTEwqwUVH+v)kI$V{<@zN2RD@$tH1xHz|y=h+rl%`jfwT(Qs9tPl}JuU zDlER>SziPO-OH_%Qm~-UgR&y*-!6sg?X}<0Akd$n^|x&TeOa0=13Nl;^)CChA00y@ z7*@RNK@Tq|LK{FZx3@5+rymva4|ds|0m%sH{dL5FaKK@T{&WLz4ST`!_^?W^RKae5 zl9w4;_G>A*iFa=z5 y5bgD>W{n&lfa5O$hbRy!v=`A=A!L_`r+PX3v70 z#vNOZPosj5Ho)_aeuTKr88r$vog&;Zs*3XIz58!MB{=;y5~|j^`06jU_ykBx1eMB@ zo1sb38zT2i6%wbWSf`mp^`eYyZVJj1`~BgRqDrKrsVU+g-c|#fh^Cf?axFNn$%EF> z^JU}0*YC^lf!Hy5`H$;{6@#6Jv! N99fLLtZCceMpw!jXx>~oHx(u z$ky`ODSSxJEjfzwGZj=2PA#m(9mx-;l-uZU!*7hiYk}Mev>mmZkmHSA$UECjB|D;f zM=76dGwUsOMzM8j$mq6d@<_oEzcsB~h`+6Y*`s-I{ClS5Dpcd(Z7 FDHg$NMqjMl8?TCwMnsoyAP|04tcaniq zhp*TZC8kk9ss4%1v$6Zag5y;i=dyKhTp$y$_3O~?s-3C%0A{lddsdeTaL{`BA3PfT zd1M$g#^m9X>tx})O$zupOQTYr=?=N+FY)mvg En}A llUZ4n7S6^UJ^I6 4pd3=acQdx*JX;8aM_?wGyvq zXNDPxUyEAoNHT_)gECd#&S9&R55L&3*LqV`F}eV;iM_~4- lzzLQU~PtIJyn zC317o@+zh81hm&WD)fdHVm{0+$B%_`y)vt)ZRM_yQd$C=T6t}MZmu@9L{)?R95Z*j zs%!WdmaBxKDsvMP4z03$Gx2%$Hg!bCz9u;Ycl@pi&+ywWM=@Z@g8ra=2+MgPTh Q*<&C!zT|QR7**)=>v s$Wks2 zBLpA9l}zG! ^?4Y#0uk8MIOWFS|j{FhM45gyj70yE7r{=&w zaVq?D(*$S|4jz2Qv%DM%D7*S6r@6#R0pzGWKB?}u_(jGNh5R%}F&?AhUs=LbI6lVm zHXhRjU%LGGsa>FMVd3z1e9X j`=pLO-o*W9;<@P8>s8MWl`M>+bp>|q9NGJFj9#w{cM zPwPA{MML1I*9Aiy0r->9J#Ughyj{05dCm8#3<}$|)d`D6xJ!=`(++zNDn%Xk#&+&n z{ {(N%b;-&*Yikh=drzIh5mm2t>oM9`cA^AUAw^Z zZT2DdHtl%5q5qaR{^RwGmZu1}pR=fesxNAQn=_Q3S6$#EXn7?iEI$r)t m3sX0qL*biNm$rOl*^@$e?HT4DAiuJ)Hi=Ln78;d*xwF% zUoW)aaSg}4)6q?Dyqew+OEw=XktCjn&4+)Fgb3@2DqRY4^wvcsGMomC=#ehHVTBmG z0@f?->1kdYEGH;^r|bI9C)@X5f2{e3+_XuumLv+mBNHF*YmwM-PTN!5M-QmLT;ed` zaV4CT-uh|kwrOfFVVVVXOCl%$O;dKaQ97cc{y(2GFWysezjc{ll~iN3opGg5ly~^S zeC98-?goR*UFSDS4m?{`T2 9oKe{V*C9zR{=Z zU$P@e>ioPtd3u*Pv?~4MOL!yMEJR 54=NwxbyJN-qW_8hiG4xC(*4Nh3CHfy zqftelYKoQ1`y^y@nFa$~&+n)8UQ6&gf1rqs)S7UBW+~F<&X0-KwgoRGUA8-{^#|#Q zoO-*ngo{}Z?Ge0l+lxmd29R3TmCJneN0v#R9k!B;g8R n(rQD-CDK1y;8-~5(6Os-FOR{= zDe3;3#WZK+f8}|QR*4ehrBV{CW9yo+?{|G3jNnNp|0X5DC01w>#5C^}<`pLl-$Xhl z$T{;G$!Ke)g*`Ou_S@$-Wm>a9x1e@9-uC47fi&GZKX#X!grlUB#UDijlh2BrZ3;37s)|R1~jjf z?248pn#FH3+?vxQA9zK(SWUKtbxt1YY~9513%gZ`>hUhC%5cEqypG<>Y4I~lIJigY zl&3e6EGfq26vY6}W{$E*dgO#nse^7~&zZU*Y^Nzkp*&?-6M{WyWw(47d&O9TojG$) z>9BUH=Ee9!vo0&v*i=YA#XRJu9ryD;4j_uQ5>b-4`>F05&Y-f&pp07RNO^8nhcsyO zS`Sx$QVwBy))2=iPl>ozc`PA#a&rZ2(+FMMKV^dawH6WBcngNr@NYHE&Hl$qD(~uM zf9qF-;Li=xcDH=HKjWZB!p{L?qFG^;dExcspI!VV?8r9L;xD&?1JuvF1b1yEYksc6 zQl5S=MXG2*{zEzXPT6&?0|x~J0{KH2mBoTQ*3>5T=;DOto0pt{*?t}gp& UKt)~UbD#-!;0UzOP8?BlahM- zs(vOyY$_E=_;ecVWG^9I)%y%f>lyidh_Y#P-A{&+5pSU!gJgPWW)$U!7 pNyw5wr>k@mgr$2VgVQAk#2DG~{U5^Ige0W3BEA?jYooQLwP01 z^h5E|p(;1#`k)+Bd1a&@*r~M$`{ZN=`ooA&r~`FxJy?fUfko=hdMgCzGN)El|GRmf z2*D|P@V_^LD_b~&^VSO+p8K~%Kui_#u@m4aDX^|H1AqEy@rBVpy^0Gy&sQO7z%aAL zaGJMWs$&ZkI#TIt |)qx>ZxQF)b78FG*vBk6ZfHyuad;rY_lljJ!4+j z$Nl;f^pvzfaivJj*vX%4vMbNXyUq%_G1R-|9M5y=BajV_1V4lrzz|qV-*r=O^<-T! zXeHqtL^NZ1`dNjfk$MD4eHKN+yKhs}lOH1wtE_i`l%IIKjo* buE~M z15xvOp-&KEBJ^97d13VYuUDW;3~0YJtZ0I|KM6ldkww&R=by_&>0cv3<0~~EN&lQ= zeflc3g7`l5w#r+#DvhZQ52DG)v-W_X-e=tqwn+m+JMjf$AH{hso!runFD}ZF9}!?^ zZp*0$12V-povfd+or3Ta0&Xz@fo@fr49(rpB`(TaJU;2Ml#e1w%B$%b5jDwW&szx@ zwU1esV#oK&UL2apZM$j~WMzij9$sOZ7=r8l2pqP{ gMYUUG2_Nxg!!N?83bRN0P>ySP9?>Fk~fdO23`=!6)it-McI%>M6Rn_j$c zwveGM%4~?VN3|KE+)V5*ReXun oX6B}<0 zCCkow0Hi?_V!!eHa@L&m!yvi5Tw4;yhfr7zr3?$=cJ1XGO!ZSR;*TPas0n(}wtX=S zf!ay%Cbl!QK%KAFkX(Jq3bbr_CS-2g-qDjVqSnuI^@4cqFE`rgC{HO7_-TcNX!+^Y z*ml~;*^FbDj)Nz1sER9pM3Q+semn^=)&0;tqX1PfK505Ol9LRcc@mkE)-!Abk?F X{Q;Kl~Ofi_fKJ{F_Ou_@$Ny%+frxgJ%^P`3& N+v{BCoa>zDg- qgGd%o zao+j*`x4WozHKEr&K}w1m~&Zr&Q4{Gj6?NHB}N~|XaG`&kQrH>nT^0tcrGDHqymms zZKRq+-Em2m^5w&}^(un2XuUl#rj6!=X$@tGbIPA~iXNWnp$gUGJhCT16I~dyIy+ac zAZ$$pjo&fO>v7CRja~@v`1i=ubQ>2MRbskZpd7?+? YlLemYwxF|yFDP@D zY)Wr^dbG1<2gJ2S9sIB3NE3O+W+PpPQE0e%ijb2Ge5tYM`)n5XoKJAOA(wK<$Q}8% z@ezF0*JHazs=m2z(LcSUgQOWMOxCM^R<82!03m~-(kgv+GR)^!|ES?R_vKzqQ92fb zK@PoV%pTZ%ph}8t%v!eRpHhko&Ri^R_~lqr6Q51yLmvBfg-{de)*X@|N<@#ukNPcI zXUTH>Mw)qjh9-Mk ^<_<&1McQaBd?#H84g!{m97#anYgF^% %!f)N=a%?PHMMQRf!rC=jZoZU2oM_JeA$_dG$5L#eH*IrQRwgx=YapcPPwT@36`% zigVzA0hkPaz|V6jhMdas2S`M| gJ9`Ya0watS`L2x~|W zjMa2`dEB9Q{_{;kpRebyMk@hyZ?&MoU#0s2KE3U;!xh-*1E?b)f%u|uTS(%^(qoj& z$~PU2W}TWd4R#q99Pk(H!q-JqdyC9mSzKQAy&zmTa}TV2YcJ5(S0{(tJ@%Ov^MSP+ z>G}j(^A6j^F_!PA#e#j+kcSG;kk-YB)3Pp>F2!pG#ob-XBZNd`c{F(eNiNY?)Qb+n zbM+NO{j7wxGAcLR@Tni7CvMS42e~}XTfzcFBEQ~Z4|N)8^|j_5cG~*A8#SA}`iwp9 zKzs)}W!}l+DmY&PX4p=>6cZU5StjXs1jb~QYfxW(^kvpC m=ym zKj0I4+McKX_RdX6_@jD+Mi6MXO~H9D?~2=5dr? `+)&| z^2C)iSHoiS)M+E~$B)h43l6@T1}E8)?c=6hT(<5}+<{>qBz8vRqO~%azEyz7G*U^% z@>_#PE=cdpYeK+5Z}r>CU?C5BcW)c0Kjj7vt(#x+e fChqSd%AoKTUtaw{y2o@RR8&hH(if725LsQj0p|3)RDf?U)qoht1G4G zpL0dWGZ&_v&iA@4b{h1^GkS1f42lziX&&?dS})(__w_oDr(eW)q_n>b{(zFaY6bse z3{4`RBDCVFJ7svEPR7d&79nXv-NJV3X0r&t-8($TkKAdBubW*qyh$H4=?&quO?aCe z0WV)(0rH5j?rHbOODgQD!Vb>3*R6D~lT-2N`e^*PY;v^v_0!@v)}8IdUant8Lb}SE zDyO%pG^Ooa`*YBJ9zDezR#wP4lbX{5ck&>H?|Wr_PisS9sLGY9vPpNT;mQPuSVpEo z`&icK$rZy>mFaq;CokE5L-Ec!@b1uK*yxIA%EaDoR)${dTX{QK+&=K`MM0oFJD+Q^ zh90ucT>jx>4 $*Q$i_LfX- zHO*A8b$)-sW3-NjkT1hEUEb4YSuP9fy-k+skbIXgBaV+E^Y)_UGe=!e7&piC-$G$b z=sZfNQF-*O6`!88kLSN0r%~wRw$FRP?@&UzUuksfUvGOZ_%TsWjmF5)Jp=UX!Y7x% z=(J3vl&tT_6((?}Zr4-}Fl*wT+O1P*K8^fh8fTtohAKpHyRE&gc&WF+wXFZm>(?os z$UQ-E+&rA+_T?I_gARlS*(25c{N+v=fwcMWTONMun>Fk_q2 4n@KbNCp6|h{;r&U-lCUy_JkM#D0%0|o3q6oS4<^goNUk#!|C0pdGwwh$d ztH<6h9#FdUlwYpD*IimOE#Op1`OPf1YeVUYYLi2hGMm_&O`Xmb$G1unKZt&>_QV9w zn-Cov=Cmh%Zz1Q<2D@p?0_`Uvmg$Gfx(0T20U(V*6TV?%$M38-ssENw&-PT0`wo6; zYc0yP0kkTgznU6_Y}?NEGhrnwLQJ=l416KjL&Q#~NN}h_SWCg_wJ$2cq?t(ui|NE7 zY8-Kv{p`c@$J)}Ciiq^kG&%_aC{3Pxv7NZSyBAmJ)Y!JY?7i?vo%}`v+Ukfn!wkp) zcsdy|_54WV{lyw3aomuJwdR9*)L@?9A?_9&_{)x}JeOUW!xPy}#D6C0;yvf7d(^x$ zbyI3^pO$^_0PwQJg=^p~u!I~8`U>Z2$R@thm~K%>1DLB?T^aM3MPqkq^@71Dg5{5e zPc*_<2|Xo-%nTHm?;fGR3N*$zgG2!s1fpKnCK*1tZ#sD1l)6l>S43u^jmCY5lYq!V zwS@=DjZAiR?bGQjtc)@WIaQLg!F?wwW |Hi%ZYkl{FTuKaNtcHdnl)|oQsDwO z-qJ#n%WViKCMDL*{*hOD ZLW0u zHQv61ixY||T$e%vcP{-7OtlKFQRHR;h}P~JB_}dhNBHoJ*`d46RPCjrwpUfZBt$Gw zi2SvSmy%QoaUD(O?xTl?D%_Oo;^B>=qiI3{io`+JFMAFi|6=%l6tdtCHl4
}-Yod#23*>zb zHM(V5$?__;gxGhbst#m%?KzDlR~A34S_| $<*E&jv_&iB6rIn(2Nn8~g)eR=NRS zt!f9PDHi5gc`MN_0R)Ad3+bxRA%pW*Oe>uWiTjvIYDP7vb0x$PP$0ym41#3%Eg*+V zY#a~qMh~RyN{vjS&CGlB*8q3|CN3HP00#pKjVD9hT+BOt=^&nlyAt1SjU%o!2KbwO z3sHazAV0nzGFPfoxE%e;V?Dknw>P8I_N?|OUa3)YNOOu}WRxMQIlWFMW}#~ltPaeu zbK)ChKx7d3+l k!F+N zjh4EB;Sh;XhctKasQJZGs$G@pWV6m+tskAfCt5%4Fh(*V`vCOTi{&U3M4?qJ?SO^) zH>psEY!$7DhNmk&Uv1TKb5AIE>X)C;+j5go>Onq{t8^oh7pJ^lLu=zg|5SPRD%nDL z{{x<5PBIX0$&zR6Fnu}B0okiR_wNoFrrU~WR6<%NQ!7fY&?Pj63=Enr{Jg6n_*cK0 zA{bl2?JHDQ5G&W;2>NwBXLGi8huD!VF1>hjpZHzg$%#Ijaw graLdoHnNno$Z!$vlBp0j4Q ~&{?bHzCl@Oca4#rplCmtSbKTWrKD%DT z={j4+mF)U2Fai3Ej7fOESlw3pcc$_!6tOW|%!Hw87&FSQlUw}b_SBvDm7Y%xFKawb ziM}QDY>lM*;Okdoe6PRnGPAqCzhq(GTE&Z*&Zh=M`JQi6fC$ %}W{KvZp7d11he0joVTVM$HEL&lF}Bi<*-sYu&Ke}_0fyT5;=Q{n zUr{@QWN0aNu+}TK*5(d*&m;Wj+t0-db{r}@r@FDE7y!9w*-bG+3w@r3jc#r8p|`)w zg~rtF;m?Nmq|r!}%ohezqPBhxr>!SZtLwm0TGa`FT9CRDC}jw5gN&2ALV8NS z^Rn2fTT8359}s=}>>|`fHk(v $oaTY8)`XFS_ z^{8d&TF9(nNtYPomY5 @{tfWRZ&-h8-B&tVDK8$^|(xn7g*PzjBs0eKWm zY$`@AEK#_# -Mnr> zNnReHRz@${_+!_P@u Q{lJGJB)svj3QS iGA7+TMX z;NY!PPb8WWU6Z#>ye%Z2*0bx^7s+0<`k6)7JRF~6rp60>%Q(d#i_r3uIp@1*;_v1^ z2w7ATEw%>MO|&Pi{Zl4H$l)?af2cYL(DP18o>kt8fYG6RzU!MAK9?PYj#NanB=ZTZ zMOZ@l7U}S?m?p9i-$D+8#1b?ZY1Rqj?U(N{O3$uC1hTZ~by%X3bdfbpP1DEjj86jb zf~N9=vy=3gO0Dz@2OIBZoZe+d4jOsb9WJ&re`L(9^w&(bE8YC_79`CIv6PW;ko+I4 zCOSL<2w<|HeMpQtILU36{hl_ek->yU4|-#nPGFI4O3vXIu7!NyEbCX-&7PhKanQBS zhWI&oWg}7f7^_2{l&=lnRLeX8KrORiv5PMi^jtexEmM?f|2 k{mh8cJ(;Q6 zV=9hTtkk}KdOF1|hJqU{rVD{5hKKC|Vjj{hm i~s8vC6Vb|qX^+ZRKC5|GO_dK$wW`jstqd(+QI|x5$`$WFv za%o`hSDdt2EUcqsRQQdVs7Y5L!?yo4CG+zx&*rw)_*=s7LZ3k1m>1*^a!sTK`udMV zjU8SqcVB$IrJAhpP#}!KFvarIeyOC5hF_G3q6O)~%0-p^$aa9heBTn(EulvH6c$Y+ z5G_BHA@~^j+u1PrJ|=B=N3QR{$HnVpaQGqU&Q*&H*kdFOnLv!LK?^8L6%gcLAc^E% zqjllp^`Z+S@q*>^%C64d)FKX1K<6g(H%SuP f3TB?!Wwar{L4eeBTy;BD&LD74sY>+>jRYWVUXjBP(atC; zQ>xZ7GbGtX1QXz-?W|Jf{I?oH5U=!3v0#aW{NIepr&ZjkRyGRCQ_TT!nh Xq_3sTcE?iXK2O2~6`a8k6th z=mT=3B+M!D$Y1Xi b C~V*1i{e(9@OcmqkoUnZkx-0 z2i9FgRt-}$u)B)!Cbr0L4w-vcPPBfKn7SdEut45s&eDczJw>BH>9rpgk)-t$O{5+l zNHHPelX{QK)i;hN%Pf%Zj!E AB7InKPmo2}IWI#O;^Gmqgq2lJ)YZ%{ zH1fPGTjB<{(Y$;mQCJe9k$8e`Kg)0W2=Q^88ZkTXm}?doFKlVdQqxAGxoID0C(?_+ zt45eYuNC(P$pg8R@#by+PP@)~*75wuj;(RdVvB|)O)F2ATvZ_O;d|PfQhXp(O6g3D zotc{SzC-qn8MGC!;0*~{UU?@qe?2hjGTzW-VnQ}12&^=@vb@!j3MqXPtF*giNJ-tW z4m@!lLi5u35(-UowDWH;@a7!U#Mk-OE>jcNoD5AJWhRi!3k+Q6uPQ&n7j;P9{jz;i zMn_B&eu-?j{M}{_YD3u z{N5n5W)@DkF4>Ou&fV=g+ae_ff`_Hr0R=WgI%)fxr<=_S2xM?D?yvL0FF%#yoTHIi zIGPms?(1BD8eH3GlRA|^QmieMa8QPTm#|H9il+b?VU|{)y?Qs{TZ2s7RRY+_49}~t zMpMJHc%jgnkM9++Z0z>*R(16w{|*e)yI$DE|L+QFczRrZ!h;*4_O)R6+Rc!<=nfOQ zYAut^$j;8?TbU0k07Kp{@75pps}9*w&HI8aKr)f-GYiMzLIDSMcGf?;BTB3R?Q|Sq z$Iy~hZZXd(Z?(-_o8Q}{5A+jH2lc2sO1<&EIkj9jVi$?$dERTA!GCb-&51>oW5-BE z%>@Kqw-ViKaa|eFj24lb3)X8qD+|-KxY)#+6k(x `k)pph%lRDn9*T@VLQh_ir5|z<}jQO%vvTf0IwBRQB z%{AiJTnKA m2LjJL7lO7Axc~{?sZ`J8Wkr zpEp4&B6{zc@6$7MmXgEQy_EVUt~geIP5foK@H76wzg@6kma&_X)AI8&ZGPJMtAgQT zF9{3b=3}=km`;!AW0mO@B5s&N3`+R!U#9@F3{7&po$@C#4iA{T4ysM2LpMlP(EQVX zh}W