From 4ab402949b9b5bcf8089fd2b6c7dee01bb62c788 Mon Sep 17 00:00:00 2001 From: Michael Snoyman Date: Sun, 17 Dec 2017 06:24:09 +0300 Subject: [PATCH] Update with speaker notes --- reveal/what-makes-haskell-unique.md | 186 ++++++++++++++++++++++++---- static/unique/deeper.jpg | Bin 0 -> 14341 bytes static/unique/doh.gif | Bin 0 -> 14590 bytes 3 files changed, 161 insertions(+), 25 deletions(-) create mode 100644 static/unique/deeper.jpg create mode 100644 static/unique/doh.gif diff --git a/reveal/what-makes-haskell-unique.md b/reveal/what-makes-haskell-unique.md index e70cc66..07573d3 100644 --- a/reveal/what-makes-haskell-unique.md +++ b/reveal/what-makes-haskell-unique.md @@ -10,6 +10,15 @@ title: What Makes Haskell Unique
+ + --- ## Why uniqueness matters @@ -28,10 +37,22 @@ title: What Makes Haskell Unique * Higher order functions * Wait... is C functional? + + ---- __Haskell may be functional, but that doesn't make it unique__ + + ---- ## Let's Describe Haskell @@ -46,6 +67,14 @@ __Haskell may be functional, but that doesn't make it unique__ * Garbage collected * Immutability + + ---- __It's the combination of these features that makes Haskell unique__ @@ -111,7 +140,7 @@ useJsonBodies json1 json2 ---- - + ---- @@ -121,16 +150,20 @@ useJsonBodies json1 json2 * Need to fork threads, write to mutable variables, do some locking * Or be awesome -```haskell -(json1, json2) <- concurrently +
+ +
(json1, json2) <- concurrently
   (httpGet url1)
   (httpGet url2)
-useJsonBodies json1 json2
-```
+useJsonBodies json1 json2
-* Cheap green thread implementation -* Wonderful `async` library -* Builds on the async I/O system + + +
---- @@ -152,6 +185,10 @@ promise2.andThen(|json2| => useJsonBody(result.get()) ``` + + ---- ## Canceling in Haskell @@ -214,7 +251,7 @@ timeout tenSeconds expensiveComputation * Haskell differs in two ways: * Immutable by default, explicit kind of mutability * Mutating is an effect, tracked by the type system - + ---- ## Mutable Haskell @@ -243,6 +280,16 @@ let loop i = loop 1 ``` + + ---- ## Better Haskell @@ -282,6 +329,16 @@ func printScoreRange(results: Vector) { } ``` + + ---- ## Expected output @@ -292,6 +349,8 @@ Highest: 55 First result was by: Alice ``` + + ---- ## What's in printScoreRange? @@ -304,19 +363,33 @@ func printScoreRange(results: Vector) { } ``` +
+ Actual output: -``` -Lowest: 22 +
Lowest: 22
 Highest: 55
-First result was by: Charlie
-```
+First result was by: Charlie
Non-local changes broke our guessed result +
+ + ---- - + + + + ---- @@ -363,6 +436,8 @@ printScoreRange results = do * Concurrent data writes? Impossible! * We'll come back to mutable, multithreaded data + + ---- ## Mutability when needed @@ -374,6 +449,8 @@ printScoreRange results = do but they're __explicit__ 2. Temporary mutable copy, then freeze it + + ---- ## Freeze! @@ -432,6 +509,8 @@ runServer (|request| => { }) ``` +Looks reasonable, but... + ``` Thread 1: receive request: Alice gives $25 Thread 2: receive request: Alice receives $25 @@ -441,6 +520,16 @@ Thread 1: set Alice's account to $25 Thread 2: set Alice's account to $75 ``` + + ---- ## Locking @@ -466,6 +555,8 @@ Thread 2: try to lock Alice, but can't, so wait __Deadlock!__ +NOTE: Typical solution to this is to use locking, but it leads to other problems + ---- ## Software Transactional Memory @@ -486,6 +577,12 @@ runServer $ \request -> atomically $ do * `TVar` is an example of explicit mutation * Alternatives: `IORef`, `MVar` +NOTE: + +* There are helper functions to make this shorter +* Want to make a point with the longer code +* STM will automatically retry when needed + ---- ## The role of purity @@ -505,6 +602,12 @@ atomically $ do * Other side effects (like my bank account) are disallowed * Safe for runtime to retry thanks to purity +NOTE: + +* `buyBitcoins` needs to go to an exchange and spend $100,000 +* Due to retry, this code could spend $10m +* This is where purity steps in + ---- ## Summary of STM @@ -549,13 +652,15 @@ There are two problems with this code: 1. There's a major performance bug in it 2. It's much more cumbersome than it should be +NOTE: Kind of cheeky to hold off on laziness this long + ---- ## Space leaks Consider `let foo = 1 + 2` -* `foo` isn't `3`, it's an instruction on how to create `3` +* `foo` isn't `3`, it's an instruction for how to create `3` * `foo` is a _thunk_ until it's evaluated * Storing thunks is more expensive than simple types like `Int`s * Which values are evaluated in our `loop`? @@ -568,6 +673,13 @@ let loop i total = in loop 1 0 ``` +NOTE: + +* The bane of laziness is space leaks, which you may have hard + about. Need to understand how laziness is implemented. +* Explain why `i` is forced and `total` is not +* Builds a tree, lots of CPU and memory pressure + ---- ## Explicit strictness @@ -582,9 +694,15 @@ let loop i !total = in loop 1 0 ``` -* Needing to do this is a downside of Haskell +* Needing to do this is a downside of Haskell's laziness * But do we get any benefits in return? +NOTE: + +* Can be explicit about what needs to be evaluated +* This is one approach, there are others +* Just added a `!` + ---- ## Looping (1) @@ -628,6 +746,8 @@ for(i := 1; i <= 1000000; i++) { * Getting harder to see the forest for the trees * If our logic was more complicated, code reuse would be an issue +NOTE: Example of more complicated use case, writing a lookahead parser + ---- ## Some better Haskell @@ -642,15 +762,19 @@ let loop i !total = in loop 1 0 ``` -But this is great +
-```haskell -sum [1..1000000] -``` +

