From 7be4e0ebe26d94e59fbb3d42a761f8a985a7d0eb Mon Sep 17 00:00:00 2001 From: Gonzalo Gallotti Date: Tue, 22 Feb 2022 11:25:33 -0300 Subject: [PATCH 01/12] Support for ImageHeight and Width when Storage is Enabled --- java/src/main/java/com/genexus/GxImageUtil.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/java/src/main/java/com/genexus/GxImageUtil.java b/java/src/main/java/com/genexus/GxImageUtil.java index 4c838ce52..8da9307f5 100644 --- a/java/src/main/java/com/genexus/GxImageUtil.java +++ b/java/src/main/java/com/genexus/GxImageUtil.java @@ -8,6 +8,7 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; import com.genexus.util.GXFile; import org.apache.logging.log4j.Logger; @@ -23,14 +24,16 @@ private static String getImageAbsolutePath(String imageFile){ return imageFile.startsWith(defaultPath)? imageFile : defaultPath + imageFile.replace("/", File.separator); } + private static InputStream getInputStream(String imageFile) throws IOException { + return new GXFile(imageFile).getStream(); + } public static long getFileSize(String imageFile){ return new File(getImageAbsolutePath(imageFile)).length(); } public static int getImageHeight(String imageFile) { - try { - BufferedImage image = ImageIO.read(new File(getImageAbsolutePath(imageFile))); - return image.getHeight(); + try (InputStream is = getInputStream(imageFile)) { + return ImageIO.read(is).getHeight(); } catch (IOException e) { log.error("getImageHeight " + imageFile + " failed" , e); @@ -39,9 +42,8 @@ public static int getImageHeight(String imageFile) { } public static int getImageWidth(String imageFile) { - try { - BufferedImage image = ImageIO.read(new File(getImageAbsolutePath(imageFile))); - return image.getWidth(); + try (InputStream is = getInputStream(imageFile)) { + return ImageIO.read(is).getWidth(); } catch (IOException e) { log.error("getImageWidth " + imageFile + " failed" , e); From 96bef678829877e96f95d868eb6546c8aa71fbc8 Mon Sep 17 00:00:00 2001 From: Gonzalo Gallotti Date: Tue, 22 Feb 2022 11:55:37 -0300 Subject: [PATCH 02/12] Illigal Argument Exception catch --- java/src/main/java/com/genexus/GxImageUtil.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/src/main/java/com/genexus/GxImageUtil.java b/java/src/main/java/com/genexus/GxImageUtil.java index 8da9307f5..3d3380dc9 100644 --- a/java/src/main/java/com/genexus/GxImageUtil.java +++ b/java/src/main/java/com/genexus/GxImageUtil.java @@ -35,7 +35,7 @@ public static int getImageHeight(String imageFile) { try (InputStream is = getInputStream(imageFile)) { return ImageIO.read(is).getHeight(); } - catch (IOException e) { + catch (Exception e) { log.error("getImageHeight " + imageFile + " failed" , e); return 0; } @@ -45,7 +45,7 @@ public static int getImageWidth(String imageFile) { try (InputStream is = getInputStream(imageFile)) { return ImageIO.read(is).getWidth(); } - catch (IOException e) { + catch (Exception e) { log.error("getImageWidth " + imageFile + " failed" , e); return 0; } From 92119c1b9183cea29f5cc7fb25ebf622557ac90e Mon Sep 17 00:00:00 2001 From: Gonzalo Gallotti Date: Tue, 22 Feb 2022 16:49:13 -0300 Subject: [PATCH 03/12] Support GetFileSize --- java/src/main/java/com/genexus/GxImageUtil.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/java/src/main/java/com/genexus/GxImageUtil.java b/java/src/main/java/com/genexus/GxImageUtil.java index 3d3380dc9..23e566873 100644 --- a/java/src/main/java/com/genexus/GxImageUtil.java +++ b/java/src/main/java/com/genexus/GxImageUtil.java @@ -28,7 +28,8 @@ private static InputStream getInputStream(String imageFile) throws IOException { return new GXFile(imageFile).getStream(); } public static long getFileSize(String imageFile){ - return new File(getImageAbsolutePath(imageFile)).length(); + + return new GXFile(imageFile).getLength(); } public static int getImageHeight(String imageFile) { From 8132c774b4d0f4fc00a8036b8f702ba633a76e01 Mon Sep 17 00:00:00 2001 From: Gonzalo Gallotti Date: Tue, 22 Feb 2022 18:55:31 -0300 Subject: [PATCH 04/12] Crop, Resize, Scale, Rotate support for S3. --- .../main/java/com/genexus/GxImageUtil.java | 126 ++++++++++++------ 1 file changed, 82 insertions(+), 44 deletions(-) diff --git a/java/src/main/java/com/genexus/GxImageUtil.java b/java/src/main/java/com/genexus/GxImageUtil.java index 23e566873..85cfa6f70 100644 --- a/java/src/main/java/com/genexus/GxImageUtil.java +++ b/java/src/main/java/com/genexus/GxImageUtil.java @@ -5,18 +5,19 @@ import java.awt.geom.AffineTransform; import java.awt.image.AffineTransformOp; import java.awt.image.BufferedImage; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; +import java.io.*; import com.genexus.util.GXFile; import org.apache.logging.log4j.Logger; public class GxImageUtil { private static Logger log = org.apache.logging.log4j.LogManager.getLogger(GxImageUtil.class); + private static int INVALID_CODE = -1; private static String getImageAbsolutePath(String imageFile){ + if (!isValidInput(imageFile)) + return ""; + if (CommonUtil.isUploadPrefix(imageFile)) { return new GXFile(imageFile).getAbsolutePath(); } @@ -27,80 +28,114 @@ private static String getImageAbsolutePath(String imageFile){ private static InputStream getInputStream(String imageFile) throws IOException { return new GXFile(imageFile).getStream(); } + public static long getFileSize(String imageFile){ + if (!isValidInput(imageFile)) + return INVALID_CODE; return new GXFile(imageFile).getLength(); } public static int getImageHeight(String imageFile) { + if (!isValidInput(imageFile)) + return INVALID_CODE; + try (InputStream is = getInputStream(imageFile)) { return ImageIO.read(is).getHeight(); } catch (Exception e) { log.error("getImageHeight " + imageFile + " failed" , e); - return 0; } + return INVALID_CODE; + } + + private static boolean isValidInput(String imageFile) { + boolean isValid = imageFile != null && imageFile.length() > 0; + if (!isValid) { + log.debug("Image Api - FileName cannot be empty"); + } + return isValid; } public static int getImageWidth(String imageFile) { + if (!isValidInput(imageFile)) + return INVALID_CODE; + try (InputStream is = getInputStream(imageFile)) { return ImageIO.read(is).getWidth(); } catch (Exception e) { log.error("getImageWidth " + imageFile + " failed" , e); - return 0; } + return INVALID_CODE; } - public static String crop(String imageFile, int x, int y, int width, int height){ - try { - String absolutePath = getImageAbsolutePath(imageFile); - BufferedImage image = ImageIO.read(new File(absolutePath)); - BufferedImage cropedImage = image.getSubimage(x, y, width, height); - ImageIO.write(cropedImage, CommonUtil.getFileType(absolutePath), new FileOutputStream(absolutePath)); + public static String crop(String imageFile, int x, int y, int width, int height) { + if (!isValidInput(imageFile)) + return ""; + + try (InputStream is = getInputStream(imageFile)) { + BufferedImage image = ImageIO.read(is); + BufferedImage croppedImage = image.getSubimage(x, y, width, height); + writeImage(croppedImage, imageFile); } - catch (IOException e) { + catch (Exception e) { log.error("crop " + imageFile + " failed" , e); } return imageFile; } - public static String flipHorizontally(String imageFile){ - try { - String absolutePath = getImageAbsolutePath(imageFile); - BufferedImage image = ImageIO.read(new File(absolutePath)); + private static void writeImage(BufferedImage croppedImage, String destinationFilePathOrUrl) throws IOException { + try (ByteArrayOutputStream outStream = new ByteArrayOutputStream()) { + ImageIO.write(croppedImage, CommonUtil.getFileType(destinationFilePathOrUrl), outStream); + try (ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray())) { + new GXFile(destinationFilePathOrUrl).create(inStream, true); + } + } + } + + public static String flipHorizontally(String imageFile) { + if (!isValidInput(imageFile)) + return ""; + + try (InputStream is = getInputStream(imageFile)) { + BufferedImage image = ImageIO.read(is); AffineTransform tx = AffineTransform.getScaleInstance(-1, 1); tx.translate(-image.getWidth(null), 0); AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR); - BufferedImage flipedImage = op.filter(image, null); - ImageIO.write(flipedImage, CommonUtil.getFileType(absolutePath), new FileOutputStream(absolutePath)); + BufferedImage flippedImage = op.filter(image, null); + writeImage(flippedImage, imageFile); } - catch (IOException e) { + catch (Exception e) { log.error("flip horizontal " + imageFile + " failed" , e); } return imageFile; } - public static String flipVertically(String imageFile){ - try { - String absolutePath = getImageAbsolutePath(imageFile); - BufferedImage image = ImageIO.read(new File(absolutePath)); + public static String flipVertically(String imageFile) { + if (!isValidInput(imageFile)) + return ""; + + try (InputStream is = getInputStream(imageFile)) { + BufferedImage image = ImageIO.read(is); AffineTransform tx = AffineTransform.getScaleInstance(1, -1); tx.translate(0, -image.getHeight(null)); AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR); - BufferedImage flipedImage = op.filter(image, null); - ImageIO.write(flipedImage, CommonUtil.getFileType(absolutePath), new FileOutputStream(absolutePath)); + BufferedImage flippedImage = op.filter(image, null); + writeImage(flippedImage, imageFile); } - catch (IOException e) { + catch (Exception e) { log.error("flip vertical " + imageFile + " failed" , e); } return imageFile; } - public static String resize(String imageFile, int width, int height, boolean keepAspectRatio){ - try { - String absolutePath = getImageAbsolutePath(imageFile); - BufferedImage image = ImageIO.read(new File(absolutePath)); + public static String resize(String imageFile, int width, int height, boolean keepAspectRatio) { + if (!isValidInput(imageFile)) + return ""; + + try (InputStream is = getInputStream(imageFile)) { + BufferedImage image = ImageIO.read(is); if (keepAspectRatio) { double imageHeight = image.getHeight(); double imageWidth = image.getWidth(); @@ -115,34 +150,37 @@ public static String resize(String imageFile, int width, int height, boolean kee Graphics2D g2d = resizedImage.createGraphics(); g2d.drawImage(image, 0, 0, width, height, null); g2d.dispose(); - ImageIO.write(resizedImage, CommonUtil.getFileType(absolutePath), new FileOutputStream(absolutePath)); + writeImage(resizedImage, imageFile); } - catch (IOException e) { + catch (Exception e) { log.error("resize " + imageFile + " failed" , e); } return imageFile; } - public static String scale(String imageFile, short percent){ - try { - String absolutePath = getImageAbsolutePath(imageFile); - BufferedImage image = ImageIO.read(new File(absolutePath)); + public static String scale(String imageFile, short percent) { + if (!isValidInput(imageFile)) + return ""; + + try (InputStream is = getInputStream(imageFile)) { + BufferedImage image = ImageIO.read(is); imageFile = resize(imageFile, image.getWidth() * percent / 100, image.getHeight() * percent / 100,true); } - catch (IOException e) { + catch (Exception e) { log.error("scale " + imageFile + " failed" , e); } return imageFile; } - public static String rotate(String imageFile, short angle){ - try { - String absolutePath = getImageAbsolutePath(imageFile); - BufferedImage image = ImageIO.read(new File(absolutePath)); + public static String rotate(String imageFile, short angle) { + if (!isValidInput(imageFile)) + return ""; + try (InputStream is = getInputStream(imageFile)) { + BufferedImage image = ImageIO.read(is); BufferedImage rotatedImage = rotateImage(image, angle); - ImageIO.write(rotatedImage, CommonUtil.getFileType(absolutePath), new FileOutputStream(absolutePath)); + writeImage(rotatedImage, imageFile); } - catch (IOException e) { + catch (Exception e) { log.error("rotate " + imageFile + " failed" , e); } return imageFile; From 935af8c413aa453dc0d2dc2e60c61e5ba4207d8a Mon Sep 17 00:00:00 2001 From: Gonzalo Gallotti Date: Tue, 22 Feb 2022 19:28:29 -0300 Subject: [PATCH 05/12] Remove unused code --- java/src/main/java/com/genexus/GxImageUtil.java | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/java/src/main/java/com/genexus/GxImageUtil.java b/java/src/main/java/com/genexus/GxImageUtil.java index 85cfa6f70..2933ef6ff 100644 --- a/java/src/main/java/com/genexus/GxImageUtil.java +++ b/java/src/main/java/com/genexus/GxImageUtil.java @@ -13,18 +13,7 @@ public class GxImageUtil { private static Logger log = org.apache.logging.log4j.LogManager.getLogger(GxImageUtil.class); private static int INVALID_CODE = -1; - - private static String getImageAbsolutePath(String imageFile){ - if (!isValidInput(imageFile)) - return ""; - - if (CommonUtil.isUploadPrefix(imageFile)) { - return new GXFile(imageFile).getAbsolutePath(); - } - String defaultPath = com.genexus.ModelContext.getModelContext().getHttpContext().getDefaultPath(); - return imageFile.startsWith(defaultPath)? imageFile : defaultPath + imageFile.replace("/", File.separator); - } - + private static InputStream getInputStream(String imageFile) throws IOException { return new GXFile(imageFile).getStream(); } From b2005c7f50ff84fdbcc6475a75c3c75e8e9a9825 Mon Sep 17 00:00:00 2001 From: Gonzalo Gallotti Date: Wed, 23 Feb 2022 10:36:34 -0300 Subject: [PATCH 06/12] Crop, Resize, Scale, Rotate support for S3. --- java/src/main/java/com/genexus/GxImageUtil.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/java/src/main/java/com/genexus/GxImageUtil.java b/java/src/main/java/com/genexus/GxImageUtil.java index 2933ef6ff..3936ac69c 100644 --- a/java/src/main/java/com/genexus/GxImageUtil.java +++ b/java/src/main/java/com/genexus/GxImageUtil.java @@ -13,7 +13,7 @@ public class GxImageUtil { private static Logger log = org.apache.logging.log4j.LogManager.getLogger(GxImageUtil.class); private static int INVALID_CODE = -1; - + private static InputStream getInputStream(String imageFile) throws IOException { return new GXFile(imageFile).getStream(); } @@ -78,7 +78,9 @@ private static void writeImage(BufferedImage croppedImage, String destinationFil try (ByteArrayOutputStream outStream = new ByteArrayOutputStream()) { ImageIO.write(croppedImage, CommonUtil.getFileType(destinationFilePathOrUrl), outStream); try (ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray())) { - new GXFile(destinationFilePathOrUrl).create(inStream, true); + GXFile file = new GXFile(destinationFilePathOrUrl); + file.create(inStream, true); + file.close(); } } } From 414d24698653d2d5601e4e65a9f3fa57db199b2d Mon Sep 17 00:00:00 2001 From: Gonzalo Gallotti Date: Wed, 2 Mar 2022 09:26:13 -0300 Subject: [PATCH 07/12] Add UnitTests --- .../main/java/com/genexus/GxImageUtil.java | 2 +- .../java/com/genexus/TestGxImageUtil.java | 140 ++++++++++++++++++ java/src/test/resources/bird-thumbnail.jpg | Bin 0 -> 113974 bytes 3 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 java/src/test/java/com/genexus/TestGxImageUtil.java create mode 100644 java/src/test/resources/bird-thumbnail.jpg diff --git a/java/src/main/java/com/genexus/GxImageUtil.java b/java/src/main/java/com/genexus/GxImageUtil.java index 3936ac69c..db1858ea7 100644 --- a/java/src/main/java/com/genexus/GxImageUtil.java +++ b/java/src/main/java/com/genexus/GxImageUtil.java @@ -15,7 +15,7 @@ public class GxImageUtil { private static int INVALID_CODE = -1; private static InputStream getInputStream(String imageFile) throws IOException { - return new GXFile(imageFile).getStream(); + return new GXFile(imageFile.replace("/", File.separator)).getStream(); } public static long getFileSize(String imageFile){ diff --git a/java/src/test/java/com/genexus/TestGxImageUtil.java b/java/src/test/java/com/genexus/TestGxImageUtil.java new file mode 100644 index 000000000..1cc37a3a3 --- /dev/null +++ b/java/src/test/java/com/genexus/TestGxImageUtil.java @@ -0,0 +1,140 @@ +package com.genexus; + +import com.genexus.specific.java.Connect; +import com.genexus.specific.java.ImagesPath; +import com.genexus.specific.java.LogManager; +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +public class TestGxImageUtil { + + private String FILE_NAME = "bird-thumbnail.jpg"; + private String FILE_NAME_COPY = "bird-thumbnail-%s-%s.jpg"; + + private int IMAGE_HEIGHT = 900; + private int IMAGE_WIDTH = 720; + + @Rule + public TemporaryFolder tempFolder = new TemporaryFolder(); + + @Test + public void testImageWidth() + { + int imageWidth = GxImageUtil.getImageWidth(initialize("imageWidth")); + Assert.assertEquals(IMAGE_WIDTH, imageWidth); + } + + private String initialize(String name) + { + Connect.init(); + LogManager.initialize("."); + + String copiedFileName = String.format(FILE_NAME_COPY, name, java.util.UUID.randomUUID().toString()); + File resourcesDirectory = new File("src/test/resources"); + Path originalFileLocation = Paths.get(resourcesDirectory.getPath(), FILE_NAME); + Path copyFileLocation = Paths.get(tempFolder.getRoot().getPath(), copiedFileName); + + try { + Files.copy(originalFileLocation, copyFileLocation); + } + catch (Exception e) { + e.printStackTrace(); + } + + System.out.println(copyFileLocation.toString()); + return copyFileLocation.toString(); + } + + @Test + public void testImageHeight() + { + String fileName = initialize("testHeight"); + int imageHeight = GxImageUtil.getImageHeight(fileName); + Assert.assertEquals(IMAGE_HEIGHT, imageHeight); + } + + @Test + public void testImageScale() + { + String fileName = initialize("scaled"); + short scale = 50; + + String imagePath = GxImageUtil.scale(fileName, scale); + + int imageHeight = GxImageUtil.getImageHeight(imagePath); + Assert.assertEquals(IMAGE_HEIGHT * scale / 100, imageHeight); + + int imageWidth = GxImageUtil.getImageWidth(imagePath); + Assert.assertEquals(IMAGE_WIDTH * scale / 100, imageWidth); + } + + @Test + public void testImageCrop() + { + String fileName = initialize("croped"); + String imagePath = GxImageUtil.crop(fileName, 10, 10, 300, 400); + + int imageHeight = GxImageUtil.getImageHeight(imagePath); + Assert.assertEquals(400, imageHeight); + + int imageWidth = GxImageUtil.getImageWidth(imagePath); + Assert.assertEquals(300, imageWidth); + } + + + @Test + public void testImageResize() + { + String fileName = initialize("resized"); + String imagePath = GxImageUtil.resize(fileName, 300, 400, false); + + int imageHeight = GxImageUtil.getImageHeight(imagePath); + Assert.assertEquals(400, imageHeight); + + int imageWidth = GxImageUtil.getImageWidth(imagePath); + Assert.assertEquals(300, imageWidth); + } + + + @Test + public void testImageFlipHorizontally() + { + String fileName = initialize("flippedHorizontally"); + String imagePath = GxImageUtil.flipHorizontally(fileName); + + int imageHeight = GxImageUtil.getImageHeight(imagePath); + Assert.assertEquals(IMAGE_HEIGHT, imageHeight); + + int imageWidth = GxImageUtil.getImageWidth(imagePath); + Assert.assertEquals(IMAGE_WIDTH, imageWidth); + } + + @Test + public void testImageFlipVertically() + { + String fileName = initialize("flippedVertically"); + String imagePath = GxImageUtil.flipVertically(fileName); + + int imageHeight = GxImageUtil.getImageHeight(imagePath); + Assert.assertEquals(IMAGE_HEIGHT, imageHeight); + + int imageWidth = GxImageUtil.getImageWidth(imagePath); + Assert.assertEquals(IMAGE_WIDTH, imageWidth); + } + + @Test + public void testImageFileSize() + { + String fileName = initialize("imageSize"); + long fileSize = GxImageUtil.getFileSize(fileName); + Assert.assertEquals(113974, fileSize); + + } +} diff --git a/java/src/test/resources/bird-thumbnail.jpg b/java/src/test/resources/bird-thumbnail.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8e33f1bdd82b9f9425f843c4df935d58a23a6420 GIT binary patch literal 113974 zcmeFZ2S8KXmOdUUDk>@>0!mam5m2fW$+Z9i0s_)YRHQ~gdQEaIh=RzKDmBujMg*i2 z>C&Y}I-z$6CB6KQSKrLMdtaZKH}jkS3!HP3oPBck+GVY8eQWK*`pTLB9nn(PR0r+Y zu>*7m_ye)`NmM+YPh0)h5{cJJT??E&8H05;VfeE;@deTOJ$*RS921WsNA z0ejF9VABP*Z?8MR_U)Qqj}PxUx_C;u*m|Ckm6VZG0I`Na*FZag+wR!$ZNKx|Yxk~i z`#rmN@7le0&)&ViZfyJa?Pc4~ws-G7_I>*ge0u@!4zeFO`0c~DANhXi&ON(!?K!}< zm+jXgf7g!n33PPduBSV{?Amb_wDahWT}OAY8bDy6?t6Z%-Zv3`eeKw}YxkbLY(O>G zfdVB*fa>qs1yp(uP-CDp0yq!aeRR*Uvlp-I<#MI2(=Dw|+y@R8Zho_gf zkFTHqlczz?f}g(#iHMAfj){E}7oVDzo{^dLE<5K#QE|z~(z5c3y84F3rsmHrtv$Vc z{R6nKgG2bqsp*;7x%q`f!p7#-HjzZ8P`}Bw1GMYASit^I%5@ZwYv;Ez;e}ffItVcp<_!(SDWeZxihC zKP1_|3HI-D4S^2s+5vRluA?9*h*7`-1$9rNDeJu~&>FB2JW+M?1U)+0kp&_xut4Mr z>iF_0@TT?}Y&x)%I14F8&N1(@Km-l{*tGP&~|^1vs zVS(DAcu(IfW}qw!MB8G4=vLtM3Kc^ZNR=1GprV+P;eWUfc=%00Hw{e*rb~t&XMwt& zp;;g#u!W{ExivyibM<;G5Ej@PyBSZOFdY#~^d~eAt|6!g3v}W475R-g(Dx5f9a7b( zUr;XhDm7M7v%jqc*@|C`1wtQ!G8s@7h+Bhrn1hl*!fbG?w3|3Ey6E-4t;FvdgIQb4 z0?F2FGp{hpLsr1$EYO?ZHtO%1;_D^oZ0s2JGqm)gRT>Gp$?@B2{H`r%Y;5!%8jiyD zuTJ?_r~Gbo{C1H3Yo`2bru<8N{X;fIT90gr6a-8H1pM7@Y5Z2>FABWI3laaLk!XS9 z-N=#5z&z9+jOr9YgibO2VJ{a^g%_~Du|j2ZO~4i!L%&UCEWbi7?+&&ge3KMOM`t^f?RQ?UCy))Zs z?$j^bSIQ9%BQ?c)zPP~5ffGAC`CO-d#-pw-KpK>2&bL%K+S=A|6FmXZApD*`>o`YUr#u&zXe1C1p5aH zJQpqax#EB*``gt2_Cxl$7xx!+Zf3M{UzurUOlf=*QKR^m@3JZ$NL}6=8TpG9`>!2U za`vxx&|mGrKUbi84;L^X)OL6tzxCg8xc>V32QT3l_e`mrW}B)3d%90^y|p@~cC4i@ z{?{Q3S5Wkj{oV+=R|~h~Bz3QNO8z=d`-1-V@%iVZ``drv?;hb(YnGyKP5zda)7+#1 zZM#XkUHGjjG7VgL_K!c$UOTlxl|PIym+ws2ZgxFmFq7wdSY;#82$yrYj)zJ|p= zwE=$Hgx8Oo{5|u1XBdqOx#^X+cF6ZxZ$pf;o1?hwFD)M@<(5ugw}IL#Vv68YQ-zt33pS)`9KdkWBkfJndmd7buKf&YH3_;>%p-`S?S z1?#2TtD=`jA$8kbC!C<{su!FL&9i9&I(#}D%J+@K-5BtJ&+{5Q&$F*E-eIfFnRLDq6yi%TbTR{I(NBjv+vNb-L>VQ?O-z)|V&SAea9>O+I>(K7~NsinY8#5V2X(7{#a1~+G!$+L7a6d>4H1gWmR%OfKYYdWq@MYO zNV5cw~Z^zA!iIV8DuwY3rz z9iReToqcUGDo2KGK|xe)JR>W}3ob?RF^|IZTa^K1$RpDUy7DB#qR#*E67QZVi=)g! z8x>6^iNdvpW=BdnqK>|e=-H49HhiYSc;ekFfck)d3{K{iXoWQNn&&fQp*yG-$4Ib5(PPRY(-~j)u>-$wEX_iY!4M8>wPqAp^WN67sZ5XkVw_X%Si|H&_nM`uJ-)V zlv3p!cqx)^)6RY6>2})wC5;PKdpQRZ&TE6OI?S@C2xuVFdq?t;bPfgmKhl4{#XWzk z&AY19UPu{(wN$#SrlYgWPgb0IFoLT5(zgk_Zf;Oox6;4G%&T{&_Vge1UK|0hl7Po_Xs7s&Xm^dMK;TzgzxCSL?TPUj?8e0ImKAEjpe8x_gJG;{DqT zngAsEPe82yJV^V;f8k7O#ovU{rIjll!E=GQO*IP6TT`q35^2*D54S_qMaRVEdQ zko0w-O6!Hk3oj{+wN{<)8oPvgzF`e%OM7E0LyVfnz|$vLpcsQexdqH;Bk=gtLWdiw z_;8XC3shIxGHJ^KU5o6D>@%i#mU}22TM;5xBC{S%KI56JQtWt_;dB17Yh7Xn3-l2! zUn%f$Qs+YZ_~sYfQZR+ja5TDml-ZT6!~#9FXxZbMs?*RrD zr48Lpx_bBWH+;kWhhcQ(zY*U4?Evt<-kzwT&_gl6kONd~%x@hE&N*V*95EH|35J#c z|J>{;4m{1W7YnRY0oTPm`ChsI{!Nt?d)E6%!E&;FUKxla%& z1`4HV5q(qmsu(e2ok$nG%IUUJiizI@YRG0X_A$N8wr}`$iEFj%J9<84+T`o3nb#?V z9B-*>zyj(sQ-4BLW%BT@_Ousmi$f4ILm#(TpSA#nCDgUADr_{XKxxA9woKob9dAb! z=*6^d76>+Hg?p}^FvYRMDLli;xb&Bf%$Ab;1krZv%6%3{oIb}HJ0+cXTS#toRGBJ^ z@}1^Cb6-{X;Va>je(uK6yxq|v1QBr~0hFku^Zhk@=heVB&)k1<7gGpfz}s1%^Ep>G zElMeoj-n+X-Wh0nK=lQhG3x)14$0qPAYsmdlzg%8P|XS3 zwQ~KW6}y_lcTW%vE!pvHe5zg=q=v+4)p~0F3I|L_B%kbGQs*294f-?-6D^5@`q@ib$(*QsBC z$Gs9x(D1Ivk0{*sn`57HkH6R`(y?D~w88<~Uc@J`Ejv+IIwFkCtey_c^9m`Oey#5v zvVk7L;L-W8uQhc&*N^|`|+aNn!Z>fB241{HaGt*j(;S~t_*54~gZnKtwN z!^1XDL#mQg9WZN##W?)l8vB;K+cg3b{M@tkDDI4_E7j5MVdbdjiRb~WB~6nEZFiu3 zbTr#SIQvkxdF|bA2j4BFlX8dj8ek{Mx_901sH3B1pA`<)pB=j9MbS0c$}2qSZ<^!6 z#kIx)9S$&)bbMpW6Xo{C>6P4x6@@j)9IHucKH3njKA>Bf)$ISgJ5F^mx!+Fnv1YMx zH|bv5SMmc}Mg7Lxq2{B^bKKSqOs=)@53msCVCo|O5%ALa>CF|RN*V$(=bIW^+&WE@ z?HXo=mB$iMA#cnLyp2)}(9At2`m0uBCj$=u>N?|Qv#5Iie;LA(^9-lbt`&2`no_{) z(_AtH%!~GC$>*vlC*Xeo?--0#qwD4Y=VRuzVa5%s{l8_x1fnCe zQzv$q^$#Q%m-XeX-dS`jc3%@<4|!XWH-KJDqc73*rULox@ue@{ut3??(KqFVy~L_L zb#))Y+hUC2b_pA$TXq_!Bwg#b%C|!w>-9rqU|Iuj`^+Ma+y+dh&sM(nb@nglCM?eN zAbFU5l4B2ErWL$FRHee~(mfNMz56o|!#zXjCv#?24`OAqpJjKC`g4rblyLR!B%bJ9 zy(O!l-*T$^bv?uj9PC7EafzGid+F5sFhE&kemar`YHnmj04%}2~FL^@)r}mvPuVxU#9_ zQvj1c-3H)+#tbwAP`f!%1>D!F8n?jF!ZX|1e*jK@OmVJ7$|i`t%O9;)8wKaf0o+or z@O)a{*ZhW)EzKovqz_i+qa{gg&aM-ebLrz$+lPVg19hHEir)&1#xKv(I+KPL2wJ?5 zaT_A~(8aM{HkE_Pg``+AZ1I+r%bZR*&Ah90SM+I)foirZ184e+x2j9;qNiY5R7?t* zvoGy@b1+;_Jz{Zh$##l6C1&)5@ z;EP>}UjIr?sC6SRX+OGO(PM(ZwUF{zpk(;8+3GR7u!fL2y^5tTCi96RAx0Z4kUc#g z6MK!UuyE*gn*?E}X?p%awM#nwxxKMW9X8U-O+<&x%Fdd%bd6C+K0RJF*EvW1imB2Z zcA)y07!$YCGEH(|Ra9kpFbS;c#lEzQK4A%y058BSR_V z;ixQg&Wi%J2^1mRL`tt8j+;E$;;7m@GkS*wI_+5*JAmbDF!Xfe%%sYPZ?^?)?n!*e zRSDL%fv(_XTz=GybVrtKhKmuo8Y_%6nv4y3 zgF3iQ){1^OHaHMfG1PhjYgCOJ@!{V|uAgvy-o5h0%U1h23pBMjhOaAz(oOJI4r8Zs zQ5<7dWx`c-Bi^q{ozb@TUucqClT}$SKbYG2!QHbUA~__XwgBz!uMcugdrQf6lIQ9_ zz%25JJeww2)kx@+#;yYBI*_mtQ>Ty@Tb%JR`b_c1@PJ}^993ceY`9q0ya~2qG-G}x zWv*9QLnQhkA9Tf-1*-2ln#Wt@C{b>FV`B%Clz~dB**)7|=F|9~rkK%afUGlFSm748 z4lxL0fvQiSesU|=V^e0rxo@eBOU`w*c(rQTU-stxZvhU>c8(;WoL-Ldp5~2ysr13p zu{0xoXpuwMfm{n~tzjd#t*VISw9;)=dzukxjxcT0VHo|3<#FfX zufL3HWOyNW_jhKbbYvA{t4dG_eVBY8dU3ufy!ewABu$S{MDGZfVdSWE5p%*ri({I< zzzR!4?aGS#s@Odw2aX{M`UBoDAftfahcra%6BVmr%FrqnNLPiuJ=qqIgo#ug&&JZ+ z%>$SFSs=mhbHrMc+VMZ>!2M6otKV`~U($1$%fr|skoTu(wMClLU~A)L1|RI_(Z#k3 z;SuZ@B)lgUi0z@(A+!M=pOY1(a8E&qWKRIDq2|IX1YZMpg;mSL2eaaz$D)ZUXGL2x z95h{0nX|Y>)Hwv?y>#}o*4zv)9-~*KrB!bS25{>4>hmoZa1X~#M~V%vF>`Kw&4#sM zrmSbym5J46w!w8^F3Fd07D$ph{RE)CK0Z-lp2T=OmoA%He{~C16;iRO9l&Ip;XgnQ zvUueC;#NMCs6~7^xpsf6c%VXC$D(3G^-)P#i03QQ@HP=D_RR%U$|=K)TT|>ENK4#j z7U+6*D_T5B(dx3{CFqOfLuEJa4;0T@y=TmvUiz80fyf(FljbTm%IWd|B@Sd|RoURp zlfmR{B{Ir8$xP#@T1}XyhlE6NUwS3X0^O&={-$?Qk}F93)n-VvnBSNLWNfb7K`Gt5 zGwyJWMJ&vLAETEdK{Thw@^!IAi_#M`m6C|R2e8?}>J!7=Mmu_HsU zpr@@X!}05=;YfTG756xwDKbwyTOb=)8>sK+%W-Y#^>AqkLRimYu{=X;+{b>tt0U03 zWh?-{s?4#+?<#+f>U&3~#%DcR{mcs!cNPe|j_paKAeOcp*MS^1WgC9@%@^&i{bAzf;JsDmG9=od|J6iHal&7f*kf}>SgKIl9m^l5mB(AalD?D zME>w7FE_uL)x-*a|3=qJ&_wTB-!Ukcg~j`le(sLX3s|P#7OlUOec*PH7aK7Wc9~}r zd!s$sFZS7H;}z@M;)dv!F%CjR`DCp03a!H|a^!Tfg}g=}3DfJttl6GN?ZMym>5wAZ z;Gp&#Lvd^hk=Dn|-p#f>}b`8?u$lJaJ>VkLMi|8&)(X{>Jjfi!@0%^YlVmAao;0wPpas{y%w3JuC}%vv ztGY4J4Y`LDXcaALFbXDsNI!%cq&4n$J3hvVEtfuBV~bS*AVO2M{JHmxUJ4H9%aN#| zu-?2Ye@06(s&b4&uQoj#++bO4TV)#>Qk~g{V^oz;zQyC6G7Hnq;1ym2q1k661~$Or z4!*Vg)k?T!%T8$nD~=}^-Q;tjSrX}qu=Gg1O-+AYFhRQ zdD^7A;4>YYu6Me=S!X(HOV{i6KCuoT7^tSA9|rDXWFh$jQ6EgY*J66j!k|4{aU+Mqn4g(v zx8y1bS@?cz0}B)!J9b(fR-(aE);nw4yvDiqkprql&&*I!*Lfq_*Ik<{LrcwgfNf9( z<-JqRQxj_%&Ft^9rZ#DU55U7b>=8mi+m&j9GJYPAgU3;;VE>l*Y24D6L?<;Z<;%!T z`Y<)`UF+@4yk19A#e=T0BvXYqySQoX{Y$V9EYOPWJ33$gz3xCO54pK#1$G;x9Wlk= z&29}_>Jw`hw?}5L4&SaATIypc)V~sl-S4IfK9!V$G|PW5xm<$ts@S|i3sCEq9kr_) zH|}wrtSG4nXYe{$Kp_6RdJ=LLPMDV@d>ze-JB422D(pbYy!zDLd^hK=+tJyVkuM`x zgzRb@i&3e*mJhONDt0`?L|Ek4b?niFq2O8+|DaP$okn5I(gTIld%M&z{=I7gea<#z zkNTg!b}_b&!+fH%f5PD(G%Mmm*2e1lUrx;(cri#sF53hMI@TaRhAm0`E170v(kf!~*qy z4wyi|rxk`678{tJGMghgGZ%H}hr4=OFdgW6e#QIagChv@Vxu(ci|?w|j-w|-HnfiE zq^3A>&D_x&TY_Cj>T`YlN;bhLjgR`e*g}FfB~ZhvPlhVbV@P2)4K2`6ba&YK+E!&v zVVMq++!n_&bShIv!-R}d$p~_?)MNY@eNTFz z=DKyt1j6hl{N1(bW{B-mU>!mrZ6Io~HS9*Ga+XK<#ZSE*?u%r_6@z1;TTbKoxOk|% zsxaB40eYBjhyd0$a7hm5^2k@LG;ITf$P-5V%$nrK6Sg23zynn=S@!k+(x4w^R2%{C zM$Z`w?6TPPDm&<19$tidW1P8T@9Rkhs&=R!`?`<~49~B$4G< zn)m$pNl9lWKV28DqtJMy?pPCLZjg(7`qr@Ke{X7czY=EXifV{C(aM!{ z+^(FIr3DXfV?4=Kawl6Ct@Ioizo6iLHAkJg162q!q$GT3OI4*@ z#646|I+J`kjXF)kjh#@CSGZO0W$z!^=&4{<9Qb02Np^XIX)lXp+g9-@)*j8qbY(M2 zCb~FPrh;PjR$)vy(pIO4{uCLJW+Z2Km2--f120`?nt}F|EE~r%o`f%$!uHt@Z0X3a zeL@PdGg8tyVtzU-63p~J>~Au4X#_))34dQ+Et+v)-BVn)G=lV&No!h5VVr*2e)i=A zUDravNBtp&tv5P@Cu4(DZAJXDQu=Fp5?13Tg&!W}#W-BwFl0OSDBnD9pfqNdC+%)O z#}%?SrUMhg+})4l@@0Vx*M;*cGYaDZKQ@ntHEpTR*~3t}(c5$|ET+WVTFZFD9QuXn zOuaT^JtH7xE^OrrA?wD5pPlIaGZ))D zr>PA1$FLiHArU@S%L6qp8+E1du_J+-G+$%~XW)%>3|#`sW}XW-mxV5TB=b~0p_T0t z*~C1ODzF02S?0=r?e@Kg*d(EN8Q^CZ4H{-v4=wGD{mi^d2tCW}nBoq};JbE|uVADF zPDzuVoyNj?vb%h5-xD)CdAgO5C|yc=w8*glyNZ(!XM$TO;N-h0LTi!>^nrKOCE^tp z=5Yw_+h@_w2=jK_I(g2s=Ygamzh1zx?WdkyiBquL!+>{@GOIDrY9{jzGf!i#8I z?UfT9_Vj36u73vAqO^ZN6OBDoAY@3umu0kT1B1PR-$iO7PtpU9tHs(H6%l)t(2~AVcew-)&z{?h_LzAq)m~HOHg}@x#5S&QX(ZjzsmXagJWrmR7>Ipm`96M5JABz>e2t1j03i)RyOl_A zvr#5hlPOU`1}}=R&BBJN#2z(Xp3_Q1=RVdQ3%l?=ZM%W0{J(9c0!r$?GRyo=X)K{; zYJ6PaSx=*T*RAiB>c_t$xxf3YNX1dEY}GZ{$LWRLE>!Ls3|qdFa~WXnXFCj?Fk*;oxlq+n4L_yvgC}`1!XH}} z`3Kk{P7pmdjjc602=)h5a`d>Lg|7}*VGq4_^u`Eg>?~PX|Eh~uLZIbTKuY@10U7~4x(E1iw}D#EdNTl-3~(ib_`eM=_1!nwRn z>mM`^hA{70T9i`Dr|#CPiLBqar24p=RvD25=}R-ZotpX4eunG4+=WZ6Z~Sw|o+iS8 z%&h1TZf-@ZpQjegipIN~7UZgyKd2Am<8*lyp>uDcV~oo=_OwQO7KmeJ-Wz{c93HPc zkBct(!Z^lw1bqNOy&B^Q$B&1}xk@z-omb{=rwyf}#^-WrFFBm3=f*DXR@F}C!+KJ2 z(}T$;OjYVU{jHa}(Zh*+Nrqj%F3%)Mj_zG_Z8rdSe+bmcwKi4qbEoHz;HHx0-7+14 zgwxPV@$@B*21{sA$AzVl27@f)%jHg2Gz0sWy9f#jt!}5FiTB)>uNKdD-ipl= zoT45HtZp;H?pa#*^=S${753aUwoTw8d{EKqO{Db%Xe9xo7Hk`1zu3mJIRUp4Ux;ND6u%{hO zOz09!cM;`BbqzMfjG5Gr2WUzu11qovjg!>|vDL=$_?XKrXTe%55OgE3`9hnUC*hLT zE3Rx!t;EQpP*`U3;zkPZmZdl(GvCgl5SO|cn4LgERxi39bKvC&p)330$B#R_@XHvt zpeV$2UOASPg&WUD6kX%asYO$e-%ergll9e}f*VN%tF@`Ur zRgD+=Ld{olidIHV>D7!6SlbRC;$8B~7-CFB7rt7*l#IH)|Ftx*1e}LMEp{9fVDeng z{~~S;HH9{3_O=mTH&0{_SQKNH`j|&M-Ff2<`&sNUU@rCcro0@0D>>&!5Y$H=p-r1+aMDoAiYUf4{wg9TbT zCz$MLY@UOnMoREK6NuS%xd%9(ui$3Y1-FV&$oweA;N?R z0qI5d9sXne2?!61WMSS@-F-e!m}h*^`0&u>D%3=^vG!#Xtyo0*=jL#t-a9&cJAinT zky#~1yA>!C-efMG|1rfSFv(ThBQ^we(`%54(;_p)Yc~y_i6IiynBkjHpY>1$YK?e- zg|d)P2iPcpLDI-7a#p_27#pWJ_?b|R*_Ix0o z=1RY;9m)rLKIEx&Q-bJxBg>Xaz{JxVH|6cH!&0ewoVO?ScDrvYdT1XKj{xS*L`}MiDqP2v0eS-M%ie3(nEnM)hbS)yUv0ey%>who+Blh)xQ{{&;Qr~Q}j>Ts`n z?1k^|c0c>R($MwKlf~hMxVv)NhDE!1jwblPGLYI+_Ip?$%oy)1k0qzqDaD1MA>9On zR|{)!)vEmT-aeu)N}Ac;>40+`twyIYJij!Q$H>7XLS1qqKdU5{FvaxKL`yr;R{EVt z&`dE^2jS;gulEf>wOr7cjw}vgpG^T4DDx?90m(xcv&DCD-RiuMU)I!}C|A7jF)C6s zb2(|CLbk#R3RP-ZnDcwEUSz##y|jpahvlr{rOPqi*6=#PI8kPSF7fssu2qe%y)zUg6bEue$cm9M$y`s+!ql&H}jyLME3nq0;`o z?T2)oOrPicf++Zih+jI5GbHmhu5x3ZG-+@fNa%7zz*lDi{F5#GF1T(x&mvS|b7n%Bu+mb%9n~s`JtN)1EJV)VU3m0LoK!y^qA<>}`YbwE533%@ zyxex50yd0Kc6RYMlKwgy=X_JBdKLo~_AidT(B=~R+EOZl1@ivMXD{_$(OLmwF}!2G zC+gmmkXsR76@%-{&@VLpFvUlSZB{I|GSRhvk z)bYkm!!vJcc{+P8$&nP6L#Mtn&judq?HKKf^GnS&vp#rgRlk~JG6_Mo$p}Pq_pm^B zg09!_AP>n=zA|Fx*TRV^FpK>G0a`lLGC8SD3V+&n)B*tLu>Y4*Cw9)>05Y!uVDi|K z_5*DlK-7O<(JK>MUG`nCfPNsCA0_^RdI8GA&%0Ebr|OfONAzOUPn2d@X)qICV{WcA z-szH6Kb>RYQ;mAX0^NAEiv_wx*K0J)(2M1GQR1ZI+$J2AT1=BR_^{#(gvk@R-=LiC zd#*Cb0UszwIz+c~KC~ypVt!Jc#h$5GGc1mor&${l&lL4xiv7|OZk9O&)^M4ut}qw6 z^tbcEhXf{q>sX*+2;LKYSS7G&{y)_xWISBEd{k!`YQ$A7aVJf3C%8Qmj5c-DXXwDi%eM40ra13Zoo2 zo}i9k?a?oIgX=IML$U)EF^N9=t0K-;l>!t5khA268f;PBo+ELKqWx+}OvP;s@j#fv zq^NqacZ6Qs?c`v}+W9><4@>*{WhPpcY{<9@Z`Kf4pc=S>LCpT>eBm8wuGM^=viu)U zBxVokkMg1p)ttxHuiPM`U}cW7al>t;<-bG{{ZwnvLH^PG%&k`rgZD$!HU(m!6$Dy9 zzlV=1EW|xJs9A$sGa%Y%JSrMP8tJMm7wdUvIqDa8@X}~f_0L;Wr_x3H!@q*OM>Au9?0F4RLb8EaqrYGO@nViyB|oMpKnTCjHLD0Dvn9u*-`u}qf4{j zy0fx|l$Qn!A|({(Y`)2g9nKVTgMm;Aw1qp_5r8>&cOQG~9c&b2kgC9`M``e|XotchNUcN2fKJKixlDs{G?G$?mu>==U5AJX`4J zxUtUv-Xsl{N$rhnl5>-T+w514~lJAnrb3~Pi z@oqHi1Q_;xk|9k|DSwFR{2h-7_cpRPlJX>ek-RH6>OU;Skf+d&+iUrRT>R(J;N9>IVYZ!4ZjkIau?s|rM%1D4Fu2ay*>eEF&11LT~Q%%157!(*C} z(;Tajz2Knh;o96WED(IA!<0tg+j$GamP9>Rb3Fzopk{>gG;OJ0fHCt^FUSe ztgpYpkXDBS!>$E2e&x#%ET~FxMcB1cgnRSm1~v(caLpB150>0`g~u; z9+JynsAYm@<8=M72vTkmVeC;BIjg=RCMaj<#o4OD`T}S;Zpo-#G5SHcN}Zi-aT0IT zqDINorE2d0SdOwxduFmn#JvyH974YCLuAC$*zo{Ua%4lz$!cJ&pi7lvw(8)DOI1u4 zCSQM?S%;&Q#Lk`!?A@i!eMMF4m#35CMwhasYSZYK+TH28hHv_72aJ;xJCAJxG}dHX zT=wXb>g|I0mTc1vj~xD9L2uaZUW$S} zCF$_gl7%&hkVN{K?wUcy-i%OlmNAfy2!70=zjb*Yqhp-DP#q6nGgiF@Y3OSs^cCLn z?@bh}z8$HtU>unQ<9}XmFT;u$yeBU9qj`^eZy5C9AxDo+*hiDDMv5lE4|KD zm%GOpgkUsE@pryY-_(LX#g+nd`oEiy1#a=!7V_YS_Ruo^`W>A-+HCkOOtJX`oznCE zyZ+quLl^D(j$T0DB>{cE?&lvT$NswOrvVW$)Ng@vO2u9p!H!;rByc}V2~ANlO6%ZJ zYs@M#F!rHX1%54GyqfN0=pAK+%WfcJug2HGq=z_(DA;6y%jAMv(7}!c*i=@?DRz_k z)k}@jt19meJkrs_8N$-ZXe`gIQbcaC$Y;6T$H+wvY^<`l5> zFPxExl%pv;sS%jvKS}t=rwZL3!jt6P?d?eLji#!xtX|d z#(ihpI);doXn(I*W1+$G1btcQ^~*G&;?#k#z*Q95w7sCl=#5dmQK-R_BCLn-;yl*S zjJNg~v1^$#^-U!v->d7!$XczKVKz^GuimN>M-cSn{q?3a7HA*rm8;oG=7X<`$AAya zh07PoCOKACal|gykJlp^+MeTE*Op0Mf`%SD3jIpyXhiQ?gKRN2n zjAa)TdfBKbJxh33UEN>(rTk-6u=u?)u)EQg?aFW;Z%@nW!@Cnxtpg;Dh2Ujv+Ji-C z3F?tcF$;9cu~#Zoh1=EDIoIiWBJ9)DbnNa#Z1%!3WLVPW<}oD>{K7|U6BI11<-tt$5 zd}r2YN-wc$-SVQ7Hw$zmAAkGtCduR`+eJ;rlr;~rcOJqBqN=#%6W;Z@33#Ye_y)%US3Tw#9o9boZbFX#F;n;U9^|zGw~( zL=G47Spyy1Vt?)W*#pTEkZIhhjTO zx%OQ>@EZTn2zS3j6VP`h@*7VFz%7onJs`e4e0xAL-!D}7ldLUp_0D-A8?aWeLEjcb zKs&*#&t(K{ztPhz~$$ zFe@Y~R#>1fxmkeg@GV))S~k=>c(T$D%=Ei4W`UaOU!0OY)yA%ue5+yuDvF1lzQh(H zqw#Z=Vt2N8+RD8Y9@)|5zVzZA(no+_sAeSk+@f&1*)UQzrRJCRN6D%$K&cxX;H{EK> zz@nfNXA+>CYu+rU5MA1SY?c2>zHz+%5^OH)q?$UZ!clf$2-7{ne3e;lQEohYi{TVK zcx<10rS8aHV*$d%2C`(aJ2b3kI41yVSP^zC&!_GOws4gQLk{(TP z7TW_&8GkW8bm_ndUpRWrAxq`*+FC6ZufDdtX$?s?tR}(Qn2Hatr5P)(@=L{7FZYx- z7F2qFBwY&44KjScS7gb|q*OEjM>?(Byh%K9(fxyTNkgz<5e*_qM|>Ku-ztd2>owA< zg=e9`Ox3DUKGbLBTai$azBzElUBQ@Um%GtGeAZT`K4VRNBfLc(HxaH|USTin1rf9j ztUv3VD$3X-h4*sx(9e@01h%O|q)7adaA}VX3lyGjup-~c4P*%JvI+|rTOc#<#@}^U zsWBZfce+SM0gE*z97)NIEYR+8v;|p!=1Gp7z&v-E9?bK->gUWA-X{23D*h##*HMIS zz*Gq1kl%F=1?5tdKeiQ>@ey_&{IcK4f?VvNhtuHbWTT30dADcJj&b8J9v_Hs&Lw)s z&W=x*L`yp}KG;RsT z4LA4d3f}hHLTJgGE|l7Nr$EeFyMr{>Ns+nOZYszj0^>%)Ene5XbJypW)=@23LsV#sLe*hhoa<+A$di zJrzH?bal^n-B};2be_~ZJV<{0RXSrDRe2D|pS9dHq2*GHzr@PAbhQA7l)mqP{&;?yu-CrJoOo?v(ic#I`?=fqu=TyH6(7uS|yTa*97xF{_!6gb@>Z ziqi}S2cFV^0262Pf^qeRimUudTXvHQapv;tqI7iEp}VdFtH zp3WrMDZ!~r!=sK1A8A&uMfSwlM>UGZVdj4FDB}&w!ZiIcg5&U*^I*Qe;8uTdcon-} zYWvW~XnO&GDV7VDzQzPB8#g{=GI>Vuz%g#uwfA=)!KPe8tic28q_B%T_j;aGEhrQ{ z@%b=pgfy8A-^M=in4hCaC=HN4BE7YUw9g_j@&Qu>|yOi(?E8PAHq69gChbjlC$oF-|MCfkV4WrKg2SE&#dr&Jy+BGlpHF9 zmpoH9`&G=nuf9cB%1ZG;e0OHAxf~*a^3X0$6|B?-zmp4Tg0DK7F9B=F3^xRbXhwpn z2=nv!k^4ZzWFOCYj4&`cXSxR0Y?uo!fIFO3;@8-AdRVB_Vs%B1+4nH~_#NNgXAjHA z*v-ABxRE_h8{v5_n8k4Xsikwd_2rE>4>^>Gmb%IXNX4Q3JU#|u`1^zNM{3`R46a@Q znkp#xHr1qCJ4XG@rPk;h9e`8u$W=!#9XgQ^To2}{IX4<8LC)NO>12FmlwLFWMKt~_ zDT=UpuZC&rNn^iJ%z)}W8yf>}8?P7i!RoP77I((w6i`doyC&E8vqI_#RqF@zzPi_? z3-peg(+gg4TdoVPBfkJHH`W1rP=tPyE>oc4SfE|COEpfK5pQ&N($F zOS9wRT(-1sk{r{WA+xU9_3Fcjwr;Dg=O3R>*&@B-`-vY&a-Spil`Sjl6b z9&PzRRI@gJ;H5f(+ZyloQA*aEj6NuJ^QMRv(|axiMP@He3ZH{!zz(5Ye6^o9BJw1( zj1cG2Q{-z5DmQKt;^YMruEjsQC9EFSd}sjM`-Gm6)xE88Wu4nRt}|=GS$Byv(CboU z*y~#2zsHEjTEbfu8v4F4EBST=*)9r~UP51WBx^U2k~s+K36uGf_>}TquifP%)q4k8 z!0KSJZT=+qHe0=_P_K#=J|Ef`f6>N1yROK*=u}cTNoEbu;Z3sTw(2>Xp%fw4KF07o z0bpfOwJqBjg4Gt8<71QKT{Ea(ArE{?Zz18oJUQs!-MlNRJy*Ufu>%IPKTw%~!zX(M$q@{nkw?gf4n>DtXEu27= zaMu~$J&!)3qL>vYVMes3*v!6ytv!U)NoH&?4f5JsHr~(keZeh^D8JF*iK#7J&sCkH zBupu=)tn@-bMMPF%wgn1FLfEmya>o2^fM=ow3n6NW8Ot2(E8OUr$5(NuFOiUyId06 z5@6fLAcizEOQFhX9eWcMdaZK?{Q1My6Nv8#SwEi%y-rX|uUHKQTbS9Y-iNL#J^-FI zdmUH6j@?aH>(vOY;aq$;dLB(6r1~YeyaiSST3M{i(F3+p)}Lh^Ur#T(`7tE=fkIVk z%zAf=WaU!L3Q2>izokJKqC~6mb}k0=Xvxlqq|GN|P_qcnlDtl&McLR?furtuLa9RtqT z5nb*QK9?x#m)9d-vzu;GL6#uY*P%Hd4CxguRP@yPcB_sIbuf#;Bvf#34Sc(?1fpC^ z%$Fy)NX#fNPa8ES@zBx(`tQte8>FiM1T{2THDd7QyV*gPJ28<@@u*9hvglSdG4ru` zKW_G)2S-|ONJK-rz8ry0oU6{ASZhF$b?B;TMzJnwHVTnmojzd70&@l>&X6iIFe}}K zFN)WMu^Wj&SBc5NTWgrn$|_WVhx=fn&1?;Y1<{%wuoIOtfApGuLMnURiw(tA_}5D+502~p|95PA)XqKNd7 zA_78Gn$$?|L_t8h)X+mfdJQFo6yJw&=A8FE_ndpqd+$FF!Q>;6Jg)EBYpuQaVc##l zhCPMHdvJm1n0iEXwqO+r`vltr_N#yReh5Azds`v|nUy)PHok@185X?~}iFah&i+mrT>pA8Y8Q+{d=x z+2Gm{xbcijF~J$0rHVA?PjfpT0Yr+c^`C)tLM5L5h}3S zBJIIv>bzTa8kkuTiV3AS`CPJkVNvm6=AxXBy?JV$*Ye{IRsTYw6fooXF3M+&kT|Ur zaLMv#S01p~aP|Quig6J)f02rtdp*n7P`4-Bq!du4|J(A$HVeCp#mujH**-{G6{W5K z$@z68M@P7I0yht^V8GCa*6xR8iZV9B`hN^+S#~39{r~pqj-%Gye-xNcz#hN;z$v(Aq|3&2=Xl_0<@-y;=B`1v zdJqN9)_x(#%WQ7_(EDCD?Cxd4rn;}^I%}pHAjg=(Z)pYHd#Xfr?Tx5IEB~QHJEp?S z45)Sg0nOYIC$}fnb;YyM5>=X5R4BRY(U6Ke%xqLsZa|5vG5l=D zavwP$upq}tG;o83bGyM?Zj^j>Ru#Rjqp5;MjT+rs2uKr5ZU-6E?s)fc+P+S;#(U8^57fXn0= z(#3MCj31(F!TNGMA7-Vzh15rd%2i$X1BPeG4ewL8=7;ePgY2EJaO;<^F>RD|l|Euy z>*3dJ$k4(~cYG$s>F25adanS03zj`x5C)Ohi$PLyhfdx;&wk@ zTzlKJt_H_?Ky!D5g1k4iugvwLOjQX}<|)=Gn|&v0M-491aIM*5X(vca4w-~hQ|u|A zGW1K=gDvw6w0n;ZO7lG2ANqyCFh6=Q$M>(Fz zdYrojjsrf^OLVI5vIVL>X57&SW=ME|rThv!3Z+A*1c$)h!qcUXbp!@Wn?5>ht+R~Z-wjA&HsqRD%xgJ{MwE`7{%2wfDSJhP#LjL zzj(eYGQ}JNUq$4hs#Ba+mo7_>%OdF(6SfEDL8^VErhlZqepzB&1#)D>AI!8AYTsv6Q}#Uo*;ww$kHSQm>qvj@tl_7LSSMEatfZw3O0JZi6++xk22l% z-4@ntPoS?vacvr%-@f5*d7&xIc}>(Mzgo@O9+Vnf(B{+WQhcpIpg)Pyv{29wv}h(~ zI*;^X))vnCRo_t#sx4oI-bR0t(Uy^Ws;x*s$~Cq4Am+ohj7uI8BpYJ4F@@M|-RPy> zw{l7pP-nKJi{c)FV~^i7e%fO%m(s+atbLed0iC`~TAP7s@7^PhFxE%_G&XlOhyOff z<^G*bbEiBuK10ih45vQNh*J?hJ}PTxtYcz4rjgip1v+!0S*z^K0d}{uBZ2ojn`M)6 z@6{e+q3T$amthewyE7$ew|cvt^(|a5xR~j?lPJ?MKusZTxO`i6PqW^c*lt9?M9qw{ zlHiw$lDkzDmba~!gF}&H_4FEHu*d7PcF@^^c!qe$yG!St-Gjyz0&Jxh1(F`Rz8u;G z#J0RCZyXUigVEhs$b3dhcU~;zFM0=^E(Q+x%|ZAfW*IbW|7`YRto-!Wc?xXEe~QJF z)B>KH5Z#rCw)ay$**8|g5GF}ct>?4G9*ab1X!#PDLiPpe>j&7iQ(ox|2Pv>!kB_1Z z${pMy*@coIhc9L2!YD0*W2Ksq0+X);E&)RAjrt7PEbwu{q4gj0MY`<=4fKKT54&Wg z1xs*b!Je@a4OEQbY_f!rj(^OsPJoLf+)^?Y(|AQDCsXk|jCH8*A$}fN5pQtQK>+H* zdN$`{L3+h+xjH1j! zXF!G4`*z*dz15i!&H}K+M3;J2>jz7w8L< z*NbHsTW(fwifuD55bnfh;se21$Y(B{cg0hdMs|C>E7~J zwpMR%n#TmfA2Jm|g&yS4v1qaAV!-eAtZJy)6^qRDtwJCDR|R^96TqHw6Nt~4U%Z@2 z15Y-WMl_|x50`2lRb>Q?pn2z{_f2^FP}n&CA`iaFE*MrnJR@{}1$BJE`lrsAV7Su` zAh5W%mR=^)9I&WuowocJe+Z*9N=hltR^5rEcN$WDp}fV8anmdZ<{Pdp#p4~btg-2O zVae;32sh5%Hv;xd=Z7jM50@1~v-5uGR$(;|_9duc?X&7s;}UQ*3)H)-qnLTXA?!LW zM!vfPK7DwG=++5hXWScV$47bb$>!9~1myL8G!Qt1ug3tWFPYE(Gq{`v}Heo?dMxGYDno9CZRg@zFQ>eY_z0bN?wZG4~P42)+H(byOhv9^Go z#m*Ob!yFH>CKv_g>4H;w>Zx8{XAG8rL-)}_OeYB+iM&SQYzvw_MJkI&6nfY-X*(Rm ze|vCiJoFK2l_H3*OdI=ruRMixDMWSTiCL_JD6c=$`k*wnP%r!Ul+_XIxYUeYFzBdV z2fSlKIM3?h??K+!k-xhJ;zY=*l(yP~6bzDCAw7veUvd8UnN6q~Ri%BhplzFfg{3$M zf_Egp*9|)Rq6?#hUVIm!A$-8f0+`%>a8Kli`YgGaE@QcJRV6+LjYbue1Hz>doLD#f zY;7^*<>f2IAYX&LWxo9CRWy|!RFVOTR~!(ex*3pA&wIxjs!PmUyT;Z18KA^Go1||A zhRmGIY)Q=Gl@Gp019g%-?^2{0am%s?ay37@ zZ{iRfz&d+)yiHiNh6IU%BXu8SKB$WVt9WQ>r#j!(aenuKweDY9*w?S(wlH3DxecGi z=SYHw_tJ5!Q+XuS;7p=e!OkxE?sRaNh1+9r?8aXBr+wkk{RCi6SXZT|cBe8{co#RD z46b3Qb%cjScq?JaT+k9NLO0>+4+1r(-T4n>Jt8OlEpBP${w@6f`lFouC#~@Rq*vg3 zZ;s!~2P(_|kZbr43YhvMfe+^I+1>%F|IsDzlX>rP_x$m5;}YYNer!ibR(AY-?lI$W z$?0Ey{K%63+7b5ZgheEA{MOWkhBsGFWpNy10_pW@yK zFc7lNwe7}RzG2wyjJ5FUkC{GPOy1V_&nq2ZoYZ8AHE;ja6yD)n{q|21*P_&giaaa3 z?yQm|->Ec9xLnT2aDt{D2?{^LiqPP$h3`l5Zf9-p0&L6UnxbW?rl($kU`2CSj%QC7ZpM*u|iw9+r|;MRbz}Fun_{*z-ZH z=0wd&UUsPfryh+1V^I{I<`s@Ty==23(Er}`l1H6kN=mW=e=SXTVFyeu9Mt|T1obac zYkuaufO++XtA-VTFvIeY1EsYj9ye#HPifndLa0=had6^CwWz2j=<{yUd1Pt5c{1HQ zsKQvJtQ1=`2--RssTux+B>u#kR>N0Zm7`c2H;N4i+}JM2-zdJO?K(Xg7H!`TC5Kvf znl0gV_E(De9Df^Bgz~uKTLekMFA!k`YeuzqDjFd28mX-H69YXPSEYB+tkXc`|7ZLd z&dq*3F$Q|7YBhlKr`{p0nQC1Bq%bS@(Xnd@ZP;e?AHkLrRtauOJ;^~G7M$6m=8A5S~3O2S|?ejYDqwY*<4oVqXWM0Y(or{ zkjsC}y2HnYTfQBifgJz9y^Xgn2F6tP!X4nw_7d zC5`)~>6Kp4OxVzDo<{8RDIcf0FLkb3odrXUoD-GvHaoZ&`;Yv6BzrAWoz-Nuc}aBR zhV&kWFF1(lyt6K(i?mqSbYe*%vatHxB8Thshv>n~7~WIC)oJ+bKTE~+9B^U5`Ao5S z{M)Uh-d>xBQs~F_g++eTtUWInW1($uv0?*Vy}!Ea{slQeF8-5RPV@k#scCF-U-!5G zk{?a9Oa?qq_$S(HUty6?OBV*s3QvJe+zWOWy_UPFk!|R8^iNA_I`K21+)ms~$_XOH zKzvvGUTSU(RCE~THC5fHWZLl4)?i6KNIF1kovB#UIHQsC95ezreSI2x)ry#5Wy zNec09Ow3Q14O{QX7Hc~Xdub1!KI~j|%vr|0DbO=fWVyAIp7AIKCp4wCDd*!hzh%-K zS3`odD#>irLQoraQqFkzKzcxS`18Md3hsJodI1G1{DAvV`+lm6du|-IYnNwh>JUv3 z1WKNM=>n;cqzt+#G;)~9xdLJL8T#xUx1!H-ut58lB1T+)D02gtvj3s8`44de0PHBX zk=Fm_cz-T{vj142;CneoXbD_SnqFr=lFwSzptNq)Q_^-3LH+wGY#mzCd-ZfF?t)Gbw*TTkpUdA8}ikXBww0gK`umaP4 zj&HuOEu-w*QDN|tRUtRtX5DLz?jF7zrPi)l8-3p-rwS&@nc)N5W%Qp|qurX}1rp%J zKm}Inwst|IsIVTLmg9q2gf5HmC`sSA83faJTMuSz!f1p=rnyOGkhuZNm`78AB-ft( zbDM`$hNlkI6Bxb6@2q#wI5gr4K&9_;;MfGDwEic=2KK?XY4tvSt41d5KOU2 zNTep_p}oTeH6ND#xy0prWgb2>boDjXIkQ$~yJ8jJ%L*W^e`*5rIV<@DUvez1UxazR z#3HI2_coAz^I70_%vlB${HR5W>IE0LTMe(!37`N{6&#c!H&jHpRkKHv*#p$v9!olQ zAG=?c?MF63bSBcxnv+F&)@%r$vcbk=&>;`GVRzFX~^TceATngn9=f6dPeja z(Pr$j*C9wR-c&3?V?XKCZ)wciUwipPzq9$r76XUR#$sUu{PgQtouhD|6Dmoj~lIbO!rjA*> zX0KCna*UO{)-6~N%cU0+>WVPk;f#h*#eruG7@Zr+`hu>C$93Q$tmJ&=pywrP@cZKx z%eVgA&vfs&FBBybnz7}Y`9)q2@@jBD;ICh5XRG!Vq|2uiA4`!eyP!xDM%Q-ZjLp%8 z-qh)f+80ST73_ww#)g@@kTeGsUCFJ)Qa8`q3sr{jfixeuO8Oan#>uZ?)~ibIhk((# zYtrrc8Cw}1*bF%6k&9CCJ<`8Q4eGjO6!Cgl!w1F=AUy^rHD6nlDm-PKVM<;R=xK2z zGVABU{Twb&Z^OUgY0;n4g-itJ@4DKHd}j+V^MD4ODbw48+ch6*M}xNIj*-}9uMh=K zz>QeYp*V~e%+4UxC_{Z_#hUJfuC!Qc^k|Ks2YzP@YW6cN=o3)FF^+Fv-s<>5TVB9N z;)whtAgAPAF}arD5{0-mqfHflGJJ?X2H+KT-|dkCWHaH+#|N2BSrQ%4`G`eygfR^m z@5rU;Ow4N)mUNxCYj!8z!w@uANdH2EOS?B*da1sj%|?ySqkj3$*7EAZ+w$6a zFbQ($EUC`rvj1(3((nMWJkxyCZ=GD>)57AkxrM!Fc=`dzsnl_`A-<*9*-9hUb|K>w zubP!f6c%-Gn6`6~42Nx>HN!_r@z{@ zQUG6jdnp|BgkkWkYcJYmbSB4fEPPQYXYDXl;cLxfkw^V?iA9kb@nQhQjEt>k>WJ(I z!g3(~6ne?%57y`z{hxcJs84!7O4`5aqPF5WZ+EtF$xI-|3;JOC;m)z6%klUBn<585 zVc;j@+*f}S#Wk-_X8%0T+kWre6Px$#(;_r=)9VI$CX4XD;v}V~|LZ{9-)y$we0Rf! zSh^w)-pcsCcZ)Lu?_GA=l_x4(IV^8-t zjK*Dg2$?<8BR5p1Q9L*IFO^f^(T05nj8RUy_@vky%>Q5)&)e0zY}``yZOYn1WOC|{ zs+uUW^@-&wYV5B$arvVgDR|e~T82P+t;z`=H$7Trai|r1U0>7jHbFjJrB>tuVfM>6 z&|6@X*UYWmiA`9Dy?t51lzD-GQg;c(fsZ%Qc?aD7o$WNbRe;piw(B_t+?tKGc=%3j z!-K=9U!x#J$=gsVB#bJw0Q3}1DwM@80NI&7aN7NO4b?C1_Nv_T9$vFp2e=d9X&zbzgAP2j#k)Q1Qf7)I^0o}|z8-Q>hxMJn zfHb?NQ+^)mucoMD*T)$}8kuq7-K?6V#ni+(n^vEq)h^G5eH2CmSVz$Cko(mlIufFL zXvG<=2v_)=;hbSo$(zN6neA9S6drw@!)M17Vr^PaZ!pcYkQ|2NcHO1ot{Je=b5wo$ zt>AUC)5yZkK)iF^SQ9AVJDcztL1E%M8~!o_of?iNa)N^G=Rr}MO%6nv(AhoXI(qG& zjE~{gYS0ec3#&vEBK{W+3z17Dhj(I{iV&sf@QtdbY}sp^wcYjqHrf58qvgHxL(!vHr7D@!`N_ zE)Pb*^syOE$}b(iFchGQRJx9~07+&QMnQ;k6~~DvolG_4H zMBf=>v=e4onTNN!2YePKdY2(gjTX*P;2ElpM#erLt@vQT1Qt#>!q%S8xV!|5kyR3O zr{jvy!CLj$c|tCa4inR!QYq1S+u}0T#4{8nIYYy&0m07g7}3n&AZzK&rEH#phQ^!k zjM0m_rZ_WfMoYE+<_X-Tw&8JBYg|Z)FO&xG8KB%+(~fFJj#Cs$ zT5QJ~6GqRT(+R_q>a3$B+B&r8vdDNe&k* zG$`2nmV#Q4Yj3!ZR}_df(C=&XzYiN}IYuQmx$TV25?QcV1+vkj8J$r4X0c(<0P7gT z^z%3r-lj>X^T%#wZBxfLRWc4W$fl%BPsd~E@)`K3CiwjyExzTmJno-g2sdA?Jif(C zP<6sR!&U~O5_R_MuDwqwGNaDbzdOutz$*D|L7uj#qXnqi(#7?EIsz>)AdX9PLN=@b zSh7Gv{T|acFU~$#Nryi3^Gsj5@vNiYI)%t9&is~yPNGf!K$3E;k3XvD|4{w1@4er9 ze++odKM>cmyZ`2=%>NeL4CmBiuKy7DHY1*x*gQKzOy3TQfG+#YIe*SEz=ds)`eEY& zyIFo@RQ_u^`1cDkT8RGgOK0q-tSXu#UE>={VlzmfSlp=q=qU%Z=gKvORUqYiWh$8$ ze+jz`$przTd5NHg;P5G4DXN2=RnzKfZ+05o-bksj!EH^O%jXYYlV5>ptqdu8hyjWx z2yYUVVSKgTRODW&JIiVxp<{~=(h!-Hrsn*TBkhaD=r1*4bPf+wf*h()`N&#%J)r{ef!edj<`O!Oe9)Aw-MGR zW&}Skw$88jY^zFwWQhlTIWXL8tj3~ubvn0Cl+W^$lx_`EJ`8zTnXr?Nl*usG(M@CBoD>>9|1;ope(5B}(6*$AuW_*zQZ!c?S-Te=Erk=+ zqG7rC97p{P$BU$w_djWx>Ig(-l}a=t;8#j>>=cti*Ii1t2;+p~X!q?Xbd}sQ$a4m7 z;gujOpai`b&QGkAd5YQVt^4=_y;|`e>bdEH@$c=Spr6d*dP^w3^{Tq57pKm@8(Hnf zqdiqTxuk1!bD`FbrEi^(-`r&hEuj>^Fb~56u8| z7|GpB5}dbJ3T_mcys z3w~Wx)2zjgHRH&7)JAZerku*7fYKZ28bt|`0GQOaK48VvDkdQWE1;XQ9Kr94yPqzA zZz+##?xx~1tXn$Casd7nyr4#FmU)ekyi>Sw+0xnC_IiQCfuT{892QA;vZQGzIU!C= z^Qgw1)VOb7h91XvRn51AP^XB_JIk@o8Ix1+<_Y?3?buCdbFe^yjrQ-wkvLM})bbho zon~O^8cksp(*~ZLy+qv85WgZC+(?eMzrm=lH&IkT%-Zj4nz9B^zXFrdE5qmL>o1Mq z_k(VpB0@*P@CPz_3#woRMr$f(sWY`#nK3e*R-&~?sdiheuGKmaabi^fH_&+J=QJK* z!=za0TnRS045^jDlITY-%(rfy(+5w#z~fJrI;E=!3IODcRJ(?PzW5q{Ti2$gs)+S3 zU&efkwe~DCy9we`(A@sYrM2tpa_WI5{_8C>o1t5Y9KzcjIL-dcUGctKFPJCiSn`&2 zh;gG0@TbNfn{uj`FvZV)%yu~Tf98GvE^-UxdWQZM`~Fh=B#uq7D;K=_Ddr6z{uz7_ zG9H)m^5{7~VkTxF6A^RjNEVEEmpmN^0N#ze<$&R_6tNWrESly3ieiZ~Z%6L%>dO3} zcmL8pg#hS)y$En*Fn$)@( zw}|Q!#=&`}Vf%Rn^_K2glVSP8_KFjGdgaBzokZT}Q>~zjRrRUJf$6m~7#Tc1$Z*z( zZeOQ83inRZ0mSXHxGjfKR??zc4X^4)vkqeTp(XeHAWMOSJ+UOnn{EAZ;j)K$a;&3I z;1YD^C24o9yQ1fr)wRN@bqg<%=(zauAOlKz3lLaXL>nGxO)26J%J)VrN^%>7{pO)( zf(MAT&ljkrJLcAKIkQT{%S$#JF02)k$nebHTZ))}f*)@3l3%t|Q(^B{)^n+Yb%_Sk zx2<*PYm5!>e(yIRt_SUF0edU@OeoBsKBaaCl2t6aF;<&q-94L8I>Dsx+mh_EFXVh7 zZ6|T_ds2q1LQ7GjNhoAZO(An}hw@1o$Ek>@e4x^j1g8wW2dU7(TlnX!F(|u8%gzCF zDbm%kb&Wej=55DHuHy|yRZ2gMvAWY3zjlvtCnsYx_D-P{Pb^)tA|BJHLIDla7WrQr zq%PS=C6L+&OHF3IQc_e}hAJK1sd{Tv9fdXpj_#?zguZRt;Tez}@bQXj!%=kjE=>`g zXyMVXB^Fzs$9Iq$ntfo%^aB>;kEB<-b@lDg_OEB`hqX{Cd zQ@MM6ZW34ZG>4M2Mdeie>`mYzDyW;xc6(>;$ITOF%P`4q_-sLvSK53cr!5t8%Sow} zp$%{8e;dx(Y_f}32ZAf$S>b%%^HLYBQbZ+iHjOAN8fMGNHa6$gJ&*bKjUBm8ii|vN zQCdpNPgS6e{QV-XV42qdveK2_|*)u{t9QKk_e0R0DfZEYl(*;vr z_??-SGNiZ5kTYFAsS?0-Ao*qQK zE(0gi2P(CBpqY?=<^ERR5aj{d46`22<`^*nGM{0u%QhRKLd8VC_C8yqFHECPljQ~c zBiJEmXr(UmFBHOZF?;{5oc&K7S`9$wD_lBOwHc9ck7Fr5BKJu6D_R1|-H|eno`1dj zb3uBG>kiOP!FA`BdCh4KwFgHzVRrqOm*2k$x?%h`=>5G`{Qn#F-4cBN*|!2H4-Ja9 zIOwHsr|f_KHK!L^=K~C)NLl3c`! z5Bi+RQ!{cEa}B;9>QUR4-;5ln1&+Qo@5J*rt1`*v9u~D0GuXAV&EYS!3bIC{K;ac7 zn8B5;9Qs)DS+$bJ%p@k-kR{vtwbaCm`*M%S#ylm~zF?^VGdr#pW@lP>B9BkHP$st# zE9U0VeQ_(Jx1o-J2l=@}Z)`%1BML+jJ-EV+n;9O(cNZCcbLca{+d7D|!Hvd7jTePS z4A^>6YoW_~*kqO@<5y}bU30qjd6V$2XSU#;%0o-JZ*=uI!SHL)Vbm|AZ@YJc$YS!y zDqwJ7;NeZX)nck+cBmKnDpO38ub_Q`Yj1;Hdfr{6NKd)hFnlb2??%8>Dm+||3Yk}q zTyVDWuOCH#6Z-XNQ43bGWx4S+>TqdFB6bLeB~$G1J2cQ@I8yL~O_ZMD;R>SxIa#^e zTzh*U8!@XihybQvw4_of8=~|JRNgr+3~xs~#JIc;@S3h1H+XL!>0DWju6yyCduDB1 zW=onTz8c?oDS>OJKim9?u|=}Q_|pQ_vU zO{RD?iu3H(6oPa#SNS)smK%i&)@>>4E&*_*+}$l(7NrM}?ia@{PMM=d4f09)b`pDH0L|UG=0ll3BIT!o6Vkx;mUf6Z22)D@O0AN!xQR&7n@y zsKMMXeQk1-V_L;4k5Q$<2l2(!?a#dlwotyY6w4gD;lw^!#OLp9_gfM)4bENODL5(F z*dMuS)ST7~V!Sj!)=1Hc*Dd+ll588u*rc|$mt(AI$UZnEhffLJmNQt2+WVw^CD@ya zZpWYELa$IxE!$_eP1a?u+b9X}`L8F*R6H-<{jyv3?mo-pLOf#|CZw{FxByYPF{;h)nJhP1mAPHj)~H4Y zQ}mS%@QjOldN1X;kTn=Fov?r(r@$xV^>fb7~;Z9 zlAe0)g#V(Pw6QoVP&;V{zH1LV^ePb8N!DxAI$djb=tNY0hb`#KQwSfO0hLLAQz$~D zYB#XXb(Ru!gNJ)3TawU+X7zZ$VCCLh-oLjdajcR3sP*dKoY*5?CcqB4dMGhbMcca(r1SobY(&hzuTjo@ z<-pEWAF-167aOep;PAI+@;|ClftJ>vO{|)3Y@NS+W?8=hav(FX4W409R{t=xa!I;A zm9|y>LWi@xCUNLPQe3rr)IeF0fP?ZkyhDgpHdJAtMG-ZSEl6#2MZ9qyKDdP&T|0IY zXi9M613!~q7QAd}`}sjLyjyD#>PYnqY|)G~{cw#$oUcfS?rKr`<<@w#y| z4XpNRIv==(Z+2#ZUNXXBdPXj&SQ*%dcCqS(ZrEz)fVx{SXZYOlIwNtHB_{C)8x)6X zJMiUYP$HCS%Ev)8tUqhh zc{s_FNzio}=S%W98=<@VE!N+&z#CYyWIYPn0lKv&Y5Q{AQ><i zc7dUpC--pv@OBf_*qkvzuKrw3jNzHIyI!Gki8cQMFIH$Aie4^cN;5KB&CRCZIDIN0 zh2L7y^GQu_V?e2J;y|qSi4i2neB<>ivcJu64BzYe8Mim8Iv0Ke+m{$iIEOUfL3aj$ zIh(9G(*jNr;0ltvTYz@4Oaudppj#;##pDdGHw~WU`P>cs&A8l_l|BUAKhprwORj)+ z5e$Vn%?h5*OG(?{T+FMpKZHtey+)wQhr@RLrp0Fl`c^Hz)lYq81u%!uzusSvIfrPM zE4CSc%@3TLt_sR9?x*I1!VnZx>OtqHftWxLm$tAC6@NPo><*P(<6i%HHfj>bNy?N= zy)6v78bcL`-On!Gsw`)&?<>q(3bygR7{zpgJb=Z7jYJhfsW*qoXlC|4^y&F+xW2^;M72zud}FBBM{cr7 zPT})7-aW#%)PV&#uEI|C7gwCKtFMw0`ygrCi+FsG&bys+HIoTZPJXG=CFRPqpMb$C z;YvG|R&?!Z*p>L*0nRjPC=>Q^fU7>^fHBO32(Cgc_RInw>vhJ}9dH|Rp-u3F+|^HEhT}1Yz8S90;;-^LlI^lACVHY6sPf0cZR#C=BUb>-?HK z%i*|1drjWM+32NB1KbJjzJwn4rAz9sLfTb(0;c*xkpmr?*LTdLn-qJUFwVZIc8a;n zJQ==E8bW<@OSZ;}VFx25xk(V&m4yFToUY{YAlYn?59jm##<2@hhgCY_yT3QZP~#AL zL2{G~tyfHAwB%AfH}Z)>utDj?L5c(Cs>$*B5-^|l!Ijn&wUAQ2Vr-y?G!PcfpjWJ8 zo#eNc-3$jB>g7i8fjrrrD_r+wVSK~ta3C+o>9UViq^|Cq`~ z?P^<+greFLC!SaUo;13BtODvzn?Q(!xTJBHsY>5KJSMw?QiQUTl<2ZWtKJRqK34#u{6J<>ZBpl{vAGuc_C@(I#bsFow5AAcLE7KgXa|g|vzAZrc`?|bA0iF5a3w&y zmbW?fm;{A-$X2M+4)%9u5sGbv0BYhUYi+}@wsM%Mj3L8B8mMo2;;GREywj+z%st- zk*X<75U zRj~u@h^BK_KN=|z8}=_Wn!@Fj-Z3WVypI{W!rUZY_JriBkWIOr{t?20B1?a)V@vIX zmCg9(OqI60RuQMlG=3K)j8Q7XVfVn}lisoM+sqJThD0AQ5V|3FC5K+TqE)<{7(YCL zlpm2TNV{-lr%UFwQyg~Z_*U3H7SFiS8E!3Kd=t96D>YkQ!N>$Bpwg#*d)}|AAkzo* z`$eK%3GQRDwJZqx;Z zFSRZvE+-J+hWSL%9<85ZZuHX1xb8?ArB6$|X|dS_u4)gs?l^qiT*|!eaBf_(iv8;m zQv@FVknUyx(?Ur1*gxnDM3({Nz5B_ZTRaU!i8r1E_8s>m(mN85fEW|}zkQ=M*8l<* zt%0?e?B_vBaX%{WvbX<{T3+OX9tEwL5fS0JPyWgxo;=Dn0#*5=hg^|wu|XA+to+c|1jgInXe~IL+$? zMP$7-c#K^r~PEC4GLee1{q~U;G#$)CSB)(vVIQu!A1D`T~JM)t<=v7?+mW2(MD5Fpm%!&0264 z$@XW4+`Lr!mZfn?3zpue6m-cpZ1guFp*LmIUUccZ%St^QZidatM!+(?EbZM{i0oGX z+Qp^T*@a=|n_DHZ_4y_*@I;%?fZxRVq!l-qR?GV*c&au3aI%Uuds-7N(ufrwZm4R= ztz53xuFeYn^5WH>6~*C;vms2_s&{#)dzi)Qo`+~aepW9hw>v*5MpH{AiUE1s7UH5A z=3JSE`Emeyj7l@lyk;FKdK&oGD)R(--I9LY1=cbS)TD_)v}HMy4FsKW1lL z_!ODg_%uyPyZK_}DzKw5{IcpzO>jq#Le7c82T3SH58KI}KQ=H9_B36sR&?kGO@{{o z#iuTF(7${moJqK(Qi?i|=+K{6Q=&?wZ ziRxdz-LVCt(%J8t6*ha;q-ky%J>S_X{kr#MT>2;X11t8y6NEF=2upzReVMdY%YY;9#laNZm1J; zS*u-G*b~C&p2XNj27NR!^-$OP6R`=@C;r@XFgH&CxZT@TRqgw_Bn}M@F-V3t2^59o zCK`brgE`?ZJ52^3j*U#-WHWNtx46{l_zlrw<*u==zbAa}F z;bE&<+Ih>uuw8oXo?#z@f`Vs3TKilzI4=~Llw8;nDhFEQpw_{57Ob}F#E{O3Lp*T2 zH9Hdu$-)9XnJ29K?OOtk!O+u-j!% zaSb?Wb`3xs)cQ*ve2^o1=SUSipB(eS^p;tgLY?UiWN{Kv_gIgxeIyrmUJ2J7jkkb( z@~8noV*pq4H@Mip0#O*?;XB~ZB+k4!`XZ?ekYCw*z=ON8(SH$I_uT~+={+T46Nl);5(ohtN$ z2Na@)FqLHy$oj-dO$hOoOpl@)3w6)3^A%>JjI;T^T%ZR9{9s2eL2?HnU}m}46V+~) zGS&R<+fdvr&ehm~{E)F(4@<7F)SVRQd0`*d#iHyazE^S#;q4)0OiJ1T6ifG-rCOe3 zsq8i)2_595y`=9tZ3xJoAGjIMJ6A0NU;*{FY888aZ=rf|L(G>}SsoV0ESdJI3fvNhzjy3sUXL3N=A1aG%CIN+XYgC`6YI5{VvZv;hf~?1%x^?eeS+su7$b~Jm((k`nfzt;QxlgpoR z<=BpT?Ndk(`%LiZ;F!JchGz!a#=oz8XM10-Gg!&6ISI7f-e|7}A8ry^a?(DA1;3}b zkhFsv^BGK@224kbxc3!?(gFi~{+=Z6{k&L8ie;)~H{Oi(jaL7z)?~HT=^z5OGq@d1 zOobfQJH6sgMK8Yt;KIUd+frnbA2+~|;d9vQ=qJN~y|Ln}R6AtVNKP3c30;T@2&`bc zwC|8J9vUt^kDeMPdp7MtA z?^-1rgI}=zWS*yH(sd%sL$vg0@B6tghrjlml$}kgMCF6xFRWX->@Z`hl5Y20idRpE zZs}<;(RtyGJINm%g_#LpxAk!O*=+wJ&f)d=yf((Er`?FM-~C>fq9Y<2AP#wEcWNmqVTugYwsq5p>|)D^Z1%hdaAR~y zb|tUtPqL%0w@b8(pr0w>LS)?<;W%Yuk8q{P&E_dX{baEXECP`i9yynp9PoB^Pr9s2 zhUEmk_W1>KM!5-3^hZS#n=oV7t~n&rXA44h%-iRO=NqUd9(?GUCKaCmuL7z|%tKIT zH?5^G0QaiCIsx`VEdkDZ?0u_q&LCfNBbs zpO%m|v1jKx@$!S|^{psC0QhMo>8Q@X0W_KXK*J+YEI2Ch-~2#Evk;%}Y{4T2A8?Jn z>d8lZ6Trg1Q8LZd*Ta)nhw@kRZ$WD0-*Xrw9YytLetTWyuwiO_=GBH|5P?dud5%ZCm1$tQz)W8=6lsa99l8So*$~leNgR)mW=J8iyIz4!LCA6-840rQSsFp4Q4|!+h`4u(p|9LoVG*(=DveeywpB(LZ`TP z${Nji;HSNHC-wt>&=aqw%LTzxw@0)^R)!qheSm+?=ZSl-isk7}i9_}4_erT0-J~|f zB2|N%lv)*OpNWEo?Gfg2zAO40*`=S4zE$YlanE&YW7SIp2R}exoLzQ~tBs z@XIn~D_@h<&E_o@A}@&sA={F8J8%Z;OZE8YL0F#-TDdA;L;3Yp5rnz%IOK1 ze*ENQ^BCEGws)<2igjzM(2f-`Z!_nU-rXn9^scMZYgTTwpyZuIRGWC+NqaXjBiAq| z*lNQ97)33)>o@k`RxsRlKAL5Fc35(%4;O zgA;l{yyF_E78<&%;One$`Za*`(3RSsNF3UtL``LNsbL?}Bo@OAGT@-Tg-%C_dB+mZ zskGm_f6fls@9m%_wpF@9OUr9^v}$cUZ@UJ*;HEK8AG~&qF%0MXvs?Q zkpZGPT2FF@PL zQEmS3X0ur9ip1Lw0Al(9uQ3Dor1ez?c7w%E=7Kr!)W6Zl0#gsz*&}jUum!bK5<0@m z+hx}>E=XzbH2$>@*c=p$eEUNk)%EkT{CgO?(d4ZkZGoQZ(?<`E1HJ0@okQ5kTc^3K zJyQR9SEe_vrBY5yNUcb`NsRS=_h|9C+yA2KOQ6}#+wVKm#Z(vFP^B_cMN3ipQe?WI zC@HlEX{j|x)xIUusG+}PdhZscwwcuKngY+?F%b8=mVI`? z7dU)LpO*pW4AA5~{$U37=3X~-M>BCZOAT@Q*X><^-}I{Ulr;u7UC70|0Ej+q%Rb;z zZ_haEuYI5NpFayN5O337lo&XuA0mEPjW=#ko9%UNoIb*h;g$cj&qWE1sUkH`pgMRz zA!_XlfnErfSZn2V#m{y+M-n#gtmMBeM>)BBEx5j~p#`nJ{$S!|*dRaJO~UvIxjZ$+ z?P*BNEy8Ax8s*KwCaa5{i4fmMAuz=-e+M_rX*IGQN;i zF?rFXY*=6nFT~L=7C61JR@n${g56_3f6BxtkvA&yl#Y+BngvBO5GdIwJ;~)2CGM&9 zc{-zG>yP0`DI#6jpDYv?(pNlftSnvfArGw66)>Q6Z=vC=_=^vsZ`c~-MS@7V)%K_{%sh@pdGI6ymgn*)b$EOvl?5~9qLp|+ z2s#W9Mb)C7xlp%~Hy7#~hbZ_-0KT1Er7f-B7y&Pr`{7SLycP8dM3zk%0TW*pR!EtRHDi0* z+VBRk=hswX{F>mx^a^OJ^Q9`l1fhI&su54zu*4EZ7miXmXhOq?l_-E0ok7oD4i2>h9aewJ=-q-JYBgo{BVS z5k;K{N^o4(DNlqp92vqJ{c#n0IIheP+GPfY1*y*SFhAK7yx)_=*9%On1|mpv)@2ul<#j`8r_gW`EHeAX?xRQQFjQ3z&?rj>aT@W)X`S z&|B$L?B^RzQg!z1#!U%wT&Ol`;+|6)gxO6MycX761MVn`W$A35^B8~yMyk`UIIB~S zqsg~LLnaigA4=6GjMy%*V&)S|_@GhDbfjwZUY^JU_~dODIV|_E()t3z!g0y=x|zK- zewA&jcjwmS(WHx;{cm@I5!-jXRbJ-S*>JzD$-l9^ZVu>f-uykc{O9`*;o-j;oa+V# zKy`dO_wU?N;l@fz;g1?vaJNzD|2QP?sM&w+kbpSy?!SvDrRn5gow=k`Cc$YBpZtEnQ(|`TqIb!@Z-;z^ zSAO8lAD#KzrpP~Smt&v;lc)7~;=ua8D5W2fys z`_*1}_utdX8m=J@P%$=OmT#6x;rOBOAG znL`u3k&aN?il3NLXo9DY$$mz3u9s8mfw?vZ!n{=OAIes6?+bPqcCNL(5@ia?p<};Q z*=xWO(HG|!eki#|Gw1v@jOTS;QU^S5P#nd;hbF$F+9r*gSBEa!+d{H43oAMde2&ZN>?G`H5Km96 zAI?8pJ;H5@w=QT-G3!w?!^PDZd9NZt$l*L)rdJRsj(?$J0-rq@)6%vdFYNawH5_@y z^=hqups)1%x)#V0S+Wl-uK7BzG}hcMOnq~8E3~r8WDE`@8=@<~55N-xZ7AU2@CFNT z?+!)Uo(CLw?E2<_O$`pR*CT2#atJ!WevX2vyz$sm{0$(NVT+S$Z@$@dQz=RKI_)5GdF#i>SZz@IPM&T1AS zds!gvvv#4pf~fTFs_yAM9(*@Nywj#Pz(nhF%Y9-$)MH_@v@)oDH#Fx0He(ddsPc!A zL%gt%5$*;}@i`e4hm;!82QlX%@ThxczSV}IJA}zQ0NuE3pBdtO|7U9(agB669v{bR zkM6YSoLwb*T`TPbw%f=fM~ZFv{U3&sYPCK|Yd zyGh-ys>gqAGdd~X7&vE!iZO(2IgU9Sd$sHU7(HiGb^`y3kFc6D106iWZE8@m14A)J~{@QJhB%+4Yc%2 z)iZS-dkDKt#%INN`+no+P`^EVdA}ieQz0R%G5SdYAGVBGd z{&cs(Jmq}vnM@6t3U{LO?FVaNlx67_V)}r`{^)d{{%5Nd%|y^f#6fvQ}TT~ zmwb6Y-0F{!1lJWaZM$g(P~QHO*&ELL@GJhH$oqLpFm1siB7zrR*} zELnss0--;FdLcR=p&Ys}cR$vCOj-LnH=8lT*ITN0m3V<_T#x1UR5nFa>PfEW5C37A z#7gtpjcPew;J_=6bel&AcF%&);Tjm)k(+<`CeC!s_ch`E+UGZUHz}(?e=-s10-cZ1 z_Rk`osl!Wyl%nynxesR=0)%Afh)-1gya$oP&wDYUQ-JO57){uT42&1nGgn^%|hXDahnLB zll16jG$w&3C$6ZhI$y4_ukSh7;XP<*yu7Tu;iBAk>iYhl3CYN8M|Fvi1G53~!0)%g zdO?vUJ-|_Dl7uv4*s!joB;Tpm3^nDXKEDgun0(lbo22P=Eg=*ld&C#_)~yuXj(?#9 zG*zH-L$yBhWRjw`vYwEAWld-rX)+1r6Xj#oMzx0R6jT#ToomeuDUVbib+$bA^|`!n z-Dt$`f9>1(>dzJ6RpyOy7|*mv9(^3x=>0mF3ws3~Dm4p!uPk?}oe#xh~ry-WTb^>*hU^|^03K!^Pd8IO|<@BHSpnXv6g|#8i&kyxm;B2FI z$8oYs*aJC2cp55TG-`rdjyl7;@KNs}*U41%8LYZfe%hhe-zG{=mqD!m4x`?%7vz6K zYBmPl&EOvaI6}#6i6#6S0zM2ukv{MsHw#ip!Lc|EyO?EM3dTpi3K4J_gxbn zn^-&h0M>XXN{Bc_xcYVT=+~2*zwmYVCG5F5Nyru0Am+Td_nh4GAyrG%3x-?(W94yT zPK{$tb`lhVSj7y0M5>h4D;&GbUZlY_8Quy%BUF6fZ2Hc$!Y`_-6mp>Hjky9en2`@Pm|>1d6A+KJ}j)FivMR1VWPm$`qa*mCLTvlE7EI1PcK z+lK^-1oL$S|Kq`UboyzIQ@zR$mdon<-_`QoqsAY)ujerUAGLNpQ1gDtzi@o?_ZGW) z&ImAfy)YKoqSyxM(O}`!N4+aiz(veG|@da zyQ*(3TED!$`fWM#Rz~({Rqg0~`*}pm(y1?~*;^DIyq|k>w&I={Li6`@#R@?DNHQl3 zHGgqFq^`H(hcacFlIuL$6vcucXzEG@o7#|PZf(IMQ+&6`DX^M8aU)GG5G=_Hw}xgp zTqg{$z{_uUv7l6oA)~#cs#g>};;cUmL z2<#K~Tuj-DD)F_ao-FvJCe#tX1phkVY>} zk;-f{V+99fTsKYTLY-u?uG#rn%0`Z_SA-oellKHQ`wnyf?1w(CnCTXV06O~f_N}?l zR(A5YV^S#OI4vO!Fq6x_h&M)VJidISA;X~6Vhc9EB|%kuFt>HqMMc*kqpB3MzTD=LXSg9qzd9ml_-{`;dMKa*19Z6=F6V#L=!z_8ax9ST;*FP@2BX zn+gFrV#4P?aeQys0?ocw`14b+r5(c>2}kZ#l#2ysFkPoZ_!NrSreJ$x?dttTI;yrkEjDQ`|DU z-q))PVlN~OoXGHM2PrprsrG?j*kR#q>}D%RQ={geB>LKTqL5l3odmYN##-Ox2Nyqgm6gn`ri+_EcUq;n;&2B<2B^%3c_V??AW!mCRSKR!8{XmBny6NZ*O|V*83r`uFwqWGZ`Sn9-&gwY(6O}P_Kk-h@V~if zy~mPLWRePJcu{d&(H(F>fX@}TG-6@hLMm77TFB48e*&h2%A{1nl*8j-_!s{DrRxS> zUw{F@ZKs1Lx$W5@0O|Cn)2V-`ra*7e>p!CHvi`H6Em34T{STc~n%Q`Y0gy<8090)- z`ZqVuuJWP8TR&htvRe?sffWTh=4+br1`Po?Du1a+;nRO^E}J-hf;?Hh>zB!Sn-=oZ z>3&1fLA%0z?@t3FfPZ!Um*r#5obnhB7Tiz)%4e?mT;LhY|FUBL#nGUM+cj6pE93jb ze`~!v?Z3*j`e^7-Wt!f#={z&qA~sK`E!nW3LiaEqJZK?tnRjSEm#{?$MW3YdfGrxI zKYIc8SX!M`&$)*LUKbF-{dpEH3U<>sp#7>+7ASr<)cysaU@NZL9s~&Dn%JEp!?$g= z;d&UD`E*4-OGxrjT1Y$R<}jN6Z^;phI~|~H7nYr@5kLdn7e!%msyx_UVB^KuPL^eE5ae(q3Dn-UKSw+pH1-hDlE(yRO5HY0@ZDtxdMPq1OU-? zm_a#u_aNu;(jV2I_@ZgJ!b5!rPa`Vsjx5IPPUc@d#!s$4#+#w=zz+Q8w!wvWnNFLd z!N`)$kr6i|(&)7kfY{^IY6~%?F;8cyCC~L`nPr9(V>L{_6YrbvZ%w1Wwjd81ITCl3 zgz%A~*QWV#Tn0~G#cn}g+4YeX|CjBLGf4XzDz>mGd^0TWYyzPilq36!}=s9frc~lo9-yP?S^X+j#EDw`JmMF@y1M8^FZ^=vN|zT=60st?X%qa>(Nm{ zfYUQLyH_izx0chx>oZ`1c8|@OLv;!55`rcJ<0U(b#06vlvX`%iiig$g#gu7iPK?)K zf~P2_FKnLY>5MIRNOROHnjcIq=@REKw|h+azjk@gkEso_#tKn~XQ`-h(q)@g2hzYv zYt%w@{p?rRX4&=*BisUxe9#!{h$hq#dXf&{OI{6j5NfpgmWo6OXONTe?K=-jBv<)& zcKe`d0S8q6Pysun5~h80c}4nud#LaRZn}Dptmxn*06U`}y>0xZQSd+9dP)o{{O+|b z*x|obo<{fj`^qGu=J*k8LD-LJsh67m-TyF1P|79FKU#X6O+)a%5#Jv7-Z;#M02R=* ziH9AkZQM7_C$1Vd!YGMf@Bb^(zxG5?py;gR%YFC5EuO6Ye(>MR|8rFXv;k-CO6ey8 zW$-^DsUM?*{}w>t4w1Qa?`VexaGjmoSzEW{@YHqPD8XYrM9Bp4Cpng0W`z650hMWzB!VB8ewGVu*ILQ*H+$opP962sZ^X|m|i3-QJNctUD_BXdxRu_MU zY91X}3&_HJc~MQmy~MP*u76OI+Di!mCPs!}89wnVj6z`bhc9zaZ*_|RR`3N;)Q=<= zVn>F8bZz8)$LowLj6>&O$!5AiL8FdVTXJN`zWEP|n~wt&8PS%oG<@8cZ9U9Wdg(g5O>mpHj(y* zeFdD%?+CgeUPY~nmqo!fHtq9FyrK0R*iDqsPE5yZu<2>xeuvzGdrj45;4i$0n40jj5hu}7~Qadj~o16oO8?Mm(Rek$7tO-Hq~b}o1Z&3!xB}pLB$a67@P8?>RdAF ztWb2xKM9`dD8u%duw({&+K2B{0+|_En{V-uGuL;1g%#sf)0+S`bOkTYygs*lqZZYp6G&u6a+qp+;6cyX<#@Sai^JaKW+t&srgznZ-^D^g@;&imP z=f3TJ>{x5D&cW8N+BU03EzYdgcW~biV*94*9k^yY0UGRS-ZJm>LssBpl33dV&W#z? zWd`uB3h0J;4L2K8$H<26^;tOSWWvNQ7Rf9)kX+DS>bjT|`5oIE>GP>inHr~AFp-v* zL&~uh?WNjox0KVt19_V5Mwe-AC{nIAoS2sm;Dt|UaM1l^Ecem7Zt7t##v`X>2 zCE*7X0Wg;CKPpOZ9k!Xd!k%DwpHx(vIR9sFr!DuGFE0@?Dqg<6z-QN~i?F3`p?~2= zbRskY#64IxA3)Ka^AivLqWov{W*IU9tUB4Z?KrQ})c!4aWnwT@NZ3n(|NhZm`zXWt zqvg^o{j5aRIeqm>q{%@4uJYq6yM}J_6GU><8L);zN{Knl=`r~N>a_Sb(@ z(X=1LQtt1v9msT%MS3~qCjfss3YqMS{?VuZ0F-~o{vU|^dqeaGlKk0L@X`T5@PEv1 zpu|V``-4D@f7hsT{}x;Uj%}hhy(WS6svrC7KmGlzG><`==S|EaW!4&N9jYf3Mn1I5 zvg;i9{%nYQ!;-~ZVVN7&m>A*A0k;sDZdp$K$FAu1D`!wTx?()N5qi znML@04>T-?_gn5=j$F5|oI}`Aa@a)HV479O1Gr();a(wDf$ZTZs=o(a10*D-a3OcB zUxx5o24Jzr|8=FTdZ0_R$(E9EaT@(4a)x?kl)&^NoP$nkWRZPE%|@>jqJ2Ay7A|-e zGamY27Y?FKsE{Pbpg(&IaR|im;imfRnv{}(Wl0e#=A`99y08hf)aX`o9$O!uZO20I z#qy%T4^ZfV5Ns&y&KU9p^X=A_v*#m)u@{=0u@d0_i@%MHA$X#hvICpfsW-%Mo7dVi z@M_czrJc~|R*GMSGysqHSUWD<{X|B03`zUZz*&ow(`Tm7O-d^OD=8oOuJee4AD_oa zUvWMs*K!P|7CtelFvjzXoDV~J`0I}Cm6O~E?9bzb-79|#@-M+f_GUr&B*K;glBSf< zq=s=`UJiBey{3uv>pDmu#<0As)s#dXxnNpl+I+>Y8k?GTjdL?`O}wp+u^?$_@q)EW zbFQ!Eye(F>dZN~5D)T&6tipNNcr}h*i1{_&t%?gDV`{i6QG;}PdCn?fqVgl&vor*p z^nqz_@osgX0KSx)1f6`>BaZhi@LsM4l2fLl0xY@Ln1eLYS&sx_2TBNc_+p|LcsNiy z{^}Z>|LN>Fi}=+ac6>IpNeY`zo(~;OZf0RaaS`JsmD7z*;E_;)1Xamn^>>0M>pS2Yj?6q2q#N3AivUW>yWJZq=#jDF1gVSm{>~%0=%vrY zj5G}eM6u5y^wFWn(kZ1#*A>8x@=wvzA);T~ zSUqkWf^OHgIAyM(Zt%`k+vbHSrcJ;=Ph2A(o9PJyJ25xN{+ zd5D*+G7wBmew*@Aeelc-94S!6JljPQ#a$5(c`;Z9`=RqBjQj0xA8DgHLjmbRj4k?*lDggP zzTB*cuUs?Uih_K%k<1nJR(tz4qetPSx899eUSBMl*X|&~-plu8D82&pOLl`DF4XE4 zF)iLqX?J`(2RM=T!yvTW=?}bx^lvNt%k>SjeT%>`Wx~Oqp1%`pi%#|ql8}?hPW9t^ z6a8y;^#jyoa+d&&60^ zQspV`DZb<5LkLD0w~DNI^sAOq0(|l8%EVpY&hd#y5M!eee%oB+yg;5?ZPiPVLH~F- zT^U;$wSI`d1X1cc#lL36w8f@(Sv(!ZgvAw@_ZU0D++C)={+aw|_c^SaUAJ&tkRAmS zwEW%K7$MV-4{Ca~05WvE%KZg9r~>%gS|?>^hb%dO*B7FMCG^g{@PB#Qa$4^mOA<_5 z-}7Wj(b$JeXpE=6s9IZ|b3<`Q9kGJH8-Hl4;~bMXj{p`+=ar(f=%{BTndnZNBST~J zC#Lv-E|q|7zDi3Ie)9716vezy$?cvK$h2wFxiJuYk|y*iQqkW$EbpeU`Fm1cMlf!p zB1#87!iwu;2jk|B8P}pkS411lrcmLNme0BgE6mROYmaZyRLZ}WU6j+Oh{}JHY__Gx zii^f|Kj2lK-)UXTUL$d{78*BGPfnnm?4aU4vQ#k*PTD#?5?-Y(@B1^#1OHKLkV3H~| zqdq8q{ak=M@h&dy)It8-JkVc2TB2+@YN*!V)s*5Ja|!JO$rZ<=$vEC<#YmzEiNniJ z4Xz&{&LXv$Vf>nh>*{ScnB_XQCM2$KZMf4Uv6L6L>r0cw2)S=bcbSjK`%Lr3aqunQ zz}0VTLGsGJ)>a!>bIT0?qBd&IIS!-@U7xLZ>jhVfv>n@A%y-kqgNr%3o1}tQ5J5 zp7cw=nVHIxC-h5k3RX1R1NwDuh4!J2t9b1;EtG(|e3o4sL)=`rDSX^_?nMG%HI!pE zRTh>LRkmZ_J>|hsNP(}ZnD$Y>?e!mVlms>7h?~%3CC0~k>&$N&uFXarzAF@Y`ZIPE zEwEn2>}$)0B={8CJhvI%T%2lojw_enI7l z!v^6OQ@JO(aSj0$7NaPydPWoBOA&TGTQfGWel)1%y6-&f8JN zk9yoZW9j(t zdAiGC!bJJBR%M3PnxSKP6Z}!!7S17M4g~DjCe2|qU3OIg`<#eu+_6a`e(lo7HD`;+ zMzB$}Lhp<^?fwkurm4!b0M6+v|gxB*E8I`bY0 zF{SV5L)H6M$(MVKos|OIyXdO1zoAHF$|fl}uWZ?(t-6pn@|W1NA1m#Pyt?0e?C_&9 zMtTDTjJb+m_0jZ;pLXBkKW*>dKa>PCB3JePH;(P+L_y}$#QiTXy(t5%@c(wjS9qMU zNH3~v&juuKit%eEKd<=hnE(GyG{D^xM!n0Eom;Wwvz7CnelE5)oL(SWW*{^evns`?FTK*D@wcdP^ z6@;Cef*oIat^G=upc)->yUCff?sTykV+Prj1odAP+dHK7<;=(|TY*>_SL(Q-e-}^& z41G|C#ws*LMY%f}T0GTX77*?W5Zs&J_tV4&x{cYUA~qYQo z2{F^An<49b2l}@;{6(hF9I@lMm>N1>|7_LhZ)p_X`^f;=!AAZ=VlPY#kS&nJUn~>x zzl2u%%0W~EGjvkJK7iOuQ?9gr5r_x#nDH4qs1nPgV&+QlkPu@o{R#MqFh|jYY;=%XdC-;io!NG3IFp=; z=VH%KK1fpomU~BP6Px>5QWZ%%(Yin9!kg! zM^-0$^C z(8 zCH?xX*#I6@vUU!xP+k{sSj6|+PA$5HZA(*1)IF#uO!l1rK*I?RnW@*h1x_H%i~$Wt ze;s;v_|sQC^w~!XS8;`;3r{V)wzSID2+i5v5RZpL#(A={E%N-6;GfntNX}cDHa5Sv zjD}lDJ|@yJKacD+%f^&)2MOeX9f4JYtx$UIBp-Pb;1zz)IMTXq`)i|blPb(simLtv zt;w8=ikb(qk5<7)Y8z5GXgTAm2|zO;NI@!lYh-{PP&G1Iebqi%+l$s*`ou-|4`UZ$ z`#VRqiwx0lAmS8Q+Op<9kQ}}rL2kSBVk$kHFVK%ViBy0SPT?{}5Ym$+SZ>(& z*+2A~$F5D+CcfXwB~+lYb!{;&p#?e}OTum_FL^9ADt!e9#%=57WthGk{B%R-`bDC- zA0gl6aLXE3Gw>-XQj`)}0d-&aFp|La7yU)43-ivB&| z$7;&pdE?)mPL90%8{z-Y#)^gUhsG0K@1NR3GLkhj#X+wc==*|8SoeCiCks@tB+n7h za^gVtHC1D)g_I^eCHVO6pf}$}&iks})Wr;)!Xv-t@B&X?QYLT(-f)$j!)W{WZZUo5 z&4|wDK;xO1)*zQ+JHl3S0}np;ap39WJjFJS?k!XpBG|j9%qORAg3ZD>wdp>1{m5C_ zH_coEaH^mW^V;BUmXmLcT=IUY>%?jV7fKhBkdHh~ihy8m5A_l%4~OZRQ8QUfSKJiZO&-FTa`LS2GKK!g4SiH_;XUeL-mWWX^FuOi=^2t zk;=ll)D>bHIQCJf{ouQKYpq_zq2~b9DOtJiJvcGdsiu=;(mS)R2VDyv#XJFo$HY#= z_)V*9p(C(5>>Tu6WXrwwkkpt1zLT7{sL|KqwqI$%*PoKFT5rzOv{4xcxZ&7pYCMjls{pYzcWI+dw*VGKh~CmaC{;KA;%bUB^eNtO0% zZRPXQs~fWfL%}8;<+4+28G9$xr-wIFgm+}Xy91LXd^Hh#e(`0t#dMQ|#|G;#O&~=b z`~2MJX+#MND_+mQeAt7{?QUhKS&zAm1FY%UL%O1KEO!Yb-N@0oICNjOgHi)*$^TEsy2sEw(rECtF=R0zam^^b zHY1LH=51Ql<0EM{rxs5a5OqttlpD3)8#+!NK0gn(DFee14m7x-xsB?}z#3_eec55f zug{2CmdS;WO|z9-o`c}vX;^Q0MO(>qrQkRJ=QgSp)D`ENk)@|*W%c}n&~wQ5GUz4w zM(ja{$lf$oc%HsoQh`~m&+56?W0}r@a+C0nLpZx-95fy{$Z?ynLTZYf)w=1is1Rq! zXO`}y(11HJZCAlDbgOmZ*q7jQq!xr%;7qW1X@?vBwGA$#s&MT@*qB36dEYwXQ8nmu z0Bl9`04>A1Lt9V4ygaHpG3m{Onfe+^fB7{y%k5*9Rj$mtx+#y|iHKl@Klbgo*;wtd zlGVk*VFEmE_b#^aB`a!aqeY1Y(iXeED(kUy3M9n~0a11gEs!*BnW^T7E#Z&<QGsZ-lc57`4o6_{b2iT}X1mpsRPMA~JtR*!*|c+BeUveAbZf zQL}<_a2G>5S!#ra2miGX8~E2g*6BBc1fQ9S;nu{0HgGK>xpq90Sv01*GBCRaFH7SK zCUET6T7B@+Yj{!GOJhDBa+2u>){2s;yV?V^Rt7husny1!Yy%PmM6rWCn5Ru|sG>rwi|P{Cg)ie7AU z_q_qtR!DWC%mfss!o%`YBD6Ey5Y1!ThkxQG2e7#|=h`nd@aC0_MN}Zmo&Jk~>vu~L zF*6=DMr&uo&qmsay^ElRU-p8tUhXPQ2+h}j$|5bdO>ncjo=afxxR#E5+tGk%=L+iN z-YU~#o;hqzGXcj2$*jfH0J0O*af3+0xlm(?eFq=~b(_*2s4P}xzzaYD zv}CTF{D!WlV`e_apWLj|wCD$ZOs`_{lP0|kOn5J49x@ivCDB6Q=R$}xZOG1*mBBd!w zA2GkaO*aU!$##I4?f@Aa^B4*dS=D`xzf&iXs!{I%{QLRkF< ztm`zW!W@cv*G6H3z9N6^QknM&s=HUcTYZu9dnK5>oB(VhnU?&HiVD;0S-ba*V;eLy zns*2i!|w7h%qEfuJu)-1wL6+u0>3v4Q2n~EKWT2DAKH;|-q7Qf<$TYnM<8g}E?RnS zq>~A{43&#!@28f?qK`8pGVZ61o$;Cujw~g#G_j}Bz5r;u{8;6nVG@$RLA>&|!4H|- ze|oZ6wG`KtfRHf^-b8uRmBypVzcL@tcG~ik?V+F1R?3b$t%+9OXZb+p-%D;m;s^ik zhoMtaqvq*$JgOJ+3eQ2RR|Ois-COg)jUrCT_7U1kzkZTs&;0W;D|6&H4kifxVq{_9 zZ0gHHpuR5m6L5sh!-xQKK2^1qk+3}8rr2zBMK$U(hT`y42Xyx_GJXC@f%PpxWzf_f z7MRJ2*T}u%tE3-Uy&-sH%w%f`i*=if-*e9q zPL>{8K*q`WF|J$>Cyj!0DDc=?w=;t=w=3OEj~0v-b8K;8>2D@|mS01!bYDVN*fcL< zb;?1i9tyYn(pOBEuoY%|(au4hJ*3Zzt1d&+KE7?`_A@<4SthfK=^8U|yRLHW0@tEJ z`sK=sy(xTpLe;7xD{{Z%WvT~fTiXy7bI8@yQUbghJytN4O* zcQvGdFC!`100>O6!KY9;$7jMWrY51th@>bMV_-0XM`9hb~ zv!XA9n9w#q_Y6bCmTn9otMj3EhK5e!ndX|5JG<_%EM#ocqwVy|ngq|fUsHhGQhYGV^%yEVCw!cqoK39TTSNa&)C~(E z`wEN9m}Hu#kOvswzKlOaM7lIUC&l3jBDWy22!pgG*k^xdBrGn&am2D|jYQ#RIAChr z&Fw42tW*7c6(rYhjcY#DSLHe};c#-jDD> zUvAaXQxn+iVR;ur!JI8w7V#6UKK5hePL4|7+k7XbaCxtyvB~Lh`giUY=lVnDmRmeQ zF`KT3hR_V-$Y#PpC?WXOH4z1dpMo^$IiI1;lUK5MS?J>$ce0P)kpHJ<4*h@!9ov2N zmHh*nWN*2n-1W6)B1(1}eEkzgZmK#OF#AK;jjz53v~8h?u9@-EbD15*nO5K4mEb;S@x((F0T0ZbfPSo5nXiU@7C$=r&4w^Kmg}2V`R8{aeni``B}zeV}%RN6z+gKFUDSq_u3a9Sx)+``B+MR z@cV^`Ie~TOhP~l+ScMybqQ(;fBz0(4q+*xaFmEBVzy`8?QS|U{fe8(;t-wkdvIvdP z!Q8lU2p5Zx4&H;nD!h{4y_=IW?aAwY)^N=H*ZF3VgGwnCm%MnZWq<8kcyDxle)IlX z_9PV8+MfUcc}DHTbvwK_n>fFwQ6jv^Y=JOljtB-)Kio|;=`&bJAT!uR;wXy=iW$uvL7-@EprkYpD2My@FRKqt;Dk#y2-37yT5lm_(m|BXy~61D#tZ zAxp5(b}L^?v0TIDC%JX|^IA1dQsCcoN9ovEKeY~1P{;SREobj)PI@XAP4Uqe(Tdc) zY~aiVuCXYil#gh@D%Qf} zA6g|f_(2Z#l)=0iSp8a%yvLb_+|dO6Z{7p1ah;dI&E#}ROCoU8N!c@Vshl>Q(Yk2z zjKm7tjW=@2>{tbz-SyC5S2l?#t$RpSrSppZxt!M%h>Xki4=YKzr)EaJD!<-++EjzO zn38sjSng*5?CL;qjllL{-WcQdB>#z6@?&6DeY1?2X(LklAZSl(=5h6n8-%I_nlt0* z?3y9Yz(FPH4PVTlv;O}v_SSJt@A3XP$KnVoDgqL+qm(!Wl@{16KtPz}=&6V_2uQaYp^Zlsj-ut`vcYpEE+J|!wKd<-m^?E&H7@m%}RLoFu zu&yaUcmqr#-|j{+lSh*e+N%n^B1p#TbI>URfI4=A(d4(Au~BOYM=n(;`9H{!6h}ln zMJJddL$3_RL`Kr9v5X_AcRnULT6`5PAHpYEZ?0EZxObq0P*ri3V=0!pL%A@`;JA&-^028^YZOul zHAzOFCU1pL6dE6>mBml^m~`N!Ix>mD8T^oS2TwEaCc^n~6t*^en>G3rzlM~{Bv200 z0ZvZ2Bkk~eWNflg+~wZx%NpFErPm9nloaMIQ0!vr`5Cw4?S~~m#)MWuV<>m^HQ)V0 zGwA*h?plCG#>C435!Zb)LUy@A3-)Arn;zy}^A%4U+^y8LOh!__E`B4T!z27mw|fX( zD`1GklOcWIOm8b2HS;uS@k(g9HEVTvO|Quy=ail9HSfjV02+(EL(_dy)17c*{5deD zO!)@C=fx*$lkdfC?Wb2%bLDT#*O^mxY*Tjs-uzMe=%|H6fx=H#N9Bo@C#rV!em$_u zzwd?8-tJ}}xB(_#Jwh3Pm6y!VPlcE$X#f%o+n<^?-Xh~~zb#~Qh!QcsZ4krtG^Y4} z+S_RS{Dhv@w_nnY{^ShwX9i(%&5pAT%IVl+(}YVQR>ygl^>(`|&`9>_T!Ku)*U-Pf zOV}_JS$leE4W4!Z?U^oNE?4I<4g@WItWT{$_^`k`AniXcVWP=)>+eToeJ31*jg4 zwEM!KL9ssek1zfA-Y{*t;&bvTt*i|;?7gGwH_r5eMujfUm4U)uK>BKh4Xq}I98Qj^ zN_*Ro23itN|HJ0422jx&j5y;W$^a&auVY{Kye-S_Tk5N>(riW7eFcVR@RmfX5pw`%WKq3T5$f$?r@}V)D(&Jdd$feMqdy(*btu;QaGbQ zI{z%~gI0HG^|bls0M&``@rK2j@E1)O6`|De^1`xlor1JAKlVn%@qpXCfQ(f|WKJ+p ztDWU%)+P$nUN(}cm1zkbET|K&y%yI1&IVE zw3o{8ATw4$tAoE2hD&evEn?P#agq{!_+5K|N%!^7o_76B@ZcRIF_$qwG<5`s)>U`Rk;Qr!Ti#D@xkTCqLH0ld8plu zIOLRgy9)i1st@!bW;u9>AVnn!)^Ow+_24OJz95Yooldd+tQNbvAHS5z)fyy@P-nvy33SHk92%}ZW0`{KS zwA8ejb>Z%MVa{HLO(j%V+<2RaM`Aq>FbRcH&|HjTdX^5+XMoG)%=xi=YSEc$w3 z5L+s+P3rH>2#JGN$a;&><_ZI|R647GKg7-*XE8BU^i(;D>1M@A_eQqf+e;@;g@{Mk zoJcGSQdTd~xmo`#tTH@7Zcmt>a(AXswQdn7KCg9?nDZ=U_HsEc*Uyx>a)DpY336CA z!~8V%$nMVA^vA7J1UhHH6RI((gmt!?s~Nqz@zPSu)`;eN-#Gql8Z#$ADo5fC&=uFX z^8nd9f$S-GCQ$_N|9OeZx8Q76GH=#zFu-crTV}?TRq0$ajNM(PgRt!qvyAyul=JeL zl?76S!viWjl;ORtKK_TPa^#4Q7p+19vk#;hL0i~IWb8VE()$`D!0HyT`XWf(QMK*> z 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 Date: Wed, 2 Mar 2022 10:50:46 -0300 Subject: [PATCH 08/12] GXFile should detect if it is already a absolute file path. --- java/src/main/java/com/genexus/util/GXFile.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/java/src/main/java/com/genexus/util/GXFile.java b/java/src/main/java/com/genexus/util/GXFile.java index cbc4432df..29e983c0e 100644 --- a/java/src/main/java/com/genexus/util/GXFile.java +++ b/java/src/main/java/com/genexus/util/GXFile.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.io.InputStream; import java.net.URI; +import java.nio.file.Paths; import java.util.Date; import java.util.GregorianCalendar; import java.util.Iterator; @@ -53,14 +54,15 @@ public GXFile(String fileName, ResourceAccessControlList fileAcl) { this(fileName, fileAcl, false); } - public GXFile(String fileName, ResourceAccessControlList fileAcl, boolean isLocal) { + public GXFile(String fileName, ResourceAccessControlList fileAcl, boolean isLocalFilePath) { if (com.genexus.CommonUtil.isUploadPrefix(fileName)) { uploadFileId = fileName; fileName = SpecificImplementation.GXutil.getUploadValue(fileName); } ExternalProvider storageProvider = Application.getExternalProvider(); - if (storageProvider != null && !isLocal) { + isLocalFilePath = isLocalFilePath || new java.io.File(fileName).isAbsolute(); + if (!isLocalFilePath && storageProvider != null) { FileSource = new GXExternalFileInfo(fileName, storageProvider, true, fileAcl); } else { FileSource = new GXFileInfo(new File(fileName)); From bff4cc8bbcbcc3bab2302f27f6384369a7f7d81a Mon Sep 17 00:00:00 2001 From: Gonzalo Gallotti Date: Wed, 2 Mar 2022 17:56:32 -0300 Subject: [PATCH 09/12] Image API support Local --- .../com/genexus/util/GXExternalFileInfo.java | 1 + .../genexus/util/GxFileInfoSourceType.java | 7 +++ .../ResourceAccessControlList.java | 0 .../gxoffice/poi/sxssf/ExcelDocument.java | 4 +- .../gxoffice/poi/xssf/ExcelDocument.java | 4 +- .../main/java/com/genexus/GxImageUtil.java | 11 ++++- .../com/genexus/specific/java/FileUtils.java | 5 ++- .../main/java/com/genexus/util/GXFile.java | 45 ++++++++++++++----- .../java/com/genexus/TestGxImageUtil.java | 1 - 9 files changed, 57 insertions(+), 21 deletions(-) create mode 100644 common/src/main/java/com/genexus/util/GxFileInfoSourceType.java rename common/src/main/java/com/genexus/{db/driver => util}/ResourceAccessControlList.java (100%) diff --git a/common/src/main/java/com/genexus/util/GXExternalFileInfo.java b/common/src/main/java/com/genexus/util/GXExternalFileInfo.java index 7da9a5792..0be4657ad 100644 --- a/common/src/main/java/com/genexus/util/GXExternalFileInfo.java +++ b/common/src/main/java/com/genexus/util/GXExternalFileInfo.java @@ -8,6 +8,7 @@ import com.genexus.CommonUtil; import com.genexus.db.driver.*; import com.genexus.common.interfaces.SpecificImplementation; +import com.genexus.db.driver.ResourceAccessControlList; import java.util.Date; diff --git a/common/src/main/java/com/genexus/util/GxFileInfoSourceType.java b/common/src/main/java/com/genexus/util/GxFileInfoSourceType.java new file mode 100644 index 000000000..1988b416d --- /dev/null +++ b/common/src/main/java/com/genexus/util/GxFileInfoSourceType.java @@ -0,0 +1,7 @@ +package com.genexus.util; + +public enum GxFileInfoSourceType { + Unknown, + LocalFile, + ExternalFile +} diff --git a/common/src/main/java/com/genexus/db/driver/ResourceAccessControlList.java b/common/src/main/java/com/genexus/util/ResourceAccessControlList.java similarity index 100% rename from common/src/main/java/com/genexus/db/driver/ResourceAccessControlList.java rename to common/src/main/java/com/genexus/util/ResourceAccessControlList.java diff --git a/gxoffice/src/main/java/com/genexus/gxoffice/poi/sxssf/ExcelDocument.java b/gxoffice/src/main/java/com/genexus/gxoffice/poi/sxssf/ExcelDocument.java index e3329ab91..3bd03131f 100644 --- a/gxoffice/src/main/java/com/genexus/gxoffice/poi/sxssf/ExcelDocument.java +++ b/gxoffice/src/main/java/com/genexus/gxoffice/poi/sxssf/ExcelDocument.java @@ -1,5 +1,6 @@ package com.genexus.gxoffice.poi.sxssf; +import com.genexus.util.GxFileInfoSourceType; import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; @@ -28,8 +29,7 @@ public short Open(String fileName) { return errCod; } } else { - boolean isAbsolute = new java.io.File(fileName).isAbsolute(); - GXFile file = new GXFile(fileName, Constants.EXTERNAL_UPLOAD_ACL, isAbsolute); + GXFile file = new GXFile("", fileName, Constants.EXTERNAL_UPLOAD_ACL, GxFileInfoSourceType.Unknown); if (file.exists()) { // System.out.println("Opening.."); workBook = new SXSSFWorkbook(new XSSFWorkbook(file.getStream())); diff --git a/gxoffice/src/main/java/com/genexus/gxoffice/poi/xssf/ExcelDocument.java b/gxoffice/src/main/java/com/genexus/gxoffice/poi/xssf/ExcelDocument.java index 050879141..abfd3aa25 100644 --- a/gxoffice/src/main/java/com/genexus/gxoffice/poi/xssf/ExcelDocument.java +++ b/gxoffice/src/main/java/com/genexus/gxoffice/poi/xssf/ExcelDocument.java @@ -3,6 +3,7 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import com.genexus.util.GxFileInfoSourceType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; @@ -36,8 +37,7 @@ public short Open(String fileName) { return errCod; } } else { - boolean isAbsolute = new java.io.File(fileName).isAbsolute(); - GXFile file = new GXFile(fileName, Constants.EXTERNAL_UPLOAD_ACL, isAbsolute); + GXFile file = new GXFile("", fileName, Constants.EXTERNAL_UPLOAD_ACL, GxFileInfoSourceType.Unknown); if (file.exists()) { // System.out.println("Opening.."); workBook = new XSSFWorkbook(file.getStream()); diff --git a/java/src/main/java/com/genexus/GxImageUtil.java b/java/src/main/java/com/genexus/GxImageUtil.java index db1858ea7..cdb371e03 100644 --- a/java/src/main/java/com/genexus/GxImageUtil.java +++ b/java/src/main/java/com/genexus/GxImageUtil.java @@ -7,6 +7,8 @@ import java.awt.image.BufferedImage; import java.io.*; +import com.genexus.db.driver.ResourceAccessControlList; +import com.genexus.util.GxFileInfoSourceType; import com.genexus.util.GXFile; import org.apache.logging.log4j.Logger; @@ -15,7 +17,12 @@ public class GxImageUtil { private static int INVALID_CODE = -1; private static InputStream getInputStream(String imageFile) throws IOException { - return new GXFile(imageFile.replace("/", File.separator)).getStream(); + return getGXFile(imageFile).getStream(); + } + + private static GXFile getGXFile(String imageFile) { + String basePath = (com.genexus.ModelContext.getModelContext() != null) ? com.genexus.ModelContext.getModelContext().getHttpContext().getDefaultPath(): ""; + return new GXFile(basePath, imageFile.replace("/", File.separator), ResourceAccessControlList.Default, GxFileInfoSourceType.Unknown); } public static long getFileSize(String imageFile){ @@ -78,7 +85,7 @@ private static void writeImage(BufferedImage croppedImage, String destinationFil try (ByteArrayOutputStream outStream = new ByteArrayOutputStream()) { ImageIO.write(croppedImage, CommonUtil.getFileType(destinationFilePathOrUrl), outStream); try (ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray())) { - GXFile file = new GXFile(destinationFilePathOrUrl); + GXFile file = getGXFile(destinationFilePathOrUrl); file.create(inStream, true); file.close(); } diff --git a/java/src/main/java/com/genexus/specific/java/FileUtils.java b/java/src/main/java/com/genexus/specific/java/FileUtils.java index 3868330e7..40e72a319 100644 --- a/java/src/main/java/com/genexus/specific/java/FileUtils.java +++ b/java/src/main/java/com/genexus/specific/java/FileUtils.java @@ -1,8 +1,9 @@ package com.genexus.specific.java; import com.genexus.common.classes.AbstractGXFile; -import com.genexus.util.GXFile; import com.genexus.db.driver.ResourceAccessControlList; +import com.genexus.util.GXFile; +import com.genexus.util.GxFileInfoSourceType; import java.io.File; import java.io.IOException; @@ -47,7 +48,7 @@ public void copyFile(File file, File file2) throws IOException { @Override public AbstractGXFile createFile(String file, ResourceAccessControlList acl, boolean local) { - return new GXFile(file, acl, local); + return new GXFile(file, acl, local ? GxFileInfoSourceType.LocalFile: GxFileInfoSourceType.Unknown); } } diff --git a/java/src/main/java/com/genexus/util/GXFile.java b/java/src/main/java/com/genexus/util/GXFile.java index 29e983c0e..976383eb5 100644 --- a/java/src/main/java/com/genexus/util/GXFile.java +++ b/java/src/main/java/com/genexus/util/GXFile.java @@ -46,35 +46,54 @@ public GXFile(String fileName) { } //For compatibility reasons + @Deprecated public GXFile(String fileName, boolean isPrivate) { - this(fileName, isPrivate ? ResourceAccessControlList.Private: ResourceAccessControlList.Default, false); + this(fileName, isPrivate ? ResourceAccessControlList.Private: ResourceAccessControlList.Default, GxFileInfoSourceType.Unknown); } public GXFile(String fileName, ResourceAccessControlList fileAcl) { - this(fileName, fileAcl, false); + this(fileName, fileAcl, GxFileInfoSourceType.Unknown); } - public GXFile(String fileName, ResourceAccessControlList fileAcl, boolean isLocalFilePath) { + public GXFile(String fileName, ResourceAccessControlList fileAcl, GxFileInfoSourceType sourceType) { + this("", fileName, fileAcl, sourceType); + } + + @Deprecated + public GXFile(String fileName, ResourceAccessControlList fileAcl, boolean isLocalFile) { + this("", fileName, fileAcl, isLocalFile ? GxFileInfoSourceType.LocalFile: GxFileInfoSourceType.Unknown); + } + + public GXFile(String baseDirectoryPath, String fileName, ResourceAccessControlList fileAcl, GxFileInfoSourceType sourceType) { if (com.genexus.CommonUtil.isUploadPrefix(fileName)) { uploadFileId = fileName; fileName = SpecificImplementation.GXutil.getUploadValue(fileName); } - ExternalProvider storageProvider = Application.getExternalProvider(); - isLocalFilePath = isLocalFilePath || new java.io.File(fileName).isAbsolute(); - if (!isLocalFilePath && storageProvider != null) { - FileSource = new GXExternalFileInfo(fileName, storageProvider, true, fileAcl); - } else { - FileSource = new GXFileInfo(new File(fileName)); - } - } + switch (sourceType) { + case LocalFile: + FileSource = new GXFileInfo(Paths.get(baseDirectoryPath, fileName).toFile()); + break; + case ExternalFile: + FileSource = new GXExternalFileInfo(fileName, Application.getExternalProvider(), true, fileAcl); + break; + case Unknown: + ExternalProvider storageProvider = Application.getExternalProvider(); + if (!new File(fileName).isAbsolute() && storageProvider != null) { + FileSource = new GXExternalFileInfo(fileName, storageProvider, true, fileAcl); + } else { + FileSource = new GXFileInfo(Paths.get(baseDirectoryPath, fileName).toFile()); + } + break; + } + } public GXFile(IGXFileInfo fileInfo) { FileSource = fileInfo; } public static String getgxFilename(String fileName) { - return new GXFile(fileName, ResourceAccessControlList.Default, true).getNameNoExt(); + return new GXFile(fileName, ResourceAccessControlList.Default, GxFileInfoSourceType.LocalFile).getNameNoExt(); } public static String getgxFileext(String fileName) { @@ -770,3 +789,5 @@ public void close() { } } } + + diff --git a/java/src/test/java/com/genexus/TestGxImageUtil.java b/java/src/test/java/com/genexus/TestGxImageUtil.java index 1cc37a3a3..5c7cd70b0 100644 --- a/java/src/test/java/com/genexus/TestGxImageUtil.java +++ b/java/src/test/java/com/genexus/TestGxImageUtil.java @@ -48,7 +48,6 @@ private String initialize(String name) e.printStackTrace(); } - System.out.println(copyFileLocation.toString()); return copyFileLocation.toString(); } From 58c42fc152f3ff4690e89010210a7a05573c453f Mon Sep 17 00:00:00 2001 From: Gonzalo Gallotti Date: Thu, 3 Mar 2022 08:37:12 -0300 Subject: [PATCH 10/12] Fix Code Quality --- java/src/main/java/com/genexus/util/GXFile.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/src/main/java/com/genexus/util/GXFile.java b/java/src/main/java/com/genexus/util/GXFile.java index 976383eb5..d6b7c9edc 100644 --- a/java/src/main/java/com/genexus/util/GXFile.java +++ b/java/src/main/java/com/genexus/util/GXFile.java @@ -79,7 +79,7 @@ public GXFile(String baseDirectoryPath, String fileName, ResourceAccessControlLi break; case Unknown: ExternalProvider storageProvider = Application.getExternalProvider(); - if (!new File(fileName).isAbsolute() && storageProvider != null) { + if (!Paths.get(fileName).isAbsolute() && storageProvider != null) { FileSource = new GXExternalFileInfo(fileName, storageProvider, true, fileAcl); } else { FileSource = new GXFileInfo(Paths.get(baseDirectoryPath, fileName).toFile()); From 99da7fcc09c17c0df6719cf4d8d3f1c6adafde62 Mon Sep 17 00:00:00 2001 From: Gonzalo Gallotti Date: Thu, 10 Mar 2022 17:12:50 -0300 Subject: [PATCH 11/12] Not working in some scenarios for external storage urls --- .../main/java/com/genexus/GxImageUtil.java | 51 +++++++++++-------- .../java/com/genexus/PrivateUtilities.java | 16 ++++++ .../com/genexus/db/driver/GXResultSet.java | 1 + .../main/java/com/genexus/util/GXFile.java | 12 ++--- .../java/com/genexus/TestGxImageUtil.java | 1 - 5 files changed, 53 insertions(+), 28 deletions(-) diff --git a/java/src/main/java/com/genexus/GxImageUtil.java b/java/src/main/java/com/genexus/GxImageUtil.java index cdb371e03..297171ed8 100644 --- a/java/src/main/java/com/genexus/GxImageUtil.java +++ b/java/src/main/java/com/genexus/GxImageUtil.java @@ -16,13 +16,24 @@ public class GxImageUtil { private static Logger log = org.apache.logging.log4j.LogManager.getLogger(GxImageUtil.class); private static int INVALID_CODE = -1; - private static InputStream getInputStream(String imageFile) throws IOException { - return getGXFile(imageFile).getStream(); + private static InputStream getInputStream(String filePathOrUrl) throws IOException { + return getGXFile(filePathOrUrl).getStream(); } - private static GXFile getGXFile(String imageFile) { + private static BufferedImage createBufferedImageFromURI(String filePathOrUrl) throws IOException + { + try (InputStream is = getGXFile(filePathOrUrl).getStream()) { + return ImageIO.read(is); + } + catch (IOException e) { + log.error("Failed to read image stream: " + filePathOrUrl); + throw e; + } + } + + private static GXFile getGXFile(String filePathOrUrl) { String basePath = (com.genexus.ModelContext.getModelContext() != null) ? com.genexus.ModelContext.getModelContext().getHttpContext().getDefaultPath(): ""; - return new GXFile(basePath, imageFile.replace("/", File.separator), ResourceAccessControlList.Default, GxFileInfoSourceType.Unknown); + return new GXFile(basePath, filePathOrUrl, ResourceAccessControlList.Default, GxFileInfoSourceType.Unknown); } public static long getFileSize(String imageFile){ @@ -36,8 +47,8 @@ public static int getImageHeight(String imageFile) { if (!isValidInput(imageFile)) return INVALID_CODE; - try (InputStream is = getInputStream(imageFile)) { - return ImageIO.read(is).getHeight(); + try { + return createBufferedImageFromURI(imageFile).getHeight(); } catch (Exception e) { log.error("getImageHeight " + imageFile + " failed" , e); @@ -57,8 +68,8 @@ public static int getImageWidth(String imageFile) { if (!isValidInput(imageFile)) return INVALID_CODE; - try (InputStream is = getInputStream(imageFile)) { - return ImageIO.read(is).getWidth(); + try { + return createBufferedImageFromURI(imageFile).getWidth(); } catch (Exception e) { log.error("getImageWidth " + imageFile + " failed" , e); @@ -70,8 +81,8 @@ public static String crop(String imageFile, int x, int y, int width, int height) if (!isValidInput(imageFile)) return ""; - try (InputStream is = getInputStream(imageFile)) { - BufferedImage image = ImageIO.read(is); + try { + BufferedImage image = createBufferedImageFromURI(imageFile); BufferedImage croppedImage = image.getSubimage(x, y, width, height); writeImage(croppedImage, imageFile); } @@ -96,8 +107,8 @@ public static String flipHorizontally(String imageFile) { if (!isValidInput(imageFile)) return ""; - try (InputStream is = getInputStream(imageFile)) { - BufferedImage image = ImageIO.read(is); + try { + BufferedImage image = createBufferedImageFromURI(imageFile); AffineTransform tx = AffineTransform.getScaleInstance(-1, 1); tx.translate(-image.getWidth(null), 0); AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR); @@ -114,8 +125,8 @@ public static String flipVertically(String imageFile) { if (!isValidInput(imageFile)) return ""; - try (InputStream is = getInputStream(imageFile)) { - BufferedImage image = ImageIO.read(is); + try { + BufferedImage image = createBufferedImageFromURI(imageFile); AffineTransform tx = AffineTransform.getScaleInstance(1, -1); tx.translate(0, -image.getHeight(null)); AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR); @@ -132,8 +143,8 @@ public static String resize(String imageFile, int width, int height, boolean kee if (!isValidInput(imageFile)) return ""; - try (InputStream is = getInputStream(imageFile)) { - BufferedImage image = ImageIO.read(is); + try { + BufferedImage image = createBufferedImageFromURI(imageFile); if (keepAspectRatio) { double imageHeight = image.getHeight(); double imageWidth = image.getWidth(); @@ -160,8 +171,8 @@ public static String scale(String imageFile, short percent) { if (!isValidInput(imageFile)) return ""; - try (InputStream is = getInputStream(imageFile)) { - BufferedImage image = ImageIO.read(is); + try { + BufferedImage image = createBufferedImageFromURI(imageFile); imageFile = resize(imageFile, image.getWidth() * percent / 100, image.getHeight() * percent / 100,true); } catch (Exception e) { @@ -173,8 +184,8 @@ public static String scale(String imageFile, short percent) { public static String rotate(String imageFile, short angle) { if (!isValidInput(imageFile)) return ""; - try (InputStream is = getInputStream(imageFile)) { - BufferedImage image = ImageIO.read(is); + try { + BufferedImage image = createBufferedImageFromURI(imageFile); BufferedImage rotatedImage = rotateImage(image, angle); writeImage(rotatedImage, imageFile); } diff --git a/java/src/main/java/com/genexus/PrivateUtilities.java b/java/src/main/java/com/genexus/PrivateUtilities.java index 9a9cab797..fd269c6e6 100644 --- a/java/src/main/java/com/genexus/PrivateUtilities.java +++ b/java/src/main/java/com/genexus/PrivateUtilities.java @@ -19,6 +19,8 @@ import java.lang.reflect.Field; import java.net.HttpURLConnection; import java.net.URL; +import java.nio.file.InvalidPathException; +import java.nio.file.Paths; import java.util.Properties; import java.util.Random; import java.util.zip.DeflaterOutputStream; @@ -608,6 +610,20 @@ private static File parent(File f) { return new File(dirname); } + /** + *
+	 * Checks if a string is an absolute path to local file system.
+	 * Null safe.
+	 * 
+ */ + public static boolean isAbsoluteFilePath(String path) { + try { + return Paths.get(path).isAbsolute(); + } catch (InvalidPathException | NullPointerException ex) { + return false; + } + } + public static String addLastPathSeparator(String dir) { return addLastChar(dir, File.separator); diff --git a/java/src/main/java/com/genexus/db/driver/GXResultSet.java b/java/src/main/java/com/genexus/db/driver/GXResultSet.java index 06788c07b..1876b69c5 100644 --- a/java/src/main/java/com/genexus/db/driver/GXResultSet.java +++ b/java/src/main/java/com/genexus/db/driver/GXResultSet.java @@ -29,6 +29,7 @@ import com.genexus.internet.HttpContext; import com.genexus.util.GXFile; import com.genexus.util.GXServices; +import com.genexus.db.driver.ResourceAccessControlList; public final class GXResultSet implements ResultSet, com.genexus.db.IFieldGetter, IGXResultSet { diff --git a/java/src/main/java/com/genexus/util/GXFile.java b/java/src/main/java/com/genexus/util/GXFile.java index d6b7c9edc..ddd13efb6 100644 --- a/java/src/main/java/com/genexus/util/GXFile.java +++ b/java/src/main/java/com/genexus/util/GXFile.java @@ -10,8 +10,7 @@ import java.util.Iterator; import java.util.Vector; -import com.genexus.IHttpContext; -import com.genexus.ModelContext; +import com.genexus.*; import com.genexus.common.interfaces.SpecificImplementation; import com.genexus.db.driver.ResourceAccessControlList; import com.genexus.db.driver.ExternalProvider; @@ -20,8 +19,6 @@ import org.apache.commons.io.LineIterator; import org.apache.commons.io.output.FileWriterWithEncoding; -import com.genexus.Application; -import com.genexus.CommonUtil; import com.genexus.common.classes.AbstractGXFile; import org.apache.logging.log4j.Logger; @@ -79,11 +76,12 @@ public GXFile(String baseDirectoryPath, String fileName, ResourceAccessControlLi break; case Unknown: ExternalProvider storageProvider = Application.getExternalProvider(); - if (!Paths.get(fileName).isAbsolute() && storageProvider != null) { - FileSource = new GXExternalFileInfo(fileName, storageProvider, true, fileAcl); - } else { + if (storageProvider == null || PrivateUtilities.isAbsoluteFilePath(fileName)) { FileSource = new GXFileInfo(Paths.get(baseDirectoryPath, fileName).toFile()); } + else { + FileSource = new GXExternalFileInfo(fileName, storageProvider, true, fileAcl); + } break; } } diff --git a/java/src/test/java/com/genexus/TestGxImageUtil.java b/java/src/test/java/com/genexus/TestGxImageUtil.java index 5c7cd70b0..ac607c367 100644 --- a/java/src/test/java/com/genexus/TestGxImageUtil.java +++ b/java/src/test/java/com/genexus/TestGxImageUtil.java @@ -1,7 +1,6 @@ package com.genexus; import com.genexus.specific.java.Connect; -import com.genexus.specific.java.ImagesPath; import com.genexus.specific.java.LogManager; import org.junit.Assert; import org.junit.Rule; From c42979d9805e8dc5e11f851a1282eeb34674ce90 Mon Sep 17 00:00:00 2001 From: Gonzalo Gallotti Date: Wed, 30 Mar 2022 12:51:50 -0300 Subject: [PATCH 12/12] GxFile more defensive code --- java/src/main/java/com/genexus/util/GXFile.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/java/src/main/java/com/genexus/util/GXFile.java b/java/src/main/java/com/genexus/util/GXFile.java index c0481207e..921439e35 100644 --- a/java/src/main/java/com/genexus/util/GXFile.java +++ b/java/src/main/java/com/genexus/util/GXFile.java @@ -69,7 +69,7 @@ public GXFile(String baseDirectoryPath, String fileName, ResourceAccessControlLi switch (sourceType) { case LocalFile: - FileSource = new GXFileInfo(Paths.get(baseDirectoryPath, fileName).toFile()); + createFileSourceLocal(baseDirectoryPath, fileName); break; case ExternalFile: FileSource = new GXExternalFileInfo(fileName, Application.getExternalProvider(), true, fileAcl); @@ -77,7 +77,7 @@ public GXFile(String baseDirectoryPath, String fileName, ResourceAccessControlLi case Unknown: ExternalProvider storageProvider = Application.getExternalProvider(); if (storageProvider == null || PrivateUtilities.isAbsoluteFilePath(fileName)) { - FileSource = new GXFileInfo(Paths.get(baseDirectoryPath, fileName).toFile()); + createFileSourceLocal(baseDirectoryPath, fileName); } else { FileSource = new GXExternalFileInfo(fileName, storageProvider, true, fileAcl); @@ -86,7 +86,13 @@ public GXFile(String baseDirectoryPath, String fileName, ResourceAccessControlLi } } - public GXFile(IGXFileInfo fileInfo) { + private void createFileSourceLocal(String baseDirectoryPath, String fileName) { + boolean isAbsolutePath = PrivateUtilities.isAbsoluteFilePath(fileName); + String absoluteOrRelativePath = (isAbsolutePath)? fileName: Paths.get(baseDirectoryPath, fileName).toString(); //BaseDirectory could be empty. + FileSource = new GXFileInfo(new File(absoluteOrRelativePath)); + } + + public GXFile(IGXFileInfo fileInfo) { FileSource = fileInfo; }