From e6d9be197ce5287e8d9cb243e0e8ab33187be265 Mon Sep 17 00:00:00 2001 From: PJ Fanning Date: Wed, 13 Sep 2017 23:10:44 +0000 Subject: [PATCH] [bug-61515] fix xlsf issue with relationships [from Alain Bearez] This closes #70 git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1808294 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/xslf/usermodel/XMLSlideShow.java | 1 + .../org/apache/poi/xslf/TestXSLFBugs.java | 215 +++++++++++------- test-data/slideshow/61515.pptx | Bin 0 -> 29270 bytes 3 files changed, 128 insertions(+), 88 deletions(-) create mode 100644 test-data/slideshow/61515.pptx diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java index af40b590bd..5405b7f6e3 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java @@ -251,6 +251,7 @@ implements SlideShow { slideId.setId2(rp.getRelationship().getId()); layout.copyLayout(slide); + slide.getPackagePart().clearRelationships(); slide.addRelation(null, XSLFRelation.SLIDE_LAYOUT, layout); _slides.add(slide); diff --git a/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java b/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java index 65939eec44..6f8fd2121c 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/TestXSLFBugs.java @@ -16,6 +16,27 @@ ==================================================================== */ package org.apache.poi.xslf; +import static org.apache.poi.POITestCase.assertContains; +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.awt.RenderingHints; +import java.awt.geom.AffineTransform; +import java.awt.geom.Rectangle2D; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.net.URI; +import java.util.Collection; + +import javax.imageio.ImageIO; + import org.apache.poi.POIDataSamples; import org.apache.poi.POIXMLDocumentPart; import org.apache.poi.POIXMLDocumentPart.RelationPart; @@ -29,28 +50,28 @@ import org.apache.poi.sl.usermodel.PictureData.PictureType; import org.apache.poi.sl.usermodel.ShapeType; import org.apache.poi.sl.usermodel.VerticalAlignment; import org.apache.poi.xslf.extractor.XSLFPowerPointExtractor; -import org.apache.poi.xslf.usermodel.*; +import org.apache.poi.xslf.usermodel.XMLSlideShow; +import org.apache.poi.xslf.usermodel.XSLFAutoShape; +import org.apache.poi.xslf.usermodel.XSLFGroupShape; +import org.apache.poi.xslf.usermodel.XSLFHyperlink; +import org.apache.poi.xslf.usermodel.XSLFNotes; +import org.apache.poi.xslf.usermodel.XSLFPictureData; +import org.apache.poi.xslf.usermodel.XSLFPictureShape; +import org.apache.poi.xslf.usermodel.XSLFRelation; +import org.apache.poi.xslf.usermodel.XSLFShape; +import org.apache.poi.xslf.usermodel.XSLFSlide; +import org.apache.poi.xslf.usermodel.XSLFSlideLayout; +import org.apache.poi.xslf.usermodel.XSLFSlideMaster; +import org.apache.poi.xslf.usermodel.XSLFTable; +import org.apache.poi.xslf.usermodel.XSLFTableCell; +import org.apache.poi.xslf.usermodel.XSLFTableRow; +import org.apache.poi.xslf.usermodel.XSLFTextParagraph; +import org.apache.poi.xslf.usermodel.XSLFTextRun; import org.junit.Ignore; import org.junit.Test; import org.openxmlformats.schemas.drawingml.x2006.main.CTOuterShadowEffect; import org.openxmlformats.schemas.presentationml.x2006.main.CTShape; -import javax.imageio.ImageIO; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics2D; -import java.awt.RenderingHints; -import java.awt.geom.AffineTransform; -import java.awt.geom.Rectangle2D; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import java.net.URI; -import java.util.Collection; - -import static org.apache.poi.POITestCase.assertContains; -import static org.junit.Assert.*; - public class TestXSLFBugs { private static final POIDataSamples slTests = POIDataSamples.getSlideShowInstance(); @@ -58,24 +79,24 @@ public class TestXSLFBugs { @Test public void bug51187() throws Exception { XMLSlideShow ss1 = XSLFTestDataSamples.openSampleDocument("51187.pptx"); - + assertEquals(1, ss1.getSlides().size()); - + // Check the relations on it // Note - rId3 is a self reference XSLFSlide slide0 = ss1.getSlides().get(0); - + assertRelation(slide0, "/ppt/slides/slide1.xml", null); assertRelation(slide0, "/ppt/slideLayouts/slideLayout12.xml", "rId1"); assertRelation(slide0, "/ppt/notesSlides/notesSlide1.xml", "rId2"); assertRelation(slide0, "/ppt/slides/slide1.xml", "rId3"); assertRelation(slide0, "/ppt/media/image1.png", "rId4"); - + // Save and re-load XMLSlideShow ss2 = XSLFTestDataSamples.writeOutAndReadBack(ss1); ss1.close(); assertEquals(1, ss2.getSlides().size()); - + slide0 = ss2.getSlides().get(0); assertRelation(slide0, "/ppt/slides/slide1.xml", null); assertRelation(slide0, "/ppt/slideLayouts/slideLayout12.xml", "rId1"); @@ -83,30 +104,30 @@ public class TestXSLFBugs { // TODO Fix this assertRelation(slide0, "/ppt/slides/slide1.xml", "rId3"); assertRelation(slide0, "/ppt/media/image1.png", "rId4"); - + ss2.close(); } - + private static void assertRelation(XSLFSlide slide, String exp, String rId) { POIXMLDocumentPart pd = (rId != null) ? slide.getRelationById(rId) : slide; assertNotNull(pd); assertEquals(exp, pd.getPackagePart().getPartName().getName()); } - + /** * Slide relations with anchors in them */ @Test public void tika705() throws Exception { XMLSlideShow ss = XSLFTestDataSamples.openSampleDocument("with_japanese.pptx"); - + // Should have one slide assertEquals(1, ss.getSlides().size()); XSLFSlide slide = ss.getSlides().get(0); - + // Check the relations from this Collection rels = slide.getRelationParts(); - + // Should have 6 relations: // 1 external hyperlink (skipped from list) // 4 internal hyperlinks @@ -123,7 +144,7 @@ public class TestXSLFBugs { } assertEquals(1, layouts); assertEquals(4, hyperlinks); - + // Hyperlinks should all be to #_ftn1 or #ftnref1 for(RelationPart p : rels) { if(p.getRelationship().getRelationshipType().equals(XSLFRelation.HYPERLINK.getRelation())) { @@ -140,61 +161,61 @@ public class TestXSLFBugs { } ss.close(); } - + /** - * A slideshow can have more than one rID pointing to a given - * slide, eg presentation.xml rID1 -> slide1.xml, but slide1.xml + * A slideshow can have more than one rID pointing to a given + * slide, eg presentation.xml rID1 -> slide1.xml, but slide1.xml * rID2 -> slide3.xml */ @Test public void bug54916() throws Exception { XMLSlideShow ss = XSLFTestDataSamples.openSampleDocument("OverlappingRelations.pptx"); - XSLFSlide slide; - + XSLFSlide slide; + // Should find 4 slides assertEquals(4, ss.getSlides().size()); - + // Check the text, to see we got them in order slide = ss.getSlides().get(0); assertContains(getSlideText(slide), "POI cannot read this"); - + slide = ss.getSlides().get(1); assertContains(getSlideText(slide), "POI can read this"); assertContains(getSlideText(slide), "Has a relationship to another slide"); - + slide = ss.getSlides().get(2); assertContains(getSlideText(slide), "POI can read this"); - + slide = ss.getSlides().get(3); assertContains(getSlideText(slide), "POI can read this"); - + ss.close(); } - + /** - * When the picture is not embedded but inserted only as a "link to file", + * When the picture is not embedded but inserted only as a "link to file", * there is no data available and XSLFPictureShape.getPictureData() * gives a NPE, see bug #56812 */ @Test public void bug56812() throws Exception { XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("56812.pptx"); - + int internalPictures = 0; int externalPictures = 0; for (XSLFSlide slide : ppt.getSlides()){ for (XSLFShape shape : slide.getShapes()){ assertNotNull(shape); - + if (shape instanceof XSLFPictureShape) { XSLFPictureShape picture = (XSLFPictureShape)shape; if (picture.isExternalLinkedPicture()) { externalPictures++; - + assertNotNull(picture.getPictureLink()); } else { internalPictures++; - + XSLFPictureData data = picture.getPictureData(); assertNotNull(data); assertNotNull(data.getFileName()); @@ -202,7 +223,7 @@ public class TestXSLFBugs { } } } - + assertEquals(2, internalPictures); assertEquals(1, externalPictures); ppt.close(); @@ -212,31 +233,31 @@ public class TestXSLFBugs { @Ignore("Similar to TestFontRendering it doesn't make sense to compare images because of tiny rendering differences in windows/unix") public void bug54542() throws Exception { XMLSlideShow ss = XSLFTestDataSamples.openSampleDocument("54542_cropped_bitmap.pptx"); - + Dimension pgsize = ss.getPageSize(); - + XSLFSlide slide = ss.getSlides().get(0); - + // render it double zoom = 1; AffineTransform at = new AffineTransform(); at.setToScale(zoom, zoom); - + BufferedImage imgActual = new BufferedImage((int)Math.ceil(pgsize.width*zoom), (int)Math.ceil(pgsize.height*zoom), BufferedImage.TYPE_3BYTE_BGR); Graphics2D graphics = imgActual.createGraphics(); graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); graphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON); - graphics.setTransform(at); + graphics.setTransform(at); graphics.setPaint(Color.white); graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width, pgsize.height)); - slide.draw(graphics); - + slide.draw(graphics); + ImageIO.write(imgActual, "PNG", new File("bug54542.png")); ss.close(); } - + protected String getSlideText(XSLFSlide slide) { return XSLFPowerPointExtractor.getText(slide, true, false, false); } @@ -267,7 +288,7 @@ public class TestXSLFBugs { validateSlides(ss, true, "Slide1","Slide2","New slide"); ss.close(); } - + /** * When working with >9 images, make sure the sorting ensures * that image10.foo isn't between image1.foo and image2.foo @@ -278,15 +299,15 @@ public class TestXSLFBugs { for (String s : new String[]{"Slide1","Slide2"}) { ss.createSlide().createTextBox().setText(s); } - + // Slide starts with just layout relation XSLFSlide slide = ss.getSlides().get(0); assertEquals(0, ss.getPictureData().size()); assertEquals(1, slide.getShapes().size()); - + assertEquals(1, slide.getRelations().size()); assertRelationEquals(XSLFRelation.SLIDE_LAYOUT, slide.getRelations().get(0)); - + // Some dummy pictures byte[][] pics = new byte[15][3]; for (int i=0; iUHnVCM_J05%Nxe?MX6~vVlHY)l0YCx30RRB-0XE0c?<)ZT07Rex0FVH{fiwhdtR0Q4 z9d#7lY>gbWXk4u<@$!Iy$Z`OHzOMhj&;Mczj3;Zz_R=8_ZA!nvO6tH+<`7_l!f9u< z$AsYKSc8=~Tg{;c*jz4y_ywc`{i2neoP7SAs&Z_^Z0K>x9P>+DYQEWrja1AeSELg~|UsNqM`aQ^) zk2#!o8Njqd-D+A@9Bfue^MHS)lJlr8*0$#z*anRV7Za4InHsWA8)4hbIEM5{A`(z9 znMul`$KZfYc8EcZpgchlpW+sib8jU}uO|&w&Dhgl{?RXb?h4qChVde`P*u3WSrMzI zWXz&(LWc5(QrDD$m?D>i93o9x;f^SJQN-9X-tQh&U)JmtC${@={_|-=s0~i~M5dwb zC6O4jRuMDzi06^WCWHuf59~l)>-Na*ZBFO`r%&-=t43$TOCara#qJ)_4&9Eq6L&)e zX8V0iD!<)|{@&MWDJQtpNp8c|tC-_i!J?pGDHR+B=CAXIm{R3?gp;n$J+dhmZLUYm zC+@zpn6y$#%*bxGPB-3k7opP*Fqq|MR$oJ5o3u}m`mQf5e|~-g`0<}mZu;by`|WFH z=L^J8UntkHH?nk~rTOFdf9U>S4C#MZdPUr-#5a2Qpi7WV{Bcj#RSJSxOBB0g3&wxq1-C%PdK^3Av+vnUbwreG){wT8 zonobWG32Du4g4k(({KRE;}&|s)!@))8YXiRs}CuaB5gE6o6$cBMM=rQm1M_7Qo{Go zKvU0D2?@@0zcwAhNUYYr$1MGnHhp%)pgU_EQ z^nXOiKY0|J?#SDq*BWn08eE^4kB0_!_$qQX(gwD$kEbogBwZjIP9v^ z#k;6=F-G-4Ru|1LNQniHZ0X1of$3$fb4d!XNynC9fCqy`uQ|S&+cq0fh;zM%6kZ1W zn=UbKQsP&pDSr~ZTuD6s0f;2^Z3*Iv&UbN7rU|)ylW*gb$Q^Sr?u&lSR-xLzcIjLt zvuCQH0&ipkc9uC`2C1tGYg0riFbg~`E|b*N2>DWF&NrCpOq;cEH=LnR@ zu!5ID5dm)lkfai!Mp?N@;WrJL=MpKQIK}RNKD@c5{Zcu-l&PcsDgPUMI1U*-ZB}`d z31}m1sGL(5xuCS55ftQ3tY(syR++ZMC`5RkLX@fq9dSBn>w>+wc0fj6A3M!eUSo3v zzR;#Qem~eUhIZC*BDQ&Av%6Nrq`prs&TH78ZlR zI~Y(vFv?J~ZdpO9g8;lriZ`&O5gpcazhUEG*Er;9+}yK?nMm=9{R~z9P74p1j=`QV z&;#V*^9sCQ&NT&@Yw7WQ&8hKv3i(&I;5d|*)$MaZ+tDu>69^@@C~>EqvQ zMcqFRPZ#5X!Ve`!MlcE}C}QP5&7>egDn_B~#Ews`nI*{N(n2$?CHN$&bB=CrPLqYX ztBJ|r)65)+(M3wwC6DD!e_psza0-mfD=7K%t#-x{&ow82(I%h41<|&kMGVEN)C&AK zq~+b!Ie!!ef3mH5-7DtIFA(Gd z8fvI+tcpA`&P*RQ3n5g(-@Z1zr_9(3y|L{3!&(15EX~jI>hDQV#t$r5$64Aeakj?B zK>bHf7Ujp1PpPlW<`N`}$3P7YfJw2PzU0H6d1 zU(lqjc$4Dy95uKfOp(Eot%dqsnxF6ecNgCHN#0)s^UqA3u7sO_^yOLyzyJU!|K?i% z#?=48(ftYQ)~k5PK9{8D*zk|Ab~{C-N=;>R#%c4FGjTisJw%N`fPi+`(w>iiLB<-K zrD*ZayWfIuAF&;p+b=XgIm#RfT>6|&kwKla;92 zmw4W-UYGDKs(ttK+5O!Jl4lD){+8t8<@;f~IYd19nrWU{Z<#}zWA!oP89O(#0l+{u zA})Cn%xWp_`543;1~E-5j=k_>%_2j*f0-#rE~fLxz|V$uw7oV^O;wy=-mMN*=y91* z%#{54+z>e)bvo?H_Z>yqqvT^rIc%-0%0%r@hoXsw+jObRAj8p*w=YgPA&Ar^J&K2JY?>MLNBp=uMK zuOfPljr7NAbY*|}$Ul40!c5$C``64L@t*1*y+}&W&Bn>`KSlk&{l)U{;qNQ|X5PEuq?*OCrRzO#Y_VSKa(`WqrcRk-fH0!*j^Ihfj(b|L5mGOqt zbu%xS*Q$mVP=QVEP=~g}`_j=L&h2M3P5U*YTy0~8<+v=+?V~sgm!O&O$KXej#nEO1 zS`tcC5GJtQjQ?kaFJEB#A7}-$JRN+LFXcD{_FvSaw4Q^b zk^O&CkAM5?KX{>kLHdu%5y+Njt_xjVG%;sre8TW@fIv=p91frAF0Q$xh`fa7Ygm#1 zw4Nz`PGoo7{lTtPJ+B9>=Z)`gClRP&d02>((XUDa(8lCcI5p9vWTl}E6J*MCPp*f@ zQkOohXY<~QwWGM$j11rD`%`~Px%&44$%zn-jQK&>*JWTaSOR@F{CB^CeiTzp4iWea=)$f52)|xY=AG+~c^D>(lq1sTnLO})Cocum-$}jBCaj@hglRq=( z2U}?ggkj)JCR6cC(P&wjg)ImS2hw8qwOUXKqR4#f_{&8uqD%V0h=>gEkXY7h7;K)xZ=Se!gn zVX-q;VV0-U%A`)AhL_0yR`gDFz-C1-d5M;COcl^c}0X~7eEOuMJ-F?rKY zS+@E82&7afa{7a+_;orpbMUns7zm;1<@ku+76|2B_ZKd8 zl8dNi`2GZfMX^rzvz{Eb(&^fq?HfY=S_m8HjLo?H??5MT998gs#Bx^KavTW$z>={K3d{QGa?@YoIW0uKZm zMpRoC>NfeIpiQGiP6*MHqp%&qG695dtoN{9ay*T{^$`=9<*Us*KEF!6+ zT*m5$BqRz{|56mf69h~k<}*)Dup8%#D{3DC`gHPHYn_bT?C2s1&^bltT99LOl(pke zib&cD^M(*-wgU_6eMx`cV@!ZS{6y;=w1WrzEUwXH>?+~}$tJIVSUsY`g;)=BYc9|` zjUYBD(5;b{t0lPub|t*WxVkkWmJx-U6q;I=DA^ym+HSd8*dcoYc)i(t(y{P2L-!9E3EhY zfZ?ozlN#9!A1XNO@ciYx&DMAgyt+Ck?G_G4N6Te9HM@ zuNhWxZnlxNp~6K)i$A zSCeI(#Ez>Gqn0Yj9wLpBa=(T3%GK>NLWB&ZgPrr1btSh*J?}_AGTVGMY0kv%hEC>5 z^K}yr57ScD$mjKyJuxfT)=-R{D}(96;SHhSjZag}PpH4jQ;jq7$uhqPVft(KUlPKf zSxJTRek& zxU``9y02Jo4d_Q%kpPV84l)ydC=hzv3q5fM+7>l<{vs!s8fQyjYIh6hVmJz=TsT&W zs=@>~knc3Et`yYxblO=xvw}V~1bv6|YdJEd9qswayNHczv`gBhC_KxSD#;{^JdFfP9b;6#HepYgu?YieMSgxB^=ItlL+%BZw z*N%lCV6|a95}Wr2NCVYjKhPgJA7N25r;1RVaDl9Hezsi{pMM{@(?8Z49qU-$Bdm8u zoJyIc>@ewv4R}_?M0{efWXPz$2u3k<&1V#`b%z(yF^NFUjyVWPP|SBxH6w^6{&on6 z7s;_=Zip|gv0)JE?d`W#N=9|;o69QpWPmT~9}{g4xz4B=lU9dV5|9kPD7KGBL;l^5 zW)*wM+eOnOYUcnG5ZMprSZ46>1&VMw2|K{ch%17E<@<>o7so`lwOJ;I!59iTTZV;5 zV?ZW=4WT{gTWiscynQY*z-wk&8-s?dI-CeCsEY zFZAQUtlRH)UAbU-*(Bi1$|DY`YdD!Tx;)XU6p~NluT{YR05&Ivh(JxO6*bh*8 zDqR&-OK|t_B9XH-1e$F<7Ve>@pSph+$-g#CTVlGRYRYY}l-^Pq^fpcP2p(AfO(Jff z(>g8#QIhfcojnbGGg#v7h4(9#|8o&)jYM4D`m31Bf$+x`m49fx{k;_T57GWlNj;wO zRorFyD(-@vVFRD5$Ch|wIE4*IH36C-&L4lHL&SzE6pGB#au@XN{Qbb@8J8(2o)lkH z+Jw$;Efu!I{x%8cCe-EDM&9zvxRzXqnPnu@0JCCLNL$gx;I?mKJWM)Yu6~pp4FxM* z<9CXUtoO&UG`G2{7k`s}A@sByGa&~{vcv-6s&y?frI`bPxpGfiU<|R+71`yP=B#W^ z+g{@-Tdvk@9s{SFTS&VqRak_ya3h6Up*nG#U71gp8miNrMLFDzvgB_cOlnVDaVv|O zM!jX5h=ZbB(otq;gj;0GsRJ%n3iaOZ3?nk@Eg_Qo)uPVW2)%0cPl{7FPwIy0{TFpi z;V20Xy}1i*$GJO$hTqt)zE4`4h4~W#NlSjL5fe)RIab$;gY=DZBEMmc`%D|#e;Qgh za(NpzuG8vXQimxw*lwonJ{+tehcWt}Rh+n`zX%xOV&x<1!liAdHKot2L|Ap4X;%MG zVy*Tp<@`3DpB2K52v!+NWFI#ie#sfg1_&WgT=zTj8|zJ8FiTVGY3xb?!DikQb-gZS zWo@AkQ-@XJjmX48663m#!z}*3x4I<|2Lca98^P1Fop(dJ(=IM&% zt?xaUO&dH?u1_(qJAujbhG^dP@HaP~Np2Gu1fRk*LtM|8fNjS;f!M|V>bnQi+z}Qk zUgB?OyDfA@sNIEma5Z2RsqWy>4mfk|^Idc@@XYD_^CX{pWB3tv!x$rP z`}LgI?du-t2iHElpP8>P__)<~VsJ>##P6wzxMS%wZxbD(pWbC{n<|gwN@v0qMtFgL@ajOoqTycmp-;{HdQ&%qf+1zPhOgD z2K`34hFB@Q%8I>^o|ax$5Dz-~4w}&c9ij&{pDA`N6gId|#B4!2Th35rxK5EDE8O-g zBB7T>rAX>#KePB&CX0Tnu@NdWIpvXsK+MNECO5*UYXh$5F2CH5ZFYIQ-%KIcE3v+x zqsnB5i#Tx`5JS-sNykrT_Ln9idK*8_5!Fr_>*-DaO+AvDd9Ykh^6pZnKIKa>c;0_- zU(%lUe;%x8qoyK9s+Pn{C9J=1Rt=DnSjZi90ffwHt=xy6yV-po2*o1NO7W?*VWtN4 zih2+n+vil*sdS1jZ^&j)noc+vieRZb>{h{L{h($$iE`1 zKdT@W%IANO)jO~5C7)>*il=HLRlbbg$P68xl^=&EfJh!eCGtpYy@d_g^x_ImvFxm* zL~T0Lx9>vULSY1Om+X%r?KT@18ez^tWkGd?NSaTu1QlCGeK<*zLv3rBoML9<5>o7h zl81Z=w+}aqIvXK@dHc*fSCt|@J@Y`cnd%n5uDF!u3kFX7pnA7728_a)+eg8w6P_4# zo93ZBy$>3i^<=uVv+A-`loVo^X&b5aTEE2x=)+u>w<4JHAsyyGh$D9|Ekp~>f&p4S zzh}eN#_z#ue>+5UMZ;1j2+}}rwqPO#pXbLg!HhWrCcYrTFB)?0lKh3xG+X7~)s|R7 z4kOdGas2}K&h$F!+_=lF_Ce=(t*d38LV!EyWSa|wqzE|GpD~3{I*6~6EcsMaRvEL z4H7AGSu-m{fCc>q3Sc%rqf7`T{w3vzKdyjV6y%n2g26lZdq2_a8Nip@AlBu-G{_vH zAGi*wg~Elbg2)d=^ij^A2^WcwSgY#33xt83C|_#BtX+2uhMes!Kj93V``ZS^JJ3^G zYwTgZtaeD&ZRPy^^3{ywcKV6h-LDR8mTc;!sjH+nFl9M80x7(V;J!6Zi z;M>|bSAOtCIrwaQApD5z#N(L642N6Xj})}ig2jWv*;>hQ9SthIV0>1>ETLTr1}x;| z=^~<|_r?zIyfH^;tsGaNBa^~kLsP?zk?~|w3f>1r$4Wqr6N?w-Nnc9iVb_%d?n`Mz zH!20O`yWj@oi%T{q3_zo5vL zUiaV#&7;b!t{quGQwRi^$&2Y%cJ@vXltvfgRSL9H5UX-6q=npg*e@h~G9du5u?)m` z@|14wJ9x?xx_xE>Kllxr6=`K^RZnt_)rYH2v8iWQS4U!YE}guL4@hi#89RsE=Sfyd z+x3^-E*t3WJGw8Sp$7Y}vHQ2GLb8_iDjWRJCfX7w_=<^eUZ>GKITfciRSXG#CXP>% zsRkLbx%f(C8`-qQIZiR@GCr}Ib6kh3Fxb7O>s3iOASLx zd40PcbNQY&kX_=Wt7O{qj9uAon$mL)8PnwEl5uAqUSl4OFPR~w+DIc#j0H}LELo#d z5vJ}~|AMYQ5eg8IVB!NnRbCFpS?TX%uO~VY#>&%_eV!wYd2<-wAkRBJb^t45} zm(_wOPC+blrrKtDrFAw&dSz7>hLsD{l6yEsHRf(s>#p+!lP@1_uNvBW4`W4L{OFRjd~#v#LhR zx8z8^Iybgp^pb99G{e*0K(6xr;%x!nRn4&)$+Izw)uQ!qTC3tP@}ee0{+8&yW7-az z){Ea88I&K{d@OqAvn?+gn>43$ISG0(B!2IM-=C;i!>KY?3_p_zQ#IKzeC^bgG+^bFo z9dfb;l)7V44@XmLQhPc2mk**|Rr3l|Iy*%Lc)|RdHX}U#Tc^&7kDy=-jg%9=es8718*8BRuBH!0;jr?u<>(MezZD@`!=60JpKn%6z7@5D zn6y`&`#wDtRKzYnmEI_~(`I%Opq!>n9Md=#$_!aN97ZC83_|aBlXfwyOg2SXbFpOk z{&2s^+v)j!3EfhLyN&|D!&wz*sWF&__D5oq%NeCWDf}^iLn>|&k~}5gQd= z0y#j-4sfoum__-RN8zF`{>G)bbN%Q$xzhmlX%%LbtyS2aV8ZEo;?<4!U*52&lVcjC@mv5gu1X6*%hnCPHXC$3yLmo6?uQ(n&}wYtCK!Z>K3yPb8| z8in1|joGtd&fpGrW%M-~h`0zV_8fI}W>&nMu5M*%%e^LQSqqXBRq^~6JsD~a<(1#9 zn`92_@$SQG^S-|n6_SMnsL-Dp`*{E_gPi`1LUMwNbI^!Jd&JO@DRz^H9(9!aL4$?w z$3VdU`7=wUAy#=^RGruqM&I@>NCK>;^De^Zggupc^YVCpv`(@nZnwFc|Aj0yDy1eV z0Oo9DyrB(@wk=JqX@0Af11+HpRp*1GtnNf{3)&{R7|761Y;~sq;FSV!DR=oQk@nY2 z2aAVsT7fq^O5jgFH>zp)AMNs+TEh9svl3YPtwlw*E=^ZOw~I}-E)&4(zYENjBJEj| zcT@K>4&&rb6Jir4C6j!sb3$VlkF-@tjeg2$vnXX;$wXAr81|xd|{6Ejw%t)bX~&p^sf_` zDf9NjmxPcNScR;a`n}YFqqti45K+=q{h!w~ZZtt%1WijY3{$ zDKL_v=#aHFf@wUs$YZJA6CQplc$S4q^rjkt;@rAxQ{Y8=5_fAPDT2gu31jfxiOm}WGaT2Q}CCO8@!ITs?#POXe-2^I=^FF0rbnNAe% zQxhJL@o3s~lD#cJWa|my!hBVq&{nH^3u7pV-G;m4$W=2tB0@IHmuCKF8yU$W7m}}M ziAk>$qR{3+#?e#T{`s)eh2x}2c5`-_MHQmU8dUrCbSOvP_9+h0#kJfa9cEkR({Si6 zogHBAHig~d=q;P;kmv3FBJJnf&HY$cbWG*7p7rGxk58wy8dPkbKv19dUSyn}$r0$T zjO~0lXYelBS%e@jxJcig?OxYM1tg^Pv@FPgdY_$f8M3u)zKq;nDcPw#g-(G{E)>ps z*_)WK(t+x&Ew&aLf5;k{oqx$8XKWPG^aPij28wHIQY^!Dkm7H{gWe4qt(r^X`dTPc zY2&Osx3B|p%zCjjc^Y3qR_Fo71e9nSvd&!KAVhQtQ?lHz_6iWY@ua;M;NTCq)wHCu z#~@vG=_p?+JAtavK(0w9L~02IcUylpu{W|K{=}`~M92(j`h?^{tlwn$|__Mx=(V5Hev*ofi{n{N)(oFjOJ_?@;yTGur&fH?t!k3vw&qPz>@W&o-eHA#Zg{u=6SR)guPw_KffpUw~p@ICK z6gG=b%w%Xusph##`~Wza7|xPT*W3CJjf<^q{ulS=Z<`0O9_gG{ZR>#P8<;m_5OUAB z05@0U_#f+t-Gl^Hy1zqSE&8`N4k^P669;Cp+;P-Zai$wA$~U!=MZXOr$hn!vcN`L(05u3Y|ob_CO&_bOrL zF@{%k_>a4_p>BvmABLJtAX|D{o+(#aX%y}y*^Bj+3VjiZBMpug)~TYZ)mS7sHV4GL zn6NgrU%GK^A0C#~$>>CuR!zn#SE3gNe%j<%x%^3ljz!GhG(>Vwge$e{~C?~QGUiG#rwO@Nx`v*X7gI9biO0hPEP zz03^j0}EW&9dcP;GSii=u;%79=FXftMU*yev4oGM1{Xz_FzQmBm%1}OLuVR{{Xu7Z zZxFv1L~gVHt)t~t7mzW!dOpNNi(+w%yb8cK5;KMSM~ngiO2jkKQUqavyWu^jiGuUk zL|9X~2JDFhp(7>rSIwG%4%l-vY3ekt(CKz1x~Pt^h)}YMQQhi}#HEbc-!>#LV-!Z@An-Vt-k;K)eqJsz6SYNEKP(f?p_s&&8Yc<2cqYZ)L;;UC7 zQ0`bQCSMI`$@-jTd6B27e5JR-TELx_LTB|$67S&EZ*obXr4q16JlZFszi_!>n};Pk zRAr}qkwIh8fRDY{8m2|d2bn4<+Y=8{Da<7!Lv~`rD&=1_F#Tkf?877^D12rhw+Xi* z(@49gP?>pgxY-aoawKWcMEin^dlzs0j}9lZuexrAZ0#H0=wC7ucz-27bs-+90KJbx zAm2kU`66{kkO9(_B)!AaOp5)^d+&`{oW` zWK9Q=rymE$bC1?8(L!+wigN!Rm!DqP*@s;`+I{Weq<0sWNirI6TaNfxhMaK1^`?w= z3+Glv<1nJ3_n|3J<$Toe+(W#LY&AJ1Hp|E`;1t-sYUI!~B~7Y11Ep$|M~d| zxoQaiqINLooTLS#xP*%2{v9nVQ)-PURDMdf*AlByz+EQ6X-MQWdFr$M?dExtvA@jh z1yM8;Vo|`EyJoM!o@fm8S9Wn~rkkE#a6G?$bU0gWI2m{!m*kL}?Y(%igf<%$J43@F zu98lJ+je|wWvQeLNak309E%p<5#5UqTYf_+Aa_&wit>+aZnM21Uo=q??(YT~o0t|2 zR|@A{=Jej*mM2Dm#SLUy*P!W@3Y_U{)AKwp!#BpN|5AO+^wlz)e!dbz^Nrnp=t3s+Ht zS2Kvbay@yv?=Ms_Y-bX#Z-NCh}M2 zURyK~NZ_8Uh{GVab?T82*l!}=1wp-u)>-ZU$quyjVD=e6px`IV^7~{?4%6E^X`rHb_!;`YnIL8PLH(u26}3&B5tR zIa8d(J}v{iawPxyKk`kyAQgiI>8Wy zF*q|%l+ie{ehiY-Vi9VxKbItrnV%WaM8E@}ik~gad;$VVtOPh<9zfjm9gf4>D^3e) zBe1vz1pkpu+pt=j*zyj~5Jc)Pu0+J8!>gp)7#cKr7M=mKVK{^`t=j9fJ2m(K{`2~2 zX98dbm+RCZGX?{OIVODVw7aV0H2gO4cPGaT@DN zZHKu^4$@{m51>aseJcl@^VFwGAs2pR!Y~Wah)oBE^&Tn)nwMMzg=GNnt2*}f4r^8D zGppJ_VXfc~+fph2!mQ}(S#dt{?}-|qQ1*vutnoc{d|1N&x@gJPUupb;hSNu>0u;+i z&y$vI#3)SZu}L3@Ax&KfR<*bai7^AxK+JYQCWwqDs~cx{L-X&kP*(Uo{#Eo zS!0Y#85^0D$vcE}2l~?p7oG5_BCzAbDxh|>a)6j8E+rqx0^Y-vG3teWc`f}8k|Yo0 zrI>J?DhL6vQd9SGhz)bUrnD_@O{AyIGKej3o=TD>X`>j@Xc;5gc@T}#vq~D*awsnk zE%e{gZaY}MBjZq$eks2GQ867{QY*EJ?+!x_aZg`*0gJf>-vZ)&dd zjW7g@Q3hkIJ5L;OtIkYJRc{Ckez_>X+98Grh}BJ2g-pfrtyOLJr^()4&oBF%jAu%w zE9q8lBx{O!$7T*$;=(&@H|PB5SoHRyL7WjlyXJfDgToG*F7UxB-wt2uTJc4#X}5u^ z*1aWHq1^X)+G=TQ1M0%02ZVdW4lXvSmXWrJ$F^Q@)g}Vpfy(cwp|;6F2;h4AfR|TL z3zVX8Dc_CKZ{eETHM&X2w+gVj%Ng>cCvcXbxEtbE6RNRo} z5jXkIl0fayW&BWC$4?)}7S9e(ofKk;tN&5uFzq1l~ z!gnjPro}mkz~R(Z*@F!ZbAmoBg#8ZLMukougi>Rz%j+*B>K|Xa@c-IVfqxz})dm%s zwgP;_`jfwFx@}pdu`YgV`2mY{pzdA0(HNL|+UtUU6!riE9c$S_(P{8xM%`*s=cN{V=SAy}r-WZ=`eTBt8A^A+H30~R(rP=-A(^Fw|w{?b?QAzoB zEmXC*7eNbrO03l6>FJe3hZ^S{EJ|wd1GWbFcl4wHdQTNZG?c`LMVMI!ModE5ztx>X zpIZkIWo%pQ+`)z?YQiEi2`E?Qfju`G7pEM>gQh`VpaQ()Fx_!MX;zsecevn4y|S{6 ze>CpT>PU?a%O>lkMHS0skUR@6Q}ks3wk|54zE9~~UU+}tuKL3g{HU(Smk)T(tY^gam`2=J4XHn`rixuKX)_{rP-Nh0?#n3;5sQwd8B` z1urK0KjF3fC%hJ|5%B&FFPXFgKGcnnc~fJy%Z{0=JIh6QlkmU_4D7aT@hy%N)QXB@ z^Ro@j!;NXD0)cv=068w_N7Yu7_-I_2XR){&pz~!B_89+B1k5&z!l&U!qhEtCaikFj zked`Fm<3x(6>su6xG`<`UdX`Ty7-x$+FY-*T$Poad=D#@m{Q7ELc4*t@WXTrZWL<^u;BD^FX0fuct*uszC;SiZ*3~=-dR- zbtbO{+MdV{In!5ddLFHfQ?92)eiC>XHJR3z3+1cibT3D0{V=c2?rhx7v=95O%B2>5 zzkt;_@bU&@vx&3C%c+=e9_|i9T5EeCrf0(c!*?+vL6vPAFo#;}21h3HVYIYZB&tO@}%FqG5WD-3m=fDdu%~s09FcWyv_Yn z7X^2@#AFH(b=D~&wqUYEsB+3B7SR@Pd1NHFAIp#tQDX#^xR(B*{oGpTR-p^Dwl1c? z32P~RJ8p|rJX2IH6}qdMbC$sBfrAalupn(JnD{JikQ|~(aAP7Sd*I2&YGpKB7cV!@ z8@oVt+5oIbiaeUU6Q>EGIY6AzFgQ-2crOf*1e{Xh;_Y;0yA11)x;d8 zwlw{Q3rQGUWr9uuuLfprAQRs~MuQ#OLMQ5*y}aC2O8XnMzluf7#v6>oU%I^=@n3`G z&nIujRoCtFSdPBT?!(cVu*8+^(3pk0aq zkjml0PNK+<>yyK5o_YTwF`MhS$!5^+N{rpfKL_2o=_W`<#6r`d)Z-yP(&d%)VVlmD zr7%7q*NpU5lJ?VyCn-BDre5lc=ghKV5TuQXOI;;<#eCT#x<+nVB3anM>x^ekcFV!S|7N#h9?C^UQh@hjQrOm!Tx%mg)|NJ7m{L`6bE%ATt$ zvgYBWSUS>q>8NEvltgpW*Kx6>Hk2JOQaC5Fl|sP6$ted=DDtRjoZzj=y`--rsG5`N z;o|S-h}t&&rEAl#ywNb;?XWUI{!MPHa znkzJY2UZzIRuLD`%j0Rt5bh)OP=m*qf|`dRBc9s?TzdoQs9aV7K(Jw|7>KqU%8~OO z7$r=+b_1fU-s|(*GABmu!bEku5#CiKG@ERYZQc$rtNl?U<11I=upC@Kr1av0f!eoh zXf3KZW~da$aM>j6oG@&@!i&s?k3lVu9^jd^=hmt!_)>nJJI$ZDCWqeK*hJkF4Wwa; zx9{B7eXSvc+cGt+8uTDpfo-ji0w7=l_j|pc0wCZ5r=lTL2>`r9P!+^ynm6EU=>Nx% zj_Z$MzTgsSjSb9#e%w^}fuYGFpRs3SW*M5TNso`d{dPO`-* z_{$KL$@_99;qs8Lu}mhrx>JRrWb@xqsB10dco~`Quqrtdr{NXTw2|);Zh?3 zv}TJ#CSUXJId-n@Deb5RmJh*Q$Ci-X2X0%xo!1^YFQ%SMUQPpw{+vIugNFq;#CO`@pnx>~<(D1;@W_O!;x;dZ~7`^-w-&d=Mi=*!Q}KFvflr$&Gaht(^ZS!1eTp+6M4 z-XDs5D2Ou*X!qxt`{2@-B1aEi6g)ggXUpfiz|#}L@p?-tGeFwwWMd=04VVd%c@`EJ zy8s@nI9BO3Pa6|NH*^{zaiH1=*gU?)4FKN7Y$PUH)!zBr%~He&aLy=kb^#}>mPlVHj&4Z z@zb0YOi3cR06C|mR%<;NNzHQ0U(Qlq z_U% hC=9Gf>-o>CzBj->X&3l$z>K(A5V_VbImwmxw#d@m47!FPmCP`j$X(@ZNzK zqS4gyP>6!TT+GH7Bg|#Vb<7mxA>txR%iTpv$xzZa)f!4JQYwDdwHT`a90UZEt9FxRL~Ku+^hU;Ij=3kOdQ7=n%&S{WOouuWcWRIr$-wjEmp=0i}L=^a>z%p;XZyT``m+FVa7nA9!sBNJ)D*7ZImVi`tc9 zZ1$$MTPPBrV1X+(K|Z&~*TVslm*cP;Bs5FVLKqQpaW^6zO_6GuUNHW8NWfV+d|ux* zCMKm~l*C7RMo$!sQY@&jO7r5n&5g_^Mve=*)X)xx^$f$Vvyi1ZcR;k zrcRStFV-y~B==i=(?@4iy?Pu}t)4R>txoj%EN2P{e!zi4J4Ex*G%IB77Fg(dEh_js zmGVR^UpX8yGRWP}?rvBi98v%fVZe7-(^X&EUKs$$FrXbA_%`_#Bp<&#AAT_8`dwj+ zKd$J*nSQ(q%>y6Rlf_)*TziKSs2J+BV>3VxRxN6kvJtK=yn#0pFYe^B9P2aZZohi4 z1q$E_`Ox7OqUl8728Q|lw)%DCvId6ZH*g<@XY&h&_9b-vhrv^AFgO?R87rO5+F^(h zSrhxcZni@hu3IJU1URm>;TruL+4j^LI5Xix9`=Z`w>jpGNYp7}C!f$)ks+C-w~CiF zuQU*5v9mtH);v(;2sDY&q5ats)61;O1W_!pm_4&Ny2iat%c1m&-ade&cKa24+j=b* zYPXB{O*zp`4RYYMb$DV$!%5BlH~8&g8l7qG!a?Hsf%lB@8bZ%`2vsdp?#cv*_miIH z8~q?i=K-Lnt*N%#AG~IFv?6EtEP|{RNN07(xI3Fo_-%?Rq65HJOXSr|BYYg{X#H2+ z{pzB(*X!4=2!w;O_IjP0EuKYY6=JIic`>3efz2$?SOk0*>*hLmtYn8x#)GWg);Y4~ z3=S2Y{!jpWQu_RxlI`dM?gGAxI)gB-NHw)&NiWpo7LH50@|)1wGO7Jou-bY2fgr=3 zckJFEU@$gC2L8>J^0P{KFZ`Qei$R{46K6tFaT;zX3S1?#>yiU8Gy;2@DOZ}#zubcL z|NXTKf7WLI{>r8QA&(VrEn!_@fC2y{WB$k6aU4yJtc+;?JpQ@&>`YBI9E%mX3+)BF ze+@hO9OF}M2j*c(X61|ozfF8ZE-Tg~VId-d=&}mJH|{%B;B5V!{844_EK3X@?Q!uk zOQAHrPA+ETP?BXT@dPSRBn-~+#3lFp-Nsz}pu_X1nM60e{`a|x(|MW}SUxo|!i)i} z!^!QES!Vz=x^TQ)j1vxr{!Gd?TrXRUixA*KaIyD@%kHXpaQgL9WjC^c7@a(Ygb{b7 zQF$`MxsC3gi0ycv2N_{Em^tuZk$ zA+fL*ZlJPneduhV#TR3Dh3@v?GaC2Kn4iP%`oc`9(s9~@!q1X!7MRVw}eyo7n$g` zc)-GX%F6bJX$L})w)w`32||f$o|AX1;W1kVmgTFGlefIq-L$sRZGqtmA^|=b#WG#B zX$ib)Y3t+x_nCY=+h(8aJE!WjW6k#`ss&)5$CC$H#-h)neVHHuv*r)FH>mV>Zw0`6BH( zU+y;@ulKv?Ls=cK+vjXvu3z2m&{0lL_%aA!tkV$9(hBUXV*sY(8&bP;zN(8yM)biL z<4#mZxnj_Fk?cg%ey4J0!kI~LSx$}RhC>lEAtfo%Ra7HI=Rchju5BDN z$dJLLP}1AJtX8poW)&&Mrw|as!ELKo6lx-G+VUF#MvGn?!KE=OynnKQ-?X!2N>&kNllPc~(3OqhBmD@f1Q7IK1uD%6Xc zmz@_`FN(Y~?Cn}yp}1U`E4oxT8}IAHlTvq5VvHlr;3V~wUTmGW(|BZwa%(_SjBPm5 zJpz7^+$le{T4WSbk~dNtaf9yj0(Oc0jQI?C+}o5R!*L3I<}qGkL29f8`H5c<4wL=M zW$mAz7JOQ2e`7OHS=v9nD)HKnkw!3LuFA5B%smN*^u$#cjLbT(Y!qE{Gkd{oSz+94 z%0AU$QzaJfD%+?d%1vgi{gT7j?q0_S72X2|?CGWcw#oa8D_EY_HB)9woHOtbR`HCj z%i5Qbp&GW@;N4lD;8~$3So8`raR&)cWgs&rqT=F-CvA;gK z4LjwViH<0^3wc@45Vskm#4n@Q)9e%cxqTEU3 zgX4m(Cf31ji8-FN)i?HyA6C{9mFMU>sPM(2_pJPSmDX9Cvh44qIS;)Hu$9_prZF@0 zZcn)#`;02o z^c0p;Ju{3iZ?$=VcU4AdBI1dtdhPuF{lYPWH<7oDvZTn26N~*A^mE(-8HfwNc81tr z>O*;d>r&6`W;3i-d}{H5q$|MgC8cRdH`m5Drgjmpx)IGe&qI$;D-E(|L ztv!Ru;Y`ddtb6(Q3kV(%Iwmf0T=ImJlCp~GNwrhz`UZwZ#wKS>ZEWrA9UM_kUfvfj z`uyeV7jot5wa~EZ;c@W^iAgt;Q*J$cl$M^6`8X@PxTLfU^Q63@vZ1l5xux}4TYFD$ z->ZJ?z~Iox`_ZxSiOH!CALqX;d|g~xURnKy_Y3dmkF@0&$S*p;FCr2WViGdEUr-_+ z;2@?WfpH%prB~D=v+`iz5ewRbK;B3#swd|?dU}r0+Or$Z#CL3je;)7Jre}ZVSn&Vk z*-ys^ehon=0nJ$=I$}DAJY-G(VYndV-{aqF@IS@?@y6gzO=A`cI<|129uNg;L13Ne zramiPP;#@f!%yGH?db{!h9n{H(5bWMyp6xw3|`l|qY{k}{Hoi&1id0G@DO9mXXm5w zq00C|u?8l+FyWpmvU7?Jh4InpO_p`!j4YwzI!GyYUK-1WcB#Aho%r?TL&|n&aj6`( zIW02xC+H1VX>18rarm*d`r25D!Lw_o;_ncn=Ddi?_6=#OMB_!puk}>OHegz!8 zu--7i7XDiaMelCSzKxr`R_|?E{#k~Ynn7y(J59Wl)8K7E1A`Zm z4eRf;G8PV(bLUGPxA?AHg6<2rXpc&KH;tBkTm)r#fMXIa$Ex07h}LKysT^{D=4q<< z1`Zugatkj`E9Y8ieoS_OW7HZ^vKk|!z5$mBLvlzm({|Kc$$iG3D{&$y*9G;a9pQNq z%5=f!wA>r?t4mt?3ukEZ;FW<^OdAbpPc%Ivs+-1pyJwYZzmxx}KYw5?Dkc{wFbr@o z{9SO~R@N?d`rf`Sc3$|RqwG9I9W2VCFj8~f$8r6Vu#z4hqJit6&qt_G0`~_6$4B&| zIJ?y^aUxyv>JM+4e6l@8yzvf7Un!1DBO{GLhuA3ed*D1!rRNIa6uy|Z=`tQVzFs*9 zfEtgF`Gc~hlulM?V1!bDq3c5FuFKCke`ulj&zU%kuk7oyS zJuI!u>=+M2sS%s|9c%G0=zmp_wI*~ZK%w~8OP7r~(WQ5Rs8rt;l^0QVK0l)}QeR7F zRFt-ccP6mV-!d+jt5i?FH0PD)$mPB|+<@!*#HV8(>O+<^%3}8#(*`wux2J_io?wcoSy+W1ecQ_Zw>>*6P2E zed_#dHtn3_E9Tef*`s}Yy|l9VsH@EAN;7?Q<8l4~o`kuzd5_a60U?VAfiV34lOPHk z;zVtMvaA3`YUuzC+=xHe0M4vqURaUM3Q&Q?!V zupcooFkqn;y|;fq_jRNDjx@#0W~S#2C%O(dZrm*p2)w1Ue1Y*(ok^-~P@JGDR4t=C zcABV0cyfdU*00xwO6NmNL724K)-0ZTw7X}?ab^D0LgD5Yl#(`q0zCP7^ zv2x}I^z|oW?4!i(EWN2DqehS9*XwDsH|L4=h0xtixI?90BW@`0j#3FGuIAuD&%e?s zC0bT<;w3+`t?+BbMy*mBGC#Lwh=dk{_#^7Y?*c0}^IwK6#1X|a;ZU9v4k--zM5nV! zHM6dGE28SYMP)76P5#AYn#B4*n^o+%!MguJs}RZdHn*gCtD^%}-o;qI4P1kvIQs+g-2_DoPnJe=)$!Q&b#YOcT;t0e{ zTXfyOx`+zeVCmJc5#hqMVCC6XVZRDZ!KRXEQXniDfU~sQL(|IL{olykic0*?G=q9z zS`uXq&4B!#%H!IYG8Q5gl^Z&lu>v(WhT<~OLMc2IufA@KTp*;#X(dvabLcu>GwQXfBHvbtgylGyXjRGD&3qQou>US8H*uvfFQHnP>2wOUz}e(dTr43#5^ zYYt>g#5hh+#H_wa<#4EoLQZCr%GnP(*WJs#nc7x%87G-($jwt(Z=5|RF(4NAy)QU- z#%<0yN7HsNHteiI-J1iZY27RFakOxnb0!xvI{OrPuQ#D>*92@)fz5kp5{a= zmzTzfhuY-gavpR4ColrR$4SR2{Tfp)GT%AM+9(owEtA!>YS_b7*OI1n8ql|0{PYSf z?wN@(l>xa7}W>5F6=htP=P zd)((`j7}lH)Yyf_`^F6}iWl$nBE9lBhXeQBH;-;vNn?9Ge(T`Sn*WL=5CL1&I+REl zP#ypErZ;&xGPh&e^0%-TQ?XCgN2;NkHkaaIG73g*CP)YGM#gKd64E|k5cv1xZF0Q3 zq4C<4gv1Nnlm8w~khtBAywm6dfbReA$y@S$o8vpXp?4ZB3h2K70UF;l{+DD4ravJQ zG7I*X^fwS-I zs32s9K=xT}y9PhHEx_4#K1^=U{={Zm_P-x3bv0nXL