From 65a0526257b5a97c51304fe5c5d4af8beeaaa845 Mon Sep 17 00:00:00 2001 From: Sebastien Binet Date: Thu, 13 Feb 2025 10:11:21 +0100 Subject: [PATCH 1/4] vg/vggio: remove Fixes #788. Signed-off-by: Sebastien Binet --- go.mod | 8 - go.sum | 21 -- vg/vggio/context.go | 81 ----- vg/vggio/testdata/func_golden.png | Bin 34096 -> 0 bytes vg/vggio/testdata/image_golden.png | Bin 45837 -> 0 bytes vg/vggio/testdata/labels_golden.png | Bin 36401 -> 0 bytes vg/vggio/testdata/paths_golden.png | Bin 8744 -> 0 bytes vg/vggio/vggio.go | 530 ---------------------------- vg/vggio/vggio_example_test.go | 128 ------- vg/vggio/vggio_test.go | 482 ------------------------- 10 files changed, 1250 deletions(-) delete mode 100644 vg/vggio/context.go delete mode 100644 vg/vggio/testdata/func_golden.png delete mode 100644 vg/vggio/testdata/image_golden.png delete mode 100644 vg/vggio/testdata/labels_golden.png delete mode 100644 vg/vggio/testdata/paths_golden.png delete mode 100644 vg/vggio/vggio.go delete mode 100644 vg/vggio/vggio_example_test.go delete mode 100644 vg/vggio/vggio_test.go diff --git a/go.mod b/go.mod index b1e95a5e..58e0f223 100644 --- a/go.mod +++ b/go.mod @@ -3,11 +3,8 @@ module gonum.org/v1/plot go 1.22.0 require ( - gioui.org v0.2.0 - gioui.org/x v0.2.0 git.sr.ht/~sbinet/gg v0.6.0 github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b - github.com/andybalholm/stroke v0.0.0-20221221101821-bd29b49d73f0 github.com/go-fonts/latin-modern v0.3.3 github.com/go-fonts/liberation v0.3.3 github.com/go-latex/latex v0.0.0-20240709081214-31cef3c7570e @@ -19,13 +16,8 @@ require ( ) require ( - gioui.org/cpu v0.0.0-20220412190645-f1e9e8c3b1f7 // indirect - gioui.org/shader v1.0.6 // indirect github.com/campoy/embedmd v1.0.0 // indirect - github.com/go-text/typesetting v0.0.0-20230803102845-24e03d8b5372 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/exp/shiny v0.0.0-20241009180824-f66d83c29e7c // indirect - golang.org/x/sys v0.26.0 // indirect golang.org/x/text v0.19.0 // indirect ) diff --git a/go.sum b/go.sum index bb1bd52d..ef574b42 100644 --- a/go.sum +++ b/go.sum @@ -1,14 +1,3 @@ -eliasnaur.com/font v0.0.0-20230308162249-dd43949cb42d h1:ARo7NCVvN2NdhLlJE9xAbKweuI9L6UgfTbYb0YwPacY= -eliasnaur.com/font v0.0.0-20230308162249-dd43949cb42d/go.mod h1:OYVuxibdk9OSLX8vAqydtRPP87PyTFcT9uH3MlEGBQA= -gioui.org v0.2.0 h1:RbzDn1h/pCVf/q44ImQSa/J3MIFpY3OWphzT/Tyei+w= -gioui.org v0.2.0/go.mod h1:1H72sKEk/fNFV+l0JNeM2Dt3co3Y4uaQcD+I+/GQ0e4= -gioui.org/cpu v0.0.0-20210808092351-bfe733dd3334/go.mod h1:A8M0Cn5o+vY5LTMlnRoK3O5kG+rH0kWfJjeKd9QpBmQ= -gioui.org/cpu v0.0.0-20220412190645-f1e9e8c3b1f7 h1:tNJdnP5CgM39PRc+KWmBRRYX/zJ+rd5XaYxY5d5veqA= -gioui.org/cpu v0.0.0-20220412190645-f1e9e8c3b1f7/go.mod h1:A8M0Cn5o+vY5LTMlnRoK3O5kG+rH0kWfJjeKd9QpBmQ= -gioui.org/shader v1.0.6 h1:cvZmU+eODFR2545X+/8XucgZdTtEjR3QWW6W65b0q5Y= -gioui.org/shader v1.0.6/go.mod h1:mWdiME581d/kV7/iEhLmUgUK5iZ09XR5XpduXzbePVM= -gioui.org/x v0.2.0 h1:/MbdjKH19F16auv19UiQxli2n6BYPw7eyh9XBOTgmEw= -gioui.org/x v0.2.0/go.mod h1:rCGN2nZ8ZHqrtseJoQxCMZpt2xrZUrdZ2WuMRLBJmYs= git.sr.ht/~sbinet/cmpimg v0.1.0 h1:E0zPRk2muWuCqSKSVZIWsgtU9pjsw3eKHi8VmQeScxo= git.sr.ht/~sbinet/cmpimg v0.1.0/go.mod h1:FU12psLbF4TfNXkKH2ZZQ29crIqoiqTZmeQ7dkp/pxE= git.sr.ht/~sbinet/gg v0.6.0 h1:RIzgkizAk+9r7uPzf/VfbJHBMKUr0F5hRFxTUGMnt38= @@ -18,8 +7,6 @@ github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b h1:slYM766cy2nI3BwyRiyQj/Ud48djTMtMebDqepE95rw= github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= -github.com/andybalholm/stroke v0.0.0-20221221101821-bd29b49d73f0 h1:uF5Q/hWnDU1XZeT6CsrRSxHLroUSEYYO3kgES+yd+So= -github.com/andybalholm/stroke v0.0.0-20221221101821-bd29b49d73f0/go.mod h1:ccdDYaY5+gO+cbnQdFxEXqfy0RkoV25H3jLXUDNM3wg= github.com/campoy/embedmd v1.0.0 h1:V4kI2qTJJLf4J29RzI/MAt2c3Bl4dQSYPuflzwFH2hY= github.com/campoy/embedmd v1.0.0/go.mod h1:oxyr9RCiSXg0M3VJ3ks0UGfp98BpSSGr0kpiX3MzVl8= github.com/go-fonts/dejavu v0.3.4 h1:Qqyx9IOs5CQFxyWTdvddeWzrX0VNwUAvbmAzL0fpjbc= @@ -32,10 +19,6 @@ github.com/go-latex/latex v0.0.0-20240709081214-31cef3c7570e h1:xcdj0LWnMSIU1j8+ github.com/go-latex/latex v0.0.0-20240709081214-31cef3c7570e/go.mod h1:J4SAGzkcl+28QWi7yz72tyC/4aGnppOvya+AEv4TaAQ= github.com/go-pdf/fpdf v0.9.0 h1:PPvSaUuo1iMi9KkaAn90NuKi+P4gwMedWPHhj8YlJQw= github.com/go-pdf/fpdf v0.9.0/go.mod h1:oO8N111TkmKb9D7VvWGLvLJlaZUQVPM+6V42pp3iV4Y= -github.com/go-text/typesetting v0.0.0-20230803102845-24e03d8b5372 h1:FQivqchis6bE2/9uF70M2gmmLpe82esEm2QadL0TEJo= -github.com/go-text/typesetting v0.0.0-20230803102845-24e03d8b5372/go.mod h1:evDBbvNR/KaVFZ2ZlDSOWWXIUKq0wCOEtzLxRM8SG3k= -github.com/go-text/typesetting-utils v0.0.0-20230616150549-2a7df14b6a22 h1:LBQTFxP2MfsyEDqSKmUBZaDuDHN1vpqDyOZjcqS7MYI= -github.com/go-text/typesetting-utils v0.0.0-20230616150549-2a7df14b6a22/go.mod h1:DDxDdQEnB70R8owOx3LVpEFvpMK9eeH1o2r0yZhFI9o= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= @@ -47,8 +30,6 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c h1:7dEasQXItcW1xKJ2+gg5VOiBnqWrJc+rq0DPKyvvdbY= golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c/go.mod h1:NQtJDoLvd6faHhE7m4T/1IY708gDefGGjR/iUW8yQQ8= -golang.org/x/exp/shiny v0.0.0-20241009180824-f66d83c29e7c h1:jTMrjjZRcSH/BDxWhXCP6OWsfVgmnwI7J+F4/nyVXaU= -golang.org/x/exp/shiny v0.0.0-20241009180824-f66d83c29e7c/go.mod h1:3F+MieQB7dRYLTmnncoFbb1crS5lfQoTfDgQy6K4N0o= golang.org/x/image v0.21.0 h1:c5qV36ajHpdj4Qi0GnE0jUc/yuo33OLFaa0d+crTD5s= golang.org/x/image v0.21.0/go.mod h1:vUbsLavqK/W303ZroQQVKQ+Af3Yl6Uz1Ppu5J/cLz78= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -61,8 +42,6 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= -golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= diff --git a/vg/vggio/context.go b/vg/vggio/context.go deleted file mode 100644 index 509fa352..00000000 --- a/vg/vggio/context.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright ©2020 The Gonum Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package vggio // import "gonum.org/v1/plot/vg/vggio" - -import ( - "image/color" - - "gioui.org/f32" - "gioui.org/op" - - "gonum.org/v1/plot/vg" -) - -// ctxops holds a stack of Gio operations. -type ctxops struct { - ops *op.Ops // ops is the Gio operations vggio is drawing on. - ctx []context // ctx is the stack of Gio operations vggio is manipulating. - - w vg.Length // w is the canvas window width. - h vg.Length // h is the canvas window height. - dpi float64 // dpi is the canvas window dots per inch resolution. -} - -// context holds state about the Gio backing store. -// context provides methods to translate between Gio values (reference frame, -// operations and stack) and their plot/vg counterparts. -type context struct { - color color.Color // color is the current color. - linew vg.Length // linew is the current line width. - pattern []vg.Length // pattern is the current line style. - offset vg.Length // offset is the current line style. - - trans op.TransformStack // trans is the Gio transform context stack. -} - -func (ctx *ctxops) cur() *context { - return &ctx.ctx[len(ctx.ctx)-1] -} - -func (ctx *ctxops) push() { - ctx.ctx = append(ctx.ctx, *ctx.cur()) - ctx.cur().trans = op.TransformOp{}.Push(ctx.ops) -} - -func (ctx *ctxops) pop() { - ctx.cur().trans.Pop() - ctx.ctx = ctx.ctx[:len(ctx.ctx)-1] -} - -func (ctx *ctxops) scale(x, y float64) { - op.Affine(f32.Affine2D{}.Scale( - f32.Pt(0, 0), - f32.Pt(float32(x), float32(y)), - )).Add(ctx.ops) -} - -func (ctx *ctxops) translate(x, y float64) { - op.Affine(f32.Affine2D{}.Offset( - f32.Pt(float32(x), float32(y)), - )).Add(ctx.ops) -} - -func (ctx *ctxops) rotate(rad float64) { - op.Affine(f32.Affine2D{}.Rotate( - f32.Pt(0, 0), float32(rad), - )).Add(ctx.ops) -} - -func (ctx *ctxops) invertY() { - ctx.translate(0, ctx.h.Dots(ctx.dpi)) - ctx.scale(1, -1) -} - -func (ctx *ctxops) pt32(p vg.Point) f32.Point { - return f32.Point{ - X: float32(p.X.Dots(ctx.dpi)), - Y: float32(p.Y.Dots(ctx.dpi)), - } -} diff --git a/vg/vggio/testdata/func_golden.png b/vg/vggio/testdata/func_golden.png deleted file mode 100644 index 0eb247beb3d2dafadd0240cefedda997206c974e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34096 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 diff --git a/vg/vggio/testdata/image_golden.png b/vg/vggio/testdata/image_golden.png deleted file mode 100644 index e09b1712afbd051ea2dcbb4b9f775c6d0c204487..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45837 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 HS>S&FpmGms diff --git a/vg/vggio/testdata/labels_golden.png b/vg/vggio/testdata/labels_golden.png deleted file mode 100644 index 6398e6dceb3ade49980050be03c1c968bced585c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36401 zcmdSBWmuGL_cuC-B7z_yp`?ULNq38Mmz0!rqqHQ=bl1Da z=lQ?yd+cL>*k8BDb3fkqFw9(YUh7=zSLXyPD@x&DkzgSZ2pkz{aa9E3$}arFjd=wg zQ5E|Tgh2QrWW=ASyCttrUDs06yu7{@6;r``sLBr zbjGZ@J2&m<-Qk-_hkDy|;;{)__!}W=`(YgZ^1Wc~cY%j%{KYav?;BQ($HvA!bIGL( z>07!ZCND4lJ}hkQfheN?shb%(VuX;0$Yr-_etw?e6#MF%-@ktcU=wTXo+KnBTwGja zWMnvp6Cg-fOt=xsdP44dok--==NE4yB9uaj9v80Lo0^W~DkNFyC$||@*-lnl4&^%I z-a(LX{d+zWQP0@en6l(#83I8U^okpiPC*^H+!jh)S6Ancck9+IVq#+Vma?+#o;a2} z`1o*L0s06wG*-Hnz4+O-%~&@~h{m zi1gX79Ha>4h&ONEz?($~pL7llRVbwi-@A8j@1nI;yiDs?vzLdMbegc&$B!Q|so-(7 zTzR-qg_&lrxA0qU-x7X$h=*zRBY93WF)oa(n?y`MrYis-U%X7IuBkG}o zYORi>q@=!nYE)EILBUG;leci`Rj-r~{ag1d&=C8q+}ycz4D|H$%*>x^Yqc!XaLM__ z#l`W&QiVJ;G&G1FN5#grFYN}1Wq2x4M3@^Iezu#cfAL+J3<~0;3=bh1!)yJs zc);Z*qM!9wi_hi3#^kG4uT%>-#U65U?tKfu_BuUqe)-a3s(wG5TwuD%BQ8Fk4nLR{ zUj}XuU5NX|*=zW4o}QlY7Ms&eUS3|~HZE|xd%C;1?S5$~D{mcb&+Y6un42$MzeNGX z@titxY;rOwA;EUKas11d`^?OL;XUCuDn5ViKj1+iNDxF4Dih&oh&?n3l?M+Vkl}U= z53A4OHTg!vHu+{q5-F{&p=v4+66!`H5a)hS{;(%S z{<}j(Ve26fC+JXL2*mQO2MJ-ybT_fELf*e0mK21C5LJ2ciONx- zUT65Dk(sfz^<;zV=0k-<3wjE8%y**bYrRT9K!AjV1Oq=WAKxopvVarmWrUjI!)j*MIZ|4X=u=u!qL(tk35?j8a$Bfq{Io` z;qWAGK0fUgsz;CVbgtb%gheaUwYI=cqY=yaU}yLf)&(vc_BrZPMfaZIVqLo^^uDy5 zoG~{CN$a;!c=7a6tF&?HoWVbTjLa%3D~F+)6;%F}m*fTqDF;Ud^bw9E`0rCrrdAezBOp^ zE*W_TKiInmKL`m6YkIw#dzLy`V{gqu1`i7b^-5O!{Z;oAbG*rer^5X7U;}oR4h~FK zQG2S2f%L(_K_QQWEw@H`XxAzHG1CbjK5VUzbJzw!;iRX17`ISXS68>OS&uXDwlp>6 za#`0hyM)`t7J3?Z^F=s?fJ?DU zfGxBf2Zx>W)5B8zCK3XIz0=K>8E9AwJ#l<|e6V^#Zd-;$8YNe*Tp4zygqOpS*|5fY zYqivu_Q?O}=!n&W-+6WZ?_Ua1Qn_1IuXh*2f`X*>S+w-^z1M!0Of|R~G`T->Rtm{n z#e-TAMGrLRCW%Z<_1^mZgp!gHuG%awAz>UEVgmBRhYza;pFe-zS}Sd#;I!x;Dbj3e zZ2XbTcZZxjB|17fKK^KRq-bkvi&68_%Q{`>nd_(*d=3LyLewnl_V)HR zF|+R0?yjSwqZ+S?p&_f+iIdsx&O*;K{l`2!u3z6=bMm-2J0>i>0l#t6gnN~kghUoI zf%g@4Qpx<}>1+@s`vx+J$K2Gkpjk&={-)YlF3jasTq1b=()$%E9Ffva%l%Yh(uaSi zVq9LndX>O!OHv^d(Wx>EGef=srpRh20X+E@RfS4L9E(9dfT;?+uVEiN#RnRJFubpG+B9Mk#^IKGD>PE`=bVoYcwsD-;Q^e=KlPd zsJ1Pt%+q30R8Yv7j1jtuYIYdxq|OY?%&@Y=R3@eJTz&P9ONyom3fkKDhU^BjgA>2O z*6)AbX){dE&d$!odm3vYIT|Qv{?B0`Ptda&HGXb8@l>FF|e?Vigv=UxL>1r zH}de&BXhVL{vVk2>ea``ySrDRZp={IHpazRV~Ezj@%65xLL^-K@?#TjtKFk*W3f)S zH5=>eg+podlJc12pIKbE`-kpjL4h|_a*Wlxt!^frJ;@Tf8GuCAu?dd5>%maXTbb88>^hhyT zS!XO)vs7Qcp}X80t~!j2opj%A>o*#e$#}V`E_2O^xz|qDBY6QuF;lY93=%=XWaQ-MCi91C1UY*H z*iY}{-MxFaGOnOl=ar01@Y%z-9=!@PqL z`Byu3?i08?DLvRV2~)F}ei0+{ei58lI3;vs>oYK z2+FkZwX>4HQ|%?w7wnbt3OE<8J}-T7rV@E8f<2$;l^Y z3bgp9rl!|013bsgcK;Yr67@_>oRszkhGnS3tH1kgT>5pg$~q3VLue>=n$ja~RMByB zb7K=R^}ATWhuX*Kvmt5h6S+LA=o2ogO$*E8f?qtkUtziBCa9m&kv-^+12rx>xn(W% zf3Ly+V~Eqd<6>TDy^&?$lQU@~)nOKdYbijDTFQW4$+==4yZQEZ_N2PqrOA;dI#zg` z?rn`qV$AM*u&2&bOnM<_S&v!NtJh74RM0arLT$o?=imqn3mYMbxu6qp48&7i|6>%H zD7*Pe&_TT1Td1Q`dNKoU>v9JC%8N2B$;(!wvSE_vZyyncl7~~AGgjQdq|1xTr)}jG z5!r3W`R}X+umA;K+haLWNZ5VM*xBecNy}0?hAfepX-jS<8+AJ~M}IaZNpo#?fA3yJ;> z9)_tUaNiR!31}LcoBy3R87+uvs;Mc-%X>YP+uHxR zzo#hMcG4_MN`O+xYU{V($=@stV0Ezx33W~@s?2e6n^047W@fn>Z_p6F?KkYRI5TN! zzHfIEhTtVBiI}=fxGaB|$q7Xc&84ZIo2 z%a30Wt*36X^*2S^rr1>M&BMPrC(H)T@|X#%FW%(jEOf^(uB5zp@q$JweAvzqJ`(J? zfp^J{OFDQTH`dmEuQRo@SWIvx1z@jK&qau+u8mgQEWBV$&mP=+y_-lWe5RT7AsU&K z^jQB_rI-YnY|+r)ii(OFyQzsHO%~v6exhGYxM5I!54zRS$OlM}@~CkDQ*NA2=WDhM z)~T&jSmtz%f`h~K`L>kvr&yO0Ck}0>Uzw@evbMn-eywE|LBV7^cE?5er%%5FqjP`# zdf=2rxAwllz-=h0tgT+j^Bsexa<4P3ZX-SoH*DkC`Di{TIu_oe&5gN^uJk8`r4Q-o zUTRgovm=I)Z?mErc2$puKq4jb+4H|6MZ|h*762rm-(^Mw`ukVfPHIfDi9P*>9}2Co zIxC+n=&8JXCHYm5DBzt!ypP)gKlG|(B^Q@4Qanx*Ola)0ar5&t^*BtN7%!;R`9bN! z+0&Od8Ia~7~q5;>!ox_&kn zv6tJXByu|@A?&=)QGT-e>2>FhA`GLlqet58qghh7%pL`OPvCcENEycy0~lDCHm*#t z4^YGVVBCCf5s>S391;_Ab14y*6TEVwhA}l3}W2o9pX>J{M;I{fClZYeDIk?pU!H zG-nTyh;{m0p3X#wTxg+Fq5p@7DBc?_6^M(DCcU@Ng>=irEYLD*-$RoA?TK@mob9}A zwV@MRp79kwW9zci*djmU^IB$cu?^fV{|~o>kJA4PD2bd$ciAW=^RhWDD~|-&wi>Yw z`2a3_8iYF{KMZ)Z2JX?F(_wls>BYSjBrciq6vx`^)4!*$9_4ClZ`w^ctj-wh(-TM( zu&7oAhlBtdJ3pAT--vmv_jh9hx!`c@DNHrLK3+k}V`npz8x~TOlas@ifc)Zzj^oUp z0MlGAP}a+ehKcT_phqm85wD9)ObU6uGo#&f@_00b$fwGrjGPBU+}%Gk)UsEd&QF}h zq)l&W7MGO7brb%sb6g5vEdu%%XzAMDH9H8`I|tXR@UtzHte~=YU|`nZvap;Z6!|0S zIa5W~<;5c=y8JQZ(fQy}CR=Q`!->4uZlwt)H^mwv?T-(xjI3{BVAr-|NIe)XjO z16vq<7+j*Vmm6sg_rr2RLWf*M=K_5;pN=w3q?aAteX76)N zc5#)nR&l$Y*j3!dgZ~gbKtKA;lpN|RmX`EG;n9(4967)LPBq9+e)}d?^7RTdBHvy~ zp`)%Y+!}k3QD^$r3O=U95l2q4Jm_Xm`lckZU^gvagZ(3IiCH_dIe%>xO5Fbg z2m6R1stYr)lNP8KHZQ{hu))rzI9}>=yg~2cSg|=#g<-Cc+UwQwuv*W;;_KSzPr{#? z>?EA;p!d{vM1&GEvG#{uvjzZKV?QHI5#b8NW`rY^or43EN12+@lIJxR1JnXB*s@U0 z!z6%}KgSZzBGdS*B<+=Jvm_%A6L6^feNHO(6S=Uw$b`>WTdXx_Gk8ckpG7Va4_{?F%e;9C zqmRzLev@}?Pd#3r@3b0etySP?_^}zM`*QVUeOahug=cJ!E?O;nUER=+Pj0^R1vcG~ ze3!xLIBl0(N#s`Pd#Vb5spU<+ea++m=ZgzcbNn)2>D~(;B_pGg<6ZK}>iz1n73Gwc z8I2OyJDVLUc}h{oyF+? zg94@EmAajeW^m53(U#K>t#5a&wiHO{=;&BjShSr-Ksj}9txl$S%zyl8oWG+aM_niN zX4N}If!3LfUc=so3Fp^l1g*~6jN_R~Puh@hi?t92q0d%SpvY0yTc2=BrR+PmU;)c2 zXaWKfFQ|149byP@e|{S!B-+7F>v%V9RxWN7o0ISg+niC!72Via?A@4MqF+3C@5t>(X?TAP;xZ*9+XcNFYk(_GPd_edxp*?uym8~+_5~I#+bb&oDFi2O z?%ewa-W0cQKf$bXV|($t2&F%7zt%Yf!$?;Um7Q3 zDk|>K6`kf?M!Q`P!(neSUxnlvf0fO+syERHXe*2dWtEk>m(A|8K-X&EVGWJk@DFH+ z^fJ(Oxztou%Z)p5|EVGBS$D>54qAinBp|tFyy7}&#~eJpyg>Pou5tbQi_ha=9f%M|b-B*Vfkd_xFQPC)Npu3raXzU0t1@ zM@jaI53FSg2nfU_B~h9!6%|U~*a^y2OgR~lqO1bP0L%`!P99d)4^4XP(_r5O2X|>` zkEh;Y#~NK9%8LjJ>Hq@D^|}MV;eDzKKPwrx-NjGE!}>k3k6X?Up1Yd|-lS@soNOrX z1?6A~TA959*FwPPG&TuvaRPAr<+pYWUoQh(`#_)I!pt%1Ssa>+??ay zvI_DS9Rk5=(`l2g;|WV3`98lb82T2FXgP(xKQDQkO#Y+JE9>jq!7c!TW_NMOy12f+ zu5%UIyZfyKoMldqgpkvoo}Q}PxWkme;^i(I6IL$VtgN7XeXgjm1}OzdP*G9QASEfn z;^v2OPB;4NxOXqMuOH5SKa47ui8AhRFgBJuIkazfuW~U)&*$P!5_4(8Rd5Oo26`-@em^M6j^2@z<2l=#-G=tZ(;z4Vn{KXxr+@ z+GY;-$Ec`;-oTDI(BHcbqorwKdXA5etEi}ekof-HyUyNT-A1=wgQO z^R_qltM&FmTnt5&>>3vV0?EP7?(p(ue(ekrSpr1?tru?Erq9JLrIDnGz5i*Non?sfU>a4qxt@nTzw&2A7R`?{oKuqiD*aD(d7)fS!&)Q{{JB{ty+F)m#hw4-^6t zd~jvD*a>ev)3|z%gepM2y}P@xTdlmJ0?fLkxVT3ISS#fp4h{|kDOiMsF933bG?sJ6 z+QY*`0RtCd<=cxvg0FecRtl}2nT;*dQYncW3G-WG31o`1qq&I7^G%;;1{}1s*||ku zuJ~&Fwk1F;6NY4h37CMqhE1gYQ;ms;QrPq8Eg-K=pUcTSr8L-%*+8Qf7EH~|gx&Wn zKx&ikgTd>0w%w5!L5>(k^x1&qsN3KYb}w*$w@-wT=^FzJFRvSjM*biC(66J^Vu0km zR8mqvdj+7&!w!jRUWBVhd6)~hh;+p*a6I-}K{~oc#>;BbiRa#SgiXvWpDLK3C&Tvl z&6_J`Uw#rBcv7YP><1YdF5ziS1i8S$$-XsC&@IHOpE)<8{{sOL5e1)vxOapW(+?yP z2OB%fKrD=0;AdZ7DX7um;o%IQKwy;*lR%&rGech$ zzonc$$wXug;$3|C)z!A8U2|k&PUiO_%~A>xZ+XmZ5TrmRH|?{TZhZZ{^6}%xF$Zky z>_!uGX6XIO;NUpdgO=@o<4!yhR8@CyJ-Dd*c?2moK`&7sqbCZLla&P(P`}yp_0D`3 zn8pLAfMQlQH%s?|K8H)#AwE7%CL4nVaZ5`~VCkaDt?m6cIZQ8hO=_ol*z zii?f4;-a%~f>i{`(iN%@8svZn#w`l@mb8yc^Yg8hU=&8{%hKYrZGgjT^-v$7TrpwJ z4MJzQ!}`VsqemJ}SSyH#m{cI9Cj+}_dc@6r01R#-9GfIdqeRE+e1EieF@%t@yQgPC zpwfOO)ly1aoUTb)U7cX)V(a@Yt~>OIeC-X#+s4LoL=K5u)`7jbY>bZ|PgR)TitE`w zIDm>_s<;Hf6;u_HQem$X)(xma+6NE1C~YSyS3q}MK1kp&4+#w=RE(3R1+gM?60q^J zZLFIJC#?2yUw3f{iMIB3JCG)O7TE34FsYJw>_L1iTRpD9QTO(~*q-Z1K;F3X&`^ac z#mLt7aZ5sM?8CH_&*L^=07KF1w|JlTCUAi01u1~X&#UKO@)Afi!Da)&la$-$zW+_w zCCEgsz`($X+8c;`HWTi2ivRd6n=@&6M&{-<4hym;YJPb5L`2+1t(dmg^SvV|MJ`s0 zO5;(^`Rao0YFJ2A1{oQdVhX?W?=OBZS1F@kxw_f|)|Zu)H8G*p`)mI_5GU%9(x)GZ ziHLNX597Wh^Gi!m%Tr)60Q=cXrFt63nt+5)6NE#m5f>MOe=q!I1^BjGa6dpT-HCX& zIs^n{o@dQFDP5(#y`9h%s5d`&q;M-}Ei{T%I51=H~8Eu&}W3@YMMGUlr^8-&+6kEbEZAKj7$q@gqV@JAZb(yY~Z% z&wK0Z^^J)tSitE@OEodEH!UqK8th2`-vLa!9c|6RfB@oH)vVB;49ahpeYM3vrcoNq zQe-mUZhywpcp}_%9@Gc!PY8;LxK+^sZv4zlnzq?7cynAQol5fZ&~a=aulPujOkl^F+}*kzj0;@?Pd-d`R7v6=Ps5S%*8!ECGPhZgFxvfbbyB_LxMH5r)p zZj+M>*^IH)PlQ1VgxlyUA`CE-^Zx&~p&mxmHZ+``oIrDlx*!OC{~ma$d5mTc5}Cqg zj1l#-SgS1aPq!Kwu9Wwav=d@VN}uDMg?k)koYp_(8DhdIgihcWxat-9^Ou)VSrd-F z!D^6v%19KPoH(1P7op4=oY%Nt@0jFp9Nomhv9-0;)6;{RD{{)lMJ$uRLOfC}*aOJs z{{hk@(z74@{Jy@w$FbZSh=)%`rkfIRR$<-;bw9XS4I@1-3EOILjVO$SDHnKdN%sq4Ep|}Vw{O6lp-D)Dj>v9dJPXR1;KYT293Y;=O1x0s=Vxx|(7cTTo5@AK?84Js?c*m23)_ zE_kK|C*05Qg2h3Wg3)HfJqh8NZ{OZ{ACs@8_`lpxci8+D5C zJqhf^SoQaAW`{+}sYro_Bn-_AY{kK(Ta?1tQrzkfg@scs*Vb7&z<_}$&Wz_SPE<1} z>OMX`i+oRFYP2Io@7MZVdcS}uuFK=WUlS(?v|94 zoObqKv&>d4m=`M3lD~|zQzn4%Z3gH9FmvN;N7yfr(HI%s?9ccPb=e+9YHnrKJzszY zJ(WeTzV*G90em)aa-FxIP$L?l8(1mP;twdX)T0I`dT1L7huO`j@npf*4xJyU7#Ny6 zS%$JI+SV_R=5C2~!iq1rhLiDq?6N6rRJaE56}ecZI=5|VAzskXpMCoDiHS&#j(~`O zAUii#zurlPYRdBFn9TtQ+FU0OU^v1Qk-)rxiK)CDZwqY%s`EK$-a>SbXlTA`XT3lZ zow{G)H{o%-W2&V!1}zzinDO~g1Hf*SCH4}!CWHP1*0&DJC!bftHE}@lfv)gl!J)xv zg}S8$x(wha4vwg1ICI^QHc+aJ!EJ8-^ka_`Qut@9gPw=QfVzO$wbszSrTAm^f zE^f2O;ipwfZss@v`)NT`okOAo5(xD-_f<0vmc{4c@)u*&=prObuj?l?HVWpJBxT9` zSM;_SXJ?LMY?&Dx+)1);e!=~0=Hc7EC6IYPC|bud>zyEZX3|4^&cRiBUTu>hRn>DV zs_=ads7jIvmI(47b8clhNLB%g%)I_4KlQ7+vhtVWqb6vbFvP%|7}kupg5?y)T!A6f z_7tYQyazx=FinehxWS=&Qd-kCx4rly#oEyKl5$N3dJ+`z3W?W9!F^yHKPq1fQphNc zzVt;XdmP0PSpCs;fnVp{QYo}fzj-y7h1RuPtx?0izY)PnhZT(}HD6Xk&(G11x8H4Y`dzhu_a(yR?b0)k0{c01^NkR#)#enuLS z2``%USupmE&-t2x{PQ;3!TGr6!SP_jlkT=Q)9pWPd%AhBa__{cbEd?p2Y@h0g^>{A z<9}OlfTTlVrQIFGGC^b5n+b^eu>EsnN0@R)%Z#N^dA@ums`-H|DL|E<#!4WE2Vf$1 z5}L=(Zeb-eAKx)FRxpfV5_ffV$({n>SPUT08#9Al6r;BV8%{o{W6tuvNj^amQoqWI zP(lUnc_IK*RL~3%JFu2^qpt#Q;%6KRYg@?tUNphl@_;m6;~nF@D>B7koU9zh>g4e1A}ZHdlF2%ewK%YEs2MqJ^>8W z9j9eEe!WxAcU!(?d~6IDm+ksk+1IaMfvaZ(IWTT*Z;v;)mPUYjoR??EyoZJ$gheNj zQ&13cS-%VLZD*(OLVHKf2LgxgQ}xb-J<~lRt1S@Ddv}}0$%H6IiwP!g+KQ`u;UhEb zfN#K`2RFLy?l@fy`o2P60nhvOOIJ9Jg#ar@wE!|Uu=}d2s^Fe~RP@DwJmT=(^F5=L z!5l0uJ@vKz4D<>FRa3r6TZHHJ>p_4@2hs0C-UNJHkr&^tR<-NPf%V<|YA&#}bQ2J1 zVR8~VDQQo%9&BZ1cG4+x8=GJ1l9PT2UlPNsY{T!xsWZ~_=}J~I-+)B$<{EZ968$=^ zIvGu`QQ1TJ_%DK3iM+4=bVWS^2v1ONYHn_BVlsSyYxVY1Baidy@M?5&#wa2W>P2ZZ zPz)Wh%p(Y50zC^$-|NG;{CqlhaWNw!>Y(pnz5`w7;NdA<7Z1tA!oqTJbgU>ZpC=Y^ zC!_F&)dq+o0Qm)8Ue-`z`2RCtV!$x7(*B}6m8mJO-gq{JM9xTQT0l{Un=>sCEy~L? zZ~DcPf!()0-Sqs$iUZ;Ns0MKFcOfAszu(?saB*~SFq(k8&t37Gh;$;93h^mfIih+(1?h>?rwan0N5Zvb74}z2L-1V>W`}>Sm)&Y zaArl*c*KC!V!ksH7&^ok0Es{bmA=FT?HIw>^b@R)-6K5ENZ#ySTW3#k6rtzWrKET)@ z9JRb`QJ>up5MHxHCm>@S5rzZlM2R=$<+a2tfQO8XjaO#b0TKgMgSRNi$})yN4G=OW zm5wMBBEDdY4h;>#d|>ujhAh}7(0Onj6Jb>|C9vI1J_3-0J?Jks3t(({ei1Uo`uh5N zd2V82-#~vO%#Gv`1B?PZy*C#k$G&Lj(FbQIYo*Xg>S1l%Po_affryb}ny}v5VFscf z4|uY2^xZog4&&_g3K3p6qB9PG9Osqus6nOgP}c9vnb~#sqqrk$P_6D?pj{ZaWVK)+ zxNA9O-}JJ8ya^a)GV=0ZW;M3kY5LqHA#vH9K3_`n0U?35iS-n!7iKgnn}x~(>_h+Y z&2-UgXz%D4{UZ(?M1q32LMGQ%eAw4{?Pr+f?(rD_h~q=; zDoGWB*vKpWURru+Bp)j)D`$X@ficyalme`V(&ua&7R9JcYjVKvlk#26XNSX|i;Dqy zTEhTlrlZTB%Rz_^fx1HS5tLP87X5z04=dE21QOfFXHdw{Xy)?nMHepWxjz2!A=h>APYfEgU=GLXeJvnhDi4H8l{q2>Ai< z1jVU#G`r^??13L#f03v)D%12PB zpq{WvTp9hOx3;-yFm7{Mj~^_3dQhJQ&o=+4g0h(Moy!~^>{Uhi7J^6#3fi2geS z5~$q9&tmNxH*PrL{DFdn#5DZ|69E=VB0kw4(lqdT0P>Vhl@%Az!}=z}uWzEG36L{r z@cF#4(fU;Ys(>I55oZuXsVh)38>aU?pu<@ug^c*YnORv2hyOyUf8aJ-kA5N-a*xLQ zv$VtmN;%3;ZDRmxy4@SHouw7y%Cc<69YgNl%Ut6L5CAJx~OQ-GjVl=FY*%=>+$E z#}bRGb!aHc5@w*}iZe=yu0FFcLiC$L+Y}Xn0|{>|?Z?X>aB!$y-i&^p9b`wz=Wx|N3qgYQ{ys*24s0%`jft4?M#z2wZOtEfCrX&1oc}owx-$&v zGyzvT6O(x$pOV0gKmo9}UV{S}ASs;#nB9}h2LSEn;bBd0^-oPgRPA+8`gGcZOn5IL zjM=zMi_q2kXf{Z|WqoUZU$6G%3pckTP^ebUA#VX8w$ss;i;*S|*Wiv!3{=7P-*8;yV;nxuT1un-m13mBMtcgSfu z5$@>+H1BY5a9%rr8Wt_Qeyv{)l+)Z9?VDf$kH3awt$N|e?JIu2fnfcMAri*6Gttp$ zRay*yq8WrsUg%zjfw0hG{eh9*US3`fddJWIWOIVW|E#RYln$V@=rB?qIG-aqiN@^$ z1_i)cY)s5_p7XP_3lPN__ikWe@p~LFQPJ}99>MKf245&A$F$9$Z_K6|o}ZPKm67qn zE8rG%z+QNpe>4SDaL#CLxD2R@m8YPxcG^@1WadM&2W1xSXaB7cOe)YfW`G;C@lC?C zlLyYaP*}RYvI2DYPoMBKib83J$yLnLy)ZWL$#}4>8H!ACO;%{xJ6A#}6>jz{u(BeD_#QU43u9>&|g1 z+-(pn@A5fhfAgTzfyDv|o*M;L#qmLjg7Fth%yO|eq!iD9hRP)%hUFpC4G!DmEuz83Au0(u+4@Dv5KD<{BTLZL^(C~0YdHMO>V~~cSSHjx^u>pkCa<PrbP)efzuK{>HHAki5s-rMr_cZfFop=C5g%sYa1H=23<#{ zk7CK84y0P}#oXX5jFwisnO!E@@0Yw-j6ws!KfG-1rr>LkeD53TCIZrYxh;W0{ z4&{Q|{(x-ZwTt9|xveH+4XS&75haw^`xYsQEW{PuHOZOSDgv;)n=_uJ8*eH-a zyG0>52D6`PzEU10FfN54U5hxQXjTAJReh?64;(-^-Kd#iAb$$D?HvB?lWyI|=|+^= z)BBKyW)66>Qv-Cu5z0d>=Z@mcEpSd41h50d+^6itIzhMKI_Jsxj4%fuBKo4y3qTOG z{3$5Ge-euvrRUZYuv@YUu@UJ6P(iC;1oBgfw;@pXh&=%b01m9z(#+2as;c-y?Rk+` zqOxi6?_|}j)er?MI<3=%gixOz=Iw9J6z}{AX}fmKHG*Q}YzTs9gAQFEea6Sm2(?UT z3rv`wc{#Ya=-1e#fI&$)jVA{FGXWl+FVj5|KB%FQk7;Qw0OXkCCgCP^pFmXbYfn!o zGZ8WH7ec}jSm$p37SH34mYN#1IRlwmOkugWfv^>4E+yaJjr{Q8_u^)Y)kq--T03rn z5VQr<3LQ;dJvucNZf`SK#{awlkP+M??tSO}aGrF0u@LFj zr`iG;RDS%AI;Hh2z|XWLYEYV)7bF4+6BOX|-%xv^_T0@ z*F&J?H%YmR|ESLLLnnUf%^@VD_c$R;n)X}wQokswm&SsB*ndZhS-(*WsRppE!tm=A zlqMX6Q8ip?IRr{eUy1+^;18hd(9Zz9sum1GhXZ?LV4w_6K>)(z;pYD7l3hqQoE)dE)X}JQ=hN*c9vMo#*IKPUX?*mAqFg7){8I)Oy2;w_;vRJ>U`H53QPD|9ng0AU! zc_0h)|543&WzwHNf9jc3lD~7O)1xh-7EUuzR=!VwHEvV=AC)6GSO$*nNlT+54q{KA zww(SI09OWJce*#~O%6~d!8_<5B_*~oDdxTLUro3{UV;NJ$~4+5H!3qfe^&NZ+mA2F z%*=!)aK6*S0zcN^srZX^)? zZq3i8oh(1;2(U&7m^k_O#LOxI1{P^u<>cmefpv8HTMk_sY8Di8Xq9ld2D;r)PavLH z^T}!vh|vXJP42$#Z((m?0aQjEa@pHkhZ*90Qe!n@1!Q=S;FVY>oJ%O+tcavMx<^Sl zgHr1PZiY!nN@6teU#DvA>$5*Q+K$9|rpUdYu;A^m$3*jUu z*lxGQfH>%#SIo!BV&1wH5fV~Zd;cwv--ZT(^B0b@-vU^gkFKm;(9y{%l$a?I1sPk| z*%e33d;zB3b!i9-4}V~0gMHe+yARue)3iGpGAl)QiK1d+syq(u>V*uyAaZifP$z%q zwjt(rg9=45!n}W@Ibi`Oe}+PZL_{c%6HrK1SXW;U8q5Htp#KM;4bOUQ0QSS3+69?y zNRI6)2F8y>F1eC29vcXGmIvA|)7rSmOjfs1dfwmOuc8$GrOvWAS)|YD4R8$|<0jBT zy2p>7MUHn8H-55t#|9~nnHG_zKOOch=hZMF>#yOabNv$~06?GTw@9|_0WJp-KB3oa z@@EN3KIbj9g7Y0s?)#aKRFRPRfb$rAeM+;tG7K?;*08C_XtIFg{5f({(Is2@tGDEf zSX7=B>A6!8AU5Z^`Ce9zPnG^~gz;~Y=KQ?Oji9KVv`bFC>fSHI>ZG$pNN|4VQAyed z|E%=Ep&@X?U18Nxr>Mn%=7UoQ{d9AFUVWSTil47#QG7w3lOMxB_0Sg|PRc%d^hij^ z3rrp-oKrZd3tfTmj?!Hi6|f62Fdz^`oYn^}lNbmOV0hQ*GVcz6N9+ai3+&^e{Zn8m zqj1g*2-P5^B1mR3GBQ9#uy5QLm~UET#s&?*-2Bg6)XMCWX>)FZP*Xy3y)s8_MMZs! z{I6f%3XYH2hKmn+PSqEGW=%5i;ZoOrBi(U)a-tFY5|00XqzJ(ZN-#`7DAFxA>4G5w zo$9dE=e)?pK#qxM^syFVO0+=cf6{WGEw7&7Ble%%ciWw`mo?|OEe3~wp`J9y3*ZBR z6+qbc@shj_R4q7ZyPl zaxgP4rL~zxmL7t2;*^UiGtsPfzO7fE{iCSKQ$~iiS3_Gn;jB*-pkEB}yWn8RMVKkR z-dm0oyM9cy3jS4$UI)O~zZ`IG>2juMRKzk}Dc%zu!XgA*meYc~ytU<7F$yA7{_#mk zL%U|r)U@osg8UBpl7aUzv}YD@3BkAled)EJJ}?|OlG3r@fRd^bXT;}5e$9xSb`u6A z@vI;p7HO&(c(o0#EtJBOY5;WIrjhJV+Fj~{c~|XOW^t{p-Ne zj4>kp6}yv5>w3~U1;P5|GS$^`Z$v^aejqJTO8V{ri+2MsbWHy5n!H7IO=T1AIrXv1(6 z10gyieR+KGqrA{H^fikuc9K~_Bn(*exK~;`uX|ep~XFS zUkWe5Z5ioCB26b`^ITv}_JCQQKp}%p0U8SpH8lWX6HCi+Ug0MxYLV)0~~0 zLev?WP+AIoi_7&nn9K&A+ijpKYJSqy&N`7t;9x_q>}NFPkHaiwQWM^eDU*9n;BsuiQ8iAM31e&%k`RiVhd7@n0Lh==>t$> zL1+#N3W8yE#}a3m=RKTjKUay3QrlU{YYzx;QfPVqMf4O9;6Zk_>OeHTS$SpdXD^SU z8E@l360vs$O-((iLie&H2a=H0HuUc!N=uXS*~+v$SBL4%9Kk0+3HqDL5S;|4@FYVK zaBAgk8qssqmphP4uz1GD#vXty$u0n2*#OGX+~T6f3jUKY#D3pwnQEEVhcp8+QpU4$ z*XdND0|^PA2aGBFH*hJOK6xHE{D^vlyV+6}VBq;8XD@7|SbP3gU5od%?EE+B_lsCs z)Gv|438MGMpriehtWSMXhg)R`5(s%9_zPjo?v&moct)o+==P3Kl_=zo zG;Qzh^-%w-q1qMxGoDdgcF8Nn+6N9jxSeyfk1l;0K0Yg7U?g@liFm{L2t0Ui@x#>- z#^ZA*%XGhiY-i-8a;mJ=U_0=TZPT42`Fa#hWbbG!{D zPD&QB*VS5fSjOXXTHdI%#BFdTeP&Frwt;o?=6mm!!AIxsJ~cM#!tz{w!+uXVEiE$g zYxYAyic*jX$btLKG&g}G2Nhb-{R|1;50WPM8Ums^i&fE9;7))R2jLrTm5wR2VK~%? zxHK^oRn}=nW3MiU|CMj_`^hKA6W{rMeCAlR)OUmGhg8I3TWh>QgPD!#gPAnd<4=Xu zh2Ku^?`Osd=kwnT$t>D><|&essLtR8P%V;1>H<_OkY?#NXdcDSx)Q&cc>xgPCW7YQdPP=B?r-km-FJ5R9?qC%BDwlmwRwi5eT}k%jQaHv0egA!% z5qxQbQ>;3J5PZu91a&r{Bc7a`I54~b6>W9(B<=Dnh_5Wsz7!H)sBQi<_u$|)#9fk@ zuj3Nr<@LCJzL>w0i~RWP-lumgJU_a6`;<5$e+GdU0M!h17P4Us0+4pPMb2NT|L02o zKZP-Ey*)f;rnklGxp&msYGVCMs;R|m7|jjddb4|P#xc?!u{))zNf9ltJ|Dh?qIt6`1u&Y$olUm4qNG-L5-jEEa5M>2#q3G&l*{{%`AkvXEwnM(^QHNh(8}6`O<%vR_VW{S-2M2O zb+*CvPcf6K{ttHUMP7a#xNB?kCeI_#tT7?^0#eQ4j87VbWgtQbXT{YI<{!ebborHH#sclC0mc`&T~Irc=&Vx4mo~%@!ba0&(RX=feiGO{)|+b zVjcsZb7#<=R)+EbU>yQ$f~u;AuZ7XkDId297FX5PO@!}}pyq*H4u%ry>wms}&4A2> z4&)5e4^+8rt(bZ4$!g732-*(i5?rqpAlKe- z(D&KeP747%1deL24XB?WzFVC5Anffov$JWHl$0K~VIaa%;Hz$Uh4t?ngal@)F7-V! zGm9=`GqsSuc~c9bTFBh)ZeIHt9YHrk@;l!frC4kSvw!EMCEmKHy4~G4UJ;5*SuHQE zOpZv(WKvaod<9*`&@eD9ZDV_`zU3;RD9vF+uOuzLgp?FVRy#zuv9PfdvVfdHM!jfV z3^X?&*rl~16@reggLYNzHxcfCLmTI_WK;(KT*akojsFno|DNojYvT?Uqe0#6KL?{N zW=z%5#xG24I?Sf-%kV@W#QeHTM=!^dNjnl=q#MsaGB#`~Yo;qYSVA%ti6w0BNO^ZM zRx@kxy~dtblH=sf{gZUG<@U`*SzSU72!W_4gO~W{_iyF#0We*`^$9tx3)B_SeDJJG z+h5{#8%v&(xoP1{U3n_ki9=Xe;05#W4zcFp50ZMZsgd(o=UHYeamz0n)uU%RH+zGz zpRFs%+;~709sN;OD_UJv=AF8{iYn2A=f}y$t=!e@=_AF*Ci%DBr z76f-)UalEZtBn&vYyr{+41akZugARsF?jW3QRQ*3F+tL`fKgeDV3w}B}LEVsC`&ooJRBp zwi!LvE~ga`Na|VmceYd5`X|$42~0%#lY-0Bw9xgLnn7}bV)a}uf4s@kW@>=dveol% zCg7`_Ku1{JGbz&on;rHGd_&KO_G7g4G8M8Xf`C#%5e5P;DJ2D|$cgcBOL{m9u5g=( zXveJgh_U3AgVkV-ea!i|1J~MEY^;BuriV0~zxfWb89h-Len%pwjz4E*bJco% z054VxZ@~G99{w<9W~R}TXzKe-xbk(EkCJ`<+Q+iL=l$NR+mdFUCb;yA&vB`#=sn9} zs-r&6GoFf-Uv(8=8^9Mq)z$IYjUf<^77Usuau0sW73Aebl3~{|apHhx40N9nVrzdaDqC@vw@ zN{o(+i-TM&8Cmkjk7AhG@by`+At8QmXxZhbs)?|duw5!fL(qjTZ1d((KX z*6`o|+awixt0<)jC54itq>v&dr9q}5g%AxwDxuJ*q)3y}Acd4nWoS~O$&`>nb3`MG z!g(+I!SBice_rQ2KKs$$JAJM1TKBr|>-tPrgSC}=%=ujPe)*4@J~#Nc1WPGgP5ZE} zyl~M3tvk=3dlRW8Kt12TpP7wDj6?N&-F49tOe>R;ZNeZv>c^|#t~Kh5weeEzReOcyukH?;9(37y!iyKyGBRT0ZI9~uy-f4oH$E)!OZ@no zSFMun&Qjag{a0yzhK7nEttu5N$TH+3*FZ4xv5JXll3P z;=*^#3~6ZCKTvf<>Vga6@(SAn2w!PzYD!IQ>Q!_v*l3+qf)1dAg2GB-U8<_8D32E} zTP9NLj8_}pt((V}lL`y+)Mp(qZFtvapgP|FbAYtb?^_dtj=wBdnmF+%k{U1uN-A6< zHvkENE_9%9fN|NmkZ+QdfomMT_*qqz?f2J9mmUh2R!BXtJUcuh?8~b?H*dzh4M>N! z51)0Au$9<(bV*bATI!Oy_z#^ z+B6W_+M1f^@bzn4cb`*CN?!ahzuMMGsqY?=h>)C#M91SUTu{Qwp4Q^q4p=7_pH7K; z6JgNRtLg@MfHIM)R(GGCvC8s6|3s2e^14?UhT?-Thae>BW7|DohkYqKl2Kej!b_kP zdQ%tcji^~5ur;-Q)5o51d2-c0XK8|^{PamjAH4Mi!GhJ5`y0GhK{tK;IB@7tQ}GH~ zC&UQV3a%n^P;IUNlQn#1OsIJG9XuhhSA)D8)>PpLl_>>~+BmN--DGbsUy00gO?~pR zWy_q;B_zx{Gq6kHSs^6j;uX+%Ez7=(M@YT<@ZrMw^N>5rET2_`l|+NF=35RMb>hen z$AT`;hPMyvCUPFuty?#O%FfK(b!yt?AN0VDHSm03i{X&otFJcB8ww9st_?`(a_;GJ z1HRuPTcsIp;02!Jh5R+I;P!QBkAlb(44|Kfbso5j@-M@FQuo;!}g~tcGg!f^w z2RMNo^;ep=B9k&Q?(og>ii-Wi^-iVHs#%WydWKG8v9s;CVNF~Fh3dyT^F(E`fo^OZ?arR&SzBz_BHvB9kCRk4(fS#HLFkHH zGP7(QRY3irRU`*#1W9RdDsUIT%&aXf#e?sHVI|wV^@YSikW^fBM^7^P&bP9GqJTbi z;kgL~=*U@35TQW_O;gJwvD7_Byx{T97&}95-9(XdZ(;o|#u zNwM_&E;XXZBgFVYtZ;5yfe(=~ANGr|KMH%0XqmJ_N&`Q;d3W(bkM#vSjpX|e9-wC5 z-jHaMJ|EnF%WVo>Q2rT}02;NG=~s>&vuYcP%M=FX47}tBlo7( z#Cmr=bXRb2QEhfcM#hWOPkwi(cR}x=51eKrj`4$VY+79|WpFYoifw3olxUJr?Qgvd zQQU!}NAl?`F|&<;!lET#_l>_<4tv@5mPR0~Ef--__wL;rX$PSsG@8#GL(LTx^$P1i zOr%-<`oF(7$jO~xwXf7ravmZ)hq!e31yrGPhug~$3(SFbKZn6bHv z49Qt?lsFH?YXvz^(#qh*=R1CIWPbnk3$5H0vInCa8$`vz3$xzJ-u^Xjv$#CR1#PeC zfh%!w8NMwV?&z=&?&uo4OVhi)9Gx+e4#!N9`AhWoEGP} zYE{m#A&@VD@y{odB*CI)HKKS4lIqvD?*=vt$UbjfsQ^vYPu)Z{8py-!?CcEkc#^zp zqgRd05sYV`*k|_TbIMfiuzz?qHufWFZ^W3bQVa?|a%7xMTEc}3Mx|%APZf5}+m2wa z0(aej5pmf~-y5*-Pmdz!K+!-fD+ndfIEIII=-9fY8YOvo##1Z6p0<=6oBHj*?Go&@ z2UrqYxzzM(zpeCjn4_c&DD3&p1gx2vo8!(=^uDk!J^dF46v3FK$teb~?!YFGe^HC zmMh6d3oS9wjevILJfkW~c}VfGe_xR0p~j@T9PBXM#KPC?!V>*yrE!eqdTA6mPE9u!O`!Nak16}Z$iZJM7n(-G;bgtLDO`i24sxTjD30LH))sy<~SW9JwCY;1g1 zTwLEvj8CM`KcuVBZx2SlMT-_8{p;`A*Fcv?%P!8b_M_!*>u4^}zEZf~XNB^;ELExN6r&Ox?7@ZU&D375Kti|<#})^#8m zaebEVnP+PHY7Hm01L+og8x9nN0yv{s#^J+UR<6987L(o-KQqJUNTW?ax8wew7nztm zs_`GANr!jPkbkeP_UE$e!#EC>T3EzuD#vgWU#7XsRYpzNw#DB5Orr?2r+H2Z@9kin z0t9XIZlJSxIwXcsRi1+*@(+ z@sFNs>3P*H;h1ilh}YS0)~v$jliC}@hijxL3x~(xgr{*IrcPErK3gG-03nY0biD`- z{Bg#ym>F_s97A2r+-q*(>(a){jFwXD|IgAn5 zRB`YW7cV+vmiP8M707R2-F}1D=1k+=mh`SI9+ft>JH(5~-MW6y6uqXRiTwI)ATa!gvCH42zZn8VU%?s%>&|_66F4w`; zsG>p~q;*9_1sWjv%dd%4qD`se`=QTQa~F)Z$PxDM7xY4Gk@LiBpIs{1(|>Vf`~&r47u5wBp6C4%ph@$-BQDAcRhgvX zfPIMJp$&RU$R0d#;?c*SIXOAB$mQi?_b?^Gj-71~Y@3$zJ=jfBNIT4ZzI@S4`aG4T z2`e(U8q7rdb-rg7Xa0y00cp71kFZoCBAVh(fk>V`iz2i5jfH6LuFZU@y3gqCA=aHT z;ZOAR^u~=laHOE|*DparMUjmk(D5YsZ;Fr`X@5{r*2oIT_rIa!gB#>gMLY-@bncVM zW)+DXQm%9F-Ftj|(!S~NoVFbc!&6fyZIwUanm>hXw~rV>k*|))e5m9saFC+9HJpJO zwu0+&&YXPeTHf@xuV2eYb(@0^Y-J@_&i<$d(gdP=-GLdY8ds;Z#KMA#g|&%3pboIN z{`=RPf&*j@^#i~pg>O7+n=S0QEU@x-A!~+^k$8!FbFoU-98_LH8&eGA!dS|js+G&atgGY8~opw4FFw2+Vx zq)qrzw9KXs(Uj`^g;Yr;<%ch@U=IwM_~Fs`TQBJ^c`0aGP?iWe0DRK(if!{vOcKXL zu*de^o6(C6YRKfZCmZ|jw1>=T8^6z9Hp%j_dI*3p3B#zw|7O;)V0m@%`mO}JlC-@! zO9Av4Y+J|Uo%r&9Pai${so~ApXp`>$^_zEyk+{01Y#d>?2&2dv3k;<47%D5PJl$wZ zzc~QVt6~MwnY(e>*+pWk0}5fDIz61arshlXhi!%?>*5WCqNUCqt*w3ROIYCJopM*T zdefF5;POS&=C%pmvHq-c97kpS7UkNCvBmH_6%Aj@Qw@(}x7~_y2~QiR$&s+NPI_N{z)C8?z>dc%JWBsmK#>@<~Z*}bjr4llUb-nwS0jW-re2xhghV~JkI87I_F z=(4cabQaF+y;Q&M-&M>ccG`1OTr%_Jv^>+Epe}H+Irmfh;7;M?S+)Y1)?4#!+u8(g zbY^Bx=(`NBN0pVCPerA@-_44`#q3}T~ zYOR$qU=sQRbnGABzn6s2;t{#UjqbGfoYLJkxNqMiug^=Zm#$>TySCy4pAjl1Imt4r;9qD->pp+}T9G{a zsSnQZyKlb($&CEyBWmirZ%w~_{k~e)_oZeVu&>tN3TFYC+9UhXn$YRe7o+{rnKDIF zyXW(V4_(=54bG@5Dz2i#kvsrBPUlFio}xpJ$O7G#dvni3_A2Zuye${2u(O44X{St} zc4*@XQ*xfGtLyNM8)L-8qSp%*@sva&_W%(%25}7@%-*o?$dRRp zm6MYDqz!XiNDBvyfS)U*8=44zpIUI-)j$_uvX|aD>xWN$mWn^bRLg<89 zs||%`$d5I7U`=hNrJ=FNXvytC!mqlXkd@_|e`r*Y6z?-Np3;Mf5*vShFn!_e;h|7k z+WX%zBSzFaAv^PLfS82R8AZtzi#`5^?ch= zMn;BqR#MhGvML}T;FiXT2ca^<4jHO(q*&kE`^1f43X^}Y%~Dv%A-i`hq&f+YYGx>)g$WM^5B<3-XwiQU{3e0GstVdxbPf_ zd*bq_h3PuiR2ZKqq&=yrS&^0rKwV$&7Gc!gwfBN^Je0LGg1i15ehMKkOY#=0*l^zf z)E8EkmQ;27W})*uOIsR6l-$x4N7*!lf)lTS`RrE#ba^J5fJVwMn97v~cXLIDAQC;O zt*e85M7=_hdd6t*RF zm5*P%?!;5RcE|mep9(m;#M*kSlsK3O=NF9*Al2ba+4x?BiWo-i{h*2H{m-wjOyQ85 zvOfCkQ;E3X#}{sRY@9P=dtBhbz{_e$X-mDNM1@n_-G9_{ak*1D(kQj#kDiRowVO{g zCZelT>wCnv6RWmKbse?!s->zQ%aj%o!z|5{xIEZ5&6F##jb_RSK*wJmJ$Tr#11URA zh`+L!vE8~YWpapp-nrQ;m5@eN*HZAhFr1?FsOj=y*j zb5AbXV&|QLqEkq%eDF54#xS7xQmv+t1?@t&?etOi%JR%3O5-Fm{5y32)N!;xHW#e5 zgdv@VQjX%F@XLSjckJKtGloLhEo#Dyhq`9S;K5|hUcptyjz=T`-+Qi|-L0hbAksJx zvrc^Z>ec6e1?Ng+n zTg_1&GhD`f^3pC#Y;67W;~ta>E%_CHcP>!KA9b^JncgLB5@DGCOsu`c6TVfeIOwc zIk2_TJ-3pe?@U4If$^AsidQk3rotNtic*Ou<9+AB;$K=iX>`gRdHYi->46N^vME6~W&LFy2uFLoa|ARM1<6NL}pT@R94u%G}W zOIh32*@bISnKa3KOUXO~V@SoiyIn*zU28LX!=`)LHWbG^LZfR`3B^FT`)$m9-~bfN zw03{lP<=_A)x4~|;Z0CPg!!Y~f996`O%=wbfP6Y;B4b70U}m=D!3_;^gV zIB@duR@d)5DiVFWkm4{v3U3He%1E+U&NMJ^{)6xZxfX}DIc-z*GqJ}i$o3^$OL7@Dtv!4?LD}I)~_$60MTO3@2!JJGOt3;D?9o=Hx6ceFfkIppiwQ z-V55sxW9totAgzRPt(gO(0cUj$=Ud-y!>bXI4>JIl1MX@$A{78R9@GG<9k#PM3A-vlyOXV$$cIe=fYD zwSZ*Kc~ZQnsI2!`@^`F3vDOcD{JCWa2*~Rc2ttUEN3z;0@9h?3T%_aNY*?BZE~7d0xzU&^l+%C} zZEbB)QBj|>&YwG{xGhj~?AW;cWTvHw_2^O5%*&zU`6>F7PZ!a30(V5c9@ONy>&|C=J07S1d8Zv!qi4%;S3@Cphdx1~|qI5{{JHp5Fv4^R1UNv-g07ZbZaLwfz@6LbD@eAgU=ZqUW*)#O|jxd^k~e)Tm&sCCxqh?A`g; z=ng=W?C{}wyrj8)7m08J!(r3~u~an88h#ehoBKsM;1oZ5^5Tg_mc}pAN9X3owRpBn z_aSPrW_hl<#EDCJi+|!Li1L%8fAz$?Z>%<>=MzR4+@U$>B@b{-owd#_#8WMuvV|<3 zBE)=m!W6=GfAODLHg&ALtw{8x=DQE;>4IGO%Uk}pI2<*^z(^8o(hsEh|9;(*lg~lx zCC@($-9dXxfqy@Pw6a4#m-B<}s>zq);#O7?meIR+e^EfPAeEVT;>xXdAihefeCFbByyx^OOZs{oL`XBK^a>QA~Uh!Zbfwb8oN}@GG}$+47$-g`P*Rt+D^Bwl(aVkg$iU7RgKz z9ow%^bhlODAqSt(eT?6?|A`9R7u9$ZGGwQiv|31FkQUa^6o%IQgp;8`CYC&O&mOA` z&r6N*P}9e?H(sDFWmT|&hmKnKGVrmHJ*^;Nsm80%PSP%C*c@N1en>mLjpoq`Y%X z4t^xecnP3Pk!3wc$4k=pyz`GF_O4Rb@9&gMul<^}?h~M&;y#pS9X@o(s7;9Eq1%Z& zAP%pjmggp|-x=F!*{(4vf%n-i!}SB*&F4^zpE09jo6OSIzM@92n(E+46R-UXJ^aRWsWoVC@{ z{Qml|A;J@ZAdwJ2GffS`CLB@q!g3U>I7iv}P$GFbd>452?GiAR=St2>*fhmjSEbHM zPK6?tb*Fi~X<&fnsk28a9UL7|^BZIwoD^~DQ1Lhw6Zzq1Y;Cjh#;K@m`Eg!#lDV19 z!q-=Z-%WGhzol8zV||UzloWU0yQWY`Re?PttgK}I9p3x%%To18lj?X|s;88y(-syY@#fR-w1IzGCry|% z%5>Wqhf$;TtZu$^yBl;U&v?;t(|;MOmz)&yzEW&N?7;E64=?VsZGiIPEgLrIY}{x* zyUScN+xbCv%YuV@T)HH4?3m1+J%>IPy!W46P+aWsSaz50w#Stz3+MX$*jBcE%iPHt zt`>hXQ+`Z5asIq_>;jc{iq9T>E_-iic<9HE)+_1~=Nwn8c=5YUZpPZRriUv|C60qR zpZZbe-8=E(;-G(rsRsu)9z7Bmxc0#Tv4$75HZ~t;&oVxxJ1R)l_eZblS8W})RP;{g zrT1Qbq`3H&-?OGhhtRQEo^!&(9kf;%mA-v2$v;wg@?h=a^BX^=OX|+ zvkRW?4c;r0;?9ZaHg+4&I=}bNHM?a&Qg0`$@{IB8yHa*%-+iMZBJS?kaa?DU?4`>S zB>w(wZ{4}%_tX0SzSplGu9ID*TRQx`q~)oxb#-sHe`o7csZ)GrGIwvBu9ZTVpg9W< zUt(@PXZY&a`oGxD>&-sg>DI&7!ANYe?YOPR^XDV|tgN(AmM*@$O&Q~LnDO}l*>`6$ z^rX#HpZcxSU)cBXVa07L@G91q-Ny$gx77|x6EKr%T<15$?_ysc58txwFIL`~tR86j zllVM3QQgyaA2%nv4pb9h@=ijCd1RV!Kq2o!XXD@^WTRkihN zHg}@L+tsxW(50&JBq|2UUcHji(>HC{P)pYegCRhcR6M+SbXCn?Ucvcng(^h}wD;y< zk(nJH{@&AUP=q0P5R)9-c)H{7?Cr5VO7BjW^I=ltCz$XcsalWsbV?lQ`$Iy`6Wdzw z+-`E2EbI+;j((=-3-uNtmf9MNd4Qjh5fLCI!=`!~_loQ)s+*tTdnzeu!{N7B;yFoR zLmeGQZQDmDLSKUF3_+XLx~h{04_{L``wKGob{V&15kXp{VSLwwcJsH?PMRD z;QAVUOxaP9hy(6@{Mo5RJErH~jtZhA>%sfzQ{OcA_CZrZcWZ7g)4?g`KOB{1AyK#Bufx>R8^f)J95Lf#e;|yI;iy9 zu@+00f|o`~6)$#u;P9NnzoHq$3D~7RdC#n~JnmwYo)dBN_BSM^=Xe~*sj6y78tl_m z2JYA@>NI7OKMk@WL~GpNDUf7DaeuU?WF)u(;=%JB-Tqb2lUot=Wi32sB*2FA<5z>W zsC}#DZkw8z*xc}l;Tg4Au!!=%B*+XJ)YAAh%1G{TSXdINN-x@hq&+>qrAUi*Q^e9C zYHw6}wOm16{TtS$wA560x4+ccwQ6{NPXm>dZjN~H7T?nz-60E1OmxU#`f){ME#3a! zdEA+U)3#oy8_`~zku-4Rp<4<|%$h=SVJyQ0%~YY79i%;xU`*nYX@HU8jxEfsI5lna z-L&eItc!QmAKP`@8sl5$9XxS@{EsI#T??hjpe*PZr)a3sA&e?@a)OmSrQ2kCb;TWy zHT1$Wvvd25V67(W%m|U4aQ04^uWknx`&XSa>)@hzgWcnNO!Ea&t{+8)*Pcx~z|2xo zj1~1PzW$S8e5bNfM_cQ!>>8p8&`z71IR(ol_UsiBQH6z2nZNU?JiwQL+ z1vb1T!bl+uDI!uBY{wL#J$v>ndCQ-0LpQJ&)m5({#K$c&sXn$j_HTz@?iyED=}mp3 zw-6K8LJRmwv7y8xawBg?R>rIMLq$))q-(W?G7aN=aa(ou zOb3UF#j=-1HAa2`d|h#*y~Yv=P* zE7+mPC*nmv_lmdEUm%M6imvD0y{j-~%26k+po7|IP>^=C4m!f+K=-lRIKLj~?XT)W z^bc@B8lSd%tJaX8i3QTzKj78?V2wHKc6i3{L3j_cm8DLzR(EjN}~kppP0RIn4*`k-t`gkN-@w$@$8B(_gGS zX02jA0Xh1M>{;6dV3NyxLU+|mUV!HeL!wvu4DR8v`TO6Nh6nywX~=~h73AAgYJsxmYxXa} zC@m2D!~)8NHlwOCocz6j=!NH23GTFYn_z6N2Y)O!^e-uT{Ac(`YPJ4zn(EX-V4)t(qy>T zJCJuC%BRbNo7V#7`!0#+)YPL&FImgTE$c!GS_ zpTB-}K(bNOpgDf{kL~sKuZbCLZEnaUjU#4x{IXAmJe;JnXLmSh)sK}Zh3~onD2nVA z`!FzWN@}XhfV=ARc$};s>PeQhT>t(vd;V!@X{gGsBnsr|9A=v8aN=>xibfp~n%lNB zz(+!=5@Ldrj)U~OsrNo~>=>t-UB_>*6Pc#I(HesW&D(rqt}fXOQ|S$l|M{Dx;JyVKK*QOZ1il7&BthlAiT?jyqWR?;}gGS z-?1_@oHzd|n>TxGChsuS+~ifmLO4ah@HW4-n+sN4oZR|u1BzOsm};+Y&E;Pur|s{W zDnx_AlXhHpU7d2CxaAujj)Wz^9jugfg3)h0<3~8=%9U?GVV20s1+%mDs^Qen-!yi(1S5&sR?Ltkga2cVZDaOTT@JYUpkGq3U&FL1@Dup_F>oHA!L zDwz5?vt}%TtA-brTlU#(@#2jv!sa92&~Q?j)C3sToD_hR{Y6n?0;7`dK{+(-iJQ1Q zO*4#*gPgU==8vmoKLFBEr9i&Lhn$$q3kmP()(|NeOP|>|^*AmbD$}KE9*qE~R!rn_ zpDkOiT@fY?aJacv9UHWBjH>E9gdwJ;+h8ua_=OAmUQTM_Jz=H{>XQSnMh+7V-iQ@j zPwy7>E2B@WbJbbww{PF(ttmwdZIz&c7Gh8Ls||=BKW2;zCxPdS?Se!p|8QlBOU~Qx zP#)MCcq;IM;p>NrUZyaI=f$Vun0?dUR@h9UzFX?Ftk6UFBHQ^9{+o2!>o;!98NO-b z#?Qbrm){JMk%>5deC%qOMv^g@2k?TS$6tktT0){OBZ`K2kB5pBKu z4aeZ^%c`8ykYiWq$@X-7Hu_fcfn!xvC?u@w&ry4G^Ra)dB*|slON6^yDnkHLHa}fz zY00pA)fWs2C_z42#~jfSdfY4T1(%rlQ4u(*Up`-*p}^uog?fE;4h*vX;bqxdgb~4X zPHZS=XLIVJ3IOJbkBhS&Aq zhMT++g2^=a9I;KkkaQlS$`)Q3rig^01ATVZ-8&9T(kMzP)Ci_k}{6m;+Y{Yg{Y zNXtL0Wcs7IIc;6NN)OEe8gd6`A}>5Yt8_-*nT@O8N73U6qjIE*Z~1rR<{FpjRU_vU zMz6e`KMyHDW#ZxlSy7c(=!4G-*RZ7vt*okQ!o`ckqOpQ`Ch#y2fk;Mt+8>$oxc+(Z z;$HEh(is<_I)ER~M|$!nPC2*A++3rg?_Dp(mtC1- zQhG{L>E8XvAxDpuZsTSI{`ryZXWCvB+go!W{LYPg4<3}vHvXZfP4Mm2TetjI$yHLo zt7z(rOmBbe@8#F}_LFf)$daMmvl!wmGL64iq z{V-8OBzZ2zFd>1TUk`m0aDm~G%vQdG1eF)f^h?>P@bG)%=7#RyZ;05S@X*!MlKLg> z3@VT^VARwL2S$1hny|8aWff$Jqhrh=IIVyVAqA-y+Z8zD=%73+?a<3z=8MlUHO*!K zc3=)^hviy(CAx`}aj*v{fsCSXpGS=U)PZ4l5PaOiDb!tC^Z!;FZ757QEY$_ zcJ8W{+J+4D;jKTxL=sfClg`XKstaY*r9-9XYZ;L!YdYWgTHzawpo1vW^E<}jzR^8h z;9W6v?Rlg!*Wxe!Gi1t$>}*5Bzbt#PbQ(?px2cl8xpOcW)f(vP6zspw1jH_6ETQM!!N83oAow`0%ae}^$~qPiwS zv-i!(q8ihrYB{WFW|08gyQ=?w@4x)3>DTXBec9=*Sf9{xAFHe^CEgt{$XBgpnVs!fq$)=Lif#5Fb_h}6s8_13tD`=o1o_qt?w!55Jffr2x3gp?V*Ce zMiijK4u4Sxxoz5K3m5)}3o86*L8aJCiqL23t(5X9rBu>9UJ#;JMlnf*)Cw<&>%+pr zZ-Lg7yNW>|XE+c1y*$4i?jtHx_toqAY_YlFSQYc3-Cf+*R=p@mE{cp9wh(y&rm))` z#U+YLO7EK1m_H~A*K%Jnl&QXgt>fD*pJ{L2ov$0g!#*bH3I7i+ouAp%={yj9A(NH= zdf6$%`2YLPPp<4n5CcA+?@gRFqSBb?i~J?g@pCQ5a3;J5Qma^t-UmimTAEiwq`$FK z6Y;;fdHm4-%@zF5UH^aOFKV8wAnSS{DF!~mWNy*An6*xemoD|DvIIB$@bP23@<{%7 zfK%Lw3ZzO@(@m7L&HwUIo^U$j8QOqTC>YdprLAEXcK$5${g-+7v1$ zCr6seY;_nHM{{B+}pW||t}A&5WJ=oAj+JuQSkbv?ko;CTx} zlCt!*6iI1QiLbrS1K(XG%U{FnK8ymEp@l&OG(1{_3 zdtarP$9WDS^ksP&VjWcb=0k(u&|jnyK3lp_d03)JGW){58#gxN$g)#2%IA3D)?KJy z;Ig?hi4j`I;5!jmk%-;QXP@!mfJ(S@X`z?&-c4Yj0OEDZ(#&m{i6Vf{tKxuPGIYlx zKC{oqD}7Y5xv8BS0N4CKYq(?{JmkrjsTItQI9$fn+|RDf36kQ{&3B2`-G2UjX{o$& z4=!zeQ-E{C{pl zb5GA$W@Y8FV#V$J_heO#vgnm?^&J$FZFMq|KzaFC{(%e(<(PZGNI}$5JW&_R5&4Z+x zjVQv)}LV|FdCbO z{(R3!HK@?|coT6P9!%`8@G=uc+e@FWz_$U>z36pp57AS6hRf5}F2~4`^W%2A(tB@ux$A6}7o>C%{+aU%Vlv=pdfsNi)^U#YVc>30J` t#f?*<75ZT2D_nP?ngbmJMWT+5r@JLYmXfm_Psk diff --git a/vg/vggio/testdata/paths_golden.png b/vg/vggio/testdata/paths_golden.png deleted file mode 100644 index a2f57b49feef13541ecc9cc7a5f26f12656776db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8744 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 0.") - } - return func(c *config) { - c.dpi = float64(dpi) - } -} - -// UseBackgroundColor specifies the image background color. -// Without UseBackgroundColor, the default color is white. -func UseBackgroundColor(c color.Color) option { - return func(cfg *config) { - cfg.bkg = c - } -} - -// Size implement vg.CanvasSizer. -func (c *Canvas) Size() (w, h vg.Length) { - return c.ctx.w, c.ctx.h -} - -// DPI returns the resolution of the receiver in pixels per inch. -func (c *Canvas) DPI() float64 { - return c.ctx.dpi -} - -// Paint returns the painting operations. -func (c *Canvas) Paint() *op.Ops { - return c.gtx.Ops -} - -// Screenshot returns a screenshot of the canvas as an image. -func (c *Canvas) Screenshot() (image.Image, error) { - win, err := headless.NewWindow( - int(c.ctx.w.Dots(c.ctx.dpi)), - int(c.ctx.h.Dots(c.ctx.dpi)), - ) - if err != nil { - return nil, fmt.Errorf("vggio: could not create headless window: %w", err) - } - - err = win.Frame(c.gtx.Ops) - if err != nil { - return nil, fmt.Errorf("vggio: could not run headless frame: %w", err) - } - - img := image.NewRGBA(image.Rectangle{Max: win.Size()}) - err = win.Screenshot(img) - if err != nil { - return nil, fmt.Errorf("vggio: could not create screenshot: %w", err) - } - - return img, nil -} - -// SetLineWidth sets the width of stroked paths. -// If the width is not positive then stroked lines -// are not drawn. -// -// The initial line width is 1 point. -func (c *Canvas) SetLineWidth(w vg.Length) { - c.ctx.cur().linew = w -} - -// SetLineDash sets the dash pattern for lines. -// The pattern slice specifies the lengths of -// alternating dashes and gaps, and the offset -// specifies the distance into the dash pattern -// to start the dash. -// -// The initial dash pattern is a solid line. -func (c *Canvas) SetLineDash(pattern []vg.Length, offset vg.Length) { - cur := c.ctx.cur() - cur.pattern = pattern - cur.offset = offset -} - -// SetColor sets the current drawing color. -// Note that fill color and stroke color are -// the same, so if you want different fill -// and stroke colors then you must set a color, -// draw fills, set a new color and then draw lines. -// -// The initial color is black. -// If SetColor is called with a nil color then black is used. -func (c *Canvas) SetColor(clr color.Color) { - if clr == nil { - clr = color.Black - } - c.ctx.cur().color = clr -} - -// Rotate applies a rotation transform to the context. -// The parameter is specified in radians. -func (c *Canvas) Rotate(rad float64) { - c.ctx.rotate(rad) -} - -// Translate applies a translational transform -// to the context. -func (c *Canvas) Translate(pt vg.Point) { - c.ctx.translate(pt.X.Dots(c.ctx.dpi), pt.Y.Dots(c.ctx.dpi)) -} - -// Scale applies a scaling transform to the -// context. -func (c *Canvas) Scale(x, y float64) { - c.ctx.scale(x, y) -} - -// Push saves the current line width, the -// current dash pattern, the current -// transforms, and the current color -// onto a stack so that the state can later -// be restored by calling Pop(). -func (c *Canvas) Push() { - c.ctx.push() -} - -// Pop restores the context saved by the -// corresponding call to Push(). -func (c *Canvas) Pop() { - c.ctx.pop() -} - -// Stroke strokes the given path. -func (c *Canvas) Stroke(p vg.Path) { - if c.ctx.cur().linew <= 0 { - return - } - c.ctx.push() - defer c.ctx.pop() - - var ( - cur = c.ctx.cur() - dashes stroke.Dashes - ) - dashes.Phase = float32(cur.offset.Dots(c.ctx.dpi)) - dashes.Dashes = make([]float32, len(cur.pattern)) - for i, v := range cur.pattern { - dashes.Dashes[i] = float32(v.Dots(c.ctx.dpi)) - } - - shape := stroke.Stroke{ - Path: c.stroke(p), - Width: float32(cur.linew.Dots(c.ctx.dpi)), - Cap: stroke.FlatCap, - Dashes: dashes, - }.Op(c.ctx.ops) - - clr := c.ctx.cur().color - paint.FillShape(c.ctx.ops, rgba(clr), shape) -} - -// Fill fills the given path. -func (c *Canvas) Fill(p vg.Path) { - c.ctx.push() - defer c.ctx.pop() - - shape := clip.Outline{ - Path: c.outline(p), - }.Op() - - clr := c.ctx.cur().color - paint.FillShape(c.ctx.ops, rgba(clr), shape) -} - -func rgba(c color.Color) color.NRGBA { - r, g, b, a := c.RGBA() - return color.NRGBA{R: uint8(r), G: uint8(g), B: uint8(b), A: uint8(a)} -} - -func (c *Canvas) outline(p vg.Path) clip.PathSpec { - var path clip.Path - path.Begin(c.ctx.ops) - for _, comp := range p { - switch comp.Type { - case vg.MoveComp: - pt := c.ctx.pt32(comp.Pos) - path.MoveTo(pt) - - case vg.LineComp: - pt := c.ctx.pt32(comp.Pos) - path.LineTo(pt) - - case vg.ArcComp: - center := c.ctx.pt32(comp.Pos) - path.ArcTo(center, center, float32(comp.Angle)) - - case vg.CurveComp: - switch len(comp.Control) { - case 1: - ctl := c.ctx.pt32(comp.Control[0]) - end := c.ctx.pt32(comp.Pos) - path.QuadTo(ctl, end) - case 2: - ctl0 := c.ctx.pt32(comp.Control[0]) - ctl1 := c.ctx.pt32(comp.Control[1]) - end := c.ctx.pt32(comp.Pos) - path.CubeTo(ctl0, ctl1, end) - default: - panic("vggio: invalid number of control points") - } - - case vg.CloseComp: - path.Close() - - default: - panic(fmt.Sprintf("vggio: unknown path component %d", comp.Type)) - } - } - return path.End() -} - -func (c *Canvas) stroke(p vg.Path) stroke.Path { - var ( - path stroke.Path - add = func(seg stroke.Segment) { - path.Segments = append(path.Segments, seg) - } - pen f32.Point - beg f32.Point - ) - - for i, comp := range p { - if i == 0 { - beg = c.ctx.pt32(comp.Pos) - } - switch comp.Type { - case vg.MoveComp: - pt := c.ctx.pt32(comp.Pos) - add(stroke.MoveTo(pt)) - pen = pt - - case vg.LineComp: - pt := c.ctx.pt32(comp.Pos) - add(stroke.LineTo(pt)) - pen = pt - - case vg.ArcComp: - center := c.ctx.pt32(comp.Pos) - arcs := arcTo(pen, center, center, float32(comp.Angle)) - path.Segments = append(path.Segments, xStroke(arcs)...) - pen = f32.Point(arcs[len(arcs)-1].End) - - case vg.CurveComp: - switch len(comp.Control) { - case 1: - var ( - ctl = c.ctx.pt32(comp.Control[0]) - end = c.ctx.pt32(comp.Pos) - ) - add(stroke.QuadTo(ctl, end)) - pen = end - case 2: - var ( - ctl0 = c.ctx.pt32(comp.Control[0]) - ctl1 = c.ctx.pt32(comp.Control[1]) - end = c.ctx.pt32(comp.Pos) - ) - add(stroke.CubeTo(ctl0, ctl1, end)) - pen = end - default: - panic("vggio: invalid number of control points") - } - - case vg.CloseComp: - add(stroke.LineTo(beg)) - pen = beg - - default: - panic(fmt.Sprintf("vggio: unknown path component %d", comp.Type)) - } - } - return path -} - -// FillString fills in text at the specified -// location using the given font. -// If the font size is zero, the text is not drawn. -func (c *Canvas) FillString(fnt font.Face, pt vg.Point, txt string) { - if fnt.Font.Size == 0 { - return - } - c.ctx.push() - defer c.ctx.pop() - - e := fnt.Extents() - x := pt.X.Dots(c.ctx.dpi) - y := pt.Y.Dots(c.ctx.dpi) - e.Descent.Dots(c.ctx.dpi) - h := c.ctx.h.Dots(c.ctx.dpi) - - c.ctx.invertY() - c.ctx.translate(x, h-y-fnt.Font.Size.Dots(c.ctx.dpi)) - - th := material.NewTheme() - th.Shaper = text.NewShaper(text.NoSystemFonts(), text.WithCollection(collectionFor(fnt))) - lbl := material.Label( - th, - unit.Sp(float32(fnt.Font.Size.Dots(c.ctx.dpi))), - txt, - ) - lbl.Color = rgba(c.ctx.cur().color) - lbl.Alignment = text.Start - lbl.Layout(c.gtx) -} - -// DrawImage draws the image, scaled to fit -// the destination rectangle. -func (c *Canvas) DrawImage(rect vg.Rectangle, img image.Image) { - c.ctx.push() - defer c.ctx.pop() - - var ( - ops = c.ctx.ops - dpi = c.DPI() - min = rect.Min - xmin = min.X.Dots(dpi) - ymin = min.Y.Dots(dpi) - rsz = rect.Size() - width = rsz.X.Dots(dpi) - height = rsz.Y.Dots(dpi) - dst = image.NewRGBA(image.Rect(0, 0, int(width), int(height))) - ) - - draw.NearestNeighbor.Scale(dst, dst.Rect, img, img.Bounds(), draw.Src, nil) - - c.ctx.scale(1, -1) - c.ctx.translate(xmin, -ymin-height) - paint.NewImageOp(dst).Add(ops) - paint.PaintOp{}.Add(ops) -} - -var dbfonts = &gioFontsCache{ - cache: make(map[string][]giofont.FontFace), - fonts: make(map[string]struct{}), -} - -type gioFontsCache struct { - sync.RWMutex - cache map[string][]giofont.FontFace - fonts map[string]struct{} - buf sfnt.Buffer -} - -func (cache *gioFontsCache) get(fnt font.Face) ([]giofont.FontFace, bool) { - cache.RLock() - defer cache.RUnlock() - - _, ok := cache.fonts[fnt.Name()] - if !ok { - return nil, false - } - name := collectionName(fnt.Name()) - return cache.cache[name], ok -} - -func (cache *gioFontsCache) add(fnt font.Face) []giofont.FontFace { - cache.Lock() - defer cache.Unlock() - - name := fnt.Name() - if fnt.Face == nil { - panic(fmt.Errorf("vggio: nil plot/font.Face %q", name)) - } - buf := new(bytes.Buffer) - _, err := fnt.Face.WriteSourceTo(&cache.buf, buf) - if err != nil { - panic(fmt.Errorf("vggio: could not load font %q: %+v", name, err)) - } - - gioFace, err := opentype.Parse(buf.Bytes()) - if err != nil { - panic(fmt.Errorf("vggio: could not parse font %q: %+v", name, err)) - } - - gioFnt := gonumToGioFont(fnt.Font) - - colName := collectionName(fnt.Name()) - cache.cache[colName] = append(cache.cache[colName], giofont.FontFace{ - Font: gioFnt, - Face: gioFace, - }) - cache.fonts[name] = struct{}{} - - return cache.cache[colName] -} - -func gonumToGioFont(fnt font.Font) giofont.Font { - o := giofont.Font{ - Typeface: giofont.Typeface(fnt.Typeface), - Style: giofont.Style(fnt.Style), - Weight: giofont.Weight(fnt.Weight), - } - return o -} - -func collectionFor(fnt font.Face) []giofont.FontFace { - coll, ok := dbfonts.get(fnt) - if !ok { - coll = dbfonts.add(fnt) - } - return coll -} - -func collectionName(name string) string { - // regroup fonts with name "Liberation-Italic", "Liberation-Bold", ... - // under the same collection "Liberation". - if strings.Contains(name, "-") { - i := strings.Index(name, "-") - name = name[:i] - } - return name -} - -func arcTo(start, f1, f2 f32.Point, angle float32) []bstroke.Segment { - if f1 == f2 { - return bstroke.AppendArc(nil, bstroke.Pt(start.X, start.Y), bstroke.Pt(f1.X, f1.Y), angle) - } - return bstroke.AppendEllipticalArc(nil, bstroke.Pt(start.X, start.Y), bstroke.Pt(f1.X, f1.Y), bstroke.Pt(f2.X, f2.Y), angle) -} - -func xStroke(bs []bstroke.Segment) []stroke.Segment { - vs := make([]stroke.Segment, len(bs)) - for i, b := range bs { - vs[i] = stroke.CubeTo(f32.Point(b.CP1), f32.Point(b.CP2), f32.Point(b.End)) - } - return vs -} diff --git a/vg/vggio/vggio_example_test.go b/vg/vggio/vggio_example_test.go deleted file mode 100644 index 97f6ac23..00000000 --- a/vg/vggio/vggio_example_test.go +++ /dev/null @@ -1,128 +0,0 @@ -// Copyright ©2020 The Gonum Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package vggio_test - -import ( - "image/color" - "math" - "os" - "time" - - "gioui.org/app" - "gioui.org/io/key" - "gioui.org/io/system" - "gioui.org/layout" - "gioui.org/op" - "gioui.org/op/clip" - "gioui.org/unit" - - "gonum.org/v1/plot" - "gonum.org/v1/plot/plotter" - "gonum.org/v1/plot/vg" - "gonum.org/v1/plot/vg/draw" - "gonum.org/v1/plot/vg/vggio" -) - -func ExampleCanvas() { - const ( - w = 20 * vg.Centimeter - h = 15 * vg.Centimeter - dpi = 96 - ) - go func(w, h vg.Length) { - defer os.Exit(0) - - win := app.NewWindow( - app.Title("Gonum"), - app.Size( - unit.Dp(float32(w.Dots(dpi))), - unit.Dp(float32(h.Dots(dpi))), - ), - ) - - done := time.NewTimer(2 * time.Second) - defer done.Stop() - - for e := range win.Events() { - switch e := e.(type) { - case system.FrameEvent: - var ( - ops op.Ops - gtx = layout.NewContext(&ops, e) - ) - // register a global key listener for the escape key wrapping our entire UI. - area := clip.Rect{Max: gtx.Constraints.Max}.Push(gtx.Ops) - key.InputOp{ - Tag: win, - Keys: key.NameEscape + "|Ctrl-Q|Alt-Q", - }.Add(gtx.Ops) - - for _, e := range gtx.Events(win) { - switch e := e.(type) { - case key.Event: - switch e.Name { - case key.NameEscape: - return - case "Q": - if e.Modifiers.Contain(key.ModCtrl) { - return - } - if e.Modifiers.Contain(key.ModAlt) { - return - } - } - } - } - area.Pop() - - p := plot.New() - p.Title.Text = "My title" - p.X.Label.Text = "X" - p.Y.Label.Text = "Y" - - quad := plotter.NewFunction(func(x float64) float64 { - return x * x - }) - quad.Color = color.RGBA{B: 255, A: 255} - - exp := plotter.NewFunction(func(x float64) float64 { - return math.Pow(2, x) - }) - exp.Dashes = []vg.Length{vg.Points(2), vg.Points(2)} - exp.Width = vg.Points(2) - exp.Color = color.RGBA{G: 255, A: 255} - - sin := plotter.NewFunction(func(x float64) float64 { - return 10*math.Sin(x) + 50 - }) - sin.Dashes = []vg.Length{vg.Points(4), vg.Points(5)} - sin.Width = vg.Points(4) - sin.Color = color.RGBA{R: 255, A: 255} - - p.Add(quad, exp, sin) - p.Legend.Add("x^2", quad) - p.Legend.Add("2^x", exp) - p.Legend.Add("10*sin(x)+50", sin) - p.Legend.ThumbnailWidth = 0.5 * vg.Inch - - p.X.Min = 0 - p.X.Max = 10 - p.Y.Min = 0 - p.Y.Max = 100 - - p.Add(plotter.NewGrid()) - - cnv := vggio.New(gtx, w, h, vggio.UseDPI(dpi)) - p.Draw(draw.New(cnv)) - e.Frame(cnv.Paint()) - - case system.DestroyEvent: - return - } - } - }(w, h) - - app.Main() -} diff --git a/vg/vggio/vggio_test.go b/vg/vggio/vggio_test.go deleted file mode 100644 index 1ecf6fba..00000000 --- a/vg/vggio/vggio_test.go +++ /dev/null @@ -1,482 +0,0 @@ -// Copyright ©2020 The Gonum Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package vggio - -import ( - "fmt" - "image" - "image/color" - "image/png" - "math" - "os" - "runtime" - "testing" - - "gioui.org/layout" - "gioui.org/op" - "gonum.org/v1/plot" - "gonum.org/v1/plot/cmpimg" - "gonum.org/v1/plot/plotter" - "gonum.org/v1/plot/vg" - "gonum.org/v1/plot/vg/draw" -) - -const deltaGio = 0.05 // empirical value from experimentation. - -// init makes sure the headless display is ready for tests with Gio. -// On GitHub Actions and on linux, that headless display may take some time to -// be properly available and appears to be setup "on demand". -// So we request it by trying to take a screenshot twice: -// - the first time around might fail -// - the second time shouldn't. -func init() { - if runtime.GOOS != "linux" { - return - } - - const ( - w = 20 * vg.Centimeter - h = 15 * vg.Centimeter - dpi = 96 - ) - gtx := layout.Context{ - Ops: new(op.Ops), - Constraints: layout.Exact(image.Pt( - int(w.Dots(dpi)), - int(h.Dots(dpi)), - )), - } - - var err error - for try := 0; try < 2; try++ { - _, err = New(gtx, w, h, UseDPI(dpi)).Screenshot() - if err == nil { - return - } - } - - panic(fmt.Errorf("vg/vggio_test: could not setup headless display: %+v", err)) -} - -func TestCanvas(t *testing.T) { - if runtime.GOOS == "darwin" { - t.Skip("TODO: github actions for darwin with headless setup.") - } - - const fname = "testdata/func.png" - - const ( - w = 20 * vg.Centimeter - h = 15 * vg.Centimeter - dpi = 96 - ) - - cmpimg.CheckPlotApprox(func() { - p := plot.New() - p.Title.Text = "My title" - p.X.Label.Text = "X" - p.Y.Label.Text = "Y" - - quad := plotter.NewFunction(func(x float64) float64 { return x * x }) - quad.Color = color.RGBA{B: 255, A: 255} - - exp := plotter.NewFunction(func(x float64) float64 { return math.Pow(2, x) }) - exp.Dashes = []vg.Length{vg.Points(2), vg.Points(2)} - exp.Width = vg.Points(2) - exp.Color = color.RGBA{G: 255, A: 255} - - sin := plotter.NewFunction(func(x float64) float64 { return 10*math.Sin(x) + 50 }) - sin.Dashes = []vg.Length{vg.Points(4), vg.Points(5)} - sin.Width = vg.Points(4) - sin.Color = color.RGBA{R: 255, A: 255} - - p.Add(quad, exp, sin) - p.Legend.Add("x^2", quad) - p.Legend.Add("2^x", exp) - p.Legend.Add("10*sin(x)+50", sin) - p.Legend.ThumbnailWidth = 0.5 * vg.Inch - - p.X.Min = 0 - p.X.Max = 10 - p.Y.Min = 0 - p.Y.Max = 100 - - p.Add(plotter.NewGrid()) - - gtx := layout.Context{ - Ops: new(op.Ops), - Constraints: layout.Exact(image.Pt( - int(w.Dots(dpi)), - int(h.Dots(dpi)), - )), - } - cnv := New(gtx, w, h, UseDPI(dpi)) - p.Draw(draw.New(cnv)) - - img, err := cnv.Screenshot() - if err != nil { - t.Fatalf("could not create screenshot: %+v", err) - } - f, err := os.Create(fname) - if err != nil { - t.Fatalf("could not create output file: %+v", err) - } - defer f.Close() - - err = png.Encode(f, img) - if err != nil { - t.Fatalf("could not encode screenshot: %+v", err) - } - - err = f.Close() - if err != nil { - t.Fatalf("could not save screenshot: %+v", err) - } - }, t, deltaGio, "func.png", - ) -} - -func TestCollectionName(t *testing.T) { - for _, tc := range []struct { - name string - want string - }{ - {"Liberation", "Liberation"}, - {"LiberationSerif-Bold", "LiberationSerif"}, - {"LiberationSerif-BoldItalic", "LiberationSerif"}, - {"LiberationSerif-BoldItalic-Extra", "LiberationSerif"}, - - {"LiberationMono", "LiberationMono"}, - {"LiberationMono-Regular", "LiberationMono"}, - - {"Times-Roman", "Times"}, - {"Times-Bold", "Times"}, - } { - got := collectionName(tc.name) - if got != tc.want { - t.Errorf( - "%s: invalid collection name: got=%q, want=%q", - tc.name, got, tc.want, - ) - } - } -} - -func TestLabels(t *testing.T) { - if runtime.GOOS == "darwin" { - t.Skip("TODO: github actions for darwin with headless setup.") - } - - const fname = "testdata/labels.png" - - const ( - w = 20 * vg.Centimeter - h = 15 * vg.Centimeter - dpi = 96 - ) - - cmpimg.CheckPlotApprox(func() { - p := plot.New() - p.Title.Text = "Labels" - p.X.Min = -1 - p.X.Max = +1 - p.Y.Min = -1 - p.Y.Max = +1 - - const ( - left = 0.00 - middle = 0.02 - right = 0.04 - ) - - labels, err := plotter.NewLabels(plotter.XYLabels{ - XYs: []plotter.XY{ - {X: -0.8 + left, Y: -0.5}, // Aq + y-align bottom - {X: -0.6 + middle, Y: -0.5}, // Aq + y-align center - {X: -0.4 + right, Y: -0.5}, // Aq + y-align top - - {X: -0.8 + left, Y: +0.5}, // ditto for Aq\nAq - {X: -0.6 + middle, Y: +0.5}, - {X: -0.4 + right, Y: +0.5}, - - {X: +0.0 + left, Y: +0}, // ditto for Bg\nBg\nBg - {X: +0.2 + middle, Y: +0}, - {X: +0.4 + right, Y: +0}, - }, - Labels: []string{ - "Aq", "Aq", "Aq", - "Aq\nAq", "Aq\nAq", "Aq\nAq", - - "Bg\nBg\nBg", - "Bg\nBg\nBg", - "Bg\nBg\nBg", - }, - }) - if err != nil { - t.Fatalf("could not creates labels plotter: %+v", err) - } - for i := range labels.TextStyle { - sty := &labels.TextStyle[i] - sty.Font.Size = vg.Length(34) - } - labels.TextStyle[0].YAlign = draw.YBottom - labels.TextStyle[1].YAlign = draw.YCenter - labels.TextStyle[2].YAlign = draw.YTop - - labels.TextStyle[3].YAlign = draw.YBottom - labels.TextStyle[4].YAlign = draw.YCenter - labels.TextStyle[5].YAlign = draw.YTop - - labels.TextStyle[6].YAlign = draw.YBottom - labels.TextStyle[7].YAlign = draw.YCenter - labels.TextStyle[8].YAlign = draw.YTop - - lred, err := plotter.NewLabels(plotter.XYLabels{ - XYs: []plotter.XY{ - {X: -0.8 + left, Y: +0.5}, - {X: +0.0 + left, Y: +0}, - }, - Labels: []string{ - "Aq", "Bg", - }, - }) - if err != nil { - t.Fatalf("could not creates labels plotter: %+v", err) - } - for i := range lred.TextStyle { - sty := &lred.TextStyle[i] - sty.Font.Size = vg.Length(34) - sty.Color = color.RGBA{R: 255, A: 255} - sty.YAlign = draw.YBottom - } - - m5 := plotter.NewFunction(func(float64) float64 { return -0.5 }) - m5.LineStyle.Color = color.RGBA{R: 255, A: 255} - - l0 := plotter.NewFunction(func(float64) float64 { return 0 }) - l0.LineStyle.Color = color.RGBA{G: 255, A: 255} - - p5 := plotter.NewFunction(func(float64) float64 { return +0.5 }) - p5.LineStyle.Color = color.RGBA{B: 255, A: 255} - - p.Add(labels, lred, m5, l0, p5) - p.Add(plotter.NewGrid()) - p.Add(plotter.NewGlyphBoxes()) - - gtx := layout.Context{ - Ops: new(op.Ops), - Constraints: layout.Exact(image.Pt( - int(w.Dots(dpi)), - int(h.Dots(dpi)), - )), - } - cnv := New(gtx, w, h, UseDPI(dpi)) - p.Draw(draw.New(cnv)) - - img, err := cnv.Screenshot() - if err != nil { - t.Fatalf("could not create screenshot: %+v", err) - } - f, err := os.Create(fname) - if err != nil { - t.Fatalf("could not create output file: %+v", err) - } - defer f.Close() - - err = png.Encode(f, img) - if err != nil { - t.Fatalf("could not encode screenshot: %+v", err) - } - - err = f.Close() - if err != nil { - t.Fatalf("could not save screenshot: %+v", err) - } - }, t, deltaGio, "labels.png", - ) -} - -func TestPaths(t *testing.T) { - if runtime.GOOS == "darwin" { - t.Skip("TODO: github actions for darwin with headless setup.") - } - - const fname = "testdata/paths.png" - - const ( - w = 20 * vg.Centimeter - h = 15 * vg.Centimeter - dpi = 96 - ) - - cmpimg.CheckPlotApprox(func() { - p := plot.New() - p.Title.Text = "Paths" - p.X.Min = -1 - p.X.Max = +1 - p.Y.Min = -1 - p.Y.Max = +1 - - newScatter := func(c color.Color, sty draw.GlyphDrawer, x, y float64) *plotter.Scatter { - t.Helper() - - pts := make(plotter.XYs, 1) - pts[0].X = x - pts[0].Y = y - - plt, err := plotter.NewScatter(pts) - if err != nil { - t.Fatal(err) - } - plt.GlyphStyle.Color = c - plt.GlyphStyle.Radius = vg.Points(10) - plt.GlyphStyle.Shape = sty - return plt - } - - p.Add( - newScatter( - color.RGBA{R: 255, A: 255}, - draw.CircleGlyph{}, - -0.8, -0.8, - ), - newScatter( - color.RGBA{B: 255, A: 255}, - draw.RingGlyph{}, - -0.6, -0.6, - ), - newScatter( - color.RGBA{R: 255, A: 255}, - draw.SquareGlyph{}, - -0.4, -0.4, - ), - newScatter( - color.RGBA{B: 255, A: 255}, - draw.BoxGlyph{}, - -0.2, -0.2, - ), - newScatter( - color.RGBA{R: 255, A: 255}, - draw.TriangleGlyph{}, - 0, 0, - ), - newScatter( - color.RGBA{B: 255, A: 255}, - draw.PyramidGlyph{}, - 0.2, 0.2, - ), - newScatter( - color.RGBA{R: 255, A: 255}, - draw.PlusGlyph{}, - 0.4, 0.4, - ), - newScatter( - color.RGBA{B: 255, A: 255}, - draw.CrossGlyph{}, - 0.6, 0.6, - ), - ) - - p.Add(plotter.NewGrid()) - p.Add(plotter.NewGlyphBoxes()) - - gtx := layout.Context{ - Ops: new(op.Ops), - Constraints: layout.Exact(image.Pt( - int(w.Dots(dpi)), - int(h.Dots(dpi)), - )), - } - cnv := New(gtx, w, h, UseDPI(dpi), UseBackgroundColor(color.Transparent)) - p.Draw(draw.New(cnv)) - - img, err := cnv.Screenshot() - if err != nil { - t.Fatalf("could not create screenshot: %+v", err) - } - f, err := os.Create(fname) - if err != nil { - t.Fatalf("could not create output file: %+v", err) - } - defer f.Close() - - err = png.Encode(f, img) - if err != nil { - t.Fatalf("could not encode screenshot: %+v", err) - } - - err = f.Close() - if err != nil { - t.Fatalf("could not save screenshot: %+v", err) - } - }, t, deltaGio, "paths.png", - ) -} - -// An example of embedding an image in a plot. -func TestImage(t *testing.T) { - if runtime.GOOS == "darwin" { - t.Skip("TODO: github actions for darwin with headless setup.") - } - - const fname = "testdata/image.png" - - const ( - w = 20 * vg.Centimeter - h = 15 * vg.Centimeter - dpi = 96 - ) - - cmpimg.CheckPlotApprox(func() { - p := plot.New() - p.Title.Text = "A Logo" - - // load an image - src, err := os.Open("../../plotter/testdata/gopher.png") - if err != nil { - t.Fatalf("error opening image file: %v\n", err) - } - defer src.Close() - - img, err := png.Decode(src) - if err != nil { - t.Fatalf("error decoding image file: %v\n", err) - } - - p.Add(plotter.NewImage(img, 100, 100, 200, 200)) - - gtx := layout.Context{ - Ops: new(op.Ops), - Constraints: layout.Exact(image.Pt( - int(w.Dots(dpi)), - int(h.Dots(dpi)), - )), - } - cnv := New(gtx, w, h, UseDPI(dpi), UseBackgroundColor(color.Transparent)) - p.Draw(draw.New(cnv)) - - scr, err := cnv.Screenshot() - if err != nil { - t.Fatalf("could not create screenshot: %+v", err) - } - - out, err := os.Create(fname) - if err != nil { - t.Fatalf("could not create output file: %+v", err) - } - defer out.Close() - - err = png.Encode(out, scr) - if err != nil { - t.Fatalf("could not encode screenshot: %+v", err) - } - - err = out.Close() - if err != nil { - t.Fatalf("could not save screenshot: %+v", err) - } - }, t, deltaGio, "image.png", - ) -} From b27fdb74f825b8514bb92251bc1f642a29f8cd84 Mon Sep 17 00:00:00 2001 From: Sebastien Binet Date: Thu, 13 Feb 2025 10:12:02 +0100 Subject: [PATCH 2/4] ci: remove cgo deps needed for Gio Signed-off-by: Sebastien Binet --- .github/workflows/ci.yml | 10 ---------- .github/workflows/lint.yml | 6 ------ 2 files changed, 16 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0d816c07..d239ff76 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,8 +16,6 @@ jobs: env: GO111MODULE: on GOPATH: ${{ github.workspace }} - DISPLAY: ":99.0" - EGL_PLATFORM: "x11" defaults: run: working-directory: ${{ env.GOPATH }}/src/gonum.org/v1/plot @@ -51,14 +49,6 @@ jobs: restore-keys: | ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} - - name: Install Linux packages - if: matrix.platform == 'ubuntu-20.04' - run: | - sudo apt-get update - sudo apt-get install -qq gcc pkg-config libwayland-dev libx11-dev libx11-xcb-dev libxkbcommon-x11-dev libgles2-mesa-dev libegl1-mesa-dev libffi-dev libxcursor-dev libvulkan-dev xvfb xdotool - # start a virtual frame buffer - Xvfb :99 -screen 0 1920x1024x24 & - - name: Check copyrights+formatting run: | # Required for format check. diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index e864fd4c..321cfaae 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -9,16 +9,10 @@ jobs: runs-on: ubuntu-latest env: GO111MODULE: on - DISPLAY: ":99.0" - EGL_PLATFORM: "x11" steps: - uses: actions/checkout@v4 with: fetch-depth: 1 - - name: cgo-dependencies - run: | - sudo apt-get update - sudo apt-get install -qq gcc pkg-config libwayland-dev libx11-dev libx11-xcb-dev libxkbcommon-x11-dev libgles2-mesa-dev libegl1-mesa-dev libffi-dev libxcursor-dev libvulkan-dev xvfb xdotool - uses: dominikh/staticcheck-action@v1 with: version: "2024.1" From 901e1fa8ff9b5007bee95c9758f00a57b742321e Mon Sep 17 00:00:00 2001 From: Sebastien Binet Date: Thu, 13 Feb 2025 10:23:21 +0100 Subject: [PATCH 3/4] ci: bump staticcheck@2025.1 Signed-off-by: Sebastien Binet --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 321cfaae..736f53b8 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -15,4 +15,4 @@ jobs: fetch-depth: 1 - uses: dominikh/staticcheck-action@v1 with: - version: "2024.1" + version: "2025.1" From 22927cec2480226cf33a26a41d14266fc2a21666 Mon Sep 17 00:00:00 2001 From: Sebastien Binet Date: Thu, 13 Feb 2025 10:25:40 +0100 Subject: [PATCH 4/4] ci: use ubuntu-latest in lieu of ubuntu-20.04 Signed-off-by: Sebastien Binet --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d239ff76..c1069f99 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,7 +11,7 @@ jobs: strategy: matrix: go-version: [1.23.x, 1.22.x] - platform: [ubuntu-20.04, macos-latest] + platform: [ubuntu-latest, macos-latest] runs-on: ${{ matrix.platform }} env: GO111MODULE: on @@ -66,7 +66,7 @@ jobs: go install -v ./... - name: Test Linux - if: matrix.platform == 'ubuntu-20.04' + if: matrix.platform == 'ubuntu-latest' run: | go test -v ./... ./.ci/check-imports.sh @@ -83,5 +83,5 @@ jobs: go test -v ./... - name: Upload-Coverage - if: matrix.platform == 'ubuntu-20.04' + if: matrix.platform == 'ubuntu-latest' uses: codecov/codecov-action@v2