From 7b5d706575c654a9dd7030bd7bc14344c8d3152e Mon Sep 17 00:00:00 2001 From: Fabian Greimel Date: Wed, 19 Apr 2023 17:46:42 +0200 Subject: [PATCH 1/7] implementation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Hans Würfel --- src/recipes.jl | 54 ++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 48 insertions(+), 6 deletions(-) diff --git a/src/recipes.jl b/src/recipes.jl index 30000150..fbc6b40e 100644 --- a/src/recipes.jl +++ b/src/recipes.jl @@ -134,9 +134,10 @@ Waypoints along edges: Attributes( layout = Spring(), # node attributes (Scatter) - node_color = scatter_theme.color, - node_size = scatter_theme.markersize, - node_marker = scatter_theme.marker, + node_color = automatic, + node_size = automatic, + node_marker = automatic, + node_strokewidth = automatic, node_attr = (;), # edge attributes (LineSegements) edge_color = lineseg_theme.color, @@ -156,6 +157,11 @@ Waypoints along edges: nlabels_offset = nothing, nlabels_fontsize = labels_theme.fontsize, nlabels_attr = (;), + # inner node labels + ilabels = nothing, + ilabels_color = labels_theme.color, + ilabels_fontsize = labels_theme.fontsize, + ilabels_attr = (;), # edge label attributes (Text) elabels = nothing, elabels_align = (:center, :center), @@ -244,12 +250,48 @@ function Makie.plot!(gp::GraphPlot) markerspace = :pixel, visible = arrow_show, gp.arrow_attr...) + + scatter_theme = default_theme(sc, Scatter) + + if gp[:ilabels][] !== nothing + positions = node_pos + + ilabels_plot = text!(gp, positions; + text=string.(gp.ilabels[]), + align=(:center, :center), + color=gp.ilabels_color, + fontsize=gp.ilabels_fontsize, + gp.ilabels_attr...) + + translate!(ilabels_plot, 0, 0, 1) + + node_size = lift(ilabels_plot.plots[1][1]) do glyphcollections + map(glyphcollections) do gc + rect = Rect2f(boundingbox(gc, Quaternion((1,0,0,0)))) + norm(rect.widths) + 0.1 * gp.ilabels_fontsize[] + end + end + else + node_size = @lift $(gp.node_size) === automatic ? scatter_theme.markersize[] : gp.node_size[] + end + node_color = @lift if $(gp.node_color) === automatic + gp.ilabels[] !== nothing ? :gray80 : scatter_theme.color[] + end + + node_marker = @lift if $(gp.node_marker) === automatic + gp.ilabels[] !== nothing ? Circle : scatter_theme.marker[] + end + node_strokewidth = @lift if $(gp.node_strokewidth) === automatic + gp.ilabels[] !== nothing ? 1 : scatter_theme.strokewidth[] + end + # plot vertices vertex_plot = scatter!(gp, node_pos; - color=gp.node_color, - marker=gp.node_marker, - markersize=gp.node_size, + color=node_color, + marker=node_marker, + markersize=node_size, + strokewidth=node_strokewidth, gp.node_attr...) # plot node labels From 56373b7e6881198e0053ae946e5c8940032e3873 Mon Sep 17 00:00:00 2001 From: Fabian Greimel Date: Fri, 21 Apr 2023 14:31:36 +0200 Subject: [PATCH 2/7] rearrange code --- src/recipes.jl | 88 +++++++++++++++++++++++++++----------------------- 1 file changed, 48 insertions(+), 40 deletions(-) diff --git a/src/recipes.jl b/src/recipes.jl index fbc6b40e..5e671711 100644 --- a/src/recipes.jl +++ b/src/recipes.jl @@ -211,6 +211,49 @@ function Makie.plot!(gp::GraphPlot) node_pos = gp[:node_pos] + # plot inside labels + scatter_theme = default_theme(sc, Scatter) + + if gp[:ilabels][] !== nothing + positions = node_pos + + ilabels_plot = text!(gp, positions; + text=string.(gp.ilabels[]), + align=(:center, :center), + color=gp.ilabels_color, + fontsize=gp.ilabels_fontsize, + gp.ilabels_attr...) + + translate!(ilabels_plot, 0, 0, 1) + + node_size = lift(ilabels_plot.plots[1][1]) do glyphcollections + map(glyphcollections) do gc + rect = Rect2f(boundingbox(gc, Quaternion((1,0,0,0)))) + norm(rect.widths) + 0.1 * gp.ilabels_fontsize[] + end + end + else + node_size = @lift $(gp.node_size) === automatic ? scatter_theme.markersize[] : gp.node_size[] + end + + node_color = @lift if $(gp.node_color) === automatic + gp.ilabels[] !== nothing ? :gray80 : scatter_theme.color[] + else + $(gp.node_color) + end + + node_marker = @lift if $(gp.node_marker) === automatic + gp.ilabels[] !== nothing ? Circle : scatter_theme.marker[] + else + $(gp.node_marker) + end + + node_strokewidth = @lift if $(gp.node_strokewidth) === automatic + gp.ilabels[] !== nothing ? 1 : scatter_theme.strokewidth[] + else + $(gp.node_strokewidth) + end + # create array of pathes triggered by node_pos changes # in case of a graph change the node_position will change anyway gp[:edge_paths] = lift(node_pos, gp.selfedge_size, @@ -226,8 +269,8 @@ function Makie.plot!(gp::GraphPlot) gp.edge_attr...) # plot arrow heads - arrow_shift = lift(edge_paths, to_px, gp.arrow_shift, gp.node_size, gp.arrow_size) do paths, tpx, shift, nsize, asize - update_arrow_shift(graph[], gp, paths, tpx) + arrow_shift = lift(edge_paths, to_px, gp.arrow_shift, node_marker, node_size, gp.arrow_size) do paths, tpx, shift, nmarker, nsize, asize + update_arrow_shift(graph[], gp, paths, tpx, node_marker, node_size) end arrow_pos = @lift if !isempty(edge_paths[]) broadcast(interpolate, edge_paths[], $arrow_shift) @@ -250,41 +293,6 @@ function Makie.plot!(gp::GraphPlot) markerspace = :pixel, visible = arrow_show, gp.arrow_attr...) - - scatter_theme = default_theme(sc, Scatter) - - if gp[:ilabels][] !== nothing - positions = node_pos - - ilabels_plot = text!(gp, positions; - text=string.(gp.ilabels[]), - align=(:center, :center), - color=gp.ilabels_color, - fontsize=gp.ilabels_fontsize, - gp.ilabels_attr...) - - translate!(ilabels_plot, 0, 0, 1) - - node_size = lift(ilabels_plot.plots[1][1]) do glyphcollections - map(glyphcollections) do gc - rect = Rect2f(boundingbox(gc, Quaternion((1,0,0,0)))) - norm(rect.widths) + 0.1 * gp.ilabels_fontsize[] - end - end - else - node_size = @lift $(gp.node_size) === automatic ? scatter_theme.markersize[] : gp.node_size[] - end - - node_color = @lift if $(gp.node_color) === automatic - gp.ilabels[] !== nothing ? :gray80 : scatter_theme.color[] - end - - node_marker = @lift if $(gp.node_marker) === automatic - gp.ilabels[] !== nothing ? Circle : scatter_theme.marker[] - end - node_strokewidth = @lift if $(gp.node_strokewidth) === automatic - gp.ilabels[] !== nothing ? 1 : scatter_theme.strokewidth[] - end # plot vertices vertex_plot = scatter!(gp, node_pos; @@ -712,7 +720,7 @@ end Checks `arrow_shift` attr so that `arrow_shift = :end` gets transformed so that the arrowhead for that edge lands on the surface of the destination node. """ -function update_arrow_shift(g, gp, edge_paths::Vector{<:AbstractPath{PT}}, to_px) where {PT} +function update_arrow_shift(g, gp, edge_paths::Vector{<:AbstractPath{PT}}, to_px, node_markers, node_sizes) where {PT} arrow_shift = Vector{Float32}(undef, ne(g)) for (i,e) in enumerate(edges(g)) @@ -720,8 +728,8 @@ function update_arrow_shift(g, gp, edge_paths::Vector{<:AbstractPath{PT}}, to_px if t === :end j = dst(e) p0 = getattr(gp.node_pos, j) - node_marker = getattr(gp.node_marker, j) - node_size = getattr(gp.node_size, j) + node_marker = getattr(node_markers, j) + node_size = getattr(node_sizes, j) arrow_marker = getattr(gp.arrow_marker, i) arrow_size = getattr(gp.arrow_size, i) d = distance_between_markers(node_marker, node_size, arrow_marker, arrow_size) From 235c5a3442c4098be2279fa000cb2c0745707e38 Mon Sep 17 00:00:00 2001 From: Fabian Greimel Date: Fri, 21 Apr 2023 15:29:50 +0200 Subject: [PATCH 3/7] lift two more things --- src/recipes.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/recipes.jl b/src/recipes.jl index 5e671711..7d071e65 100644 --- a/src/recipes.jl +++ b/src/recipes.jl @@ -218,7 +218,7 @@ function Makie.plot!(gp::GraphPlot) positions = node_pos ilabels_plot = text!(gp, positions; - text=string.(gp.ilabels[]), + text=@lift(string.($(gp.ilabels))), align=(:center, :center), color=gp.ilabels_color, fontsize=gp.ilabels_fontsize, @@ -226,10 +226,10 @@ function Makie.plot!(gp::GraphPlot) translate!(ilabels_plot, 0, 0, 1) - node_size = lift(ilabels_plot.plots[1][1]) do glyphcollections + node_size = lift(ilabels_plot.plots[1][1], gp.ilabels_fontsize) do glyphcollections, ilabels_fontsize map(glyphcollections) do gc rect = Rect2f(boundingbox(gc, Quaternion((1,0,0,0)))) - norm(rect.widths) + 0.1 * gp.ilabels_fontsize[] + norm(rect.widths) + 0.1 * ilabels_fontsize end end else From 7b7ac1054d80554aaedfb3271d66332fb5a6aab6 Mon Sep 17 00:00:00 2001 From: Fabian Greimel Date: Fri, 21 Apr 2023 15:53:23 +0200 Subject: [PATCH 4/7] docstring --- src/recipes.jl | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/recipes.jl b/src/recipes.jl index 7d071e65..7b5ea013 100644 --- a/src/recipes.jl +++ b/src/recipes.jl @@ -56,6 +56,16 @@ data space. - `nlabels_fontsize=labels_theme.fontsize` - `nlabels_attr=(;)`: List of kw arguments which gets passed to the `text` command +### Inner node labels +Put labels inside the marker. If labels are provided, change default attributes to +`node_marker=Circle`, `node_strokewidth=1` and `node_color=:gray80`. +The `node_size` will match size of the `ilabels`. + +- `ilabels=nothing`: `Vector` with label for each node +- `ilabels_color=labels_theme.color` +- `ilabels_fontsize=labels_theme.fontsize` +- `ilabels_attr=(;)`: List of kw arguments which gets passed to the `text` command + ### Edge labels The base position of each label is determined by `src + shift*(dst-src)`. The additional `distance` parameter is given in pixels and shifts the text away from @@ -249,7 +259,7 @@ function Makie.plot!(gp::GraphPlot) end node_strokewidth = @lift if $(gp.node_strokewidth) === automatic - gp.ilabels[] !== nothing ? 1 : scatter_theme.strokewidth[] + gp.ilabels[] !== nothing ? 1.0 : scatter_theme.strokewidth[] else $(gp.node_strokewidth) end From 4346fd95bf8cd8002b7bf90a2fde578c0a32a3b3 Mon Sep 17 00:00:00 2001 From: Fabian Greimel Date: Fri, 21 Apr 2023 15:53:28 +0200 Subject: [PATCH 5/7] reftests --- assets/reftests.jl-20.png | Bin 0 -> 17290 bytes assets/reftests.jl-21.png | Bin 0 -> 17201 bytes assets/reftests.jl-22.png | Bin 0 -> 17099 bytes assets/reftests.jl-23.png | Bin 0 -> 16414 bytes assets/reftests.jl-24.png | Bin 0 -> 15917 bytes docs/examples/reftests.jl | 27 ++++++++++++++++++++++++--- 6 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 assets/reftests.jl-20.png create mode 100644 assets/reftests.jl-21.png create mode 100644 assets/reftests.jl-22.png create mode 100644 assets/reftests.jl-23.png create mode 100644 assets/reftests.jl-24.png diff --git a/assets/reftests.jl-20.png b/assets/reftests.jl-20.png new file mode 100644 index 0000000000000000000000000000000000000000..db17fb8bd8c4679f7ed1fe441ab07cc297664494 GIT binary patch literal 17290 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 D@J< literal 0 HcmV?d00001 diff --git a/assets/reftests.jl-22.png b/assets/reftests.jl-22.png new file mode 100644 index 0000000000000000000000000000000000000000..8d579f190a191b4e91dd1110a604d5d7e8facabd GIT binary patch literal 17099 zcmbunc|4VG+dg_*#L6s^N*O|mkR~%J5sH+d%%MqA$UILODnlYkhG;TmNMe~Kq#}i6 z4w1-|%>0hk^S-}#@6T`V{m)*{=Xt)*x3$*2?)$pV^Ei+5IL@n3-Q(&kjGGtTlEzxiYP{m&Nb6hn92d&)5`-fQXil)PUh zhtNBGLPdqlU&SbHbNbcN$~}tW;hK5&H`RCV$5+#@M*!3-whe z5h$gal9QgUW@s2Usv7d8we@joYHD_Nx0}`J)A28B1%_UHdiPFKlV9KOqYjAM}as>+5UYdgJBpOx*uWvt;|@V+nir?%jW-^Xp~?1|l-# zWyMIT*ane1^Ia}IU9YcglaR=cdq^Tw7~Q=!pFVmt?Xx=T^Q-N}&{Y}hHWIwNlYl~>#o9M7F$664+ zJWj0QfsqjrjrDi7*JtA=n4@Wb;VC7}N`_1AW##1$?BDM_T1gO>1Y~nqd1bE7jI?ww zatBme~9WZ1;Upr z?N|)Od%5`WW05=U`*xqy)BF3oE1X?$#Mr>Vpe@^UTaE)koYtUJoyoJV|B!H?CrN5> zY|Lx=$1zg5&6O(>)x27SFDZ5YNgz1|`?zo4z9`c*gfH=jP5k=x>q<$IT#WS+bOgWT z0t0tM?MZ!oFQ3bZHQ7I_d#+r$()#)HHVP7nW|+_D?%lgh;Ts9}WFL#Wv9WS8GLipv zq0G+CP93HBf#tCe|6X3^Y=p`=p%*zSI^EyrpI6?@D|s6I_eIjE(TQS$GVnVDHq z(pgh8_`N1vTAzjBXYh&*oKLQe;LCXW^i6H8d67f<^xutp&Y8Tv>UW$;8`*GSC00s6 zKtNnPGd1<>KwZ@LTO%VQ3kwTJj~-Rn8u8{EK{Tg2S|CEx($lj{iX0|-E92wi^UpWF zEtHp)t*NbDoS%=se_z6^L}vf~SLx|Noq9Axbh4wx7J28(AMWp?r>7?iT)#f!IP`Is zc^R+3KyUBF!ptu*!)!WwdJz#3`Za45m_0n-ocliP_di3x6NDbosJSt}9W&@X4{M zw5Z4pn|OnD%Sc}Lfq=@dh4xAD@f+hBYScURPn}Zu_ga~Z@JV~}q!!6kQzI-S^z`Y| z*Tu!ST?v!dk>|98X;n@Bb@y(8*WzD{=*}lEGv8=2N>o0WaXaXJ{(VgEuD(~`}z58M1+qdWX-`=`- z@nU*f2u*pBAr<`6GAEOHdL5i`9NaL42C=;?Cr<@i14=}3MG z>RLKF<|VGXgDsJOt2nYzk zPS{?$bUaaR-`O`I=03~Us{+@$rV4N0K0Uuw_Kc1gJh8#Mk5@^FjaeqvbD zkEEr2>=;Y=;!;4*^4|{o*|84wP_6Zzq{tU9#-p~WOG`_iwX(80dv@Krb*-7F_t?CP zsi>&HrvDx9Ng9==NoJm^%}EQg&(pDWIy(mXY=O% z4)b#FW6rk-T|yW&;?G3ip**IjAXk#Ejm;od{FPnDU#x3nWF#K4za!)M^SW#fqDHN> zLi)gg1AF#({2AtG52|A-H(i;Z9-8~2=1FQoQcSE>si~>4-az)PN-?t#2$W)ebkHKS zufD~G)RbdcJuwy(6hwVDHTjaodT#D@@@ywKLbem7p7VMNGE z9le~#^m7-gfUCpZxHy-GgwXN5_XxTePGQ>cnzOrkn8R*Uv~21k1roOtSnfVN=iz|0 zDk|-|(m8)-X6)?je(t^5^5`R{FEu)yM~$doX2;Why3%RtfPD|&AbC49^jTI`sl(vA zp(G#gpUuLPj4G3plVf9J)@@`J`;@B|K&exPhIdTK7he_>OwLG84BX#s_4clq;nLC) zGYiWkwI<-RMCH>>M&jH|0%;F6oHoUpr#^c0>({Tz^}f=3_E@grSJ67fl8G-qefI32 z#dVQ~#HrJ#+ucZ!p`rB%>}}h&^^~|B!gkaJJ@-S#BbmtLOty8~+cFGa;0o1MRqq-a z4yme&@7lGzv}8eIPnLL2&%H4ITD~*t3ya8|pCcoiwr*WPTv5@ltGFN~g(is@=Tr zbo}^n@FY_MqG~$<_&aZ76J^Rz@Tv7xpeQtd`s8OR9)JBI;nZ6}vu96!7sZ8AR8&dF zpPVDgYqWFcPOG;!{VJk+5EP&<_hMpBnVR0xA>`cuJVlV5IdflERETnfU{7^Im>7v; zo4Ma>3WVk6?)IiEfx_ru&n|sIDR>H)x_9qh1+Gkfy2Xem_*zk?zdtFDDP^-KN!Qa; zA>qSHFCG8Z2zBRMDjQEI<*;{-cPG5z^ffE@?)taFM|E}CwF#2f&2N4{J}YZ$I=>c% ziGl`vhFj9?L3DJp8%g)%NzV3tq=iS$7Kkk7>fVpRWq(!}Re;)abo}P#Jyx~1TUuMA zO}8cQy2QY(8d7ss(QOKqIA~Ng=C(``9vItn=+Gf1CMLrdW_IV!1=}0`Fx!+I$IfXa zEG!HZ-fnYEk-3_VbPx;Mqr9&obUOho?h_+g+S+ae2Hs0Z=;!pc*iYgQEAeaT?pAXA zp>1s3;pnu7YxMyMMlUW?9v zA1$qhP|oen z@-RC!rFZh=orw#)tm^#iO&5#yC?z%aUA^FJzWGM=2}8s2snxW7X}<@m z3izq*B&m6*EicX{?K%JPfvh8L@ppHr2RP!~+#E>P#!Z_5L@hl%J)b|HG&L<<3?Q#& z*kAfh8|HkUJX!f!sQQAhiJy(Nb>NDJu)po)%hpmn;8=-#KYmhQ?QUAGt}?1m8>+1z zqZah`MkXcce4)9fuvG^yJY$7bba-w5+91`lKAM4`aY=}X&LYQ-Z{MQt+(F#G0B1zq z_3~PNcJj%>+}!*7`?S>6hXNL-<~;$H&61nfz8RW!Q+P;vDB?yAQUz56p}yWNTFn<{ zVrBIB@#Eogd**9k*tGP_kxT9mMKvkf0w1XG?Y%6wW5-binhO=aG*UEVep%WERN`;n zR>3mkGUFqj8s`zd3Mmgsi|pVYHH*hi9M4@doaK#P9MO*%geid zJ=pi#p=qDRu|hNn%VYLF+n&qRSB^b$YC)b}x-|0k)@H<006j}pVf7cabipm}A1Zo)TwBMjb&o4?DaJ;F*UXG{6tZnqxBzlHIK?QC zmYuDHOY^+dTZi)F1sZB1u_38A#NG$|qJ52jx9a$gO!nIt{MHmp?cK}u!jzknbNc6#q=&MO^aez#=mOn8SQ{J| zcv)D8f~R{J(FYdv>C-0!zhSmXJZRBiLtIV$`puh}ZoOL1mqlW#mf9K-7Z<1QETEEt z+kScBQ|g;HZ<3SwQAiV?)RKZ!3oBG}v;`vXp}|w4dHVeM&VBo?55Bv5`t<3~!3bvHvKDuoBI1d;WQ?SaD?X+d`LzeQX+sGb&WcMW``}EGp;b z=#oQ1LcV`L>$xVmxL6LqHfMb~&-TUQ~ih=`*P}o)YTvct(or{f$DN+9SQ`Q@v9v(;p8j{@uZrx(R*Dqdt=K2r8 zEJ?aaDaIB^;%{HSR=k!U)(6XTRqZSM6uzAZIy9M}P0{Zv=RZ ze%-xo+oPYKpD@tVA5YkyRlDBzX?j-HE-(cY+Z^g^0uh;&l?DC*q6^rkWngu3a^h9; zoCC{Kzs-B}%bn&uV60eaB_$>30WqvfG@?>cx+SD0Y@<$+lAVP`FZlbfU-DiHeL<3+3_C9j^V8=AjN@}U#oAh_1)Q& ztXr&2FtW0u3z>`-*1CD~=ET?w^Kuc&TQ(W|8R{F_(wguMDEzw`8DHQ|aOZLWlOU!I z4-ykWp3@XbcC_Ii&c(&XMnhfU^VK1$?l6_#T0!fAojd zk00FVJx`rFY+#8tea@o->xL4r&fC-8ejI&*CS`*ntu5pQIXStj2e^~j6^a-c8O=&u zbFFGw|97VvB~9}*Il1?aj?(1p?COsMd-w4x%o~Hde{Q5wyN@3~VpGGgT0jM`*rse# z3Yy;E=%2Z{kru5TYp~DSiE=acK8wcagYA{$UJh?GA`38ALrv&avQjbqzEs!H#^Fa3YI%^EQR#OLL;{S)%gcU1Uab5T)7yj^p+wfVqrq{7K3$F~4m%1R$SI`pvL z2NDLVU4}uH;B$*AC>+78TP}eTRvY=oq7efj8QSZk@`FQP`TWe~vw2w2>)5h+gd-)_Q>sF6M#P&FJjGmq)Nl8gy&Zoo(v@w$9 zOVTnjU%!5RU1%H2V27}Jb2fKsdK!CDCqd_Hc0-2 zhS+zPtVL&-?{9NxsG>^hX5)~u_tL#lRbp5k%Lj}%L^Xtxhpr3y4W4uPD_ydp$6s;d zSK3iM%-^|6mE3y!e@|qyi$0Oy^hHTV|1bQI2z>E2L|J;@zJl!RE6r&~2e`%8$}z+u zy^D%uq0yR(5V`H6X#E5Z1-rVsj&@NFNJ}?2HtI}DzF^If-gC-^>=H@!k7)7}!-8Z6?{Qdj)$dMz~hC&?o z8Mwo1)`cEMbs+c<^1Z)*A9r3Ko$6*$R9p-_2Pj-oo0gV#bK{;P&rLyRyZU>$K=#oU zXJljyijL7<*lGm$Da_9gxaLAAJ? z9UdFA1DEYTSlk0HFDxdO;j_9z?UHkID-V>pP5(fv3?%@?Qg6NXs+hQEyejqX7iD;l z57pRz|NcEz(%c(?8XO!9_$hK6Ds!DoUEJnW-hh_gdug&3x&ht*Ts%%o;|~OL#RWHT za#jyIr0=@7VrYbn!<|HIRn%K@(R3(ZJ3M$(VU!`3JVEQAtO;xue*yJYd?O> zPQbOb0Os1-H($MS_V8FlYWXbue1atZjk@}0_>=O=Tt9G+dU?O}l$6~L0~$PUNxfbm zXo(4{kPNj;_TEy&j~_a;O-9BQYzpy$USHmMG}3PE1*og4 zsBK`rV2+yFN-em-a{3VXDPF<8}O^(l{Z%9w`~ikxBkxOKRLhDSAC-)hZLz-qUPY_^yTyC z05(RNVO2G?ns@I;Acd0!&^81%;fi!5nj6*g;8N&0O^uDkxEPgRc|=g4?e^iKcsQ)p z4K}`qyRCxJN<4Wo1at=m*cizl+Cd7hw=RDD8aBv;lA&Q68gl+X(BN|)?gzaP+JAlI zl)iooG*>8Ud@@&itrq{jZn(Wgo+>0>Y)*Sow(zc|#s)ekImNEyRr}Yk$o)}taLon{ z!?)5uxI@sCSh4S!1BA0~RR9c$&P%@nodaKhHdcDZ$o%`H>*f6&U%te^=z!7zDC?R( zC-}Vozx@fXX{YVSAB2R5cN95pU$H?nczKl;6zp3`i0GMZT7IJ6H7>}-2w~wS7!xzI z+<42^udc|$6OWD@y-TZkEhvZ`(A6;bV`vDZk_dxhwFAYBolG|u_aDl_wd!+5UHwUI zV=JX6sNR}&^Zrb&GXjANv*XGZ6~x61{n!eB8%CNren^;`HzzQ#ZH+VyIUFOLgR+PS zx8Py&o!y1UZd6_sqA-SvYC%zefC;0?wP$I5norSP$n1`4)Q%GtmOOv|{5)B;`46FT z9V-A1aqISN5lZAkyq9Yvo}x=0i>7fk*U+d-ly@;J^E~P-ps1T&aaM{480tH_apT4@ zbX4QrrD>f*LbAe);-C#;Vq);IlrA76v_)HU`1eQw zh{!B_N+t>ibU%rHTK_LwPz%3(JCnymqr!npL(KP@X)*jqEMnPCW>-|%^L=>#UWmd@ zaA{!Kfv~A+;n18M9UYbD2kxM}?WdBPHU?2cDr7!?{=91WH*vM7QyEqi@@kW;Lt1Dk z)Q=|R)p?z*5rv>vfq{X^$;ta{TSa?4I0hNTab0zFbsiT66;o5wLx&!Lb)}^pF3E*D zxHvnmP9Eznl}Ea_Jl9v0Q2kUJBleHt5~^eYv{8eD>$hwvwd>eVAK+(iQts^q<#^Hu zRm%Bc2%2BFNUu#`in*kBY5hdIkOQ*5c2S>J#Y$nTJ!l|^OOle8oT|p5LsrWR zGl_icTwE~hRv^b+>3q#$KcyanCJ-!1C%F6AJ02r4%B|*$va;@u4tY5__uAWAP$v;a zCdEz{HfPM^s1=9^`67JU8%IXn?LJ1FVczWUy966=eOi7JCu-3rh z^7He@d&d9@2RhE<2kPqPc?kHim%_keH;8N_vK42 zdzWk1qO4u4too5Bm)r9O(OAG%!Ye8&ikGz(QK+MX!1E>x_^C9twig(?V*@5q6 zUFp9DAH(Xs<>P0wSqiU_8imBNLtLD9_gT930-{Nsj#LRS_MRV%Lk=z>MUY%mymnM( ze1okAKBX#j&u34c4x?oOW(r1WK>xtc;hHF+9Fi#&=knLOvb@`9^xe6h-ALu=Rhb8n zmA4BCUH+QW$G1AikgJu9J{M8G&b8u-XjihlD%n1it^c>m(Gt&jhtAj6p#CVMhFMz+ zHc?zA|`I}uPE*B?uvofF02SX{*r#v%7~nTJ!aXez!RKHECb6wJdmA6-G%r7ifA2o zNJRf7P4F%oCr)YRPKQ#KRj z0#|5~&We=&FCNt-v9ak8LI@2Ff(L43?ahscoMlVZ+-T9Ji`-c|&Pem~=yLFX&jPgc z*=4D!s-A0n=mo+QaZK$o!yrrM%JL$psj3ByCTC#*BMXb7%kKwZ8|~|7BnG!QsgrY! zGLf@)V2w&sTfNCiH$*4GX@j_tinFZOLAMuZIeCJiKbV6@S#KcuenD3YEWA-&s} zd;wejiXH8~gy+QQ>8zjpSC+MRNeiZRMmG;FiXoaGk@^Z@z z&9H~lC0pS=Hl806EqPkMelCtE&`OLVfmG?C7bJxUrYr2vk(p>H8}K z*lCZ{jm6@3cv!$$fVPhHs0l1AxUcN9vOURj3T_Dl14EveV7y+BOc*-|3{~yE=926S zu$vlefF(qMr?5@^c3u7hK0DFH|KL5`Ul%7QstdnLO|NU;-$2+#Guq?5$kNQn;1>i1 z$e~E*p@IM~f2AL*`uq29Tq`_0{E<1QlADUfvVFWNB9agYq}seth)c5WCMEH;4~lY= z#jWk^6tDKG0L;VqrKKGp{;{&M{<(tZCnLnDCG;m8w>+B$>aKsd4;4pi{FQ-p0Av+3 zX6ORpQz61cpMggLE)(Uh@7%lhkNN6C9JHJE^*cnVm#LD{=4ZD)f1WB3!TwbP@HE!d zK{0STe3&kvlAj`2v&Juo{U(KWDx~8~dRm&O4i@qtN-|XzfryN9{bzScRtvg|n5?Y3 z@A-39s6CX|QGWKopdiE~Soi;aqdEs}90)dwDzS|BFdLBZ(k{!I-fxC)ZjCI|7I))| z7k6~GjsR*jJ6bi*O;j(iL7afHPE~RAj~sdX`da_QD+APeVG8evU&TTM;8RvcM#aLf z+wpg&EX30bw!&=W%vFdEASV12MwLT|0iIw;u`2)WeVHxT5>;)7q~vxeM`9)tE`UTp zxJmBW8kDA6w{F#Ehg9J~81Nv00j~_+_*X0>fdHW=IA}qW3ihjNEOz#w#d5^```?h9 zh+Y1}CMKPTC6ZlM$Qr*HR_^e-@$oy@$=Cp0tpsejahq!ixyDgcqQ!oHVNHd$zLU3>LnzrDgrMGg1CI74DPY z)s7!$J)ypB1H3^go}BER!{D44AYiw*z5c6p*9BWO#;UhDD1OrDJkFm#pUSEs2#hs0 zHvTps8EFo&`+fW#lvr5#$tRdY2TH3h+1VX~iH`CPw~xF-SvybOX-KvL2k zHK(anlcR345sK{O^t3$s?hgiHRZ^KCVviqFBep)+OJlqJyZ4Fm zh1h}Y?2q5R-H-I=qC*U`tD?SwdBN@g36zkKu#Tf$7*L|lok;94MNeUO;lfv>1w*66 zW_fveGz8#gJ}dJ>)@`ahTO-=OeS2P~?7Z>it5;!%QCkm>TDmE82eWKmnQ!!gw#JKQ z4udI;-d8-8l475PHV(P`v_LB^V0UM+jGT!K6WPAqrMs$s68rJmEZA(el&CJbF})v!=O#d-ra zDQ1tUfwdn*oOfiQIfh~QP}xUGQ1Cm(Yi_(ui=I7kgHNUm0+% z@oNdd@(LO~j$A-=%UM>@0n3p(^%4wqWKsqLxcJMQ9N%j$n$;a=WaZ=le9r?aMmC1m z_*bNgq6q>0gtT-z{~Uzee{E-&uL*ySd$6Su=%|;MBJ%%dPW$Np6d+JD>Aibs!stmE z=jWt@nk3@SK;3y8!Iu;j#ewM#4vvHQ`xs)lAJjaAJFq)mo5$rzB;-NvaD8+0q?nk) znw&~aTKI{_85zHNdx>hJQy zbAXWb`y{Sp$4-Q3*Hp8XCYebiYtdBZ`AqlZmR zy&%lMaUE_>*V=RLeN#&d0O-amgO?0`!aF=WO+~pN9?!9rWa(eMI&p8eRdUwdXy1xx zu3$@E)*8J;P-D6K%+4{xdO8`h_|ZP95~$13YnSyA^aOr3whHxa zkOmj`@bFMnR3wWxhjyGX#o&#C!h=x(_(iH`lGP%ZlNpi{*k@51{&2 zBt&;yuwBESlji$x-lU;n8-+cc)-H=+C22A81Pk!Ej5{{9GKN%2o9n@__~-B#m{V!v z%*-w^G01MgM|Kk=Ejdi$N&W6V51*2jmKL<}PINRtSY;ws_Y6-k=0x^Wr~1gtxH(0n zW;0_ielx)G-hZ1pa=$uTVJo$~dlxnu=9`KoVf|MHCbDy8oi5t8l>7MPiIEuT-sYrP zUAS<;%8IuCcWGK)9yCo!W#!eTltWFT^d;EDOXA#Oii(M&J1-1_2d}KGC~TF4Pra$e zm(9O0P_J4FLwzOxu>Haylm$$Rp=U+CPu|RKq*rav7i7a23Us-D!2V%IhV79f^e+oY zUAUe5U~q80n5{TeJ6kW!PYt4v48+$w@U_pat=`R{8B18NnQ>K70|}jS4-x zQ66}~AXJ5){r%VwUuOOs>)n_sLAvm`#BnDznp2#2fi?Z(5sVs4BrR@Kt$(_{o@IV} zcXu~N=ES;NHI0oEM#G316^nYPdzqQyN=XoNzv!BnD8TqY^aGAVLdYVV-jlxKy|YJ- z@B~ALgii=HNt9n!c4Ku8P%bS^=t33400M2B(PLdzgakYA^#~GVpR_c{1$CJM12(JM z0Lm@mtFAzaZA?;DhHE7wL+v4-Kc7gTCliK7c~-eb^Yimm$lH*5m6~eDAGrQks;Q|R zJVTR;8)dDQQc7B-R%)gb;;?gE937$2U_>iW#M2j)DKFsK?Ce2fv8D_x%6W9@$Z5YI z>MpWX^!l5iRk=yo7WhA~3DpF!srrbgNvoGpO9BD8VMAM68whYbm3MhB$)v3xR%ADF zsFczcTDN0bItZza**y&8wWE=%uC4|)HX(CNQ0DGwKW;7);{vsE9Ad>|dm;QK{v%?a z{CI8lqg@v89iJCnLl$@2(f6A2I;&-axhIWXmWnyDaYL|WOG^us{|)Uyf1>c|k4egG z|NUN>c1pB~HIf9(o$=clzcPmMt5ayFTAP}5gDo@vL1Iv0!I_sAINApZ8#+H>Nm%2M zL7P_?e*yLZhzq@y0pOhc9CX|?Qp^xixEL|7)hq@?gkv)G=MRVkR?7D9onBB@Kx``}Kl97`e`T6tHT#z0$}8BvL;2{hvZ6kcM5mK4r|PJLit!c_qSYH=Du-vGWS z38p3{n1$orvZX$o?7Qk$AxIx=iSfFB{BWRZ&;e71Fr%nqhjHN*79J^Igt03F9rx}F zO%jk1+~IpbJoiJkSRS~734GVhaiPZ ziE~4i(6!-V`gVq9r++V*jpQ-Hv>pPfX&oJR6bx{T zN5*SEhSCrIs_`rZTaDq9fA2FFbH2xjCzL~3*&?Vf@Rk7QfLly))%ITmLmeK*Xe3&K zj`sGMw|`2PmOMc^;jX`aE#u?kQx(BR6yb+YnVCI&@Bnd<`S>vg_|E~3&YgqfOf|?; zQ>%uii%hOy5)5?=(*qdr3tY?j_;}*T;GkOFP$(ceLEZ&FN)<&@PB146BmVd9+gJ1E z%>xCuDO7Rv{3tBY={7=-JV3!=hIjAYVbln70~kk^k(ZY=Ep`I7NSix@UtIb2^5U1L zC;l;1`lj_j8L&C(JpP|yj5oDGCyantRMi1P?J84NO6sMn{inS(J1x&IL2H9Sv9 zu5Fv|*u#US-mh&d^~A&$1=k5HHuzrGU0hydWZ)zQecF26bytIggW!u}P8MYsW*Z-f z&uGigeZU=haZI}6N4U3a$x2E2G*2mCU0M8AV2hZ-WCZp{cPqaB3^9O7uT#dxi)hMA z6Afe>9jBq%;479`fAGV(BYrCEh}%moI{_Rq>~yh*u@5*RQ!9?bvz|z zJxFX!M1hLM^&#LgCi$^Cae)V{5o0;-PZbp^qFjhwwCYtEn7j=R3)2Kb^r_RUOjbS#!zcz&4QD|-`gahzMpuJoEP>UtfB$a9P(XW-r!Q=)@EXjeilXyq zYU9sQg5TKpHP7Y79gMua2yhjT+iLzsh{L6~C%9`;d8iLE}|+{DDh{QT*~o`uo;Mobe@-3!JN z;nC-Ck4s8Cp-FTpoWo6nP^+d~UHm%+wY`fElXh28?_i|d3J>2bWl;flOGr{gRCGAt zVi5a%zz!G)29USSe3=I5U^!!fG%)`EQ>uq+VH{_AbK!&!~)`#*g z5^)VQ&dp+(U=s$E(aF^Yc8ZvhGz%h zMzHPKzd!rwQyyh+&jS(H933f;l>-}@2o@EK(tr==9E(iq7pJq#%eyNpQ!u2DRu4NO z{OTUuAIPn679tcYnw#@dQ~hiEITlL@QE_sni-ONeCtQ%JTDU4>?fL4)#+205?-)kn ze{~Oe)z;E--BF(M{P{@o!2qf;I66&A&Ve#FIW?$t(NLfuCx^_!qDIC!k6nj`8N z^kyIvsyhTkMWr$bFA%$MROS0F%xysMge)4 zFZb@*6CM&0nO1uU4}mHRj_4W=*%O28OUujY?s^h&VjaQ)#3?#FJf6JXxf1?y;gv2q z@Uh?H57t41<0R94KM;Yi0-og+6zHEg5jC>Q%+@vog^_s;t%@3iPfWOu|0sKMg?b_d z0Dkb`!F5XBIHUrqBM-iT-WrAv1_4otQmP%aLCZUt612r z`1&{|>VO*}1GAt?Btf@df-NYQ z)U#N*73&y-0Ktox7_yOZn9cg09)0iL++dvfy6bxh(Sz9)7($a8xjy0)qJTF~6u5K?w?G%bl}^kPnCUF zLl$o89lR>Ti;jFIeBmRM*BjMTQJ2Clcuj^E!(9?C92n&NKQ&kmRq649_5y31-P4M7>h_oH;dk5qy{r%due>}(Eu7nHLQpF+;W{nl>5CVzdL||(qsm_) z0nmG(E@^ZWW9l5k2F9R#KM4=lieP$OhM>f;ocg8|-6-e|n18Ns<H|qYD#J8GRPeGn9m*_=6V+eSZBwN-v;o#*Xd$_6^pSQKwv%2 z0`syydHPf%TJ61PT5@s)`o!Z&u?|IO06HOsLXwNZL{UmcMo0Rz9*zg+=R0a>gbdV1 ziRHle7ddwS<;Bk;>gu&0JE$IMfL}Bs`p@dh`0775nn~b2Jo2_IsRBN0+`*3Ckej_-=8U}_2H{K%pE*vxAPz5y^&+DqKy+QA{hS1&X;KhT% zA@K!vxc8|ev;?txp|g}kBtzH3IqRprg@^rSA+5vwkn_?EVTUn(r_YZWdXMv zd^NQeQsCzo{_YS^t?TYCTcm6f7HE4CNDxhNy}Jbd9}aI>rYwlF1$0`+xe+zW|YIMj~oZs=OwQtx=5 zKL>`#)AaN~P*a%Lhsf9Yj8OQXkw7`!K&FE}1jj2*!gM5GE?v;_8S-qaw6%ukb|}SO z=616}p1c0Y%L|4*;C~S4qdxUOge)GVAtVQ`g8miqGSc`5!-t`1oIHGq>N^>WxnbP! z%+XuTQ6*n6cQrpZ_s8<0-kphprm4}8r&s;o2+hk!Pw%ayPAGi%Z?7kNacdv~8n>0W zq3fQsjV9(J#y5!WtJm7Kb7x+DKEx@sF1?8GqhFqXp^N@^HU6Cs{w>si!ZE2~iJ<%U zHwEer?N-HUpoInZjqX2Z_v7ml5)kchJo0sX{ON1ga^a+77Bi0i{J{TQ<5`{CeF#_Z z@>$3!A4_e)yVL|fbrkZq8f+v8(go_@3t(R_Hc~Alez#$8$IINZP( z1gseTFRa%Hv(fyQ= z)U472xl2;?;NG|qeX&1#-m6!vEG!@D>U5tfJFGPi7fec&5R$yRZo9@#hle6H#ixF6 zhARD`zP@sGSBtn$$!-DfW8uK~jWBWqGku!|)%r5N)$8t5TF^B#Ja1vqWLu-DUd2bD zUT0v3K8;S~DXi5y*C48!^SwN+_~M8E;}lA%?xQcoC8BG!VE>>2&_(0!s)c?YJ=v{W z$M{-y(fr?UZ0ey%k<#0=M4Wqao|oCbbLS;EDLCq}N*z>h`t<4Ov14Py!!pjJJOP!j z-KIr0-u;`IpjRUq)-VV{Mky{vU=}`m_7nOA=G@_M4j8N`9W~RMWjncdU76tX2gwq} ztMbu9dk%;F1H}3wLYVJ<>f=< zu=sh22zwxeXn(Ri;hXyZ<1c9V|M(n%7kUy79sN>limM5(KeMPgmQN zAgCfKf5;^KgthXert!W(s<2f`W-uV zWM^mVDJkP>oIE_`FJ92l(;KXEc;@8E@7Qtk=1o1NqOUeKHVgi0Jr-;kg@uKsrSX%J zF`fPk%k$Zlm6frvu^|zCeiu{@+uJ{kkLT+NW6OB*WZ!*}N?xo&iJ zpz=~*RbXHNlZYwabLGmuB(+PgcIhV)qF-sc_U}|s`1IoJ@XSc_p+kqbxVWaKrkLsK z-oAbN{{88$tV3#QYL=Fk&fR3fSRsum%jf6ku&^+lef!GF$}V2KxU{_dXQJE4$||m5 zxU-{!laupP>AB;7e)JDFM6AvCd0b`Y)AX(&hN4-C-U65AmoHz+*u8K(azu1B z68EyU`gi%y&z~bB#V6XIjE#-uA8p97EjittW6w-?IV*&Uxbav!m`hMF;MbQLymODT z^8AY7fdlV08^pf7w|$eCnAn~@%Wva%;C^mwkQuszC z({HMCQ++=5H@HmuWtoU%(J1PhEu%jNssewHcY6Lfj`ggsuRn3(M5s9}VSG@G-qO>v z0PC5Sws|#GL)g{BgGaS@q(LyT`bhp0!*~vU{%4VyRK!*S9o3fBWjFP{4wSxcI)g>$%MlLYGK4>)X1!b8~VOckZ75?s6cUKoj@h&2$Ktw6;)~#C`Hf*@oYkTR^r8vH81fh%{zJ2!&u}SXX zN^0>qc@hgG>g+)fo3&?nW22+Z4j=w}Z~M`&1D!W{WV5ofu@* z{Lsg$Zc@tY=;%;%@AX<)IIHw$JwLyjhezPo#ybTC1qj0%&yOEJj$F=is8ZX!Sx18N zjV~ublr|=9-{0TD!otw-Z79R~_ettMhlh_IJNDeUDQaP1;ZL^!iICVa zL(L?j;PNI07jggeVtT5t#Iz!^VR$gSXnwM1Q{}_@BYzRo6WzHjO-*~r`8}u9)vMam zjjAp!E6T{6?kzfDm3x?Lb9b6S9AN62zd8~0`4MMu7@JL1z~47_x5ddi+}?jn?4+C9 z+V9*z#IOC!3npH>E|V|UEDT;1LQ22dgRFbvo~$p)ZE-09UX0zV;7&8D9FYptS>|QSw&B<>0Gybx0ih2zM{0cy1I&re@zIj zjEqcTVq)D@)}P(E4gk7ew$B(D8KV$@rl#TtA1wSD)Y`LWk5WYAk$jbZUIBOlgn>bv zjD4m5VsEjV6nFExckfzSJU*o8DA-E!5#vW9XI#`Pwa>FMS?p3&{QTnVCPhWX9XkpU zC)wHIP0sUJ@3b@*zzeRz^?PMvT}z^Bx!3o$p2FjRi$hXfV;@rguB@o7t;|wU)6IR} z%SFUyrqfv1W**L@owz%;>Cx^>m;RQX8$JB;!gg8NpZ(=N;o;%#?(S=gErAL5?+a|) zcyVVoo96A?w;w%vl#!9~{rmU65|7;6TvisA=S4+cK0d7L*5RIicBWDjYTA0#&zMk8 zLL*UXo-@|NaKE6uYgh?TYteN=gb4ZUZl`|L;z#x-09>d3iB2FzD&&nfU7wPlY9ExizoV z4L(jwJMZlsWf64uE?1&mu0z%BTepgei~FkrtJ2fc!^77Z5~So36RA8oX1CL)-#0gJ zDra+ca$@J@>FDSdXp->^FJ8Pr0T@~zgmN+c zb-duUD4}7)$s|R0dGOn}`Gx7D1x(+Yme&WJ{`~SgQp(kpygrDCq_0Pmz8XAJP*}M2 zY_VtpVQyj)Y((fA7%-8^ayxg1F=!BtK^KF=oOmM|n%}$;Eoa;MWqpvSs3?#*`oV*j zCp$BNj>z4kN00jZSy*uO>?CPW#V|{SMn(nVS;V8SZ!te~sE3k%D>Kcw(Jx=VAS%A} zAH2DDZ7tMxZ|0Pb7|hz+~X2&+*&O->G)BvBbFcQ8qX zvR!dfAWN~Ul$IG18&odHRoe5NR;Jd_Gv1l^OYeg-kEYxQnq;K+b#X#z_wH&MVd9MW zI;ls-3tyYoV+EwUy1FiS-i?X5W<+po-hfTYydD)?KX`_hnNFvnKTZD37maBK4Mg4o zjj+lGM-rRyPCSg_efQ(X_oq8$MQ|h$oLpQxPj*P$BWTRoHd8ZwIQ_}q6Wd@AD}}AB zu_6+b&yU~TX7#FDCiRtcG0}LXHrT?(MzYWJ%3N}4>g55Mh%Mc~jp3o8S6hgkyLLrm zQ)yC9I-cFV@v*Zze`AOdp?qn{%iTR2_h3y$Ze_KgZtm=~u(uZ=89Z<$86P?nkKdS? zwQn_hqOGlMZe>Negy*A^jwjsQ_9!Xsbv$nnLy5_Q*hU71ty{M;Aa4o^W~Qfu88m{* zo^G%ns~Y}sX1^)xJ;NvW@7ub%jy1>00zS%ssNg(<>w^FmwRLq)B(`Mklk}GM_V!Lr zB0XWoms3-RZwu`C(O>=tkKj?cNGHO{!9hYO6&vr)`*qgG;>D#HYb+l~%~S!2O^r%I zK|w)P^&vKJL70&~HZ?UhCr5_)Xp^BosTE`rY^ciT=V2coAFO8#cNq1}`Xi-fWtxsn z9$%`10pUivx=)`zt=>Wi?C~~Kpprms5@w_10ogj)?u{5^&j~{uf>?<=f zB_$=_^zqYWxOk_$d`Pt^@uAlR2?sv*soclN zpJaUW=q7~xQmVJ(c3x)Yx-akPbS?(cCT}rHyw)YN=j_lcAQ$4imAe>43z?RvcB!|m zP19RMa(|3nT3Q;)3)bpgbF*#5#q*$t(^HwB45;Tgj*y<^<^B5h?*3z`oU2aOD9#|r zL#*r0q%deKE-o%GY7`e2*VNQ-b8{mY?u8TAL_Hi)URn}%HUrPPySv}MJ=JhqAT(yP z(u)E6j4vh4>Vd0v{-nr<4GXpSd&_-(fUI^1CCi zrM0!St?jcf!=wyr8=D(O#0JGvylPasF|PQWe@udkY))2|HaR{a;l}fO@$sEqT{DaR zJB!z*l$4Yf!Agc?{r@f%XJl+O@%gb^S(!1c*6+`c>-*DJ5)u;FG`-5w?l%nY+`04n z*jS`381m~$6o!^Wdk2R=)G^RX?S1`*^&yz$A&$L*fS z{ne^6GOi!{Q;h4JaCP-sRL`iWus1U^%lzBOWxdeb45F4IjlVP>!DP<5MXrA(F7d zb41_Ye+6K;Zr!?c!+3eW`ANNKaeVXK%k?#ZTb~@GHGbZ%eeJYSG;=DICvEJVJM2q8 z?~-#KJqoUI1i_q6KaiksqV2KXkgcYc7Q3c>qWBKQ`>I}Jtq&e-O!2-pJbeLV7YvBz zN3@-apph^e+p?`F&HZ-NZ|y+`N$CphD7bilaiKpKXnSe%-BV3xgT3VD#%iT&71@wcu-f12gGUJ(^l69yQ zE7xeXy%xWcm7Du>d|Yx$n(I|Ke(&(J1pHQBPVQsj@rcyaO@>4Y-x3Y?t#azQ0R{~efCc3ZKaGfxuPF*kG_e&G z6_u50%txsnxY8!SdGiMNI#_pANIl?Fdpjc26W!bN^t4yPyHw?|_0|{omB>=9VPIme zQw8_#-MhYiOQL$9pe2zafv=!&A!qROl9Fh9vhluCihZDEl+rLz8GiHTeY6`u6P>2> z-`h637GkpPBtIowkF4JrQyK6 z)NUc}#>H*fvL)B9R9;op-hWE|r4WO$U=gE~fq}ufbLYrX!qTYtXn0UhK(-69#3B2aw=B`wy8e5zlb>?}hiCg8p z0^naTCttjroh=8uaZ zzE0QFY4D#XWkmdkfEVQ2fBX71)QAAn4q?!!2);t$U6qcaJz)gb5oc#H0BLO~gB;b< zU9CG%`|@~|g=r0maSH|JtUH_bXJ%y7q-$!(fWQ3PkjPQ#1}HE~2?z*49a%_WlVFgR z&W_)4eBZu(0iY3DTGTx|P3hL5E`>UML=Ftz-;ivMIAUaGe%shc1_6|puPw2%u()HN zT9E4Qh!zxz2?{9Dk9s`V6gIHW0iZ9EL{SA?kk?5)mn8eoOi}57Z7cVM*I?nvm zK!IxP_eA%dJ9nNxe-4^q)yoy6tgJjfF@eZIUi#(ADbriJxowk5V{ommtreA%Gp0l! zO)@^UMO-}Ux6nECtw!p9zyAE`;pX-%H`n9n(H&rZ{QUeNM8}VhqHljyU(fD$vuZ=| zvZ-XsSs#??0ynB4-hU}VM|XEaLxV%P_Y`RSRTcqxMa4wr^O;FW1L~{Otmn_4r!@yK z6$0$}cb&e4KXYRr5W_-pj>OISS|NAb9LUVux1bt7p;%GcBN_X$j<;_OSBKl?8QoA- zv6phUXkDACs~wx7HgDg)9p8*T;BcvDJ-!+mRZ`hUKezom6%}(16~6B4>wEiFN=+>Q z9UB;VNl_7J8eqxR*6(AU6BD=8!gPa>(L?3m__7bF`;%0BO;;ms6sTUn< zp~fSwA=>TrEj}Ow#4?o9itSVqJ9e~pb{3bFDT|9An;xo1;S{>m6huY+{B-}t$&dNy z{og%MGJAhs)s-I^$#NC#ZF^VOK5r3XP8pl|y*(Xe_7{T&$Pg73)srVrv=0zv=SJVh zY&EmYwkdY+Q&d$|%{c7l=H@r_iUI#-Wo7kM&S+Iado?_}$j8U$%tHzqx+YFk_|A$e zDfxD0TKqRfZd9Qf1HP@Ut`7LmzQZM*x1mRJZ+~(Clm*>+PHt|T`xY-2DgRFbYFwnw z4i}QKu5Kf^C-U@HC-3G@7CJg%fMt~D{kJ!6J#MkhGV9Fw^AFVnD>Z~82S@NxXrgF+ zA)q3CGM_zTVqp>7eJ1(p)%_PPT-dvJZ;Px$nb&s|4iGW}-R<}ZatQ$uHCT)fhq7I* z3+4+Wu6=2`3pQ?Tec?+rRcPyT_dYsSK`EQ|$-i+c(6=^k-i&g!DU*)-X7Q!v`P{12 zveME+z1?jpScPp85>K^iUo9stf0Vxrd?cH zy>!AsceZ-y%x=v`Y(U#DT9B!xzk;5zClR4rdcn=n$v-toC9D6a4P$ay(7g36c;wr+ z*Us{TW+H^p&j0R|8X|FOHGg3s$@sj}2blsB3eEPJt zwe_ByQ|;BnLsnK+Ha1JE^D{FuD6@hr!Bwqq-st!Cx(Zs8U-wf*c7ikaobrYmqc#_c z_7a)#vg$8%2i3LIItSO&r)Avr=2)ee>nL3R&6`FU8sbJ%b8}&FasAq-PoEw{MMWXU zru?h_2yronMWC|Hjj;z*S)4mJTjBSIk%_6^AuTso)?H7M-I{z_h*sm`$jAupocsvP zN9s_)V=(W9>0urjyRn&~(?a1lZs1$WF8&_JEeurnm7wXJoSeLN?b`Y+2d^D&bd-B6 zeSI}}WM~Ld7DF&?P!U87uyb}zsD=ZV{@8111R;Eu*J8>pb=23pAUHuz4;UF$of)is zb$vbbrb=J{TCnDJy^!aB^RyLq?!3w>#8PKX=o)Bgr4|;h7r`#F2&uhwmIoUgSkwJD zmAY_TkM8nzP;1;Ydcffw!TTZvrHvdvtTFzBgElq^r_RL@#)r_HLSG?2`uNcr8Y(qC zi`R0vQ%S_oE_Kh+Paz>BdU|?4zh!JsWF#A~jqgg1_E=z87+b9za`z~jjrsX`=WY_= z^0B99&_^2E@uU1_B~TOv`b|qq%lr4-9$%MNQ^_JSar~T|V0FJ+0$0yLXG5Sv+GJ-8 zgFKeP^QKkx&}NcBhYTMk5lxUMM@L6zFT6x`TBx(Vy{?_{xU+L;`rT{HyZAG-9k<87MeWpdq!P|XO&@saTexdp zij9oUX7kiDb5WF8-YYK0j&YO^u@OZj*f4C}?|oI#p`kR?)YK;&(lmqXM?BAYdQzfL z5&(Rtz_|$se68Od#i=QJ3(`Y&ipgSgp7!t$pcGL**;_mTD0!8m=MTB^k=9j~4GOxw zJem5A7)hYPsg>g<+T;}!R4&eq0Rx;}*?O}PZV=l9)C26UbmNU8p`ZHuMe>NquKT+@ z0zgxtt0X52FYXU^s0t9^;NXBnf&AnQ)C`3d=a&mIeI6|?c zh!x-}A(t=P+SoXMovt2HzsD_%jg7s$=7a)QwjY1L z(f5tnqiSgE1<#*fsU{^K$IW9-gH%BKLKZiUNeHS(u+s4YT zIEjWA&|_}4Y->C>(ft#Tj(A(aI0VlQE{7C7?c`K*tniSOrJtW4Sl-#Q)6n|?L9tSY zmMrZwpG-hlt8D}04U z2r(WKi?_L@<&*Suq)2y1hnJTZ?}iPxH!8J#{w!E02llbjWG53B$!M`H?^oY`G%R!$dbk`afr^z_lT);yV9*5FL&bL4)o1icstSat^_Xg>OdRoZd< zJ!c@$LB%7OSqufW{Y8aNb zFH_jPdttUk-AG@bqiS0JM8*+E5$h*xPhX(&^l%=5O?n!5J({g@|Q$q#y?udDm(&mW9%D*gV*1f;Tt zJ^jSRjp<A+6B#bc)|)T z1%WrmkCzk|Q;2rO*iik=&!0b|QNJK$QqU|CG)`v;Hg9Rkji#V=Td1ZJ#JiQnSydGk zLG^%B9v(*CIu-o+UWtgZJ$d{5n^Bm5?1&x&OolG;MjH< zhe{RiN$X&ZUjeq;dX4-44}Sy8J=cH*7K+Rn^)qL0)#iDB7BmUK)CpiD|eS?bnPGkNq8_`VV2 z3d;8>=b?ju5{V`vtTpxDpA;1pJ$UfIF@zT^fT$QD&>hg zshdB1FflS>B{4~Cd70fALd*0zoc|9{*90NdK=A?q`=jjHo6MJ9n}o7OH+h{u zA9mI!IrN3y4-jx!yBB$Y1puH4=Gc=r8q>$EK%SZF0E5U$l$)Tnt+KLzW@c_&zs`U$ zErbu@>@#fEfVW7{Dn2wgI4Ifo z&*cJZWE-90HCy{`+_-^X0ER7kC|7gnasYx`OL3!QRZt8Ms1L9EY_jdkV<$bI(vv1+ zQCIjddZytXQ{|C8{6OIZ2jYjGrfcoY?gzNc9edhj5fj^O%yoh)7l?oFLme6xd;>8t zcnYeN=2_#akb^g$wfk4dJ#LGn)@gPFLK{l3N8+InrMBsym4?!bQ=S`ppBxiHw z3+Juw2g>#I@QIHRns$}`zA!VicHOXMvkt5qJk!?Jro3lQlMIcq?LXN!@N2N{(Z3&~ ztIPZL?c2+jDhLYm&7Zr#^BMmA77xdGO<~sQ=awHnd;tDBTWRmY)sA|2v>YoG$qQoE zcF#VTq_)mI`{MP?T!W9amut?PJBJt%&ISd-5F45TD(2qQd!MPTtnHn6V;?^3|NQwN zmRlYl6;$&lpXhuhoL5#W2kduoaRIC)6IdM&4-Z$jG=k0Aes8(6un7Kr0slT^Z9VsM zK_Z{taBZ6 z9f}_)H&R0)b!-g&0uNQy3bg)OHd}dVEO*H%IJ?yEn32t_eDC5xg7QDRx+t*6FA<_!c%b@8(S=lRaYW_uoA) zEKEJHN?NoqH-DS3a{|P{$;qiz;)?dnVW;Bf&rxCnrt5j2$Aoe|7L#LcZfq1TXH4eA zybXbZMU4r58O+7QGdetcZm^a%A=?rHhOe(LhJVPTDEq2_{<=Ew|5@M~Zq#e$$y+G1 zC;xc?n#o&r^{VB=2oX+p_U-4s8G>;F)xc+?>{*N(FIl6I+aD_fA?Mq$0fSSCFJlFK z^3K;15_+N4pbgabmJS`9z5rVIX2mUTFGLPw2~NhaS3hDKhG}VOAFBFwVNMO+gTP>1 zu9#l*w@DONOBzVKtOLJI(SaXa?A92 z5{tR^Hkyx&DYl^fSDy-e8y%(8j~6c%KrL=^ON*W?iGpqbRbFAw0cJWa^jMfU4)MFV zo{_M34BxO*f6k=}Ou2|YmD|dyn?iNCxqEwh?$|RKv%So|n~-30g0u)APlRer0hqiOpJa2+M}s=7$}{-(N-HhRMOAGM->-^iq&Vq+ZYucW$B!)sA4Co| zTWN6V=;+|C{2{hLsKEyeyp_Ie`m)K%2#Zl__X86QWWn4GdRD<(d^?_`qzrXs+eTW( z5W$`6ckS9m)6Ch%SyY@NO3q6Bh`|{j-(JTLw=UQ|>*z3db<+`%8~ePT?sBjb@2&E7 zhPYfj;yk*&rW{a&in8&_lw#kGIJefS^9<7?IoY3q|`PyZ$njrIu7!Er6^@1 zIV+-CE(@J&!s3UZr`eqzRe$N+vn3cw6PxyhZwLeEjF$)eElW?|f=q-{$T^PMnI`x* z`+rZJ^y~U;Fv6v*5^!-h%T?-N9h3i~{G1!TO|gJ+QI%>qUfOuY34?yXC9?amnU&R_ z|EWKqQ1S{psNT?#CWe2xFg~)EFGe|!5ZE&ha8EZ%Vqs!R?Ma}PWO_f;P+DHTBi@kL zCp{9g3YM#8wzl^pBQ^BbtF;;k=cye;XF1mTNbZ&nm-^qi_M#K*bSxY1#m0X7{$0;o zDM**inxh5;%3yKOJ)1;L4eYhw>!=5j9{NFBn<=nYsN>V8$%zSmK|u&I6zT{|QNcFS ztIO3<nu*{-Z41Ji{U1mDrSt}efBecY z=KJEF4NqI1TXznSSkrb}Cspv~t!RMoC}gR&>%BJhuU|tLq+pN)KD9mG5Fz)XFxalO zOTQlL5&S#0v%+cKNxb22Jc@R0sru(o!Xw zSkaOHJ)2u4=rkPl8v6SMUiWi}Z{Pl*rN!vL0cjBtstxr7jSxfHKjQvj%9u8+H3@-; z-jLx0EqGE}jhvw{n~LvD=%nVDA(jLzA7fs`lM5b5faPkPquduWr=Q>3x-vo0ovmnM z$hVyI8X%N(b#cG$_tQhW4wiiI;Cmo$vI+AAA)45Z-5U>{JSo{@(b@`##T@b7@HBRb zHvEW2$(K!!I-t~H0GgF0R?cQ~{r2rdg%hTjyQ8*`QQ^br<-kZ%u)yD1l77Osf!4&; zjrJlDyt(*43cnn;2+C@#ti$T^&nhk3ZLK@VQW+R)V(3}R6E?Hn!|gXZD>qlyNPBi; zZ@DoUCgwUYbtz6pK2WP-V+(KZdDx6F{6@3)$b>nP&CaQbRF?-(N=XqdV0x5^$V1Wz zQIlJGrKqP`k<33{lvA+@_~9_z~amZy86rewkO9`bH&>IZ-TA- z^^#&`-x;yTTw|(i)}9DT3C_$J`LLdz9^`qz>WVK4y{oH4&j^tKl(<=5z9+iLyvHak z<+)|x$}~MTh7s`*2bqh7PhNXxLw|jr4Ossjq#pyD^^9rFSsxSIXDw>W%(y!p+%C@* zC(Lm$&Q;jTj!Bf3{1tps^S^(ugS5}g{L*{M2BLCP4*4nUKBU(3@tVkk zm~}MVR2w&L1kX63_(SHT+j+PlDL<#d&mki<-r4k>(;6Ba?hv#Okc68g0)wkX>8?=Z zKyZUe&99JoFvuN6cjNiB5e0Jh?%l{0Vh!~L296hYrw<-v=?QBL0}4W;5fgJp!vp&l z^kG0i^?-&W`(?VRC`@KvM+gOCdnh-+O~buCD=Q1CRtCQ{b`C99)4O+JfUbBf!|VS3 zhbcaaNNdc=v0wTuq?>ZQSD>at*t}zZ%?s_vWx9127k-KS*Kaqn>=$M;erjKUN5Oat z!v$o}7eG51JRePx#g%+)PqOH}Q+s(4{!qa5X}}X|Q0;HryqSv4Ght3*nf|9G zsoyUqE)D~8p>-B`yDKO4Q(83+4u(34)waZAAj-ax9_|B50FQ@Mi*kIHQTnHmFZ%$i z2NW;pX6P6G`CU|bc{yZzj?dv?CB;jCAs%TPN;aOa;pM&qr3xDq8tOX zn)r4cdkZ=Q3}nVl{>8Vk*5$!WfL@4J=nuMblwyCiH4tpP%ktL;Dr15yHFT%IP~>yh z8vs2ny5VxQ=;wd69f-IU{cRB~qiYimYiOQf_!IiiI|R`g`S>(YZxaz2gg!n|aTF{7 zN*-uWkR)6lZBQ0PH*JD$zMUBsomE&#q1s{M+hK4O;~U;xr|rP&&CSiNt$Cvvj<0Xs zxWcui4Q6#Ty_njxB&iR4_>k{ZM+X9KU~h-XVZ$vxpy#>ed3V=ZdUGVf9c!sB5H%P& zVZ)!6_V)Hh(-$f<22KXv2@~fsY6DCaBl?rkmL!-T79v6&4#UxSB{Ve4 zrkD|r#D!IV$*^Ah)Ig=cS|PY@uphdm)ycvZsGopTkQ?K@Y}OS=M&Ccg7m**aZ`#LJ z+yeH3Ap-;(A%KFsJjXv*3jFRz8{I@1V!;;*LCq9;fR$Cl=q$!y;kRx<-Nx(j!=XQD zSfPVL{IZ7|3Q}!_xgtTymJ2{DC3s^%Yq05HCVK$;iud0+%F&Q&DB@OCfW3u9nA69s zLxm`v12Dfu{E)*m62@Zq=&R0+vMAi3%48!dEUP_H|%w^-qe< zP2|zV%3(XSV7N+qI}SZ8!r(jnI^6d8sY9-=u5ngyXHoin$RTJp)x9TqaZ3bUKf^D0 z6VYX4W@h3ZoRX3dWTsNaM}wPOX>^LjipM zKnbe&-=&FMNJi)W{ICZ!1cB`Jq@}0R)6h%~R8gX?SqnB9Ec*_5`2=~F8()*Y$uajK zU#_gEIBUgXluy=zwqO2heO*ApjTtEw=T$jZ!&@@_%12dy6)R{ROZ(p|sq7;|IV z3vspL!t~J9#Gn>ESWn{I*WfU)esN~-2G_Pz?(Qyq)I<@Dm36@a9KVp_Q_|DB4VEFY ztgg(qPzDW$d({a}S}SW)kTJc32R|2`h+cRNUpJ8Q_lhQn1GtNJZR%SfB1SaJ^HVz% z6k_s?30HcO!AX$1hj51hLKgO6>7PE8@bUSBf$VkY4IVfOfH`3&R6BMqF8E46p7Jg! zmzI#o%g<-u*@hzrLP&GWH2{7WzlReVN_e7^kOzK76ys>g&$Yi*YY>UNF#njI0?598 z{dyzIaYRDZ>e2-6My<#e^16x5AnaqjJUsgyM+jp9npiL7ljpf};3=!CS{P~1Pfsrb zm@y3MpK^n-56{&bpwd>Zdnv#Ee*gEFo0{!Cr9-lI>Z3a@x7+GZ9x^U=aIB65;iaE0l)Qx{`yV`wS+lQ{M(;gl_7nNZ4Dr`|hejJhG?N{3? z%*G7XvIh4le1{*edSj&L^xK!v23u7AcYLa!$yGc~Ea$)EutMmq#lVle2A#82n=g-c{a^A{G zD1*k`#t<(x^(f|GC7`z#y&&@oCHR{`y1#c%Vlf{)8|Op1N9KJ9b3XJII9E~j&}sep z^*ca&WY#&+koH3N0HkYczoN*~7*j3=V{(4%UBYIMQlgbib<`RH3G^~N1#HtW^%{!5 z(>jB50^nAxjEo#fYb)cO&oFkwi4&X%`JpB2b?#jB%B(%Ei%B62{$Hhehz)mkijbKwrbshrpk)u%Fot#1Vpk;- zj|}pVr&5$gaA2<*`wk*4$58nm_`Eym(;NRO!FHrWtnwtKs zVPX%k{j*}RiICLIsmAEI9H|Ovn||GfP&UsqXV8J{*Vor~cbDEfvNZ!W3|ln{B00pb zBftY6eBtV|(o#OkVHerXlbkq6U|sH=4S#>W3$@01&r4!}KfB_ScNfH7#Kv-mvL&^| zmB^&=aC3hfA5XYi*c1TKc49tL+s9jn*Q)=gX`*R;gnSM`U+!{s=0j+^SzrOG2b!C|t z7}|5TgUe>6rvs(SAq1lVi@2?)8nCiJ2~|KoyJqNG01nQzc-**w>p+KlSUEm8yI7=h zfE1kE{P#LYkd}{B0NKf>%;DvQvpD*I?Eu(K&9p+P4*dJuYFZlpzW48cq@J^D#QC>S zwxw3p6tak|Z6A7FdRkhHL|RZ@-@IX5<1n71XIH#m;nEx%Avg^uB+i;GfJfqS{f6UU zB>K?N@feA`kf?{_D6d9mzk8XqjLzOqNWc^XZJ#b04p2f;u!jFp@c4hUz$jO~ux#5B zJRgq;NYaZV^*4ZcI6o(&piqQFv_H(nMtKQWZdOp>6zRxyP|vuXLovD9Uo7$29=Pg{ z8$#It%IH^CYnSBMm7?L}KK{mCUD(I4n9FOa#x~Gmv4ut3PHo!} ztbxNTZGJZ!@1&q-tv_=9MCWpYP$2x$K8p*TJHF@SVa*;sc%ZG$NJGNK0C1SpPHAPE zm%)=F+Id#b#Ms!;#pU-SU&SFDb;LOMs}lF>PB#xXcXu445mNGeOuC&W2Tc*rgOY<| z6ug2Farf`N%ABU-kR>6Ocv05)k zn|!&1qn!2iI#C`BTeTe=2Hw33pOn1z%25tuK0`ypMi~sL=(M2d9UI^f4V|2t^0OA! z*Yvz(KqiPAkcz1OF9%_{P5<79KL-}V0IvWuX!`*HmCv5J#l3gXA4^S}x$qLEw`pl8 zpNKNXjDyM?tG(a7yxGzYMqU$JyX~xUp#O7bP64o2@${#Ub?aZ)&0r9I`}U6+D+Dtaqs;GAF@M>)J$p27JV=(gxauR;aw4Rf18#P(4WKRz3@joY z=NxfN1NI@=e~S1l4t_Gz4ddJz<1;f!j@UAI7=o$kU*Bwc^TyP_ST*`rMeEN=@>b7~ zGaRdXqDB?=Ix>W54uWUGS%udz-@6kvPyXhd!b={ety6@X*F8?5lD1exQr{I<7$A;sLXkV_$mJLo#J;ab< znO6V6jOpy`EDpwcLJJ2KMuP zpE)ZtA2O#6rLqELKs72Xv%JJsinq=7eAi4gz59zsPv?F6;~Q4i3#J=(XPmadk&L4J zd_7ED-0|1k%*=S$hP1Ac1A5jcF_I`P^@Z)r)xg{PIU)wkCuBS}DD&3WyjiT)wj<&r|-g~*sUx1&F4}BH9BsbR7JNgFlIC{tPzc)(t`F;F@0`i6Ni1WqaJ z*>g=9i(l|i{GapePluBC5J4&bAIIGPKi;~kuBNtSDNuBA9H;CFJ)MKvIhu|k{|jh| B@1_6% literal 0 HcmV?d00001 diff --git a/assets/reftests.jl-24.png b/assets/reftests.jl-24.png new file mode 100644 index 0000000000000000000000000000000000000000..423ce45e46a3c9e9ba6801442f4e4b4c811f6c21 GIT binary patch literal 15917 zcmb8WWmJ`G6gB$N4I7YUhbImp9dSkRTRmq4Mh!F%K`$tVh2SKnB&;KXHhQClu z=4Qh`_*UwwD#+RSe=pw`ryvL$@{fv=-os~WlfEX@i^Bw)Db)mHHxwyRcT`LiGv2YU z@7v?m(!MpSHR!C*?jJWOue0)Zs(HV6Yv_uBKS>?0-z27#aELgTkuZ#e28FtyM@y-! z+`au*L|l@?B8@#I^Vvpma5q<`wB_zdPm1rC_N2b~5R|e8rmzW#K>c#qKZ2>$>3N82;f@}0+CUlJ1f+TI?X zmd_cnt918nW=@W|jZMLdQ0^izpO8>hdHLhC>t&j3C^ass#+9;y}dm+P9bNAX8HH^{rmST@~wr1ou59H z^YPht<*O!?S5$od{MjquMe1c=(qp- zA0KwT(y}r!aq+d`itO#1L)3~&T3yu)3=I1l(+WPvyP=hp6121uX=$|F+=2eP5AStE zS16olo0)0)gc7ndESXx!`EJ{MF4cb_DENniqv+)CpWHtOd@3ACdPYJ?1qwkYQ}cZz zBjxM?0c}OMn>-fDCp$SJJa4sPuO4pAO*uQ)%6eZQjO=1yoW|e8s>VkUj}Unz7ir4Q z?u%6Zxx37!&`RboVx{F5K^nz^H(YNXeEQ{?^yT>YriivL3N6M+z?IY~6!Czyb-P)h zJ{xN3l}ZGvV)s&YUBKCCm3eSrNkeAUwz?m3!j8(wk&|^<(8$ynj_hQQ*bO(sHL$l| z@i7l@GhtgQTp+oP^_P=M?sKovK@X3q&P8RloNugXz_V>%cjnY{EJ!UJthQn81utJ`gadtSynuFt1<-JvWz z9OuTL>x9e9ehi0~Nl6L28~pZCAIz@j)IvxD?`+@nxARa9#L_6TDrJ|xDHC10-J^yIYOX~N*{U1|G4-p>7#lK=&U)>J;j7Ye~F#;5EZ zp1WE>f7wL0V;hcgjDF|h&*UsDh)mRBh1AyWWr{tx|2gZ1{9C7qI;C*@wI2;0pE5+& z*Vp^fg|zpz5SSSlmWNv0VvT*ZlO{B*U?z z+K&!e&zPA`O!5UtNa7L`6C)xbq9|Cod3d5CBMXa)9z{hREPW6E@udZipVEptkcb~S zl)7?d9TS>4JghFjFVi|mh225VNKsRL*j1|kPgjD^+i32n_N{{hmjiYWj~zJVyLa#4 zl5FnZ7c_0W%ER;Ed)|%MU-q`P-;T-HBY2BcL-CM-qT7E~r{szcrWma(Deax!6U@*e znM}$dR3Z6@%g)1fTH1!H=H%3zR_Atn@~HgJl<|)rhlPb%SzGh*@rj9vadL0~O414# z{hFCUQBl2yZChEfzct06tmc1AgGMZ@t>0`lZQLp=Tih7mQ&m&TC@X_IY)DE9kNKxM zb%+B=7%F>1LXz@?^`K0G{p*I-v?5m_1#7?_`*|K{~; zcX#*U3S&cabJmL&mlqaj>FMd2nN9Wd1`AbH3B6RbaLUNwRuFnoo9M{M&Y?0xFYh0r zI0QFURi~SM-xL(s>@0jdtnHhbngBR z4t$g19351oB>XNeF2=^j?}_>GWMyUDvA@lAC8VUJ6l*@erHR05aio+L7Dlc!P+Cbm z!lR99Cn6+#=RQw78R@yuNu&rLBPJuOt*`GQQY5qsw}dzfkXKMp$e}dkizQOj*Vq4r z`w|uaQczl2dKQ;0;wq*Y!$GLbPix*9^n6`;@MQ+#2`l;O)2DlVY4ZyUf<|v&`5&zR z+J_YAH|10&#dKq^5xFzHQOZu-m%Y8c=h0x=w7)gim6Vk9-fxeiUg6)MbG@U!${?K zQ#He_%}utHvgT$JU+hGV@2=P=QH{r>{PHfgC@M_>Pj5BuBMt%twXwr$+sAFq`4^z`&nhh$}CEmcyo z$BKwo9|p)T-JQU1Or#E>qN1{Qa7g7rW{DM}1K|$;{{73%%}tN)9WO@;G7x~StAKi= zqoZ93tOKy>Mwa##chP84hO2})Wu~#e8htj*po;40>G}Hl0-b7V^0&3+)kKs(bq->} zp#D5m)!}((;;g8s=;^upT-FB=wg%9fN9zTg9#BHUX*_~D1ocK(wt8h{<<_lROM(#> zAuAQmPIewYehix$aJn~wplE0!|NWR$b+?<(^>=|!japh-$_%TV-(aJpv3Q{@0xYg$ zQ?8)Gae&~A^!HOm)m$xt@b60#kn`XF@y-p1BO6?qU)+b#dp0(|HZ~GM3*W<5RGBo0 z3J6q`mc~9q-dcB&Lpbd$e(kdnZFEo}4Eg?F=<@IoJSfyIJdeP&ZP=K{2??yCHfkm& zKQctDFRa?mR55&y8w$-HQu(Gmpl1S02CS#o;iQOu|0&8kx zD)j<&NH7CAo^pZMt74Ca5a!{x_2b`;@~V8;w^ za#>y;hpeps-pUZfFVx75u{S&olZpOzF9nrvTckdH`V5MCTIU{NSmLch*v3YMs~iyD zG&D3xe8|x7@Xeby8yg#wsY6^Pu=8T;LWlbMMXf)Q0%yMa=DxJ7Z1CTs#ivgTWtyi= zs}k$`rdtAyA@0-D)2(icK~{Y#av~20FTfb_xa0jj6!?f`886y=s>n6B85b@8Ib8^j4vx(Ygjl z(p3qG*S}lp;5fRv0}^Li_I7q6Vq&@u3PyOe4g0TCQ&X+t;D?D|RaKRbr>CByqmz@9 zv$H`^uHKc@zInYa1)cD5hJ3Y5M5)b`-2oiM{oeG6$RDa;!_ zN}cQ1aiZF5YHRg_#v_QRxivCgHeZsFVL-;O-L|f)tHZ%3<>lplX&=Q^gZ}U8G-u_P zFVV)`6TMj5dg<2a`1lt9gY_Q`%DKXFa;GyN!U3lK`R5<_ZVF(7eBd#Ji-3T@L|}yq z2cX$oa|sLE4gd8#}j*O;0h-jy>zEueNYgr_*e~1)$AC-bsaCSTBzqMBRhH` zqxXpK-W0)Fnr)A=v$KPu^W@1BD1xDBp-@eRi?wogcRf4Pc6WDYW-KbobQqOTLqkIl z^br0l#P{#tPvO43VuOvUL~JtN67!QsQBzV<($V?+J@JiE*&fhRFn#Ab``l+Lw^V9q zb}iqr@ER7cn3x9?+h4eB=e1N;)ATB@QM@GBhf z*!aiiTsEluq7BZIjW>Kk zqpcph2<0oHRG{(ItP8(9v+r@9H|yd69P@`+}s>c&1R3qFCx|--!(J{n73TJbSd)o8(&faf9yC%&ZyAH z@#^||!*Wya8B8eDaUO2&pTvr!oiCu!%je{zrvs`h`>?CA!sS1TjJ(9fb(e|CGC)9O#IkQq$naH(%IShi&zm_e7N=Qo>9*c+i#<^ zXk4WWw6s>#R0VQ?SZ!^}q7AOtiSic4764_L8s2N;;*BIqzm>T4prZcsPfr|mi1T#I zZJ$v52q!2kxKZsNv?5>eJ@oTSuJ21vOS{62kTFT2c#vh%3G6;t?tua7uE{&;?mj*| z)UnO+W+GT>Nwyg#rto#VcN*;d?5e7&+upwJYp+=F*)gmt!-#w39F?fm;vmu zI|Kk0qJ}}znMo5_A^uIuk6=2#Q3|+XYo}XTT97eHd>S34SD@kWyR3!W($pj;A!#R4 z9JjW#*m`))+}!*m54BA6zgvqZ+=%$qtKUpHt*eF4iB&Y8VdadZxLVcQOymNv)a>jg z+wU9%1O)DXpaEO1yfa-R@h=TfSBHJe^#+R2{fomTKltR(&Bn&2%IrPlMxFCyY|jv- zH$H8h`b`a`DZ#T5^WdZ&eRK1(@2aeL_~$R6<#aSO-%VczSw65JW4Sg8bf9aJGCZ-z z3wSyJPq}&P)Q=x0eL}6jr&|>?5uJ};FruQO+dDh$7-fw?K!-y0^ebA(@phjO@U5lQ zRYn>bFUb8yk^*X391?^uth=Y@!=J~L9_LiB$wx>~@XNr!&Yz9ekqMd*BV*&$)m6SL zS5{V6n<|AR2n;+t!~_dt(3qhiaSjgU8tlYv+?UYr78Mr{>?tfjI_3l&+pU*X?R$9F z&2AkxzI)6fRb3UQE-5A!to8LEjsG7_&7ytU;9-2)CrzCDcQg==6o-yzO8@=enb&+@ z$HkE}yazazOuca7!l!KMfxe-=-%+fZvTi>Qq9}51ad`;{9Ass!7#XqD*8SBpTG@kc z)&B#wAwksF{5)V@ywZXWIAt!=E#&0nkhAEX|HCzTklW8?_Mnl?&CP|vXyfiRIeteg zM?TP{C;2kx%|liNGeN3L#JD6_$2jzSa$QtxsF~{xC%*@Z)3dVdgAOg9ww`@$@^Lu3 zlT;hpIqT}0sodcQ+E=sb3ysRZ$nvAzPnr z&B@Gca2yi_T9A@5@T(_9`~~8<++Wzh&Q6e()h2$5et=zFTX?BF&#HIn``+GO)>_2p zP{7f-Vr83*aSa4oQ{crftgulH4EeE5rKP1=a$YM!*dNdpWyj66Uj5+&I}g4*?Xh8K ze)c(Z9@?OlmDtco?Q9}NFE6k2?#2IroR}C;P1nuMZBYo=$Fq6t4|=h&N0o(zB0LXP z(*zir(?0*pOj$P^71csDDvj%%fyy~fHD5%A%kK_UnJaW=-4|;4^)2}951ZtH*ot$8 zF#aef%JJl9Tu~9XmwDed^jmo#0Myl`tt+GYg<|(a*Qef>0qdWe8@P|1sKIS~w$*iJ zZ!fwY;A6i+v00>&oSKxoPI8w89UyNmm_8>ON$Ax9nyN6_B3U_3r@`Oa26SZ^@)IJyKn8-NwDbzK$4(}*!VbG)Q~O>a@_gF2jM~y%YCsEE{Srik$XnwCa=pTGabVz*yM?njeFIX&W zj46UWgO8y@gr?+%*7K*aZLm&Ag;`(Xv(e9RV0aM5r)J%E&d-*XlLMi25tQi_dk{9c zlaLT;jAh6W(uaI$-hAuL%1pM2r^tcHL28gHta7|j0u;f^&%eylg4GETU?AZH6dx`5 zBL?r;+mH9oV~1Q|BgPQERP|>ing|@ELl7w>99hS{hOmuPXJNDT=W*?uTVf$fD5%g` zpG}p!E#Q}-tPBLBg|H)C$oT2U>PgkFScsySqP!wo2rEViQNTX5z3N$L!5cdC?OO;R zH+ums@OlnTP9y`rn!rL3!yXb468BZ1Vp265s|cHv;E>8fT2TJJl z=E5!X?t%K_ITD7lCcP;7>yh>-wlMY#HbxgA2r(!ee8@cGg*=@7o`l>%w2;SGjaUfW z^bjKV!jvOP$Ye7hsHBapvN|9j0K{^)AI$8v=(~5xwzqq65ri6vdJz0@YvR2(Yi(ef z0oNkk&!UcQwaH{sj_P+N>(!R+;1B2+9`+ZuZa*}wd2ks+_AG0FGK>v0r&p$KgzUrF zXA9Yv-F?02ejgzr&%?tTt3+R7sA5z=s5=jX6e$@QLG;@tP#6c-4M;cd)jNMk;V${3 ze4U8jqzJ|SIiSXEj$K#RzDu`7Ok$rSx+QRk*+Vh|19jHN-M#JK9ddDL^*UG=787$a zob=@;v0zL%unuU(uM&TX!4AP-6v4O{^a43!(trP&quo(dQj&yZNlGkYwz%~-<>_FP zj|-WZGwQ%Hi7-qGv>0pa{M1yM$y&C8k*w@&kf-_w26T0Gceb|?i;s^lrkSk29Vkv9 z#w{(+8LwPL27H^V>YY!!6#nLpv5@jYhu@;X-2{YUv}Rn$AOa!KNh)rY zX})W0WRZ4P5ljz0{36@o(t3#qH)v%;`bGOuN1K&uz{&3s^O1MgaE{fw7k8wY$b+t^ zyrRy(89(0Svtei+IREQc!RX;y{j|FjlVCa{BOTp)hY>yl1J>-!l9tzfw?hmcHgEix z{A$ute%mNi2`?=?JUl9j0J7k@2f&+;kBhCXu%sjbLP3#GT`k<1@A4_zP}}6k)dx@N zBRdHe7SeNSm;94ZGrX9`&Xe3@qmScbWpc7*ZNISzIEcN(U^}Ki{?^w$zrD1yBsukv z6B-Q;4s67r!swpk$&b-H2`qBnAG;PO8|L2n?dkX&uq-SLI688C{?vj$id&7v7S_dR z?XYTN-zYBZdehOdC!FByV9MXgJMSV6LpwGS#+IC%4Bhl#zA8ndgOb_?A#NBR2`!Vf zyUp0^d%*n^{C1bBTK_ga-1_OA1IXPdDC1}9=?S+6B?lCk&vRYL3->)3vk|&<->E5F zCA5)IvKDR3+p{oA%s1?~=D@2^p#a<=T@r)NIsW5|V(uOu)>c*qRc2(MlLdFi(!_pS zj(+oIr>v@_G=+ieH>ahdVn|Jm$oXExuZ~nD(2L|%S8sMFaoQMRg@Ec}W5e}6veptE z+BvrcdE^R7bT5jWnL*tCsfpm%?ruUNqB}v|A3r{-EFHgx4#fk~{%r>&+V=MLDAJ3` z&!4YtY-ssN3t74X)l|8C`?j6k<;h4k6|oxh$*{4@jhi=Hp!I;x@lMOuEtiW{7FdG1 z(WGWhPHRsu>w=6lTxH%0T_gz!Nh6<5%m=(-Xz2v_`Gu0S0|nqFy<1yMyN4x9<8jam&L>eCMTb-$6mFJ4vkz( zPRg}&bcE)1fkNS=+Nv`a)J$Vzhadg1_aD)tPmlLNYy}O%h7Bs9tW`&}Zn5U+;aoyZ zO^wMO-AF$xzT^@)!bDCmafuTrDK%BxVVFNg#r=498QPQq(L zn-VIU+Cs8Z^Ju=UtNYU1Yo%lq%1&Saf;0$<=gd|x_s8%`Zz|t8Xd0@J;gFR>mx=>r zE)8%A#HVS1wf;hNt!Gk}4<4xc+;}R|A;OQiy16Y6mC=z~v+w)XRM2G8+ghB%Jv}=5 zUZr^}3j>3Zp`p*O?j(tLtI-dN3RKweCiK`K;1Qi~Wjt`~1P1Y2+$rxzhhxP_CC_mJ zg5%4Vq9#-XFN%>7Jd2M{>kJsgegHKH>zn^stlZ(L;pk8((oV(?Zwm5Sab-N!j4P0gZj%@!H?Fo#z!WtFxI8 zIOjX*1RZ&Rd}~e37MM5q$p#iPp*QNBFj|q(ZW&XKB1=Hh=#F&UkV&-2^RW`&Aof^Owz9# z8)2^oHkxYrPbT8mnkn$Jgbk`X`m%s?h6fksr zQhG(78&}1a7*(-C`sR=S{F!?v+kc%SX$c^3s@`Q9_9^&eOO=|Mx{)t0C-=V++|bYf z#u=2CZ)evYZnA-Dg$c!h#!%sOm%50C2#16)3>Bjy>HOm*Ed5{a)!~XHPSvTFz(1R_ z?Y|w`ipfaNYtM2zr|J{%w!$49Xc!o7`A8q*;gFo)2w)SFkLod-goHQr|Dd*5_`qgZ zLO9HbMn-#E)c`nk0+EDmk%!YaO&HmcLel~rShl1KF)lXj0e&g?CaH#IF$oFgpeVSs zp5AwM*7UjINBr*x2}|_+{%c4dy{cNzfaw6{;qzI5SFdabU)`Y-GW!8FOGAS+sy(-f z<1{i9FJx{#S{@?f;>C-P&Uc3%jUb@7fGZB|gy&;NhavdFbq82$((=|>(MYxQ0v$U& zy$fT*Df&X11<-#CHt&1OzTk z7&%S1Oj?}ZSMc3n5<)^@QPDQ&j@1De+@LLjZ~9CJrmwqa5a6u3fKtRLY=Pj@uE_j3 z*vJvK#ICFD$HyN&gUAIzbifqPiv5N$UlS38OnC zIIF=L8XAvCFNRTjqAroM%7bKK>*#PpfV6xO&i?ziV~O4^ANJ_6b1ZIa!>3?*>{Rh8 zGIWnAj14q;Qb<#?n&B=Z0fAeEvVb2I3d% zhH+U$1TL)j4bnik22wIGRjfxhUOZmqaUT*mybA|i1v5fJvP zg8X-mn6FZ`7r!~>3V(Q^sd`Jia>qpXyy$Xc_WL~|s zc(VZcoc7t7#!|IRH7>uM&yqcL22iR#)ET^e=}5W??%?uB6_9aOec6H}$jkI}I)`mK zyQJs0HaTg3g;Aje>bfUT04hyvXWIzY?zN8e4!`+EY>BUR=uVgvI~5cc=?u|pLJ zR7W(Rn8e4&3xP-LwW8PPkoy?T55m;&qInZO@WXlc1{1+z?|MjkU=FQNr_1lYfm(Ub z(lYnWbhZkI<-A?88kds{8p=`W#4j_tP#~+5pnuK_Sk-_QYs5vhJhPNF>na76u&<}* z`y$5>h_%K>Mx(n=5JfI3w+0h?RW1-Sru|kc%FD}X_zVI-^=BeiO>ey#qtezp021@~ zCxS#ZE>lJ{EPbZvJ>sK9ut~v)xRYx5ISVRg`Q2XQy!?DD%!dz375S@>CNoey*VfkV z4vebt(|SlT$(_}fsSBp>JOp(>b%;DJHWr$Cu=apoOa<)RF7+;xiBaK5y>-_+ON!}9 zNr_#(^W;-W`)@Pa?=cMW0q=hH1%brnMe&gzd@QhP1TJ6R0>`+Cwt&;dm=8t}K<$0` zlC7~%$*F`6otBmc^<*VaXP2zO8w1xWQcc!YBpz`Jx7S`sXnr!w>Sy$Fh ze+Tdl)UK?wR7Y1=q=Fs`r%VhB3(C)h*B9XY9Hix6pa^t*_<)5Ickk(h5zu=}V?O*3 zN(WzDr2sfwe>}gf!tp)%k~$SNbvpmu*WhX~J-4B4Zu27wV*?BB!|NDRd^r3SkozuQ zzRb;iAL1dy;4$C`6$m1QI*ton*Z}6hAlvE;NCA$hfIJYG6eS*MK9dr;|B3!}#SqZe zB|!o^LY&o0K#6A;79P#5KfYO4yS=pqnWqsIy5}As&x#Y5+hGOOC=Rsm2VY+V?*G2~ z;K74NK4qg17(eMSHn9A_f&`E&DXy$s|33xk@97_L+xua=Wcb5wsD=eUtrYyuOpTj9>`N|C)S{yagM)(|9qzHg7lEilOv3~gSiXekY5M+XA)8Uc zF$1D8hMEW6dW)L_E+Ll5r%NmHIK`|JdbIt_&Jn;Zm@=MpRxhh7Xkd|Wlu%YRQef+^ zE0dDf)hct5@{6Nzv82{3Jw}I#FVBdY+k?61;pX-M(_fgEmj@FkuV24DFHRT2g{udt z>FJ~A)@4#&ykMcFy$@-Wmi8##3N@pu>_v%t2aP`5UDjQ%@1tK z9vi^y{3euyE)+qS+nSw)BB*9=VNnwGbrEpnL~qn<{B13$M?g*rR9#8c!r%D$n!ZEj|Ghy^s}t2*mx`LrcKV=al$ZO zP(>;$fs`2hbL&=?u%$8}4=lk7gw1&OgsNMna_RprPa#n4tc>{viAect|EFLcRl}QW z>#(;!;R1>pD=du{IgYy1HI}aQI_l+J&)2gD>0PuLDa|3a%NPvjB^f|29y-@#y&Y=kkFv zuq6x_On=8qrEq=$0kxr2J&S5mHh(lhn?=`PjHP)p!Po_Ee}{)YR?sKh3Wd5S{qvvjbtt z&IYap(MX#3;)Nzk1$;>(BL<1t>*H_{C_&v<9F7i=yb+;=xxjQ~q@*k?ys+UKdS~PF z8GgD-z0gj@D2Bd-WTU2C4Ew3U#%Kv%x-JiJgZPTGg zXL*3j;^oze;Q;6?z>#|Ql14r!VQw8^ql!u6znh$qaR}SBF8+Jx#8rkE#Bikg@@-09IqM5Ls@ z+#B%!lxRbmeN{N?s54L_5Uzd;I5E%~9Nf<2W9aMv1G0)f(%o!uz&@mFlE$gR%zsTB zR?L$KN8K1#Nl#yYvNae|%~PeJLSILR3U;><7E=Ha2&bW2=WT6lLP8fD`CwD%S>4IW z30T&omY~R=V`7R^1z2F`$49}A_kH^02*N{oYuh-qYH#fZ{PtENohnfA!qvQB_IZ2P zX>jK^B?>Cl)f&|~j)BGdB}XCQ|9k)v=*}I=$w=)gD8f+Kvn8BjqobvOFvrJ}P13N3 zKMK8pRR;=zQ$=FS2TUGJ*(Ct^>-%_qSDMdd;9Q9>Fqk}$g_$KB>9es{p*;e4BcT)2 zcqWwusC>+bPb&^4OJ5&#T&E{poc;jJY@&HMO-IXffc{K}@%iX>kW?a$>HJ1mrar6%nkpA308(D6Z0vMz6A(nj{!ex?Wei zGEu()P7%aZzXv_~>FmytXy#+3wd7PtFooc$p`q0ESd&7cbQv<#0H-SGR?To5!UY<)jvfV zqAx)D`O%SO%re|Mng}P(3Py|o(5?pELF?<&Ffl>LgW`h)Phg9F_KYb;CGXF5x(gQ`Gf8g) z6u`LG$2x=PK;i0Fs;CG>HeP=I!7Vo!!@79k0#}k6^Z=58*UYTU?932QECPKOlAS89 z$;p90VkJV#zXJ6R6b?<1^{F9&Qy8@N-*~TDS9{)Kz@70!oXUZMv?h6H&Z8%qqD^3KlL=|->?#QV3GN~WIge*XLkLs$>)-Ggzh zu8t1ZhKCZAeY56nSK?XZjv=OjrNev&v>dE~yGbe>%Xxx=nVFf;)t8r)NCzHY1#HB} zhV6#!h0lT04BPq(BzPg1An2ud3mg^-xs0qVwCLheQW@K)oCP_MqYJ-&Js&^$G0=~}iBHR)_Ax@m%+{bwEgP4yNf$b6>{1_bE9e1b#;&U04Qn)Rgh|r-+ zEr&lz;6w<$j3=-DA0YLlhKRaLya_;9(h-gv8!}Jz)*M=W1El1q^{J+O*9bh~H zN(79=zzf2+@BF1cc{wOu&@@Zhqez?gn)mNffRn~ojuE>|__TZHZrb5$RS&2O#G7jb ztcO{dUg`Z1cDV#epAFFi`wkoW@&d^#!fbzC~NfKLy%GasHeAxx^tcV>Tyr9P1lyf z!@LgXF~-s$I4o>v(BoS1IozZVJ{w{U8vXI($ATT?Sgr&tzU$g}EqIh2t*72)4M&_M zZ?k)a-eMhUaP+u1S4PLp{W%69$9M|`o3V6*9z8Ati#j+n<5F7Y6QknIu=at7?GEqB z($ssmfWLre2yDn8)a{CAQf^lNpwX`tHyceV=PReudiKS|BX4K#L&1i8tgWkqY>gPl zDEWK_4W6HzLd(v1p>$ym{w^f>!kC^$_siis3xdAyjMisbplTvm;E{Eb26I^+h`V!Tc_t;-kWQr!vy5%sh?@0)XbM|G^cyC{yn3(8(uT3vw z6;{Ff-;wKxhrWC-aZJHR?sXA`6AKrYDy1aC8lZjSLF#IR>3tKsnj2WvL>AXDxr_BA zSTB$txKj9=0vN84Cm;JskbtLOqU11oocRT(f2Ms8Ok<}J<;Rh%L_^*IXMab`>EFBK zMdL`3Rxci{(ISFK3Q~t{f-BX(H#UcL$+*(b>8|8Tt!X>F-?W5OJj85Zi4+%M$lkf%qlGyq#sAR*ZyXF0{fT(po^ zR4oHvr~3T^f1w(JYB32xA)%21?TArAI5f*J(rjFq;eD`Dh01?N}|yAwJuixkWwX1RsT8jhgWfAwi~) zs`>*Bg3R*DO3l73N-K~L_Xs1EchbqO1mX)*%?N}%sqCP_>gMjck6c1nm^Wg1Qd>rO zNZ7+8>&0Jn!7R$IBT>~8dMp*>8rF>GChkSWoCm?e_-ry$`frjbE9DasvCS+?y1sm= z9PTLCS-gP#13`b^qMkz32;Pw<;-hdAzi){-G?+BIU0}y+Zqw0f4LXgLVm6h=LI$x; zNGw!~Ww(&S!?7Im<=spluH>N8;}TsqWyeQ`=#`7Y7K%yQqu&b_4MMcAtPq(-d_LVp zbS<(+71QLedZ5f^;|d(z+Rje;oq20HtS{+I`xBn&rwEhwB03oR@$62#nS{-w#90hR zXJWU(1E;kuH@9WBE1Ooqc9Qv5=LXQAFusjR*T}AEqjw0lH5f*8h9jT6XbxLfbD-^_7V%z)wQ_u z71+$*04FDb8}rL0pi{K$e`GAnVeQfJG~va6xB0sjp6sdC^$?Fuy*4GwXSlyS5LFsR zX+=FaX;4GkpN2c1A~SL4iGbVK+EB%A2G%>Ul>f zNezZU;lj=z@&eHgxX$ZELuFe#yE~HAij_|k{vNh3Wqy_a^Y{lEh#w3E!VI8(nSr>3 zMCt1sU@KsxnN?h0odUrnQh8QA$NOgok*a!MAkz~j#q2Y9c1F|STx2&rcw%H^1hXZL z&S!5Qo*dRFvb}5~z5-QZ>byy~!fODd6;@KVi8xHYU298bTqwc|tm{CBpFevBZev$G zqon(T*$$RhnfXnwc4c zo~yJH!7X6w;un^xT}dU5Y;&F*U!&>PgQwi!X1Rs3lfJNtW@@mZz{H2A+fpNxbHR!z zS@tlOKRsH^0Y|_|KFCY+{i=w%dLK-pT@Hd#7|1^mf3JBip^67Ce{ecHIx6upF@l5u zem*hY5^$shkK|CuAFIvbc&)zlXPt*$6ZFAHWQ;{A`O9i{b|on(x-eC8JKBn+1|0x~ z3J9nJaCUH{fZLdum^_vAd-(7bBi@RsWi4Ef2r!id`D2*hSM~h^4#ZtyZPB2UL!p*K zD;S#fq*Km>VYTM7zkduXO<>~x%4c|d07f#wQ2`a8_vzE88kwSnFuAm@{0c_dDB*b# zO3K{%ptlU3Lj3%=A)m7)>&L(e^Q6V4RaTp}-Mi;CoVjc60s}#`U(g5{tHqe(q@bffOx2@)f5*o>y+iKss41let1`UcCX=~QjkdL2D%CHO@eNbsf~Pw0 z5Rh~bbiMQQFZR0Wv4z~1F4Z3K)!6hh z->(F;7?>t*Bv;qXj@^h%eW3a!g1X>kZ!4#O7BzVz4)W=_Y(4ml@Y-RCn4h1A@u1!~ zXJ|r2_{#DlSC-KH1kybZa&jc?Jd!dVN=>-UtUz5fB--j#9ZER#f zo^}yFfBxLT!9jefaC%5jsP^5vL*ULZiMBlU=7F1AO?I|1>_j&HgI%4i_to3K5o*mu zqqo;?Ka4DV1XTbDao;ckD-xU!^Ru5>rB`)p^pezU92}Zp3Jov^@Dm=1Fc-~q1T(5p zuwM7SCAa7%(uqqe?m^+Ke##X4_!S<8G1#L^CL8G)@>GM_U=ZtBxz*}@b+4q^J39yc z*xrt*vj??yAmR$ww5dFVfRh z|K6>*``5-=c{?jj&(w5nY3UUOAKP1B-Cw2N3{P)8kq4c0bZpG)Zq3S_t&z&F4~og0 zZVk0l7tji5rLdb>CaK#c4mR2WP*lMDAT+kI0`LPG2~+L-@$u%%H0rmtw0zv$VEE9$ zvFGboNlD3r-QB@ElUKC2-Y@Np*yGT-;|c0}6!>riQ`z2OP<( z-=-_sHj@d?YPqw;EHaN<`~9eu(@B#Wf7rw9$79j|ee{gtNnz|Xac7|bJpYaSb3;?5QrRNxe*n>&E{6aB literal 0 HcmV?d00001 diff --git a/docs/examples/reftests.jl b/docs/examples/reftests.jl index 8ac327ba..a7e7a897 100644 --- a/docs/examples/reftests.jl +++ b/docs/examples/reftests.jl @@ -127,17 +127,17 @@ graphplot(fig[2,1], ) @save_reference fig -# ##self loop with waypoints +# ## Self loop with waypoints g1 = SimpleDiGraph(1) add_edge!(g1, 1, 1) #add self loop fig, ax, p = graphplot(g1, layout = _ -> [(0,0)], waypoints = [[(1,-1),(1,1),(-1,1),(-1,-1)]]) @save_reference fig -# ##shift arrows to nodes +# ## Shift arrows to nodes fig, ax, p=graphplot(SimpleDiGraph(ones(2,2)),node_size=50,arrow_size=20,curve_distance=0.5,arrow_shift=:end) @save_reference fig -# ##update shifts +# ### update shifts g = SimpleDiGraph(3) add_edge!(g, 1, 1); add_edge!(g, 1, 2); add_edge!(g, 2, 1); add_edge!(g, 2, 3); add_edge!(g, 3, 1); @@ -173,4 +173,25 @@ fig, ax, p = graphplot(g; arrow_shift=:end, layout=SquareGrid(cols=2), arrow_attr=(color=:blue,), edge_color=:red) xlims!(-.5,1.5); ylims!(-3.5,.5) +@save_reference fig + +# ## Inner node labels + +fig, ax, p = graphplot(cycle_digraph(3), ilabels=[1, L"\sum_{i=1}^n \alpha^i", "a label"], node_marker=Circle) +@save_reference fig + +# Interact with `arrow_shift=:end` + +fig, ax, p = graphplot(cycle_digraph(3), ilabels=[1, L"\sum_{i=1}^n \alpha^i", "a label"], node_marker=Circle, arrow_shift=:end) +@save_reference fig + +# Update observables +p[:ilabels][][1] = "1111" +notify(p[:ilabels]) +@save_reference fig + +p[:ilabels_fontsize][] = 10 +@save_reference fig + +p[:node_color][] = :red @save_reference fig \ No newline at end of file From b439e456816a5e424b8f1e1abd00e6a5201b94a2 Mon Sep 17 00:00:00 2001 From: Fabian Greimel Date: Fri, 21 Apr 2023 16:35:21 +0200 Subject: [PATCH 6/7] Update src/recipes.jl --- src/recipes.jl | 1 - 1 file changed, 1 deletion(-) diff --git a/src/recipes.jl b/src/recipes.jl index 7b5ea013..3c76e863 100644 --- a/src/recipes.jl +++ b/src/recipes.jl @@ -303,7 +303,6 @@ function Makie.plot!(gp::GraphPlot) markerspace = :pixel, visible = arrow_show, gp.arrow_attr...) - # plot vertices vertex_plot = scatter!(gp, node_pos; color=node_color, From 463cadf7cff5fa679567cfa0fcac57d275227539 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hans=20W=C3=BCrfel?= Date: Mon, 15 May 2023 10:47:04 +0200 Subject: [PATCH 7/7] add example to feature walkthrough --- docs/examples/plots.jl | 21 +++++++++++++++++++++ src/recipes.jl | 11 ++++++++--- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/docs/examples/plots.jl b/docs/examples/plots.jl index 66390b3a..de9159e4 100644 --- a/docs/examples/plots.jl +++ b/docs/examples/plots.jl @@ -86,6 +86,19 @@ offsets[1] = Point2f(0, 0.3) p.nlabels_offset[] = offsets autolimits!(ax) @save_reference f #hide +#= +## Inner Node Labels +Sometimes it is prefered to show the labels inside the node. For that you can use the `ilabels` keyword arguments. +The Node sizes will be changed according to the size of the labels. +=# +g = cycle_digraph(3) +f, ax, p = graphplot(g; + ilabels=[1, L"\sum_{i=1}^n \alpha^i", "a label"], + arrow_shift=:end) +xlims!(ax, (-1.5, 1.3)) +ylims!(ax, (-2.3, 0.7)) +hidedecorations!(ax); hidespines!(ax); ax.aspect = DataAspect() +f #hide # ## Adding Edge Labels g = barabasi_albert(6, 2; seed=42) @@ -141,6 +154,14 @@ f, ax, p = graphplot(g; arrow_size, arrow_shift) hidedecorations!(ax); hidespines!(ax); ax.aspect = DataAspect() @save_reference f #hide +#= +There is a special case for `arrow_shift=:end` which moves the arrows close to the next node: +=# +g = cycle_digraph(3) +f, ax, p = graphplot(g; arrow_shift=:end, node_size=20, arrow_size=20) +hidedecorations!(ax); hidespines!(ax); ax.aspect = DataAspect() +f #hide + #= ## Self edges diff --git a/src/recipes.jl b/src/recipes.jl index b5ff107f..f058edf4 100644 --- a/src/recipes.jl +++ b/src/recipes.jl @@ -27,9 +27,14 @@ underlying graph and therefore changing the number of Edges/Nodes. ## Attributes ### Main attributes - `layout=Spring()`: function `AbstractGraph->Vector{Point}` or `Vector{Point}` determines the base layout -- `node_color=scatter_theme.color` -- `node_size=scatter_theme.markersize` -- `node_marker=scatter_theme.marker` +- `node_color=automatic`: + Defaults to `scatter_theme.color` in absence of `ilabels`. +- `node_size=automatic`: + Defaults to `scatter_theme.markersize` in absence of `ilabels`. Otherwise choses node size based on `ilabels` size. +- `node_marker=automatic`: + Defaults to `scatter_theme.marker` in absence of `ilabels`. +- `node_strokewidth=automatic` + Defaults to `scatter_theme.strokewidth` in absence of `ilabels`. - `node_attr=(;)`: List of kw arguments which gets passed to the `scatter` command - `edge_color=lineseg_theme.color`: Color for edges. - `edge_width=lineseg_theme.linewidth`: Pass a vector with 2 width per edge to