From 4f4af02acea0022a5c1966d9b7b4150b35749edd Mon Sep 17 00:00:00 2001 From: Laurenz Date: Thu, 6 Apr 2023 12:57:26 +0200 Subject: [PATCH] Fix path and polygon strokes --- library/src/visualize/path.rs | 116 ++++++++++++++++--------------- library/src/visualize/polygon.rs | 62 +++++++++++------ tests/ref/layout/container.png | Bin 20514 -> 20435 bytes tests/typ/layout/container.typ | 19 +++-- tests/typ/visualize/path.typ | 3 +- 5 files changed, 113 insertions(+), 87 deletions(-) diff --git a/library/src/visualize/path.rs b/library/src/visualize/path.rs index 44f506e89..436ef5f0c 100644 --- a/library/src/visualize/path.rs +++ b/library/src/visualize/path.rs @@ -2,51 +2,59 @@ use self::PathVertex::{AllControlPoints, MirroredControlPoint, Vertex}; use crate::prelude::*; use kurbo::{CubicBez, ParamCurveExtrema}; -/// A path going through a list of points, connected through Bezier curves. +/// A path through a list of points, connected by Bezier curves. /// /// ## Example /// ```example -/// #set page(height: 100pt) -/// #path((10%, 10%), ((20%, 20%), (5%, 5%))) -/// #path((10%, 10%), (10%, 15%)) +/// #path( +/// fill: blue.lighten(80%), +/// stroke: blue, +/// closed: true, +/// (0pt, 50pt), +/// (100%, 50pt), +/// ((50%, 0pt), (40pt, 0pt)), +/// ) /// ``` /// /// Display: Path /// Category: visualize #[element(Layout)] pub struct PathElem { - /// Whether to close this path with one last bezier curve. This last curve - /// still takes into account the control points. - /// If you want to close with a straight line, simply add one last point - /// that's the same as the start point. - #[default(false)] - pub closed: bool, - - /// How to fill the polygon. See the + /// How to fill the path. See the /// [rectangle's documentation]($func/rect.fill) for more details. /// /// Currently all paths are filled according to the /// [non-zero winding rule](https://en.wikipedia.org/wiki/Nonzero-rule). pub fill: Option, - /// How to stroke the polygon. See the [lines's - /// documentation]($func/line.stroke) for more details. + /// How to stroke the path. See the + /// [polygon's documentation]($func/polygon.stroke) for more details. #[resolve] #[fold] - #[default(Some(PartialStroke::default()))] - pub stroke: Option, + pub stroke: Smart>, + + /// Whether to close this path with one last bezier curve. This curve will + /// takes into account the adjacent control points. If you want to close + /// with a straight line, simply add one last point that's the same as the + /// start point. + #[default(false)] + pub closed: bool, /// The vertices of the path. /// /// Each vertex can be defined in 3 ways: /// - /// - A regular point, like [line]($func/line) + /// - A regular point, as given to the [`line`]($func/line) or + /// [`polygon`]($func/polygon) function. /// - An array of two points, the first being the vertex and the second - /// being the control point. - /// The control point is expressed relative to the vertex and is mirrored - /// to get the second control point. - /// The control point itself refers to the control point that affects the curve coming _into_ this vertex, including for the first point. - /// - An array of three points, the first being the vertex and the next being the control points (control point for curves coming in and out respectively) + /// being the control point. The control point is expressed relative to + /// the vertex and is mirrored to get the second control point. The given + /// control point is the one that affects the curve coming _into_ this + /// vertex (even for the first point). The mirrored control point affects + /// the curve going out of this vertex. + /// - An array of three points, the first being the vertex and the next + /// being the control points (control point for curves coming in and out, + /// respectively) #[variadic] pub vertices: Vec, } @@ -69,20 +77,19 @@ impl Layout for PathElem { let points: Vec = vertices.iter().map(|c| resolve(c.vertex())).collect(); let mut size = Size::zero(); + if points.is_empty() { + return Ok(Fragment::frame(Frame::new(size))); + } // Only create a path if there are more than zero points. - let path = if points.len() > 0 { - // Construct a closed path given all points. - let mut path = Path::new(); - path.move_to(points[0]); + // Construct a closed path given all points. + let mut path = Path::new(); + path.move_to(points[0]); - let mut add_cubic = |from_point: Point, - to_point: Point, - from: PathVertex, - to: PathVertex| { + let mut add_cubic = + |from_point: Point, to_point: Point, from: PathVertex, to: PathVertex| { let from_control_point = resolve(from.control_point_from()) + from_point; let to_control_point = resolve(to.control_point_to()) + to_point; - path.cubic_to(from_control_point, to_control_point, to_point); let p0 = kurbo::Point::new(from_point.x.to_raw(), from_point.y.to_raw()); @@ -100,38 +107,35 @@ impl Layout for PathElem { size.y.set_max(Abs::raw(extrema.y1)); }; - for (vertex_window, point_window) in - vertices.windows(2).zip(points.windows(2)) - { - let from = vertex_window[0]; - let to = vertex_window[1]; - let from_point = point_window[0]; - let to_point = point_window[1]; + for (vertex_window, point_window) in vertices.windows(2).zip(points.windows(2)) { + let from = vertex_window[0]; + let to = vertex_window[1]; + let from_point = point_window[0]; + let to_point = point_window[1]; - add_cubic(from_point, to_point, from, to); - } + add_cubic(from_point, to_point, from, to); + } - if self.closed(styles) { - let from = *vertices.last().unwrap(); // We checked that we have at least one element. - let to = vertices[0]; - let from_point = *points.last().unwrap(); - let to_point = points[0]; + if self.closed(styles) { + let from = *vertices.last().unwrap(); // We checked that we have at least one element. + let to = vertices[0]; + let from_point = *points.last().unwrap(); + let to_point = points[0]; - add_cubic(from_point, to_point, from, to); - } + add_cubic(from_point, to_point, from, to); + } - Some(path) - } else { - None + // Prepare fill and stroke. + let fill = self.fill(styles); + let stroke = match self.stroke(styles) { + Smart::Auto if fill.is_none() => Some(Stroke::default()), + Smart::Auto => None, + Smart::Custom(stroke) => stroke.map(PartialStroke::unwrap_or_default), }; let mut frame = Frame::new(size); - if let Some(path) = path { - let fill = self.fill(styles); - let stroke = self.stroke(styles).map(PartialStroke::unwrap_or_default); - let shape = Shape { geometry: Geometry::Path(path), stroke, fill }; - frame.push(Point::zero(), FrameItem::Shape(shape, self.span())); - } + let shape = Shape { geometry: Geometry::Path(path), stroke, fill }; + frame.push(Point::zero(), FrameItem::Shape(shape, self.span())); Ok(Fragment::frame(frame)) } diff --git a/library/src/visualize/polygon.rs b/library/src/visualize/polygon.rs index 4b4adf7b1..559ebec31 100644 --- a/library/src/visualize/polygon.rs +++ b/library/src/visualize/polygon.rs @@ -7,12 +7,12 @@ use crate::prelude::*; /// ## Example /// ```example /// #polygon( -/// fill: red, -/// stroke: 2pt + black, -/// (0pt, 0pt), -/// (50%, 0pt), -/// (50%, 4cm), -/// (20%, 4cm), +/// fill: blue.lighten(80%), +/// stroke: blue, +/// (20%, 0pt), +/// (60%, 0pt), +/// (80%, 2cm), +/// (0%, 2cm), /// ) /// ``` /// @@ -27,11 +27,20 @@ pub struct PolygonElem { /// [non-zero winding rule](https://en.wikipedia.org/wiki/Nonzero-rule). pub fill: Option, - /// How to stroke the polygon. See the [lines's - /// documentation]($func/line.stroke) for more details. + /// How to stroke the polygon. This can be: + /// + /// - `{none}` to disable the stroke. + /// - `{auto}` for a stroke of `{1pt}` black if and if only if no fill is + /// given. + /// - A length specifying the stroke's thickness. The color is inherited, + /// defaulting to black. + /// - A color to use for the stroke. The thickness is inherited, defaulting + /// to `{1pt}`. + /// - A stroke combined from color and thickness using the `+` operator as + /// in `{2pt + red}`. #[resolve] #[fold] - pub stroke: Option, + pub stroke: Smart>, /// The vertices of the polygon. Each point is specified as an array of two /// [relative lengths]($type/relative-length). @@ -61,22 +70,29 @@ impl Layout for PolygonElem { let mut frame = Frame::new(size); // Only create a path if there are more than zero points. - if !points.is_empty() { - let fill = self.fill(styles); - let stroke = self.stroke(styles).map(PartialStroke::unwrap_or_default); - - // Construct a closed path given all points. - let mut path = Path::new(); - path.move_to(points[0]); - for &point in &points[1..] { - path.line_to(point); - } - path.close_path(); - - let shape = Shape { geometry: Geometry::Path(path), stroke, fill }; - frame.push(Point::zero(), FrameItem::Shape(shape, self.span())); + if points.is_empty() { + return Ok(Fragment::frame(frame)); } + // Prepare fill and stroke. + let fill = self.fill(styles); + let stroke = match self.stroke(styles) { + Smart::Auto if fill.is_none() => Some(Stroke::default()), + Smart::Auto => None, + Smart::Custom(stroke) => stroke.map(PartialStroke::unwrap_or_default), + }; + + // Construct a closed path given all points. + let mut path = Path::new(); + path.move_to(points[0]); + for &point in &points[1..] { + path.line_to(point); + } + path.close_path(); + + let shape = Shape { geometry: Geometry::Path(path), stroke, fill }; + frame.push(Point::zero(), FrameItem::Shape(shape, self.span())); + Ok(Fragment::frame(frame)) } } diff --git a/tests/ref/layout/container.png b/tests/ref/layout/container.png index eff06f1a70ebd8fb2430e22bbdc8906e2116cd62..f016385b7a5cd978553a3bc7a70e41c54a255ecf 100644 GIT binary patch literal 20435 zcmcJ12{@JQyRT@VR-!>x#$`+y7a1~UiZYcZb26up%o(GlB14p^45c&?l6fjx8AB?w z5;B(}5pjO2ea^YgKG(O;{_k_H)3vYtPv5fEyWZ!1?)x`A?-e71{TtWsSWibsw^3I| z^DrIVs?~IK^!FL*@h<|$yanm#43l*=_Z{)+p1kdAzR_xFx@DrbhdVZZt1jOK-J24z z*DYcNUnYp!ZHTQnT%UZK@9m?bUYqaa@7I0!AYRkyQ1`E|w?}@SPaRR3DZBSnFkaF?J1YQ<1D|B>r zjwVWLk8Ci`GT1{VcUJ`k1qP~c8l=B^Phe$bWz1Oqvv~aYacRQLm*y1f8j9!F-i5)} z(QcX{Hw78eT1MRDgRD z!32`9@H&!=$EeZYp9cEMycsisR{m^f-qm{1cIU2L>WmvXfZpPBjHJlCyu9yU`^uV|o5MHpsGR$($*xatdXrFJUyuL7#KiRd`*$fRskXMZ zq@*M_-jJI;4*%jB%xmAddv~NMsb*xRDj*JT?$TR)$k5PrcC_vO{rlm}TvxALc_^3l z{Q1vEM<0K9Vq#-&UwG=(dSm1EY_p=@i;GphGi%qcY8|polyTauK8kDnc)jGogSy&U zO)V`!0fEf?{QUCrrSF5UYr;3}XME3bKvY$Ar7o7Ak>u;Uus@nRU};`z?_R%e{S`lc z{J=-PdiBa^Yw&%(niM%#YBZ08px|@IwmU0L<`x#&_wMa+Y)vmOSMu`H*KZ!GkE@!? zHS_Y4Rd;-Gam{4y#f$X%`ubX0uW*ahoal(jVT6ef*=6SjsTbF5$jr>#wQJXoH~yoo zq)1#&^hD0p=x81lf1e7oZES3OVQk{&J7ZGg;`qhIRlFuo?A*v(la`S2#Ky92WsDiv)R_M0(eLFy7yPcXv9T@B zjUqf#@A4d+mbV+3AP862-^ac(&ms)nky?X=2 zf{ct<)a!bC%USJCvTN(<=^Z$*e*NmYX<@rWDI4l7h4W`jJihk&cIH}JHLlD}nT561 zUfIHNXf1d2>jAfPdphEBCgI!1s&Acn{7J##`Mxvuk>5MS!@n>1J2^R>JNF%TfO>sk zxG{k-1OHDW1iz3-=qWsFR_2wh_Bmp^gd{cdpoPTiC@u}gY?EjA`=4*(R(kM@?8QKS zVpe3Jqq9?1mW_5n4z@eR#c$rYaV;t;r|f{1*1ZeAzV6wx=ch~E;CJmv_7?+gQ9P>R zMoye6{_`l1pDsTKYSx9tWMpJi3pu>Ggh`&$LI?NUJd@nPZJZ0?n63} zdDpIOTx?L=x9>&QGlv^DZb(s|**BMZf3vJeL6a~uF=5)U!7xR33g0{=B&5vyTdIuH zTfB6lIcRZiinb9+0^;I<^V0*>)z#7tZ_a$ItT0Sd`ThGhN-0xeYI2fA{mq*Lco6W~60taWOnBOeQz()-5d3S58H*$<_=FIhWoC zPo6B9zS(^|XMS-pO*Lq_x8!^vx|xc~^73*tkLsJ|=Ik;oa}Q z*4EZ|-uTw-+rz`dtm?QZBTalul7_wg{p;7?=GnYnzhT3cEnBbxB4|w(&jObBiklY) zvy}QTkhikN40zW`+E62XXTG$(N={C$3|M??a&TFcL?SU}ICtdiV_iiI3@32y_2?}1 z+^sk~H`T+V8hB>?O5<%sZ?&~C1HbB9i(IX+X|oEY}jc zZWAtGBIonW0{R@Sv^WgQ&{1ARY`=H!o@ddcM~|*XMMXtM3d}Hs5NO|U03Did>;j7aqwV- zmzNY(Cf@tNfvd&EJ||AFo5)B?vTWYWccH)VY)WCFEbG(sbhRT#-o1GfWvdwQ+vC^Q zzK3TtkHoC9ozLzdsst`MIyrS^Xke!#C-1nn=4n<|N2#ZCAvanareIfB7iN)??~kR0 znS#99)K^{A)#={f`aK?FXl>Xo9&_g9%a<4CCa*+CM_;+(J2#mW8QFvzNTi5}iQTw< z{Zz}g)m)A-1JM>9yT!!z$jE3iW?NPyXO2!x?B2C2e946Chm$9R zS-MNk3r{6FC`WynanaNz=3rE$QG8pUPiy~51Q%$U(r z+0NlA&5q`A0>m!WRj%&r)tBiFj7Q>ze7@aW@X zm6er8)+#6{losNTLrW@pHlap9SeQRd_H4K2u?oyWlBU^`^M@xd*vpEGb6-8q$$8Vz za6LYLvNO-d&u_2AHXa_sUH81Ex_?e~#Rc-6)pFiIL5=nV`F1eYDUh>%FqANc6YzBk`kMQrT?Gb zp7{-3T}d?qqhn(hr5;W{$KRtaG#Pad9B}E(U3Gw|Zra)IL3TEv&v=GLcvExpHIztm z^BSSKcO4xGv9SvN^V8P_4<5@l9iEzMt~@IuC58KT4R7M%={fw}hnt(5N~L-{YH4UV zfF^hEV1i3`fo^)-^ygO_I5<+)Y+&P*cjHx1NUGQ+AW+-Xbmq_RpTILmj~?B9?8)Vb zh)_Oy^3sA?@x&aFF8xwNItm=SP+py`uG;bR=>xjDdtwz!SH%pp)WzJsU2&$1jNTI# zQ&|~^!N@6$-!M9Q6re8g`t|E*Q1S8cad8Zdo?0r-~pYO1tsv$Z@`YezMz_xoSYmlZ*M~b z1IlJP83m#X#+OUqUOT&CAb=%GTEOR8rm)t#`=irW)9D+an*JPrYH4C>>R!?t85wEy z=b44MIg2`4t`U9keZd;+tNqt@ypq&2H|JD$M7x`OzHi??RCSW<*&Q{Ka<2WiFvNf? zu+!?^#Gy&JxTs(T+}M3w#rH?p{dKEXi&|CsfB*c7P{XMj=ueF#o;!CgLEPePTiZUy z<|OIYO-)Vp^-K+`T94Rv7N5Ht9=>i$;lZOv`5l%373hoR;vL=H-BhX&AK$5kAH(c} z0gH37G~7=nlXZ1<2{rP2_ZH$Cs;Hzs`SJ7TQ6r<#-jZj}pFh8HYM(hb{g3wQ$rcbevL;v6mw=Yi#Qp8}Ewz`u1@@qk_DAtL5wQ_m71QZWZHh zV2*OIv*+5eu(9Ph^VZSHh!MG!d?Zg+(}ig6-@iZ1$kEY}fgBbV#v7JnS(IhYyGFP157|BG`$9)|2?`35 zXEi1F?Af+?^P}UGEW2PUnrTan>X)J_LJ#*|L&nNt9qJBz^QK^KYrvP4WX+YI>gG&%{)v8jLS|W zqVe#By?g&2P1>+ME-o%hKSfAfJc?!f-NW`MF2x4~^oO2u-7#@|0DMn*?<6A3yCSEuyHn2-4>H>)4?~ zvA1rSA3dtYW^8P{d-rZ4<>8YjnQ4cOjcfWd3kqiC%*WTNQMB*7q^+VeeL%Q*^Cn{k zFy6~m44{Q}c6R8DHS8CBee*bu(6xTHmHbU#qT15ky(5a)dM8EqzmE6*friu3$uPUE z;tB4N`lmMa@A}riK+=P&v?#M0#yJIk-I11K;rAs)MqA2*tIF+l_BGdqt2)uwwQja` z6jxcY-l9ffQ!GO(tHA#`p}8`PLylI-=vr?TDl&&?Zz*2$?N`QFG7Sz_wTBCx zrLUtSFUj&Gmom|&^aX#%wRmR$zv&F$#J?}<4!5`Y`=Y}<$#H*QG~w@P|Mx`_KQb1Q z{=VpCxIHeNjx1BUsrmhCbaqE`p5#2*t6MLt$hdAnpU=qicbudBn#SGvX}Q1et@^FT z>eS!&&fF9f{rA14RhEwaeeX?+(?x&ZTXpVgssopD%MM#Q(^5j)%oAPdG1nPPjlia` zs@8RMw)56omSuV9Vg?-a<{$ghsZr8o2EKi#y`Vp=sunMB+`46XEnbk3r{_4QLITc_JQAkD%Z^fq(w6TrH$+1j9{p-^0EImTE<2F}sK;3;>gEgE6Qo{_zkN+S3=Rcm#|E}!+aemtd z|HFm)gb>6m|IbR+f4a$NpZ0IyAXxk6s(;+DbUW4+2XCsLV*l^74|fcluMR8yzx~6% zzyxK;rlzLToUSz>1|bA}Q;J47vzSSKCg#(cHERep=4D=Io0IowPzWU+W1H)yz3be@ z--$rc!OYCMckjIgczGZCIk-}3Ny(n$#5r{8s-P7EDQg&v!m0{)^?~mgn?BZeU4C*dGDT>WjQ-()`q5B>~qc#x3;#XCkqG(J$n4u z8{Hh&#lJu5NluQ?y_=lHXzfu%X^H@ua2_KcO}w$bo+fvoqhC-}mX-Ays*7bG#4zlz zNV#$2xl_APSStp7^0{WC!-x5VgoMPz^jG#YK!K8?%F4=q%ujp&_&9%O1A-*=^@N$&v))qelgWg~O%9#l-Gi0n+^Z`SVmy(e_R#R6M3dE`Mkob&(zrpD_cf zj$a2r&1%xn)Kp)2iY^fH7;Z+NM^I2uWL{R*NYSJ%<`E-FCC!j6G&Gb|9kXsVG4LTI zz!N7<@P=Kyc(L;euy8GVR%T}I79cICXfridCr94gX3PNAd0#e%LCi?v;Ys@<7JBE- zo#bTGzS-((waD*srOf0d5hDJLMI8`&vKDF!Ul=DR=j!GDk(RVj!ZjfcclRHVrU1!- zH!y^%EFkQROiq@&4ZLL9B6Oy=IIsV{aNRTmzIXdG2SX>PG0?V(q)Kfm9> zs~AT4(ppqK$K#^6E8fevY*ZOG)KDd2*)xzCIY*tl^mx6p$7! zuG>E+I<{}$J~A|*qu;>-SolK+jSJ#(Sm7x$B)-kuLD|t=U=e|V z%g}vRHWO{_?3%|VtzWJ#BrGf}K$4KZFehpvx^t%*<5btP5i{G|qN0R^gsgyBpfwYd zE41I=tl zyPtzHieDH3^QmTcu(b^)s7f%@Na8M>>B!-7646gpQVYyvpX(6dUP6_m}69WXn5E<5`4c;eUV^qZ_k(kzz+n9k_Ybx!fJnZ zkbxYZkZ@l97N~Q+_t#IKf~D9-twRZ_qBYPjSk#ML`VQ#namqNd=*sNbGwfah5{f&b z3V|#8CQw#J2I;~KwvJ8YQ;RZfJN7-Nk1&v9B+jF!6cX46*#sD<^UgJ_8|#eB%pe&& z%Fb?n^KEi6QYz}|ReItMfQwlV=5U)+r}F(5+$AI=uCwphag}8+ZWitKIYqRLL_|b@ zwdc!udwRZNZ@26XYGB#1!?ehLp2OD2$mnFWv=Kc$J-&9DGMbaRBevtuueH6soTMXW zW(V0^dy7L@O3w|hHF@{$-PSEz?q(ZOtik6^pPxQzX~|5Mxr(hC$u6aCYFY|Cy1 zGBZ3h1X=7@j(Po?huPU;e0)C^W*m}FIXDQDNQVv|R##-t40uKD@8>3gOx8&1X=|^g z`ZUCgc!;%yS{#>AC8C4{1O!lUW3Ox)(95K#1rg@QjtNOfv<$od`SVA&q2j`?(WH}K zdrQ~{0hsegzkZEk`7u4s8v(^}$W6X6K|(kJ0@u~6G&X)*k>pddQ7a!97go9LT`$7S)v)J}DR^rbR8O z%4T4mq<44sZ+d%T9vTRQY;YG)0<<}>c>H~Kc6K~c7mF@^q4A$bJ>4}1^Xhe{G zeR7SZwVAzp_m-BH+N{X&Ye&|-d1KEmBq(V2=9Yqph{&~{#&_@DE%Tg!TD5jRm!tb0 znzd4Fo`c40Zf=ehHaG8$<=>BbMK#t)M$%L}d0yU6ue~g>44XHeW4qGB1X;1h?Pn z=!P|t(ES)m`5JVNSIG|^KTe2`-@1J}fK1@K2Z!KzIIs)t+^J(>!9|UHnlK}x%ax2a|q77`*8?q+8zL;OIS!pw(83`O($_06uXuK2>9o}TziP|yncJ;fSC zSc(dHoA%WY5xWb|K7RUC)vh5PUgfh56W2K8Sky7Lvyxy8?BwHfAEa*Nj^4g)8AU6X!cmS`km$}lHw9E!ARM*hZ>iOv#_}C{;M6*wfH!n%sJg1{+e=%`!TZ-SP zm0b8Gu0HztRfNnv==vCglS;>P%rl;^A}V;gxuui!ZppJUOSUT6e){gSdGqGJQqRZU zQ&8zy)xUoIDsvB09%P#Stbnt#^N&;lo3F2Ltk$+|H!wma32_Mt$4yNSi2JnMR+NKX zggPs*l@D58DsXC_-VTR%J11w8<;1{1+fysmuo!&tXU}E;hQ7SH9U%qgPnME`@^Zh>U|6upk2t#FAuFtJ_Qlre}eyi-p>C8_VD)&DB7PsWSe1>17_Jalvurf zeEeySd5L=H-96$cJ;J61n+9O>%~-nuH?RR% zU#T~4Ku5as=utO52jKc!_fY`Yr^_j83G8k_lN4*(a|CVRP-sx}#({f+A3YlHIHk44N2wp`2X#P6c&iU~&FkyBgli4ApN5Gpe{j-E{Kg$yP|z zJUw1tnv&ocZ?u&M(ox3<-7h1^$9J)5_NN$uNX`sVEx&U|U02r$y@I#K`z|)l{rgmd zF^E)=MCrgjC z%WUVxDFou%>RS@!y$Yd{)HX#7dT1(;yK3}4|kH8eKrX3%D|qvOuAci`=0 zq8$JhTU+t2qHx?VF79k;L9-o01=Fvxgg#qdQK77?jK4UZ0&Y}Oqf>W$b#SxiO47A8 zI&wt7A{Kb*Hiq}Y%m{rMjQsD|Z&(nW$aCs|PZ;a4474iEEG_$k8t@AqSj>=q0~m`i zn<63(V)}S^6hOPad6O-zMVL(BQMqNE2qu}En+sfA75FE4E>}ZcokbmPE}vDp(;Qt& zDPh~TZ4#iB=%G;m#)gz(FW?rl+mM-PmgSWzOw{?0K`Vk4%m)u1Boc|(sQ8Ps^Tf)N z3DjgC3{Bj|wd>Xa8bos`-pqtSoRXA8WM_w{9SG12fB~mgz-kb;kA|2@78VwbEBi5I z5of5ouw%2imewU@2ClMGCV8jUP){5_`~yu9ID|v?Of@?`D^1Zm$~HGY|0Vmx*jTIy z$3_C7)N^7EZikpyw!--@v#@>|hhc0b7XEl0Nwjfx#!Wrt=-BzxstOT?%_d!M-{zkm zdE@Tx4)qYY-qYdN<`|NKf{BI(1F1H(^HpQxV}uewM$mxA;4{K4$K_2x33Xlz6?u9Z zdodiXveQ(rI!L}}y7JfjO`zZkVLR>E%4It*MC>kbk_J%NI+w}H@^oB_uG(&ZvG+AQzXB}`&p9uAI!JvLz4xSd!-p$ItZ z?1K*zS&cEZK)MgIJkCM>aRtKR93oW5Vno!DYpP_+2MAnJ?;erZW-8E`x8>|C$2^<3wR7bG${ zf8e9@nKPmyBDx1t|IPCPQd*s_e@p%lf&{nU!hzC_6FMX{T2fV9eB#)#n*sN_LhZSU*jB6)xrCPOvTuF}9rKokTETsgM|W4JZTkf-#7sp(Y~psEZPH+jw<3|$*l zV=_pH$`zgM(Vnxhv-4c|VR!s^2a-=ByLLe(Y&(PDPO}|>!0z1}#+qekXP3dn8gSE& z;?(Vy#3~H9$-^U)m6QZjU>Kvzz2HMnZc34p5EA+V9M#a!;6V@o8%5v^3j!p99hidQ z25Y&_P2b&}oU}U+O$aKc;45cvM8*v0Tkx!7o!5Y!PUgJn;NAWRoADrz-jCT9NE#~=^`LvfZ6!paM5 zsy|Ch^i`imMn zj{+A~@b}_x)8D`2%e26)U+vN}G_wHxN7-W(INlf`6@3ifO^l2{*ZwC@rlTn<*d051 zQ~?=0AD`AY1jvBrzYs2{yn4ECxAH|aG_FH}!luYLVIsvwBLgC~bLaHWpBQRN-d}G; zM;q$vZ;XDufk5cRCn6xW;J=LT4~-JG;{gsENUC!)Gmn359)f^Z*Yf?>uT2{_>Khmc z?H|CFLZAZknNV}4zuXtF5hagGG%a?cQCe1Y0|NsHd6TX$2fvf0rR%?}vf|}|`BskE zm!8gRdLfh$6p3Z1_83)-eD>@aygao#moBYYWXrF*QKe6_D#cIaeu5Ec^dyL|apN^? zH6{VT$|TDh48%_ZsW)FjSip|fHq8tJiZ-|CxnUl&SHv%$5PUj8Q$ep;>$)%G2{>eHuB_h;5^+q$*4GQf=Yz~L<&~&b8{ux5w^~iH^rO$pEHpJY#3BdnlXsFg8{>BaDYftYD0zlhJ?F5--YGC2! zj$-+}K=)L2X$%}_d7!!DiAkswMWtqC7|4Q=V-v6P;jD=dzvg$four;0~D~U^;FKohrZb5sERr{pwGv@o}uMg zmiv64?0RNafy-{^e1|h4ip#Cd;XQ)k0PjU!=*3sO` z$Zy(-OZ%)fezlHcqDOvi*q!SAoolM0?cM;MmYg}uM2xb({Z zAef#zmj`iK{W66M8yLF6ZuQF+uUrAC(9Y0rrR|%**1CVLIb3&{(BIz=P=}_Btidbx zr{*R3{XBcnGQ<-iSjdu+yoNfMY3$**5kpxv37^=L(~Jx9T5j`H4)W9Hf$ zvs{l`ipidC-WVhnb5f ztiAQTun_XVOLl0S^@zxVL*3r%xtWd4UbPJ)zZkXS)P5g&mg~zfCQjyXF%4v9kSn;a zmz3|^Ar9aQC+p5JjMV%0h17M-&6l8eVHy9L_?QOCVHXYb_1|}Nyk_6TE}0%ObHvzH z2obE4kpcextCMws8T$&HwkVtjGe@q>Mg|%w(uLrPlRZV>AdUdw`>RwH6dbX%Tt-Ap z01=)jU_(@gNED%F=gyt2!CC?bIH`#$tU*79bj1^(jOwu+J#wTokL?Npbz0CPY1gn7 zs?<|uvY~;`EN8uB6Dagp%?GR?5NJWN`?+&3*xPxvV01BNAZy0G*W-p|=tO-)Tl z!7pFG<~(?yWAI*+P)NXbx`{koh7geglS`E=fxqewZW(YY6Em~@{;gSPy{XE6u_-CL zfjpd@Hk*ZU$=XkUdNEnN0HnqneJqZ2AMtDvk%v$X+6fSeV4Gw_Wa_oQg1dm^WypsS zlo`vGE&O+>O5B(o*)RbMo~hW@v3Q;QLQ8h5)m9x?>-9o#co1k+MoU|p#^ejq+h5Og zMK68rejbsHoMZQcLw85J!EUT0H8eEpKLh-9uJastc?koUo}8;;gG3pfjkzmFu*?)n z$uVQ#yAPDn^h3Kqx;vHmxTCX>iGA`!FU5`B#w$e8W0ZxOC{qezjoRsAz4@}H<{<$K zgPDiy;z1l6xOOc7#@A(5e&`swZy=FH=7F2l>_-M%)7<>lavUlbA3iH1<@`a^Ys(QU zt2FI)l12slAaHGaJS)F8cuCj?B}S5$qli};Nmlk)x&VHeHw+Sl1{=ynlIn4B8+uHn z)V0TMsABE0cYCymop*Ji;WCoul3+4WTU%o)u3%`Y1^c{xmdUEaanl+^9&F`Zj>$9o zyijKrVyDdl<|ez%W>T@GeN!SyT->007%st`j1pDDSIS@5as-3((MtO)%%871L#0AH9+*1a4;mci{u9D-GdPtHDo8&}`Z@OCig z@#7wVW>W(wZ>#-+#dOws)$XQPQ<%AESk3DI&>qzXo9rW>#_7|KpxZJ%Pf1M`-@SWc zYU+f`!kamtw~|5Yu&BsgoQtK>}fW^lLXOv9j=H zGk_AJJ-PuGM&58;lZbJAJ^5_;R|BXVC-~P(rn+34*UVuoWr_y&{i8ia5*9$AkaR{d zEw~X^wzGR~U9%Ru4Dc2m{VhY^q}|Dca-KMA6a^ONoo?p!d!dC06wx$Ja_a%)nDybP zfB5hL@z?t6f*yfcJU2u9?_9k25M* z8w0rah@;+K2_|If?bp(ZWh+lf;h@Ts$=BbsOxuwE8q1wr=7j_h4n|V9Hy?sx&uSVm zX(%-VoO?ZJrwuR+4Rv)%5%8XERrC7H?R)@5sfk|xOlP|blJozD>RE#fy;p zItLEqm)Y6YYNs!pgKr06yW5aU+Mb~3@)1)W`Q-7^ii(O$m$YiAsq*J8-iPwfZqpR? z)^hvX{jME3x77sh!HU0n`EssVKc=dT#~DmhIm5b*D{)D8vh9h)jAS3(sJ6md+_EU7Gw0_^a-DLMC^lb&k<`Pa)fZM*1Tbz zw0r@*gXVbke=I&1%H?(a^TU%$~NP)T|j=>-f z2l)Zrl-))_p#-8t3`0py!Z0*sE7loXptWZbmHx0YY{<$|5hK8WwXN0QYBfpr{U znOGarTvs>xv8oD<4@T?Ej~|6+y6$9T?8}jby@Khr$wui+XD--#480W22EFa)Pt&qL zh!Z()F=DVaKouidz%wM} ze!mMGxx4gPZZ6BVZFVc2C~K%n2u8pshM11A1z|k)X(>*Nyk+y7pSH$cL!-^HsxqMZ zVtRu2J;}~ypr^M7Q-k9k76aPN^puB_vlr?Jm^UsK7lBh=aXhamGF!(2Zs9s>*jJj4 zP74XZ@lH)m#pigPI|u(Y;QQxGV9wx95E;f65yz;&Ch zn4x|H?^dlWmtks@N`FA89ETNJySw*dr6G(qHASXAgP)Aj+Iy;&5rQ0?uSX9a#N@q0 z_23u>?j}yc*ud1>E^f~ItQ%_?6JNT|w+j;Yy9>9#APrKLXvr8Hf`SNbD&zXGQa@-C z!Y4aL0dayqqNel+#Dl0Jfm@1!iWVSlRjCBLD|-_27`LzpKpfKi=3mzdSFT&_TP|9; z^?EPPJseB1O{4!Mg2ll8>%u(g>Vlz$FejL1V&Hr9ogY3*$uAlju0~S6`;=p?#7zqv z0h&-Iph4hYn-&{svM_G>1~yRyYx$?zn9Sn~3JdS6-fS7cXUcu<)1OwVSs`TS-<`g` z7~5Us+QMD55Hc}=>FDV7eVds)g2iEBtLJ1)Ci@3k-c{i)q;Ky=63v%|i|d+{&}}W# z1wUV3Ci8}QY^suHLC_&JD7j@abakytC#nJ~pyVMps>9-i!R+8L!c(blrK|f8C~{+y z2V*cnKN;`__y{-=q>O^hef$h9#jza!KEetoz2a~Nggmx!i@g< zD6uFVMv|gp*|+X-@DdDV!Eb|~KSO!I(ZPx4g{6h_VKKpl%N z2jWgf1Ong)z6^GdA+5pVYuAFh@ozEYMI1p`3fZi5vN{-&M82`CYk#B^P^aVJHAr^= zMt9fMG1?-{;RE9bma`cJyCg^quI@ZeV2s`=D^pa5UwWr4=peS0b~Lxeaf)AxTM(PI z^#BB%U;<7nojP>~VJwh&u+Dug@lc~Gk$}R_P!>Q!Y2j@2ll+J=9Mr^SS;7g=kT0z; zW^rHo`ue)W*a~S`0$N|di4&Lvc-{UUZnPJgD+*MYmS*MY`Mmmgz|5Cx=v)xFit468 zQ;|I4r5*o3L3<20Yzt|^SwWCj6a`pC))n+Ev@$UA{sO1Cva$<(%u;DB-sjIxAO?*u zbE}fZ9(N%*M2jgwv;oBpLN*KMmip(wApy>EpFhXZi_>@o!#Y7_ zF;~}bSR|Y}>c9ctj*g<@;zXKqfh)J&z56llrA;KXFdaEW#qT3i=i@VvmZ^Ph#~ysO z(!woo(o~;jWYE%XkYw>f9|$f(!a?)X8K@QDDu@WUL-=Z0KYii&VD^F-qJyLV*AKYm zKYIr1j^KcPaul!uybr5I&6t6pdIa*d*`W6}54hRCxuv`KgfRo48BzlUC%@HmsFa1wnUqw3x(RvW#P$ul&aT}Uqxl#1c^9xPbrA0I9*t`K#gq|@l8l%NPT z>H5aT4Wz9^Vpp{gUJbfT3t+5Ozx;s&#BmTVp7&#Taxfw9yGYm523{RNixO~wsToZR znkxY^jFw_vzy49#2$X-|nC^ly_u=)_dF*gP&17$hF@ged}TVkhiWzgmofD zVyx*U+NoL1$nU6w)wVlDM3VM6-&CuT1tzjlLdF7dQokzUGLF8>WZIFzx)@SH4$JoK zJW{7>gDgE4k_iw^W$bD%v%)mJ&tJvK{2H-HOxU+?-LcOZGr+gs_suli*o~2h6CP(F zk&B7JuDK%Rh_og^*Yj%BZ|J_!QAJ_rn%Z-;a&=70sZ z#RQulOe^sO#NA499w{U=8Pb>7_ML%;*HWzEdV}}LbH2d}SwhjMpvCXnw?bIO7XM+1 zu4!tzch|0Q6fk0u5W$c}BK2@K0Q5p+h7Q%G;MDQ>&YhR9UfI#2q$4fgS~EhUqL}+y z;dwO<1BHuPl*&j;Z?SdcB+|5_%lZ~Xm7wKFmOC~p^ybBG87Mf2J4)OVm@GL21PKrV z!j8PFeeKc1hpe4TP-Y-CNrcxNf*|#a2zwR4ZkfZDmkh8<>ltTz=A09(Dvz&)LV|7T zmX##w_DK!2-|sl&H|+SQW<^o6q3_?l0}*=!43*e83~lq8)+#!5S9>G7WU!Yii#m4c z%EA^%!BSM9Z_nfC1qUFwe5gJ{R8m%^Npbxk;5LzPF&+?L($fX+f z%3v3AMi|Ew>-Fo`*ZKN^^Fy{+wEa{af{GXX2EzlVr;$v)o|NyxFT&-{ z*rOgNHQ}x6>75zd4yZ^wq6%FUK)Jun8^Xdl+v7BZoqZpNA#P9E6Fjo4TsPChLd$pVXEqS$T$ z@y4_O@4bBWDlqB{1YSH0Vh0!`UQxlb|Le2yk5wy>mu6;W&?1o2ijYbr+cjVfAsAy% z)eO7WC)CqobkvU@tqvS`1WyQ1>ivfg{g?qAy`UwrF)@xkh1sYm3<<<5ba8Lxs6LPp zG3;>oZ2_5h5F+Fh@q7h%H~U z1wq_Jn?X0l*27hRhS=NM#x&8m%3m!@3@lVsl=h?mCZ-aIp!nu%Ds2HiYxGwjQPN~} z(DKQc4`%>NVVrqYY)^r6h7I?*3gR7l{b6{DNWpP)2SRnDd@~1W$D9@7YKXjc?Haa( zjt=i4>FBCHX|7?ol)m86K)0P8d=vKo4FJ0kDJNa9`SlRoNN?>|XyTz4FG4@lSq6^6 zxH2#IIrPc?B1#!fj~DIw7Jp8x!&&$(?Cd&bp}aVUQUb3RZ^Ti2b<_X(jQsS72(0tV zm)+dmf8SiUsqzx~8BB`{etuBVWrsr(5)*xp8OHU=4mXzKAQA2G0nqG%sU$6o0*@2v z*wZL#pg1gsLPgSovw)zWewqpwNd{6{GMwZ3z=maEWIOaK44M6DsxIyjC-b@nsk-T^ zs}ky?&TS~aB}Z4+XqNG|yRT6r9D(v7)q~%Q&BYhHwt_1$ha3OW{pbgI?02_v=a9As zPK={5E>}xzE0)Fs97@1XjiUBZRtymjR3Am!e51pO+>( zm%H2YH4o&%7x=3>?gQ``mJ18zx4fjF7|*2`in2rutaE#voJoP>A)JF9eWnj}E{CH% z9|EL+zz`IdjovpA0E5v8zZKepj!zUWJFe;yrL}DF5>2_GJ)r=<1b5)N4ebEJ`1k>y z#nr^hP(Z$)XmK4KzW^Qpx9=EA3JVAzG|C?a2=irN;5!1!SZ8?ccwJh>0wM)~k|0MT zV`C39GiNQxG3kCXF>cUSFpAYLbBRWZ)!>NdtJ+#5(+7Ux>@#9C5I&GCLJ|y7f;bOh zsEInRsjDA9QLM(ZF2ZSjIc#(06?ED5wzd*%CnnE*+UnEw*2a)DkgUbgjSM_HAZ_T$1Wnw5DgUjvMB0W* zINVc9rABcpCv!QB0so>_5uLDYd+~w>pcpg2{{b_Q82izlJa&XV=r9EozbR2Fw44_D zrzWQEuh;mF7KP-MfE|F|BmuYY?8i#wsZ4E6O@CKuCj@NKE<9+DtYIYW=*j>PMfToC zPxTzEZ|u4u<+K*sNeiy)IN87(R>`(5n3tbl8bZ+zoW$oQX@)LgHjg{^d4SJ`6o0@h z{_I`?%W^0JGQ0^qr@$#Zd4otyf)f<0g;N7wvx>5~9(XwKWYJS)zS;r%Q4{~X-horH z{0;I73ZyVRIw0ldP3=M?Y9iEli7^9JC3uF##%rvwBUtWg;fkT!-zM7V*&IT4G}hv9 zP|hn4v^dfiS+LW0Ql)Tzzv?4ziF;b9yn+P|T-s1A?WfSJ2> zuUeRtW#Jj(6_zDT>!3v+Eh|f!W025qQzz1*FWv?Elz3etF}@QMjT^B{SE^cmxoW-oc+Kc5dF@E8QYmy;K_t%8x=*V~Kda_9`1&>ji``Gj_i8caIw6&|t^7J+kMdo8eh9{}n6 z?4WHPhHxEuTR0xZ#nGQX$mAGo}^RswEm={ z{fo0JIi(<$;hfZSM)hlhuwXYJs3_u&S=P!?oPeZWV7keN4beBah)y?+4Zl9QV|jloKL z7J+NO(qUH*JlTUL@nVX~o?%yaL>N!ta6TT~03Bb73X%Nx(t>o-??dVP7|HK~3IQa~ zxw-Lf@4%hIDa#cM447SDWoQnxyp5$3T3uDu3bp|b4UOsU+`YRIf>m2vthtCH&f`?X zepoTQ;2rr$o`vpY=bPPKzNLmN-=tC z-%b54MY(|=S5bnO;_BJS_i6@=9>1^jw~=YgM@B29xnV(tP~)B#SYrNY!{x!^omb_f z+GWIkMdgb=KIVspwU6aYQIACUpQe$SomVSYER5`v1auXAt_%EH{Nq>QBAc@Fs$WIF zU&Zo3Oo~#={=02{6@g0JEhExVgRf5InTt1`yLx9nU}${blE+?sp*Tsxt5$&Y&b6#_1fn7@v@$&w=!Zu2|p-t0=k~MMLknL{q(ci$5R?k z%_ls1K7UfuQD#TlbgI;lujSK@o~gOODp%Q*Api3mQcEq~6oahx)6Yx$zHX8@Qe#$2 zcZyCbm|cy)yOxFF@~Z#jN8Yuy|MY+V!f*bsA5(r54|4kZXF4Hp)r>-V>hmI{kfD$^pAc?y+ODrHDASB4~n43QyY$e5&3N+g*wq*{_O z3KazH{~N{Xh2c{olRccOT#Jbv#cG>$%rj_kCa2_4}REbq5_iqRG0JXDuBa z9jmsM`f)nCRjcXf=pQrFoQ=f(T0VP~e0g>0 z_hoRt!0Y?IE0!aaU;C`$b7X9Fi^vV!~1-@n^lS=Cj?icz~(8>A7cs;W+%I+cDZ zgGb4;I4f&xZoH?byZc8Vy+}#?MsDur*H^5xwJYc5TxHXggJXP5<0gOA3Htr4iDzKi zWIaIX?d|3F^Jm+-_U~`S?z3#aa)7q zgee8DUx#j%VI%uVNJ~hx=3b1wdGo_q7j?&xyUY)@m8&Dk`}XaVmX;=y$%=}KLPA3O z_wSdKqjzOoElhf2t>#KQ><$U`Id^qc7>HdL%P+o<$nwp{d6g3G6iRqs? zFJGQ{?b!FbDZRF~Hdf5U&eAf^qMA!dsZ_?kLzzsMaF-Azq@&8*UgAD$Na5bJDLx_L zSz4N(pWlg7r($Abl{^<+=f=92Q{2>o`hNZ5+vm8NyiH7OrT_E8a6Y92nwq1nuQbn| z?Wn1FUQj^1MPGly+;#G2EpBq^qeon#MsvyW>FMdYIXR51JkhbSACJ6v`ZQkt+C($2 zbM>cB2bgPC>laX>(mvrk$+(YEcoU!)>`TcHiTayxv4dpTK>l#;@PH z-%rAGaqe>a$?@@VYQXvzF6r;ztNPX7ShH^Rmn)8rWgk9#4BNUcb(Q(tBqjRJo$1le z`pXQhI;>6!1H7;>3MrZ-Uox|Ew(WHEV8SVljD`QvF$pJ)Ap^ zc!+o%J<6_H@&5e-4vTZd1BVYEK6r5L+SL_fJ1oSdr0y!X=WPwf;#j{~dg$VO=bP)n z>GFCYT_PIx-YJ=DgW)7dN!@VulI`2xx}$rrx>Z>#N3~;7Vt1ZBFv=@Hh~* zB}gJKH`l_1v~%Z9S(lN!+1ZqGSFF6*k@j?#Nfe2T7cZKccG)yMPLjVy;pacsoN0{N zy5D8QsAS&0^UV?#qJSTUeLbJz7It=rnW0wOZ+X)L4Voq^do8Yic zhK_=|S@Hj+ivCCCm9m|fobv=;$LN2ZK zx)l`_Ra`8uTJi1M=3C4aV{+ydH8m%WAK&jhblTL^^!)km5RxQH)0>NVbtanU&he}E zPxMtERaf@!B>SeMbm4Lb&gI@` zm%h2uhdIg5P%*Y(-v2HC#e)akzv_|)jT2*H4xG=Lm|yJg?{^vPXiEHrxped9&8zz3 z^NXk^IN!$5C&p*bE_Z(j{_^EZq2bAsCp9!RH4hw!ocB>?jOdc7bims7i+J$hL20Q{ z_(!wY9;_9z9|}8OlG?j>$Kg2sUAvw=d7^10R##h_Bzw8LJaqHyXy=QxH0z5Ot2?f! ztC!tZ@!hgz3)aFmQPDTH-=qtzFj$pQJ4V01e&w~YeBi)=p|shsu&|ZI$-1zua;Gwl zgm>*)i$N>BDrJLd{ix;Y$oFgb0jKA5$KT(-pkNNg6BCi-&%(x5PHYfvc%qw}nVPC0 zS41@9sgm2iUBk#oe$SqeJv>Ar`qXU&`}V?t-kIyYkq5cI1S# zz%ERV#jk?|J|)kb?Cjt5DGaJwIy#}{H<}w7F18o$H4MjEx*~gbXy}r^>5-)USG(S? zX*+$suKUutbM-|o_Jt>njEpdhl|p;=pc{?M&CSKd#aY$etE{L9;ZwS28u#VPabaQM z86%Z?A4bx0i$*?P5EK;jtABPfUF#NR|APkta_i#{Y?G3Teq8LiS7E;9 z=5_;xj4z^Vaek6p?CeIZq4uKLsey)4Au0yJpT#Ne-Md%&59Zoa0)dKp zQBhqTb&qkgy}i9(gtC4jJ1=h-`-3H>2o(Pe%J+iHW-VE!Ljs1UPJMlLayK6z-!9*~ zcefZD8XA6kWu<%Q&>?@*$fzg|)y**SE5;&^~z3 zd8kD~K_MygR(SZ1JI9Nhhuvm|v`fQ%eHm2y-}*4n){%**+WGSWs#=DIa`N)>N=ix+ z5|{r>4SfCjRm%6x8^r+X_}Ez5^XI7Vw3`0-v89H_8k=<(uARGfF)}fk6gt_IhmcSt z4Gau0Gcobz=jTz^xw*JHvMqx1^Yep(SlUJ6TlCJHnMdCp85s%Y5-Idt+JC06x3{dz zVQOj$oh|1=)3Y_}xcL3HZQtJf!eo8wYV)~VO5@kB0439a16*8OfMfWZp40vJ;9zw{ z#TG>m*YWNTyY(}tCMM2z=0(TF6=2EXLkbEC#$4rHTwFLgIrlf=PNY73*b}+^khIhvVGOzgb>1?6XQ`8<+EfW)^ojaMsIPs3O zXU`7ewrOi?qd*-zSXEi+)3Z9K-*UtM3Y`8&K}OBO+W>6;vqJx$7ykE1_uoOsW0Sx; zRPrii#`317T%AN|^iYQr-T%>Wzc~a{XuT5-I#gJjixTHy1Aw3cqs-9I(2NXQRAPLRcsUBxcG}c7H#bKkBl_>V+^r4-($mvZ zxeJRDpa|XMTT4q^Lc&2UEv%23_97PmV`j36NhcQjuijqeeRK(agucGMg9i^f9c_B| zZWVcIqVJG1FKV)1L{t=~4oSf+Cob-^o7?`&+DDFrJ(_ftN9O}~NVtOO&75LfmjPyyP;)n?*%M z4Jl7BnNdC???p#%6A`h!bm{OFQNz3tY8QawI**+dbW;0Bjg5`PB_%zl37e&#ABq+A zP&85YM@LR@Tv@*ESO4bvg7pitre`P7yT9kz8lsP~5(q66=5_0u_p+PQCBzWc^U4#& z&v`3%2XXFTS4~MtVXa`_u;B)Kq1*H>s`$Hi?>21M(9zLhekU?=1HMs-WLcYVb#Bbm zrwmO(H1?3c_ZuPVNPE%t?c24fPYv_!d>L6Eq(?_bSJZR9tEoAxrImJ;bWid6+U<1K z8z{g6=u+3`#!^OhiHKx;%`mjGw9K}+AG?MkDY1ke^cUD_io9K?QHU%%9$i(W_f z$dP-}wh09VvZ`r#=eK)8F< zw>e^~QGLThLhj06%cfO?G&DEOuq`Qxm_#|Y-%hEktLx~9NK127tpZd=jp!bC^-wG= zEG*2+i+MabzxeFguE^thdV0pjwRS=lR#v6%vza3u_zqP3^k>g1&R@82!NOuYRs7DK zJ5zf2r6n;sCT7|H5Q+HLh z&fqSg+=PGjS8GelTL}gOCrK7MWkxzW5*?j69bLq#f9scjLc{62%U6m1U~rIQ{O@Yj ze-^KQNz$d+ow+shz~QQ7*HvCG32WA@c~)}l)tFDh{kF}U)P2#S#jJ%ksXu%?sum@V7P}x< zFPs*%P=Deu9m(JZL8mo9$eg~SUe(+>K~YMCQ`tX8P)%<#r81t5lCzVP5Vl_D^XiC{ z)XMse9@Y>gcME!;OOZY;x+}~2_BQK{e9Me~-}dYJ+@ZgpojlbwD)INT%L7WQ z{(iP8-?H@Ig95J4efxV5-%OXiHdl|A6-Nj)8YGS>0Wo%qu-ecE#6e5Ioin1_=bO zdcVgb4D}Dp=X!*sZ1}t}dYlp|1Apjp*hvY|EIN(&sEYd4I@Y%o>AXq^I$!;Seld)> zRM(g3SR3G_zcWUs(@&_EVJyFDOi3v1X^Le9-{h*f-4@nwgch~=yt%G^W<5)5xnj8O z-U4hG7us+CfBfg4clrNZIsd2a|KBgXU3W|PKTePvr}lOo=FE>ZIBtxd^e>h-{x=TB z(l^K2M**N6|9`#kkNV(U9<%D7t$jK=9;O2C^>2rX{|u!3*R%aM2 z-oC!3;zVuZLZ<=TjCLpV!H|~$0Uz^+%-ajEGLsdPb-8?feK}MiuC2x*1XVe0U?AXk z=M=F9P}#Y6y0RSrlJ{K1~b{-e)Ok^FZgakfMqLxJ)4%DkKT7v8&<&hsr>+1pIJ%JH}=ey_UC_TT7A9*kmrXpaoyDw@*$;_%loa zeBZI-384JpIB{Tl)@f-46@R`6$eZ^R+z%c))ZExu9}UnaK+`r4>V0WwU?LEexgjPF zG&}+ID-Y+hx3QTYX_t#Ud-km7L~kXAV5qaSG%L#i01gu0?mc^+>-$4p^<`Smvw5>_ zJjDVEiB}L!a5cS}_39O81bOGqG+bOzP!Q$6R-1B3WPDp1kVlgGXW2F?63k` z0@Dl%3`B|3@P~xMGF1D z8LRt0)C^y{Zr$MEU|q73*QdMtpvS#@`SPkoMQ!bH!;?C^4ImC;3dGmB*b4sLyDy#% zVBr+XvZ$!58?8^FzP|FS;=GE=DphMt`Az|hpD*Cs@I(ERCo8L}W_~xVLz^I-E%gkQ zI9u#0afZOc^0}d5-P*OP%v<+4`fXz)iu23KB^GyrSO&0d#g|pk1QiS|@WlWd0Nc@^9E2-TkDEJV#xFKTvkw!!F=u-iRe#~bvOqCs&&W)qk&ZfLJWxwi^rS@{n!mJO1;7geCv7Y#o17a z$Ia}xg+x7%9#x&?GJ4jpKEp5{@;VbMkNSq%ni}vA5bMILgP)R>bki+FV=tPU zmvt;cgeLajYmSi)gz_|b6MC!fDqc?zVJI(HQ|S$D(m|bpMo4enx&>wL)ui0MeWoD~ zA3Q*-zD)+nrgnh_0AANLG(>HK^djH~EZUK8Z{pV0JvomBnvjq%RBLQxBwn7wJ)2DN z^Y{OnL0V=cZQQuArH8Q5%gZZ7V#!K3Y5z@jEMemkIq(~0=BBS-BR^pF@%!0*FHqsa zZTnDGW<3~XO1yY+@KlDuo!D4kLZ|=(Rb22uNJLD`$mfSl!-?bb9?(^wz z@9piC-6%u*wtNDIsyJ_B^Asu@(DHqT_CU&A*~|2xCx#7CjeyLpK^z<$Mxrj2k=vbQ zb5XN%(rd*-l)Vz#rCjGHwx5v_7yse-8njX<-zFEtc&#^q9YIQ&=33>VGQE!e-Lxpk~FgtK}WtRi)FGx;B63?bhn}FpvK}jIa4u6~d zl6nX#2g;@F@wT9*7UwJq4^+AJ!W+;MQm-yNKl2L8E{Cdu+Z2E3O_Y&PlH>s` zEiGf?_Lde|VPS3jtgHKCWMAgB3iKqk&Cu>x-2x;d0p zSeP($tJvz-;?w|ViPS2J)F0#YoFqYq;x{p+BVBNvnwpvx#ZKt!H_Y64OMW~*IWf_H zZV;Wo^9{Y7>x91E0 zD3}g0w5GOJ#1)~X~>$)DeJgJ>uaF5Zsg#2eYuA*{39F$e7CSL3t4^tcLKF0SxE^Mu~`4aiN@w; z?zsZz;kMg z?l_JP4g2rZo@vYF_?HHBG$oN{qZnD;|6bzGO?DdZ)=2o0dr@COLBaVR1jPC_?~uDA z-}1w&#G&xWzEz%#@cGz-CF%sQ(2)zhNu3$u(dTGL%GMVytj)QN+gIUEIo&%jpv{Fw z&qyG?6+aB9VPhlw`iFwmr@JjJr!jY+YQ4X?4x$0oBu>u7&cQ+4J)@||{jY=uMi2Qw z>}>Jh0(x3YtD><{N=V4xd~#|kIwGRwl~wqYC%<5CJvowOaO{}MslQ0{(X(e4E?qJ@ zeY!#%&CZHl6+P1bA)Ay43AV&}Gc(RN?3*|5u20a_*1iS|3c>B{8;^L@`{ZOkPR=MO z5)iKNLvph2MPIy}m6i4O?OV*T8Q!YuYJdlm5;qN+ssJ1U@%ry#sr#3X`oDtwe>u&6 z5h~RL0mDSDT)84ACr9b~{-OsepMIuM%Dc}zv6y=P0Rf}XS``(S-SaatGD3rc*D*7< z6uF31)W=cKl-+1ob}EA+BV&?xsTGFM@X(N`Q32{`!|D|wef?%2D?n99T8Ga$?@>K@ zvI&}e>pO8Tf?_gop|GfEN1p9BlW{e91qBF2H`##&xOC(%cbB1Ytz7vAw0dW^zN742 z&!s;;giv901#OI70QGiE3;@S9IPzLrff$K!UIjRDr5E)pD=SO?*z<^=dkfT0^1p`W z0ANP+#~5svqr#nLSA|I)I&m2WAmHvoSMBCyH6vr=R!JiI5zI=K!}CpaC=MpUn{(<)s+f%n6 zit#3NhW>@_JaVaMlRz+?Zvx;NOP%6a;<0|U${H`j4X#}FXV zDCG_Rz*Vztfh+C74Nhir?o(`4)xp1(jk168os_h+!0NujqN1n|v^I^qff@~s?$ObX zH`nFh<47O7Cw~p?n46U~G)pXkj>@WMWHba!+~4my{rjX3-3tr=Ru?ZXFMg1c5EP_# zcJh&PJmx2|RszDpjwDLkR=8(#!aEicI%R(Xx^Fjn#Z6p;pP%}H0~4$`?oRM8W zYZHMfSy@;rYihPpU|~dNRseycC`~TTU-4;IghP+Hf`+lJT$W6sWTSJ#fDq^u5fd9# zvcMY(T}JOI+wYK+Z20!=TWjk+QBl$T`wgIkA379V_Y0MFJ>Mts!$3`^Pq$!!0(k4V zx8U=bQ}A1)SiO|Hw~nztKqRV42x=&pm(v6YBP_MUhVy3SAunIOTF1g7L81JHc>^{Q z^!$>AMH9j)K%r=(fU1SB+*vAMw>(ct@nJu&JJdZe&;%^m+!&{)aJhSR z1_=fWl}h8XiYTR!@B@Q_ZZkwjMrI?S<5v$mDC7Ba7^T)nog%st&8-_A*J98y zad!bikd&0%uT7?kV-9>EMon(tr*}RCxZm0zW)gxeBb$}%P(iTTdapzGwGD4=YXkl$ z0?yjQxO(-u5SQUL4KDOpvHHU_-vBN0?I*wjn`;@tFd$JZ6@u&T?t680@N3RQg{fePdQ&;yh2T{jD?|5ake(63K?cVS2Hl>k( z%K_%0hieS32F2PhR)R_wKsD99AYop?j;ZeM?(UfF`e#a5wIA%n+*U`2Rkgp!?K;2O zQtcz$IykIw;_BxnU^&K!nJk-8PQx(J()wQH5`OQz_Lv(AjI(5H-7j2O zE?Pq8b}GgYB6I1?XY+!fBb9G3XZ+Zc4EnH=Jv}{#6xFb#((V$d6%`c`e;? zt*VOKf|cEA#~!w5biRFi|H`jV^gU}OEo;s_k#`+CSDUaGhBz=H%v$?BBxvUQwy@c5 zY%jjXNiNGA_a~4jPW?w`f*8m-mbGAr<21E>0~gn0hTzcM3s?LW1Mb(Md zz_OGmhhQ>v>CqJch^b*p<8aSfhu#W~ka2WTOpko2r$Buo^iF*^`tqS;JV zIL1*qSw&xecC%8Lv%|V|>lUyGQSIB>+Q8)50tCf3(^3$H08z@4Pca0Y3ufT&K)eXb zK9~$ey|ZUUckFPP>OYnZb3c$hJ3s%)LcEMU zZvgdaM#gr*V`W{ql^O>QNH4nM{Nec8R7&pMdnY0y4xWp09?0TBxO;kSIX03uU$*UH zRG099+G$);WB8y!7ZLj5k7r`E8k(CV8#-+QlOfGDHJ4Wpbx z6;Yo?R<-~&PyV7VCW@3g1U`WCO3&vR8Db`HhPu16k)whYgc6=Gj5`EE2sE6Zoo$d~ zeLFN%2YnO~A~TJ3Y-hcjLv27qPMW4h{}jsO=5fmX<#;yfl}N@l{Dl$w1AoUe_&H&9LL0 z8YciF&}GtH{1)&NOhbTMMW_CVx3-BMiYr)x5U3oToKP7a3_$c;US8%FHDYFF9vdGg zKdC`Ihf7%ib3gZaubrhXEg7G6py*9KNZ@&YgG{3p2B< z*K%=wz6&aA_(vMb1UiBL4<(W2H4lGtK?7|g%6ZIXy?9|?63hR>xafdq7`PG?07pm4 zzO}Gf<8reK#y46NRO^J~qISjt$mrQqH>EicZa)B2rXGQ+oCLOzFo z9H4jV*_H~r^|Lt}k-uojFqHWsu-&M{?P_;fkVw}eJ%w&1pt13Uv9U2SXdHqE_RPJ9 zP?4aoL^P-4!MQZ6uKp*6pLeMW4V&PiU_i?xDW%=N{{we{{#axJGjbisG~Tc4krABp zPz+LTdNgv$R+U1_;2^ESoFc6ESn9Ud$B!SMV2UxPpeoDcPB>x7pn)^XN6pKDP|bC@ zN@56*)YM?UZOEYFzj9N4@(7}_w8am8+A!}6;?YtkDkGeEw&WK3T4v@s!Q{+m&ro6v zXGHQlKj5~Cm+Sog^i@e%&A|qk+%X7xEiDBDiz?`&M6>nl!-aOL!Q55t|HV+e zJoW@)j;vd3FHLwK-EyO@isY#N{$J>B+J`x+mxpdZUxZI;#ITqzjAQWk+ zKZt~nOWCnwhmulqmAHL}{Dh){!V+|$p+xgJ4^NiqOs0kR zpkMIR%;8coa5d;MGId(L50EB~3iyzTg?aJoo{0j&ZJ*Vfe~!DN3}Ll@X!bl|X=(YD zy92q*4cI^^S+N{Q;M1YHE^0&dhu?2SflbRb{rZwk8sZ^_mrs(pQ#dJ5j@+WI`tf zTI1>1y>H(cZEY5^xrN15bPb4t$OUu<1BTjMyqFjt51$&L&FiqRdr3Ln-RCi>{n%OM ze)RM-fW`Z<7u`ZjUh1uk!v8>_yAvJl?CG1?Ly!6_)-?b8gy{s>^~b3+vYXjh{Z*fwe>U*v_$E>(?Xbd5^ptffs?e zBQV?`McUQX)yYX}ev0-@w@6vD2T(~$o*ocR!@}5Nt5a85 zA-RDNqIfwnD%n|C{ZLL(%V9{h>gFI3C5lFcR*BY-ByLI%_*i}P%o+G%U$7vDzQ5K( zYV6FJ_%!4%9z1;-#J+)>Tj}cW6PGWK7hLWUFNZWPlyVAOz`%E22PL?3XH#+=V!P0ym7Ir&l?Zh{ zM05xFr(1$laZp65a~we%0wf;mmL>1MdaJq*+I^G;wbI_BXauWJ3{tq(eZz*ap7I5VE92c!671hY9x(5$l0E&?Ey?3tzsm}oc;RdJ6XtC$ z*QcaQHz7&GX3%Ixa*V}n3lGmht|vN)<%((W*&?E&H%9nu<>`SDN$hd^M)$~O$F^(HS#OPpUFdOYR+{kJ0=%OO`1&EhF`g{`TOGKnLENde#?-2{A z!vGuiAU+|ea_Q0#Dw1XhkqqGIXlY?#8iH&)kD>rD5-9UjGN4^dbo8SqK|m7OiT8m7 zr4rakzdsPMzLFk?5GBr6M38fSsxZG)JM?ma0Hcb2J6TAGk(}c;eIdJlco@zN=W}=r zW+664H)$Q<;FC<@s<*s40Cad)ojGm=%FmF_)b#Wk`m(5d+e4MxvIrVYgIjq^a0PNpql5z0tu<0n@$q)u zp?h!J<&RqO95f~>xnOmiMhCRth5^Ocwq(8g^2HIv2W@G4sJ#FcgIsEn;~g@Jd-wF& zv-2U^{2|Yu@9~L{hVGF8YT(4-boHvu(RdNVJbpi|C#jhPT4;9j_ENz5sWcQlIBQ>e zGSkz)Wg5#F96`o+wVSty7Nc|7Zhuoal5K@oFFGFtJScaCSOZV&!i8rTQ@?@%JoK z-?X%ToIJ0RCz3NIXw}D#eTL}`;P-{0eaPZmY%x;x&{3JmGmYAhB2#_yFrCp<=_&OG zr7=q&sUf9TR%VU{<>dKT<G7)oTFz7 zBNW}hepU+z*TzZE*n0cKsgoyDQ_RqQCCZ0>Y}_WlTUZT~1;rdCBZny)waH-3xN9*s zPB^?aa_(G$e)(uMl3HwL#b_KW@;h-f&JeH!_?7*&VTiiIbGh}^*jOUxJhamx?A+{H zY#?ZbTrsf>j6akWCC?lF-A(QN-A&xw2o}&Jg|M{8Po7+P{T*i1OQmD_`uX6$Qb#_P z1#!Z#Tb6V%oQxm?dQiL4o<1FhPK-W=jtNjq>;dA6*xUnO*_IZU0%<*R@ZhdJdk~a; zPedjG+GK!Vg%Ax%LU#WAc^tP3ve{Woty)1n zul{Zv0L#aefH90sD^M=U7CT`&ynhcyVcRCb1S)}@r6a^y4&&|bVj5*{GtQips^|^Az)pZWg zfCiJmMVpge!r`)bcVi6>$2KF_SwDaNoVp7mS>CC?9>^XUnb0l!Kw)o&q@uAdEG*c= z%f$HL?{(NS@~W++tt~RTP~}=Hatn>_cWKT;(tZnAL>}{wpuGlC5Z-jWhG1cm{P($x zY+2f4K(DH%rk`Pu3(*1luHcix+1?{99V2}X6`UrPoqIBq1o$L}fXD&a(-12V!i(ySBE35PvKn6kHLb0tX~p z!N7qs;m^n{R2QR;K|x26>C7@^82-#+6pfu=DM~SQzwlvF-R(MK^3)YVM)t$8$c5W& z`Sx|Z`SU)5gK)sDoyRvB%8D36_+33Cb!MoetFEyW^LR>iGm>ZPA3S_0QU2(a)@~C- zA$<;!Iw5knARMFwz0En6k&cwW1fI>w!9fBJV|i}}v7oniikd<UZz-@f)9bwp9@+ z+Iragv}x0wyLT5SC%NEqE&g&~{cm^8{4dNAWx?uyX13zBPzIy7Oh23n|6MriKhs+O zv(buJm-P$@Drr8n1jqIsPJB+d3aL-#o|^0hSJHR%|nO|jWHb@gS3POUv;E4$A+`K0Dg(~rag+uooM(d6%k$b5nUi+U|N?*n3gNK zHGow;<)IIQ!8Msv0s{jNtcbu*;8AdMGA8}DeZO=D$f#MNBK+*^f2gH&hejA#*LR^6O@^>$Zlao`iW8W=hOWyEV z*df>-hGzD;tgX!egc{ff3G>gjwHbB+adp3-mOCQ=2QfL!1c?cTJ1NMEC@HOAM;2C) z9IgPHpzIewmElUYwYD0=q=G`@;~RPJo+lJhl(tT6QKN;Pv4F5;0~+R*eU96p1D1fB zBB|d~b!Rsy?eF1XW6UUc@V^^{!Ke^Unm7r=S=oOjMg^ODP-CjA)4@bg)!5Ec{2I!M@uWOazp8n!NZ>^r+;e zj^Z;XPB=lyhMqv6(zas`HrIXsE-xuLi5p8a^SN;vNUGG!3(U!9!^~b15LPkvDNY2z zrvf|A_%>ql^8A|EYFww7&Rr=RT=rQ5gEn~H5N>gvd$LZVVnZ4O8$hiFChY6!f$eqJ zf_eS=WQ50abEgp^5iiHyvqzhO(DV=+mzQ5e-@q=31o>-@#@|>Vf7RF5yDrX+)6^uS z4FClvq5zTWk>%uQZNGp0l;2TIIa<44yS9S)IrjA6?%8g@>0ug0ZV^X! z17!Hp9Vqcw$2pGxfDDr4I`(7L5)TG!$g>!gKsm)E_rjg1C_QSa#{GC0=RxeZum$iO zCyoXRn1E2uKvo}&zzqWO_*!%lrv_n5FF)Sg&hChAFO9{>UKYp@L03Dp@E!W%MrF;;tff1mU@m~Bec1)Ge zVII&^V4>IC-KTfoWHUE+fCMdK0aL%EGpaq*PMt*Ce~89nppSiK;Y5jUr5A-BI)8Up z&>}9Vcn!BrfHBbZt*o$3X)kt$`qiT&4USyT^7 z>aN7B+o&Xrs2SWuh#p(mKGxTdVPSOcR)dP5NA zu1yI6OgVN8H9ImX%DDvV6|5cx-#*kg+$n&QdRD-r*G8Fvffd-V1p!ROzx?*Qw{N|} zS{m-kfKCKjJNiZXW zid`HX-xJ;4+>Vp5gPobySe*8Bc6ORTEzLVFASft7%N7smfDcNP!y(TJN9M=~+RMza zp)*qt@+w5L{TmV@BX6*`0ezjhD{Tu%3%hWt=3r;3+w`rFntI(SAlpJGVG*Wj+$nzv zOOqorv$G$GQ37*-hHm-C=jpGFj*QsZ*l2I=gP?0t6m<~V9AqfdxEnX<9q%EOvadX@ zU6Gawg}hX`fF9@|OS5_r;fabyWWi005S8hGfQ7Z>#PZUD`IrInN}f%iDY-TcKa;(d z$-!8gf=g?^tocX;{Y%^fiQ#tJ1iBqKG8zVI_c}HUw&(O_Z%A>(g3Smbc3;XAizc%egXVGA&BTs<~5br&k# z@_R^1qwPhSw{GHELqckBPL%=K+J_Fo2-}_*7axxmw1$xpT0G6{M^i;`gy*j+Xj8(c zIr8dvXXy$|K_nkR@o*!8Y1z#x&B}u~*vqTV4jRF`h|*9iiHtxfi+1UElk$pnn?z$DvMwZDD&RKr`}^J48gT!wu!; zjs;r6w(|(K3pxo>EM^G5*7T=`rUJk;03R3!-WeVZ@9JX&c^Vye-lF zp!0BU*Z@p~C^EUetPT~JjSV=4B!?aOLIMKaZMheF%Vsd%C_;U}nAjm&UM{q4TQP!m zf`Y#0p7@TxLe?c~f zq|%mVfkBYTew?Ap$ak{4+3ZtMlQ)MMN5C}yvE5y38H@p<4G8A3AC@;z#P8qdckaf> zz}98L^GP__*_91_`5EdRU&B$w2W>96wf=v8Zpqj$VeHTj40LdET8v>@|K=uoHn5$$ zt1EDmRG)8bT%0Se5^|MPUv(ir)t{CQyM4@-C4|;^!}- zFX|*KZY4`WM@v9Gsr0N`-mwq(p+uL>gBvXew{{B~Q{)?Y6{TBOw{P1Q+ zaQ)+8^NY=%vOaj4LxGX#LhDA*akc=xS?x|YXk&lc6k2)@I6-2D<+S`(Y*T@x6Uscs z{b(30pX8}2CqFEW0G?0cUdxO2ofxoQ)cbzy!nLF7W*$R6*?+W*hJSJhMYivW0?tza5zza7{R!$D$ z(@R4!NJ%j2g2KXt!h2!3w6?dG*xerh=UlydH4Z{Wm@YCez&e3`QK@Isdu0Nb7lm(*t#_d`6l~phpzYN-St+9xGQ=xk1bHHkk&w3qb6%z2?=$3$=H_l+brtQY1<3*QKs<5> zQxNwxoZ6K|b<$K#w)!Hp1&VJB~9vtr~THngYt ze2gBvqk>?Ef@2f(N?0xvo`A$y%&S(d0*Zl65B~Yrb1ihAnVh5&@c@Mzd%m>nyZTTc z3V|+ghk}7O`}t-K5U|09C+jQ5+Od}gk0KF0opp}3@gt6W$44RiT2DD^$T;#@*5=2Z zH^z7FQG?1-PAhDfpr{O(>d+nG0{oGHwkEN6uLd*ZNE`HG*28T_Ul35zhoWJ@Hta&~ z$Rm4LmR5*yCD$MbTi4D;j!CZJS)t7<;=9W?kK6Ssa-DAckZnc;o zwFuA(D*{376yK1)+wek*_aTC+8hE&REcY4jSJ04=o9t z$MC%)B9WIoa!^w<;FP93FT}X(tW5XlNy|H)y}EHj6_ggK61$5Ri!g0DIBuf@8lFB4 zG>PY#Y%+s6#=Ze^v01i2iQQ<2HJ85Q38I|Cg$Ur1K_KG6$}i%Zc1S% zwhkQ~0;y)_;yR_LcLfPx3I*4;zWg-EBi0TKY(%MuJ$N^)V{H3IL&mc`&V|4l(JucX zC?J5Hb^?e2q1*#I;IS1-*Czai=22^y$>6*U3=GaE)$qWZ?=Q`m$_pT{;39U3{+$un zl8BW60+na|Spc!v7qwR;|2`9^3t^*3x<4owC@jPtU_Uqp`ln9uVlx-D3q%tval@*= zo2X!7pw@y#8NNKPQKAyaEn*;r&@Wuv0Dphf_^gLx7$?osr(NN91M$T}=zl7MoS7R0 z34mZcl8Zn#x3<<2*bcQP&#s-vtQdp`;}rFjZw-$hKXs+KV=4VH+ZwtpBVYA@|6DgG zetoryieYfD&+(1#$To|5>P*~E*z6#DMMbfF`JfZQR^lSdE^2Et>fH6``g(TyE*Hm0 z&LeMlGYm7n4iDR&HcG6uoOZkZ+Q?2i5lNDF=jumisd_ds7B&fN0aPiSNfqnTPM7^j zJ8!)|*ouf~tXu{Y_ROOgQF$K*e|T{Ag-cPpc!x}4t@s&}7tQl5WtTnVd3$6>rro;Q zKc9bDVdVzlH`lVY=w+)+xTI}-ifT~*$4yICgLf_0+ z*4pLcQ3{(w4?JlY7#+vjAA`;$T4*S@Xtoezr%;fCZk~O24^cV16d1G(G9alajMyMzIc5?Z|CPsVKU$v$M`cNuy8q_U;G-lO5&gW^KZQKzkZF?CWik|rx#N@|M*ARX8uqNr@f-BaYQ{+ I_1umB2P6uCxc~qF diff --git a/tests/typ/layout/container.typ b/tests/typ/layout/container.typ index d9b62f5e8..8a711b10d 100644 --- a/tests/typ/layout/container.typ +++ b/tests/typ/layout/container.typ @@ -11,13 +11,18 @@ Apart --- // Test box sizing. -#box(width: 50pt, height: 50pt, fill: yellow, path( - fill: purple, - (0pt, 0pt), - (30pt, 30pt), - (0pt, 30pt), - (30pt, 0pt), -)) +#box( + width: 50pt, + height: 50pt, + fill: yellow, + path( + fill: purple, + (0pt, 0pt), + (30pt, 30pt), + (0pt, 30pt), + (30pt, 0pt), + ), +) --- // Test fr box. diff --git a/tests/typ/visualize/path.typ b/tests/typ/visualize/path.typ index 7a260eb8e..c7c1af508 100644 --- a/tests/typ/visualize/path.typ +++ b/tests/typ/visualize/path.typ @@ -8,7 +8,6 @@ align: center + horizon, path( fill: red, - stroke: none, closed: true, ((0%, 0%), (4%, -4%)), ((50%, 50%), (4%, -4%)), @@ -17,6 +16,7 @@ ), path( fill: purple, + stroke: 1pt, (0pt, 0pt), (30pt, 30pt), (0pt, 30pt), @@ -24,6 +24,7 @@ ), path( fill: blue, + stroke: 1pt, closed: true, ((30%, 0%), (35%, 30%), (-20%, 0%)), ((30%, 60%), (-20%, 0%), (0%, 0%)),