But this is great

-* Doesn't it allocate 8mb of ints? -* Nope, laziness! -* Just a thunk telling us how to get the rest of the list +
sum [1..1000000]
+ +
    +
  • Doesn't it allocate 8mb of ints?
  • +
  • Nope, laziness!
  • +
  • Just a thunk telling us how to get the rest of the list
  • +
+ +
---- @@ -671,6 +795,13 @@ sum (map (`mod` 13) (filter even [1..1000000])) * Easy and natural to compose functions in a lazy context * Avoids doing unnecessary work or using too much memory +NOTE: + +* Never using more than a few machine words +* Other GHC optimizations avoid allocating any thunks +* Not covering that today +* Mixed bag, but functional+lazy=declarative, performant + ---- ## Short circuiting for free @@ -704,6 +835,11 @@ See also: `and`, `or`, `all`, `any` * Also, some inefficient functions still available, `foldl` vs `foldl'` +NOTE: + +* Generally partial functions are frowned upon +* But they're still in the language + ---- ## Summary of laziness @@ -751,10 +887,10 @@ See also: `and`, `or`, `all`, `any` ## Parser (and other) DSLs * Operator overloading! -* Abstractions `Alternative` a natural fit +* Abstractions like `Alternative` a natural fit * `parseXMLElement <|> parseXMLText`. * Able to reuse huge number of existing library functions, - e.g. `optional`, `many` + * `optional`, `many`, `foldMap` * General purpose `do`-notation is great ---- diff --git a/static/unique/deeper.jpg b/static/unique/deeper.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bfd3263839f5a99b27f089f0e0dbd30086fa368d GIT binary patch literal 14341 zcmb7qWmp_*v+dw60}KRrAKWdtTW|(h{&io zXs9SCsQ6ge7&ycPq$I=yL_}m%%(P?_U`iq)Iv#p3D;p;#Cn+tT5HGtRGY2R8KR1Cw zLPA1CLH&S+_JN(8h@AcZJKhEWKt#YER3Z!%5C9E?f&oIk4FL!N04TWkWdE;#f`);G zgGYG3i2wdG{)zwh;@dg^6$T0bjR}MKzWl(ooFNcBlwNzdHA4g3=7LqIIykxz5e=Q^ zVoRg9#OF+HXZKAb~RY)<2j+lVj9&U~Fq zuvdt=CXZEY0D)Cx$SBmYTd3CQW_N*sH~@+2jo-aIUYA+F*gpGvam7vM|2@{*E&b6P zo_$egJJPDoAT6$k#~f-n@*qUSaorb?Veq(cd{la7cQaliDe+zuC<%?ZLvwZ?5xMsw zo(c9oJF*y@CceNo1^??v}SXeD+3#7JiMOTP}VRv_rVS6z&o3m(y{rdI3m6+VvVFiz_&& z==e^OE9q<({Y&Bop_xEz2Y^mg0sxmSPnuH{Q_xe~LIkDL`nWckBI{dWv*i0nqzPXYDooP$@d=K z4I5{NYKm8Ez`4PsT~lfOobZ#S?pC!iABYwvwm#E54OIQAz}}Db4YL@T8VXblvY57| zqprn@M5tTIm_N1s36@M38UloY%)<3n8?yYsHQPE&bf=EquYCI6YQMg>D{%KCO8^1% zBGjKgLChis5Xt7~p&U)?A_{6h=B~=-v4?^riCTSbw7cUJWBW*%3_9o~X|hlKw)6d) zeVwQ8oD;O=0qwpN)YZ4tWl4^ zr``1k1MU1728eG&q23!nItdH_s8|GwiYWwvV6j30%eQ}yjyIIUIi4+u_lS>}%;&%I ztI85IWeZIA9!B;@PJW<}vcCSQ9O0uo!qYra`j;fA=c{s9*BAgguvr2+v;qejM+`#M z=KZj6`+P6>Tx0oo41cvjD2I69*L3{J?GVF2%_7u|0+7~uc(?Fm@i$5YR832I7FzrbqY+(2?tM_-a3MN*T*^^|C>aQ_a0F(?! zT3U4XQQRE;g<>&5qSDE)woE$}*NmCt*;r)ZaD}D*eLWl;nL$p1*OOaGjd%rg+c3PX z`yokTU?6~w9;*8I&e~f@`|k{sLzX?_%NjeVC5_%YwswzLM4~f3^>OO`%Ygd{Pd7oI zzUP$w5?r<#oX}ZYg9A+lAgjU($tZvNDo(j@T=F9uxqiy8E>yji#&p^FF%WiHKacy{ z`?FP{G>@6Hf3IpS2&Vm0LxMlUBH!AOA|6~(H zGf3Ce6uv(fwu)cZugl6(t!fE9_b5YLBZI9m%C%NQ5=`TAQmP>i1_9?!Z#U-~Iebir z&F9w-*Pa%`^KXeW*N4P+vy(QXk)Z*ABD#+@KZv)ovmiD5cgOU-o}ig8+j>uZuEW@M z94J!GRbG=afla5kTT$9s`pzUxP2+j%hYJQa4wdSrt!9}4D#LF@XQZkiPOo9#Z!ewsoXdpA`7T~)fi4ZHap8t z7j7Sxy;EFmiMeQ6*y-+N3dp^arLSx})AQ%v-H_8j zH%pIW`Fg?X42*0tElO~CcyVKVbxU?g`yan;oBB{$EU#64ob zr}rW)*}w?n;=vuEo-%fb<87?4W1MdvYUgq$Nbnfh#BDULPCn?gS|jMCHm*j~wpm}I z)E%4w*ZdR3Ia`q4M;ga3il(_WPK`4qr7=eer7_2IgD~};#?r)~*4ob##mO|=1+a#~ zb@n*w%VT8jEz#DF@W{+eeiYeFtMpW*9c}Rha#n@ypA6_f^vf$T*t`K0hn{>tx<30; ztNSB&E|_(0jzj(lMQHE)k{rQ~vw?{r^^p*4# zVF=+VEkKGRt}se%Pvnt`jTE9`lO1V6ke zE|<3Qpnp*s3urE~Ew^1bw3WCo!bkV(&}ENt%KBlYOVGxpd%BYx--JlX2&nL2UF3lC zv~3w5)hLJk`$H^O5)LQ1!g#Ms51&;N7Z($Sz*EBLae4l-)K%C}ra_l7+SmISrHeA_ zpn2)#4RCmz@JInh%OyUy?NE%e*S_sB=g`%?7Fu|&rSw>t9LwVYG%xeR%v#c_xu%yt zdUS^_jFrretZ|kGpqK5u-V+pjav}$Xg@-C@yXjtpZKyZ3Ub5o>R8AZvg12PH7d`W_ zz8w{_Cj2H%7|GPuUi67Eh3eRhC}?t>OpLAAm_$KAd|YPBqUn#B6aU2b#9Z0Gg44Arsex%7zb*YWQ&(BBf3FLkFxuwpVe-_2-C z?R8Mw85t@to$IM9xrMuaC{J0IBDxN#q_ZAJUm&H?6#K?#vtGG1n65HIBCDUt|KUay z_ilc=Ox-|Pw0?c1`E>k;csW;C9Er;%_b1rdx8Q^&oH*$*!48#1IVY|f5B-JmfQ5`C!TX8tS;~Au{N8Ql=*kB^s1AFj zeEzKn%%=;To>gH?x!~Zc{jmrYoGXHOp^6M0q(($jx+}m8B-xc zO2)k~Q1*_>fB!fvTb=X@!Gq?f3PU*)IqxsiU!V()g=vL1K(bcFuU3~yp{BZQmgJRk zRi%l9WUVS+dkuNoc8vv&alBtUEK~Uh=$OYPx}B?%GA^&gOO768r&PJzo+{n8nL7{D zf4E$;t^6shIJsI4(9rGDfeSreRgR)=8-hhJ3$n27kv^ zQU?!tsk&ItatUt{vTx`3wsMsk%XVHqBo<|urIEIJ{EgWoZJU90XI0>%CI{I&2mf9oJ-?Kl1QFWr*>R9wCeH4IrBJ8#Ku{LSvug}dzeLl9%| z8jjU>XpZFeR1p_Shp?ycqxom$NdGO*xSI`s64SlUXZen#p44s8Fga<@_+=rx59zZT zUyEpB7}0AqmLsb~;U%*)uy0rsy1} z&l9!AMe^&>3NyY3oiM`5#3&ES@8C3jhv|CDYY;{7tunFuz`e4DxKq!<(kImkvg*GS zU(~g#e4J%{%7Y8Wp#z$btr<|jFV$8XGOUFb%j@B0HI?gLGuz(v532DD-=ZnMC^03C zuF!gvV^q?1#URLwAMO%wYzrdur3GJ9FmXP=2ec3Xc5_ zH?#EwDriA{Hz2h&FZcKX|0~jy>L4Xij_SgbgD?`!H{`%~^E^M0(OEb5tB~ksO0>6` zsYSk}WGd2BJXM51aJG!VW_u^X*YM+R{DZIW?UwRg*h53Z0N%AZ%sct{C!nB#n5-~Z zWaMljq7>{Z|F%~cC@5j5mrK;>j~GGAbn2=f(TgMZqL=S$Dv}M%FDR!B#|1rpj}k?Y zH@zBW)FM-vK)(0T$kYE0V&{!mo7toEHK-UF8?v&rh?g}Cm8bU#;z;-t`I_5@dt3^P zqoB&7H$L3`6U7no%qf0;X!rv~cYq|H_YEK+pXfpwO?Sq-7folSG6m!cN z4_3vo%UF|Es}z$oE~-a0gzP7g7hhei`5HvNMkQ0^0i$%NdW3;VG=kdO$5j+m0dSQk z3buorEya|H2Q)&s!WaW|sZtTopGv}t#?GjVh0SCoOi54nsVRoTzmFOV%Hu_GH2Q;M zBO8;&Uj+@#W*a8x(V})^I1G7<&_J0=F%08UjppdW8NnKq*|d6G(Tp2&mV`s&h|zo$ z!jnjzQP<+)k;@t7QCRpCROn)c$?<${LsG)HkkuZ=y!hdChJA1ZO?#kRF5+0bT5tF9D~_#KU|noD^hA$Jn_J=qY2g9!py?S8t_R@|a zEu+3}qM$n)2NzvJydYM^@x_tLqysA-*3c=d#FIA9dE-oUSHePB9zG03WAS~Af3KWu z4`t=znLELNV$#kV;EPETeY`;>mZXEW%zH6`e{;=Br5&*}Ka=lKC!qNyV>PkW$Qjf$ zT|JT~Jr54`0WpddB39Q{FFc6C?wl2?FI3-=%K8sfVJTFw z*~R`vEA&5T-8bJ&*DfHXO&Ry=iA$fM&4nDadGnx~q_CvD?|#%>51VllO9&oc49A`L zHsg0L(+4Itimny;L2zp3+V9Iz_{hT=O)fNc?Shi)-)zifOnA_VwhgnGG=>LRdog3KLW&xLH4U#f1_St^AP8-a4{{z$SLcY*B}N^& zM`CVK-iYN78y7xk{Nb)C`srtw%R9=2-}MhP^t?x+5*{&`nF@8Sm*n}S_b#n_ol z#5E|Xs1b)ltbdMD)g?Hz7*1Tx#I$K3?ypGAW4_H4;0=hC>tZWIut9ak~;OsSwY?e@Vwc$cE;*jTNR~t}F zT1)zka4U3*jBug&`@=RCDjLnvV$kZ??W)mjS!|0~TX4s4cZy>d7%VIq+U!({j*OS= z$jvo?ahSRU<4_E%6-=(;VQnOmW(5{g8-qdix?ni*h-`C(#j~Ymo9Ovf)JWs(Vi6G1 zHMuy=TJkmnAefvVh#NkkmXa81BvvPJsPe&nv5E-(V1!rH&AQ8I!mFaT8Y+o_pjZTl zQi4Dg?qb8nLItf=U#GgXRXp^Unr$bGNyV1j62ltxdBOPdg~4c!L#a)gU9um%jmcW= zglGJr$HC4ql*vLY0xS`g`LIxJlha>YM*qizdt}D1Lo-_7<|~ZksC31wUPA7RPXe#V z@9O-t%U^;{KVivNT%KVt!iqj_dj*5NNiUz$ID&hv*&(JchW30jXAMKO=r11m>dQpH z;XTT2`;zl?K{C+z;4DSMMbF=M9QA5Q6q?z1NU>G9sgdj`^77omhDiI=`2d{anYmC`7;zwB&jEr8!I z>bZX5W#u&B6n)C?GH>F{VW^sd$)%Q4C0bQjUS z>2X)aXrVL?9G2HXH7fir={lM~>_DWCk98{qp;PtWyq{`zZ6XW znw;mZu^L7l++4GiiEFPzr(9xmI@pofIH3fqVhO>4@urR*nv2pIHqmUnvUSXWOh(+1cxYUnlIjmSD$)Ni2fb|Unk^@?x;#-$j0$gWDB`EYBoRK_G(62{F)4#iq4dz8mcu7h@Oi) zx}ggJ9XPvxsFtOR%2GyV(;2n}F^m%b)LwXRG4z-KXeek{xc5Kt{?lRJIX{q`4fDOV zkg+=d(^>kju6O4|{>NAoCNC_$Qog}{iP$5J^k@4W>Za{9=SBIT9h8Q~6{^&9MQgqj z?jMU4p)86faK+=yqHZ9;6{?!UPyYGDUOkwJT|YVQ9K+>cOz$UM+{rszA~m)sH%NZisBN+{%nmxJt7%Hb}09Pc(;59QwdV?_`j3|2c$P^|X zG3S=R`%AiL9yIVRNpBFyEYOW}jZ2Vh|E;;sO-qJP-oqjYzSzQkGuJ&@Ug(@p#Z{u% zq?86p4V(BCPBV!LWD#^xWGanL*$Ia@o^LlHN(i|H$}+~;!m0l1c-G6zU0zR6R`qg{ zt$%D7XLAdgRfUKgeJYoWjGVyHD1bcDFgM{^)t)Pdng4zylHudGXqoaZ`XjMlI$g|C zBpBWll{WjsFTEnLgRK;ftDjeJHCdKQAu0TNSF^&OZ*|Q;voe@>B1Mdb(>9_hpqS(E zC7`2LT_mqq2(3DbC_fLF^>f;!v}x^SIM60{dWADX4pkAWSS-U^9&rw$MXFWx4Z4~% z2pabfzIn_nW_Z*~HY*|dy#C1@L+uhr*Q6e5UFjv#EG^PdvMdgMJ`%A;l#m+IPCgox z%a5YZ;5sBHTWp}~Ic@gd$J{S};p8OBe_#Y*T&cY)t$lYcr^PKaUBn-exxMG|FJADk z&_-ozgXWP3VU02oGGP;-8XXE1{ytsFl)N@ z@?l4%&adv3S5&VATF;Zs%b2qAVOolqd5}hzDF~|*3R4aFzepsPjOkHO({ifQ z)r-qlo=W{rN}Z?E^;K{P7IO;G9}u09%&UAf&6tR{%T;c82_SDiw4)9fom9fHCAe9H=E(pY6xsR>DFO7;oOvORf|&0?9-P(`pv zMxlE6pVnY>7}o9H&OF#Bs`;_qyPB3SOlTGC`txw|N=4AbQAu@Vhh zTv<`X1=(;K_f%f6zELsa(H9vIvPV1rp7pGGh@Pk{Gqy%vIMN+ErK1PeRq+s&DR@9z z-L0-ZG_^rx#}M6%#CwopVKN{cC_un5;+ z%1-Rq&_!6*b(S|kP$kkQX)Hu3&2p)dD&94tiYlx;&u_tdYzx6%IC^r;@Dnm@)Mt!n z$3Y9qG85e?KqB>Xd-x$$n79avIP&F1WmoEo@;3nb2z!)7(K4cnEcdE<(=r?;7k|3Z zhxxVKSgg$oMw!G-ZIv)rV$}pSZ^B`hR4J>t0fL;+IoTOiui;8b8#BK}^3Hw%d{3sG z3TNWouN5caMXl&JLW%38$hg>ck;h=`B3)z>Xdtj%y0Y`ee~vH9MfC6J32BS)Il%>W z9hWtYxCe>~y8GT z+cXBr6GxWqC$}Ki#Ux{5VF-h;)u>g+lHwqB;CA0ug!vU#2pcG|Q87+(356kq4&AA$ z(|AW=Mmf;a=E*9}o^gk|=jE50&Uy0A}2Ov zQ1Hhb(ukd5P$;^V&?&(Seh5Y+H=6RGd+I|>mtQ|}+eu&`w)0Yg-wV2xdjssoW?jYY zg^tEN+|rwy$y-%4T1wZm!@3}i`=&E}BbS}UA}OU7gM7tx28-RkA}F|nlA zvC4gj9+ZS0PakfI3Nwpol$`Zj*m;GGXD0{aUx`->tsoNPedNtYR;Q1SA<`{EnN?*! ze!Wnlt_qtj_~D{b%c#D=p7bF%!9uN|yW{0Njq3XYcfjXyw(gFquEtVBcWbplW^)0@ zH1*|M6~5*58njyPvP;Z?D+9#t4FJdHD^_~qApQ!s3YS)~zNgUv2sY}i*}}aWG@L`E z4s)Az+Z;};bHakK*x=JUdP} z7)Oh6Vqz%VZpmO(+Z+`c$z~({>L^zZFN0NGTik@LP!dsMBMcZzhkU_KFi_9*gwq$5J&tf8a@B=-oG#yyRQ#??K zb!Ai1h^gF^&NOxizDgyAjr=*4A$S10nNe}Ju}e6hY!SK^dV+n%r(=tfg50<7@#JOa z_)1Jwg>Lid2Tet>kR0#H5{`7;z!!6k*?dx9!n~B!exsUEq&4KadC016h^vO2+b7#7 z@fo&dV@%#<2%FKmachMp8Gg2@nvQU&uViXxN3qKEr);aTUH4+CZAF|qbChx2;~{c$ zjKVAdyzX$aET^3XGEp4kcR58VG#b~ zl?)r1{D|??iWA7$do9)K`VFQ>%Wy{-?R?5^Z1Dd!a8zwDT7WZ8WnEKfS=upFlJCuW zAuO8mODQq9c7}_14+x%IBX&2!rD~Q%g+~e|_Ke>s0O@D=A_M|1KNspS%wr8!TKCVR-3d@RO@KGR zehAyS>`)Q=T|466+>ZdL0;)~NzN;YQNm}{hLxe!;MRys?jQ(dTr3d9d(#Ugj1VIM_ zEIQCgDY86*m;A6?-EK`iN%RK088d6Lh|pD>zePTO#r9VV7tJ`a**t}gF_W~}0c3I# zfAmMP8fz^k`@-$$sFekQlk3iPW3tJk%8?68L45rdK6`l?`x{~PDHKHA`XyXf#2Wyl zSlH1QD3+Y~EFu+}wl&_+4;RGJ?!+-Sog+dS7TpupPBUtJPt}2oU|SwF&-&o;;OwP2 zuRIvl#om;B>!Bz^reIu4#oc5dDT6F#TxJ!hQnCoZFLmvV8mFS7(h3UG#4LTVfX_=H z+w8eDOIOGzQ{h(1z$HkWm4#53G*&2&Q*4;gQS+LPHcSKs4&{Ne54b;e6RK?JrXNpV zkil;#Dp~tDb>!c@0iGOXOvLRZ61RV_{*fx}8_}c6p{}hA0~+%O2UzBaavVzsbRV-c z-BDo;#H9m!l8tnoH!%?sC;NWdX878!$k$$~HxqANQsg36Uy8IPUpLrY^h4>7KW(n|$V*#aw_?%f@w-T>z| z>WHL#+5Hz5Hy4-F%y6EGOW!qTy5OR z0CUb7SB?Bds`XNxiNU>?79(^UDN7-e@N7e5hA5Oo>=V3Csv8` z!CSpea(^EGdTc<<#o3;;%7cse2m%3lne`*g*oVRrx04WPrrL0A1rkdJu;dh#i3T$r z`U`x?{L7D5E`)wcBi`~6X69{fu?*hEotP;Y60Hc?Bm6pC@lQ$`vw1IM<|HjJFFt`t z(qD`S$y5^P4iwG+*(Rqwk+>ifBj{09@mQTWq}JgkaFnVXlHI-=M7-A#j zrIW=oU?|LC$`|kG2$uH^rNexmYK_g6TtdVK^UP6?N_n%ax}e z^;DelX@4hv&U`(UVCX=`pB2$_q8@J2x3@^xC}h7ZViihI&dpcFxYYyG)D!lkRe5F{OIXvDgi!w(WlV{vHc;4j|jFZ>0C}u#; zZ>i7eusj;S60SO5@G$nT{tAIj2IfZ=cBzXG3%ejU2TtOb!%x{3bIMjp5(6yS<+TJ{ z8a%I9W4IM)uqA3rb5(HS4yi@2vcAE09!z2SHi5KsUaf@}zIvti`HRExTvGs1%z9+i z{i~o+37s|@jmJtQHg#Eo?ls*}8)6OoMLRj<#g;k(=-h|+cG2xZm7ORnd;ZYqquTNh z3dX#`Rwb(s6%Te3^sq}?r=J`+R>(?fF`*iLHW}ElVCe>ps+X3EIP7v4%##XR{DzqV z<`6Xe$ZEQBswZn5x0W4_(%TjL+aXSmX&kKhXx@B9&4SpZ(G`^@T)J2nc}M!05#kHI zUQTls4jf!dg#A*05UPpge`qU(8BF zjemRVx|w3O$Zde&uXqIduU*4G_(($PJD z%|%!?c^|NvH?{_p^-ACtCq;Xp%^00Z)z{jG{TNBoHqAqnCFk3o&;{ZEP)(I+5B09 z(QxehyE+0lcl=v9`3h@2#y83J1ix6X(>33FPPAao>8|6sDY2;rs;$4J3~89*!Kr}!Wi{Av~ScSJuQkd&#T-N>&oDB83jyxEvoS^hUgQ5(a6{S9+^oL{3Y>U zyw+ONk0Ej{GLub?%$w`(gyw!Wm@Q{I!AJUC(b}%z=9N>)Dzf2Ke*LYs83WA54fxB5 zzwqEf%TDyXKOB4#kXgE_s7IZ4#|_=}RRJ3Ss+KuHwvHf&1xH=$LWAK1+w`2TblBe? zHDK7p)?EY`5YO^ii&K*`I4ZQ@qD7iJS1`HxqU_k% z;iU?6gGP1QElKK!@5xj5ntd=`>}!d@Fs0M z^K$hUmMC9p_W?e=q;IVF{Spiuj^%~yiDssdRQ);RL0o4Ihj=_ zCL0v;U3lyXYtZS^JE40O`DsO_-(*Z}z&yPs*4A)o^nVX9r`Sq?b z^$4g^W(H_jmWS5Rf2vIq&9@!SaXOwI3^g&Wqc^gAm9_&vh?2@D)Je?G$65CcU*joV zt^e-%vxh6+=z>W|$+Vz==th!4fM%REKoWCWHy&DP8HzDkG)K@a&7sIuN!pJg@H-sy zD;sWF!<}B|XO_h?WCYLMpire?AJQ>VUZI^y(2h-bM^ zm1S@U{&W%|3nb*?AY^gDJaOW)F_?5-=Fd|k82VCTaiDq1QakzcGs40)<2BX5HNJVc z1|A3lbpnmTwdLoB^U(q>8I|vmtfvipzBt_4RAB(wJ}yxa6{Ghx56qEHI-o; z&@4UbObI6|Iv-(f(Vlz*#62S=I-C7Ixyz!?F2yv1F0}bN#vK&$p@*m`v+Zc9E1=sg z_NZY7QxPRSaSeP;jmH0KnuTZmu)1l>0&&3(Pm&Mv-$o0YD$i!MGEEAh`O*0*eJR}Y zdg#9eFI>|dhm^%_d>OwV`tjmMLh&<3Rncq&>a3si^)Oi;OsQsU#$81r)Q>$T!7XA^ zfyo1`)arT6l}W3>`<^3nHB%<-FIGm5)!3RtZbN(>FSrJ7Ur0awHSr*2+gmP;L6US8 zP|n(T`95!ZZ?V1d7^O|%K)upHS*pgi;4_)p+AZM`#`e?s#2r7y<@zH>X^!MA-jpWO zRB&+H6XPwPm`fVGt`Vcv5qI>q0f%B}WlIWwtHbmGXT_B(a-E)O+Tdig?Sj=rmrT3f zAZ{_{39lE3p4Q{A8?{15z0srpL$N*^UAR|p$cQm2B=)P!vn}TE{2)Wd{LX@Fnxb!f z!V!c+nTh2kwsnn>+n$t@eK*Vk(>YbDS;Ly+78+_|E;iR~w;XN(I7PLL!Ft{ZX=?m4 zDu&V_XR(4o1#vZfLEt4?eo|A~7Ucn`NYH=8 zK{x@uWpMMMMOOcV5JGjyqV8oZCf4^`J0$m92FR|^!b7}esK*4gzi14OMEDkoti_iM zn}lt>^*#o?ln;`e;o1*j;gDy7vV2zi&w#}PU86rB9ln&#kD(bL8?DEL0&o|O%dZVsV5$!dg}#V0hfmi- z=)U}@VrF!@p{H_X9Fx3b@hgHN)Hb05UM$WPy6=#Vp$uKrI^o&(IZ*AS&yMh}%i)K` zJ-{AQKkwKhszL=9{j3lz;sF1Y+Xz#&!Q9Cy=}V!z;cq>Uk*Jx7p~_T^SznncFt&*R8;Rg$sxVm$u%(HWQw9?ovq?cZ2V==wb+-)JO08uHJHP$~u z1kgHi^_Dd8@rj??VVPhMe{!REM;GWi*+jR-3~ySBxQE(^r4l7I0`%Zfnjs@TiAyA` zw%|uH&X3gjUcIa$-$XT^^niux>T?%EFFu+irFY>aLx$VeQvAf@P8+y& zHScNyX3EKFubr>sb(lrvHX5tF9C(pBN}aV^vJ-98sL*0lo=*{ow^g(pvk+;|y}bE( z$reAJ&wjriW5BW669S9% z>`#Owi0TP>a<>F8M~0wv#`9L#VQ+>kJBV*D*pJE?zIv>NENY zLZI2xlC^zc+p0q3nL^s?A{zSfuVnF$oMI4u)d`IgcOtaIPiB0hS9z;yGwaBs!$3c(WPPr-h z21xtO(FW_%TN25bk+B-f_BfBP1?<^t(L(KN9*Y=*05?!Q$>UdBzSmvLqSqA9a}t+n z(@nyFeJOd!>*q{EM-IbTZKMw_S~@Oq&gI0@#OM!Zqp*{5UNrQ}oqn2KjD}ktE}N|P z3@9AZ^{zSD4CB^r0v0Ybzozeb5g(GA_#vqF;Hw;*3&rKie6DJ%k@rEe(7Ddf! z{n9oZs@^x4kR=qP;%Q>t_|w%S6lf-{QY){L98hvop# zp=gHvxjRiZ6xN2Z$v*bL!kL8c}IJ6R+#h^&*&Ydlc_4{ey8{>WImm}wZ zr=pGyyh+wDKXmgH4}r}U+}y`-+;Kz9z7DPseMLC#!ENf6%LPT)0TVlYC1(xADbF2$ z3Aa>=2LcHrsTc}(MdI$>qB9Mig0-Dky$76n4rBeGd2MiI8Rw}VavNe=0f+L2{*3UI zo*UUcm4^waf8_T=(WRF8)5c=f!)4|?X|3qDR3(CE6~RH zWP)i!Ck`mrO15nqc_?DvcDgSgsBvgbCu7PJbUBFGepM}10_l3Wo})k(DlJlGWS2fv zK2%wO)M~KAyR`E-p~UO}gR9snM6^^ohT SW!6SJoWfpP`=v1On#hM)j$~<`XsWJk>%MR- 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 literal 0 HcmV?d00001