From 4af2fc03e6728c94e72e7f15b0d2f4ab3c506c68 Mon Sep 17 00:00:00 2001
From: Carl Fredrik Samson !Unpin!Unpin it's a good sign that it's time to lay down the work and start over
tomorrow with a fresh mind.
--This is of course a joke. There are very valid reasons for the names +
That was of course a joke. There are very valid reasons for the names that were chosen. If you want you can read a bit of the discussion from the internals thread. The best takeaway from there in my eyes is this quote from
tmandry:Think of taking a thumbtack out of a cork board so you can tweak how a flyer looks. For Unpin types, this unpinning is directly supported by the type; you can do this implicitly. You can even swap out the object with another before you put the pin back. For other types, you must be much more careful.
An object with the Unpin marker can move.
For this chapter and only this chapter we'll rename these markers to:
+For the next paragraph we'll rename these markers to:
-
!Unpin=MustStayandUnpin=CanMove
It just makes it so much easier to understand them.
+It just makes it much easier to talk about them.
tmandry:
Getting a &mut T to a pinned pointer requires unsafe if T: MustStay. In other words: requiring a pinned pointer to a type which is MustStay prevents the user of that API from moving that value unless it choses to write unsafe code.
Pinning does nothing special with that memory like putting it into some "read only" memory or anything fancy. It only tells the compiler that some operations on this value should be forbidden.
+Pinning does nothing special with memory allocation like putting it into some "read only" memory or anything fancy. It only tells the compiler that some operations on this value should be forbidden.
Most standard library types implement CanMove. The same goes for most
+
Most standard library types implement CanMove. The same goes for most
"normal" types you encounter in Rust. Futures and Generators are two
exceptions.
The implementation behind objects that are MustStay is most likely unsafe.
Moving such a type can cause the universe to crash. As of the time of writing
-this book, creating an reading fields of a self referential struct still requires unsafe.
unsafe.
You can add a MustStay bound on a type by nightly with a feature flag, or by adding std::marker::PhantomPinned to your type.
You can add a MustStay bound on a type on nightly with a feature flag, or
+by adding std::marker::PhantomPinned to your type on stable.
When Pinning, you can either pin a value to memory either on the stack or -on the heap.
+You can either pin a value to memory on the stack or on the heap.
Pinning a MustStay pointer to the stack requires unsafe
There are ways to safely give some guarantees on stack pinning as well, but right now you need to use a crate like pin_utils:pin_utils to do that.
In short, projection is using a field on your type. mystruct.field1 is a
-projection. Structural pinning is using Pin on struct fields. This has several
+
In short, projection is a programming language term. mystruct.field1 is a
+projection. Structural pinning is using Pin on fields. This has several
caveats and is not something you'll normally see so I refer to the documentation
for that.
I'll walk you through the example, but if you want to check it out closer, you
-can always clone the repository and play around with the code yourself. There
-are two branches. The basic_example is this code, and the basic_example_commented
-is this example with extensive comments.
There are several branches explained in the readme, but two are
+relevant for this chapter. The main branch is the example we go through here,
+and the basic_example_commented branch is this example with extensive
+comments.
If you want to follow along as we go through, initialize a new cargo project by creating a new folder and run
};cargo initinside it. Everything we write @@ -171,7 +173,7 @@ here will be inmain.rsThe Executor
-The executors task is to take one or more futures and run them to completion.
+The executors responsibility is to take one or more futures and run them to completion.
The first thing an
executordoes when it gets aFutureis polling it.When polled one of three things can happen:
@@ -214,7 +216,7 @@ fn block_on<F: Future>(mut future: F) -> F::Output {
Inn all the examples here I've chose to comment the code extensively. I find it easier to follow that way than dividing if up into many paragraphs.
We'll see more about the
+a trait object similar to the one we constructed in the first chapter.Wakerin the next paragraph, but just look at it like -a trait object like the one we constructed in the first chapter.be rather easy to understand.
Contextis just a wrapper around theWaker. At the time of writing this book it's nothing more. In the future it might be possible that theContext@@ -226,13 +228,14 @@ abstraction gives some flexibility.Futureis a state machine, everyawaitpoint is ayieldpoint. We could borrow data acrossawaitpoints and we meet the exact same challenges as we do when borrowing acrossyieldpoints. -As we explained in that chapter, we use
+Pinand the guarantees that give us to -allowFuturesto have self references.As we explained in the chapter about generators, we use +
Pinand the guarantees that give us to allowFuturesto have self +references.The
FutureimplementationIn Rust we call an interruptible task a
-Future. Futures has a well defined interface, which means they can be used across the entire ecosystem. We can chain theseFuturesso that once a "leaf future" is ready we'll perform a set of operations.These operations can spawn new leaf futures themselves.
+These chained operations can spawn new leaf futures themselves.
Our Future implementation looks like this:
// This is the definition of our `Waker`. We use a regular thread-handle here. // It works but it's not a good solution. It's easy to fix though, I'll explain @@ -256,7 +259,7 @@ pub struct Task { } // These are function definitions we'll use for our waker. Remember the -// "Trait Objects" chapter from the book. +// "Trait Objects" chapter earlier. fn mywaker_wake(s: &MyWaker) { let waker_ptr: *const MyWaker = s; let waker_arc = unsafe {Arc::from_raw(waker_ptr)}; @@ -304,8 +307,8 @@ impl Task { // This is our `Future` implementation impl Future for Task { - // The output for this kind of `leaf future` is just an `usize`. For other - // futures this could be something more interesting like a bytearray. + // The output for our kind of `leaf future` is just an `usize`. For other + // futures this could be something more interesting like a byte array. type Output = usize; fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> { let mut r = self.reactor.lock().unwrap(); @@ -313,7 +316,7 @@ impl Future for Task { // i.e. if it's `Ready` if r.is_ready(self.id) { // if it is, we return the data. In this case it's just the ID of - // the task. + // the task since this is just a very simple example. Poll::Ready(self.id) } else if self.is_registered { // If the future is registered alredy, we just return `Pending` @@ -345,7 +348,7 @@ to allow such cases. trouble of creating our ownvtableand aRawWaker. We could just implement a normal trait.Fortunately, in the future this will probably be possible in the standard -library as well. For now, this trait lives in the nursery, but mye +library as well. For now, this trait lives in the nursery, but my guess is that this will be a part of the standard library after som maturing.
We choose to pass in a reference to the whole
Reactorhere. This isn't normal. The reactor will often be a global resource which let's us register interests @@ -353,7 +356,8 @@ without passing around a reference.Why using thread park/unpark is a bad idea for a library
It could deadlock easily since anyone could get a handle to the
-executor threadand call park/unpark on it.If one of our
+Futuresholds a handle to our thread and takes it with it to a different thread the following could happen:If one of our
Futuresholds a handle to our thread, or any unrelated code +callsunparkon our thread, the following could happen:
- A future could call
unparkon the executor thread from a different thread- Our
@@ -365,9 +369,14 @@ run in parallel.executorthinks that data is ready and wakes up and polls the future
+There is also the case that our thread could have what's called a +
+spurious wakeup(which can happen unexpectedly), which +could cause the same deadlock if we're unlucky.
There are many better solutions, here are some:
std::sync::CondVarSince concurrency mostly makes sense when interacting with the outside world (or at least some peripheral), we need something to actually abstract over this interaction in an asynchronous way.
-This is the Reactors job. Most often you'll see reactors in rust use a library called Mio, which provides non
+
This is the Reactors job. Most often you'll see reactors in Rust use a library called Mio, which provides non
blocking APIs and event notification for several platforms.
The reactor will typically give you something like a TcpStream (or any other resource) which you'll use to create an I/O request. What you get in return
is a Future.
Future.
is pretty normal), our Task in would instead be a special TcpStream which
registers interest with the global Reactor and no reference is needed.
-We can call this kind of Future a "leaf Future`, since it's some operation
+
We can call this kind of Future a "leaf Future", since it's some operation
we'll actually wait on and that we can chain operations on which are performed
once the leaf future is ready.
Our Reactor will look like this:
@@ -401,8 +410,8 @@ struct Reactor { readylist: Arc<Mutex<Vec<usize>>>, } -// We just have two kind of events. A timeout event, a "timeout" event called -// `Timeout` and a `Close` event to close down our reactor. +// We just have two kind of events. An event called `Timeout` +// and a `Close` event to close down our reactor. #[derive(Debug)] enum Event { Close, @@ -422,7 +431,6 @@ impl Reactor { let mut handles = vec![]; // This will be the "Reactor thread" let handle = thread::spawn(move || { - // This simulates some I/O resource for event in rx { let rl_clone = rl_clone.clone(); match event { @@ -430,9 +438,10 @@ impl Reactor { Event::Close => break, Event::Timeout(waker, duration, id) => { - // When we get an event we simply spawn a new thread... + // When we get an event we simply spawn a new thread + // which will simulate some I/O resource... let event_handle = thread::spawn(move || { - //... which will just sleep for the number of seconds + //... by sleeping for the number of seconds // we provided when creating the `Task`. thread::sleep(Duration::from_secs(duration)); // When it's done sleeping we put the ID of this task @@ -450,7 +459,7 @@ impl Reactor { // When we exit the Reactor we first join all the handles on // the child threads we've spawned so we catch any panics and - // release all resources. + // release any resources. for handle in handles { handle.join().unwrap(); } @@ -805,6 +814,103 @@ fn main() { # } # } +This is the first time we actually see the async/await syntax so let's
+finish this book by explaining them briefly.
Hopefully, the await syntax looks pretty familiar. It has a lot in common
+with yield and indeed, it works in much the same way.
The async keyword can be used on functions as in async fn(...) or on a
+block as in async { ... }. Both will turn your function, or block, into a
+Future.
These Futures are rather simple. Imagine our generator from a few chapters
+back. Every await point is like a yield point.
Instead of yielding a value we pass in, it yields the Future we're awaiting.
+In turn this Future is polled.
Now, as is the case in our code, our mainfut contains two non-leaf futures
+which it awaits, and all that happens is that these state machines are polled
+as well until some "leaf future" in the end is finally polled and either
+returns Ready or Pending.
The way our example is right now, it's not much better than regular synchronous
+code. For us to actually await multiple futures at the same time we somehow need
+to spawn them so they're polled once, but does not cause our thread to sleep
+and wait for them one after one.
Our example as it stands now returns this:
+Future got 1 at time: 1.00.
+Future got 2 at time: 3.00.
+
+If these Futures were executed asynchronously we would expect to see:
Future got 1 at time: 1.00.
+Future got 2 at time: 2.00.
+
+To accomplish this we can create the simplest possible spawn function I could
+come up with:
fn spawn<F: Future>(future: F) -> Pin<Box<F>> {
+ // We start off the same way as we did before
+ let mywaker = Arc::new(MyWaker{ thread: thread::current() });
+ let waker = waker_into_waker(Arc::into_raw(mywaker));
+ let mut cx = Context::from_waker(&waker);
+
+ // But we need to Box this Future. We can't pin it to this stack frame
+ // since we'll return before the `Future` is resolved so it must be pinned
+ // to the heap.
+ let mut boxed = Box::pin(future);
+ // Now we poll and just discard the result. This way, we register a `Waker`
+ // with our `Reactor` and kick of whatever operation we're expecting.
+ let _ = Future::poll(boxed.as_mut(), &mut cx);
+
+ // We still need this `Future` since we'll await it later so we return it...
+ boxed
+}
+
+Now if we change our code in main to look like this instead.
+fn main() { + let start = Instant::now(); + let reactor = Reactor::new(); + let reactor = Arc::new(Mutex::new(reactor)); + let future1 = Task::new(reactor.clone(), 1, 1); + let future2 = Task::new(reactor.clone(), 2, 2); + + let fut1 = async { + let val = future1.await; + let dur = (Instant::now() - start).as_secs_f32(); + println!("Future got {} at time: {:.2}.", val, dur); + }; + + let fut2 = async { + let val = future2.await; + let dur = (Instant::now() - start).as_secs_f32(); + println!("Future got {} at time: {:.2}.", val, dur); + }; + + // You'll notice everything stays the same until this point + let mainfut = async { + // Here we "kick off" our first `Future` + let handle1 = spawn(fut1); + // And the second one + let handle2 = spawn(fut2); + + // Now, they're already started, and when they get polled in our + // executor now they will just return `Pending`, or if we somehow used + // so much time that they're already resolved, they will return `Ready`. + handle1.await; + handle2.await; + }; + + block_on(mainfut); + reactor.lock().map(|mut r| r.close()).unwrap(); +} +
If you add this code to our example and run it, you'll see:
+Future got 1 at time: 1.00.
+Future got 2 at time: 2.00.
+
+Exactly as we expected.
+Now this spawn method is not very sophisticated but it explains the concept.
+I've challenged you to create a better version and pointed you at a better resource
+in the next chapter under reader exercises.
That's actually it for now. There are probably much more to learn, but I think it +will be easier once the fundamental concepts are there and that further +exploration will get a lot easier.
+Don't forget the exercises in the last chapter 😊. Have fun until the next time!
diff --git a/book/8_finished_example.html b/book/8_finished_example.html index 1488fd2..57a226a 100644 --- a/book/8_finished_example.html +++ b/book/8_finished_example.html @@ -78,7 +78,7 @@ diff --git a/book/assets/swap_problem.jpg b/book/assets/swap_problem.jpg index af45cedc9f39912845821e3a8009d100df9e043b..9391bff0d6e7008d8e88e4607f67a7940541bf76 100644 GIT binary patch delta 47357 zcmce-XIN9uw>BI^L{LO2(m|zzfPnN8l^NoZo?m?$6D(bXJ8A@4C78BL+u4T@9 zu&^$F;X@T4lD1g+lE@D5BF2!{%vz(PBq3uTY6O=&%T}ewM?C&I1Q%WmWzl~n-)c5# z{qfriN<4$`h2=!`ew2!9Z s4-qeV7{A^5{(MAYm(>E)h` zNV;Qq kUt>j-r`!1{z$WOra*KSK0<$&T@C6z`M zyX0xZom_NMQe{)|+}LDt>q(T=M+cdko^MJ-e9?cpKb++ t6URW`(uy|sTwln2A4lKr6LwY%xh?CQQ+X!9qU_fw->5G|_r@Qv7| z`EyWA73z(pSQGG8SuJ1Z)z6*>iBfZa1zZZ)8+q9y$)_Rv`uRgvl-1@F=?^Z(&Z3+3 z6$j%hcKd&pO*R*tAwQq5_xXCiEeK>Q(w>~%Gjvv2&a=mKaGZk_^v*%`(&wPM?$hEX zB@!oTB#Q%ALu3kTu^icw;klw0gk6E(OO+eApA_17=>HzL?shTqcKCF&mv6>3*8|!) z>tT;W-7;CaM`P|9Bb45boZZ8ZE?;DM;8S sh>QRAA16$eOmf^|;OVMo-cnF5M9`oid;>DY?CA;SL z^^U)N09riMyp{XjDA6>Of3~DhFGMM0RZ~f`0`)*8GURwWs8HHz%rLoQ%H$lhlmzKP zI&oK>La#k@KC>9FX_y)xIC(sTZmg-q#ISP*<@C!Sk6vzSPEwbJ239KDBJg<>3P7Ur z7(jmG7e ewo z{a)^%^7IZK>IPTrYOgp^?X$JHrNX2*^N`caEw&{GTK%V5z20E*cM z`H}}HAX{B)5<#ovIVQ$8(4&Y7BMZYs^@2> #3RyXZ z*DT)~N7RQJ`uIewBvsy5-q*}>)otdc#8J0~YJ~7ybM7y)ZoZMFZozQx&1JT`%hw9> zeO$AgtG}7eN4yfUE`LI^QBS)wJvPwvZ MRhUO~-ixN0nrq}>9ZGxl zIe5I0)P-ml^R+NlmV1vR#z3W8SuK5 `I*9Q3zxd?Bv+(-rM0xZ5En#FI1)>u%3gS0WP*YIF{%z zVSF*2f_+VstaM#ls|92aX_rqaZh{RyP&t{KJO>%z^rMs?md$A5A|4DLs63isR=!<4 z^|spoM)B7@_$ME>7S0sPtOiK*+g6B)O6iyR#e+&cuvL{m{s?TiKtu|sx}PC+(2@p4 zH**V~ ndVdLK6NZIL5!e|o%+r(!#?T@MT)4PwPJeNL% FA zv^x99ry#{OqBC~a3d`}AzmQ?sijvXlr5O%c>A3mpVV?ubLaFEV-@+f-arLNs7PNO? zbqy6Z6A2;|=O$*i0l_SB%1XsBU|wY @n=6ha1(WD!DK#Et12Jyl?Rz`>4x;YSMRYtid;x^*ukwv&rby zd%kmTK;GdcR7lnY%*?3lt4&OKK^ZU|N~BWXnbhX zn&?Gac+jQd+Dx1aJ`HTkqN>4-As3W3zjtn-uW&HR^dOo=%%ngnQ50RC{mORl{%_FAuO zP9(depP8Bi@ueMH_a4fur+Kz6Eb70p wI7VyRJM#^ZAkJ50_HD_&a79uu?d)LO)Mu|hFRo{w^b zdsL+({E!1o)w1ZkQXSPExVIQN^LpsT`*+{H6KFPp0Z57SDGO18K3b8pQp>$cOws#d zjg%+_-_vly69xVN SiCxR|5c}oH#~uG zu(V3tuv!l|^<(dyY0Ru`^==kSebDEf(##8FtyU7P7N?q6H^&vr7A{yM_OK&UWjLw0 ze*nf1W%_w{ pem_NPH}xo#_lwy4XLwzf#kzmI4>kl6?mzy$!& z*qoMQTUKmCliQdehlKy#vz9n+P29Byl#!>a4aU941tHzIb$nzQhiU;tt`*6o@8`kM z${wDq@Y7lfb+&g+ay#|_`38{$OP|NQEO&{`G2MR^6A&p* S3$Lc%6EXh6JLOnRCe`uw=ZZpQn}XZULDOk(=K;ip3{r^ z+2I!}AOHH3i-D_uo;!s}jVa4{`d>m6_S$pxDbI<5G8`{*f8GmzUXP3h-+=4##QD`; zD+vPVdVi|jWsyP`cmJXQOUmE!eZOvfDWza$Gwt Y-q-Hd}++#_~c02 DiJX%s~+5@I@-TKNwK%4=!6J46YIesQ!KJ0fpnQ gN%vY! cmqU(X8`3`VW^U);q2r_-63yxEN(3P5P3_kx#iDi6Q$O^nkESIBFuA@?cZw zPpRjCIkFlSOM1z=*gprIUPLUA9L_ z5aBtX$DD(jT+cymhUXv}gLBa5(Bm@#lq8aPC;=vyw8MB-dH&~;{&PXV|20Yfxgg;G zz?}YbN&mSZ;D58a|9+kRbM5_4B>m@t{>6^|Z%F!w!Tv9Tfd9huOy1$&^fg2D8>nYk z&Oxy`XS)68pg#=I=#%K9a(Yr2Z?1)$6so8#lo`7rRqv)i`h%jtdb|uNbGe~=S3t;Q zS$HF?>YyVMz58{dy|$eS(7@8uFIHT|xU!ZhCN j^jJ&MAWdt>Z>CX{SGTy=Iw&l&l#pffg))JfCyW{)ah24w#UEDlW;Y=1#by zT=hInC8I{+mlP0;nWC^XS#fnbRdE~Zh305R)P!S1$wwo>OY!8e`35Qh{_N6cd%4+L zK9rN09X%H`-JV`FkPDa6x>Kpj1P{R%6yphc*yuzOleLrYOpJ8dgwk1zEU)C+wE`tC z$=fT4ahU@f=IBvtdlsFXShHcjp~LYt-%-+Bfo;4C4A|mQtSnqU%gYdC(=A?h5fdy< z6iehEJ_otXMM7rzNBn4%pV=3 T&1P&r1Didop2t`S%OXXHA*G#!#ybOPA?M zYjuD3J3HFhUVmCfZZxC#@Jm?4d|bVC+FYv`hx$-XZRRsYlx(tcZ)RQ6ozm@Quq@0- zA2jBf2!v7Cx C4*to>qzDX@Wq>|%A E~3iyC~2h=1jbl8%e+dtUxCpbKdAK&j>Xyb%n_pfS< zd&`LelmvfiXk5tQju>i4?2}ms(~>U2<`xg6dOrUy4YtH|N$m3Pl^tK3q45DvP_wN8 zY^eNpu)TWEq)!5z%mOBy=Ojr!GirVgkQ;q>Vd%>Bn{$#Hc^!wms4XKC<4~Wv575 zv0-`#p6Fk(6 7v=wTrgpF(%&i+n?vyjTE6#LvQzq z0#q+|Iu@80e1nm(+z4dnnoW1*&RXYenq=sVe0xD-=6%g^$YSj-2j1-Xhw9yt25@25 z)tYLC6Qjn;n{gSGDSVW1H%4f`k wChY|Uju 6)0$LcVOuH9l@6IxbNhhg C*=E3z3LGPyRw4prH-pM11AIPB6`^x+ zVf=WjR#|RIf=1o^_u4o~8 `t55Tm zPd=Kcjt#NKqFQV?+Uq|Y-E%&zEVi6DNj%EGD0vOyFp~!Xhvd*(p1Oc3S_sx~IXtka zTjNTnub*M%;?v7fFqv%}^V*U1xz4Lx&I^5tuS8qV0g#*L8@fgMn70d4=6sbyaJkEs zuV%I4EPN;eX&)$gf75) #qVGXa*D`n20i-RF!--q*?7hFc zZVUShAWbzcx!IF0<6W+m?2N`WW*P(OUFhYLc1+Rmi*ryM)o42Di|9Eh@4Zp4mqEOx ze1gLqItmeBd0@q>eDjW3CSOXO{jg2?^htUjsxXY5_!Q5vVAU(23#Qm8DGytx8|g$) zILxy^rF?5v*KScBppqMwELFKao`Zfq%sU4G<0H^hR#YJK%P4W> X8RF4&_>mS{3WefEg=95gsI9!HcOQ|8Zu eJ3t6$Z`7Y4i` z^))f7a>3H{jMcD$Q63Gd?%SAQrD-+xPbRX12nHods;0NIn2QbRXX3!|)XDfD@KrgI z=)Z_0TqGNuDe9Ai0N4#ls+Zd@_1U_6?>A9TzWN|ybmpu)+v !#Qh(*3p9a*#G^eLO~#Qrom`IOtgAJ6TLDq7Zj`^yOk8VMRjuCXgG zY2LX;-ZygkO3y*^gKO*x*L}&Ge8~7#8lmb8O8O0K>zs`D$sDk3MF^Y$WW2KmI4goG zv`SW6n355LbC8Z^QA#(y7Jd#A2*rIl2X%Z271gLjL-7atpUcR0LHIkk0R8hJ2Nm-O zp1tRY-4Tipz~wV^0}YC(f#>nhfq6bgn2k)H&YD)gE_`0x`fd4TTSy~}e!FqWCh!NC z(s2~7RBZj{^v#IaB8x1l>gbzW+$ksI5;%FIN+o|RuzGFG3pvIe`sy^Vu>hSYA#>sx zD&g+_C-@u`b?_ bvqNe(OAzaFCF@91Xjhrb zka@679l!kSl=V_UhJ%7{tHIAPzfsNIz3;ZY>!I5vL#K!LWC*Y_Kcv9rAyzxRB2E`( zlWXA=WDukid4q3i(K(s`9vL4e39x-jUWanR4eWSg^QZ|CCuy6?m!<+8=rclHc4CUu z^Eb^{d^^^fsak!ySdK@{8Nk;?>B(!CpPAX^ve7XDzTUtbh|AJdv1(D}L)Q%x^Nj74 zOG`L>d?Tr^`be=}kTh*jUvNc6&w;9J1dV|Dsw7 xfUrFKa2Y=v_|!j-raH z D`F$aN9Ul7P}dp1bI{9Ey78ZfI9{mBg@g67pl>e{yJxRgOIFHvc37V5{ym5z zCtYoUBZ-ravBst5`cXuiXO#1NPo|+?qf5V2wUp}31<1}-$JHP62{{xcYl(`9fFe@k zV|{*NE}Vbf3jA{0cM;0$5|A{j$-$qQS8`Kat68-6g89LEI1S$^3_T9P$m8rP;>RcR z=DO?VrE4hvNT1NI{2jkRofZ6eG!VwK7-`riWtM_JwzPwSl7K^LAd6JH*W;X&KBYDB z(C%T3Xb|{1hU*VW9!)F0{R60KQYUeHpDHX(w841D$u;eb%;Uy$5GpldqQu=5fJ)Di zGg~%n;^qD`7Iq0XkH+|8M|8Z3`&g4grO{VU88w=)^c`UWqmCo~ToB#b`j5+%`r@Fi z&p~jC-;nUXe=(!ce4WAjflb#{IX9Z amX zJ_`L1qBh>NH6{ yIX{j*;9lbU(3-+xxJXn|$t(WFanXYW{28ga5j~ zWzt01(XMwzGquHt^aIC@2(FxT>5R;hVff2F`XXZjTM(gJ0hA0ihfCu>Ei}EkIT>Fb zxp*ZsY*#(S?U3fPO%rD7_*)$Fa}Fw>+!D|ex*(PxoYhDU06lklqjV0z)Jt(!v$r&h z`wL2kWz|_X DU=luL|$&l(TL|s0`UEo4?Z4IOF#TO ?1Ve;Qn zW5GX_pI?JFcI2R3My=Rpqk|36!3NZlIe3jZy{RftN0r~ZR$c=t)l>xZ;sp_)ZugC< z{4j |4=C`dquI^@kR7bgTG5m?vt_>YLouKwD`KT4o>zOoI-)Sp-Z0_li zlf7;YtM7{xciNeRhE$O>hrNy<`m!A%?B#=Tj&iHnEOHzNt2*Oj 8$@++mpqbSX#HW>I5^kLW# zlm;$|Eoe>)MMmGR-3C~;JNarovz&oILGiWZevhnhNS~@d@RwI~HK{wXrbcFF`x`O4 ztzSIV({x2gCn}>jVD)4QyXk%?9+Ywfv{ k!goDX6!|w5kyD(ujD5e=tf*g@4;^3Kl)mF`#Yi(~;@pyAOPD**970y0w)PkL z6D)x@9)Qe@nlU SW2J^(<2j5kv8i}-PG#@FJWb1iV z+XYH_mhm)>Xz{n=knzo>FYKIsy2WuJ6Q};RnoqdDxAb<8>sgeqBRz; FaBURlj+m&3o#;Ht~)cS!Qa3x#Dvf~oTu4 t!++x_)l{RA;an8*8tz ;UD6E!a|9 z+Kd`Jj2wZhisjy$c`aw`IqCI#k<*bIe~dyXlTTsWMViba-f<#%{NGm^Ns!@PM>!c9 z9qR!P339+^#RG(m0?0}rHcSjwKh>%zHk(3~lKS!XdkM$)e0Nd28C3C6_gadWadSWC zqUvkf=5DGlY~OU%l6VobN*}_@_srzQUU3IF(hEcO{k~7VWU%Ie(MLrSmJ+FBbD{pk zYZ Q#>(_B4twj-CE#X8+yGTkD=zN5_r}4`#HLAe*F_IsB4Hf`EC K$US5Jj1#|W&@ zYX59+;Q{XLLiO=EN1iy1D#Crd=fVL?n&oD&|9owlv%ov6lo`nra}9Iktb{4o=6(nH zZ_8l|Z+l+ACbBNnr7f;Ifl_r3yeck|$|bu#gB}k2LoD^5yWYT92)~a@&08ol(+xsx zv6(@td |nPv&Iw0N8ql7_S;m01vhUyDRXu8$f3{>g+oiAK)GB zZkoHjPyBRB{V%~EmD5;2EO?M{-BJc$bb6VLEB}ox|KoumEOak0Fq=X}&Oy!M;N?~l z8!)YZ4tj#{qey;_(@sVU@B{zyWn$Q v-Gy z1(^%HmL+-Iuvs1JauGt2Uybh+n!X~QTJNS#kNuGoF%oFt1tw)9cH>M>d$FVF>M*XM zvQ;(CK}&Ux?2Xdv7r=@`<+VhilZ~;Xib_mr- t=8v9Z3%J#%m)m_OEuGAAJGEr?oW t z9j-n&F~zv8QM@qY+`WYPUaq!?Nng}c`=L0GwI7k?79;S|ku#Ag*oljuXMRkxfU+oV zWh^#q9_it6673Qf^$Ip$mJ!_-j&52uHWYoEc_~uqzGdZnRlY^ki-LLO*@>60xyDrE zwCB``=P0U^@QZ&|ruHqp@f+viIBNwv3-yiVah$c=2Rpf(%CIv+*19?qq!> (qT$HH8c1d+wDbTcj2?I`%5?P5KQYL8LK3a_uh Xuy?lD{)6OIj}IngdK%E|I8SP_}J?a$I)h7o6&6B3M>_nz{D)XI94?$ zIxO$77-@^R8=7h5vb5`?YU(#UW@a|Ab)eFhU8jcwZWtTgcptl?YJF026o(H`c3jx} zE )gYA3cYJ*lw4_}-z%|YV@!HE4jeC#5w*lE zcYTt;KTAz&>GLueU?f%_Z%|E6!nC>0koVt`b5MWYab<6f*l&s>iW;SH3SSCfM(L;G zYLVBwsr5kh-}5YSUr2oOkjbVBa-S1$j(mDBeUKN)t*=o!?r&m(wC&p*I8!w`#j2Y# z1X2X^{W<7tSZG4YyyReU#4D9wq%G9ZQ#2RR YopsJfLLWN4%5|cuWxn0Tf!m9%}0fnN7y=_mzxRfZz!=g>*N4l^{-go~3%; zAcJm=p{D=R9)3vhh0WRG0j#!+{xz2xOWB;WB2W5BcOJVfQ2~f*H02&D+qE6+N`v81 z!(s&RDRgHY(E$3{WSa9GDA+As@kYB`;6XX3k0+g>hIRSWw%tZ8U}mzA^^D&vxrA8; zmYch>{N*4lx&$BQEbhl8>ulaoVWqLvJCYQhY{?AKy;q&? t!@vO-7{={FBs)!eId&=og(Y 1wGNOIAZSoJ=kEty-%C#AVKor4e=%M?67b{D}Ke+fL%4vv4Mdjc2Z6X~+&6!O26 znYS1D`EA%7xc5YMr~Tm?=eQouXmc?j4@>G>TQF^kDuqM5a9T$sMV1S*tQIu>&)jr_ zKBsUpG{_0Y7TL v@2nM3 5ZhY*9rm|cWRRK zdlps!AN>)CEg^L #kh&3dzsO zCnJAAPgv2q-ROU%D=@G?_C}K;i9|- 5Uw> zuHKcu&?9{}%XNX)z3Zw=aoF~(l?7PEbS(357xSus(97F6xi^SD+%9nc&ixXRy+mx$*JRvy zMFKIgL2(;6t&V-wAEhb+gLE`~&C5dIM0M~*i~VoN R;4JPOQJgxl^ti3C$1#gL^8lFh?65NAW!|!sN%v4|EN*z=Q(z<6#Cy5 z0CErio$tt>`TQ&yF#hxTV&0cnkmwJR{51L3sf;hL!P&LUQbt?gE@j`BJuO@IWhEBU zfI2mAT`+wpa>=~NZLx8$*rnbkt1fS5eKHaqn9B05f#v4D_;RW&l?7lPc#%Ogt5ML5 zPJPmb3*|U{BvtC?#rm-iZN07}+^pS^#iG}S9(O&e*8pA-?egFcu=$8Z6^3P-_29TW zFg`9Xm`F>dFqPKUL#`4Jj4$3Z53h8j^t}p8J~R-fvKO~)=Cms6BaY3&7aoXH!`n++ z!?lf=!|b3MCJP(gg1KTw-L8I_Tj!uMy~;SMyWIRemsjp8Px-A0)$VH?ZKO;?>$md; z|90oRls1~L5Vt>EFhL;u$vYSvi7R&oFVtb^S`&V7u;~i%T>uY(e`3C(=y7YU&}-{p z^jbKPKXm@PioWegX;uiBLCd)Rn}Hxd6O&lPN{uED9Jje 0vrGg@}1%Gu@AC4}svY-4cIebB1iHVJko+rT+`RaUs{_o^Xf zUmQDWv3tt$dt$GR)X?N@vC*F$5sjmlC+Rt}qA&Vx5-!@<2q6s4a!883!PDJGVd6Ij zQg_U5(_B`ma3=4|nna}IR{S~0H;|OJNH!qKe=|>sMY*^#5*HDSlZf>g53P>LpWcv? zI8GJ%)JY6jY*O?`y;dcA#wd#l{230~rh1!)0}gSMQK7URsuF!4;vVRAWx{;@sOXlN zLEfcbe&T^bY}Z$MdIiz$VW+cQ;$;(u&{#2zBO9CTDP5bIK~Ypw7gC*!A~y|_5=55} zIm;9*fLVXD=Val=+&9&DTzc!NM^1^pUB2|D+38<5s(Q3Ng`*Zt<7ZevIa(STEb`PK z9yMIeHroOZ6(0DJR#CO~h8Nd%mKPP_`K3KsH(>lq;|q$+2l2*h0fH;s1s7^EI0Y8I z>q(>sKmj$@o-|r_D-F^%X{X@*KSzQ1vP{7Sd?mV{Wi~Jq)YeZOGM7qh)QpGRY?j&m ztBZUcFRq01G+wV~X_xO>66Df@Z_a~3f5?9a%XZQH961$s1toI@N=B|*0#BoA7KE#W zQDW%T7)0myxW_w#pExVHy}VBxd4hH5%eMFQNQrg6$9BK!$t*cp#Kw0n{eO4}1Zk0i z9q>*Ye@Rp#Jc9@0ze}{~uCL)Wv4abPTWILEf}2|!R&C8@*82XF*XSTx8aE0geBkUg z;1nt)i|<(w6@yxgtMb6^1MYY$qw$Edyn|E=ISq1ZP5Ngd&5cSQ( N+O;zyR7J^NGGu+9C8dm{(`x^JDVhq2%p+o6?ro6vzB5;rze$;24A z7XQe7I%B<254+kSc8zCtjs;d7cS>ZLS%s-f7#>hXj{p_=3HfKm;1^>24gOd6H(17M zEUz_jA6KVY+zEW8@jTK}&YvP-=<;3f*x^*O570Iao8XfZCBb}zSz~8|CmVDoW$R42 zVU%j}An;qnKX%{8w$E@iM}b)St+&NQr7_H9I^AXxc(lRT?r9oV!Z-hb`t6dgw;xw) z(jYVJnssl(FJy2=yiz4*TN 1n#UX*oe{Qdx(Ne^FbV_5hTk!_{2Br|64B zxvoGbc}e<}M;hcCG32OJ&)a}{q{%UnfDX+9?~I@gE<*ofLHob1`ft=czi9hbpOz(0 zj2ze^v~@4s`ELca{m>eg7V;7jb@0;exiF|sy7`Dk*~M*78iSuQ2?kb4)J9F2p;w>^ zq?uXeaS}J2rE-L*P%`6G|2pm0b&j{1zgMmrGt?dMKO~Cw|58vbGM=;@8=FEtYd!~A zz#m4OA|=pk)(zt;O_^0S*$3B>DJ|CnyuOMI0zcn8+_-EYGGjJuF{NMSOe4km;hT!~ zk6w%N!*6@05`8<&|Lc8dNH-7GfbbCwr6IE7#5T(?Zx@ W zFKqS8r07f5FL&Pg G-?b$1nA zoozJL-)H;nGX(&U=}Y=$!HlpgWc6bsbmxEHuXR(F=6~zlG%*<@Tg3JKwi>6yoqS33 zJKA@e1`mrO7xeh+6GgU<{KGs`0xO1&w2CJ4o;X$_ 9PA*aUj>;+(UHT%Od_e18^ek` O0Dk2x<34K3oA0ISFBXcxsJSfZrhu*ejD3qa2EY-Bo@2pqI?qz#!d{<_NBSMT zEGx|&5x29ym#x*6!e_x6$p`=Cn~{;$^a@!SRb)AvYB=6MQ-8QJsLqJfpVZaZ1+1#e z$cfwgXMjYB+n(pdI7$D?Q4Tr3*+_W~(xQVEY~RKnx2BD6udqZu!v*6Re y1~iGMhJXVRhru!)Y14s$$R{3+#`VA#GP?GD9~uQ0U3k;v!2`le zFPz0UBBMx5FvSC?=CcUqvbN1!@8;XfpDYY>6_gTuf&?0TkDlQfW|i^Za94f+jLHuI z7dRWXzb&x7tmdWp2{0)&tuw4vXuB43>vGSxupRB0mt-DA5b-viYo5$)<8Y_`p~_x~ zo&C7G+MP Q)VIew z0{*UO6yomJlKSu}7_MQWbzz*9vs6bcev>5aF9P}#NMYb}m)AkOwep*9jj>(1H7LjYg!fij= zF}1z?`|ZdA?{hDDoztHCAheM~+`xrF?KJ5JSJVZZdO>1LpK|U4|KYu}(?1C*ls$mc z+^d^VZdDFjC!e5z(+2RmqRoE7(^|@Ktu;IPlzOahTww{6Vio6r#BM$qB;D?Jz(~hV zylr6~>bd{!wy6aVm$`?jgOP@oLeKNYI~bF*a#fy93=K}>Ew1NB7hnC(Ya@WmvdgE- z*ST}LTY>jtj$LLctDS@EuhzV% zy6wM zGKkbV+c LBH3iF8h`c2KUBJd7OWu zam @5IuyXHw=XuDZYfw+Q>prue5-U&_3jDeh#Z?GZ=Jnw+VMCC4O^R% z=bBD1ak)9me1-z->6u)HJM6M8H@I&Ntu|)9(m=2T&~Vk?RHoa>z2>?p0$RW*!W7pQ zS(>5Tu;;%P_ss`TZcoWvo}>pGNIZ_2jG}BobN^hynzbweyKN|@- IZ8F&Z7j$eKP{YSm|*nJwYI@z;>?T z##;WX zk|OJKc<@?NI%UIEiJps-&+nbN z_Uj*Uk_;->tCzIP3zL(Fs_j=Xef`tx;||i##2gG4lj?k(!2xsvn@koM4dCl*0@pin zU~SzdhY-avQaYGS&bDuHTWi^7S;FOYET6^7_WR27yq!1T_y{a4JSj%?HI-ZEx5$j{ zpW0c}5U}l7CRQ|@@ccbR3NHNq6TR1Wo7%XJ8Sm1BcZpA!;_NmApz*Tpt{38&baF%r zp3Y9Pn>0R1C~!ZCH1zQipXrn63RpyOlAD_-8yWp({~`ddlrEgUo)?wLC>DoRi7)N+ z@bMuM^}c$1Y6B7i#=K6aYFv(weBfB%-fLs!g*QIdN+%#@<$P$@GYM(o-im-%`F1kC znh_-kIY1aT_ao}P-ElvDba>Bur%0dYL>&w&*#%$)J}Yx7tKl%=pHNZ=ztbESl28?a zs6Ex@12FEbrCkah&5t|(S2x>?1XD759F5a2{aBzJ5O4hhv&?kDB2Y}_1QxTT1E;VQ zOaFP=#1Hn?5C^5?>EJ+9>p8}7P&HtVvlPGRr=wmzAT2C&{etk#gX;?mrJLXN1tR$~ zwPX_WGFY{(SuDJ37wdK(3{934PO;x=vR@S|hUq|`qdz5YP3cR4a@hmcZI|RigiI;1 zm;l7LAIJjRg&Ru)d;Rp^5p}K?PSJ}g{&<&akIO$f_Rjk3RtOGaw)HcF4tfrr5AQb^ z(3YY*xbm{+WrAN&B}`k@zh>Ew$p)H>J`%>)4Yy(Q@b PXa;m4N(6*-weqQreMj zZP~hXa&fl9H`HI?X&Tfz8fgX)-gDEMtw8Eb2J2S1_XS%!&qo(D;?Hy3q`PEfI}kO| z-7PP(CFA5ZZVt@p3RaHR{_IJSeF&%X-5r!hcgwCdhPOj1Oq&64?N@3w!$rhyrw-PO z 93-v?G*fn50wa zm_qnsS6Tg~?EW=h>g4I`2~sg41GHma|JzCHKg?Nw=CY)h5tox7s)GL&%p9!toMqd- zKsn8;+k23zc(4+le0^?QSA?IP*Q!pdg~xgJ*tBxI52%K>H8GR)h_E~dDBDo}n9RBT zFD|?@RPQ6&r3!2lX(W4%YxQA=iL^*tIn|J?Z?+$9y(LxeU+z3p~CY6?pAK!z(8a z?Ca}~0%?Bkcghtw%9-|r$#mZN$Uzd)-h>)hmY(nM#ZdPJ!5?UogGQ4@g;~03;&G^-+~?S zR)J1D(1=IT34$xW1F&C 2`pFF{_*g=r*|dVA*so6ruaiLn*p$+4B75G zrak4sc5RVFa(+`R1WfEI{{k=6++@z#yT2*2lZmGw5BLT{ir4%m&;*KAHCC=1%=#)(Cf{y9}A+GG1-My&Eh#&|d_$r_rQ_lccZ8c0-~ zv00KAk-JLP+`~QzJ?y+l0gbx(o(lYB>}{HIdPwLBhB@fJdf=CD<1`zd8s45kYdO3r zX2gF7dane_ra|?>{B0@uT5050nPV;Z4WLDJ@5I@n>mabazA9{I2#;qB&q|%aQFn>F z5L4r$x@{B^%=plHycsenv^LKU#MGP4!CCDSh^8HrJnK(}A3ynekWJxidl O3~|!LLe?pB7i4z* zcT~V6Hd+vaUG9K!{gV9$g027GL9noYhrvD)U+47q`e3bg@S3 E zDIsL)M#jlKp!)#zb@oseSSb+#?W|B^^q|8Zen73W@n+Sweu(!hlMT?7m-JYf^b@}j zb;sxQ^7yjARx5^j4N|raRLFL^vaAgvEC}~RKmJnaOD_1CJA+YLOzrH^tI}e%yimSy zb>GAM?$2xAe)eu~!yBv1bc%eCRlDjRXL^dJs?w^C1-uWB|HfXaep8Hgk_R9}tKUhd z=}dqXk@3Vtw-D7H0Pg_xBo3*0MaUepZ>bwq=rhhfLzaIH^xuq~xa<~YVij}o$C)7E zVTALEhM#5&3bK9UQ?dX2Ig&fz@c8}IuhN{M>B`nEa|*i$d`3spkw=;Z&BeLA=3hj; zb+)FqR(^I$E=47o%x=$auKLT8Zi}B eKtFv*v!AW(s89PXFl-m9YHLo7ShHykv-@-c7b7_aTbeyRsixvZQ%Jx z+E3>Md?D;jPi8?O4MfR`e4Rj!{OFgs`|bYYU~88HZYQ^F&bXVo>IQ+C#QtJ8SgG>H zQV8J!KE5pjW;LRuIR~Lx^QlU`xRmWP?qTuns;K+Z8&7mZ#HfO_gwuKL!yCK~wVDzg zP#*<0bH>JXw)9C&mKF=M+s#e;?oAc6WOi6mH~3jRKxmu>L1`^l8u U!tpLt;7A^3@d_hYuhBBL8*dgg*79ys8H-_k=Y5 zu<-OCw_wVBau>jX-1DSRc$>24Jni~2=tu!@j4?`ffdoiPqwMGU`t82Tl1tt?ifQ-9 zbfO({D9#&Y{p8q@1QFO0r=+{zInXlPRQ&(&Hhw@f>N?R^|Fnq2J~xFuJ2C4Q|6u58 zZ6)DesM3jC>vR%xaOh`5K9AgQ3JbseL%QvLHc*nWKRY=N3br0)wjf|1R+!DKRCm7A zIB<$J3)S6uo%U+AEo=UZJ8C$Ew--JWdn#VA&jZ^RcZfV*uQ4qx>M1hC@GV%#1UAM4 zn&l?SeNnd(tA2Es;1~M@@$7Bl=Sa`D#j ls=34cmu_J7h75sgtF`fBhR8E} zmy!ib<77QLnlq)mCr0rvmKp_Qxg!N`l{u}Jr6=32)Q&zK@iF;HAiO;cPkhBXu>#-z zM4| zI3Q!KV?<#1Y_w`~eZ04KGuP)bMd7YA;PnVmNHJ$8$GWSZv84%Kj>|*I4#+i9$caVu zGvaTGcZcC58U2^AUy`%L^PrQRN%P;|h0~(5NR(_=7(bxRh{!??5&caO1lBQx%m3j% z>o)NJ^Zx++H@=6vr=Y|L%!&X>mu9eXB1REmeTUiL< Ke|3kRR%5Uqfmvt2$dqxTHRQEI5gHSCteDwa&Cd<(OjL z3W|sV>YN^Ru9b~;<8Co4!~JeaMe3tbDWA2pdNe;o4`$-Pss248GJgIRo%ww*c31z3 z-c!Qmh4eYweVKjD$R>QJel8*nAJ!F-4@%*BDV}a+SuU}{zvr4mAMY2&w+HS0riis+ z9zyUTb8aL%IvdPSXR0hoZ9dWjvp=x1vv5FzWHyZ8M!M%zN67^CDm MXY8;P@p_f1gNld1+r#Rt<*8q@#-wit zO=l6T10=0EMQ4|#gCnurC@s#%i4q(_-zi#D13h~Uhs3Ne)#msu9m|dalJSy3B7kc) z(sWlihv=Exh4oujFMFq^F3?(Dz)4?}a`p6XhmrB5s!Mk{b`W}@=T0<3K6cHgkvkZ{ zk+Py b z`MlE#+v{!*=PFCfsjfb=kI&_fGXeb%@!EUSg3Z4vCIEUF{R^}3+=HwG(;9oquhsm_ zF9Y!&Ntw$sX()VVhrrg&@}=HA*OD|G5blLxCuVpRTg=Z-JddpptA1wilxJ>HpJV#S zSYC-8fW$F|Q7!FmK<~bAuP*sbkvE&RV(M(Lsk`S|8r@h2hG!r|L)v*EK)l(AlGfvF z^RMfX%a5v5S}vwMV4M$#`bx~jH3+se@^hIayL);(j?`_ll1#tvKY2U5iV<%Gywj2% zn6%%I-U?>^=} r`kD@X6rtf9qoB`6^b^#P)~j zhw5g(8;MTBFm{JSg?6Wu(jSzx1GpZ_tt!lRD?n67F%$FKA0p5to#%2kzt9zGlFoON zgj0#Sa}7G}77GFWlK{8w@C*Lkyb%t3@
y`dMA47mQgQ$`u>| eI^-%!m0^t$WPRe)uHf#Zd$t?71LR;oOe{&vTkBc#u@-*oUc%OD z?Oayl<)7~l&2P5wRjYQrY#4dji+pyM2i?(sz6akQ3YFR(xmbp@Q?DP!yK1D+#-NJf zwB$B2&!9^qiy7htv1vX~RMj=?7?H}Gj5`8+U2(=009;HX@y7B-;@g&={zq@bw?j{_ zU@sBS>pI(t^R(?SqMnk 9YKUGk0Gvz#w7r-v(tPten)%Rm|RBuVx()U *+%Nz=FvAGb}AJ9w*)oj*V08O-y;I%PpDwrK2JU_MB<2?es&D=hZKBVA93X z5TSApS!bS`*ukaIr+(uPtd8WG8G7!qlq}0$x8zFF>qTH|R~wj? zXDeyDl$~&TX*eu{pP*I rD+4|q;v7azRj2mV)8fk?+l9#8RNjmU4O?^z1 zy;D4oVOm4;$`P~YuNId8euevY?WoUKPUYW!WI%JtR*rK{sH7i6)m?Gn8v>_sC_cYO zei19Yu0P_ZHj5EhDR8FTXU yMUkqRL|s7jvSIu9;dh1(UZVnuV8 z4?0LQhO9UBx&@!Ygqgl7J35>c{|l;)tWq~ROneB|0Dv_h?DMmQxJY2^!mu}r+8{0v zjXz>TXF9)e_jCA7apw&cFZU-qJ7#S1Ke+E18|86MDc+GNwQUEMTofegXE^cm6O|=t zE*9p`-;ugEmt3A^+L7fscJv1*C@B2}kf$oc9SFx>epy!^SaY@=dBk`t2L!kG^SzS f$Cx$$j6MyW3($i!V+sf>j5)_jq z(MqtbCq+~&t8zUFv+~ZcL;7>D mGyQNV_HK?sW^WaE>vMnnmLIDJaXsx?N&Y>IB_rrpUc4uOc)%#drUNcbPW zMq3H&x%lx7;0QhnJG#;MerRvXnf $&{?$94p9kOYi5u5X<%Q2vFPo+5ihJNTpc`fNuF%7zSm+}gb zL~@k|E2Oh*L?rJ46E<8xkx~v;*SHFU4E@mwjzg~#eWngRZy$y%Z(C>dM~X?O)P!`1 z7;dl;UZuYc+Btj_>fRRL=!aFj!qIKGl-xih2O|2*aRHU~Bb^FH>09BSGE%JyI{Pdt zy{}AKG)5fK6(gn|x#pS|)`pV;f$E_K7Cd9zZwjZP?9=3@IfR2zFqMHHizW}kwa7m% zR_m0(_Kus5#k7w+`> %zMUQ2 zXmp4|ga@R&wSDZIy(xZI!L&cq8=0H!Fhf7u^i-c#6W{P;_ue4eLhVn$EX#olF6mbE zl6zal6}K@~=V_7H))|8b;$*8f%vYW@Wra}+RoZa^{MB2zn4TKK*5u6-b>xKtR4 j{U0Kl6E3sLK=)gief9<`=8s1(YrW6KQ*DEF4F;S8>`pD`!_eL(){b|`T-&`> zbH};AzCM8-j0&h+n2x4U{(9A~Is P^;1By({?-E0ODob*Ow7E(wf`Hiq8#G(ce2P6qEf5w@(k{fc}8WL8C# z+;b 7C53W$0bg0&aH7~>j)7sjw9z>le9%vKc1tggY1#IL#<9ZF^{)d_VyKjSr za5`JwN?ViMbPBiR7v>Nx^IP=4z%B#0f?r(ay>{ a!ji>O&A_?Q|4f^xgb=P9QaMP%<3lrkk zBXUzEHA8D-7&zZ96R GdFnfWHl}}J!R?J+{vJ9!8&^Tz* zv)y#yK7#PZy;IUJcJj%*v^~&|MxrPsAK~53zB${^9ZjDZG#>Tq0Q<>t%!Da{zc%Bl z;pX?tfWoom!O)n%@V@IgKWc3a-8-$V^0pPPSQ>u3&F0oLU_A%fN?q+TDl8mo1L4B5 zjQyEz*L-B6M4JY)VUeL(i>PANdedBbQ+v}y6*y%!vhdy-kU4>I`gv M-ChC+*#Nn|}5w4aJRXyNElWC=QptUQq<3Dy$5ah46j9jU>h z%aQXA>}`p+ugi_Pt(%^7SgY9rFLy$chQGm{!q2qX66!i6t MXhn%2XeA64B! z@eyOQe_5Q)hp?r5E%~n1OlM&v;@Nd!JkP1C@fJdI9LhwDSy32qoEraL4b%oDU0zwu zdHGf8l0QWCe09z*sNiW%qp+jok8E9cq{leRw6=b-!}%9t_#Z;JyQ}Um;hN-;8P3xB zQ;hTxZd9Yr7Z?4pn13WaEK!3a%=n4orZC2PITbL+hO`gnMik~OXU8TkHjX*<>-yd@ z$hBcre)A$LQ2S(xG*exsi6&CL!$=4={MOVPEd%7?8W!YIKyg3%p!D zu1uZ@EwpwRKiF~#bP`sRmP9UigWQaa;Rfq3pppjrtbpW0FsfomR4v!Mpyb!``no#M z{Sxxf#(dc{J2VNanqe+1&rjZa77>+g;WfXRWIyodOAQK$K{s`6!@K@IaK4DIFaiE_ z0w`zrGXQSghm;`)xeiJwI}!0 _uZ=oV0Bl(zq`={=iQL(3+y!+$6Bq-Ybrh{L-v z0rnfUqtIm3|CQ6@cJdxQHA49jNQb##!+8aW8QV>&!%E^gy`SJJB^}=Uw^`3VxulmH zH%}wE3gbG4HaeZw)q{9xc+ v>&Ro{=%?5@k=8sJv}xBzLKFyu91Sg zvtS?&?~UIS@tn|P!eP6^9b)EV@>lZnAc^`_ zw(nvtJ21LO@g&iS5%;3%N{^S&pne6Vw z6r;v-G1E=YojYzi))UCQ4Z;)Ckd|FP{T8;J;*1vX#5KLWG!#tZo~b3*!cR{bq%1{z zEVu7VvhIRJiB~r9egBiLl(o!gaR{d(*5NYZ+omk7pIlU~%nehym8R?PRK&cBy!&_~ z# )DpGY>r(4@8sDC2^7$_7<>`r zu^HrSrB01B{EA;met7iR&NNHRtFEo5BifU5!-4{G16`%=6konK~n;%F&z` zKbtTB$*F|fQjB(i{s$$uzb9R~f26tD2B+TV@I=V`F zhRGa*iWSE$eHZT4)m4v)JRLqn*4U|0*yQQ9*@O8c7RY!lsB{#e;|n4Gz(zek712=B zxiN)AS>fgSS$9oa8f@Dp8KY^6=ehfV@(w%BKtED`LiepX gz6bz2^5m*;DIvYNA7f^{$;=Zp2Lh)Zv zG`0O nf_`uwX=5&-jGE?!V6 z$-Z6xTwW8>PU9gltQ4|l-5*YRJSV*M>ew~R+x614gBZ-;D A< z-jfd9C?q$|=WK}!o+6ig }UVsy-zGWKFE{sQ5Y<&9VGtyLWG#%_m7D1#NhX z;YUmN8F9n`>qDQE26cg6Zn5w$#I=rE%~nns9p$qo_ztc&SmoZ4AlZr0AD O9cos^k!ZSJ&I@hC;Z9w zVk6&uJh#PM$Vglr;5opnZ`e f~T_%#NHoq!9D%Gm4WW9^Y(uP zy_NNI{qr*b8&IHqZmXr~m`BF-1ccj3@ivBqGC2y#lV;zB%|-e?-^bGv!W6aUJTw&P zGP8f_fYq=uqg=osIQ~2l|C4B;*2i1n-!>NX@9rr3&VkmgH=uCz^ej>lMAW;=PK6g| zUpm*W+Jc4&*n8~93XtSD0N}Y47XOmg_J0xyEf0&rT&%!EXHt*Wi+;*;7XL6=ezT|L z>Y@PrAo(-$nD;yuavHy- As8ZoxUizb9kHAM8@;*bFR7jpxLcS zQ`%qO2!Q@%e;ZVKjLh+y!hy(Q)(9%j=oV!p?4C9wD{ZeuF^xvy{cO~nuLj@m%81M> z=vi~uPrWrQR#e^Nh0N26O%V&h9q&ZtTDZHv*>d!pdS`irt`lByl6B%8zpp3U3$w$- z`arIbxy^`SKSa2Kfow+;r{5GJVn$TWK$!<8pr3W6rDWN3B&Cz>iF?#~zJbj9LX~N$ zCHEgfM?N?57+HBO5}ak0nu- `V#zW`or>`uBvJo|`Ls||ry_x!&A`i&JnCk*zG=(;atC#a zDuPsU^y9RodsYw<5j_(ZU;W?)l|Cg?Jn``l*sldBC~Eq{> @ z+5=<~NJ!FT6%xbEguKO>h{5| lP8Q@@qOvF6&DA=htHlCc!Rnj zLtwUzEWJ32y}V%k9k!7T#6k#6Zouw5Jb-cEr Ke=pNUs$GExt2Y0AncM3K-8a*YR9{xPh xEejNysG3ehE>fP|0M~(aYrW+ro zyewIMQ|Pb#rueXcO{|{{I1LYjEm$>}Z@=q08QxQGlAUS%NZ9>N(Md Y0&YU}g zK>Cx#9=YmgzE3e~Y2t5eO&s;cU!^ome|k)At46;jxy1>4%-W^te__As^@A!wpF}Ud zY-3DtQ*$L4c1l=2x|`ZD`Q9eTzqc9dS5EBTjy^yR$gmQvs%HcV>ZBWx4QK5;>aXms z-dWJ2Tz0%VUE$(#7Lo6b6a}5nEMJHE0pWN2ulsZ) nZ&??aqi- zN<(YVRO`I#R5#~Jrow!EKAx=@w*jAbjSyG5nb3h-DUmfVZm0>qou)Y*^RmJYP ?^0U*;Nj_@qnYu>?LgbN&$F;@ZOQvfA_Q!|yJ9xU%wlveWjFn~sz{?)PlexFS zU~47Q`KsKxD{NhDFjkU&hMtbKGEMxW+a~_${!uM~pV##-jF(6pH7uQs4*?fYihknl zv-F0z>JGmWnq)^`hslnz@&@1w=On{`ndCy~H8WPl`_0QsyPrh0SCh@GcVxY<96ie} zU0vMA>lwV-a1g7rcEm1v!slGu8JS2vrv=hTU*k7#D~Kg7%tMlhqWg%vyM?eBukKa- zl?4c-^6P$oEL5^Cw47-qH}d{3)hqA7nZRj+kJ!DPJxBY>+tM{umK^|vH_!se8*gXT z8xN@t`WE8zwCD=Dsom#HduJ|KLktNiZ!&L;Sahi;u2_)Qv%j_~EfVjVCCYsTLzm3B zOxtx>x%4jM&z{TsG}$m!b+R#vj{G>vXeVEwXRzesTa}`H0=zzy4f?d_dKtk=w1jos z2^(6yqRR9^@xIQq_a#6i#G(1wh1cnq3bi;p5L+itSGo4PIyY36T?B$T9>q%UMfPM> zEfi7RU8o`vTD~q&IKd7+5U1@3YMo;bh#o$??1R_LyyhbYX`WE}QzdW)2nA{0qiuLW zawFE@^kZhvAp}2Kt@7%(TZ^A^ZH`QJpAh5eXC7InC!13Ha=!&kF~P0lZR5Ey=~oKn zZ4^$@`&Op%W)7V)jEfAD<#DzGn;lN1pLIo~)0qP$_TEEm;odkHnoBhre|pdKH-*l1 z>{X)jdj#KDMc@kRx?j1`Hu-&0XjQoW%M2UQ_bL1;g7RNi6-)XlD7*Eb5fgYzm2ZgmK9 zidr-l6vw}=7ycv`Js%5sm_SNFC;XHh k2 dd#ei<@A&7iT9lI~uPN%TH8SXGF$bxE43|x_xiY z-(<}&z7Bx?#^83wCwh8X1E;S^4;|(iV=*knL+~UEc6PVw!qco8$gB6`;#iUk(S6$& z*O`xVePv*?nws~yPF!Z~#{{QQutHgu2<5fA53=2r(wCbXxeyv7pqX~+FT#zt#w8-N zq8FIi?7y~U2VT-2m^=7{$`bLCV2+XJyZKQ?#u=!rvt~Wmkxt=To$1?ILd#00j+a#) z*8#8h;2l8pq+oOZ#s2LcT*#XSRogM|eORO9p0^34YlMwQP<=T$&Bzvq`62m@yLV8( z*pY4^d;gIOeNcR%dL1E;7}5?eckOU?SF$cywde}>b_y0~9C{LFo%B^<^A<~-`{)(V z5nwLSsRx{G`{P0F37fcA1K-^;XW^D(5tMOk5yhuvd+YW03GZ*x75%Uqrxt Ld~VtT2|n)XoMnMx9$%kWImmk2 zIKt0qb}1={mLSp6e4rF0JORCm@Y?PIS{NC?Y>8J9SpP#A2s4jj`OA>f(%mL_+9q~8 zZXUCKNKnI-glvmjZDS%yhTgag9n(7W28-F`_uV6bhZ^H%85(z=b=9n-kJ*u~&XzNt zUT$Ir=J+wBaLf5ZB@MBM9foQ7v^hqW21wA6?qkXEc)no3_~tjE?8f4p`6^(z_Ymrn zh+FXSeeP?U_}xQmUwT${rZzsB3kdcCE*Ccic^CEis-7rF)HcTCWIBk}xY@=B-2oHN zP?eovi U{1kAm%_ GAQYQkSO$W>GoLConm*Vk}hwByQUKD*Av*}`C>ko&<7^A>2@mhS7L$J z`}KlchJD+ESo5LS{ZzDYT)eSZ_~70{bzcns6XI)Mv+g}?98{>t5+D|IpP|u%Nx>Z* zeaOf<@sHRv@@+pFYn4g+grg{}GjtT&SP)u@?u9%kODLNB+75Wp6&(cjAMK{?K=60j z>Oo|qXu$^PPoGTyn>{H-|L3*<|COEo8~6FI9`~O^(7&;6dnbvp8HlB@{1cLfeeM67 z0_urUBiZkW! f$4Mto_0fBq&IAM)q-2;G=RDOf!$ zO?7w{h-h+llDBO08NQyFFw0l7ch=hT=rd^zkG<2Ri<0uA5x=}5>yy;BtR~3{D#?`B zaG1-e{(zYz 8BmlGM=ChP%&yNGn&t`Xzc-hgjQdG)l%0E{= zXDJz~2PCLmDF42R25)8o*xaTkQ|54!u}wP6t<*CYS2cDt$x1MVooRNkErYjCj#f_C zxyYk;vWh5b>Z9?ASxP8d+gyX#1xvplLK)wC4>RITp!>U=WY1T{ulyXDmprPbnSD ;E}-XxCZF_rMZ%D!yyx`ZjF{ z>54b5_sN>(m)h~{>Qo)`JMZ`;YJ`v)cS%Jn7Te(B>Vs?erC%sE7!&v{k5((XI^3CV zcDrWM&GHQ5ORt;lu%E-np5()+g8iQY3SPVQ(uITGPtxiQ3|yy?yzw=gU|&LCuxH%O z$0265*l^s)<*>T|9naK TGoOee1tGDQ#LSXyj`frNm2vTT32`$=9i|QKsGnDEP z8qlI*{`a@&0M=c*4XrtQX?P5Ta>L+u5whg%TU+e0`dg5tF4_b$g6m=Ut@d8_<|bwo zvjZ0 {s zFs>MqP^>G3YsgItW1=LQzTe<|^C;i}4GNRnWyeAHrNiD}@ZUnhAW2s)KmgNGqrcnJ zWMJ*N>>~FH_NL+bRin~J=ocx~?jogM4o%LOw! OhKYH+Z^7I|P zmfq0(SAcf|&^PFQvBLe^ P`oeM;_~(}GK7UU+&(s(Dgt?$OcDs?Vq%=;g3ERfG;fr+s}e zw~hJ+&+9J?3pCFTefZ?AC`;kvTYjK!Irto=$U-I>ft$l9B=pp*;LMd4j<~!1SL2L! z6hjs#ofm)#u}IH37`OV3Xac(`{lQ`AZL=6EB9G_JCUx-bo{f_mno2A^H*W$oV#MTw z*&VGZ^M`ulG0x7eKAVUt*-7N%>N 4%l7=T1PaeEo 2=``lNg=8Vs-OS(VaLRFEkOx80EIVtB}?QFs6$C^g2qean2X0f}^Sx+z8o*XBE7% zi!+92Q>Vek136%oLG;H7gW7o%Q%&u5W3;FDon&YJB;EYh&2?J?^S32hf;CvJG4FeW zUY2X~H99)}f|JTjI<|Y*Oehm-Xoh}!tIZmsJ-*Lb(QBz)&E_%L?I0|%LpHuz_!{_1 zU2ukHso~q~gU^JfP!lKf`cqlsif{L6XX5Uyh0M}sVOf-#m*lKk4Zml}=uaxj3qHsC zew&Hc>pXIPq4cp;dU9#e)EWgy;Tb_+!{z$(`BrNdTk-YsAN{cHsma4S%V{@V9>qyg zwth;a;FjNLrl20H1wtF;2J|-sbAJMUEZQT|y0qpmi?{YpKAK1~pY{0}^{M%$P SgZ*|sh23mFvX=E@it YP$2k&aX_?!{_6>^g}@QJtZ$mxhX dj1yqdHW{$}l z#Cls!s%vSCr4)|u>muT_Djw!ruH1275q3#^(*9xM#lg{aB}CmFLiH610IrOhw7D|4 zf#T{YY{{KaE7UDgEt}PJiB<~g5L1)mj+paS4)q4gX5JP30%*Oy$atl4@|r)Z4to)H z-@GiF_Px?)-k4iWm9n9(2;1$bWA1ZYtE=Dqw(d#9lnXt*L+io%mdv{R)ZrPAsa`bJ zPXjBQyqDNea%x_zg>)7302a#K0}!>Sa97-HIEpD;cUa7@^;pR2lf?aUG0ZtPoC-a| z&t;{hI>_yS@s~vXgOY7JB233w$0V`eAZ|u(x%`B`r041b?z2V(oM)Dmm5Eq=LUjy# z8}Hdsk{X3&az$C<>Q(4kLJhn*-8AIwGxK(d2U)TCGPinCln%A(fZXiBVv`~@1TWu3 zA*~^&dsx?zHew55N`t8X{PS&v{0J8sQRy_#cRZP_7!VsLW;XA}8P37lM3D&H0+J@7 zo4S3n&^fq2f8v_lTwE8Wk+?B+rdHP*1T6vER?Of)vc>B&i7v-(<@s}#6fY&MXY*go zxyBuFMf0v|j3)*_4FL8qN ihD*+! |I4b1swv`}hUGa}(N)9owj!X^Ia=L|adGCWy+t8BkZTWt8J3(be2 zO`eYa+W~{%Uip8z(5UDBl#iCWPcP|75 0Y4gFKq1@v_6v?--#1qrZaE#c;s5qMCIid2nhrI9L-{`mqFAsml91JlpXZ?$ z-x#iHR42mzSpVpblzOj$s`}`2ht(-c@) `@?heqPUTgGM>%$ZVpHL+%8eX#9Wt=(OocH8~vb|9S%DEHa57Z%7tY#H|WGM++gU zlj=-$%Err-Tcd7*m~I>F!4SS)mD4j7U#TB M_$STXBOiYt&S~l(UVE yFZOSKJ?1!&EfI4^0JWI+fyncvtGfF(5yOCEN6u4kND68Z7O**piNcu=ZaT! zS)cgK&T%dRy;IVqGx((R0jqnw<7o3)x*;mn;6KWY<3lub@kvRe^sYYKH-TOo& z*ir@T`{P~#e8#q2ZKLISO=8IR(fnmky&8pP8U?dojZVY+59~nd-XZoPSqn$Z_~@u1 zH6rlcT|svK()g(NPIw!Lu!Y)zGQUfptoA5A*^a={X5kz8soE`XzW+{=M$^Wnzg`8< zkB{#ClOWv(sY18KGn4KQDlxi(-Qb EV^Go@QS4OYEP=H!_+q&|Am#$>5U zyiIhYWV#mfFA@f{3OAJqz={LCi>PyJ@XL+-Bz^+TJ7m7aq@Rw7>|yE5{WboAWlQLF zx|j=3Xihpb?k|@pw>JKDS_WIFCHFQRNXn9v%}g`iYD=_L%Xs@8A#;%Vw8L0a`FwgA zJ*^$%(XKRgZRa9umy+tC!?7`F`9FCn|GM1!^A{~jMR^H0GCY`rO`>E^-|a~sEvL=< zU<%H48Kjhc+nfz@hZ~Q7gIvOp+3ZM{)j+!k4(g0)Yr5zNz0olBEjs$Ug&Nq~go2s! zmnYnGfD*LgQprxsEH<%S&bZ^68vypyWp8(uo^jX-lIoy9oGcA4jb3=y*yeRG3=vb8 z 2GR$Sv3Awci=am9SY`}zf|88yB@}Dy+o7x9=JRF&38$Mk`@;v9SwIBKRQBON; zmGY{)N&RFNNPa#T$#rT7Ub*bec*f7kWCS{m!~q*Oc249^bUWS{fX*!>Yp-)>53|tq zSLz&e*%XW_Mt@L^p`6uGZ5jSaOY51LS0!duL!)7(9~@BEtJ#iAG8_t;8Sa@T@E0 B_j$2 zdMqlPtX2DFjwj;&l9dpN0Omx_eTs&JH?j ztqgeJwbJ{sF|rQX`sT5qKYtI|nb-LNh%gkTB@DmK5`2k}5X LOoWhM%`$>vtzc)-8=o9N_zWSCW7FYpi$k(~+hnO#j7CB^7SvWb#8i$= z@ asZ@8je)vPc4+k1to)}U`b zpt_FcctFJoG_TqpJpK;fmFhsA-(CRPt00H!h-Hu?Zy$abbq?mgd+~eyOSmradi&%G zfl4As__(NzzMAD_kI-nlN{3N09?7lc`s)~yX}6EFsJEp>85fKh4638PA-??G@)Xk! z>hoS1lIbM2J&hAKqC22WV@lANpBE1{tNo7Wfbr4foodo$w$8OSo3q=njs^wV%v~I) z{oL<)6Y*?ec)C9AOV_CN`2$1v1BcY)lJdMsM>eV4-sBN2B^C{jGL3JXW`UPfNcL2{ ze$TKiqA1AZ(AK H>eCQP 8C&_?5;{K(=1 z7Y~jPT|YudlMWtoiHJ>wJ=--^09zH$qnGi)6NduUqn;|JgY~kCeL1E5opWi^M&YQb z@%9N-d1A?HyB^YsSPyb7uSL(}(;JT;D^26@alk?MY#RjI5e~N6 0a06IMqs^WdlOVN?)Y6%}7A~wQ_M*}MD|>wSMe@X-i{nZZR(i3AknhBz zeM&`e5b{<=Zt3;xBx317k q(jTXSTMSpHICuu7!t# zY*|7RrR&Y^EcTEuKgKzLLFG?h=>AjMua15i@M_PyF`xVS&PwO_SmM-eHps($g#^23 zR&Ou-QUc@ -Msi XP|AaxmsPjTpr(QGk3o8 zs_wV_7E*&aYzo vu|K}2xv_i#)% ~R_!yYVFHnn-G}-d7HoQJornYwGCw$kC|^6dU36BPhFj z@U2m}5mlTJdEB#dwkO+nz)oIcdTo_RDSOQmLHn~i5OUIkrA=R+I% mp!@zfdcR*Ydm7QFIo)+8g}2=xbxZ|4^0Te=4M zg}vt0(+4E_mr_qW9}v8CJ| V zSl*sGaM9u?tz `z>1ch74VokqmuuWA)ixG)2?A$!6F<$bOz&NFhg7&V z4&j(*p%(oZM__o_o_nw@FwYswe?>maNLW1g*%$wYzlB904N8DH69d0ORlmC;+PE9_ zx{~keo2n}QgMU3lJ{o;=W`X#5x;I*IRmEbsaIck>hO$gzS|CNYzWdd?Dx2FA) z>X6-Idc>;kYl5S{;{LBE;(ugG_VWM$zS_#9^?8(7zuwZ*mQ`K)xZI1CpM zD;_W40>2S{I0TJI<|P%<$_Dk6S2ZBK2nl12D7d5)@7OrBo&i9OlUkp>Oo=|Go>c%_ zk)Nv*VQ6(B_(OONDL|BB6zanQZP^Rv&2?YkLF#?P&x>6AKZtMcWNr0yAtl2&OaSLl z>hdHIUGMG_Rh<|?Fe)=XHv6ce9)IaeN%f6)#gg6~(LWDHG^i~E+~WNEA2x2l9VBu% zM72$#6w+S0f2^+YDWeBZ-H`H5FJ}Knd}6U1o8c;%Aj~@U51XT%8dZpljbtg&jkX&l z&UGunuY4G1J5yfcm@oCZ)#ylxP84AEhwdNPciD7J>ICh!Em#6vE51f`Bd zIoswu%0MZ%?qyqkJu3I@*;m;#w!I_ZXmZ*9X!3zE_<8dKcdC2rEC*A^SM2L1v~ qYOrypFGQX0HT|6?=Xh(h+YNC zJoeD}oxnLtggkWhnwJtoBft4c=_voZ3-4ygh;``GNn*YkugpomTD6e^J$$6RRbEDS zrsvHfJB{i$$%vV1U2*)5 (A7+Jse=pTo_27{a;VD}wWY0N-Ehw-cy zBQPx%9@*{q)t_Jew?D6idcOIe{=9uW+2Vie&u6q~E*NLNGrG`-JA2nz>mRm}zxQtP zV(g>*Zw8#zdNWhF_9=DqQ+iEVx6=-(&3Y6J7n>HbpacGnUci5TIa_u;>1^=BYvOkk z*ouvtA;N@1lOgs{zL1f|Y5~s+4p#m5KprOp-^=2Wf*a#Czab3&Z1RzD5rmMM+>|pb z0z_ 2o44>Wqai(W$-2?IQoQ% o*{(0H|1jKizPXoSM^`Bz zP6Dw>=v^aYh8f&Icz$KOn}_QXo2i~l%TooF7hvU9ae!V!TcL^}bb4m!UegM-hZN^2 z U(iU zovb4N24FEZ68XnM>}kQ{atBR%^xj<(yOd{M?c6;wZo5^^s)pQ7vT5!`C+y~GCg;fL zRz#~RZ@n2F@pfa5IAIIiv2R?M8Fe~vK6b>PaF^I-t%J}df&x{Kv*!Bifa~iYnH07s zLTtx)JX={k6A*^54ps!wE|T!6l(}lwV82znD{Hovy823Jfv7eL&)@O_xuF>vDP#3* z!Fw8vU=v*>f`lw6Uvxtb+3mvd2HEApaU8(!{Q ih_1QCY^W8fbBt3zfy z>7UtwhaVmEHO~(<1toV}XnM}p+Qq3q#hd7?$t=NHlOcauIn!ZZui8aB(y@V_-Jkj| zg{U?^J}INC)1giq*(lwGOafn_hgqF^+)$nn?VIW)H9OnLLGHP+i4Mf(Ab*xq=ZqE` zr{I`JwO3X=dSqykR&r<9;X{ll%)QCC>92c#$bV*I<8-lgPwrN}mHZdSL4YFxm+esp zF6ou@SL``iwKz-TYM(uN#VYt30To~kKuUa`5pEaJ`F##C&h*@m$3f|tz qKc_-nIPYZ{t*@T#{@eTnhFy?mS~TLR{vU zPTrZGUaxKA0ZQJHcNtUhXXGtk RdYVo;bVUfpxv>`1S`Jf$T`EIQz}JgX~l(7MCU^)`lt@p$rH0$CV()<$VX}&s*2; z^f_TM8ZD+REq3w^w$~<$;Xl?yuZ8zsbF-4@(ZS#rvj-!a+PH4p#<`v;#>nL>Sv%;e z)(*No!Wqx`ASc~Ht >nL?K>c=#kC^!k?hep0>{wZ zf7oWz!?)&pH$7u!b~8frltW=a#R_%=k91vt^4$)Q>)OQ~we}6B-I_zH{H$>{0U42; zEZR_ UiGq*-sVc9E>L%nf{1F z{s3>UJhI~nI3_!<3_d3h#!;H|4+Yk0-0H5-WXYI4E%P8XJ#G1@ z$t7O>&q07sottkF}v`F_IdtQ?IR?gw+fRr3`HIP#LW_WB%{~|&jXgIYJ=p(U& zM;t7rti_T|jsf>e>-x7&q$wIc+vYEmaMXloP9|g?Zux(*7?opV{l9{FAM#&V>i)lj z`G3XIX 6N %6mpZR0Qe|Bpd`vjYz4}*Y Jm; z`x~T`Psznh^sQ9>4-U<94w+zW8;N-Te^j?ts_68d{o=NQIjd}2AFL2Iro8#Hwi;y& zzV^WfmgO}hzc;%%65`E%83_$y*ZlwDsgL}y!+rsIFMypt`P{H90KQl;`|*>Laha~- znhg`Oe;`s UuuIUD4A+cpnK)`kJh2-`s#zN968XEb zsp{vwxf^^NYa7+`*;svv^hO-WzJv){swXEFlQnzM>AflT$_2CeYq_}-Yx8by!%KTI zi0J)NdjZ0JdS7zKG5NKO4)XOM9AG&5?|K6-Gf9%}>q8l_f<_66#CJSnVkE)6(r;J% zXBxj8d$zH%@eiBW;1|2Y>?STA`DX7&!p1={l;x008?YYAyBeFv<8^Afb^2pB5&Z!) z<=6j9fDI|&&2IL~bvht86|jp>pPq_t5H~RBdDK^=>J%{MX>DYqL~stz@qV1t!q<6n z0k*LFlQ#k20zWs}ne}=RG^s~z>40ugLa+HJ1r3trbF#zZq>@vg8@Rhl8al=9wBE#V zT{%PRzWca$IeU|#mT)%+X2vI<^a-OnD|1#lkIQJ)U_5LQ@UE FYlftZZ1nzH7RGCUsTf5c9(g^Jp^;(hjj}4hG z4w QYmxs6ZDLiPD`ll(BPO0V&yQM_$gf1&nb z-|nXvaI6Rr-Tz1$qbC+((MSTCGhMItZw4xa7CRJ;2jwNjeSg)rx6ytZ!Hwvw)1v!K z8xDZ$5^*Af@fBnrX<4)SyDuK53j zzK!#J&XIXnD^^8cC92du#!V{-m@W8MbILshl-Bh*f93a_kGz{3LeMe zGLQa|HMke$B2iCiKd?0e5CW%?p=M z|Ek+gw$(-6GRlqXthULXR^3#2aBx)hV%|7@X#0pl1A-gQMSn%vZh2K0f}8@z^QLvr zIeh2qRqnYJnJx;QONlbl)gF{AK(y%#`KXz-#R7@DV;DlYPSV%X&V9pxL7EssK*t<$ zP37J?i3%=%<-D1-YPuQQe)h9;8dAnVeLc|I>{AimHn=x`%UqDmQl~3WIh!CnI dwWG+PP(f%Wfdb|7QM#48Cl>POEyS$ZijEiU)VD*nrPBcN4D z`&RYuJ+13D7}nN?1)`_Jd7vv9^-C$>P>Q=jmd-%5l38neo?BaMRcgVi{qAtq)-^b$ z0MV{5g8g-hgx$!0Pto@46aztG2*FW+J~BDc NF=Y|-7988rc5m4r@W?wgQDRAp(8EEB;T*U+ YeJfi8s3=H;er)d@ydte;M>#xHug%i4r-JH_aQvA5w1or^(6Q zG!3?@mcjX6R0n`v7S#P1T^1BHXr@BUZeu1r-_5&WJh=GNIIRnJ)8lRhW^H7A%n7qq z`rBbw_NW`v)`YaqX_y14?c#R Ycx27Aqx_9V#H zLR1>+UjQdST_VFi!b7Syi@)~dy*C%pp^vLxPs1K0jDj%2IhonYIJ55 Y;{nHWm}rx0(mQGSkH*%JRbhp&K(E`0U?m6e zQt^%Yu}|@hiCl|XoK2Sk>iLJxiWFm{AH?>?aU5<;2wjlJHq=Mf3o~S=4eP1(P49Fp zvtLRZpox4|4=$00hqV01{{=B66W7y5UGV#d&D8~wZ+(1g*Rgx9LYMUmMTdP9B`S57 zVs;#C=rVgo?fGM!t^hTm^{B_0pctXQSgS|*3t68xg#}0HBjnB&ZU-{)#b!I_)S=>( zsdPapyM779yu}vw18tY)hir@mE%P;uOvlr9Jp*q4{Ul)4^!$&{-_3_{tGZ*N1T1$& zC9 Fq*J{j?=Y6Dy~XTJ%AsdDJ=dwuew-0AKzNRJ4t>u6W8`? z#vB}Sakf>zZ#zY(CER%5_6eSlpBBAvyGOY&kzDElaWe6c@tdJ}X41Y}>eFY*^&)`G zd?M?VN7laZ=J1SBDei^BdmeRl_=`#ZiCXA@+p2)>TU=%JU4$-p-Ay4j`LA}F3dHnL z!cJZ*$#z?5-A5FcGeE4hgerKVz;>M{mzvr4B0a^0CnVL5E(4kBH%Y15V3*`$)@33l zSWlf|(K5Dg+lr3nbf$ti6$t!@TE&=#*fa YSlLT7782b zPyO zsac&?y*5YDF9~SnZDwgQgHSCvtpW?`{}R;iu;xUs8Wf`M1PZM=?{4;53yzn ztcM2C?iPGn5RwgljK%v_c=2{OVr|=Y&=6-|zEq&l$nct6Ptb}6{dG9Rr-h`KJ}r7% z%AwC&(wcjic!+a&hzA(5&!@OGfbEaN(bKA5Kt`l^PAH`dpJd-@5qZLT-!NRl=EIcva-u&(0^*c6;a zbUp4ZDQ|j+ag$P{u5_`2@4MH@2XUn&-d(PlW5N3NV8$W?34>5D+`Exc!tOzc3wSHF zw!L?^8UlP9;zS=EKpC38oR*Q1U3r87W^lhiuE=kFYwLQ|ac$5lGbblFWwB66DQ^q* zuLFnJ(f;aYxFaEa4A&3KS)zM7F$2{Ba%DScQPI;RJrLxHJUXGsF%@v8+L|@P_$$8;*gBFu37DJuRsdkLkXzt$B(;>jBm=<7Z@>8=jWqen5Wj)X< zzyZ?<1_dxCMAvCMF)mRu@lkM#?BS4BLH!XV^8DH7lhcWc!oob^f}UVd;AM4**v0c( zykwo}3QXi?W?k-D>^|K#M=hapJkeYS!-54#F6=DK>oEo!{xnb%D9PRjx48Qkxc>X# z0>9AJD*W_sV4z@EACU6MrPRbotEL}whu#Qp|FJFp0o)M{Y*DD9RwhwNK47?yXw({y z=8XFY;+p=};2=> OVRMJ?u*LjtyD0Kan~&v3_~(PFGce+!gxdBK zpyyVEMG8*VAFcpM9K;sjm26YE|CK%+4O-{{1N3Pw__(^nX=knNVgsA5dYDYV3U}g5 zg8YEe#djyJPmh+aX I^K_t^E`rReY#m$|Na*Fvjv}yJ}pYzFLx(nwsk%H_{@HS z%2`U=cUCkb2npV|DM|-AyK!3DnpvgRicXRwN;tbpVLu20c9R3?dzbC$-H<80!VhC~ zpOuZni8l@TcL w zf1{Vp{BXSGB|@t6!*_E1Y4bMp!Ji;<0peO {- ^~l{~0pei?^@GAgI (}i#I4@Na1_)t=zmal83;<9P66I1!$uIqh`Wqy(A=DDR z5#GO$LQa=~H{d TPZ zAlX!dFxk6T;0v$+PCR3XE`ECV@hRP`2;QhBe(&U)at|+1%X1{OXrO=f>BA&}{PFN; zGfIBh{+}1o9e19_>l6M9D$PK7v2*h;vmnbufvw4Nfp!YDn>R@~FFUj1`F>TqXgX $ks% =sm+3Sv>wyF9a=l#UNxZr8%uN`QP+yX`UN*C^QTlu z-viAWT*-+?YG1x@;+8I5JHMuF0*XpF-mgK4dQOOASYjbJeU2?ui+9H5g6{6)w{Yqu z7&YEsUS2Ra^eq7IXQ#zlZ8%R1;i8rmkjGnm3(-AdTI#8#5emrn46Z-;?P0hH631T4 zE6yf>XF)4?-*8x_mf?k+9MQuE+Z*QTu-E-M)_Zr23!Ie_BNz%YF+V^>8~1J1u!J6< z$M_P_Q$kJd?4IT_bI>pQ+s`a8+!ebF%HLe82z6Tj7^aRXSPUH9{RHe6L82iM(>N4} z;%Er0(Ow*^a6W;Cd-$Jzc?$f8p9$nd8F?0h-)~SAhx4ZmBc}8t1H`2o5r%PtS^=MX z_ANTpNC{<$)MK#j`5R^qu+~*<@DBJmXRz|Eg|-URqcv()T{}ScTL})vO^@Bp8UMVW zNkl>av)#>{ETwQpdOv>AQF5_U_z@VeEq3qB3xgl#z)UjblP~~)nIx2q;&KljzwiY# z%*9{+52b`l8{fa&3f&C)oS VU&Ug+Va-~ z?4C13sCKLDh4gMEmK0s%O1F;sJs>G<{pNcSOSzVYXa2IBC^DlEd<#h;25v1OU%66< z-^%Y4b(EOM{BX%SNA%ENY @k!8mNF|!leaH&yydf%veL60FytFx#uU63sOkAR3I*`Jdu^C)|It&k` zPBclVnOVF 0{XFi8G9;pt!cuGYoDi+|5H+`@9fd{#&f;kUXU9$_VQ&dtZaOQq>U6!C7h- )dVYBlv*r#k2`@WrpxnGxWEmF`k8?82oi`J+n1;wwednr}-L#|pv zrIscj_3p6Whj4~~XUGK4@cQ=|bgwrD*Xhu!sAi4z$Kc{c9unL=TfF>BrW2$z_@HU2 z{p+e7(e{(`%p6NV?AzP7D8&laGDAC4EyP&dG~nJ6DEL^0yQA$sQH!lE!iNWpZdWVJ zCqDa!?PQ%|$n^dp8XH7xBXUGTr8QE6VN%h;q%Zt i z5;?ldilIOx81D3BGDyI|J*bL0yhw_E8F>3qU%-xczZCA bdQ{NpJVG{e(Jd&s-sTv>vT-j9+=`J zVkJUAsq_e)D`>hp@z$VPq-!|(dkDX_qcXyF?5F>lr_{TyH_3L}Ks8faJTOE qkA2Pksiv{!?>}=iHsVV^2!C^ICG59U&hC4X7_WW^xxGpC5-MGWVt9KWsk5)+R6z(#4-Sc6= z-ig@vL{|PBV3nU(p_{1(f+@5udb4}3rr+Zs)?iUYVOrOfHbjp`FKrK$Fw}bIqPWJT zlW-3Y_22o+cjS~^Hp7sa2e$+!QIUFFRP*`>jL()*;GHp#RfLp-qp}f%Gtf<}lUwFY z`gU;lZjiRZ6QjVZ0UjNH*4nwVHqr+=?Dt6SS+v!vO> z!8YDY5v1#ky> 4d!{ivol~-_#>I36vi>uM zgV*GO$~ydVQSajF=RXEUj%GnT#&(XNDV($tDsPL*OD^)Naf9uyV7Y^tW=*2y@z-|3 zPBq4kTNwR{bF6;L8elGHVRyA_`X4sypNaW4Kf*J@Q}n#uI*;zf=X >MY(E)_jv` zi *`0%PyD9lX5 Ia=PsjB!7y`t$@;2wH<+Mp0mM-@Rle;Vg%A%0Y zrjn+v8=^*Bf)Cxlm?#@Jl{fe0QtxfY&41ApyJjt &FULHDC52K#?ZF9I}?3`Xv+bguB$Ele2T>Q_P!Q_B1Ew2bEt?kJcsc zzhK{Z_N@NLa;LuOu1IBD)d_x7c`YVyTZeTa^|a%axR5%iN5@W;N*kcCy#0FwGaH svHxij; >-I(x6P+Gp)V71F*XUzHROvw>fz z%IeO(U0T)4k=eROfy&!jJ#SF{d@WrZAJX=xsTu>B7HJ~9-NBA{x}(IVNASP2`;VQ+ z=m{r00h1gYcha0+=vxW=9QeiGo5 ~6`;6Qk|DlWgTp6&$Mrksc--&FYOk;37Z z{VyXen&`2vjZ52x1i7};SEspiQev%&MjRzwwAnMUhCFvvdv$s)#JhIquBOQETR|fg zY4DqvqtvrZgs=bNK$o=Br{yTmr&y^wlU2)U9$^?VMaKu4-|Y7dfVj9lA7Mw&*}T#X zd%u-v`3Zo`CD@(=iTKI&FI*Or=&`z= AR8B}pZ)bbl?9Jz2kQ_fZORYm>fx0`Oi z-*51>v2sKO5ED1(?68))DE32|Gk6H?hY@)fq=@TGN% o^F6v^8e_?FW zn`36CTn)o)4*xg}AJ_J-6j&nv*784AEf-havdco0Ls}rN`v$Fa4yCasyh`EWUbyT# znV_*9_sB9m)y}6B+G3MGtsUqm=NvXSC$=YZKnq;fmUYiJkv~{Y+4(l4t&>_go{ 4m7Pb~;rYm9-8=20_|lxwJ8sBjH*@(SzcCE64^W>~8xx=mu}1$TfSkY-adp?ubi~ z+B9p-ze6sb-n3Ff5~PS)L!Kuh!o&yeLuz94wkZOkl;~Hk{ig=s;0h1+bh31RIy{Wv zH?kZGcN$uNlf}jHU8(~oR+X2$XI=r1gp-sJ6f!`a2sK;{-Eg%)-79B