From 486d6f9ac87b7ec8e4412224b05890ca85587428 Mon Sep 17 00:00:00 2001 From: Adam Wiggins Date: Sun, 5 Jun 2011 01:19:03 -0700 Subject: [PATCH] process types image --- content/concurrency.md | 2 +- public/images/process-types.png | Bin 0 -> 21116 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 public/images/process-types.png diff --git a/content/concurrency.md b/content/concurrency.md index 07db614..b72550a 100644 --- a/content/concurrency.md +++ b/content/concurrency.md @@ -3,7 +3,7 @@ Any computer program, once run, is represented by one or more processes. Web apps have taken a variety of process-execution forms. For example, PHP processes run as child processes of Apache, started on demand as needed by request volume. Java processes take the opposite approach, with the JVM providing one massive uberprocess that reserves a large block of system resources (CPU and memory) on startup, with concurrency managed internally via threads. In both cases, the running process(es) are only minimally visible to the developers of the app. - +![Scale is expressed as running processes, workload diversity is expressed as process types.](/images/process-types.png) **In the twelve-factor app, processes are a first class citizen.** Processes in the twelve-factor app take strong cues from [the unix process model for running service daemons](http://adam.heroku.com/past/2011/5/9/applying_the_unix_process_model_to_web_apps/). Using this model, the developer can architect their app to handle diverse workloads by assigning each type of work to a *process type*. For example, HTTP requests may be handled by a web process, and long-running background tasks handled by a worker process. diff --git a/public/images/process-types.png b/public/images/process-types.png new file mode 100644 index 0000000000000000000000000000000000000000..a9d46e0fd3bca4c231b63a9abb5cb46f5cd387f5 GIT binary patch literal 21116 zcmeFZbx@UU`!-4}VA0(Ii!SNzPLW1HT1o_Iq`RdSB}yX=0*XjC2#AC?NBGpwDFww}+;Najel@w();o#u&fG>YAGH?X> zN7EGW1JzMc-vtg19Ut}u50{!w0tW|yQ<9a^_JH5bK&>VCS$Bu7K@IL<$01Jeh#|wo z;TJf8WY^-iMIcwqkR+GN{u*PAIHYRgDjEV2(sw~4aEY}sn0l8GkU5y1fuwkmE9gk% zaAc+UrSA5p3vG)wd0YzC`-XW&9K;3%bWU~L*jlzW9qLO8OXv1x8)DMI5dpA|>~qtK zBJ%7jIZ2Q#@Cg7}KwT*xPbGoiN%Im&kolw^PDvswtv}onA*qBDQ6^QQTVWiYKmz~I z=~h}CgW!<4dFtFehd|hqlduBy$mmEuTag6uP)j_`$Wea=YXLF`dSwIUTtS3jQp-S` zX&?x|hh7p=j%*V#c&9$YMxlkUoXr3;L2?JRa{zL=Ezc-OTVW%D5*7rz8iz1&l9Vn0 zi!57;Q`1|453WS_!M^NN$tRe@(AI?->6_>PRSjGmcwC%78vKZ4siTP~tmkbWj%XR$ zkL}6P;jjjS%G)-Dqpnm)SjExU8DVD7;NS*MlF<2QyjCY0@ByXA1^teE93@!@KQgLM zooeUlXIFd0deG+Mc%i95RFRoSgojXTqqfvNR!XEEOo0#v>H&}Oji^BDT^TOpvJ_U` zd~8?~K-AE3T~wq1CKlMipAhvS zWYiJ2nU^$Ur9s@^`cEP}3YL=}9zz4A4}8zBXd1ukn(?zx7gZnc2-c@;MG(t4WN|OT zKsnD_N1dV3C;89iCvIk=$By~K&cbUH05*O8FPl8+)PEr}>jt;$qK;YKGRJk~etwv1 zaS+Qeqz&rG8p#O^1@Ew%QE;zz`S9c5A;3=N#F?2860~a2rfwU(h(XAQO&UC|;`0FX z`{a!|nZmHV&B?_-ajwI2QWyM;nFO7)FP3K;+#OUkS!f=n4C;<>>iDhSJ15@|f}ukA zS76#^`3dL7Y9}GV!=oYsB=c3L4bFnew7!wBUwqj!jCdcR$MvDA-Z{ZyRp7snDRV0?glN#01mQ^Xq zmZVg^SA#S65PbQo)NTod5c3a*|K&56lOcr^ zKa}?~?LVW4(=>ABKb>w*H1O@qu7K08S&j1BX>jP_pHImtnYc|Pw+=d)wv+s@n;I6q zSP15pw|RXO8}HNe%V|ZRJ(86PAs!f=_dej!06Xx)UJ>7C>8`^{{46a*2!$E%Qf;l?`D~dQp2>LXN|uM^ zdH+6uSIj*LxFL~73y5iNO8p8d*N4tF&rsr2;P~g8xg&`Sa#Yhzar&9kmFHYxFX0CTVd_lh7LiG zAqrA2Woq%6_9s(iV#5sK>aZ&jq}?GaHXM1_xJ8J8fru!nK=P0VEG%yY7Xt^?isu=^ zV^I#1U)xSLhB`Rs%Z(cPjNE4}RmCqYMoM)#IBv#tMcvK?MZ^SrE*xDBe-iI29mpgy zs-5+=tY>I5Ae=k4!G}7AIW8Z1`~`x z*x-d6O0cvXx+U!cM3Fqvk5DZ{EQl>=EreE_dN{!?zPuK?(nK;Vve~Mj*LttDJv0gp zY8`Xd2h#)wkBbYbKjWryngx9lboxxnZ}+io={;*BC#D{Y``MIr8kf0XX=68=er4yM zg_HgHc|*4`9pm=NZ|42z9F3;sb!%j549`<7y5gu>)*%u}C87+A4W^V{8`LgsNH=8+ zj0njJ*{_jNO$r8}-Voae+!2RDsktgeTyexBfu46gcs<4ZnB6`gQWWN$H{Z(C{p9en zr9K0#hE07l57)1EEw&lXi`4&W8faZqpq90l&y&?;yERf6C$yTRB`P*yuUTh5TmOlO z?Ij&OFuZPS3&Gg@x$-f}8|!_amP7TM-$s@3#G?jkuX6eB&D0eDo4@#-uN$_m9;o+& zU7J8%RYxzD`xyBoY@k8#TOJi=d6=+#WAG-pXtH{HM&QVf;9l>Uy`vMBP&G_WbU8 zKW+7Q3gfW&?THpgALELu=%Fk}qgBlL_0#xpz%Y%$hFoAQp;AJ)MT!XVBy`Xx@J`#5 zK_2E2+gr4i>+AVxpTB}f<0W-;lHFID&gX1vZ-ok5$oTCx%5b^b3To{8EuSxwvXVWm zN5m3r1={xBUCrzrD{kaz$7bR2I(h9t2K`&`Jk2YzqVedxe%0%E#)_7K)lrL-64A8< z3X0!uRIKhDzw((F5LOkk*93|MeK(eL%^5o`9fRHGWfq=D40o`sMoEf;9epGAjt3oXZ0sr%4)SYdF@*_ zJl7e2%A8 z2xC*dl+9j39Sw$O@?tb|6j#XS{)5Z|(>$9BesNDIm12$DdsmClB zjR7Z8s-2)M*Ypa%2L*?W@=oi}Ze#a`I%cFeVmJl=F`t7EEGpQ!sBkGK(ybstk)$p2 zvJ}eJ)qbo2oKa<+!)4R;((S=@l_cewcQm30&IoNE#d{FC9(PR$R6|Kc2rqQ=)ieh zY}hb(LheSog5cFOJ!V-KE zFh5wjSn=+vk#G?Sr-67_mhrh1E+jDTmh45@OL`W49L2V66a6RUUue|T5j05Y?(R1t zF~pXuW_?MIn1uX5bIuKoc2nHny?$J$bv@Uaq(9he*iSv5`<{qzjJ6+JoA^B)oCFF~ z#K0SmsnrppvRinjZ4&Y&d?&~UdGUHXOnN{vlVkCBq+}4>KqNMfCtr?afI+Cswo}~+ zsAqkm<<5;0(d20(SCO_M=rav4jg=WcQx-K8O%z#s=Ac$keCn3q*Y?vv2~>2@ldw3? zo4E}6zQ1fl(ugD4}!+ezTsg#WmeO}aRKAwcQ(DXu-% z30-s}JGfCSs|(1|?AK?NVj(*vn|3xA@$7dAKo(eNnN zW*_`^6lo@yr>F0%;}~{;P(Xa@?LosA!()xYqgtT|mmk2}Ra6P|8uH>@@z)kj@HreQ z6oEQD12x%nVvqzQ++H?>OGcbuNfhi1O+(2x(A+8dPJ=e@C(a}mCW;C@E`QELI2aN5 zz!$_?_Frl%sO4tP-R|fN%1A(rCf`P86m697i0?O*q^! z1mtFX;Dx2$!p=K<_mP^8b*;2ppjRl;OM5Ti;a25(Xia~91?KW;pyD{x@o=GnZw}tc zs~ppUFJvG4ioBUOoVJO&-GEvIcOJ!W?n!UCwAo9UUUCgWI#@MzNewJdym^yhQ2Qp4 zc%P)XtToju5_O8xyQ~!y*y;rGEN$+%+)q2?1z%(c|_G#dD;3 z%49{{onK_f?CS4yGL6&x6P8f|Pp46D1JQ6P>JfVpsQ4pX!bx{@6xV;xshR#bBAD@> z$yexckC5O*tmK3-)olUaHcRbc2Nl&I2_kg-C}E4d;E4p$@B>n4i&VAD2gw~G0{$qU z|G1A|GMJqFO>IdIZw@eMmd>7Io(+BjzBh5cEkq$_xd3TT!1ie?Uc?rblEa&?v=EaA zw*g=m$x^*11z|2XheK&(uAgD0qNEBKwwtT3uYDNJ>-V<7$JmvwK3W~*f0~Sd0TJE) z-v%UMZdCo3wN9sR2R2!`oU@T8mVa4moM>~&GgXjsrldA9&>qvJR&FC1nAVl)r4N0c zL>{8-03#fK1x-(QL@hp#i99PK0zEMAd~{94Idp2_N45m))tJ=gL(ZzlSmCY#J@oj3 z@I%uOhhW0_2mr7EuEh%uF|qN|l2OXUS{-9DG@SnY^Twc+Q&HRfdKDDY$PhG5u{!$t z2cJ0TqyX8xD%6uSbHBD|7;cD!0^jbg`FhXx<&R;!;eia1{=YwLgFWnStS`(io{`6M zAmmF*wy-=iBNz><$GJelQs$Q5ovsn+2*c#j(a{N$R~qm@w&_h`wp!|pwE9gX{w&F{ zrnRUAA-D6CUI>>76(L?_>f8DSx8vTu7ntgJ4(%Jq3(LQ@&~kby#TX_b1VI78Qvgf} z0is)!=gnbvKXYL^jd@ab&@9Jv6<3PUyHBJNevPoIA#n-GW^`3H+X4(^)s9k&Yd$xY z{A9zZ?G&$!x+OZBgM8-QlF_09)E4kAB3%kBe}7mT5ZULAA>+f#<^^Gi>~J1OnT&pw z(7A}E$XvrImdoCNt-_5}Oq}cLFxQN=vDFW*k;C1ot)J}oIa+Rey>9z677_&5C?1 z5y^w#{-mYF8I!@>y`h{BlG7=tLW1u*B7FG?D?uY2bisf;I96dY@7Sx#{vodJ^C*nA$Z%^WG^0%-n0$y^ZPXQ< zDG_c(ny=0=MLa7E5!?3CAr7xSC@*8(@Cjh$89Z*0AuI`8 zXvA&bZ108yQpVcpHCzc#&7gMG>twdG0q~m)C8VH}oB? z{>Ch*#+;w?y*-^s0}7Y*CU!z51PvUpCDd_Z7$@eMImBU6{K+tm33xxINYNYf&@96G z7;~jGST!siMQJ@#s=XFiXi<_g;G46Wmec5=3jbT%<1t;6PplPH&U-A!gs1{FuRDU-I25h&6J<2!Y!-x3=B4CW7;m_? z)E!(r7t8tg($2pUjti0_P2TR`{lwqon7!MZ z`P7qDESl!j9ZRtmuRwYDnfXkha%v??atar04)tJ^5gOSLUOv>47) zvbwoAY+F((Ihs-7{g~b?a?py{?|*;p-=KsRC8>`O7&y~^!k@RnHeV}gO|@DcYk3he zR7a{WNH|H=-raJ3c>8^^CE~=SH3dJg5%-_+ZqcY~IR9Bw*&y*#y#>;e&5=UyP5!JV zmw#)!#wup50*~hFp)v!3kHN6awu*%`M90(q z3SUihaW>f(xMHn(+TJA*08=U%aJnE(>*t&fX`5}6=~3MGCdkebGR^zeJ-HUR;O7fH zv~j#|r>pr`Uwq*lDR|B^UE?4SjDpRd#{c$cX|%?6V&I8WC$8})Sao*;)VUsEQSm=) zC%lBu&0B8Y+!@7=`0uyeH=pAK^ws2B13=O z`Vni0?($&9_T?2$pfUuo>o8KV-p9V6oAGR8F6;m+QY+A>^)q3J{DuQg{e8*V2{Vv$ zsO#vg61wg;ou>jQ&qs9j+SZ2FW2ZO5X#R?QSwpjV^}}DcXf_!J4I-3vbl2= z;?4@-J?%yceC$!w;F^x!FPbkVO_=!4j?_^V_qvRbc9E49es)U04^*aBKTgyBZhbDD zyx)H!d_Cqkm|G0R#Mz6lqHGt6AGtkIZRSt|9Z9#AWBcA+t{0eh$HFS;0+;oHFehP= zT-~$A`8KEI0Q7 ze?IaC+l4ivE-s7vu-FeSORHNrnqg2!fzvo-+?0s|-@wYkqdUdk&F}0+^&ZOQQ+-(y z^9Crd>fLzZ3~KE88q+>6C%O_FxyC;q*uaL>gjWAoH6aGov{e(WLTsO2Y=0{X$psai zxM^F12pLZp5N9>Pqrue7UM8k97kc%-K-$O|7MWP>dwsU{$vTsH^X!A>G7*Qd9Xk+JYm|iVjmXdx zlp)I$nt?Cfv3v8SmbSR|8;9$*vI;ge^NAnh0to_hVdn*U6+7Msv^_;ig}Hf)o_m9p z-&OCDbHMab4?!sjJunHmm?S3rTOIQ0NvLD9C1QxJPL||_HFTfWC~+B%`XNv`0oiO) zMmMqix*UkZ7c5#40EQl9#8{6WQ$I#f<-nY(i>NZMD2XuECSfPun44 zsGqJR?+6*bAHfJIAo&#!OmbIjv+tO^0oU77&xi1W3nr)setbrx_E}dxElt^0kHErx z?8y@Z(tW6D^acOEgycoUJMn1TP0UaqEKju6EL0(!c9F8^-Nm+l%t}^(^id4EQP=m^ zs5_Ife@R=j-a)?CKZlUe3-r3bqi0RfB>d;G1PEq(iXPUo?g$p&h`9?;eC!3B2v(55 z^U|I~vZ|o>%BIU*F>+;U$v`L|h?OJ>wlHD55l%g{Zeb=~8d!bSV-SITq(>j z8bRbOl0mf{7eSpPs5V@)wG6eBkT9?Z9KxmO)BS{EBCf>5)2;rwIejSFP~Wf1NDpRwVk`4n;TjoL#z7~(oBh@p$2Y5G|+5SkHc&}Ck;BTA7Z71 zh4>13&n!-TTuGB-7N->^q=WhxLQZWWEgskxXo$RcpR^(iA%wq+V_U2pt2MMjDAlbv zn-iz(5#qrCYI_=5z?IB~jr$^zF4r6l@RqHjYsmh$KV>bhTOG`wNe=F5RoJ)9~{!~ zIc2Dw2Qo)ah~rOS)*QYk){_Fg4>rW~ElA0yF=)Rf%NdB&+iFEspHCH5`YVXvTG!QZ z#>^fJK=+f5DdRAp{Y|J;z=-Sp-TwXF+gVCDXLP+ij128n6Zev zrUU%(!1MPy9zg8ObTY2Ah+Nb*LKDE8FZ-^!k&g$PF>b|+qjPC=Pu*h^!N~Q=@hf8Y zfn-B;F{*p4RmT|yixt-yYQep%wqWR;+s1|9AELZ{VwFMqy&8Rh4~w98e%f_J!W-%k zzTOqd09(DFy4R4 zQ&2izPBB$@)&8N>hl?fvon`-v=Nwy{Mvcqv7Kq@FZWohov~V*HXqXgKQ%;UMMSetL z@ii^r0Ov91!y7+r^01}WGVQsNPL(_hstUshxDx_r{UyhW#}BLmIhy&RMBaQmG4DyJ zB3;gCb)ymgG>PAMhgiurCpdboNe^}E#X?@<;caHN@K5hCTvu{dbbv?FO%Q-IS!%vY z1;&jgD)U;V#JhT0wO&xZ|KN`@Jf3p2qqtXAfP2-NGI7{6bYi%t zq9YxMdN9C{xXc=~ap5S184RMp#4|FU@G6NKEd*OAz!A?S3kJcmRdp*+yUNtm<)zZa zsV80@SICGh8|3!S{4c+(dG_zkrFD;4F}*CX#qnw~H_$FAEwJb^yg7}e)w8y%?kG{H z|J4E*d=>rqNRIYqNq!W`L;3SuyjDHU8#!|M&F^g9hdLL?onsyrEon3VhELB=9C3^T zW((pFe|uk~BlDi~__(N|f4mBfIwOKv!A`BxoPE+Aqsf+bJQm)AZ^8-u3$|#KDcLp6 ze=O<&x*0tB26{j+YuaN1iR^B|wMYM?LSezPg4!c>`3Bni=zJm=1FN*&adP|A?LMxuTcn*4{^X4*`nU$NuW$D|&{5mZfPEEuwD{I70WyXblzv!8fDw z+?P!L?ut`kKBW+BX{`SL5W>AFlFGp$dxlG{HdyWVYuzZ9;wFrpHuWY~PF~i+i#|x? z+1WA>8Az0AQZuTF>SL~tfSSjnXq4V;99vwQ%!%xiWrS^V|HPFF;!~5jZ=hO>Bej?1 z>PwCG;?tv9L->j{VJmwa$C>jg&1)^qRGG`yk>M0L>sOk3-3_HFkQt|UbQY8$?nb=A zGkZ%|J>5_qNS_P-N(;3wHT|aP*QxtCoMzR?k*KKy$+P#aKBc_#tOA%vXnviX#+>0? zucO*M2ehRGV^oyfV`+<*W*IjY$-whL161)9IzDk@ZAT0NiAnc7%6KOc{(h_eaZGPN zVs&F)ec1z>O!NktUGU_LI**d-bAkiOjWW(EYNzlLcTaihRH1X2oQwn=~|?sTS;Ii z>U+v&PXc>AZ#_M1Ci;K{T$7cZrnmd4X5kp?SH0bwWzDQa1o_EnAaCda=2AbT5VET; zkx{|+d6}1Fw(AYYm0DFI@z@lOtzoW%wr5oUc8dy1OL`%%26D`hA-HgDr5(Q(b;lkv z%LwpIf}r8s&nq2hGLS|d=UEBdx(=O-#c8LB6|!#x`U%?p@;i87s!R`RW_ls+vACnv zGS~d7pFbUjD2;LO?dN^Z`EIYz1;o5gIAh4ycNriWesxIv4s&*E0~xlN{&$|=&AYK` zE*T-*MC~oOqrVn|{$ijUi7F%b{*glY^nF11x9iU2P!+(VI;t#fjh7qQieGKe^4N|) zb$EjCL_TQI*~ftjb>ktX=FM^uF|zu*InQpm_OOEs3(9|@-f&zXZ_WhW==AvhIfM`W zgVpW)Jfhq6%W8HDO&Le;T)<7ktxpF|OT`CsZibvMEEY={F>WsERvhH0%Y{rGu3MwO zqAA7xR@s<4&~+pc#ECX?8hh{lu=@F)uno%{`I=tJ@}pqa0&&kdkH9{_6wyFn~f?8{6<4Dw|CJ&f`-IwSU6SlwNtM2A+tlr5pntAz6@G;H|*> zXfzg!t>jCE2wA(ETPPQFnYy3aTjnhMfI0gcPQySaBOJNpg?~|cw1&9wstHEoc#H>i z5?4tE`{m7!wUPj@Xf~AxL$vZPJzf5p{8OhVg==BhRGCRq@u{F#(IZ6{Ak{~~-wBqH zY6AFcR~Q;$7_w0wdV^U>k#MFXEytKp*G}1!py$2)Cns3IDCLrKbpt5o9F-H@g?)}# z4Z8V?LPSnSwalAdB*Ed*IPTT0BfHRl!(d=xNBBtxgMCpd0uL4=Iv}gnTRxD#>5eyJ z%*2_JXvQYk{;o9E!?b7V+{x$)0ocAE%9Ga-R3Sc+K>kL<2w;)*qDPtQ#qcjB2eB*? z84OueoFj{C=-%$e=TRYfLG#|}wT%L}Kavi&q7==01!({RvY=vIf3+nA_5CK^iSqP~ zBAvFjjXv(5xS&chcD@&&VZ4Z5$YH#bu(PiOFvOxco^L@rjHbcH@b#LY04q|m0;2RpYH#_0qeF=mV89Z|`g zK2k41l0$pYgVvy$P|$v?ogjwP?DNo^JW-hYR=)$ehHKxM7d=SSB;{}b##>YF56gE| z*WH)5G`j#~V`+B@FbkG@P3OiA_)QhfSG_QBZZ6FJ?+aSmdNR_=MdRfK473<6WJzUq zTNnktH=0JyZtF!jdSPvU!FC!_BHWtRnJq#9pq z@;0(>C@E^o=zo*wsVG!Fe;mn)4_rEzmw;eYxn(AOpX$trnY7>9SA?F75agps?akN4@;YN$}Y4MlfY zJB2Mr^Tn%D)e9K=KD=MIPN|k+)5o2h!bB3NOvzZ2h1MM|Nr#N;@!K=FIVh8&apN#Z zz-3LPA~O`7*z2y*^H?;?%b3n4pevTb*4Sea$)%rf!h_ppn2yKq=7Mb3pw2nJ?&j!s zKd?vo0RZYvUc>w6Y5bq29a?6!jNVOI+H1;%d|&*HrS_4tO(k7$2!ouz&(P^7q47rv zya$-3yzSku1p2wSkh|OKw9@kWUJ<&TkNGTvW#5Opf9;mGA5sH5qvRvz)sb(>L6DMw zc^5`UF%KE8{hJ!oHiSX-=UL*j&#aq;T-NB?&ji!<=r5>b!m&;LHHGC+>XY_y2P4n-%|n zGTzwXlObQtKa_|X$Uo`&b*AIj2tyjN4!LZDn_Dlt*qW!S-)@WT^1uDd``!2Y9goL> zX@^N?bcNox_NsqimNj4oPh$ZUMUBv5Cw|jGDxWO^J=tJ3pZ(0_h(F+z_=d}t7Q?Cd z8}V(YD)Z|OyU5GxKi}A0R4&8tnX5r6q<1ybKWum38GHZPshRilrtymyDTM(v`prI` zG;9xJMuZpcROy>c#qj`<#*8ETG7r?0l(4A%?*2;7``VPfb^&4JtC@_$Z4fGdlg&th zakH+m=g)&7``+z}mc7jxY%*$bA%%%A`dhOlp1Q90x98rcPA@Cmw#V&p2??ujxDPE0 z*--8v*?%Y;Tj4YJ{dRun_E!uSY2-EvOvV8rDb33A?qR4XsS2H5`L8a?Wv|r~3Eoa1 z`~GlTyTYNsR03)l%zO0FIu~mW)uxPhOI2hPkLZcR;Y~X_$BFA+H`V=x0+08Zotj%a zDkELO4uUYDA?qT+Voy9R<~|L}ROsq6WPk`fR{t+zJ^(&5Yjb(VWsnbs&lq-i?|kcS z+%fC!V-qP~Ug1_3qy&BT+PSt`5W{cByb5bGL7NJxJDfc*-xqeb>%K%z*Iw~;l z^F2q8cunmGzeC-H*=40fim_MmRJ~j2d7)X?B^`{e?=)rVJ_WFryOvUi`R1JNr$&oT zWQDF6c@>5Tr=P#Vb4ur6V*l0U$hy#QC+sb4HY#HGz}hPEOMuAA3EsW3NHhJO2~hA? z6|teX?Sd}2{Cx_wsT-L)sr>{a_Ox; zXs^Jse3ry=COZER@~AK&++v%?2+UbSfB>W~(|gWqn2xOCO9=DM%JewDDDcMNHcqy( zmBmU&IUeA9#6ZP8=$`>wi2GjTW)k0t}$*CtL&8*tD_ zLA4uJZb*jW0?}x5Op5Rw%|BQ?D?qIz7*ix|_iSE(;O)C%01n{nVNpn+UxM1lOQ5*mUtruB~M zIzx=)&cv=;Ybp=#W>9nZCv;k>CzKJ!ek1eTvlfAI)&82(%6+1KA7M?@%r;}Mv5!9) zw*L`BQ&cTHVcQK50nnq+L?Ju*hj)rEmcA(C2FUr}O9vNLMvWd$2NZ7_MP6#7&{WiS zI}*>b8C2J@gpS~N9Q|SpW>$I{9Qi)#LB?jOMBc(6unZ-h?XYh;ePM)S1YvIHC8?Ql ze#U8u>@jZH8++a0@)S5?y6lR^o;m%km0cTf|5C+iw-zGbgb*ben0jR=2#CBLI8aJ=#>vERY(IBmf- zDUE)75n#zb0)CaHCtNElu9GZU*hCXlbsNH^|5n0G0ejnM#_26IW@MdcVkY*p_xTJi<(*h8R8ScL|4h~o6`wp?f zTTEIle!c?C9~R@puX-9!hMz^=mLuRGzrtWZaee<@(gG0NZrMZ0%tvcWjZW=7<1x+j zU-Y@=AGC-!$Rrtn(4IjOm>b&P6$|Ds|L)_9ZieQa z<}HmHkN@bC-1c656Rikm`80e2KjCDBc4XxZ{Q(bY?#oLiE*e-?=R^AD3w6%Dw~QdB zi)e^J>M>16cl)#P9IC8rr$VVPnFLBX_9=OV3C<%@G$HgEJZ!p^zfY2WfGnS2)}d>r zpwKzLl@_A7CnNhUG9p|yo2;cUHhx40NCJ!)wC}Vrvhwd}n?+MBdb6Gj18n-8u!C7< zIeXGHj!mKTl@wNJRcNOtOQgIt<_ZOP|Gja$9?__&DaOm3OczMEq#&|$*MS0lw<*g7 z2ObVClO;m_8>k2MJm`|RSr%mt-!un9Q+&Fp@?mSnf&`zx;Ku5DWx^ZQ;_PrhK2~o* zRv7jOOcEr)f_Ip;dyjDw6?fKygdEV|3k51tzUc}2bmy0a^wjcUKRYu3`&kp&bUMBn zj~i=Sp`{0`Lc*W`DJf?R_co8dDsB{&^_o4cIWX`UCLi$UAFk ztPtKH*|E&pER?Ml*ln_^kP_ww8^6JZHvjQ_xZD-_ON4$4In5H9N6V6>CEe+gxf8a+ zVOIm)0whMgPYn9kmIq>=UVcS3Dfc4CV+(QMh$~%=(!O-oxhu583gI|kLDxlJ>TE$C z|9oVE%;?1R@=r=K7xA z9mDImN@U5qy(F98A6mkX3m1-E6qgM>QQ{OnEwzNZ)Vq{JZ)_qmL-I-uuHNwbBj@G@ ztye60@2CwG>>O-wRzR~Pv0Ae&RvlGbdMu%#`V@K#eXj@Sp!2z@g^(M~-h9T^hM#GW zF1nfTr1m9|6tcZZK>G69n4>s)F@TCXg~X`^qbRyO_-YO=*X!o4|Q{z zBc>!v2Y%Z`4=kv*45;30N3)yU*hCkM))5|xJHpgkOEKA2`%O_k&)uYWZ`>TQLmFBs z_t6{w*z-AKVP`b7k~(oU!t2nH=3bp{r_D8ar-}PseH!LmIE-)#e!y9t|* ztgVOnjT@jAVXHWbB*0L-{ASS7G8i25&*1P7LzZcer#=5QI4 zdEQ%fpuxV}IPtApnkwPTU!Zrpe=Wd#Qbh0KmeZ(^m^0m(NeX!$^|j!? zU#r(>2Sg0YT})E6Zl+f!n`>R<4j2s19~ORObC(}}78_kaCHBeJQ`mK8C2d^(2&>kJH(di`;~xl_ms^BLo;b} zv?%-8LQ!t4b1nuIiFT(DdvMb2hD#aiVyzz?ab_z#%IF38%kTpQZ=uA1DF1gSN3B_e zM-`-~6SYp7yg9m(ph|j3a1tBW>R_Z~Iu+sos$nJ;(YG*+nuxxT*+ADL_q52r5N`xl?%Do)3WTyt*^# zQA(5z0pc54kWT2M-?MlIylrCes+Z$Y|AYfHg49+b{fP1YYuY38#RLW#2{L7ikp@Wi zH%wEtu-X+UlAdlaR~F|c9FK>3R*Nq2%U@chzV&ok&e*;DIC#UYc$ufaX4!OmHf^=> zCui-)M3sqNF;;$8Q7tX)+|O0EU~R)WdZTF=^wSJzR}<{bXUGe=SoTOE|DGkaB^Pwe z-kfV{&~Nc;N;z*sp*krTEKtqZ`YB*Hx$xGx+XqJFzcbsN`d%n>xsurb51X%_8(Wy= z_t&we_ZfQ~orZmkih8%@Yjo%zCyzXiE!<`HxP# zrl9NX7U>#xNVdrJ&Uaf!BY<`}N6hiRzgsIQEkD9S6)`UE{qFW+iv)J}+F>`9fUb$} zkIUPAe+NLTZDC)#h&;VZCoxhR!p1sALa!5|_d)iZxPNNZS{9dCw~0@{piM@T z@v-D!!%TcepqT^jJ$JS{J>j!1GJl9MEQ2kUR9ORzshxgt7n5bECQ%Hqh==S z#R87g8)_1_qpVf#`*UlZ_-ZHZw&P!lHE=OgXUC2K;dDhjC9xd8-7kyTdN)e4qufWa z_-q`oMh9cO%v8&o@9(ayE{|3ttG+HLmo&;!6Ovu5B&s!L`tI7A{GRMkS;njWqHUh^ z&DoNP3AQPg$_y3()!AI&`J8u!&7bVRx`iNg6+m&&w28+^?UmAO^67Cbz7YZ5s z-@2)-`~3k=g%d6{uhv+mM6zA}u%G?g(L;quP)}eGkk)ioa>=)pq0!`Z+P5*3+r<2W zlKfqxW^(s3>(q}oW4+s%tA++9JTcEED>Y*@-k!3Q9f02WC8C)WzUh%{Rjn9;!cbq{ zH={kSdoxp$4df!Hoj*;4RW%wf*V5(?u0n~8^>R-n?hfOu&UU6UGoz};r{rA8oUbxH`Il?d?w?es+l3Gvszk0DR|Y@g8144xF= z5>YBmcl>CI=Xi)6Y^RnfdSGpqcAgXg=6|1rALs*wm)^`*!*^H@Ja=2NFV~^y(r(Q> z);rNiYfdgXQRbG5LWp)03-*n^*Dy&Q)AtWVog%+xV>=n+y$ohPzDkhlbzV4}WA-D} z{o5gk)P5fP%aWnBDMZsQPQ#@o`sI7P`|*ft4Sv7bYCIYigzM%41NE0WJCJ`$JY|+J$-IBUV!Ixigh9}?tG7G1$QkA%Mb?L-asNI?j1E?M&2gH6t))yes1C-rwZt2wE4?0{< zqIsP}nUfj!3nxga6t{eF z;4eu28lG}g;v2>lO$%}SBh{kdr8FDbdO!S-uGfVBTmFwN_yp54-Kp*+s*2Pb0nRjS z+j0`dH@)oP%p&KFZ6~;eY_WlkWXtM`Jc=_E6X6#TH>J?x3mT%Gl&XtD(XsbkSwGA% zgj<&{2lu56A`DOctBK%2gZ_TRD{p|DCy6mw8{M4#k@pROWHUG5K$GMiYq|qi@-nE$ z_gGVgKp?>c2nm(2zkrv=OxZX$TP%O>)L>|G*_5)wHW`yI0=ijJW=J~XV#iB47j8v4 znX>n=Vm13Im{*n+Mf&37l>(=-Ikk^-<$@}5@j`^oT8CKS`GNvY1H& zHZ!l3;UvcA6(&Sh{`dlV{)`B0u7d%ls;Jo{qu1QMkK%fq4{#HquR{dsyB#yqF*Gy2 zZbBaXAOHcj_q*kUzcC>04NJh#a)ew7}<@rsbSi zY4m@bkTE5!SElV`t`n|6w+w!U%uN2WmlZb9$!Y=e5pgyxFL%nfzU{xl*Y$->2n2x{ zb>rGl zI1Boa%Lyqwtq4ADnZOhE-Gy&G-rN=pAtNaw)OP1Iio+b%sU!)d|RA+a4IwA&8Vzi?^DM!r2d&{gPL=s6^pIwnIj(kr`y3+qojZTA5W zc zEK(6a4R&Hx94w%?h5DzMR8KRIH&0fS;vO|7)69G6T2DiJ6`KE8f_}?3Qg=GP4E}mM zBC@Y29;O$I`F8ft^P|&hj&Tz>U&I!Z7uIn#PO%+?HnG-}%^}~jv{J;dSdj78wWasB zGhK&Oe{^4WJ3h6$W1Qg)Jx`xs?V~xQXIob-+6@&Ub%GacuLIvu>375&xHWE61^=;b z_rKa?y%ls*xULtE-J=L;*+lQ?J11O`75UH{>(xusLk;}^-IxB7dDo0%o2S>+s%K-QD|u5+a00by}Yn6WycvMhW^q-uZfisSs{4D~i=gGNf0abA%qlN)at*ddt$zoUqy{Dqj@8MpQ>Uef z&t#>WCqyTwsV$zY>lJ^GmnvCB(AWyrjXqmMXhpwExeE<&N4udH?}+1gMZVyX^J)PV zd~ARyhq!o46D~pcibHvQvRY<+F7S40Xu9!au+pnVTws^0aK?6I^}E+fe+k8zV9Q*& zpdW!nj@CNA#IBpdL^mbMY;i2*)(J8C3c8Ve33tx+_D03=w57i&RDX#k_AB4gDAmUL z+r=mMVHGa=DBXeXx%{_8A=CNWS&7*CZ}=1qcA?TBTi5c;9I z+*Ihr{=_nct()ImT1FMsMg1|wY`?u<=t!2wmu5z)mJ3TV!JNM;c08&wmYo`@{P8v$U4E2*!puALWPIY<=2ZKH zbk3Fg(5wB*57CqAG;1->65j{slTFcvpWZIL&(9EKI8}r0pN-$LUT<=H9#Y{R_M=i=T4w~zaIfR*kCpEM8gSYq`e~gF!j0g z$Z&-jJv#;!4@TCA)cD1drNR-HxMkr)H?g;Hcc`ite2nSf&pzdH`L2q~p=bA(k&WPc zwccp&q^ar-KF2frg|A{i>7{?;Q=8X|EShIH7MKoL26Q86R}NQfpv|v$pxkeVmswx8 zUueA0Ps@7qBs(_^@e*~#@yWedVKkPipbpesBr|wuaU`JpI+!X)Dg(TTi0}Hsgkr>6 z4i_p_QndI~&)Tr#73;SVx6P$d1KOVlh&KnbZ)@*-f`cx~UZDDa!N;QL422Re>fgZ= z=gj-4`A+%@@K28zcZ?+@<(lS0abyjfnojJFfJHAVV z&_LpLpzSJqnp~Q8Z|%ETd7#@Wm%Z0}ZdK_ket|grxzK~nGZF=Col_6#^U6|%NpbszHehf)TLSAGrTnh|O$oC0FI^h+vz;_9uGdyZ*miI#>AxZWfb4+03mFMH z5@O4r%r?UDp$twbZG><=XgcIO5Sy8 zoq!BdrH`=sCjufM0%bx#2B}O2s+^mNMe1|7Pz~Y#UF7OW0Q_1*+_yQ@v83W3hIYRJ z;W;p%__eFXav>mtR4yY`rtQQ9s1cfekKg zN@_SNt194EMbC->?6dPMZ?jyt{o>INsOef?SAn zQpNkEvg417&t1+1==+Y|y)eFsJl}vE0$JwdAD$*Z->A*JEg^jQW*>+x?;V7{=?lZu zbDHQxmIe3k5Sy1q?@&ln$fLe~u~X-TzK;3thBSh3s|w`NGm4I=ZFV z2IieFm zCqkjl0bG3MI~SlMY(0*S7sgW@{pn8HJV$Sh0R6M9o<7`E=a_SB8g%^~{h$53FFU%# z-4JvKLgqkR-3y4@dJpuE=TxHAz2WQl1_7(P1>ttK4XzJ;sC@1*ZrG^<>V!e!wAVlV zw9nyxjcN2DeA_r9O!wZp?#FFgYvqo-dF{X7uJ1T)m~ZoAv`g@A-}{-Bf9<+;Mzf z`|r1_mD8?uZa);x-}kPZS?bk6_=d<8h5#0>cc5fWVbO8Th4J7beSPRTtwuc;=DF@d zw-b8rST4p_tGv(spy%E_o?!N|)UWw$X5ml)sbs6IsixAKA@0)-&JD;3JM#)wsTMkhsGTnntbA6qI=0tuZ|^uX5yaL{`*zi9~+D&3~X|<6pJ$f z8KgLmegXTA3n4E!i8~pD8>gwRr=#!YgqJztL=eRW4I3YFu+A;(1gnJqnjc>3=(^i5 zF5(>^b0Ae#2mehce3TQe5oBNC=0JV|IUE_j=Va<&!^{MiF`vyJ@Dmqsw3Ei(b${?9 z`@)|Hu|EW?-py;nE~`}B^WJ|{?Ec``U>hP|1S|m=BuhemAqa3P$-1xGK)}BZ*Vn@! zOux-Zd)x`v7JR@-WLe*!K*uNItQ+eG9<~bjw@u>tu1gM3XP z=RxfMcswJA_!38V0m7V?I>ehX?o6c|`y;knXo7evP^$&8|@cUr<6yGzRab=M>q2mfb{Vv>> z02d$kG45Yj*3LzVSIG{LXCb`EuY=qNX=?M*hf7>&UA-Gd9zIz%7s6>m-c7s;8R+Km z%i@LhYRD4Eb_nkzrbBwB$jhlOJ}viG2+Q3Fp+W2D=0*H_kjW7K*_4KjYgRKMRdvbd z9%I8O>)Vjo5E{SFAkW)0`f%TcBsd|Q)J8v#o8AF=GI7s$|GCCy+fZX{-2NzBxbI~t zv(-~}_=d<8h5)9O`1IR9Ae@eS6<-8z-2!^=3d&lc3$BMyEte$$Fy-3S+x}roz_oL* zh^V=v{>j2#)xi=j8QcReI^r-K}zPKSpEr&Ly;dqI8}CD{)>-&iJyZ2 zryWo8N&Fpt$r&WH>HB{BcrMt7Onj9*5vV30gQPQ|pak$scq=O4nho8h)t)}{NPz2Z zyc1myc>=$Nk9fEmcy=2i+~7-K