From cf108e11d493d104073c46df6231d7fe27d9966a Mon Sep 17 00:00:00 2001 From: Jay Cribas Date: Tue, 16 May 2017 13:29:03 -0700 Subject: [PATCH 01/18] Create index.html --- views/index.html | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/views/index.html b/views/index.html index fa74827..275ce0a 100644 --- a/views/index.html +++ b/views/index.html @@ -6,17 +6,34 @@ + -
- +
+

GOOD MUSIC

+

You only need 6 albums to win.

+
+
+
+
+ + +
+
+ + +
+
+ + +
+ +
-
[Your Chosen Resource]
-
    - -
+
ALBUMS
+
+ +
From 31d27c28a503a96dc81c550dc22518c0bd93a4ad Mon Sep 17 00:00:00 2001 From: jnware7 Date: Tue, 16 May 2017 13:31:55 -0700 Subject: [PATCH 02/18] add ajax requests to api --- public/script.js | 98 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 96 insertions(+), 2 deletions(-) diff --git a/public/script.js b/public/script.js index 35f3d68..b74dd34 100644 --- a/public/script.js +++ b/public/script.js @@ -1,7 +1,101 @@ -console.log("Sanity Check: JS is working!"); +console.log("GOOD MUSIC is live!"); $(document).ready(function(){ - // code in here + // get all the data on load of the page + getAllalbums(); + $('#new-album-form').on('submit', function(event) { + event.preventDefault() + var newAlbumData = $(this).serialize(); + console.log(newAlbumData); + $(this).trigger("reset"); + $.ajax({ + method: 'POST', + url: 'http://mutably.herokuapp.com/albums/', + data: newAlbumData, + success: handleAlbumAddResponse + }) + }) + + // becasue the delete-btn is added dynamically, the click handler needs to be written like such, bound to the document + $(document).on('click', '.delete-btn', function() { + var id = $(this).data('id') + $.ajax({ + method: 'DELETE', + url: 'http://mutably.herokuapp.com/albums/'+id, + success: handleAlbumDeleteResponse + }) + }) + + $(document).on('click', '.edit-btn', function() { + var id = $(this).data('id') + + // hide the static name, show the input field + $('.name-'+id).hide() + $('.input-'+id).show() + + // hide the edit button, show the save button + $('.edit-'+id).hide() + $('.save-'+id).show() + + }) + + $(document).on('click', '.save-btn', function() { + var id = $(this).data('id') + + // grab the user's inputted data + var updatedname = $('.input-'+id+' input').val() + $.ajax({ + method: 'PUT', + url: 'http://mutably.herokuapp.com/albums/'+id, + data: {name: updatedname}, + success: handleAlbumUpdateResponse + }) + }) }); + +function getAllalbums() { + $('.row').html('') + $.ajax({ + method: 'GET', + url: 'http://mutably.herokuapp.com/albums' + }).done(function(data) { + for (var i=0; i' + +'

 '+data.albums[i].name+'

' + +' ' + +'...

'+data.albums[i].artistName+'

'+data.albums[i].genres+'

' + +'' + +'' + +'') + } + }) +} + + +function handleAlbumAddResponse(data) { + console.log(data); + // reretrieve and rerender all the albums + getAllalbums(); +} + +function handleAlbumDeleteResponse(data) { + console.log('handleAlbumDeleteResponse got ', data); + var albumId = data._id; + var $row = $('.col-md-2-' + albumId); + // remove that album row + $row.remove(); +} + +function handleAlbumUpdateResponse(data) { + var id = data._id; + + // replace the old name with the new name + $('.name-'+id).html(' '+data.name) + + $('.name-'+id).show() + $('.input-'+id).hide() + $('.edit-'+id).show() + $('.save-'+id).hide() +} From 2a08425d416f3c44990fa55af3737ed0a47e5b00 Mon Sep 17 00:00:00 2001 From: Jay Cribas Date: Tue, 16 May 2017 13:38:44 -0700 Subject: [PATCH 03/18] add css styling --- public/style.css | 83 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/public/style.css b/public/style.css index 6f2b20a..413b63b 100644 --- a/public/style.css +++ b/public/style.css @@ -1 +1,84 @@ /*Custom styles here*/ +.jumbotron { + background-image: url('/images/c45e331b0f6be2fd15942b0c3b4071cc.jpg'); + background-size: 100% auto; + background-position: center; + color: white; + text-shadow: 2px 2px 9px #000000; +} + +.edit-form { + display: none; +} + +.save-btn { + display: none; + position: absolute; + margin-top: 20px; + bottom: 40px; + border: 0px; +} + +h3 { + color: white; + text-shadow: 2px 2px 9px #000000; +} + +input { + font-family: 'Shadows Into Light', cursive; + letter-spacing: .1em; +} + +.shadows { + font-family: 'Shadows Into Light', cursive; + letter-spacing: .1em; +} +span { + position: absolute; + display: flex; + z-index: 2; + height: 60px; + margin-top: 70px; +} + + + +.center-name { + justify-content: center; + align-items: center; +} + +.thumbnail { + height: 450px; +} + +.edit-btn { + position: absolute; + margin-top: 20px; + bottom: 40px; + background-color: black; + border: 0px; +} + +.edit-btn:hover { + background-color: #1f1f1f; +} + +.delete-btn { + margin-left: 50px; + position: absolute; + margin-top: 20px; + bottom: 40px; + border: 0px; +} + +@media only screen + and (min-device-width: 320px) + and (max-device-width: 480px) + and (-webkit-min-device-pixel-ratio: 2) + and (orientation: portrait) { + .caption { + position: absolute; + padding-bottom: 20px; + } +} From b3cc91a2fe87a020e34914cf109b87fb5816222d Mon Sep 17 00:00:00 2001 From: Jay Cribas Date: Tue, 16 May 2017 13:40:13 -0700 Subject: [PATCH 04/18] add header image --- public/images/speakers.jpg | Bin 0 -> 41189 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/images/speakers.jpg diff --git a/public/images/speakers.jpg b/public/images/speakers.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9b8860a37dc8bc92d9bdc1cf2efb88e2883e6e30 GIT binary patch literal 41189 zcmeFZbyQqU(=R$eaDq!9z~C;yLV`_jcNri^uwcPmCqRGz0RkadaF+nV-62>AGFWhT z9|ju+?mW-?z2}_o`<}Dby=&dS?mb;=?Y*b>UfuPpuCA`GU9%tN9##RwDhkR905miJ zKnX>Fhc$qqys!OR06<+Gzy$yRZ~*9NqyP-m6&i{Fk@kQ`e_sOtY^XB;fRTgtKkw$C z|NAcbY7WN#xMuz9!G|Nj3oSbrPZtk67gq)$zGr|JGRo?Y{%Q?X{=WYEIRNn#-KRhC zfSN~p?{QNPuVsQCdH^Ii=&b0g7-&oYbP_ZS610at01(9yCfeWSUrhio&>x{;0}?XVPieQ!SX;u2VjsqB4xxBAY&rNlGYX^w{T;|4q-@;p~%${ zs%Ei#M%nE?A)6>1inFHsiq(orswDg?9 zqT-U$vLE#gjZMuhU48vO2L^|R$ET)eX6OFQuWoK_@9ggF!!F>LSJyYUf1yN4_g^4U z$G>s@1>zCr|3pawKu1U6#6ZWuM8`yb^e7SyB_j-CQpQIN0@7rd&zJwm&l$si4xwEzj277fG8-Upy(U? z1;*Ou?O%92JiWaC!t_4uL-@aNeM$QIFKGD%{{gP1w(dXh_4NK5A@tu6*EjwHurXqjxgo>P!l7@~INb{7LmXeZzhk==m zos)}`8p!*Mm*W{L2Pek^su477Y-~InJTg2yG7cI_8jku{cnH{eRekT&d-o{;D^=g!EW&y3?=YqrkTQvIGx6spsYsz9o zy8joh9H(-$F&R@W9Q1TJI4zswBE#seQ3%s6lgcT!VY*>jjH_(cZm8ndEz3uh=?u(DBE%Ks9WSCB=PSp+b|2wMnp*N>D$R(CB?B?ba zP-QTfh(`Y*NGZcz|J6UqU-KJ~PAbG}=z=!DnB-f194$ZiWQ2HRC#hqhvkLsI_n=B=Nv;;_7O~^1y;{=bo88#t}DOe8S(O^@DZ%je7_JB1`$0>>GQO^pPDvM>?xFnyzHorQ_Ojk=xL ziR@|6#zCzQ*aAAN$p0mqa7=q9&1~#kzR;=y@n-iMSiM>{fnk)L=houQ=;MwV3ti#obKW)Fmw>hvx8# zzxSpQ;~-11NTsp3mK3?r6Eyb4F`V_aO~d@-hKhfrs_X;j-BB|+azSD}tzqVom0L)< z|A8+i^2g$$Z83otCyO_uF@!s#Vp&>MW%`-RPD45uYL9pF z8glmfr9bGj6GdHVxpEh=W?Bz-isJM3xkF$@IU1{jx zE;U^&dItClDT_Nnoj(3&t^N0}`Oe5H+0)m?t{1BxIkueW)r2#Jm-s9nPuVlbYd?;8 z{3#iV|03cCJ25pwzjLkBuAk`iZst{@KjBkV!s^5<-Rui>Gb5Kh=WMapqZv-sxZ6&F zWfI~3Il4j=`O;)Hv7cV%t85O+EGFo>m>}4>MQ2qOE2a+z3J)Y4^ShDK>KRfh3!ZEX z2LD8xvE6FonCB+#?PT=6-z>`(!cRtikJcNfJbLrWvg~#r*|(x`{+&XGY8pfTG_7iFC29%PZP#yF z4Mma>=Tx{F#jcB=crlFv9iE$_rhu+;gaONMhh{p~uWpFW&9ZM?n8c;!+464l)7Y5^ z8zCY9a^gl`~}n1e0n+^5B>#8vNAt->orohr>1n;!H8e@Rm}>`};k$AYJ}cG!=skgPyeI z`17rh45S|YN~XoO8W)STP4cmEn5}EiO16*wKf1=P_)AS*$W}w!G?HJ&g}e3ZR{QUK zXH8MBF=Ov4alUV2>|{Drf-F6oQN}Dol+Hxjj$KQeS8d_bvZanZPd?WSr(-lU$cdLX zR8aVvG#h+Rd91`~JSzEXno7w_Yy_#G!Ex26X~4oXz?m_`FE^vd6Rkbf2-kltJCX$Bqdmt($90nAb#NJ9OVu5zR}J%r%1z@r1-R7OT9b#6V-*k z5bhGKx#umC=wCisfuBaw%xX53u0%R(__{|)+;J*{+pDop1{RjM`wrqz>M8m7e zeF@ZX4Xl<7lJgITP;i(%w}bQZ!g)lF2PYC<$0}Q|{f>%QQ2b|e*2AAlQyw2Y*sY>x z$>aQlz<@3M^$(HJiq{=YV=7ozl4fbMo)^bTt$wJ<{w@P%8eP-IopFoN4>g{C{3o^d z{Uoc#{!)IYv_-EM)pVJO#7>WMLZQ_pwTJ2C!GM2OYxodSWH$OWXTT7Fe_88qbgkuy zxF>2(#V1BO2_VwFwKieMcKxFBP=wzIy zt5mp5%eDB-(HF-TW7I|$>c|(uy3fl`b1U>-1 z<$qRPEp>cK^4B!umVTnNX!YpmoyS|H!~Q;Xv7)Kqg$zZ&*( zU;lKJbO_7G2Wb~{yz4i2lqJHqx1HQ-e1xd|Yog zF7orHC6GPY`Q`7Hlx&x$r5B(V13|^q;tr{LPswdvWxjvnT0wVr&W`Kc>AUU!5{dU# zVM0Zhy1J_QxL9r*L9d$MtLb7)#kXMhU*~9@MinOAk#fnK(>NU0JW0jMn|mcVzm(J4 zeM<%!LQnjfZbT)lKPbfZdQ*WWrB06}&jyGFy`Fw?WCVY5)bEwylH>T5l{fRPzredw zOhEq(dNQZLeX4k;EhjuXL$3@Ld;o}@45WKx1=;fVv9*zk`Jw_DfmoN z2U-fVFYFLs;6SO;rvaASSPI*zkuhS8`UcS>4eOHm-^_ZvC%jRP-hXv{Dm6!t2ZMt< z>4uF2=$3sB0ywg{rBjP%j!9$gGcZw?SLdIrDlQ;G%imTKHixV9wzg2QR`8+51N5@?(2W==1OBMD#ru`lQyJv!Ya~P~qt-f$8){8kGZ7Z$D>rBdOL>@4etcU~si_wpJT=ozxM25B zhQ+8h(@aSDq)pzH$-|tAx~b$yd6HxVj*O(=hbE~qm@u||JY~{4-rss!)mh%Qx!1DG z$?pjk^HBuFUbaDOh@Umt4@{4VG&@!D%$r7~gj8Lezsm~P&#jwfk4-kR?9ZQOf1#4@ z(c!XZX8x2O40U?x-}WRcp%3m}!>p~)r3UBZ+ILI>`wf2n<&vO|=)k+7IWAw!;`U{2 ztW~B3zj1o~Zsfl&I{&Vrm@zJ)@)LNsVdviQa>1`7n*8XSeIyp%CBqkPk$AtYtgoYu zs^cD#Y{o`TEjMkONb}TLe~#+S-CP@g-11D~xR2tAH4TijHIG$v8EF~ki2qE}I{3o9 z=H4A26?XXJRzw_bZ{GRr@@Ea}RpP`$Z}|mwk2EFcb-$j5O3d><0#ywm9{{-<0X%gJ zw(9>)CH||5R5VnPtRv!ByDS0(Qy6qr)tVW(_0qDvdarKmr!S^`0ufK0rbpWvr_u*v z+hM`0PrFJV0DNDoZ8C(J+lHyd>K^OuJc}AtBI38$c^kB6RlPbx)Mys)uFDMbg6a#& zw)4{_gZfJ#iFP|;tO=aX8=4znt7>rn3_33sq3H^Bs{6miA|DKt6G$BUX@TY)u=+o$4LFIhhMrUujYlwv>n%zbs9zGzQB)y7dB8t#4%*{OwMhF7yh9 z2E+Iz7PdTd>1cBlu;@eBdCqROq-amL)ub9ANTN{xAzVo{mxpzo9_@UYOLgdmRi52u zS-{@Z5DfDHkH5yxCa!l*fzlk~doGefn~sT}LWolwA(&&gaRDE5)b1G?WTjYDWBOdb zI5jPpKsq=#)dXCghMw5QzG$`%G?iLCF2EEcmty3~ool42D=kz5b}~U}e0WcrDr{R! zo_cE6DI~q8(Kc}E$()%b4-IOuBV1|cW0mD%Q-mQpF2DH*!%WJ_BMnz3l7(dFuZEbO z!}5F|0MqyEon`qNwS3uu&w2@>>kD#H@XieW_?bu%O0(}=k=(~4gU)|ap%yY73RKJk>+pJEwbz{gB7Dbfsot|;c!$wTEJ>FCc3PhFRu8?b|9ZV@Z!+(az5i%<;Ke{Y+qkYe}Cs~j2^LN z$w$_(Sk|-0_2vN}>hmHLKZ?T3Lu^0zkh@=(U6Ww>ZODDanaxiDIoho_p#OJDqBn*f zMfo4Y^`4V?IB6Nj%bdn2)7f+{T^tJ&G3parzYJQ^ zE`7w|lcE3gT%fr=B@IWnb%~+gCzv7A*>TUB%}dH5-I<)OBSeq|r(Lp!(I%GngGcZNuK9QYETKTK?hIs9RSevOK4Q@DB_ z;$${6axa`X=_x(U`s=&pynodOq2-px1*;;fH(y=wlUBhV@v1*(G?17h*oV25<9#iY za7FUfs+PyJqIjPcO<-${FBvT(Cf5wk{~Z5NO1pY(2yHRvI)6)7lJ{<6thMnHGM&Ys z$nQ=N5EO6cd+lyL;4Q9{^TAmVR+;XLMZ3}lo5w!;P$w*$^76a5==EXn=!iM~$zsCX z)oJwuz$BntdY%7_;&+F($dL{twOpoJkkHc9?p$(RLFKESW@Lqb9yxG-jIviX>7_i? zVs&n`iex7QjcfU^M>O^b%qf;sz4W$Rv%WSWISZGEbMvqx#w|2lRN0Znl$j&Sx@OD; zw@ZD@58|_KgG6t700?Mox`4Niq-P1$`Yos#3>1$&4jp|e2B1Ld8@sxS2!%Cwh1 z{c!WsPYft{)@xkyrH6d_j|n3QVm-ZT2HG^Zv83d-BLA%YR(t_hrhm!{U%G7kTpuARb!=xmBUA!1Wma6dmW!|y7t~* zMF{jB2Tc53BE*%x$CK(uTcs&08}YS=Cehg1nM*C$HswM5XeYGG#F`mPvhCI4FCKS$ z-#;~d=e_HM?QX}0a&rjBJ4>l8ZSNZRIkl7WOyhMg34USWH*8f@MaU(9$r|_nW z_ZRclnxLgdSrMw&4e_b1hVRuy<<6|nCP;$!jW=7uB6O;SqV%%^9A z<;nt_*o;H?Dr@@W9Cm#wyw5#22kHlnpI=Y*2?u;E97wU=_vY3<7U)azUdmHz^+y)b zAWOb{R^vzSZ_>?_5rL`R$_tS2bQQ_dSm*PymVZ3zj@zt@+qZ3)ONc$RA$!&vsXxd3 z#b%w_LoxD;DiK`j@O$O42Ia_9X(lO+EZRh=2&IZ!R!vrUl726)cY$B6*u4HJ#mHW2SFiK#7pz$ zcbv4&xwu)fJo&r1+NFoIwxqi0IEeQTfM>Z1>V_0jCs6e1M-5aQU#Xtz3B~VTdk3%x zWNd^#9o?0k<5AgED!$G4cw%Z=%&m`=Gu+0}r}Wwiu2`-#M{lAWuEuv1&Ip(`4E=H4?F>c*7zwd9M7Hp-4>M zsWI&f)-ZnU0#kV2vuwEjg~Tq&Wb3Zq`)Co?q=W^A-TD`nIBv{LzN2zo75Y{{zTY<{ zB?W?|hoU3u(3QL`({2Qm*f1GW;k(}Fy(_^(v&Txz4e|vOx}TP)i3~n`mi?ej#?6|= zSHVJcJj}B&m@>kT-sfOn|5f94unuuX^hc#>O-!lBcs3G!hhUTDJS(J8>%8S!ih##E z@~O}i1&qFDv~CpDukcECQip5v8sNCRd=)pRi~Yhby@H~r4+tj=9ml}E&BrNj&VHPGLc-=wAq#G>1UaI zmGmQwEAa6i5jo@57n5i#{ZeO+E-DUzDw_^sPNtjz@RNZ0Tc>=kQE%lu(r!D4kDQfM zyxZJYJ+rR$Li3fZ!V$V!)zMAfasI+(B0o~I+!#kZ55P_&=}NqbWFloM{6{Y_7x;1C zO(!y~${Kpui3+_QLS_^E{JO$Y+hdJO;hL`e?l>r$kgLJ|0RT2TBKfsl-&z-ZuQS`s zlxQ|sd_oh`1MH~w{3^g~q}ElC^XJ%o;ls)Ao!~TSN0UCjLasD*N>O*A#-+j?FK5d| zsB~Az(%c~coeA)Jw5$7`z)!-tzK4R$Iiq zj>V;MVo`a-nuRK6t3%trV8QfowqQoMZL>h}mCoO>Qkg}L}_%+@uE zm`dI^;znqM=^Xbmzg<3$?~1e7#u_TT86OoYJoXufKLJ z7|P3k85(+H^Zm_b#gE^UNk7w0Xp*LiL=I_$?Fj%zs$%U>r#=#yYm|AUqqa9-&oI*Y zy2P13)k0Nb|5``TTC!%(Amy17TMSZt-7(H)_4Y+v!BzDFOOu*7fuQ(NQ2<+FZyL2? zw-L=8YIXm^sK6*)r6{~bNZ0LFW#6hkW!10+6#VJ^MUi$bO^2-B2r*TP8%rgMrJ%~X z*==1{@zYpe@vDhL-zw!}$2KGPUv`*d#W0L&8gWCpN>#ajqI3)yA#0(zCJL~aa4=Q# z?**ia>3s8Sqp|#4d)dNr<+?ltEhDcTzWN>gQD7GIlQm4K@)yatrDJ5-A+dQldh>Dm zQhZ*Lb-i4{WnH-Ls3V{;`utsb4C_=|s_uHfF}}<^23q%I={mlAkB9t}N<)^sbydd` z!Z>Mp!?MI><<}tLJzC3z(qvN;g&58{`@WNN~)k*>c!WOyT3Ts$Y=16xtsI-W=uNm1qay@crVj7_;BM! z*_714`Cr{6*?%o`V)|}(G}8YwIg{?tmphXB@dKb9?Y@vt?);>ROIuMvR$8Fy-Lm$xt0vAC7q?uJh%6{=vR5!wDv8VC>diaW z^{yOV#Yfla2PuRrbf#^Z!RDqJ66KE5HiAthf?~+Y^X?U8CNxr&M57w()Qhb6!)a0lHqqAg1OABx2fIY8(3n6bpu~V&UAo zh7;)CL-CDQ47lodrW@un`8{MxXJV?r+CA>Tk$zH zA-V5*I+SU|y30@ShDk}kl?rN4U3 zES#(*!2u_a=SyxjEeoc?Dd2Q77uUtrdMdEs@>t^^_dbE91jPnYAN~6+i&9>jIKjuZ z$X%Nhq7$Bp3&T2e>sM5)gTz;b_UiaslQU>l zP>5D1l~9>2s8=_&&xMkbUwgjpzc0xm*QDQTP<>mcTKdYG7?!_X%am4*%OxJXoSJ#GXX9m~ zk-KZ83TuqueDr*e5U00M$*s6Lz_-`Wpd^7O)*vO8T3#*zmqaps+*P-sCfUZxK&f74 z+Q8(^v;?+eh4mS>!3OUS9p~>IHkQEeDJY5+$Q}5|$@YHwgP8DiWS5(f)K%M~ z7pqv}M_<_88b@(Cv=C9s+O>bSGV$lAK3yJ!zY!^Jm~b0x35`}@9EWsJzpE&KzpWoKKnaURiLXI~cS=j#mF2x@yK6JEzC*(kqesarueY@Qtn>g!yQ zx(Ln;3@E6t^D(C@nVFv=wE%kb8N9`hc?tD+q@z_qggsooRhPSZ2Biu^&)i9jyWccg zID8%v@IHmc{)*+&XZOYj`JGSSQ8MeqQIG=SkkIOEc9}y*H(QH@StwANpJWHB^HE&c zsiJ3YZq&-Dx3}0a)A%%n3-#5F)R`>|r;(B8h7{7_qpd$d)bPcv>q!$qPpB@(*>FOG zucD8F6LKR<-lRO0)y}g8n|@#m_@-w;h1fZhc(F)-;rT|)d$p_V^4hgA92DSM8+VB@ zHebnGtTxgAQdTa?e1$DUM}OI*-=3hx#Dyv#D8u_R+SS!lZ7(Mu^qf>0Va|#7y}z(| ze(m3hSVTis6i)01(xv?q@*nsh%^Dqd-;i$3OV?>KNu9P^6R5S$PTQ=c?U z!-SFEB>VRp3N z;7w#MUwHEdTs!q6h6s3Ap*QUV?;_x$3lx2rTD<(|li}i~E!&$%3+PPtN=grapn%H3 zw58F4hJ)#;wwU$9=glV+jZPCrdD*{5oCtoaCyqLq(KXng9@WNM)yhUp;+TS_NMH9e zi`#sYkF9w^j%wk&CrVeU*O3_<@p)pcq`UD?1>@gMkL*1F{tn}!vVTEn4}dzB1$#O; zoU>})(w?cmz#C^lFEKQ9y8eQ<9S525B0m4c!IOD;L2E-gw1Svh=?i2&b>2`a^oez1 zg56V%rslOI#~%hEpQn70pG5u;al8fUQ7Y<)d}=6I3EBmcAoC=oPJ_mEq$L=N4|LTm ze;WjM3<2}JFz+iC>exC`$6eEom2Q7TrRB^>0HXytTYYYsZf}G(+vQFUW1y~PWjZ2C zEkQ=|EiSL6Z=X69wOa9Ug3N&iie!+fbG5TRWNwN!b1#OOmUk9Os$lwKcIG#&j>gC6 ze;zX!(T`!M*(2jF7W^sYA_Scg+@^z{Wm{EGu?<1U}}9v<`1bMvJOm0%S{OX~T(J z*F@%+m1SgPJjI-3>3bK{89>lW(f}sI3ELbcB_&mEzM0PhBZ;)HgSsW`A=Unu>pXXk zxUQ)M;?g$6G_%Cpi_i-ttBU6l!4PY@rn}}BGpvipPVIp?N4TQJmBp_{#*SVzZ6#IJ zEQ@oN-IB+>L>7I!1wR1nH2+o=RId2ns=`>5NUEkvjimd%eIH&Vzl7izk8t||Ba{Eo z%8Q8(Md}h8nUDwrbJg!o~ z^vOEblqEJ$wcog%5&o)FU%R>82Xu)V9O=$-r`o|Dkh$wECar_{?zDL6r>L3x4|U}> zam@s*aBJ_!{mole&`3)~Xp)v`E_z*OK0i+E`4J>vphis-`f<^IIOs4*g25o>VwD`teAlwvmR@In_<2MMkVHJ{Zr|f>7=k1u zhGQa+5~8N0OjbO*+^kfA*==Ddu#`J@lqV`du4}Ko?H8^KlUNGa*i_m#)nMv-UST#`}25sins)^0$&9( z*;-v*^`i}aViS(*n)IYGmapAN1{u%ou`_OwO1G<(%Q(iOKlx$p8+f)r$6laYK%0e6 zR7q;bQeY?tV!<2lP+eQH!I{L0QA->ddjn;Bg>a&|Ce$Pkx%inc<0O$oQZZ@sP9Zt8 zZ`c>S(r3dw&-(Y4qS>D9!eY z53w=ZRd)5C|7yB3Kcd{;i6CB>^YhNMXGM8nEYRQYyu4IG?sbv3^j`+9JHBED#@|IRIqoA9`X?WKAnJz?=EL}7){(_| z*$qnf2H$a^@qH3`T3XkT!8|ZmwJJyBuHpe-8KT1_J}}>ifXSaVxI^(?4#pC>DQQ-` zDM_aZ>@0Q)u)b1bKN;J_{Y4#JQim)vG#}t+2i`zZ&a@Q#=5Y=-A_rh<0bI zavuQNGx{ImV|MYt`;Zo-OQoRH?1ektE%2(ZlqyeW?C^$2u{`JAxjnqC7{Pwqna*XD zL;o&sR&z@t#TY0Erv}Cpay$UWA-hsUe{%g~l=HWi^y1B*lZRFs!^UEF^$}K5bxTP0706K_#q$ebToeTHwmhdO0ydP!N?Ltzyjq((!MxygTjQg-} z^A~{};`aF)3uc>>(Qse>KQIDbtWwaJJCmgCyj1+l7h>$vR}L@Q^bhG7!&#<)aL+`4 zEalmoeM;%W^sKLTkkm~Df8BxYo0?ctU!rX$(`$&Ec(g97^JOEmW zPElKNz?&tql*7VtR%MWAx>!E^-a>X7jEBGLTmbdn zbsNnlXGD(uDA%DX)6aEO%q?Cbs6I!ONrlWp4FVEP^{>>p#EP}A@TD)n2uRnso*kKi zHj#>C;F!aH{?6Xj{uf300O?Y?#5x+{pSHK@ppX~TVp$Q{3($T|S}4s9k};YUdoWbf2@(Quxg zoO)_fNna)>6=)H`-L&Ym4=%;1&i@)7ExnXN4CF4P4HKRN{IUlI=laD<6>;p3Sr)`) zH<7+q=3$1pu^$7@kRh5o!ibjK-K=RzPPlJ@{e2Z`5Oo6EI+#(cMmo`v!X+>G!9UC5 z&8ydaH**lJl;F^`Z$wi_D<2=6IonL1UHJ~qLvJzHi;I7^VI=S z3NS>NdvG_60ln!^D+)W$mKoOX{UxBQeQ@{t(*X6YrVs)&Rw5z>k`ugJq9`7n<|!d6 zpxL{LyfSYcgw)=b^$5)bB7uTt^s>_r0M0W+y+*v*ZG3b7>`fNXLxYFOoDVO!R7x}F z0g#B4g80O+eEtl=(shQ6+`A%&1$R$nr>=;H{fYJ=!|OEG@dfnNr*?)glp)gNv>i&U zO7joUC_bLhRGb281`~yypX7Lgd?uKqF5a-A7L^Kf6O>QOu9)cc@f75pp}TuPT7Ti0 zWKAE<0qM|Oho^x)`j4iJfG;=@dbcy0y~jac@84$osn{N4la7%lf7z`8y{`)tMs>yn zs^1KLck2V~sJfAil`PhRV>g8C(R5yNk-hv>Iw!e2O_mBu8JSBhnCQ`1P z?|#xONwUNjB6^0Hf)mUhW8-Ni8eR`ptv&|shohZ4-ihDcpDCYPB*5+ufI;SrSAOQ{ zpw$!hvRlPPo~y0mc?q)&v-I-WW3OP)ud_f%>UHEVrRja~C>x-H$W06Tf*1fws$qC> zH&3<;n#Q|dvAXNF$WFb-l5zpdS!U0mB0a@rp`CSfRO1k^HUFAI@T$q%@Hj86s;OIU z#yfh|wM|K>-9zP7YHgU;-7sS64wPAXBt1vGFEw>5R;$u~B>pnFzeW z%1%M*bY>d2hFv8UC2RIQ05E_t_nlz9q9{1OQREz*_NOp-Z7%d953AY0si4%#_AcC? z=8}0<0lU=pSnKje=x*hR^I##OYUGCwF6N}(!F~!i{S^KBASY0(7xUi+zHwzwLHA z`y=ANfn2f5{Oi4^54xvm;xKE_dFQ-gf4>HEC?2XhbtBR?C~TYZt?N_Q%2)AD%&s>GW*l$v14S-F!BxOk zO}=S*h6$bK3K#E#FuX~Cj!=j!}(PIQI)*3iKU zcI{o2Y9TxNvr`Z>T_*v2j<aauJBy{ArRH5Zf6)!q*P9|o3cPLz*L z+#!+}keo=h@27;tQHT~n4rF$xq6X6V@&O=!1Hs?D3jn+jL(AvPFS*ow6Z8ZTUbTJy zGqGx<%7c3Kht3FiD7Sdc9PXzFQs|tzrVUcaMKXaN(?{u>*Gr#zO?BEJ_`%xcPv&b?OQUzqPQ&DCs=_^%)pUr)=g>q^bW(62jqeefpJ+1HI6cyaCT zO!Zz78BJVwt`s6^CaV%200yKL0Nj-VlRex5c>w-->i(BctEKu0~V~M&A67mgQ7=HmuG1sVf zRRP|!`nqAcV9lIWI4A(~eVspNx^z{)%lExaY``v^#Fzf5Hr{^WBKc`YoerC`KvS6* zbgN&Q12My_j@uHbJRb#|_*WZeUQ*5LP0Jesf2K*ajXqvRe9&$65oH@`=-QA%9({ zS;4r&cAG$}675Y$MUOcmc9yXD&n>s!&=^McBY!1RU!^SOTf`zWw8UrMtHLPJ_4jIUJE7*u!#t z%2#B#cktOEZfdjkrkzfc?8>^)e0xfWrm0x7_TO*iN$ z#;E*PQ`zmOoU`cbuNdl$cIk=>kH*8E(5ytsMR+o5f< z3~U7C=+3+tb-X9Q(?xb(yL4ZmSh!z~*BB{2d;sA0jsx~K&(TZZM^(=JG0>A~c<`y4 zmqOK*1Ej@#^>#Nq?ak0d^!2Gf5!{rVi{4;|Y}Z$+pe(x-&U_k3j!eAOIbi4p4SQjf zU&iElMoCEV6`vwjBgnJcf1Us0{BVOw9xNfgx1gw<3-jN70C1B}-99#J!R|##;{iap z@|QeNXZVSxesIn?E#AT0Cbxk;VK(+u*j4B#aoBe8g^oh)F11ScqoBUqXXZp#{j+!= zY()Hw`7!nZMBzj6Cg(zOwmqb4ZxfW(cM9_79Jo}KMiy+`YeD8`t53RbI&Zwr5Sz{V zX1H6$+rG_gAjT^Zf(y1zb|xJTwBo>It`7tsQIZ!d@XCkBH__Uz-QTiYyefv-fqUx% zhJa}_f%8XSbH$1g(xKT>xiAHL;IjEieGTv|F zu3rS{TsK?ScRwngHHeCRQUT{t+o3r`&pt1DT-`Yjf8-H_)$Dt?{l3%=;i5ROH99Eo zCTw0z5jo?`a;bX<3bweb+)JR9r7(;&3qKG8QGL)SiJx7(Go^*_Uro3n%N_tCm(?)D zaI96KS|~U59XX9&xc!YjQXaKw?3Dzi=ZWa*)zZgbzr27DO?`&aT1EkbgwXo5P;ul_ z&C|L9zw~F=L|5Zfo7Hz?L+>{8m*7 zvXo)EfX5P%p9vUgA%g9YR6X0VFdaP(#g&}POpKlHZWExBLS_27X@2u}}U1 z@NM>UQWcP$#M@ie2S8hjUU~6a34gd^H{1@HbKQ;xvO3os-LBUn`qijv@yq;(YBcq8 z*iB3i3v>#V^e&QNwWoMs!}UnFlYTia1m)T)-tmP+BKAdzQIUoN#BDGy$0vjD3~uY1 zRWR%R3&(3$Kludu5{M=-cpxOmWGc83F)3vSY16)8yQo2SMx%c>DXxMCsXiG z@^AFsEa%GKk6RbMWS{2Ox~9rgy?rq%MZmQl4XW8idG|r#-WMt;Lprp|-9uHelCZ&K8&2ipP(+(z2 zV3b|Ib(fuVxk{N90ByFcrQPf1kOOamG*O>{5F-BTD;wy471ZY-004A+G!g)#fV8%S zTS!7~b@%B6@!A=~vsYSgT;G4r`O!7L`tOuy5aR>jW_EPIe2$;>#_=>hb)w)TaqIz5 zQ^Ux*xzvC03#CPs5wx6o{&QJy=Stj$O8br0!yUuUz_Oq(Jb-p z(2Nf)oP%)d0q`M1eU^KeegDhGrQYVt?LpVs@iR?WGAZr5DOA?T=4QOvEa(VSp4_Q; zX4-$FNBglI9l@!k3Dso29nF3K$lOGZurXg7QGW}=-uxOO_5R%h;5K{|ja#P>OEVOn z0kb&2X=(WSJaD2WS9KT23O=})A$D6SOPrC)ZFvCXCuZL>a@d3Q=Lhh2_J4)s|1py? z&e6RqJ+?J2#2vb9TYZ-%_5FKK5RKMA;+k5gZ!Ky}9{|6S^9PE1N6nyr%nTanJH20O z&X4wR37)yI5(f=KZXs>p&U?N%f2Nn6Wuy;)p$EVhg|g0FjNID#Bpg>zSx#!oyH12C zO433PfFAT1&ixEd`sw5NmE!O-9mb{W^>Z*gWc^#40RHuKT+M8N%w-Mbmc8frA$Oj+~*iB~^09{^<75x-xo^nVpR57d7E?A73>-D4nX z=x10^K|K5i!0NZ&`_HJnjnIX}?F{pxLe#sxIY=Z@nFxXR3EVYP*f8BR-XqFa?x?1VpM@C2qMpB*BiCli&Y>|9WJF3 zu1TxvwM6O2-bbEX2=Lf0cN8TH^INh&mN~KZJ*qH|d%V_f68a_U+pzbD2f$j8CQ|60 z+r;y74(02*LoO3(uO3j@|BzNflB0^XHwqoxekdfXK$cvt!ao5()ciYTe{Lc>;>(L# z^rE9~Ypr(fUv`oO%Yc07dr=LB_I(C@KsqXp%uP#|sNAa-^>4XKqzJvO)V?hQAvxEZ zvqIbhO(7^8=*B-^7A4AE0eLTTa1BP=tTewMD)V0pnBVy{nG2XyonolGw5=#hY%>y1 z$gVoA-3vJbu9^jm-Lw9=r% zTiE*Vs!f#Hqe*Gz3NQ}{V14t+H=`66xYMs?wZ9R_N*1V$VmQ0{nIi}vwLX%sz4zUT zE;`Oe1KYpWz<(47EYn4`mc>KZLy`&k$!+|HE+&oCZM;k$c2jtv&4f35v~2tmR%p_q`drf>>6=x;+&PaeOT zwHv@BVmQTR0)FVARO})9_toC-r%~^VA+~0Mq@d4!028*0-fpBsL(*QCTNBa45pS2R z-kb39Q!0UsqS{g9o^jugTLoZ0t~o`rMOd>#Um_QDbJZg7JR;62G16icv1lfkI+LA3 zZl9h%1>H}WHan3aCae_VD(Wz@sMc1qgfxR|#)0?h2ZHf_n8lVGDko_1tl(0_%DZV) zWCDWe+i^LJ41M^xYY~Azsa1`tF2-PHERxM{qW1ls=e}Ou`wRsh96s@a~+Nu2@2G~FF`ykg?JPpCo zPvy=ZFK{B8q+4FsNZb)E^Z1pEx=@bN{>kGmI zWUd!LP9O-qqtiA6Ie2^7(Zdm6%iwG-)3nm`Id=2ibzbcNK)esI+^oRF^qqtPXhQXF zdAYtQS@5qJA*ei?8cUWBa(5_uPKtoErhj`adsUZ-PJwJj4}^P$=cgd|?33CDhtD%# zyoeDCITab{lN^A_nW(UdtgM) z5-zcq6B)DjhKVO=*>n-^pU~!oAYCC;sl> z^y8aw6uPRsV1_CI1X6wH!m)3spjYXV>NqUUbVIW6sZz_@!Iw5c^!;SUgGoE*@ENG= z6xO!YxcV=};tN-s2kZrmetWwMh!uUk+&@e;houKaBcHXiAXyg)2*Np>kJKRkLWM5S zcZTEF%(}vlL(uD(l})cjATA*K+&wv+DTrRgkor9vU>h}(s?-;F|C!jt+CZA%U>;RK z$khUCFhVg;>MDk|(G(8h_Y>V;Ll6?ZGd#&v%@;?DzJ zYLeH}ifvJz-R6`AjFBGCkoJf(yE#sXGmM8%adSCV7(o+CW9dnAT8OsHI{iLxT}3RQ}kZ-uLd2 zGhR(05@TSn8;5%L>t!7A+3N?vPmso2%T#?+bBpoUu@^mpPC)~lU8f*Erj)y`A_@^dUfQ!%IScH* zFgT9RhCuhlb&h>opN%4k+c92T6dz*Z5onyTGoI3wJ-Vt@v6<0a$^)xz?Eqc;xE)`Zd zE7~FY-vD`|1?3KH>q03t!ZKYo*Z7@1M~LL$Nrj}uEX?A&xJ`qjH=JUlIU9kPZ6nlc z?$5l`WC%A#lKKgO>)D<^*6GvIe4TEV-_`r^v7?kFmCyOrL6{T<@4gy&a7MOh2(OkLqKq2(M|@9qhSv0W4na)UZrdt@Mb^ z_RM1g>{%}}2ywQnb*=Mr;r4he@Pb0ic?NPDs}tCdTuhAJpJaY=*=yQhM-!fB!Gn7C zs65K~>aAeGBDVTM1TJ6==wI01rM?6{w{lMV*(+LRZAbG}0&UkXb#P;z-0TawC0X|J z2{6sYVl=mRGex8jYsbMK&F@v9NKiuQlTgn}$v2R`BiDPdF(8%pfWhl}kJ~Cj&ALx+ zmT-p{PbjJmQ0%S8PeIPUcYVxB1OkWKzUauYX$cL>rGG$!3=KPUq~(ijmb$9@h?fu= z4w2(L=TONLuw%bDj1(NEz$ewv#JwHU9}J;q@(xg*Ry?4`yxani8ys?Ocfl;nOJ9{K z_uVjhp}+E1VTI5oNt=c`ip=T;up{!J1OunO-lSkD=*) zq;;4R%vIM ze|<7L7I4Mte-Og(-^jd0-8(=GrhDAe<8&43OdB3*egP&s;`!VMjOHXO?yM4Qlr^~b z=~-1_L+D z)_%SwP&iWIwqS8bNMw}7x4^>BZ>^;1=zP(l*8h0AucC!m}Vg2tux z5!2@$E!&y(hkhpa&U0@S&nC3lj(Tl2pJPb8bfQDOrzZv^7Z2_z8=+*^+I~q(Rp+?$ zD;0w|?oG0;w4uO8aL8_qcYtFU)~s!}0!{;k8!r+e2I!5m(yx+LC>7HtGC+Fsd+QH!>Mn~?<>ro(4wNb(hUwd%=>OzDqEY2 zB4w|xdP^P!vbHsxg3i~OXI`>Cq!*$_FI?o~Bp9%-TfDs24$I9zrVoqVCJ2#7eZ*;p ztC+WtMP%C*MO*DIsIonf79V^NlwjShe`3F|N6kR(q#ags9xnwbcq5CL1#Yf!2cjSV_8E@hJ-sG*Ai3ynN=j>R0isL>%l8y~jI^kLJ>$>S{ZL?b3fj3@igR4_L$FT7)ymKke>yIeSSgC464|c5v6gBn z3V@Ac%K>L8JZR52b=(T%Pv8V3_iUy7uS!mTS3&}9N*ni%Rx43n+;x~GpIh>rFz>^k z7&wCC6g1d{9v|xu-CP#(_0iB+JRDzoqSo2gjR_F?sn_fH&NH*(_BA%$zBlgcR6e)+ z_tLr7=)IhT>fNL`?Zj<4g}+Y9uT@R7^~q#Yrypl_2;|W!^yV>skX=i_jlRPC-j)%LjF~Q0_KMh59iEPuSk0 zm0<2uQ1UM8-Gv6WjjvZOEo?2q!Mi;m$g;fl)(Cl?{L14YxjLrYHC@+M>t61oVOd?u zC5OE*hC9jJnbAn!F(|_g+4iqg0tF^=6*?QYq{Qo7*f;!&c=$Pb0nUK%?HAlizBe?I zDN0_Cz)JheLIq^w^RMmT9i3=+A0Z_i$hRQ7tr9%~fsJ(loX*HtL|lb|t^7pwSsIm< zuYd5h(QWWf>M*`+%W|}e6#uf zh|51`K9dDT6b=ATB8t=Zxk}7e_~m)wghlxMwQg%NfRf`=krDAjdW`YgQbC@%m20`V z%nY)blym@^nctM?*#f}R9Y3w|S4C9|IPTKl+qskJ*D^YIL(s2Q!YQwFXVx=Ua<)9$ zsGqqBwcU}J5OARchUCo7R~$*15hmD$5Gw}yKBV4B+!Fgbb*|PiJ)yT682tD;3Y(Gf z>tN#A$>DE5CeO_01DjczgGd>0B=4lf;9%k#0twlTx21yuE*RTt^KdBl3v$AdRianq*&19|^(-4tk5iVs%BR~Ja#v{AdQ~| zd@a52xJn@%O}#2lL0iPy0==t{&d(Dxa_yiP&F zJh<*E=|>@^x1IJ*K}o>Pc~G)6670u(MIH0P`H`1PozVXHt&-;ZD@fgSfNBB4;+TT9Pab4J!2)>Y1rD54W2%a z9CfcB+gCII6Svd^$tDxTzLPVgKXe{cSby5Tr;Je)y9nZY&_5`FhzmF_ZmE+!0FxR` zs|w7myX^ckX1=tS>8?RX@WT&`fS0cm=iVw7*BZa6GnX_*`DMbzU?=}j89BKY#SX?y zgMQH2;ftypS0-N8_K$$lX?Gh&qINt{*uXwV|XkZy||@#e1VIhzT~5)Xrqj0>XE#cfGGOUmHJR z^`0@=!z=IvFjqsw(v?mi$k=nPXw<(I%Rp?TZkLjl*5^0t)jF6+Z8RSgh=G-)^MamN zoM2Ma@otIc2&r{4LF+jjX263avM0pmkf#~9h9o10Uha=(H3O3M5zTx_=Tv6aU<4L= zCqbZh`S{OqyFfG!HLQ%n$^pBIGRacUpI-qiBwJ{L_isba2O3$7SjcTEV$(12+zbT{ zEXPfPkvecBjopjV9YsW;c&ZT90eS3m3i9NA@5RT2YktPKft+Avs&24xo}$no19p`y;;Y&Y#q3ZQZGn8CqU=olA7xUFYS8sHeW{VEmndp7 zqq0@5qU)wJk5+f}Kj#WW0c)Nn{d3}UayTaM10K@nO)b_j{&-~;m01wn(`dcA(RFcE zbSd-V30v&(U4HQcF0J@gQ)-__-=(dUHq}#5yU$XttKCEt${L@g@rD<@c&S?B?9Jnw zUvf|qTslEWB<|?pO%Z6Wb_UP~G$!B(JwR6TL@qs|f1);fKO9Asv?--pJo<3}?BE4R zRo~J^oMsaV?g7%)Oze}mQINRPXyRP{Tcng&1_dJ9KgoX_xz@=Qj2%;_$l=qZ&IQPF ze><^)bni{u7FgUj40f;CU5=&x_28ZXL@vMbcA9{dn>RvM=1!7)-89{1@l}q2%S*4A zJKCRwNU@|kng$d`Qr$WPH8) zxeiaN2@pXl zRm8BZbfqbV&RyfwV_$ws@`(bIiRjKE)yf6X69xd{w+cF3dz}lcPoci&7uVTICM0+! zSavz_NSC!E{^^;vKWJ_nh9MwPFMxK-c^X>`p@_1Gg>YD{6vlM1+2f%-1c#<979d&$ zV50;*K9^lwXmm);S* zI*x34>JRlKK~V@Wf#JRUCuJ_%i!?W3&)a0Ln zrfGtn#KseMsy$Qn&}pUqQ9zQO-x$j&F5=$pkaZa_Tdj1lS2`xb$Kp9 zr6Wxb=r=OK7=?&dMsOxSz7G^(p|7T%OeC34KP~I{Ws*v>HNYkPmK<>bdL#AEDTqT{ z{!C^$TTUZi?pkn5Zv$X%7RpAEWYP=WLIfG|j5^wIz3N({P(?@n&u>8MbO%Qw6aI)z z)q+PL2@INKA@WjQG+J2Odr=1>1oA^Yo%w=gxzGXsAUQQc7epn5Q!9%Ac>uY2Xk;evBcS9b5aei~!3!=&KZV zPtJGP0czaU7IqT@-AXLy{+YK#`z|$sm`G&>?8+NJ4XU-myu0=+j{`>VTRjRz_SK;sqkq+Fcw5Oi6zn;Rq>E5B znAjL{i$hOAl0b2*phm<6_TeYmO46q6huJu*qofQX)#ez(nh2PExcov4)~ZtPkL^WF zm_m%E`pWg2-`Ss#Vd}&ZRY@Dbnk-EX2I`)t8oS7M5<=r;HPuc*$YG$f-Dy_0U@sBt zWN#ned0Ok=1{m{Us81g^Waqt$a6c?Q*MKINRqQ9|*p|H8Q`KbGn6 zgom`+CSwTnqv(>6jAbS|O7$KQfkhowF`~}(;0y%-H;#)MJRgqILN4sqhjl!huftCu zZ!e5U0JCM$lii+31sb0q6?HG@*%>X-M41VBfSn!<`FLj)&eR7`yBN4SaAq47EenbS zbV@8jBu|JRNMSAdLh=2R;w))GK6tg327nhR7^B0w2>L)jbfTYdu3L}FoOF-Ywygj%(F^6i(pT>D#&CcgGh zk_va<31-kxy`FsBBH5s+_t^F84amt7U%|ep1pdS|NS|5+->nf$G*xJc+KOo0i6ryr zge|sY@A2mSs<@(eP%)sC$&Lz<*5v7KcE-8sGEy4 zIe>|N8Yp`%`r)x8z>v z1Z@-UK{hb#Rw4%9>V~6%jw(rsbYxYLZ9@7=_yO-iKvcs;hTn!t!}m@+sT+D=6YAFE z`0jOr8lwVmcVRhDMgH%J_$){Bq5t3g3?$b0j8Og`%|4uS;B<*V)KQLpZf_`%{^w3( z^1#u5Kk~cyS}VQOW#Q8KmpzXTxjjvROO3xE(O3WbSj30Ejap55cPOv#YstKC>DEm{ z@@wZ-=J)BG_x;=|2$bKAB#DE$T zRF$v+(}z8$-=3p!b%N&UVgJ4%G(!T(lozYu3>pa8Y7DI(xSHjSs91f_@h#)u{b@ve zAe_&#k_{d-A<~G_T^+^rn>vxwoChDl{?!sqFLkjfo?|EBR;E0EZ}G#f_pUx?M?Q+M z9fba?C4~M0vypSwfseHKev7%BJ3Plw)_+Ov4_u@E#=l$QiEeqJQNr}4>@xc87;jC; z$8@ivpKA;4w`l*<-${5pV|^sp{d0h1ZLh%hsFo?r{kKF!d3xZ0=f4Newq7mU=95Cu z>sv$oDTcn1qt9GR5`vF!@u|-L>pAxZcV9h@R@uerO~k=G&s-{*k6;SQYPC;azWJ{% zui#zPKF#Z^T|~Xyr8yWYs5ho_0D-5*EV2aA|9Xgd!F=n>*bSu;6Xx??AU)~tB}?8O zTY+hw*x#2t7nep0p3>p%yxBD9r5ojKVQc*M++c!)MuXL zId;~-s#Kw`Xcg}s{A&77m*<~X%M3g`Mmn?9YD|B7iHNK zdE1xUcqS^t8{{buJn0%T|J9Cvy=+>GHD2gw{^7X8VSe=b(eKGD3FUvc19-weKi}Ux zN(BTgN0ZU%PBD)2p@+Edk4FA=?LW6(kpDmb^Pfxq|NQZfhKBW@uTY@{(VU?NzBdN= z%A0dEAXb6fEP#lH-wT@>UfeL&wTSz_G&KM0H)S~m9c`lY0kAiI`1|?S9({2475YSQ zjMnZ5m8Ju5&I>z*G7Gbxc(d$dhJTJ8b9d3EDl}oEp3E1I`13+3li<$d_vCL$51}-? zX%}0%%1~i)0nU@Uec$td3}WXuSCDi-ps0t9R0KRegikR=+31FV^4u=<9Lp+{GQ#8a z(zSa7_de%tn|#RZ1?iv<#=o)54?ml&u^XR)T$DX@ha0~kZ4XUcsBrU3o=6@tIFgqr zH3&4Cc_E+Mgh&NtokWViiMS!Cl#QSz!e1PEnmHtS@ScMH)-l|k_}bF*={GS4&v&U+ z)QIvOi-J6C9}`j4-~-^wdiIO^vqpxbi8#MkqKp17`i<2`B#ATrP$C%4t%D%pk7K6U zuVGT69CNNXEFtfHv4zCE&};%PGKSPP+BzW)av@G$@0?n0eB#{K85+906g+4c>Vf2} zAu6x)?IkiB6$i$8N+!an@$X>u4-5TNMX{O(u0EV6Mr7`<$am9A{%bwYn-XEn9%ule;JK=3lZXp&&`PYa+(Q@Jhkqq)L3#2n zH*t;tQ?rBPlMFTa%UYJdQah+yapw7_F3cyQMVm-Jxa-qig2E^I9tD6G{q6KUeTeDf z2L01r4LzBjEg~pBcHv3Pbci9_rJf|8UI33frFdLuR7%Y!7R@SjNt!u1E^pL+cnt~1 zx23a?R?-2%(Bdcktgi+N9>Vs!7h)9xRAYAgJo_U;L(UlUiHx1Yi(Gke#D_SJ?SI_i z@^o@(7<>0~kwRh_p`o@kKBP9UxmlgrPq}5LLw26#=A~26c2;0^*X1MUU$oz8bo<#s zJ~xl^oeTlzuq?Xn=g}LmIJG$3IIlqZVt|g7M=N}K1i(Dvms1dt{y#fy|5+rF9qDj%-_{{+L#h6o2 zbZg_P;}zh8(*_>UB-4j{kLSD8`#F4@Vcz@Co`3l8M*3?kcaR<8NUoO~7UmCsJKuet z=KJ=*x23ZL;J|(BONDPgySEyls9<-?7nrtCUO(Re1wP3oM>LIZ#E^&rcHj-Sh63VH zWL}<4Q`yJlkkNZD-<2r1%rcc ztfd~Mb9O-~nhQ_JFLigqF6r44xqG^Y;6{7V$OM|`=H*vC-NZO=+bd}_5XCvO%I@_h%zw7{4xI$_kBlnLPdXJ+m&7tU<+@5Avw1~7)|L@TbV?& z({@SeUxN&9*wqxYAPzNFFFffBQ5Svp<7olp72jWj!?j4MH@;s#_bDrXTPa{j{niYo z&30S*<1O5qvNkYD3;2amxtIKav*P?1e?#sHCS#1Ytl$RzMw@H#S?v6IUV)&_Aibq& z`v%M9p`_0M@1WhlHa_Q;J( ze?2w@`#fcH1rm0B8astMtIF4SwWoP2TWn9 zmXgk`Uh=~8Xmgi-v-xIVxQ?%pC4;yFMSR$FI(S7Zu-=A>Y2JZ$T$`*?tkTcw&ZUt= z+5!0c9M^i~4}@Dx&SEj8ca4~VS8cHR#v!6Zta|`gltS=v4KUiOh>-Xjn7!Y{v%*?IM2$t8+?xp$dqR~TY z1{TU)>F;q^BK!iskL!jynhUCD$ZDq}vp&|Zx7<^f4RFDqhOq%x$ZF3Y0H2CoUhCTh z0cG6f9W+4c{Cgko{{$h@)O~%7&nRm6&b53WZe`an>V4wRFp7yXlsb6bM|*Yl7HRu$ zmVOU3{UzBNtjonreCtn{sByc_ufBTudvJdCT2*>y-O7Vd^I-(-IzXN^D);%Fg473( zRFNIHaMf7*v8>04Hw~DSCIH`J=bcSe~O6zwwF|4H3yFnN4{9-Ef zEX=L4{U!ys-}o{@k~#%RL6@@sz`WFsfH83eEToBgKTi%p(LNuR0@DNUg-uqpmzMTJ zKW9Znf?O3<-eX92F_*rR45t3Em*x#6mKWTJ zY@r*wQWr*|%66vb|JhnEXqo`z6gRCm1}>v?Azo%$%93a%oWG!jULADL-gh_qq=b!G z589%}Hx7%*xbF|oy*Hc(rFyU8s;@#Kv$wu*Ie4jJ+HUUydX`k0aq`+8c;LwQT)Ye5 zp~`Dnnv;~2>u6@9^R?~+{n!bH*Raw@<>WL@plJIn#avQO%Fd=8qE|WZ@s#Nr`tJnf z5!=Q#B~jTw^vwBtqJRuL;nJ-vCz+2!-*C&grRIw|!eu%@xdUh5G6Xt$#GE3J-CnDO z>owgxI;p{3JAm3>7og!|mQtAeXi}pE5(w z9*GRw`-pRySj8;^$)IJrx`&gv;mB~@auwkCnqS~TEhJ>8lm6-;`@>sq(yP~KJf(A+*o9#+FA#&2#flCXY#MoxPIL~@Y81f2<6== zSueXpMsIabDa#o3GlZ?IOidf1N*_3;IGdTxRFpZiG08p;kw4N8<54&wx zk7}Hi=|?x4Xo0%HeN~${ug$8FaD8Qp{N+F`Sj*7cm#3iDrgpjYlZX|{`%8Dyq6U_S zsIOi^!>GueVrG_}Xn_ZrYtBK$;*=o_H`hy%k)eA>smJBakFNqBgzj%j%W&&16Wzj` zLY@!bg8+pkL8kfivBRz-gx_c+?lJD4jQX55g#Cf#w*p|zf0ilmnm&GocLD@0F6IrU zW5b9amtJ@nA}1c`HiOSM;Hz-f-?%?3PD(x@2IW zN=6{N)MC-MIFC0*KGYCMX2Q*x0KntC7KH0lZ43ymZ&oC07x#w4FZh7*xGm*R8lc6S z=RI(2-|p$=T{7(7wtO7*Xy{Vsh-@O%uX$#h`rT9{$vj+7B^hc?L~*7u(Y20I>(2Sj zzIYAW_n2vN>B?MjAooCrFP9BQ0`%N$a1+kyWVs5uW&0B%k0Wbx?1;(6@vVVq^ubN4R@Dw>0yt$=fmvEHhG${dFG*vXt z-Szt0#2Z`9^G%Y}$NFLp*(+Be2z# ze8)mGeBG5m&nUY-=zySua?Hzo0x7){t=w+Cs=GH4knB-!<2u28Xc2N=jVb{@6AuA= zUpW75c7fhn37zAS{raW3S>%m#k68BW;al~eqY*7Kbkv(6k)4~AiP*yivMDYj@Czd! zj$+R77e>@c*}vs>93FiBo3yQMX0ZKlMFAdhs?T4B6?HO4WPnnG*S%{--Yr!1eZUM1 z6(z6UX6l&V>a`j7bUFozAE&oxJnW!UPA4ABg3+bGKRS zUD!{ca;|*O<`emQWA8Auot^3{L52q)jvwYWHVKT(rU=N87F$BFlMwsswvh?)o@J}E z-s(DQG~a}<28W!V^;R+JG|6rVCuXgf58yo~NeJJrCC&;A^~28?|AyvLC9b_nPb(7f zUfC@>H{G#?nxaE(4bmMb8Hgn_jzpvd8>>F6@EziDnml;!E=&a{Xm)2ATk3Dc#~5v2 z$lyZ8{)FVRF+mT{;G~u^`13YTLAk|q%1@+@0#-I}9Uc%KR=vvUkLN7opSe7fgVVU? zTG?nf#2g6cmhWUClt^21f{5Lt6jm*`B- zZdGb&qi_2Br|b}d`ba{#B>J)xH1UeJ;y-nLgT==`Dnit#dAE3c-SmxhMnaCaaFICQ z;Y5ycS?L)K{(MpJD(n7~AY-tyX`V>fE08cOtO+8dd>zvpSkIHes^Vql$ZL{85}lia zx;MUAhALXeF4gqovtg8QzY(%F@9NOFUQJH)UA%wP|VZ z%A>P(fj@y-0QRC2==~!%(*-863WhtsSE-VluG*=3Z|2Wq1-ixvTH_-CJ$xluDmWnY zSDYOXBU)-Sjfby0T~r>Rnk3H!sa}aGT_ev~++LShXxq}d5q;3)KeB+3HC_PX*V_-- zD{blGgUhL^0f?5tR2w_mI8`f<(yCN2AW17}PN;X#NriHVTJWo3cMi=;^H5~`k<}Rs z>Ah=CeBh6DI_6IJB(Z>i(DAOm=?jG$iz3wMZ$ccUosUN{sTH@Mq^0Xp&o&4^Vv_$r z>MAMbMx#{d{{C5&b~{Zz#Kqqq%a@Ipnrcb)hTi^T)0NR%4+oK7*AzS9!UQAehCWcR zL}A!{m&tcaiJDvv@oV{F5MRW%^7iXsyE!CKhUOD&o*Cj|<1I86Ud&Mn8GDc2tkj-X z79W4S@9wN@q2L3H9FATq7@EgqZ)$u~p5JINcmK@?dr{ZohB$T<6pOHBg>+#p`CD~s zfkJDz$bI88=EljJH4VJ3eOQlnn@4Oft`auQ&3IHZq6_I8<(nj2F|L|f0rAGhzW`n7e;2K*yd-b^Zv&|_n*_-UInj$l*m|LV)A>+)tw z@p_`l3YORs+2`c&!uGC_>{j<;$TpXZLz+Tqva!V)xay3;E1&*r^N&6zO~(XmI@6ax z_?{}Pi9rV}g$)MXFx3l|d{x2llGL;2JrsNQ3h5p;xcuTwa5JALfm(SzY+x9hlPQ)) zs#;A+6|~H%b0!5!i51epmk2v&PeHaP&C>koTgrTiwA4>(!uDtO4s+bJOmghe&5;X6g zGxTu9Ax5&OgI81&SRAhghM0JOg@XuI@TBYIC57UcYK&)J813S2e_7?%fWm8OMOnxZ z$9bW}D;&v*`xmoQj4Cls#)|{wE;*58$BEYv>eb7RbcST*ez89p6R6aJ)|rxE%iX3b z=LVu>g-Wb0Do=cenJQHh&oj1_qTpv#&g#?V?8+P{$>F2tst74gCs9mqr|jQ{e7^pM z&$jb$x=J54`h;{wiZdKN*{qv}kbi1BQdboxVNwL|`_438sJ$r$|3hb}tQa>Bvb+PuJs+GJz7H}pbG(0dDQ9!SL-Z6V!A2*hBe@vxs6$QdvEGX(cH;5OXitO)dKu zfHEblo25L?1xUF=UO1AzoS=R`_P&c;>Jm;Yy(9mPn){WBy)XvB4xR}4Ngmed%iPT~ z$vjRXiGmNwlT6pJb2nej_@l;=2}v(U+@Tl%Rq67{NX&E{K0ax5h)C8S`3#{AC<R~`Vvzj(l9$hf2O{?;n=DO%y#F^pZyG)SIHx-tYXvY_=(FYB=GRC{*ElS z?AcY-%|DaMVk?tP8Ony-AelHZ&yXb55EHtX(n^38jFLWXfN-~rGwNeiCp!1`=iDM7 zf8g~qLQxR8mk^AMRLm%TsS6uhCQaPJM&|J-L;AF`%}Q*NNcPs^-Ku|Mm+RhYUKr~+ zE-P0zgg2(#gh1yX|7@S%a1Ts=h5TWRi4lqv!;X<2Xc?VnSh#iE+|Z7NC7kWO&)+6- z_E7y$_oTXWcbRh2+mdNs+<(w$Dd|TYCrNsUV$KsbBpQE5Djq85cR`^kgYF3(!z%S} zS*0v=QCLgt95CEn3umY<`JivFAR{Kj;-6fF5rCd!{8p4S-@?c$(efSpQ{QC*`J-Wu zBLIk*Mwi#VOzyWa9G9A`0}d4Ts_vw=_ukk`VB1i!4Ef4c6`5A{+rmj~ejHI+uGeDW zXRO*knU{{lS?I3kyrUao8N$z}pcziyrPObeuNapF&|+=9UqT;tpEQib1GW4_$of+E z+^h&YwijCWyD|K*A;)kt-TwmO^}#1*o(DxdWg*oBqwn2<=I92Wu7R`eY}ZM~c(w2- z+$!I*H>0SI?EpROZb}Cd;oqzL%isT~Q2=^sU6!2Z>Zqpr z>JTBjxbvZ;YqvIi{7XKPjSl6bCt5*-{e2cUMOX*$!BnDn99u{@p{meEtvnJv;h)6kbtr-ZbI0iOA*ajf@03=ws?r*)u)hYd}HP z&dK%St#^tNVOMC9f}jg5EN_l$R=nW@)M?m*+WOu4%DMi^=)&)`2a)(yW1`k9ddOf? z>U-dqEXnB@j@zOm!_z|0Gpz$^M*Ay2LQQ%nulh^FkvPX^$U^(-CQv<6e?-YknhH4&ZWJW#Y zg-HR}E+hM$XhnGkY3>;*3kmGrS!r4nxMt!5yqYD;p~gmN-SrrC5LmJh0KL-}{EA``U1F-YtiBJ$JsH{q~m$ zBiBDpVa+=jsvx1C75LfP=|%0LDLAM2_vAY7mSz{C{BhGg+cxxsU>pxOIrO7hSq`bm z^sZicYxmpzgSKgv&vi`+GapQ^qb}U(*88Q-(kyX_Y!m+*3QgP#(ra9>r%bO#ky*krT}b z$BBT@237E2sp;*v07CHfH2DcNeZvc0y8{o0iE>9?H1hl=Tu$brocY(&jLVo4Y<_BB zRp(&Z+?xV$o6^hdWd42fjk9#&P{WymnLo#H=T``Kmj{Nl;_l5 zySmsi2n$Q8{w=>mu)gVg0L4V;^jx={3!FzUbPILv|j0aU~HnlU2 zHXmPr2n3z6-q=k6MHVSDXtOgn(?IiRH_KbzGvipRe|QnAq)a(5LG!m3$=d!8^z(!2 zS?(rH|G=}%RH}5B`?#nqZjZFkAqk(gSdMb&c&iW#U2lOD zXf|GHT!7||%S;iRq{Dx1SxJP23@?G-3~e#geX(BC38)?fBk~mLbt6imL%i*;=8}qD zk%~6RV+Bw-HIxpu$|Qt=KF<5DD;R;puX=L${c z#2J=5pi_SEiflTiZbX8m9GBR~9j;N{rrND8QWKsDzwM>@IdMzHEbW{xvt(YU+iNFAgT#6Ryi=ANF{}_3;vm4O2AuYRl1FGVXLVZy#Cwo&Z zP4+<1aM4MBg_<>J1cfg3J@&Ra1({3F{hw9->=7ja!f&d)$TID9%rim5sCW|YJZbw zn^+P?UW%hu_eXYWOT{Y5HIHjU?vk}r6ugNQqx=jTRrkYV|6GLe zXf*yf1wAT?;=kL*)E%sPIsT;^B+dBFTL#^nQ_$s~89#r*nyZX~eK+TViuL%k{=S>T z=Z?S;x^NG7E?(=AnD3dqE5QNJ`lR9`2wwQ9-KeqU`>5M5rDiA>$4c{cx6>y%K%Ii7 z3*b&$*Oy$nNPOO$-h^TUr}0uAy9{()c>bq`qS*`4Tmzwak?Upo9B%J>GCaeR!DzN2 zj%EBRHBjRAKqvZZy?~ziaBlv!!VLqIUr78C&usC#?7;RI)HDa`(1Ok9M*+4 zJoq)ilWmNHX4rTae}}!6D#>L%c2|-aK)&~g6Lm&>Ye=Qpv(ki!5_EnN((&3MAB8U#?!lIX@!3#dh(%ZiVwn=c!<54e#PO|<*z?`Ea_{pD) zxbF?+(BVc4wP>*uT_-<6Gb?2>Hc)Hi30Lci=IPehtbOjfE(c;sM%*`R+cFzPxR_Mz z%K3cyw}09T!lmDh2WnOEW>yU_B<3aU#Q~bts5ob@a`AOWs1)IjnqjKGr~MMvJ~s`K ztxi``r1})3sRkW||5ZQ>qWb6_FLNI^RQofYG&^?9J);;z9lR!7gNHSxO*9S5 zN1&3Q zjv0I;xJdm1SA5^X#o=&ueuhziRE{(L9=Lm8;TppfF7)!12?wZ%tzaGCX+^>mJX5=d z06a-lM~y>%-&rMUng+vdo3^PJx&CGYM=ugL$O;7gI3vG6HST>o%ap{QFNf^P)))g^)yh~adhEjOL zY6enmRDul;6Gwk7-(pG~k{KB0+62%#7EwKo!a!bq=(S(++{%a;yq|RWtV(v)Lo~i+ zK_}>Fdu@O@W)fc2$%=Eda7c=*izE@>v8b6#2^I!K);>x&XcIf~Ef3|aJbVb*p@dke zoMoYMTCmT4|5j&$_B}p#W}xhEiK3Gd0i3-_c{^cJkm>BS71U@X6yS-N0!ydacvW5%n2NErg-x7z^2cIAUk>oL? zxIAU`MdUJi(o{D@{rKB!)0{aM2fd?PS{3Y>*Zk?4^=^fNn*-GUv8b$VO}9%bzy`ckb2?NqP%yhDOfMsVRSMn4 zPUZ$l*7)-UsczS2b@#>|I0ddZ3ctHn{hNv?h(i7KKUS820eP#vE%lp%up=HLtGK_3o=}3X`d0D>2IU z!?xKuFVA>OBb&;XQOV-Pj^<$$YZpc&BqI6=LsQG8#V`GkSEVu#bL!v4SIH{B#`wBp z6gbqIB_tzr)=KGwh|{X=WT-`TbZ~{{ZSZvwnnx-`q|gv+|zbH&(&I@aQFy*=)iSA)Cxp1 z{!&oq2o6=RAwp%|7orY;UaUTd;++K^VeVYjNV|0Id?Oh0_1C%B2y}D*0NX39bu)E` z(_=3P;$!N>Ruj|3=#$iC23~*2yaYW(ha?BZl1FW-k#QVfAL(wOoBQu5{{We1kOOIQ zzmxIPU(8&tnxiB!>#y$e{MY{gz<)sGQUD5GvN67oUlFV!#jhX+IQ^1Q0A6zWN}YY6EOglnRvZsPkfql9(hjAU6u z?y!!>;fgizf0{jmll(llr|bv6`>oLt)>J&>4{a1^N*>Ddm5$6ytFQd|vWV!HdxD^S zj7P;K97xl!hLehiLo9QJPQFM60^?bTj^EP`SPtvrB@^cI{H($D_hWJ3-}C(aER(U+ z;r{@?=faY{LxBGPKQ%)TY!Ure5OtaAv;sG{n*`!s=&o;ZSw06QY0Qj&R7!zm`@Nq1 zfA^|<3>fVX?B<@4(fu#8Hs=!Ta5)F0+Jees;L3IX0HB}vNdEwVq*)C3i$CJQTsl-W zVFdl%AJvJb)_93yravI4#0U>$TopjIgn%Qom+Wa+ z^6rQ2=93>U;dY*f@>oD#=Qw|=yE1w^kLhHZ_Wr1HfsvT>pMT7FrmAZM{5+`<2dF>Y zd!434yaC{!+Ps${=hY%i!pgBT=Og+270bZ9Dp)6CP0iFOg-)ITY033fb z9cR!V)q*Ks2_Len0So0bWdX!ub7se&vK9o>q95n^o@(Mm1|9G}*V#l3*gd=-O$Hoq zg(van;-j8#28^Doc~$=a48L{(JRROgj`I8(Br^X1ZE4ZN>uY8yE9{T_NDLqKyI>*D z#TOO@8D*IFW`BzX>=9U!IPNPF5gLW0MBty*h9CZm%SUD3u&4D+MA&&@?)eXM=EdX9 zlC4OgW2R|#zuyV&k%3{8ih}{nq*BqIWU5@%1}`QOEKOhLwfpXcVDXo4hn;-bq$Vn0;CU=S80 zPkuko^Yc~{BZ7Pn^P*^5Y}qeAwSLtb)&Bso{{TE#mOb7Rlf+05&#BTFM21h2A5{or z)6n7hlkpdDY%v{woA*IbIpe?c{oN=Yfv3mnyvjT|U-!Sc^I_9tJs!PSmj@-|{{Uzl zKs{6A=Wx~xPM2t@ktBSd?Ee7THpYIx`TlsMK3PDTKoX81WBjA{_$wJt1L#kwx=jK0 zKP^lUD3r*LTUl5ikN7my+Y?oABmV#_5Q2NAtc>+gAE)_Ri;M~I4HUK`(*FQcW|vJw z+5HU;{{Y-kUU9F*R9oFCUGtN zFuac<6ZpO|NoaCDp-0nOP}q0>008_vUGQ)SPYGksAN~QB8mjv{DsB8uMZT1Db$o#m?e6{7>e`FWD3UB_K2% zRuCA(&oQ6C{Lq_DKd-{J_IN9)e!TSU2|odrgKL1Sn+sFszfmOvy5@s zR-odswm;Ee{x22)SIhqZ%43Q^_B4=L5PS`OmxQqDK{9bt7`rsGm`VwNnWd4;_Iy~y z7bVaqa&f`s;5(#RM6kM~T>Q2bPoj+Uy+l!r6fJbUD% z@?=IO+&HJF@nFvNdv_fZJT&R@b#--4(xL(}|o`l!L&;(rI`eb_O$XnHBFLDoDJ z$|>rAECc(yIgof{AIe_tr(Q)rllMq4&VQApV3-7k=*<8pF%!V?K*;a{Z>rO=r`{I? z%5YT>rN}Fno7|>+?Eb;E<(6V3W{EB3s5$5PXyA%FAv^R%iMmed0s0K{T3jky#D|WtQmpEE<^MB zKB;mKF~|P^qmp8XM}(@HZq&Pf9eSXk20Vc8>h7nPzr)FL2KLcO$K4B-4~sjI@x_he zYSelS{{TJTGCpU+`+pQddKUnwfCdjInE8M5!}b3F;+%cO8o~_E^q19OBjMUa4#JMl zbN1PN+$TRtVh(hTe``YK5BOq+R(Jd*rtnx7KkBXyyimDF&3UGK06uI$a=E-lEb+X7 z@wQ~-NB91zbz|BpFF13|SrHI|OV=OO61rwPEG1H0z1i*os`?#Y#UO~7J@7v%Vxs{M zw*&aFC5pqeVo*3FLVA?`n*b+CPdNVox?()X^i+lklXbf&Z2jC=0zMxVMGukTtDtsQ zZh)bFZty{rPdj+2+)W7aU4L(a$U$>o_$cDth)|G~@iBn{@bT$hB^Zfx)KJX-05&Q= zOBKm)vVWQFGN?hqlw`Rb^L zm(f1wgtFni(m!-a{6%$na9OIr^k@Fmg?z}*nC1JTISh$U09efkq4s(3Kf0#ey*~b) zx%Xb8IpII{g4Os$R!1rAXux@SxeMN^12PmuN6J)R(}gb?gEEU6Fa|wQSYBFpLdN+; z`-(^+107EU-^c|W>y&Oi;@xbZo;pd{h`pvXL@#@=*YPK=uAT+12F4@8rtT z8{_?KaDLW*H5un9FXBxzA+RNT8vUgw(EtE={{Zx|^YCDJN1GL{F6w=``%U6g#rQ%> z;|C4?i!IMOO{~z9n~O2=!P2o+$i#hf{wpApLx+Bk$L_EEU?N;h_tF09FDH%b%XEv! zh^qOxT{f}qeBF>(0VsVoB>~Rv%K_u+{8gB@pZTJNK*!*aACyp)5dLfVs`139bH@FJ zf)Vxdc>X^%9F;LA@_(I{K|~8P{(XL_G6CWo`u_kwkfeTexcfdIf0(Ap97v3QI9SO~ z!MNrSucRv{`^x*L>6h!8nIvGr10%r%nSph6(*xl^Cr*$w=<-p#Q6xLmlbfTx>U05e zMh@j9;$&|gN?8Hc2_MIdKC2iQ69s43`q>#@$M-|c3(;S}Ve!o`p&*ev5}v|xC+PF} zu*SMb`!cS}_B6BzY`$+Vngr!(O(&a=FeE*MQcZaHECBv&P(X06bU+UKu)Tn=vENnW z5Srqhn!s*Nm!HFbrc^)uJeQK1lRSs<{)}`)~M= zf6v`?lE3u-0D{ern=GK0^w*BmbHeGdjlx{?roi$a_Bd7xc!m74_|Y^W@`L>3to{Q& zClAy7*jda-o&Nxv`z)|dJ^udye}~nLlEg~Kzw`LvD272F;r@R7*ZE#oL+AYbwP*_K zzvuT-HJqNWoA`~eelY$iP--K~DoVZ=0L>5x1blIU-X7>^=ZWw9{{VM9V1xb~#l|hydNbJr?|F$S_Q%kb2D+di zpv1qYy&ooWU(8+(20_EGiolfVHYW|H-cxh|@S#4Yse4Jm2ch6RQVMHfa%gX0`#Gad zlhxp6MNIt`5p;!_0c=s#Y{v$m?iy|W7$f4+5Z56C{ZO6ipH0J6afDK zbUnkx;aszwSD6-9q<8mL3~gVh@c#g)P*v&E@^kKk^_C?_`cKNZ?C|*E_S7)3a@6$@h9d93>^QWf8#fM$}cm4dA#X}S0{C!<;6=7Ky2O^-@3fi#2i zh~I;wg++?MmrBYVJ9rA_BN%(sPIg5lkdS3Ht!#v@_qT!QF+=3$gE$WAh(I{Rli(74 z*=3ribFX`!GgtQDoS#G=RCtnp>`3GOM5yVX?7feXKPqh9RC7#}z2H)P!|_H=PWiYf z_~$*y!2QyN=8@o8prYUx=A8ck<0^sdfBjE#Rz&kQ{3?;?ik2=Yo_%#?aw57%9*Q_; z=Cqmc-VQPGS!K=qkM~HMVv7L(0I4P5Y-odKddJvl?2H_IN8bA%6o_Q@KK^tL4lo>l zpZQ3HJs96mI#l01Kd0(x(PfZ zBhYj8Mhs~#RV4@v)YhjQt zukijTtq(4Bb^h#hfL?(gpnv+Eu%}Tt=6@~0TA!*>Afmc$c*tr8VDnSB`2PSpqECNS zb+H%u^Iw?l9(jLspCkvRm+Y~KvrIqyCOT6&50lB{;V5L8D>89B_;=T z)W6iY0=R#thw6l25n{pP{{X=7fvT_-@#XW6vsd^H(LF_^~@Em;|{T3DDjL13mbK+_vn`o2&0LSP?x0t`G^k)kX4zGtBrT`D` zx%|)7gujow*rdAwf1cYMNbY}vEY%N~{%ARW4BpB6Ke(_!e3>tf{_OKNG{5k5R!SEW z@z3%1WQr2cE;5+#K=M*k1Hhaw_#ItEpg;U=3(%0^)Vz3B6vRS~lB2J#tQ66MFY#DL zJU~|iY|TC_B}!x&pMU6C3j=h|!Q}lL!CX<00RSKVsevnZgw3A=zh~W6fKWiFcjkf= z=C|4Ef+k;#sFI*NGxJtO+G3u(7i#E8e>@IV_Ox=41EZfu0pr@y9zXn+L Date: Tue, 16 May 2017 13:47:43 -0700 Subject: [PATCH 05/18] Update README with specs --- README.md | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/README.md b/README.md index 68f98c0..251a1f2 100644 --- a/README.md +++ b/README.md @@ -4,3 +4,65 @@ For goal #383 ## To get this project running 1. `npm install` 1. `npm start` to run (uses nodemon) + +# CRUD Mutably + +## Challenge Rating + +This goal will likely be within your ZPD if you... + +- Can build basic web sites with HTML & CSS +- Can add behavior to a web site with JavaScript +- Are familiar with DOM manipulation +- Are interested in making more complex interactive web pages + +## Description + +[Mutably](http://mutably.herokuapp.com/) is a mutable, RESTful, CRUD API. This means that it has endpoints that you can interact with RESTfully via a front-end. + +Visit the repo page for information about the resources available and how to interact with them: [https://github.com/GuildCrafts/mutably](https://github.com/GuildCrafts/mutably) + +Your goal is to build a front-end that consumes the Mutably API. You can choose any one of the 3 resources. You front-end needs to complete all of the CRUD (Create, Read, Update, Delete) functions. + +For the goal, you will start with [this scaffolded template](https://github.com/GuildCrafts/mutably-starter). Fork to get started. +You will use jQuery to complete this goal. + +## Context + +Interacting with a third-party API is a key skill for any developer. Most APIs have extensive documentation and require a fair amount of "overhead" just to get started working with them. + +Not Mutably. This API is _way_ simpler, with just a few _endpoints_ handling a few different _resources_. + +This goal is designed as an introduction to working with third-party APIs so that you can familiarize yourself with the core ideas before moving on to work with bigger, more complex APIs (like GitHub or Twitter). + +## Specifications + +- [x] __5:__ Your repo is a fork of [mutably-starter](https://github.com/GuildCrafts/mutably-starter). +- [x] __5:__ Your repo has a README with instructions for how to run your project. +- [x] __15:__ Your app is SPA (single page app). All CRUD actions take place on the same page, preferably the root (`/`) route. +- [x] __10:__ All interaction with the API happens with jQuery's AJAX function -- don't submit data via forms. You can use `form` html tags, but do all your form submission in your `js`. Make use of jQuery's `event.preventDefault()`. +- [x] __15:__ A user can read and display all the data for a resource. +- [x] __10:__ A user can create a new item via a create form. When the user creates a new item, that item should either get appended to the page or all the items should get re-retrieved in the `js`. No full page refresh. +- [x] __10:__ A user can update an existing item. Updating happens inline. This means that there is an edit button next to each item that, when clicked, the item text gets replaced with an pre-populated editable, input field. And the edit button becomes a save button. Once the save button is clicked and success message comes back from the server, then then input gets replaced with the updated text. No page refresh. + For example, this:
+ screen shot 2017-05-11 at 3 26 09 pm +
+ becomes: +
+ screen shot 2017-05-11 at 3 26 18 pm +
+ When the user clickes the edit button. +- [x] __10:__ A user can delete an existing item via a delete button next to each item. No page refresh. +- [x] __10:__ Use a UI library to make your site look nice. +- [x] __5:__ The artifact produced is properly licensed, preferably with the MIT license. +- [x] __5:__ App is deployed on Heroku. + +### Stretch + +- [ ] Create another version of your front-end using a front-end framework such as React or Angular. + +--- + +***If the mutably data gets too crazy from people adding / deleting things, you can reset the data to the seed data [here](http://mutably.herokuapp.com/).*** + +***Insider tip: there is an example "solution" (remember, there are MANY ways to hack it!) in the [solution branch](https://github.com/GuildCrafts/mutably-starter/tree/solution) of the starter template.*** From e37b6d3e66df9babad27b28fbd89cb3454f77df7 Mon Sep 17 00:00:00 2001 From: Jay Cribas Date: Tue, 16 May 2017 13:49:00 -0700 Subject: [PATCH 06/18] Update README with team --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 251a1f2..12b3e4b 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,9 @@ For goal #383 # CRUD Mutably +Team name: #befitting-penguin +Team: Jeffrey Ware, Jay Cribas + ## Challenge Rating This goal will likely be within your ZPD if you... From 338665b0c27cbe21e20b136e959a4f99e4605659 Mon Sep 17 00:00:00 2001 From: Jay Cribas Date: Tue, 16 May 2017 13:51:23 -0700 Subject: [PATCH 07/18] Update README.md --- README.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/README.md b/README.md index 12b3e4b..4b3527a 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,9 @@ -# Mutably Starter Project -For goal #383 +# CRUD Mutably #383 ## To get this project running 1. `npm install` 1. `npm start` to run (uses nodemon) -# CRUD Mutably - Team name: #befitting-penguin Team: Jeffrey Ware, Jay Cribas From 226eadade9b5af3344a881db717f3ad2bc3e1d45 Mon Sep 17 00:00:00 2001 From: Jay Cribas Date: Tue, 16 May 2017 13:56:39 -0700 Subject: [PATCH 08/18] fix link to speakers image --- public/style.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/style.css b/public/style.css index 413b63b..1900f51 100644 --- a/public/style.css +++ b/public/style.css @@ -1,6 +1,6 @@ /*Custom styles here*/ .jumbotron { - background-image: url('/images/c45e331b0f6be2fd15942b0c3b4071cc.jpg'); + background-image: url('/images/speakers.jpg'); background-size: 100% auto; background-position: center; color: white; From 24598ca3644083e92f4d162ba718c6b391b5089f Mon Sep 17 00:00:00 2001 From: Jay Cribas Date: Tue, 16 May 2017 14:13:22 -0700 Subject: [PATCH 09/18] add nodemon to dependencies --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 53339ce..970198b 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,8 @@ "dependencies": { "body-parser": "^1.17.1", "ejs": "^2.5.6", - "express": "^4.15.2" + "express": "^4.15.2", + "nodemon": "^1.11.0" }, "devDependencies": { "nodemon": "^1.11.0" From 2b22c26d76d7ce7af0647981c6762e62d167dfcc Mon Sep 17 00:00:00 2001 From: Jay Cribas Date: Tue, 16 May 2017 14:26:13 -0700 Subject: [PATCH 10/18] remove nodemon startup, change to node --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 970198b..8d1b64b 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,8 @@ "description": "", "main": "server.js", "scripts": { - "start": "nodemon server.js", + "start": "node server.js", + "start:dev": "nodemon server", "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], @@ -13,8 +14,7 @@ "dependencies": { "body-parser": "^1.17.1", "ejs": "^2.5.6", - "express": "^4.15.2", - "nodemon": "^1.11.0" + "express": "^4.15.2" }, "devDependencies": { "nodemon": "^1.11.0" From 2eeb15ff85e6a6744dd807eb6de939ccdbe3fd1f Mon Sep 17 00:00:00 2001 From: Jay Cribas Date: Tue, 16 May 2017 14:32:06 -0700 Subject: [PATCH 11/18] edit paths --- {views => public}/index.html | 0 server.js | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename {views => public}/index.html (100%) diff --git a/views/index.html b/public/index.html similarity index 100% rename from views/index.html rename to public/index.html diff --git a/server.js b/server.js index 19f26a6..3af6c58 100644 --- a/server.js +++ b/server.js @@ -9,7 +9,7 @@ app.engine('html', ejs.renderFile); app.set('view engine', 'html'); app.get('/', (request, response) => { - response.render('index') + response.sendFile('./public/index.html') }) const port = process.env.PORT || 3000 From 6e53e0c976df8a44d6ab86b13b2b187bdaf4ac9b Mon Sep 17 00:00:00 2001 From: Jay Cribas Date: Tue, 16 May 2017 14:33:19 -0700 Subject: [PATCH 12/18] edit paths --- public/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/index.html b/public/index.html index 275ce0a..b5cd67a 100644 --- a/public/index.html +++ b/public/index.html @@ -5,7 +5,7 @@ - + From 426b7cc1c4ca617ef583c218fe8ba798aa5093a3 Mon Sep 17 00:00:00 2001 From: Jay Cribas Date: Tue, 16 May 2017 14:34:22 -0700 Subject: [PATCH 13/18] edit paths --- public/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/index.html b/public/index.html index b5cd67a..ca4669a 100644 --- a/public/index.html +++ b/public/index.html @@ -5,7 +5,7 @@ - + From 1ea90aa2e8d2e5a4cd46bff0b858e7df924c75bf Mon Sep 17 00:00:00 2001 From: Jay Cribas Date: Tue, 16 May 2017 14:42:50 -0700 Subject: [PATCH 14/18] change http to https --- public/script.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/public/script.js b/public/script.js index b74dd34..8a46bee 100644 --- a/public/script.js +++ b/public/script.js @@ -12,7 +12,7 @@ $(document).ready(function(){ $(this).trigger("reset"); $.ajax({ method: 'POST', - url: 'http://mutably.herokuapp.com/albums/', + url: 'https://mutably.herokuapp.com/albums/', data: newAlbumData, success: handleAlbumAddResponse }) @@ -23,7 +23,7 @@ $(document).ready(function(){ var id = $(this).data('id') $.ajax({ method: 'DELETE', - url: 'http://mutably.herokuapp.com/albums/'+id, + url: 'https://mutably.herokuapp.com/albums/'+id, success: handleAlbumDeleteResponse }) }) @@ -48,7 +48,7 @@ $(document).ready(function(){ var updatedname = $('.input-'+id+' input').val() $.ajax({ method: 'PUT', - url: 'http://mutably.herokuapp.com/albums/'+id, + url: 'https://mutably.herokuapp.com/albums/'+id, data: {name: updatedname}, success: handleAlbumUpdateResponse }) @@ -59,7 +59,7 @@ function getAllalbums() { $('.row').html('') $.ajax({ method: 'GET', - url: 'http://mutably.herokuapp.com/albums' + url: 'https://mutably.herokuapp.com/albums' }).done(function(data) { for (var i=0; i' From 9c40bbd35a2479eb57750469f17a2a2a30442604 Mon Sep 17 00:00:00 2001 From: Jay Cribas Date: Tue, 16 May 2017 15:04:39 -0700 Subject: [PATCH 15/18] Implement media query to hide caption div --- public/index.html | 1 + public/style.css | 12 ++++-------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/public/index.html b/public/index.html index ca4669a..ac93d27 100644 --- a/public/index.html +++ b/public/index.html @@ -2,6 +2,7 @@ Mutably front-end + diff --git a/public/style.css b/public/style.css index 1900f51..f24a05a 100644 --- a/public/style.css +++ b/public/style.css @@ -73,12 +73,8 @@ span { } @media only screen - and (min-device-width: 320px) - and (max-device-width: 480px) - and (-webkit-min-device-pixel-ratio: 2) - and (orientation: portrait) { - .caption { - position: absolute; - padding-bottom: 20px; + and (max-width: 400px) { + div.caption { + display: none; } -} + } From a2c4422abdd3b88d50666d92e0e7279aea227915 Mon Sep 17 00:00:00 2001 From: Jay Cribas Date: Tue, 16 May 2017 15:13:48 -0700 Subject: [PATCH 16/18] Update README.md Adds link to Heroku app --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 4b3527a..05d2bdb 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # CRUD Mutably #383 +[good--music.herokuapp.com](https://good--music.herokuapp.com/) ## To get this project running 1. `npm install` From aa2015e29d2019b8646146c4fea8ce8c9634f5d3 Mon Sep 17 00:00:00 2001 From: Jay Cribas Date: Thu, 18 May 2017 08:09:16 -0700 Subject: [PATCH 17/18] Add release date, tilt album titles, fix hide caption on resize --- public/script.js | 4 ++-- public/style.css | 55 ++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 48 insertions(+), 11 deletions(-) diff --git a/public/script.js b/public/script.js index 8a46bee..8cbfc72 100644 --- a/public/script.js +++ b/public/script.js @@ -63,9 +63,9 @@ function getAllalbums() { }).done(function(data) { for (var i=0; i' - +'

 '+data.albums[i].name+'

' + +'

'+data.albums[i].name+'

' +' ' - +'...

'+data.albums[i].artistName+'

'+data.albums[i].genres+'

' + +'...
'+data.albums[i].releaseDate+'

'+data.albums[i].artistName+'

'+data.albums[i].genres+'

' +'' +'' +'') diff --git a/public/style.css b/public/style.css index f24a05a..fac08b5 100644 --- a/public/style.css +++ b/public/style.css @@ -1,4 +1,12 @@ -/*Custom styles here*/ + +.row { + padding: 1%; +} + +.jumbo { + font-size: 2em; +} + .jumbotron { background-image: url('/images/speakers.jpg'); background-size: 100% auto; @@ -22,6 +30,28 @@ h3 { color: white; text-shadow: 2px 2px 9px #000000; + padding: 0 3%; + -ms-transform: rotate(-7deg); /* IE 9 */ + -webkit-transform: rotate(-7deg); /* Chrome, Safari, Opera */ + transform: rotate(-7deg); + font-size: 2vw; +} + +h4 { + margin: 0; +} + +h6 { + margin: 0; + font-size: .8em; + text-align: right; + font-weight: normal; +} + +h6:before { + display: block; + white-space: pre; + content: 'Release Date\A'; } input { @@ -33,6 +63,7 @@ input { font-family: 'Shadows Into Light', cursive; letter-spacing: .1em; } + span { position: absolute; display: flex; @@ -41,13 +72,6 @@ span { margin-top: 70px; } - - -.center-name { - justify-content: center; - align-items: center; -} - .thumbnail { height: 450px; } @@ -72,9 +96,22 @@ span { border: 0px; } +h1, h3 { + font-family: 'Lato', sans-serif; + font-weight: 900; + text-transform: uppercase; +} + + @media only screen - and (max-width: 400px) { + and (max-width: 768px) { + .row { + padding: 0; + } div.caption { display: none; } + h3 { + font-size: 10vw; + } } From 57662e6a4f0c670db2e2b9148aa05bbc3fb78105 Mon Sep 17 00:00:00 2001 From: jnware7 Date: Thu, 18 May 2017 10:00:11 -0700 Subject: [PATCH 18/18] add button and input field --- public/index.html | 11 +++++++++-- public/style.css | 14 ++++++++++++-- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/public/index.html b/public/index.html index ac93d27..fc47605 100644 --- a/public/index.html +++ b/public/index.html @@ -14,7 +14,7 @@

GOOD MUSIC

You only need 6 albums to win.

-
+
@@ -28,8 +28,15 @@

GOOD MUSIC

- +
+ + +
+
+ +
+
ALBUMS
diff --git a/public/style.css b/public/style.css index fac08b5..a8c4d5c 100644 --- a/public/style.css +++ b/public/style.css @@ -14,7 +14,17 @@ color: white; text-shadow: 2px 2px 9px #000000; } - +.buttonDiv{ +display:inline-block; +padding-left: 30px; +} +.addAlbum{ + border-radius: 7px; + width:120px; + height: 30px; + color:white; + border:none; +} .edit-form { display: none; } @@ -73,7 +83,7 @@ span { } .thumbnail { - height: 450px; + height: 500px; } .edit-btn {