libjboss-vfs-java-2.0.1.GA.orig/0000755000175000017500000000000011146622530016217 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/archives/0000755000175000017500000000000011146622510020021 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/archives/web_pkg_scope/0000755000175000017500000000000011146622510022630 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/archives/web_pkg_scope/ear/0000755000175000017500000000000011146622510023377 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/archives/web_pkg_scope/ear/pom.xml0000644000175000017500000000256511060307542024724 0ustar twernertwerner 4.0.0 web_pkg_scope ear org.jboss.vfs web_pkg_scope_ear 1.0-SNAPSHOT ear org.jboss.vfs web_pkg_scope_web 1.0-SNAPSHOT war web_pkg_scope libjboss-vfs-java-2.0.1.GA.orig/archives/web_pkg_scope/war/0000755000175000017500000000000011146622510023421 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/archives/web_pkg_scope/war/src/0000755000175000017500000000000011146622510024210 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/archives/web_pkg_scope/war/src/main/0000755000175000017500000000000011146622510025134 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/archives/web_pkg_scope/war/src/main/java/0000755000175000017500000000000011146622510026055 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/archives/web_pkg_scope/war/src/main/java/web_pkg_scope/0000755000175000017500000000000011146622510030664 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/archives/web_pkg_scope/war/src/main/java/web_pkg_scope/servlet/0000755000175000017500000000000011146622510032350 5ustar twernertwerner././@LongLink0000000000000000000000000000015700000000000011570 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/archives/web_pkg_scope/war/src/main/java/web_pkg_scope/servlet/JpaServlet.javalibjboss-vfs-java-2.0.1.GA.orig/archives/web_pkg_scope/war/src/main/java/web_pkg_scope/servlet/JpaSe0000644000175000017500000000222011060307542033271 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2007, Red Hat Middleware LLC, and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package web_pkg_scope.servlet; /** * Placeholder for a servlet * @author Scott.Stark@jboss.org * @version $Revision:$ */ public class JpaServlet { } libjboss-vfs-java-2.0.1.GA.orig/archives/web_pkg_scope/war/src/main/java/web_pkg_scope/entity/0000755000175000017500000000000011146622510032200 5ustar twernertwerner././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/archives/web_pkg_scope/war/src/main/java/web_pkg_scope/entity/Account.javalibjboss-vfs-java-2.0.1.GA.orig/archives/web_pkg_scope/war/src/main/java/web_pkg_scope/entity/Accoun0000644000175000017500000000222111060307542033330 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2007, Red Hat Middleware LLC, and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package web_pkg_scope.entity; /** * Placeholder for an entity bean * @author Scott.Stark@jboss.org * @version $Revision:$ */ public class Account { } libjboss-vfs-java-2.0.1.GA.orig/archives/web_pkg_scope/war/src/main/resources/0000755000175000017500000000000011146622510027146 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/archives/web_pkg_scope/war/src/main/resources/META-INF/0000755000175000017500000000000011146622510030306 5ustar twernertwerner././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/archives/web_pkg_scope/war/src/main/resources/META-INF/persistence.xmllibjboss-vfs-java-2.0.1.GA.orig/archives/web_pkg_scope/war/src/main/resources/META-INF/persistence.x0000644000175000017500000000054311060307542033025 0ustar twernertwerner Persistence Unit Package Tests jdbc/DB1 libjboss-vfs-java-2.0.1.GA.orig/archives/web_pkg_scope/war/src/main/webapp/0000755000175000017500000000000011146622510026412 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/archives/web_pkg_scope/war/src/main/webapp/WEB-INF/0000755000175000017500000000000011146622510027441 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/archives/web_pkg_scope/war/src/main/webapp/WEB-INF/web.xml0000644000175000017500000000203711060307542030742 0ustar twernertwerner web_pkg_scope ServletTest web_pkg_scope.servlet.JpaServlet ServletTest /ServletTest 54 My Entity Manager persistence/MyEM AccountManager Transaction libjboss-vfs-java-2.0.1.GA.orig/archives/web_pkg_scope/war/pom.xml0000644000175000017500000000133711060307542024742 0ustar twernertwerner 4.0.0 web_pkg_scope war org.jboss.vfs web_pkg_scope_web war 1.0-SNAPSHOT org.jboss.vfs web_pkg_scope 1.0-SNAPSHOT web_pkg_scope_web libjboss-vfs-java-2.0.1.GA.orig/archives/web_pkg_scope/pom.xml0000644000175000017500000000103311060307542024142 0ustar twernertwerner 4.0.0 web_pkg_scope parent org.jboss.vfs web_pkg_scope 1.0-SNAPSHOT pom ear war libjboss-vfs-java-2.0.1.GA.orig/.classpath0000644000175000017500000000425211104655151020204 0ustar twernertwerner libjboss-vfs-java-2.0.1.GA.orig/.project0000644000175000017500000000047211104655151017670 0ustar twernertwerner jboss-vfs A VFS library org.eclipse.jdt.core.javabuilder org.eclipse.jdt.core.javanature libjboss-vfs-java-2.0.1.GA.orig/src/0000755000175000017500000000000011146622523017010 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/0000755000175000017500000000000011146622514017767 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/0000755000175000017500000000000011146622510020704 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/0000755000175000017500000000000011146622510021473 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/0000755000175000017500000000000011146622510022613 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/0000755000175000017500000000000011146622511023573 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/0000755000175000017500000000000011146622514025264 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/0000755000175000017500000000000011146622514026243 5ustar twernertwerner././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/AbstractVirtualFileHandlerTest.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/AbstractVirtualFileHandler0000644000175000017500000005025111030670154033374 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VirtualFileHandler; /** * AbstractVirtualFileHandlerTest. * * @author Adrian Brock * @version $Revision: 1.1 $ */ public abstract class AbstractVirtualFileHandlerTest extends AbstractVFSTest { public AbstractVirtualFileHandlerTest(String name) { super(name); } protected abstract VFSContext getVFSContext(String name) throws Exception; protected String getRootName(String name) throws Exception { return name; } protected abstract long getRealLastModified(String name, String path) throws Exception; protected abstract long getRealSize(String name, String path) throws Exception; public void testRootName() throws Exception { VFSContext context = getVFSContext("complex"); VirtualFileHandler root = context.getRoot(); String rootName = getRootName("complex"); assertEquals(rootName, root.getName()); } public void testChildName() throws Exception { VFSContext context = getVFSContext("complex"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler child = context.getChild(root, "child"); assertEquals("child", child.getName()); } public void testSubFolderName() throws Exception { VFSContext context = getVFSContext("complex"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler child = context.getChild(root, "subfolder"); assertEquals("subfolder", child.getName()); } public void testSubChildName() throws Exception { VFSContext context = getVFSContext("complex"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler child = context.getChild(root, "subfolder/subchild"); assertTrue(child.getName().endsWith("subchild")); } public void testRootPathName() throws Exception { VFSContext context = getVFSContext("complex"); VirtualFileHandler root = context.getRoot(); assertEquals("", root.getPathName()); } public void testChildPathName() throws Exception { VFSContext context = getVFSContext("complex"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler child = context.getChild(root, "child"); assertEquals("child", child.getPathName()); } public void testSubFolderPathName() throws Exception { VFSContext context = getVFSContext("complex"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler child = context.getChild(root, "subfolder"); assertEquals("subfolder", child.getPathName()); } public void testSubChildPathName() throws Exception { VFSContext context = getVFSContext("complex"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler child = context.getChild(root, "subfolder/subchild"); assertEquals("subfolder/subchild", child.getPathName()); } /** * Test that finding a child and listing its parent result in consistent * child handlers. * * @throws Exception */ public void testSubSubChildPathName() throws Exception { VFSContext context = getVFSContext("complex"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler child = context.getChild(root, "subfolder/subsubfolder/subsubchild"); assertEquals("subfolder/subsubfolder/subsubchild", child.getPathName()); VirtualFileHandler parent = context.getChild(root, "subfolder/subsubfolder"); List children = parent.getChildren(false); // Filter out an .svn stuff since this is run from the source tree Iterator iter = children.iterator(); while( iter.hasNext() ) { child = iter.next(); if( child.getName().endsWith(".svn") ) iter.remove(); } assertEquals("subfolder/subsubfolder has one child", 1, children.size()); child = children.get(0); assertEquals("subfolder/subsubfolder/subsubchild", child.getPathName()); } /* TODO URI testing public void testToURI() throws Exception { } */ /* TODO URL testing public void testToURL() throws Exception { } */ public void testRootLastModified() throws Exception { VFSContext context = getVFSContext("simple"); VirtualFileHandler root = context.getRoot(); long realLastModified = getRealLastModified("simple", null); // strip any milliseconds realLastModified = realLastModified / 1000 * 1000; long fileLastModified = root.getLastModified(); fileLastModified = fileLastModified / 1000 * 1000; assertEquals(realLastModified, fileLastModified); } public void testChildLastModified() throws Exception { VFSContext context = getVFSContext("simple"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler child = context.getChild(root, "child"); long realLastModified = getRealLastModified("simple", "child"); assertEquals(realLastModified, child.getLastModified()); } public void testGetLastModifiedClosed() throws Exception { VFSContext context = getVFSContext("simple"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler child = context.getChild(root, "child"); child.close(); try { child.getLastModified(); fail("Should not be here!"); } catch (Throwable t) { checkThrowable(IllegalStateException.class, t); } } public void testRootSize() throws Exception { VFSContext context = getVFSContext("simple"); VirtualFileHandler root = context.getRoot(); long realSize = getRealSize("simple", null); assertEquals(realSize, root.getSize()); } public void testChildSize() throws Exception { VFSContext context = getVFSContext("simple"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler child = context.getChild(root, "child"); long realSize = getRealSize("simple", "child"); assertEquals(realSize, child.getSize()); } public void testGetSizeClosed() throws Exception { VFSContext context = getVFSContext("simple"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler child = context.getChild(root, "child"); child.close(); try { child.getSize(); fail("Should not be here!"); } catch (Throwable t) { checkThrowable(IllegalStateException.class, t); } } public void testRootIsLeaf() throws Exception { VFSContext context = getVFSContext("complex"); VirtualFileHandler root = context.getRoot(); assertFalse(root.isLeaf()); } public void testChildIsLeaf() throws Exception { VFSContext context = getVFSContext("complex"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler child = context.getChild(root, "child"); assertTrue(child.isLeaf()); } public void testSubFolderIsLeaf() throws Exception { VFSContext context = getVFSContext("complex"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler child = context.getChild(root, "subfolder"); assertFalse(child.isLeaf()); } public void testSubChildIsLeaf() throws Exception { VFSContext context = getVFSContext("complex"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler child = context.getChild(root, "subfolder/subchild"); assertTrue(child.isLeaf()); } public void testIsLeafClosed() throws Exception { VFSContext context = getVFSContext("simple"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler child = context.getChild(root, "child"); child.close(); try { child.isLeaf(); fail("Should not be here!"); } catch (Throwable t) { checkThrowable(IllegalStateException.class, t); } } // TODO how to test a real hidden file across platforms? public void testRootIsHidden() throws Exception { VFSContext context = getVFSContext("simple"); VirtualFileHandler root = context.getRoot(); assertFalse(root.isHidden()); } // TODO how to test a real hidden file across platforms? public void testChildIsHidden() throws Exception { VFSContext context = getVFSContext("simple"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler child = context.getChild(root, "child"); assertFalse(child.isHidden()); } public void testIsHiddenClosed() throws Exception { VFSContext context = getVFSContext("simple"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler child = context.getChild(root, "child"); child.close(); try { child.isHidden(); fail("Should not be here!"); } catch (Throwable t) { checkThrowable(IllegalStateException.class, t); } } public void testOpenStream() throws Exception { VFSContext context = getVFSContext("simple"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler child = context.getChild(root, "child"); InputStream stream = child.openStream(); try { byte[] contents = new byte[10]; int read = stream.read(contents); int total = 0; while (read != -1) { total += read; read = stream.read(contents, total, 10-total); } assertEquals(5, total); assertTrue(Arrays.equals("empty\0\0\0\0\0".getBytes(), contents)); } finally { stream.close(); } } public void testOpenStreamClosed() throws Exception { VFSContext context = getVFSContext("simple"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler child = context.getChild(root, "child"); child.close(); try { child.openStream(); fail("Should not be here!"); } catch (Throwable t) { checkThrowable(IllegalStateException.class, t); } } public void testRootParent() throws Exception { VFSContext context = getVFSContext("simple"); VirtualFileHandler root = context.getRoot(); assertNull(root.getParent()); } public void testChildParent() throws Exception { VFSContext context = getVFSContext("simple"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler child = context.getChild(root, "child"); assertEquals(root, child.getParent()); } public void testgetParentClosed() throws Exception { VFSContext context = getVFSContext("simple"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler child = context.getChild(root, "child"); child.close(); try { child.getParent(); fail("Should not be here!"); } catch (Throwable t) { checkThrowable(IllegalStateException.class, t); } } public void testGetChildren() throws Exception { VFSContext context = getVFSContext("children"); VirtualFileHandler root = context.getRoot(); List children = root.getChildren(false); Set expected = new HashSet(); expected.add("child1"); expected.add("child2"); expected.add("child3"); Set actual = new HashSet(); for (VirtualFileHandler child : children) { if (child.getName().startsWith("META-INF") == false && child.getName().equals(".svn") == false) actual.add(child.getName()); } assertEquals(expected, actual); } public void testGetChildrenClosed() throws Exception { VFSContext context = getVFSContext("simple"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler child = context.getChild(root, "child"); child.close(); try { child.getChildren(false); fail("Should not be here!"); } catch (Throwable t) { checkThrowable(IllegalStateException.class, t); } } public void testFindChildRoot() throws Exception { VFSContext context = getVFSContext("complex"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler found = root.getChild(""); assertEquals(root, found); } public void testFindChild() throws Exception { VFSContext context = getVFSContext("complex"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler found = root.getChild("child"); assertEquals("child", found.getPathName()); } public void testFindChildSubFolder() throws Exception { VFSContext context = getVFSContext("complex"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler found = root.getChild("subfolder"); assertEquals("subfolder", found.getPathName()); } public void testFindChildSubChild() throws Exception { VFSContext context = getVFSContext("complex"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler found = root.getChild("subfolder/subchild"); assertEquals("subfolder/subchild", found.getPathName()); } public void testFindChildDoesNotExist() throws Exception { VFSContext context = getVFSContext("complex"); VirtualFileHandler root = context.getRoot(); try { VirtualFileHandler child = root.getChild("doesnotexist"); assertNull(child); } catch (Throwable t) { checkThrowableTemp(IOException.class, t); } } public void testFindChildNullPath() throws Exception { VFSContext context = getVFSContext("complex"); VirtualFileHandler root = context.getRoot(); try { root.getChild(null); fail("Should not be here!"); } catch (Throwable t) { checkThrowable(IllegalArgumentException.class, t); } } public void testFindChildClosed() throws Exception { VFSContext context = getVFSContext("simple"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler child = context.getChild(root, "child"); child.close(); try { child.getChild(""); fail("Should not be here!"); } catch (Throwable t) { checkThrowable(IllegalStateException.class, t); } } public void testGetVFSContext() throws Exception { VFSContext context = getVFSContext("simple"); VirtualFileHandler handler = context.getRoot(); assertEquals(context, handler.getVFSContext()); } public void testGetVFSContextClosed() throws Exception { VFSContext context = getVFSContext("simple"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler child = context.getChild(root, "child"); child.close(); try { child.getVFSContext(); fail("Should not be here!"); } catch (Throwable t) { checkThrowable(IllegalStateException.class, t); } } public void testRootGetVirtualFile() throws Exception { VFSContext context = getVFSContext("complex"); VirtualFileHandler root = context.getRoot(); checkVirtualFile(root); } public void testChildGetVirtualFile() throws Exception { VFSContext context = getVFSContext("complex"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler child = context.getChild(root, "child"); checkVirtualFile(child); } public void testSubFolderGetVirtualFile() throws Exception { VFSContext context = getVFSContext("complex"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler child = context.getChild(root, "subfolder"); checkVirtualFile(child); } public void testSubChildGetVirtualFile() throws Exception { VFSContext context = getVFSContext("complex"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler child = context.getChild(root, "subfolder/subchild"); checkVirtualFile(child); } public void testGetVirtualFileClosed() throws Exception { VFSContext context = getVFSContext("simple"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler child = context.getChild(root, "child"); child.close(); try { child.getVirtualFile(); fail("Should not be here!"); } catch (Throwable t) { checkThrowable(IllegalStateException.class, t); } } public void testIsNested() throws Exception { VFSContext context = getVFSContext("complex"); VirtualFileHandler root = context.getRoot(); assertFalse(root.isNested()); VirtualFileHandler subfolder = context.getChild(root, "subfolder"); assertIsNested(subfolder); VirtualFileHandler subchild = subfolder.getChild("subchild"); assertIsNested(subchild); VirtualFileHandler subsubfolder = subfolder.getChild("subsubfolder"); assertIsNested(subsubfolder); VirtualFileHandler subsubchild = subsubfolder.getChild("subsubchild"); assertIsNested(subsubchild); } protected abstract void assertIsNested(VirtualFileHandler handler) throws Exception; public void testHasBeenModified() throws Exception { VFSContext context = getVFSContext("simple"); VirtualFileHandler root = context.getRoot(); assertFalse(root.hasBeenModified()); VirtualFileHandler child = root.getChild("tomodify"); if (child != null) { assertFalse(child.hasBeenModified()); modifyChild(child, "simple", "tomodify"); try { checkHasBeenModified(child); } finally { unmodifyChild(child, "simple", "tomodify"); } } } protected abstract void modifyChild(VirtualFileHandler child, String name, String path) throws Exception; protected abstract void checkHasBeenModified(VirtualFileHandler handler) throws Exception; protected abstract void unmodifyChild(VirtualFileHandler child, String name, String path) throws Exception; protected void checkVirtualFile(VirtualFileHandler handler) throws Exception { VirtualFile file = handler.getVirtualFile(); assertEquals(handler.getVFSContext().getVFS(), file.getVFS()); assertEquals(handler.getName(), file.getName()); assertEquals(handler.getPathName(), file.getPathName()); assertEquals(handler.isHidden(), file.isHidden()); assertEquals(handler.isLeaf(), file.isLeaf()); assertEquals(handler.getLastModified(), file.getLastModified()); assertEquals(handler.getSize(), file.getSize()); // can't do this anymore as VirtualFile.toURL() returns a vfs based url //assertEquals(handler.toURI(), file.toURI()); //assertEquals(handler.toURL(), file.toURL()); VirtualFileHandler parent = handler.getParent(); if (parent == null) assertNull(file.getParent()); else assertEquals(parent.getVirtualFile(), file.getParent()); } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/FileVFSContextUnitTestCase.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/FileVFSContextUnitTestCase0000644000175000017500000000441611112474030033261 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.net.URL; import junit.framework.Test; import junit.framework.TestSuite; import org.jboss.virtual.plugins.context.file.FileSystemContext; import org.jboss.virtual.spi.VFSContext; /** * FileVFSContextUnitTestCase. * * @author Adrian Brock * @version $Revision: 1.1 $ */ public class FileVFSContextUnitTestCase extends AbstractVFSContextTest { public FileVFSContextUnitTestCase(String name) { super(name); } public static Test suite() { return new TestSuite(FileVFSContextUnitTestCase.class); } protected VFSContext getVFSContext(String name) throws Exception { URL url = getResource("/vfs/context/file/" + name + "/"); return new FileSystemContext(url); } protected VFSContext getParentVFSContext() throws Exception { URL url = getResource("/vfs/context/file/"); return new FileSystemContext(url); } protected String getSuffix() { return ""; } protected String getRealProtocol() { return "file"; } protected String getRealURLEnd() { return "/"; } protected String transformExpectedEnd(String expecetedEnd) { return null; } protected boolean isRealURLSupported() { return true; } } libjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/TempTestCase.java0000644000175000017500000000351011022735656031453 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import junit.framework.Test; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.VFSUtils; /** * Unpack tests. * * @author Ales Justin */ public class TempTestCase extends DetachedCopyTest { public TempTestCase(String s) { super(s); } public static Test suite() { return suite(TempTestCase.class); } protected VirtualFile modify(VirtualFile file) throws Exception { return VFSUtils.temp(file); } protected boolean isExploded() throws Exception { return false; } protected boolean isSame(VirtualFile original) throws Exception { // should almost never be same // except if file was already nested jar copy return false; } }libjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/CopyTest.java0000644000175000017500000001665211137562372030677 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URI; import java.net.URL; import org.jboss.virtual.VFS; import org.jboss.virtual.VirtualFile; /** * Copy tests. * * @author Ales Justin */ public abstract class CopyTest extends AbstractVFSTest { protected CopyTest(String s) { super(s); } protected abstract VirtualFile modify(VirtualFile file) throws Exception; protected void assertNoReplacement(VFS vfs, String name, boolean unpacked) throws Throwable { VirtualFile original = vfs.findChild(name); VirtualFile replacement = modify(original); assertNoReplacement(original, replacement, unpacked); } protected abstract void assertNoReplacement(VirtualFile original, VirtualFile replacement, boolean unpacked) throws Exception; public void testNoReplacement() throws Throwable { URL rootURL = getResource("/vfs/test"); VFS vfs = VFS.getVFS(rootURL); assertNoReplacement(vfs, "unpacked-outer.jar", true); assertNoReplacement(vfs, "jar1-filesonly.jar", false); assertNoReplacement(vfs, "jar1-filesonly.mf", false); assertNoReplacement(vfs, "unpacked-with-metadata.jar/META-INF", true); } public void testCopyOuter() throws Throwable { URL rootURL = getResource("/vfs/test"); VFS vfs = VFS.getVFS(rootURL); VirtualFile original; VirtualFile replacement; original = vfs.findChild("outer.jar"); replacement = modify(original); assertTopLevelParent(original.getParent(), replacement.getParent()); VirtualFile child = replacement.findChild("jar1.jar"); assertNotNull(child); assertNotNull(child.findChild("META-INF/MANIFEST.MF")); assertNotNull(replacement.findChild("jar2.jar")); } protected void assertTopLevelParent(VirtualFile originalParent, VirtualFile replacementParent) throws Exception { assertEquals(originalParent, replacementParent); } public void testUnpackTopLevel() throws Throwable { URL rootURL = getResource("/vfs/test"); VFS vfs = VFS.getVFS(rootURL); VirtualFile original; VirtualFile replacement; original = vfs.findChild("level1.zip"); replacement = modify(original); assertTopLevel(original, replacement); VirtualFile textOne = replacement.findChild("test1.txt"); testText(textOne); VirtualFile two = replacement.findChild("level2.zip"); VirtualFile textTwo = two.findChild("test2.txt"); testText(textTwo); VirtualFile three = two.findChild("level3.zip"); VirtualFile textThree = three.findChild("test3.txt"); testText(textThree); } protected abstract void assertTopLevel(VirtualFile original, VirtualFile replacement) throws Exception; protected abstract void assertNestedLevel(VirtualFile original, VirtualFile replacement) throws Exception; public void testUnpack2ndLevel() throws Throwable { URL rootURL = getResource("/vfs/test"); VFS vfs = VFS.getVFS(rootURL); VirtualFile original; VirtualFile replacement; original = vfs.findChild("level1.zip/level2.zip"); replacement = modify(original); assertNestedLevel(original, replacement); VirtualFile parent = original.getParent(); VirtualFile child = parent.findChild("level2.zip"); //assertEquals(replacement, child); assertOnURI(child, replacement); VirtualFile textTwo = replacement.findChild("test2.txt"); testText(textTwo); VirtualFile three = replacement.findChild("level3.zip"); VirtualFile textThree = three.findChild("test3.txt"); testText(textThree); } public void testUnpackDeepLevel() throws Throwable { URL rootURL = getResource("/vfs/test"); VFS vfs = VFS.getVFS(rootURL); VirtualFile original; VirtualFile replacement; original = vfs.findChild("level1.zip/level2.zip/level3.zip"); replacement = modify(original); assertNestedLevel(original, replacement); VirtualFile parent = original.getParent(); VirtualFile child = parent.findChild("level3.zip"); //assertEquals(replacement, child); assertOnURI(child, replacement); VirtualFile textThree = replacement.findChild("test3.txt"); testText(textThree); } protected void assertOnURI(VirtualFile original, VirtualFile replacement) throws Exception { URI originalUri = original.toURI(); URI replacementUri = replacement.toURI(); assertEquals(originalUri, replacementUri); } protected void assertUnpackedReplacement(VirtualFile original, VirtualFile replacement) throws Exception { assertReplacement(original, replacement); assertEquals(original.getParent(), replacement.getParent()); } protected void assertExplodedReplacement(VirtualFile original, VirtualFile replacement) throws Exception { assertReplacement(original, replacement); assertNotNull(replacement.getParent()); } protected void assertReplacement(VirtualFile original, VirtualFile replacement) throws Exception { assertReplacement(original, replacement, true); } protected void assertReplacement(VirtualFile original, VirtualFile replacement, boolean exploded) throws Exception { assertEquals(original.getName(), replacement.getName()); // when mounting via DelegatingHandler, getPathName changes because VFSContext changes //assertEquals(original.getPathName(), replacement.getPathName()); // Only check the non-directory file sizes if (exploded == false) assertEquals(original.getSize(), replacement.getSize()); assertEquals(original.exists(), replacement.exists()); assertEquals(original.isLeaf(), replacement.isLeaf()); assertEquals(original.isHidden(), replacement.isHidden()); } protected void testText(VirtualFile file) throws Exception { InputStream in = file.openStream(); try { BufferedReader reader = new BufferedReader(new InputStreamReader(in)); String line; while ((line = reader.readLine()) != null) { assertEquals("Some test.", line); } } finally { in.close(); } } }././@LongLink0000000000000000000000000000016000000000000011562 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/CopyJARSerializationUnitTestCase.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/CopyJARSerializationUnitTe0000644000175000017500000000263011001155136033314 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, Red Hat Middleware LLC, and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import junit.framework.Test; /** * Tests of copy nested jars * * @author ales.justin@jboss.org */ public class CopyJARSerializationUnitTestCase extends JARSerializationUnitTestCase { public CopyJARSerializationUnitTestCase(String name) { super(name, true); } public static Test suite() { return suite(CopyJARSerializationUnitTestCase.class); } }libjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/VFSResourceTestCase.java0000644000175000017500000000355411055206463032717 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.net.URL; import junit.framework.Test; import org.jboss.virtual.VFS; import org.jboss.virtual.VirtualFile; /** * Test Spring VFSResource from JBoss5. * * @author Ales Justin */ public class VFSResourceTestCase extends AbstractVFSTest { public VFSResourceTestCase(String s) { super(s); } public static Test suite() { return suite(VFSResourceTestCase.class); } public void testDirectoryFind() throws Throwable { URL url = getResource("/vfs/test/outer.jar"); String urlString = url.toExternalForm(); int p = urlString.indexOf(":"); URL rootURL = new URL("vfszip" + urlString.substring(p) + "/org/jboss/test/vfs"); VirtualFile root = VFS.getRoot(rootURL); assertNotNull(root); } }libjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/WeakRefCacheTestCase.java0000644000175000017500000000303511104021156033000 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import org.jboss.virtual.plugins.cache.WeakRefVFSCache; import org.jboss.virtual.spi.cache.VFSCache; import junit.framework.Test; /** * SoftRef VFSCache Test. * * @author Ales Justin */ public class WeakRefCacheTestCase extends MapVFSCacheTest { public WeakRefCacheTestCase(String name) { super(name); } public static Test suite() { return suite(WeakRefCacheTestCase.class); } protected VFSCache createCache() { return new WeakRefVFSCache(); } }libjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/JARCacheUnitTestCase.java0000644000175000017500000001061111031777100032734 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2007, Red Hat Middleware LLC, and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.util.jar.Attributes; import java.util.jar.JarFile; import java.util.jar.JarOutputStream; import java.util.jar.Manifest; import junit.framework.Test; import org.jboss.virtual.VFS; import org.jboss.virtual.VirtualFile; /** * Test the caching strategy of VFS with jar files. * * @author Carlo de Wolf * @version $Revision: 75186 $ */ public class JARCacheUnitTestCase extends AbstractVFSTest { public JARCacheUnitTestCase(String name) { super(name, false, false); } protected JARCacheUnitTestCase(String name, boolean forceCopy) { super(name, forceCopy, false); } public static Test suite() { VFS.init(); return suite(JARCacheUnitTestCase.class); } public void testJarCache() throws Exception { // Create a test.jar with v1 in manifest File testFile = new File("test.jar"); { Manifest manifest = new Manifest(); manifest.getMainAttributes().putValue(Attributes.Name.MANIFEST_VERSION.toString(), "1"); manifest.getMainAttributes().putValue("test", "v1"); JarOutputStream out = new JarOutputStream(new BufferedOutputStream(new FileOutputStream(testFile)), manifest); out.flush(); out.close(); } // Verify it via VFS File root = new File("."); VirtualFile vf = VFS.getVirtualFile(root.toURL(), "test.jar"); { VirtualFile manifestFile = vf.findChild("META-INF/MANIFEST.MF"); Manifest manifest = new Manifest(manifestFile.openStream()); String actual = manifest.getMainAttributes().getValue("test"); assertEquals("v1", actual); } // If we don't delete, we get a corrupt zip entries iterator on linux assertTrue("test file deleted: " + testFile, vf.delete()); // Create a new test.jar with manifest v2 { Manifest manifest = new Manifest(); manifest.getMainAttributes().putValue(Attributes.Name.MANIFEST_VERSION.toString(), "1"); manifest.getMainAttributes().putValue("test", "v2"); JarOutputStream out = new JarOutputStream(new BufferedOutputStream(new FileOutputStream(testFile)), manifest); out.flush(); out.close(); } // Verify the manifest the JDK way { JarFile jarFile = new JarFile(testFile); String actual = jarFile.getManifest().getMainAttributes().getValue("test"); assertEquals("JDK found the wrong manifest", "v2", actual); jarFile.close(); } // Verify the manifest the VFS way { VirtualFile manifestFile = vf.findChild("META-INF/MANIFEST.MF"); Manifest manifest = new Manifest(manifestFile.openStream()); String actual = manifest.getMainAttributes().getValue("test"); assertEquals("VFS found the wrong manifest", "v2", actual); } // Verify again - through new context { vf = VFS.getVirtualFile(root.toURL(), "test.jar"); VirtualFile manifestFile = vf.findChild("META-INF/MANIFEST.MF"); Manifest manifest = new Manifest(manifestFile.openStream()); String actual = manifest.getMainAttributes().getValue("test"); assertEquals("VFS found the wrong manifest", "v2", actual); } } } libjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/CustomTestCase.java0000644000175000017500000000560211031526445032016 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, Red Hat Middleware LLC, and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.io.InputStream; import java.net.URL; import java.util.List; import junit.framework.Test; import org.jboss.test.virtual.support.PatternVirtualFileVisitor; import org.jboss.virtual.VFS; import org.jboss.virtual.VirtualFile; /** * Custom tests - ported from issues found. * * @author Ales.Justin@jboss.org */ public class CustomTestCase extends AbstractVFSTest { public CustomTestCase(String name) { super(name); } protected CustomTestCase(String name, boolean forceCopy) { super(name, forceCopy); } public static Test suite() { return suite(CustomTestCase.class); } public void testNestedDirLookup() throws Exception { URL url = getResource("/vfs/test/spring-ear.ear"); String urlString = url.toExternalForm(); int p = urlString.indexOf(":/"); url = new URL("vfszip" + urlString.substring(p) + "/lib/spring-beans.jar/org/jboss/test/spring"); VirtualFile file = VFS.getRoot(url); assertNotNull(file); PatternVirtualFileVisitor visitor = new PatternVirtualFileVisitor(); file.visit(visitor); List resources = visitor.getResources(); assertNotNull(resources); assertTrue("Resources empty", resources.size() > 0); for (String path : resources) { VirtualFile clazz = file.getChild(path); assertNotNull(clazz); assertTrue(isClass(clazz)); } } protected boolean isClass(VirtualFile file) throws Exception { InputStream is = file.openStream(); try { int read = is.read(); String cafebabe = ""; while(read >= 0 && cafebabe.length() < 8) { cafebabe += Integer.toHexString(read); read = is.read(); } return "CAFEBABE".equalsIgnoreCase(cafebabe); } finally { is.close(); } } }libjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/PathTokensTestCase.java0000644000175000017500000001102111137562372032622 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.io.IOException; import java.net.URL; import java.util.List; import java.util.Arrays; import junit.framework.Test; import org.jboss.virtual.VFS; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.plugins.vfs.helpers.PathTokenizer; /** * Test path tokens. * * @author Ales Justin */ public class PathTokensTestCase extends AbstractVFSTest { public PathTokensTestCase(String s) { super(s); } public static Test suite() { return suite(PathTokensTestCase.class); } protected VirtualFile testPath(String path) throws IOException { return testPath("/vfs", path); } protected VirtualFile testPath(String context, String path) throws IOException { URL url = getResource(context); VirtualFile vf = VFS.getRoot(url); return vf.getChild(path); } protected void testValidPath(String path) throws Throwable { assertNotNull("No such path: " + path, testPath(path)); } protected void testBrokenPath(String path) throws Throwable { try { testPath(path); fail("Should not be here"); } catch (Throwable t) { assertInstanceOf(t, IllegalArgumentException.class, false); } } public void testSpecialTokens() throws Throwable { PathTokenizer.setErrorOnSuspiciousTokens(true); try { testBrokenPath("/.../"); testBrokenPath(".../"); testBrokenPath("/..."); testBrokenPath("..."); testBrokenPath("/..somemorepath/"); testBrokenPath("..somemorepath/"); testBrokenPath("/..somemorepath"); testBrokenPath("..somemorepath"); } finally { PathTokenizer.setErrorOnSuspiciousTokens(false); } } public void testRepeatedSlashes() throws Throwable { testValidPath("/"); testValidPath("//"); testValidPath("///"); testValidPath("////"); testValidPath("//context"); testValidPath("//context//"); testValidPath("context//file"); testValidPath("context///file"); testValidPath("//context//file"); testValidPath("//context///file"); testValidPath("//context////file"); testValidPath("//context///jar//"); testValidPath("//context///jar///"); } public void testSuspiciousTokens() throws Throwable { testSuspiciousTokens("/.hudson/..hudson/...hudson/./../.../.*foo/foo.bar", ".hudson", "..hudson", "...hudson", ".", "..", "...", ".*foo", "foo.bar"); testSuspiciousTokens("jpa/.svn", "jpa", ".svn"); } protected void testSuspiciousTokens(String path, String... expected) throws Throwable { testSuspiciousTokens(true, path, expected); testSuspiciousTokens(false, path, expected); } protected void testSuspiciousTokens(boolean flag, String path, String... expected) throws Throwable { PathTokenizer.setErrorOnSuspiciousTokens(flag); try { List tokens = PathTokenizer.getTokens(path); if (flag) fail("Should not be here."); List expectedTokens = Arrays.asList(expected); assertEquals(expectedTokens, tokens); } catch (Throwable t) { if (!flag) throw t; } finally { PathTokenizer.setErrorOnSuspiciousTokens(!flag); } } }libjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/PathQueryTestCase.java0000644000175000017500000000424611001375747032475 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.net.URI; import java.net.URL; import junit.framework.Test; import org.jboss.virtual.VFS; import org.jboss.virtual.VFSUtils; import org.jboss.virtual.VirtualFile; /** * Test the query in url/uri. * * @author Ales Justin */ public class PathQueryTestCase extends AbstractVFSTest { public PathQueryTestCase(String s) { super(s); } public static Test suite() { return suite(PathQueryTestCase.class); } protected void assertOption(String name) throws Throwable { URL url = getResource("/vfs/context/" + name); URI uri = new URI(url.toExternalForm() + "?foobar=qwert&useCopyJarHandler=true"); VirtualFile vf = VFS.getRoot(uri); assertOption(vf, "foobar", "qwert"); assertOption(vf, "useCopyJarHandler", "true"); } protected void assertOption(VirtualFile vf, String key, String value) { assertEquals(value, VFSUtils.getOption(vf, key)); } public void testURL() throws Throwable { assertOption("jar/simple.jar"); assertOption("file/simple/child"); } } ././@LongLink0000000000000000000000000000016200000000000011564 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/FileVirtualFileHandlerUnitTestCase.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/FileVirtualFileHandlerUnit0000644000175000017500000000666111030667143033362 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.net.URL; import java.util.UUID; import junit.framework.Test; import junit.framework.TestSuite; import org.jboss.virtual.plugins.context.file.FileSystemContext; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VirtualFileHandler; /** * FileVirtualFileHandlerUnitTestCase. * * @author Adrian Brock * @version $Revision: 1.1 $ */ public class FileVirtualFileHandlerUnitTestCase extends AbstractVirtualFileHandlerTest { public FileVirtualFileHandlerUnitTestCase(String name) { super(name); } public static Test suite() { return new TestSuite(FileVirtualFileHandlerUnitTestCase.class); } protected URL getRootResource(String name) throws Exception { return getResource("/vfs/context/file/" + name + "/"); } protected File getRealFile(String name, String path) throws Exception { URL url = getRootResource(name); if (path != null) url = new URL(url, path); return new File(url.getPath()); } protected VFSContext getVFSContext(String name) throws Exception { URL url = getRootResource(name); return new FileSystemContext(url); } protected long getRealLastModified(String name, String path) throws Exception { File file = getRealFile(name, path); return file.lastModified(); } protected long getRealSize(String name, String path) throws Exception { File file = getRealFile(name, path); return file.length(); } protected void assertIsNested(VirtualFileHandler handler) throws Exception { assertNotNull(handler); assertFalse(handler.isNested()); } protected void modifyChild(VirtualFileHandler child, String name, String path) throws Exception { FileOutputStream out = new FileOutputStream(getRealFile(name, path)); try { out.write((UUID.randomUUID() + "\n").getBytes()); } finally { try { out.close(); } catch (IOException ignored) { } } } protected void checkHasBeenModified(VirtualFileHandler handler) throws Exception { assertTrue(handler.hasBeenModified()); } protected void unmodifyChild(VirtualFileHandler child, String name, String path) throws Exception { // no need to unmodify } } libjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/JAREntryTestCase.java0000644000175000017500000000705411031777100032201 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, Red Hat Middleware LLC, and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.io.File; import java.io.FileOutputStream; import java.util.List; import java.util.jar.JarOutputStream; import java.util.jar.Manifest; import java.util.zip.ZipEntry; import junit.framework.Test; import org.jboss.virtual.VFS; import org.jboss.virtual.VirtualFile; /** * jar entry tests. * * @author Ales.Justin@jboss.org */ public class JAREntryTestCase extends AbstractVFSTest { public JAREntryTestCase(String name) { super(name, false, false); } protected JAREntryTestCase(String name, boolean forceCopy) { super(name, forceCopy, false); } public static Test suite() { return suite(JAREntryTestCase.class); } public void testEntryModified() throws Exception { File tmp = File.createTempFile("testJarEntry", ".jar"); Manifest mf = new Manifest(); mf.getMainAttributes().putValue("Created-By", getClass().getName() + "." + "testEntryModified"); FileOutputStream fos = new FileOutputStream(tmp); JarOutputStream jos = new JarOutputStream(fos, mf); try { jos.setComment("testJarURLs"); jos.setLevel(0); jos.flush(); } finally { jos.close(); } VFS vfs = VFS.getVFS(tmp.toURI()); VirtualFile root = vfs.getRoot(); VirtualFile metainf = root.findChild("META-INF"); List children = metainf.getChildren(); assertEquals(1, children.size()); // delete zipFile before recreating it otherwise you get a corrupt entries iterator on linux assertTrue(root.delete()); fos = new FileOutputStream(tmp); jos = new JarOutputStream(fos, mf); try { ZipEntry entry = new ZipEntry("META-INF/some.txt"); entry.setComment("some_comment"); entry.setExtra("qwerty".getBytes()); entry.setSize(1); jos.putNextEntry(entry); jos.closeEntry(); entry = new ZipEntry("META-INF/other.txt"); entry.setComment("other_comment"); entry.setExtra("foobar".getBytes()); entry.setSize(1); jos.putNextEntry(entry); jos.closeEntry(); } finally { jos.close(); } // TODO - JBVFS-7 ... should work w/o creating new vfs vfs = VFS.getVFS(tmp.toURI()); metainf = vfs.findChild("META-INF"); System.out.println("root = " + root.hasBeenModified()); System.out.println("metainf = " + metainf.hasBeenModified()); children = metainf.getChildren(); assertEquals(3, children.size()); } }././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/JARVFSContextUnitTestCase.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/JARVFSContextUnitTestCase.0000644000175000017500000002670611112474030033102 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.Arrays; import java.util.HashSet; import java.util.Set; import java.util.jar.JarEntry; import java.util.jar.JarInputStream; import junit.framework.Test; import junit.framework.TestSuite; import org.jboss.virtual.VFS; import org.jboss.virtual.VFSUtils; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.plugins.context.file.FileSystemContext; import org.jboss.virtual.plugins.context.jar.JarContext; import org.jboss.virtual.plugins.context.jar.JarUtils; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VirtualFileHandler; /** * JARVFSContextUnitTestCase. * * @author Adrian Brock * @author Ales Justin * @version $Revision: 1.1 $ */ public class JARVFSContextUnitTestCase extends AbstractVFSContextTest { public JARVFSContextUnitTestCase(String name) { super(name); } public static Test suite() { VFS.init(); System.out.println("java.protocol.handler.pkgs: " + System.getProperty("java.protocol.handler.pkgs")); return new TestSuite(JARVFSContextUnitTestCase.class); } protected VFSContext getVFSContext(String name) throws Exception { URL url = getResource("/vfs/context/jar/" + name + ".jar"); url = JarUtils.createJarURL(url); return new JarContext(url); } protected VFSContext getParentVFSContext() throws Exception { URL url = getResource("/vfs/context/jar/"); return new FileSystemContext(url); } /** * Create vfs context from url. * * @param url the url * @return new vfs context * @throws Exception for any error */ protected VFSContext createVSFContext(URL url) throws Exception { if (url.toExternalForm().startsWith("jar") == false) url = JarUtils.createJarURL(url); return new JarContext(url); } protected String getSuffix() { return ".jar"; } protected String getRealProtocol() { return "jar:file"; } protected String getRealURLEnd() { return "!/"; } protected String transformExpectedEnd(String expecetedEnd) { return expecetedEnd; } protected boolean isRealURLSupported() { return false; } /** * Was having problems with a jar entry as root of VFS. * * @throws Exception for any error */ public void testJarEntryAsRoot() throws Exception { URL url = getResource("/vfs/context/jar/simple.jar"); URL entry = new URL("jar:" + url.toString() + "!/child"); //entry.openStream().close(); VFSContext context = createVSFContext(entry); assertEquals("child", context.getRoot().getName()); url = getResource("/vfs/test/outer.jar"); entry = new URL("jar:" + url.toString() + "!/jar2.jar "); //entry.openStream().close(); context = createVSFContext(entry); assertEquals("jar2.jar", context.getRoot().getName()); } /** * Was having problems with a jar entry as root of VFS. * A JarEntry that is the root of the VFS should have a VFS Path of "" * * @throws Exception for any error */ public void testPathIsEmptryForJarEntryAsRoot() throws Exception { VFS.init(); URL url = getResource("/vfs/context/jar/simple.jar"); URL entry = new URL("jar:" + url.toString() + "!/child"); //entry.openStream().close(); VFSContext context = createVSFContext(entry); assertEquals("child", context.getRoot().getName()); assertEquals("", context.getRoot().getPathName()); url = getResource("/vfs/test/outer.jar"); entry = new URL("jar:" + url.toString() + "!/jar2.jar "); //entry.openStream().close(); context = createVSFContext(entry); assertEquals("jar2.jar", context.getRoot().getName()); assertEquals("", context.getRoot().getPathName()); } protected static void safeClose(InputStream is) { try { is.close(); } catch (Throwable ignore) { } } /** * Handler representing a directory must return a zero length stream * * This behavior has changed with vfszip - where directory entry within * zip archive when opened as stream returns a recomposed zip archive * that has requested entry as its root * * @throws Exception for any error */ public void testDirectoryZipEntryOpenStream() throws Exception { doDirectoryZipEntryOpenStream(true); } protected void doDirectoryZipEntryOpenStream(boolean expectEmpty) throws Exception { URL url = getResource("/vfs/context/jar/complex.jar"); VFSContext ctx = createVSFContext(url); VirtualFileHandler sub = ctx.getRoot().getChild("subfolder"); InputStream is = sub.openStream(); try { // JBVFS-57 JarInputStream composition - recomposes directory as a // jar equivalent to jar:complex.jar!/subfolder // NOT IMPLEMENTED for vfsjar - vfsjar is deprecated if (expectEmpty) assertTrue("input stream should be closed", is.read() == -1); else assertTrue("input stream should not be empty", is.read() != -1); } finally { safeClose(is); } } /** * There was a problem with noCopy inner jars returning empty streams * * @throws Exception for any error */ public void testInnerJarFileEntryOpenStream() throws Exception { URL url = getResource("/vfs/context/jar/nested.jar"); VFSContext ctx = createVSFContext(url); VirtualFileHandler nested = ctx.getRoot().getChild("complex.jar"); VirtualFileHandler target = nested.getChild("META-INF/MANIFEST.MF"); InputStream is = target.openStream(); try { assertFalse("input stream closed", is.read() == -1); } finally { safeClose(is); } } public void testInnerJarOverURL() throws Exception { URL url = getResource("/vfs/test/nested/" + getNestedName() + ".jar"); String urlString = url.toExternalForm(); testInnerEntryOverURL(urlString, "/complex.jar", false); // test children testInnerEntryOverURL(urlString, "/complex.jar/child", false); testInnerEntryOverURL(urlString, "/complex.jar/subfolder/subchild", false); // test folder testInnerEntryOverURL(urlString, "/complex.jar/subfolder", false); testInnerEntryOverURL(urlString, "/complex.jar/subfolder/subsubfolder", false); // 3 level zips url = getResource("/vfs/test/level1.zip"); urlString = url.toExternalForm(); testInnerEntryOverURL(urlString, "/level2.zip/level3.zip/test3.txt", false); } protected void testInnerEntryOverURL(String urlString, String entry, boolean result) throws IOException { URL vfsURL = new URL(getProtocol() + urlString.substring(4) + entry); InputStream is = vfsURL.openStream(); try { assertEquals("cannot read input stream", result, is.read() == -1); } finally { safeClose(is); } } @SuppressWarnings("deprecation") public void testEqualsOnEmptyPath() throws Exception { URL rootURL = getResource("/vfs/test/interop_W2JREMarshallTest_appclient_vehicle.ear"); VFS vfs = VFS.getVFS(rootURL); VirtualFile file = vfs.findChild("interop_W2JREMarshallTest_appclient_vehicle_client.jar"); VirtualFile same = file.findChild(""); assertEquals(file, same); } /** All of the following entries should be seen [551][valkyrie: web_pkg_scope]$ jar -tvf war/target/web_pkg_scope_web.war 0 Fri Sep 05 12:47:30 PDT 2008 META-INF/ 126 Fri Sep 05 12:47:28 PDT 2008 META-INF/MANIFEST.MF 0 Fri Sep 05 12:07:32 PDT 2008 WEB-INF/ 0 Fri Sep 05 12:07:32 PDT 2008 WEB-INF/classes/ 0 Fri Sep 05 12:07:32 PDT 2008 WEB-INF/classes/web_pkg_scope/ 0 Fri Sep 05 12:07:32 PDT 2008 WEB-INF/classes/web_pkg_scope/entity/ 0 Fri Sep 05 12:07:32 PDT 2008 WEB-INF/classes/web_pkg_scope/servlet/ 288 Fri Sep 05 12:07:30 PDT 2008 WEB-INF/classes/web_pkg_scope/entity/Account.class 299 Fri Sep 05 12:07:30 PDT 2008 WEB-INF/classes/web_pkg_scope/servlet/JpaServlet.class 1055 Fri Sep 05 12:25:02 PDT 2008 WEB-INF/web.xml 0 Fri Sep 05 12:47:30 PDT 2008 META-INF/maven/ 0 Fri Sep 05 12:47:30 PDT 2008 META-INF/maven/org.jboss.vfs/ 0 Fri Sep 05 12:47:30 PDT 2008 META-INF/maven/org.jboss.vfs/web_pkg_scope_web/ 735 Fri Sep 05 12:47:20 PDT 2008 META-INF/maven/org.jboss.vfs/web_pkg_scope_web/pom.xml 122 Fri Sep 05 12:47:28 PDT 2008 META-INF/maven/org.jboss.vfs/web_pkg_scope_web/pom.properties * @throws Exception */ public void testWarClassesJarInputStream() throws Exception { URL rootURL = getResource("/vfs/test/web_pkg_scope.ear"); VFS vfs = VFS.getVFS(rootURL); VirtualFile file = vfs.getChild("web_pkg_scope_web.war/WEB-INF/classes/META-INF/persistence.xml"); assertNotNull(file); VirtualFile classes = file.getParent().getParent(); // Access the classes contents as a jar file String[] entryNames = { "web_pkg_scope/", "web_pkg_scope/entity/", "web_pkg_scope/servlet/", "web_pkg_scope/entity/Account.class", "web_pkg_scope/servlet/JpaServlet.class", // JarInputStream never returns META-INF/ entry - it just skips it // "META-INF/", "META-INF/persistence.xml" }; URL [] classesURLs = new URL [] { classes.toURL(), new URL(classes.toURL() + "?" + VFSUtils.USE_COPY_QUERY + "=true") }; for (URL url: classesURLs) { JarInputStream jis = new JarInputStream( url.openStream() ); HashSet missingEntries = new HashSet(Arrays.asList(entryNames)); Set excess = new HashSet(); JarEntry jarEntry; while((jarEntry = jis.getNextJarEntry()) != null) { String name = jarEntry.getName(); boolean removed = missingEntries.remove(name); if(!removed) excess.add(name); } assertEquals("No missing entries: "+missingEntries, 0, missingEntries.size()); assertEquals("Excess entries: " + excess, 0, excess.size()); } classes.closeStreams(); } // we need to make sure this doesn't get touched before protected String getNestedName() { return "nested"; } protected String getProtocol() { return "vfsfile"; } } ././@LongLink0000000000000000000000000000014500000000000011565 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/SundryVFSUnitTestCase.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/SundryVFSUnitTestCase.java0000644000175000017500000000546111001155136033242 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.net.URL; import junit.framework.Test; import junit.framework.TestSuite; import org.jboss.virtual.VFS; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.plugins.context.jar.JarUtils; /** * SundryVFSTests. * * @author Adrian Brock * @version $Revision: 1.1 $ */ public class SundryVFSUnitTestCase extends AbstractVFSTest { public SundryVFSUnitTestCase(String name) { super(name); } public static Test suite() { return new TestSuite(SundryVFSUnitTestCase.class); } protected VirtualFile getVirtualFile(String root, String path) throws Exception { URL url = getResource(root); assertNotNull(url); return VFS.getVirtualFile(url, path); } public void testBrokenContext() throws Exception { VirtualFile file = getVirtualFile("/vfs/sundry", "jar/archive.jar"); log.debug(file.getName() + " " + file); assertFalse("Should not be a leaf", file.isLeaf()); file = file.findChild("empty"); log.debug(file.getName() + " " + file); } public void testArchive() throws Exception { VirtualFile file = getVirtualFile("/vfs/sundry/", "jar/archive.jar"); log.debug(file.getName() + " " + file); assertFalse("Should not be a leaf", file.isLeaf()); file = file.findChild("empty"); log.debug(file.getName() + " " + file); } public void testArchive2() throws Exception { URL url = getResource("/vfs/sundry/jar/archive.jar"); url = JarUtils.createJarURL(url); VFS vfs = VFS.getVFS(url); VirtualFile file = vfs.getRoot(); log.debug(file.getName() + " " + file); assertFalse("Should not be a leaf", file.isLeaf()); file = file.findChild("empty"); log.debug(file.getName() + " " + file); } } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/AssembledContextTestCase.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/AssembledContextTestCase.j0000644000175000017500000002376011001375747033331 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.net.URL; import java.util.List; import java.util.regex.Pattern; import junit.framework.Test; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.AssembledDirectory; import org.jboss.virtual.plugins.context.vfs.AssembledContextFactory; /** * comment * * @author Bill Burke * @author Scott.Stark@jboss.org * @version $Revision: 1.1 $ */ public class AssembledContextTestCase extends AbstractVFSTest { public AssembledContextTestCase(String name) { super(name); } public static Test suite() { return suite(AssembledContextTestCase.class); } public void testRegex() { String[] files = {".java", "x.java", "FooBar.java"}; String expression = "*.java"; Pattern p = AssembledDirectory.getPattern(expression); System.out.println("pattern: " + p.pattern()); for (String file : files) { assertTrue(p.matcher(file).matches()); } System.out.println("no matches"); p = AssembledDirectory.getPattern("?.java"); assertTrue(p.matcher("x.java").matches()); assertFalse(p.matcher("xyz.java").matches()); assertFalse(p.matcher(".java").matches()); p = AssembledDirectory.getPattern("x?z*.java"); assertTrue(p.matcher("xyz.java").matches()); assertTrue(p.matcher("xyzasdfasdf.java").matches()); assertFalse(p.matcher("xyzadasdfasdf").matches()); assertFalse(p.matcher("xzadasdfasdf").matches()); System.out.println("done it"); } public void testAntMatching() { String file; String exp; file = "xabc/foobar/test.java"; exp = "?abc/*/*.java"; assertTrue(AssembledDirectory.antMatch(file, exp)); file = "abc/foobar/test.java"; assertFalse(AssembledDirectory.antMatch(file, exp)); file = "xabc/x/test.xml"; assertFalse(AssembledDirectory.antMatch(file, exp)); file = "xabc/test.java"; assertFalse(AssembledDirectory.antMatch(file, exp)); exp = "org/jboss/Test.java"; file = "org/jboss/Test.java"; assertTrue(AssembledDirectory.antMatch(file, exp)); exp = "org/jboss/Test.java"; file = "org/wrong.java"; assertFalse(AssembledDirectory.antMatch(file, exp)); exp = "test/**"; file = "test/x.java"; assertTrue(AssembledDirectory.antMatch(file, exp)); file = "test/foo/bar/x.java"; assertTrue(AssembledDirectory.antMatch(file, exp)); file = "x.java"; assertFalse(AssembledDirectory.antMatch(file, exp)); exp = "**/CVS/*"; file = "CVS/Repository"; assertTrue(AssembledDirectory.antMatch(file, exp)); file = "org/apache/CVS/Entries"; assertTrue(AssembledDirectory.antMatch(file, exp)); file = "org/apache/jakarta/tools/ant/CVS/Entries"; assertTrue(AssembledDirectory.antMatch(file, exp)); file = "org/apache/CVS/foo/bar/Entries"; assertFalse(AssembledDirectory.antMatch(file, exp)); exp = "org/apache/jakarta/**"; file ="org/apache/jakarta/tools/ant/docs/index.html"; assertTrue(AssembledDirectory.antMatch(file, exp)); file ="org/apache/jakarta/test.xml"; assertTrue(AssembledDirectory.antMatch(file, exp)); file = "org/apache/xyz.java"; assertFalse(AssembledDirectory.antMatch(file, exp)); exp = "org/apache/**/CVS/*"; file ="org/apache/CVS/Entries"; assertTrue(AssembledDirectory.antMatch(file, exp)); file ="org/apache/jakarta/tools/ant/CVS/Entries"; assertTrue(AssembledDirectory.antMatch(file, exp)); file = "org/apache/CVS/foo/bar/Entries"; assertFalse(AssembledDirectory.antMatch(file, exp)); file = "org/apache/nada/foo/bar/Entries"; assertFalse(AssembledDirectory.antMatch(file, exp)); exp = "**/test/**"; file = "test/x.java"; assertTrue(AssembledDirectory.antMatch(file, exp)); file = "test/bar/x.java"; assertTrue(AssembledDirectory.antMatch(file, exp)); file = "test/bar/foo/x.java"; assertTrue(AssembledDirectory.antMatch(file, exp)); file = "foo/test/x.java"; assertTrue(AssembledDirectory.antMatch(file, exp)); file = "foo/bar/test/x.java"; assertTrue(AssembledDirectory.antMatch(file, exp)); file = "foo/test/bar/x.java"; assertTrue(AssembledDirectory.antMatch(file, exp)); file = "foo/bar/test/bar/foo/x.java"; assertTrue(AssembledDirectory.antMatch(file, exp)); file = "foo/bar/flah.java"; assertFalse(AssembledDirectory.antMatch(file, exp)); } public void testAddClass() throws Exception { AssembledDirectory directory = AssembledContextFactory.getInstance().create("foo.jar"); directory.addClass(VirtualFile.class); List children = directory.getChildren(); assertEquals(children.size(), 1); VirtualFile curr = children.get(0); System.out.println("test org/"); assertEquals("org", curr.getName()); System.out.println("test org/jboss"); children = curr.getChildren(); assertEquals(children.size(), 1); curr = children.get(0); assertEquals("jboss", curr.getName()); System.out.println("test org/jboss/virtual"); children = curr.getChildren(); assertEquals(children.size(), 1); curr = children.get(0); assertEquals("virtual", curr.getName()); children = curr.getChildren(); boolean found; found = false; for (VirtualFile child: children) { if (child.getName().equals("VirtualFile.class")) { found = true; assertEquals("org/jboss/virtual/VirtualFile.class", child.getPathName()); break; } } assertTrue("VirtualFile.class was found", found); } public void testAddResources() throws Exception { // Find test.classes.url location for vfs/links/war1.vfslink.properties URL classesURL = getClass().getProtectionDomain().getCodeSource().getLocation(); assertNotNull("classesURL", classesURL); System.setProperty("test.classes.url", classesURL.toString()); URL libURL = super.getResource("/vfs/sundry/jar"); assertNotNull("libURL", libURL); System.setProperty("test.lib.url", libURL.toString()); AssembledDirectory directory = AssembledContextFactory.getInstance().create("foo.jar"); String[] includes = {"org/jboss/virtual/*.class", "org/jboss/virtual/**/context/jar/*.class"}; String[] excludes = {"**/Nested*"}; directory.addResources("org/jboss/virtual/VirtualFile.class", includes, excludes, Thread.currentThread().getContextClassLoader()); List children = directory.getChildren(); assertEquals(children.size(), 1); VirtualFile curr = children.get(0); System.out.println("test org/"); assertEquals("org", curr.getName()); System.out.println("test org/jboss"); children = curr.getChildren(); assertEquals(children.size(), 1); curr = children.get(0); assertEquals("jboss", curr.getName()); System.out.println("test org/jboss/virtual"); children = curr.getChildren(); assertEquals(children.size(), 1); curr = children.get(0); assertEquals("virtual", curr.getName()); children = curr.getChildren(); boolean found; found = false; for (VirtualFile child: children) { if (child.getName().equals("VFS.class")) { found = true; break; } } assertTrue("VFS.class was found", found); found = false; for (VirtualFile child: children) { if (child.getName().equals("VirtualFile.class")) { found = true; assertEquals("org/jboss/virtual/VirtualFile.class", child.getPathName()); break; } } assertTrue("VirtualFile.class was found", found); found = false; for (VirtualFile child: children) { if (child.getName().equals("plugins")) { found = true; break; } } assertTrue("plugins/", found); System.out.println("Test org/jboss/virtual/plugins/context/jar"); VirtualFile jar = directory.findChild("org/jboss/virtual/plugins/context/jar"); assertNotNull(jar); assertEquals("jar", jar.getName()); children = jar.getChildren(); for (VirtualFile child: children) { if (child.getName().startsWith("Nested")) throw new RuntimeException("did not exclude propertly"); } AssembledContextFactory.getInstance().remove(directory); } public void testMkDir() throws Exception { AssembledDirectory directory = AssembledContextFactory.getInstance().create("foo.jar"); directory.mkdir("META-INF"); assertNotNull(directory.findChild("META-INF")); } } libjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/HDScannerTestCase.java0000644000175000017500000001056211031777100032346 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2007, Red Hat Middleware LLC, and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.io.File; import java.io.FileOutputStream; import java.net.URI; import java.util.jar.JarEntry; import java.util.jar.JarOutputStream; import org.jboss.test.virtual.support.ps.DeploymentPhase; import org.jboss.test.virtual.support.ps.MockProfileServiceRepository; import org.jboss.test.virtual.support.ps.VFSDeployment; import org.jboss.test.virtual.support.ps.VFSDeploymentFactory; import org.jboss.test.virtual.support.ps.hotdeploy.HDScanner; import org.jboss.virtual.VFS; import org.jboss.virtual.VirtualFile; /** * @author Scott.Stark@jboss.org * @version $Revision:$ */ public class HDScannerTestCase extends AbstractVFSTest { public HDScannerTestCase(String name, boolean forceCopy) { super(name, forceCopy, false); } public HDScannerTestCase(String name) { super(name, true, false); } public void testDeleteWhileScanning() throws Exception { // Create a root in the system tmp dir File root = File.createTempFile("testDeleteWhileScanning", ".root"); root.delete(); assertTrue(root.mkdir()); getLog().info("Created root dir: "+root); File deployDir = new File(root, "deploy"); assertTrue(deployDir.mkdir()); // Remove any existing content for(File f : deployDir.listFiles()) f.delete(); URI[] appURIs = {deployDir.toURI()}; MockProfileServiceRepository repository = new MockProfileServiceRepository(root, appURIs); HDScanner scanner = new HDScanner(); scanner.setProfileService(repository); scanner.setScanPeriod(1000); VFS vfs = VFS.getVFS(root.toURI()); File archive = generateArchive(deployDir); VirtualFile archiveVF = vfs.getChild("deploy/"+archive.getName()); VFSDeployment vfsd = VFSDeploymentFactory.getInstance().createVFSDeployment(archiveVF); repository.addDeployment(archiveVF.toURI().toString(), vfsd, DeploymentPhase.APPLICATION); getLog().debug("Waiting for 10 scans..."); scanner.start(); while(scanner.getScanCount() < 10) { Thread.sleep(1000); // Update the archive last modifed time archive.setLastModified(System.currentTimeMillis()); } getLog().info("Trying to remove: "+archive.getAbsolutePath()); assertTrue(archiveVF.delete()); assertFalse(archiveVF.exists()); getLog().info("Deleted deployed archive"); scanner.stop(); } protected File generateArchive(File deployDir) throws Exception { File tmpJar = File.createTempFile("archive", ".jar", deployDir); FileOutputStream fos = new FileOutputStream(tmpJar); JarOutputStream jos = new JarOutputStream(fos); jos.setLevel(5); jos.setComment(tmpJar.getName()); JarEntry je = new JarEntry("META-INF/"); je.setComment("META-INF directory"); je.setTime(System.currentTimeMillis()); jos.putNextEntry(je); je = new JarEntry("META-INF/metadata.xml"); StringBuffer contents = new StringBuffer(); contents.append(""); je.setSize(contents.length()); je.setTime(System.currentTimeMillis()+1); je.setMethod(JarEntry.DEFLATED); jos.putNextEntry(je); jos.write(contents.toString().getBytes()); jos.closeEntry(); jos.close(); fos.close(); assertTrue(tmpJar.exists()); return tmpJar; } } libjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/VFSAllTestSuite.java0000644000175000017500000000747311137562372032067 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2005, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import junit.framework.Test; import junit.framework.TestSuite; import junit.textui.TestRunner; import org.jboss.virtual.VFS; /** * VFS All Test Suite. * * @author Adrian Brock * @author Ales Justin * @version $Revision: 46146 $ */ public class VFSAllTestSuite extends TestSuite { public static void main(String[] args) { TestRunner.run(suite()); } public static Test suite() { VFS.init(); TestSuite suite = new TestSuite("VFS Tests default"); // vfs / spi suite.addTest(VFSUnitTestCase.suite()); suite.addTest(VirtualFileUnitTestCase.suite()); // url suite.addTest(URLResolutionUnitTestCase.suite()); suite.addTest(URLExistsUnitTestCase.suite()); suite.addTest(URLConnectionUnitTestCase.suite()); // files suite.addTest(FileVFSUnitTestCase.suite()); suite.addTest(CopyFileVFSUnitTestCase.suite()); suite.addTest(FileVFSContextUnitTestCase.suite()); suite.addTest(FileVirtualFileHandlerUnitTestCase.suite()); // jars suite.addTest(JARCacheUnitTestCase.suite()); suite.addTest(CopyJARCacheUnitTestCase.suite()); suite.addTest(JARVFSContextUnitTestCase.suite()); suite.addTest(JARVirtualFileHandlerUnitTestCase.suite()); suite.addTest(JARSerializationUnitTestCase.suite()); suite.addTest(CopyJARSerializationUnitTestCase.suite()); suite.addTest(JAREntryTestCase.suite()); suite.addTest(CopyJAREntryTestCase.suite()); suite.addTest(ZipEntryHandlerUnitTestCase.suite()); suite.addTest(ZipEntryVFSContextUnitTestCase.suite()); // contexts suite.addTest(AssembledContextTestCase.suite()); suite.addTest(MemoryTestCase.suite()); suite.addTest(SundryVFSUnitTestCase.suite()); // options / policy / path suite.addTest(PathQueryTestCase.suite()); suite.addTest(PathTokensTestCase.suite()); // unpack suite.addTest(UnpackTestCase.suite()); suite.addTest(ExplodeTestCase.suite()); suite.addTest(TempTestCase.suite()); // visitor suite.addTest(VisitorUnitTestCase.suite()); // utils suite.addTest(VFSUtilTestCase.suite()); // custom suite.addTest(CustomTestCase.suite()); suite.addTest(VFSResourceTestCase.suite()); // cache suite.addTest(LRUCacheTestCase.suite()); suite.addTest(TimedCacheTestCase.suite()); suite.addTest(IterableTimedCacheTestCase.suite()); suite.addTest(SoftRefCacheTestCase.suite()); suite.addTest(WeakRefCacheTestCase.suite()); suite.addTest(CombinedVFSCacheTestCase.suite()); // exception handler suite.addTest(ExceptionHandlerTestCase.suite()); // operations suite.addTest(FileCleanupUnitTestCase.suite()); return suite; } } libjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/MemoryTestCase.java0000644000175000017500000003035311053266170032015 0ustar twernertwerner/* * JBoss, Home of Professional Open Source. * Copyright 2006, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.net.URL; import java.util.HashMap; import java.util.List; import junit.framework.Test; import org.jboss.util.id.GUID; import org.jboss.virtual.VFS; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.MemoryFileFactory; import org.jboss.virtual.plugins.context.memory.MemoryContextFactory; import org.jboss.virtual.plugins.context.memory.MemoryContextHandler; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VFSContextFactory; import org.jboss.virtual.spi.VFSContextFactoryLocator; import org.jboss.virtual.spi.VirtualFileHandler; /** * Memory vfs tests. * * @author Kabir Khan * @author Ales Justin * @version $Revision: 1.1 $ */ public class MemoryTestCase extends AbstractVFSTest { public MemoryTestCase(String name) { super(name); } public static Test suite() { return suite(MemoryTestCase.class); } public void testRootCreationBad() throws Exception { URL dynamicClassRoot = new URL("vfsmemory", new GUID().toString(), ""); MemoryFileFactory.createRoot(dynamicClassRoot); URL classesURL = new URL(dynamicClassRoot, "classes"); VirtualFile classes = MemoryFileFactory.createDirectory(classesURL); URL url = classes.toURL(); try { VFS.getRoot(url); fail("Should not be here"); } catch (Exception e) { assertInstanceOf(e, IllegalArgumentException.class); } } public void testRootCreationGood() throws Exception { URL dynamicClassRoot = new URL("vfsmemory", GUID.asString(), ""); VirtualFile root = MemoryFileFactory.createRoot(dynamicClassRoot).getRoot(); assertEquals(root, VFS.getRoot(dynamicClassRoot)); VirtualFile file = MemoryFileFactory.putFile(new URL(dynamicClassRoot + "/classes/somename"), new byte[0]); assertNotNull(file); System.out.println(file.toURL()); } public void testSerializable() throws Exception { URI uri = new URI("vfsmemory://aopdomain"); URL root = new URL("vfsmemory://aopdomain"); VFSContextFactory factory = VFSContextFactoryLocator.getFactory(uri); VFSContext ctx = factory.getVFS(uri); MemoryContextHandler parent = new MemoryContextHandler(ctx, null, root, "aopdomain"); URI uri2 = new URI("vfsmemory://aopdomain/child"); URL root2 = new URL("vfsmemory://aopdomain/child"); VFSContextFactory factory2 = VFSContextFactoryLocator.getFactory(uri2); VFSContext ctx2 = factory2.getVFS(uri); MemoryContextHandler child = new MemoryContextHandler(ctx2, parent, root2, "child"); serializeDeserialize(child, MemoryContextHandler.class); byte[] bytes = serialize(parent); Object deserializedObject = deserialize(bytes); assertInstanceOf(deserializedObject, MemoryContextHandler.class); MemoryContextHandler desParent = (MemoryContextHandler)deserializedObject; List list = desParent.getChildren(true); assertNotNull(list); assertFalse(list.isEmpty()); assertNotNull(desParent.getChild("child")); } public void testContextFactory()throws Exception { URI uri = new URI("vfsmemory://aopdomain"); VFSContextFactory factory = VFSContextFactoryLocator.getFactory(uri); assertNotNull(factory); } public void testContext() throws Exception { URI uri = new URI("vfsmemory://aopdomain"); VFSContextFactory factory = VFSContextFactoryLocator.getFactory(uri); VFSContext ctx = factory.getVFS(uri); assertNotNull(ctx); MemoryContextFactory mfactory = MemoryContextFactory.getInstance(); assertNotNull(mfactory); assertSame(factory, mfactory); VFSContext mctx = mfactory.createRoot(uri.toURL()); assertNotNull(mctx); assertSame(ctx, mctx); } public void testWriteAndReadData() throws Exception { URL root = new URL("vfsmemory://aopdomain"); try { long now = System.currentTimeMillis(); URL url = new URL("vfsmemory://aopdomain/org/acme/test/Test.class"); MemoryFileFactory.putFile(url, new byte[] {'a', 'b', 'c'}); String read = readURL(url); assertEquals("abc", read); VirtualFile classFile = VFS.getVirtualFile(new URL("vfsmemory://aopdomain"), "org/acme/test/Test.class"); InputStream bis = classFile.openStream(); read = readIS(bis); assertEquals("abc", read); assertEquals(3, classFile.getSize()); assertTrue(classFile.exists()); assertTrue(classFile.isLeaf()); assertTrue(classFile.getLastModified() >= now); assertTrue(MemoryFileFactory.delete(url)); try { InputStream is = url.openStream(); fail("Should not have found file"); } catch(Exception expected) { } VFS ctx = MemoryFileFactory.find("aopdomain"); assertNotNull(ctx); assertTrue(MemoryFileFactory.deleteRoot(root)); ctx = MemoryFileFactory.find("aopdomain"); assertNull(ctx); } finally { MemoryFileFactory.deleteRoot(root); } } public void testMultipleFiles() throws Exception { URL root = new URL("vfsmemory://aopdomain"); try { VFS ctx = MemoryFileFactory.createRoot(root); URL urlA = new URL("vfsmemory://aopdomain/org/acme/test/Test.class"); MemoryFileFactory.putFile(urlA, new byte[] {'a', 'b', 'c'}); URL urlB = new URL("vfsmemory://aopdomain/org/foo/test/Test.class"); MemoryFileFactory.putFile(urlB, new byte[] {'d', 'e', 'f'}); String readA = readURL(urlA); assertEquals("abc", readA); String readB = readURL(urlB); assertEquals("def", readB); } finally { MemoryFileFactory.deleteRoot(root); } } public void testNavigate() throws Exception { URL root = new URL("vfsmemory://aopdomain"); try { MemoryFileFactory.createRoot(root); URL url = new URL("vfsmemory://aopdomain/org/acme/test/Test.class"); MemoryFileFactory.putFile(url, new byte[] {'a', 'b', 'c'}); URL url2 = new URL("vfsmemory://aopdomain/org/acme/test/Test2.class"); MemoryFileFactory.putFile(url2, new byte[] {'a', 'b', 'c'}); URL url3 = new URL("vfsmemory://aopdomain/org/acme/test/Test3.class"); MemoryFileFactory.putFile(url3, new byte[] {'a', 'b', 'c'}); VFS vfs = MemoryFileFactory.createRoot(root); VirtualFile file = vfs.getVirtualFile(root, "/org/acme/test/Test.class"); assertNotNull(file); VirtualFile file2 = vfs.getVirtualFile(root, "/org"); assertNotNull(file2); VirtualFile test = file2.findChild("/acme/test/Test.class"); assertNotNull(test); assertEquals(file, test); //acme List children = file2.getChildren(); assertEquals(1,children.size()); VirtualFile child = children.get(0); //test children = child.getChildren(); assertEquals(1,children.size()); child = children.get(0); //test/*.class children = child.getChildren(); assertEquals(3,children.size()); HashMap childMap = new HashMap(); for (VirtualFile cur : children) { childMap.put(cur.getName(), cur); } assertNotNull(childMap.get("Test.class")); assertNotNull(childMap.get("Test2.class")); assertNotNull(childMap.get("Test3.class")); } finally { MemoryFileFactory.deleteRoot(root); } } public void testLeaf() throws Exception { URL root = new URL("vfsmemory://aopdomain"); try { VFS ctx = MemoryFileFactory.createRoot(root); URL url = new URL("vfsmemory://aopdomain/org/acme/leaf"); MemoryFileFactory.putFile(url, new byte[] {'a', 'b', 'c'}); URL url2 = new URL("vfsmemory://aopdomain/org/acme/leaf/shouldnotwork"); try { MemoryFileFactory.putFile(url2, new byte[] {'d', 'e', 'f'}); fail("It should not have been possible to add a child to a leaf node"); } catch(Exception e) { } VirtualFile classFile = VFS.getVirtualFile(new URL("vfsmemory://aopdomain"), "org/acme/leaf"); assertNotNull(classFile); try { VirtualFile classFile2 = VFS.getVirtualFile(new URL("vfsmemory://aopdomain"), "org/acme/leaf/shouldnotwork"); fail("It should not have been possible to find a child of a leaf node"); } catch (Exception expected) { } try { URL url3 = new URL("vfsmemory://aopdomain/org/acme"); MemoryFileFactory.putFile(url3, new byte[] {'1', '2', '3'}); fail("Should not have been possible to set contents for a non-leaf node"); } catch (Exception expected) { } try { URL url4 = new URL("vfsmemory://aopdomain/org"); MemoryFileFactory.putFile(url4, new byte[] {'1', '2', '3'}); fail("Should not have been possible to set contents for a non-leaf node"); } catch (Exception expected) { } } finally { MemoryFileFactory.deleteRoot(root); } } public void testUrlHandling()throws Exception { String guid = GUID.asString(); URL rootA = new URL("vfsmemory://" + guid); URL rootB = new URL("vfsmemory", guid, ""); assertEquals(rootA, rootB); URL rootC = new URL("vfsmemory://" + guid + "/classes"); URL rootD = new URL("vfsmemory", guid, "/classes"); assertEquals(rootC, rootD); } protected void setUp() throws Exception { super.setUp(); VFS.init(); getLog().info("java.protocol.handler.pkgs: " + System.getProperty("java.protocol.handler.pkgs")); } private String readURL(URL url) throws IOException { InputStream is = url.openStream(); return readIS(is); } private String readIS(InputStream is) throws IOException { try { StringBuffer sb = new StringBuffer(); while (is.available() != 0) { sb.append((char)is.read()); } return sb.toString(); } finally { if (is != null) { try { is.close(); } catch(Exception ignore) { } } } } } ././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/ZipEntryVFSContextUnitTestCase.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/ZipEntryVFSContextUnitTest0000644000175000017500000002226311112474030033372 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.io.IOException; import java.net.URL; import java.util.List; import junit.framework.Test; import org.jboss.virtual.VFS; import org.jboss.virtual.VFSUtils; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.plugins.context.file.FileSystemContext; import org.jboss.virtual.plugins.context.jar.JarUtils; import org.jboss.virtual.plugins.context.zip.ZipEntryContext; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VirtualFileHandler; /** * ZipEntryVFSContextUnitTestCase. * * @author Marko Strukelj * @version $Revision: 1.0 $ */ public class ZipEntryVFSContextUnitTestCase extends JARVFSContextUnitTestCase { public ZipEntryVFSContextUnitTestCase(String name) { super(name); } public static Test suite() { VFS.init(); System.out.println("java.protocol.handler.pkgs: " + System.getProperty("java.protocol.handler.pkgs")); return suite(ZipEntryVFSContextUnitTestCase.class); } protected VFSContext getVFSContext(String name) throws Exception { URL url = getResource("/vfs/context/jar/" + name + ".jar"); url = JarUtils.createJarURL(url); return new ZipEntryContext(url); } protected VFSContext createVSFContext(URL url) throws Exception { return new ZipEntryContext(url); } /** * Test detection of underlying jar file removal through exists() * * @throws Exception for any error */ public void testRootExists() throws Exception { URL url = getResource("/vfs/test/outer.jar"); File tmpJar = File.createTempFile("vfstest", ".jar"); InputStream is = url.openStream(); OutputStream os = new FileOutputStream(tmpJar); VFSUtils.copyStreamAndClose(is, os); ZipEntryContext context = new ZipEntryContext(tmpJar.toURL()); assertTrue("context.getRoot().exists()", context.getRoot().exists()); boolean isDeleted = context.getRoot().delete(1000); assertTrue("delete tmp file: " + tmpJar, isDeleted); assertFalse("context.getRoot().exists()", context.getRoot().exists()); } /** * Test for proper handling when file appears to be an archive but * trying to handle it produces an exception. Proper behaviour * is to ignore exception and treat the file as non-archive. * * @throws Exception for any error */ public void testNotAnArchive() throws Exception { URL url = getResource("/vfs/context/jar/"); FileSystemContext ctx = new FileSystemContext(url); // we just do basic sanity checks // valid archive VirtualFileHandler handler = ctx.getRoot().getChild("archive.jar"); //assertTrue("is vfszip", "vfszip".equals(handler.toURL().getProtocol())); assertFalse("is leaf", handler.isLeaf()); assertTrue("exists", handler.exists()); assertNotNull("pathName not null", handler.getPathName()); assertNotNull("name not null", handler.getName()); assertNotNull("parent not null", handler.getParent()); assertTrue("lastModified > 0", handler.getLastModified() > 0); assertTrue("size > 0", handler.getSize() > 0); assertNotNull("VF not null", handler.getVirtualFile()); assertFalse("hasBeenModified == false", handler.hasBeenModified()); assertFalse("hidden == false", handler.isHidden()); assertFalse("nested == false", handler.isNested()); assertNotNull("toURI not null", handler.toURI()); assertNotNull("toURL not null", handler.toURL()); assertNotNull("toVfsUrl not null", handler.toVfsUrl()); ByteArrayOutputStream memOut = new ByteArrayOutputStream(); VFSUtils.copyStreamAndClose(handler.openStream(), memOut); assertTrue("read archive content", memOut.size() == handler.getSize()); // invalid archive handler = ctx.getRoot().getChild("notanarchive.jar"); //assertTrue("is leaf", handler.isLeaf()); assertTrue("exists", handler.exists()); assertTrue("lastModified > 0", handler.getLastModified() > 0); assertNotNull("pathName not null", handler.getPathName()); assertNotNull("name not null", handler.getName()); assertNotNull("parent not null", handler.getParent()); assertTrue("size > 0", handler.getSize() > 0); assertNotNull("VF not null", handler.getVirtualFile()); assertFalse("hasBeenModified == false", handler.hasBeenModified()); assertFalse("hidden == false", handler.isHidden()); assertFalse("nested == false", handler.isNested()); assertNotNull("toURI not null", handler.toURI()); assertNotNull("toURL not null", handler.toURL()); assertNotNull("toVfsUrl not null", handler.toVfsUrl()); memOut = new ByteArrayOutputStream(); VFSUtils.copyStreamAndClose(handler.openStream(), memOut); assertTrue("read archive content", memOut.size() == handler.getSize()); } /** * Real URL test * * @throws Exception for any error */ public void testCustomRealURL() throws Exception { URL url = getResource("/vfs/context/jar/"); FileSystemContext ctx = new FileSystemContext(url); // valid archive VirtualFileHandler root = ctx.getRoot(); assertEquals("Context Real URL", url.toExternalForm(), root.getRealURL().toExternalForm()); String jarName = "archive.jar"; VirtualFileHandler archive = root.getChild(jarName); assertEquals("Child Real URL", "jar:" + url.toExternalForm() + jarName + "!/", archive.getRealURL().toExternalForm()); url = getResource("/vfs/test/"); ctx = new FileSystemContext(url); root = ctx.getRoot(); jarName = "level1.zip"; archive = root.getChild(jarName); String nestedName = "level2.zip"; VirtualFileHandler nested = archive.getChild(nestedName); String jarURL = "jar:" + url.toExternalForm() + jarName + "!/" + nestedName; assertEquals("First level nested Real URL", jarURL, nested.getRealURL().toExternalForm()); nested = nested.getChild("level3.zip"); assertEquals("Second level nested Real URL", jarURL, nested.getRealURL().toExternalForm()); // nested root test url = getResource("/vfs/test/"); ZipEntryContext zctx = new ZipEntryContext(new URL("vfszip:" + url.getPath() + "/level1.zip/level2.zip/level3.zip")); VirtualFileHandler handler = zctx.getRoot(); assertEquals("Nested root Real URL", jarURL, handler.getRealURL().toExternalForm()); List children = handler.getChildren(false); for (VirtualFileHandler child: children) { assertEquals("Nested root Real URL", jarURL, child.getRealURL().toExternalForm()); } } /** * Test that options are properly propagated to mounted subcontexts * * @throws IOException */ public void testOptionPropagation() throws IOException { // jar:file: url test URL url = getResource("/vfs/test/level1.zip"); VFS vfs = VFS.getVFS(new URL("jar:file:" + url.getPath() + "!/")); VFSUtils.enableNoReaper(vfs); VirtualFile vf = vfs.getChild("level2.zip/level3.zip"); assertEquals("jar:file: option propagation", VFSUtils.getOption(vf, VFSUtils.NO_REAPER_QUERY), "true"); // vfszip: url test vfs = VFS.getVFS(new URL("vfszip:" + url.getPath())); VFSUtils.enableNoReaper(vfs); vf = vfs.getChild("level2.zip/level3.zip"); assertEquals("vfszip: option propagation", VFSUtils.getOption(vf, VFSUtils.NO_REAPER_QUERY), "true"); } /** * Handler representing a directory must return a recomposed zip archive * that has requested entry as its root. * * This behavior is new to vfszip. vfsjar returns an empty stream. * * @throws Exception for any error */ public void testDirectoryZipEntryOpenStream() throws Exception { doDirectoryZipEntryOpenStream(false); } // we need to make sure this doesn't get touched before protected String getNestedName() { return super.getNestedName() + "_copy"; } protected String getProtocol() { return "vfszip"; } protected boolean isRealURLSupported() { return true; } }././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/JARSerializationUnitTestCase.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/JARSerializationUnitTestCa0000644000175000017500000003334611032131127033302 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, Red Hat Middleware LLC, and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import java.util.List; import java.util.jar.Attributes; import java.util.jar.Manifest; import junit.framework.Test; import org.jboss.test.virtual.support.VirtualFileAdaptor; import org.jboss.virtual.VFS; import org.jboss.virtual.VirtualFile; /** * Tests of no copy nested jars * * @author ales.justin@jboss.org * @author Scott.Stark@jboss.org * @version $Revision: 72234 $ */ @SuppressWarnings("deprecation") public class JARSerializationUnitTestCase extends AbstractVFSTest { public JARSerializationUnitTestCase(String name) { super(name); } protected JARSerializationUnitTestCase(String name, boolean forceCopy) { super(name, forceCopy); } public static Test suite() { return suite(JARSerializationUnitTestCase.class); } /** * Test reading the contents of nested jar entries. * @throws Exception for any error */ public void testInnerJarFile() throws Exception { URL rootURL = getResource("/vfs/test"); VFS vfs = VFS.getVFS(rootURL); VirtualFile outerjar = vfs.findChild("outer.jar"); assertTrue("outer.jar != null", outerjar != null); VirtualFile jar1 = outerjar.findChild("jar1.jar"); assertTrue("outer.jar/jar1.jar != null", jar1 != null); VirtualFile jar2 = outerjar.findChild("jar2.jar"); assertTrue("outer.jar/jar2.jar != null", jar2 != null); VirtualFile jar1MF = jar1.findChild("META-INF/MANIFEST.MF"); assertNotNull("jar1!/META-INF/MANIFEST.MF", jar1MF); InputStream mfIS = jar1MF.openStream(); Manifest mf1 = new Manifest(mfIS); Attributes mainAttrs1 = mf1.getMainAttributes(); String title1 = mainAttrs1.getValue(Attributes.Name.SPECIFICATION_TITLE); assertEquals("jar1", title1); jar1MF.close(); VirtualFile jar2MF = jar2.findChild("META-INF/MANIFEST.MF"); assertNotNull("jar2!/META-INF/MANIFEST.MF", jar2MF); InputStream mfIS2 = jar2MF.openStream(); Manifest mf2 = new Manifest(mfIS2); Attributes mainAttrs2 = mf2.getMainAttributes(); String title2 = mainAttrs2.getValue(Attributes.Name.SPECIFICATION_TITLE); assertEquals("jar2", title2); jar2MF.close(); } public void testInnerJarFileSerialization() throws Exception { URL rootURL = getResource("/vfs/test"); VFS vfs = VFS.getVFS(rootURL); VirtualFile outerjar = vfs.findChild("outer.jar"); assertTrue("outer.jar != null", outerjar != null); log.info("outer.jar: "+outerjar); VirtualFile jar1 = outerjar.findChild("jar1.jar"); assertTrue("outer.jar/jar1.jar != null", jar1 != null); VirtualFile jar2 = outerjar.findChild("jar2.jar"); assertTrue("outer.jar/jar2.jar != null", jar2 != null); VirtualFile jar1MF = jar1.findChild("META-INF/MANIFEST.MF"); assertNotNull("jar1!/META-INF/MANIFEST.MF", jar1MF); InputStream mfIS = jar1MF.openStream(); Manifest mf1 = new Manifest(mfIS); Attributes mainAttrs1 = mf1.getMainAttributes(); String title1 = mainAttrs1.getValue(Attributes.Name.SPECIFICATION_TITLE); assertEquals("jar1", title1); jar1MF.close(); VirtualFile jar1DS = serializeDeserialize(jar1, VirtualFile.class); assertNotNull("jar1 deserialized", jar1DS); VirtualFile jar1DSMF = jar1.findChild("META-INF/MANIFEST.MF"); mfIS = jar1DSMF.openStream(); mf1 = new Manifest(mfIS); mainAttrs1 = mf1.getMainAttributes(); title1 = mainAttrs1.getValue(Attributes.Name.SPECIFICATION_TITLE); assertEquals("jar1", title1); jar1DSMF.close(); } public void testInnerJarFilesOnlyFileSerialization() throws Exception { URL rootURL = getResource("/vfs/test"); VFS vfs = VFS.getVFS(rootURL); VirtualFile outerjar = vfs.findChild("outer.jar"); assertTrue("outer.jar != null", outerjar != null); log.info("outer.jar: "+outerjar); VirtualFile jar1 = outerjar.findChild("jar1-filesonly.jar"); assertTrue("outer.jar/jar1-filesonly.jar != null", jar1 != null); VirtualFile jar1MF = jar1.findChild("META-INF/MANIFEST.MF"); assertNotNull("jar1-filesonly!/META-INF/MANIFEST.MF", jar1MF); InputStream mfIS = jar1MF.openStream(); Manifest mf1 = new Manifest(mfIS); Attributes mainAttrs1 = mf1.getMainAttributes(); String title1 = mainAttrs1.getValue(Attributes.Name.SPECIFICATION_TITLE); assertEquals("jar1-filesonly", title1); jar1MF.close(); VirtualFile jar1DS = serializeDeserialize(jar1, VirtualFile.class); assertNotNull("jar1 deserialized", jar1DS); VirtualFile jar1DSMF = jar1DS.getChild("META-INF/MANIFEST.MF"); assertNotNull("jar1-filesonly!/META-INF/MANIFEST.MF", jar1DSMF); mfIS = jar1DSMF.openStream(); mf1 = new Manifest(mfIS); mainAttrs1 = mf1.getMainAttributes(); title1 = mainAttrs1.getValue(Attributes.Name.SPECIFICATION_TITLE); assertEquals("jar1-filesonly", title1); jar1DSMF.close(); } public void testLevelZips() throws Exception { URL rootURL = getResource("/vfs/test"); VFS vfs = VFS.getVFS(rootURL); VirtualFile one = vfs.findChild("level1.zip"); VirtualFile textOne = one.findChild("test1.txt"); testText(textOne); VirtualFile two = one.findChild("level2.zip"); VirtualFile textTwo = two.findChild("test2.txt"); testText(textTwo); VirtualFile three = two.findChild("level3.zip"); VirtualFile textThree = three.findChild("test3.txt"); testText(textThree); three = serializeDeserialize(three, VirtualFile.class); textThree = three.findChild("test3.txt"); testText(textThree); two = serializeDeserialize(two, VirtualFile.class); textTwo = two.findChild("test2.txt"); testText(textTwo); three = two.findChild("level3.zip"); textThree = two.findChild("level3.zip/test3.txt"); testText(textThree); textThree = three.findChild("test3.txt"); testText(textThree); one = serializeDeserialize(one, VirtualFile.class); textOne = one.findChild("test1.txt"); testText(textOne); two = one.findChild("level2.zip"); textTwo = one.findChild("level2.zip/test2.txt"); testText(textTwo); textTwo = two.findChild("test2.txt"); testText(textTwo); three = one.findChild("level2.zip/level3.zip"); textThree = three.findChild("test3.txt"); testText(textThree); textThree = one.findChild("level2.zip/level3.zip/test3.txt"); testText(textThree); three = two.findChild("level3.zip"); textThree = three.findChild("test3.txt"); testText(textThree); textThree = two.findChild("level3.zip/test3.txt"); testText(textThree); textThree = serializeDeserialize(textThree, VirtualFile.class); testText(textThree); } public void test2ndLevelRead() throws Exception { URL rootURL = getResource("/vfs/test/level1.zip"); VFS vfs = VFS.getVFS(rootURL); VirtualFile file = vfs.findChild("level2.zip"); file = serializeDeserialize(file, VirtualFile.class); VirtualFile text = file.findChild("test2.txt"); testText(text); } public void testEarsInnerJarChild() throws Exception { URL rootURL = getResource("/vfs/test/interop_W2JREMarshallTest_appclient_vehicle.ear"); VFS vfs = VFS.getVFS(rootURL); VirtualFile file = vfs.findChild("interop_W2JREMarshallTest_appclient_vehicle_client.jar"); VirtualFile child = file.findChild("MarshallTest.xml"); String text = getText(child); assertNotNull(text); assertTrue(text.length() > 0); // serialize file = serializeDeserialize(file, VirtualFile.class); child = file.findChild("MarshallTest.xml"); text = getText(child); assertNotNull(text); assertTrue(text.length() > 0); } public void testVirtualFileAdaptor() throws Exception { URL rootURL = getResource("/vfs/test/interop_W2JREMarshallTest_appclient_vehicle.ear"); VFS vfs = VFS.getVFS(rootURL); VirtualFile file = vfs.findChild("interop_W2JREMarshallTest_appclient_vehicle_client.jar"); VirtualFile same = file.findChild(""); // serialize testVirtualFileAdaptor(same, "MarshallTest.xml"); } public void testDeepVFAMechanism() throws Exception { URL rootURL = getResource("/vfs/test"); VFS vfs = VFS.getVFS(rootURL); VirtualFile one = vfs.findChild("level1.zip"); testVirtualFileAdaptor(one, "test1.txt"); VirtualFile textOne = one.findChild("test1.txt"); testVirtualFileAdaptor(textOne, "../level2.zip"); VirtualFile two = one.findChild("level2.zip"); testVirtualFileAdaptor(two, "test2.txt"); VirtualFile textTwo = two.findChild("test2.txt"); testVirtualFileAdaptor(textTwo, "../level3.zip"); VirtualFile three = two.findChild("level3.zip"); testVirtualFileAdaptor(three, "test3.txt"); VirtualFile textThree = three.findChild("test3.txt"); testVirtualFileAdaptor(textThree, "../test3.txt"); three = serializeDeserialize(three, VirtualFile.class); testVirtualFileAdaptor(three, "test3.txt"); textThree = three.findChild("test3.txt"); testVirtualFileAdaptor(textThree, "../test3.txt"); two = serializeDeserialize(two, VirtualFile.class); testVirtualFileAdaptor(two, "test2.txt"); textTwo = two.findChild("test2.txt"); testVirtualFileAdaptor(textTwo, "../level3.zip"); three = two.findChild("level3.zip"); testVirtualFileAdaptor(three, "test3.txt"); textThree = two.findChild("level3.zip/test3.txt"); testVirtualFileAdaptor(textThree, "../test3.txt"); textThree = three.findChild("test3.txt"); testVirtualFileAdaptor(textThree, ".././test3.txt"); one = serializeDeserialize(one, VirtualFile.class); testVirtualFileAdaptor(one, "test1.txt"); textOne = one.findChild("test1.txt"); testVirtualFileAdaptor(textOne, "../level2.zip"); two = one.findChild("level2.zip"); testVirtualFileAdaptor(two, "test2.txt"); textTwo = one.findChild("level2.zip/test2.txt"); testVirtualFileAdaptor(textTwo, "../level3.zip"); textTwo = two.findChild("test2.txt"); testVirtualFileAdaptor(textTwo, "../level3.zip"); three = one.findChild("level2.zip/level3.zip"); testVirtualFileAdaptor(three, "test3.txt"); textThree = three.findChild("test3.txt"); testVirtualFileAdaptor(textThree, ".."); textThree = one.findChild("level2.zip/level3.zip/test3.txt"); testVirtualFileAdaptor(textThree, ".."); three = two.findChild("level3.zip"); testVirtualFileAdaptor(three, "test3.txt"); textThree = three.findChild("test3.txt"); testVirtualFileAdaptor(textThree, "../.."); textThree = two.findChild("level3.zip/test3.txt"); testVirtualFileAdaptor(textThree, "../.."); } public void testNestedDir() throws Exception { URL url = getResource("/vfs/test/spring-ear.ear"); String urlString = url.toExternalForm(); int p = urlString.indexOf(":/"); url = new URL("vfszip" + urlString.substring(p) + "/lib/spring-beans.jar/org/jboss/test/spring"); VirtualFile file = VFS.getRoot(url); assertNotNull("No beans dir", file.getChild("beans")); testVirtualFileAdaptor(file, "beans"); } protected void testVirtualFileAdaptor(VirtualFile file, String pathName) throws Exception { VirtualFileAdaptor adaptor = new VirtualFileAdaptor(file); adaptor = serializeDeserialize(adaptor, VirtualFileAdaptor.class); VirtualFileAdaptor vfaChild = adaptor.findChild(pathName); assertNotNull(vfaChild); List children = file.getChildren(); if (children != null) { for (VirtualFile child : children) { adaptor = new VirtualFileAdaptor(child); adaptor = serializeDeserialize(adaptor, VirtualFileAdaptor.class); assertNotNull(adaptor.findChild("..")); // should find parent } } } protected String getText(VirtualFile file) throws Exception { InputStream in = file.openStream(); try { BufferedReader reader = new BufferedReader(new InputStreamReader(in)); StringBuilder buffer = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { buffer.append(line); } return buffer.toString(); } finally { try { in.close(); } catch (IOException ignore) { } } } protected void testText(VirtualFile file) throws Exception { String text = getText(file); assertEquals("Some test.", text); } }././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/JARVirtualFileHandlerUnitTestCase.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/JARVirtualFileHandlerUnitT0000644000175000017500000000773411030667143033245 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.io.File; import java.net.JarURLConnection; import java.net.URL; import java.util.jar.JarEntry; import java.util.jar.JarFile; import junit.framework.Test; import junit.framework.TestSuite; import org.jboss.virtual.plugins.context.jar.JarContext; import org.jboss.virtual.plugins.context.jar.JarUtils; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VirtualFileHandler; /** * JARVirtualFileHandlerUnitTestCase. * * @author Adrian Brock * @version $Revision: 1.1 $ */ public class JARVirtualFileHandlerUnitTestCase extends AbstractVirtualFileHandlerTest { public JARVirtualFileHandlerUnitTestCase(String name) { super(name); } public static Test suite() { return new TestSuite(JARVirtualFileHandlerUnitTestCase.class); } protected URL getRootResource(String name) throws Exception { if (name.endsWith(".jar")) return getResource("/vfs/context/jar/" + name); else return getResource("/vfs/context/jar/" + name + ".jar"); } protected File getRealJarFile(String name) throws Exception { URL url = getRootResource(name); return new File(url.getPath()); } protected JarEntry getRealJarEntry(String name, String path) throws Exception { URL url = getRootResource(name); url = JarUtils.createJarURL(url); JarURLConnection c = (JarURLConnection) url.openConnection(); JarFile jarFile = c.getJarFile(); return jarFile.getJarEntry(path); } protected VFSContext getVFSContext(String name) throws Exception { URL url = getRootResource(name); url = JarUtils.createJarURL(url); return new JarContext(url); } protected String getRootName(String name) throws Exception { return name + ".jar"; } protected long getRealLastModified(String name, String path) throws Exception { if (path != null) { JarEntry entry = getRealJarEntry(name, path); return entry.getTime(); } else { File file = getRealJarFile(name); return file.lastModified(); } } protected long getRealSize(String name, String path) throws Exception { if (path != null) { JarEntry entry = getRealJarEntry(name, path); return entry.getSize(); } else { File file = getRealJarFile(name); return file.length(); } } protected void assertIsNested(VirtualFileHandler handler) throws Exception { assertNotNull(handler); assertTrue(handler.toString(), handler.isNested()); } protected void modifyChild(VirtualFileHandler child, String name, String path) throws Exception { // noop atm } protected void checkHasBeenModified(VirtualFileHandler handler) throws Exception { // noop atm } protected void unmodifyChild(VirtualFileHandler child, String name, String path) throws Exception { // noop atm } } libjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/UnpackTestCase.java0000644000175000017500000000404611137562372031774 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import junit.framework.Test; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.VFSUtils; /** * Unpack tests. * * @author Ales Justin */ public class UnpackTestCase extends CopyTest { public UnpackTestCase(String s) { super(s); } public static Test suite() { return suite(UnpackTestCase.class); } protected VirtualFile modify(VirtualFile file) throws Exception { return VFSUtils.unpack(file); } protected void assertNoReplacement(VirtualFile original, VirtualFile replacement, boolean exploded) throws Exception { assertSame(original, replacement); } protected void assertTopLevel(VirtualFile original, VirtualFile replacement) throws Exception { assertSame(original, replacement); } protected void assertNestedLevel(VirtualFile original, VirtualFile replacement) throws Exception { assertUnpackedReplacement(original, replacement); } }././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/URLConnectionUnitTestCase.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/URLConnectionUnitTestCase.0000644000175000017500000000763511037063734033237 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import java.util.Arrays; import junit.framework.Test; import org.jboss.virtual.VFS; import org.jboss.virtual.VirtualFile; /** * Basic tests of URL connection * * @author ales.jutin@jboss.org */ public class URLConnectionUnitTestCase extends AbstractVFSTest { public URLConnectionUnitTestCase(String name) { super(name); } public static Test suite() { return suite(URLConnectionUnitTestCase.class); } protected String getFileName() { return "outer.jar"; } protected VirtualFile getFile() throws IOException { URL url = getResource("/vfs/test/"); VirtualFile root = VFS.getRoot(url); VirtualFile file = root.getChild(getFileName()); assertNotNull(file); return file; } /** * Test url connection content. * * @throws Exception for any error */ public void testContent() throws Exception { VirtualFile file = getFile(); URL url = file.toURL(); URLConnection conn = url.openConnection(); assertEquals(file, conn.getContent()); } /** * Test url connection content lenght. * * @throws Exception for any error */ public void testContentLenght() throws Exception { VirtualFile file = getFile(); URL url = file.toURL(); URLConnection conn = url.openConnection(); assertEquals(file.getSize(), conn.getContentLength()); } /** * Test url connection last modified. * * @throws Exception for any error */ public void testLastModified() throws Exception { VirtualFile file = getFile(); URL url = file.toURL(); URLConnection conn = url.openConnection(); assertEquals(file.getLastModified(), conn.getLastModified()); } /** * Test url connection input stream. * * @throws Exception for any error */ public void testInputStream() throws Exception { VirtualFile file = getFile(); URL url = file.toURL(); URLConnection conn = url.openConnection(); assertTrue(Arrays.equals(readBytes(file.openStream()), readBytes(conn.getInputStream()))); } protected static byte[] readBytes(InputStream inputStream) throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); int read = 0; byte[] bytes = new byte[1024]; try { while (read >=0) { read = inputStream.read(bytes); baos.write(bytes); } } finally { try { inputStream.close(); } catch (IOException ignored) { } } return baos.toByteArray(); } } ././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/ZipEntryHandlerUnitTestCase.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/ZipEntryHandlerUnitTestCas0000644000175000017500000001371111031776370033405 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.net.URL; import java.io.File; import java.io.FileOutputStream; import java.util.jar.Manifest; import java.util.jar.JarOutputStream; import java.util.List; import junit.framework.Test; import org.jboss.virtual.plugins.context.jar.JarUtils; import org.jboss.virtual.plugins.context.zip.ZipEntryContext; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.VFS; import org.jboss.virtual.VirtualFile; /** * ZipEntryHandlerUnitTestCase. * * @author Marko Strukelj * @version $Revision: 1.0 $ */ public class ZipEntryHandlerUnitTestCase extends JARVirtualFileHandlerUnitTestCase { public ZipEntryHandlerUnitTestCase(String name) { super(name); } public static Test suite() { return suite(ZipEntryHandlerUnitTestCase.class); } protected VFSContext getVFSContext(String name) throws Exception { URL url = getRootResource(name); url = JarUtils.createJarURL(url); return new ZipEntryContext(url); } /** * Test VirtualFile.delete() for zip archives accessed through FileSystemContext * * @throws Exception if an error occurs */ public void testFileContextZipDelete() throws Exception { File tmpRoot = File.createTempFile("vfs", ".root"); tmpRoot.delete(); tmpRoot.mkdir(); File tmp = File.createTempFile("testFileContextZipDelete", ".jar", tmpRoot); VFS vfs = VFS.getVFS(tmpRoot.toURL()); Manifest mf = new Manifest(); mf.getMainAttributes().putValue("Created-By", getClass().getName() + "." + "testEntryModified"); FileOutputStream fos = new FileOutputStream(tmp); JarOutputStream jos = new JarOutputStream(fos, mf); try { jos.setComment("testJarURLs"); jos.setLevel(0); jos.flush(); } finally { jos.close(); } // children() exist List children = vfs.getChildren(); assertTrue(tmpRoot + ".getChildren().size() == 1", children.size() == 1); // specific child exists() VirtualFile tmpVF = vfs.getChild(tmp.getName()); assertTrue(tmp + ".exists()", tmpVF.exists()); // test jar entry // specific zip entry exists(), delete() not, exists() VirtualFile entryVF = tmpVF.getChild("META-INF"); assertTrue(entryVF.getName() + " .exists()", entryVF.exists()); assertFalse(entryVF.getName() + " .delete() == false", entryVF.delete()); assertTrue(entryVF.getName() + " .exists()", entryVF.exists()); // children() exist children = tmpVF.getChildren(); assertTrue(tmpVF + ".getChildren().size() == 1", children.size() == 1); // getChild() returns not-null entryVF = tmpVF.getChild("META-INF"); assertNotNull(tmpVF + ".getChild('META-INF') != null", entryVF); // continue with jar // specific child delete(), exists() not assertTrue(tmp + ".delete()", tmpVF.delete()); assertFalse(tmp + ".exists() == false", tmpVF.exists()); // children() don't exist children = vfs.getChildren(); assertTrue(tmpRoot + ".getChildren().size() == 0", children.size() == 0); // getChild() returns null tmpVF = vfs.getChild(tmp.getName()); assertNull(tmpRoot + ".getChild('" + tmp.getName() + "') == null", tmpVF); // directory delete() assertTrue(tmpRoot + ".delete()", vfs.getRoot().delete()); } /** * Test VirtualFile.delete() for zip archive accessed through ZipEntryContext * * @throws Exception */ public void testZipContextDelete() throws Exception { File tmp = File.createTempFile("testZipContextDelete", ".jar"); Manifest mf = new Manifest(); mf.getMainAttributes().putValue("Created-By", getClass().getName() + "." + "testEntryModified"); FileOutputStream fos = new FileOutputStream(tmp); JarOutputStream jos = new JarOutputStream(fos, mf); try { jos.setComment("testJarURLs"); jos.setLevel(0); jos.flush(); } finally { jos.close(); } VFS vfs = VFS.getVFS(tmp.toURL()); // children() exist List children = vfs.getChildren(); assertTrue(tmp + ".getChildren().size() == 1", children.size() == 1); // specific child exists(), delete() not, exists() VirtualFile tmpVF = vfs.getChild("META-INF"); assertTrue(tmp + ".exists()", tmpVF.exists()); assertFalse(tmp + ".delete() == false", tmpVF.delete()); assertTrue(tmp + ".exists()", tmpVF.exists()); // children() exist children = vfs.getChildren(); assertTrue(tmp + ".getChildren().size() == 1", children.size() == 1); // getChild() returns not-null tmpVF = vfs.getChild("META-INF"); assertNotNull(tmp + ".getChild('META-INF') != null", tmpVF); // archive delete(), exists() not assertTrue(tmp + ".delete()", vfs.getRoot().delete()); assertFalse(tmp + ".exists() == false", vfs.getRoot().exists()); } }././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/CombinedVFSCacheTestCase.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/CombinedVFSCacheTestCase.j0000644000175000017500000000643711137562372033114 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.net.URL; import java.util.Collections; import java.util.Map; import junit.framework.Test; import org.jboss.virtual.plugins.cache.CombinedVFSCache; import org.jboss.virtual.plugins.cache.IterableTimedVFSCache; import org.jboss.virtual.spi.ExceptionHandler; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.cache.VFSCache; /** * Combined VFSCache Test. * * @author Ales Justin */ public class CombinedVFSCacheTestCase extends VFSCacheTest { public CombinedVFSCacheTestCase(String name) { super(name); } public static Test suite() { return suite(CombinedVFSCacheTestCase.class); } @Override protected void configureCache(VFSCache cache) throws Exception { if (cache instanceof CombinedVFSCache) { CombinedVFSCache cvc = CombinedVFSCache.class.cast(cache); URL url = getResource("/vfs/test/nested"); Map map = Collections.singletonMap(url, null); cvc.setPermanentRoots(map); IterableTimedVFSCache realCache = new IterableTimedVFSCache(5); realCache.start(); cvc.setRealCache(realCache); cvc.create(); } } @Override protected void stopCache(VFSCache cache) { if (cache != null) { if (cache instanceof CombinedWrapperVFSCache) { CombinedWrapperVFSCache cwvc = (CombinedWrapperVFSCache)cache; cwvc.getTemp().stop(); } cache.stop(); } } @Override protected Class getCacheClass() { return CombinedVFSCache.class; } protected CombinedVFSCache createCache() { return new CombinedWrapperVFSCache(); } protected Map getMap() { return null; } protected void testCachedContexts(Iterable iter) { VFSContext context = iter.iterator().next(); assertNotNull(context); } private class CombinedWrapperVFSCache extends CombinedVFSCache { private VFSCache temp; @Override public void setRealCache(VFSCache realCache) { super.setRealCache(realCache); temp = realCache; } public VFSCache getTemp() { return temp; } } }libjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/MapVFSCacheTest.java0000644000175000017500000000301311105023574031757 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.util.Map; import org.jboss.virtual.spi.VFSContext; /** * Map VFSCache Test. * * @author Ales Justin */ public abstract class MapVFSCacheTest extends VFSCacheTest { public MapVFSCacheTest(String name) { super(name); } protected Map getMap() { return null; } protected void testCachedContexts(Iterable iter) { VFSContext context = iter.iterator().next(); assertNotNull(context); } }libjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/LRUCacheTestCase.java0000644000175000017500000000440311105023574032125 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import junit.framework.Test; import org.jboss.virtual.VFSUtils; import org.jboss.virtual.plugins.cache.LRUVFSCache; import org.jboss.virtual.spi.cache.VFSCache; /** * LRU VFSCache Test. * * @author Ales Justin */ public class LRUCacheTestCase extends CachePolicyVFSCacheTest { public LRUCacheTestCase(String name) { super(name); } public static Test suite() { return suite(LRUCacheTestCase.class); } protected VFSCache createCache() { return new LRUVFSCache(2, 10); } protected Iterable populateRequiredSystemProperties() { System.setProperty(VFSUtils.VFS_CACHE_KEY + ".LRUPolicyCaching.min", "2"); System.setProperty(VFSUtils.VFS_CACHE_KEY + ".LRUPolicyCaching.max", "10"); return Arrays.asList(VFSUtils.VFS_CACHE_KEY + ".LRUPolicyCaching.min", VFSUtils.VFS_CACHE_KEY + ".LRUPolicyCaching.max"); } protected Map getMap() { Map map = new HashMap(); map.put(VFSUtils.VFS_CACHE_KEY + ".LRUPolicyCaching.min", 2); map.put(VFSUtils.VFS_CACHE_KEY + ".LRUPolicyCaching.max", 10); return map; } }libjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/AbstractVFSTest.java0000644000175000017500000001143211104021156032056 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.net.URL; import junit.framework.AssertionFailedError; import org.jboss.test.BaseTestCase; import org.jboss.test.virtual.support.FileOAContextFactory; import org.jboss.test.virtual.support.JarOAContextFactory; import org.jboss.test.virtual.support.OptionsAwareURI; import org.jboss.virtual.VFSUtils; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.spi.VFSContextFactory; import org.jboss.virtual.spi.VFSContextFactoryLocator; /** * AbstractVFSTest. * * @author Adrian Brock * @version $Revision: 1.1 $ */ public abstract class AbstractVFSTest extends BaseTestCase { private static final VFSContextFactory fileFactory = new FileOAContextFactory(); private static final VFSContextFactory jarFactory = new JarOAContextFactory(); private boolean forceCopy; private boolean forceNoReaper; public AbstractVFSTest(String name) { super(name); } public AbstractVFSTest(String name, boolean forceCopy) { super(name); this.forceCopy = forceCopy; } public AbstractVFSTest(String name, boolean forceCopy, boolean forceNoReaper) { super(name); this.forceCopy = forceCopy; this.forceNoReaper = forceNoReaper; } protected void setUp() throws Exception { super.setUp(); /* // LRU System.setProperty(VFSUtils.VFS_CACHE_KEY, LRUVFSCache.class.getName()); System.setProperty(VFSUtils.VFS_CACHE_KEY + ".LRUPolicyCaching.min", "2"); System.setProperty(VFSUtils.VFS_CACHE_KEY + ".LRUPolicyCaching.max", "100"); */ /* // Timed System.setProperty(VFSUtils.VFS_CACHE_KEY, TimedVFSCache.class.getName()); System.setProperty(VFSUtils.VFS_CACHE_KEY + ".TimedPolicyCaching.lifetime", "60"); */ VFSContextFactoryLocator.registerFactory(fileFactory); VFSContextFactoryLocator.registerFactory(jarFactory); getLog().info("Force copy: " + forceCopy); if (forceCopy) OptionsAwareURI.set(OptionsAwareURI.Copy); if (forceNoReaper) OptionsAwareURI.set(OptionsAwareURI.NoReaper); } protected void tearDown() throws Exception { VFSContextFactoryLocator.unregisterFactory(jarFactory); VFSContextFactoryLocator.unregisterFactory(fileFactory); if (forceCopy) OptionsAwareURI.clear(OptionsAwareURI.Copy); if (forceNoReaper) OptionsAwareURI.clear(OptionsAwareURI.NoReaper); super.tearDown(); } // TODO move to AbstractTestCase public URL getResource(String name) { URL url = super.getResource(name); assertNotNull("Resource not found: " + name, url); return url; } protected void checkThrowableTemp(Class expected, Throwable throwable) { if (expected == null) fail("Must provide an expected class"); if (throwable == null) fail("Must provide a throwable for comparison"); if (throwable instanceof AssertionFailedError || throwable instanceof AssertionError) throw (Error) throwable; // TODO move to AbstractTestCase if (expected.equals(throwable.getClass()) == false) if (expected.isAssignableFrom(throwable.getClass()) == false) { getLog().error("Unexpected throwable", throwable); fail("Unexpected throwable: " + throwable); } else { getLog().debug("Got expected " + expected.getName() + "(" + throwable + ")"); } } /** * Do we force copy handling of jars. * * @param file the virtual file * @return true if we force copy handling */ protected boolean isForceCopyEnabled(VirtualFile file) { boolean systemProperty = Boolean.parseBoolean(System.getProperty(VFSUtils.FORCE_COPY_KEY, "false")); return systemProperty || VFSUtils.getOption(file, VFSUtils.FORCE_COPY_KEY) != null; } } libjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/TimedCacheTestCase.java0000644000175000017500000000400411112474030032515 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.util.Map; import java.util.HashMap; import org.jboss.virtual.plugins.cache.TimedVFSCache; import org.jboss.virtual.spi.cache.VFSCache; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.VFSUtils; import junit.framework.Test; /** * Timed VFSCache Test. * * @author Ales Justin */ public class TimedCacheTestCase extends CachePolicyVFSCacheTest { public TimedCacheTestCase(String name) { super(name); } public static Test suite() { return suite(TimedCacheTestCase.class); } protected VFSCache createCache() { return new TimedVFSCache(5); } protected void testCachedContexts(Iterable iter) { VFSContext context = iter.iterator().next(); assertNotNull(context); } protected Map getMap() { Map map = new HashMap(); map.put(VFSUtils.VFS_CACHE_KEY + ".TimedPolicyCaching.lifetime", 5); return map; } }././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/URLResolutionUnitTestCase.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/URLResolutionUnitTestCase.0000644000175000017500000000651611001136352033264 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, Red Hat Middleware LLC, and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.net.URL; import junit.framework.Test; import org.jboss.test.BaseTestCase; /** * Basic tests of URL resolution * * @author Scott.Stark@jboss.org * @version $Revision:$ */ public class URLResolutionUnitTestCase extends BaseTestCase { public URLResolutionUnitTestCase(String name) { super(name); } public static Test suite() { return suite(URLResolutionUnitTestCase.class); } /** * Test resolution when the URL against which relative paths are resolved * is NOT a directory (ends in '/'). * @throws Exception */ public void testNonDirRelativeURLs() throws Exception { URL root = new URL("file:/root"); URL rootPeer = new URL(root, "peer"); URL expected = new URL("file:/peer"); assertEquals(expected, rootPeer); } /** * Test resolution of a relative path with a leading .. against * a NON directory URL. * @throws Exception */ public void testNonDirDotDotRelativeURLs() throws Exception { URL root = new URL("file:/root/sub1"); URL rootPeer = new URL(root, "../peer"); URL expected = new URL("file:/peer"); assertEquals(expected, rootPeer); root = new URL("file:/root/sub1/subsub1"); rootPeer = new URL(root, "../peer"); expected = new URL("file:/root/peer"); assertEquals(expected, rootPeer); } /** * Test resolution when the URL against which relative paths are resolved * is a directory (ends in '/'). * @throws Exception */ public void testDirRelativeURLs() throws Exception { URL root = new URL("file:/root/"); URL rootPeer = new URL(root, "peer"); URL expected = new URL("file:/root/peer"); assertEquals(expected, rootPeer); } /** * Test resolution of a relative path with a leading .. against * a directory URL. * @throws Exception */ public void testDirDotDotRelativeURLs() throws Exception { URL root = new URL("file:/root/sub1/"); URL rootPeer = new URL(root, "../peer"); URL expected = new URL("file:/root/peer"); assertEquals(expected, rootPeer); root = new URL("file:/root/sub1/subsub1/"); rootPeer = new URL(root, "../peer"); expected = new URL("file:/root/sub1/peer"); assertEquals(expected, rootPeer); } } libjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/VFSCacheTest.java0000644000175000017500000001435211137562372031342 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.io.IOException; import java.net.URI; import java.net.URL; import java.util.Collections; import java.util.Map; import org.jboss.virtual.VFS; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.cache.CacheStatistics; import org.jboss.virtual.spi.cache.VFSCache; import org.jboss.virtual.spi.cache.VFSCacheFactory; import org.jboss.virtual.spi.cache.helpers.NoopVFSCache; /** * VFSCache Test. * * @author Ales Justin */ public abstract class VFSCacheTest extends AbstractVFSTest { public VFSCacheTest(String name) { super(name); } protected abstract VFSCache createCache(); protected void configureCache(VFSCache cache) throws Exception { } protected void stopCache(VFSCache cache) { if (cache != null) cache.stop(); } @SuppressWarnings("deprecation") public void testCache() throws Exception { URL url = getResource("/vfs/test/nested"); VFSCache cache = createCache(); cache.start(); try { VFSCacheFactory.setInstance(cache); try { configureCache(cache); VirtualFile root = VFS.getRoot(url); VirtualFile file = root.findChild("/nested.jar/META-INF/empty.txt"); URL fileURL = file.toURL(); VirtualFile nested = root.findChild("/nested.jar/complex.jar/subfolder/subsubfolder/subsubchild"); URL nestedURL = nested.toURL(); assertEquals(file, cache.getFile(fileURL)); assertEquals(nested, cache.getFile(nestedURL)); VFSCacheFactory.setInstance(null); VFSCache wrapper = new WrapperVFSCache(cache); VFSCacheFactory.setInstance(wrapper); assertEquals(file, wrapper.getFile(fileURL)); assertEquals(nested, wrapper.getFile(nestedURL)); } finally { VFSCacheFactory.setInstance(null); } } finally { stopCache(cache); } } protected abstract void testCachedContexts(Iterable iter); public void testCacheStatistics() throws Exception { URL url = getResource("/vfs/test/nested"); VFSCache cache = createCache(); cache.start(); try { if (cache instanceof CacheStatistics) { CacheStatistics statistics = CacheStatistics.class.cast(cache); VFSCacheFactory.setInstance(cache); try { configureCache(cache); VirtualFile root = VFS.getRoot(url); assertNotNull(root); Iterable iter = statistics.getCachedContexts(); testCachedContexts(iter); assertEquals(1, statistics.size()); assertTrue(statistics.lastInsert() != 0); } finally { VFSCacheFactory.setInstance(null); } } } finally { stopCache(cache); } } protected Class getCacheClass() { VFSCache cache = createCache(); return cache.getClass(); } protected Iterable populateRequiredSystemProperties() { return Collections.emptySet(); } protected abstract Map getMap(); public void testCacheFactory() throws Exception { VFSCache cache = null; String cacheClassName = getCacheClass().getName(); VFSCacheFactory.setInstance(null); try { Iterable keys = populateRequiredSystemProperties(); try { cache = VFSCacheFactory.getInstance(cacheClassName); assertNotNull(cache); assertTrue(cache instanceof NoopVFSCache == false); cache.flush(); } finally { for (String key : keys) System.clearProperty(key); } VFSCacheFactory.setInstance(null); VFSCache mapParamCache = VFSCacheFactory.getInstance(cacheClassName, getMap()); // need new instance, so we know we're really testing map parameter assertNotSame(cache, mapParamCache); cache = mapParamCache; assertNotNull(cache); assertTrue(cache instanceof NoopVFSCache == false); cache.flush(); } finally { stopCache(cache); VFSCacheFactory.setInstance(null); } } private class WrapperVFSCache implements VFSCache { private VFSCache delegate; private WrapperVFSCache(VFSCache delegate) { this.delegate = delegate; } public VirtualFile getFile(URI uri) throws IOException { return delegate.getFile(uri); } public VirtualFile getFile(URL url) throws IOException { return delegate.getFile(url); } public void putContext(VFSContext context) { throw new IllegalArgumentException("Context should already be there: " + context); } public void removeContext(VFSContext context) { } public void start() throws Exception { } public void stop() { } public void flush() { } } }././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/VirtualFileUnitTestCase.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/VirtualFileUnitTestCase.ja0000644000175000017500000013061410773276206033316 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import junit.framework.Test; import junit.framework.TestSuite; import org.jboss.test.virtual.support.MockVFSContext; import org.jboss.test.virtual.support.MockVirtualFileFilter; import org.jboss.virtual.VFS; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.plugins.vfs.helpers.FilterVirtualFileVisitor; import org.jboss.virtual.spi.VirtualFileHandler; /** * VirtualFileUnitTestCase. * * @author Adrian Brock * @version $Revision: 1.1 $ */ public class VirtualFileUnitTestCase extends AbstractMockVFSTest { public VirtualFileUnitTestCase(String name) { super(name); } public static Test suite() { return new TestSuite(VirtualFileUnitTestCase.class); } public void testGetNameRoot() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); URI uri = context.getRootURI(); assertGetName(uri, ""); } public void testGetNameChildren() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); URI uri = context.getRootURI(); assertGetName(uri, "child1"); assertGetName(uri, "child2"); assertGetName(uri, "child3"); } public void testGetNameSubChildren() throws Exception { MockVFSContext context = registerStructuredVFSContextWithSubChildren(); URI uri = context.getRootURI(); assertGetName(uri, "child1/child1,1", "child1,1"); assertGetName(uri, "child2/child2,1", "child2,1"); assertGetName(uri, "child2/child2,2", "child2,2"); assertGetName(uri, "child3/child3,1", "child3,1"); assertGetName(uri, "child3/child3,2", "child3,2"); assertGetName(uri, "child3/child3,3", "child3,3"); } public void testGetPathNameRoot() throws Exception { MockVFSContext context = registerSimpleVFSContext(); URI uri = context.getRootURI(); assertGetPathName(uri, ""); } public void testGetPathNameChildren() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); URI uri = context.getRootURI(); assertGetPathName(uri, ""); assertGetPathName(uri, "child1"); assertGetPathName(uri, "child2"); assertGetPathName(uri, "child3"); } public void testGetPathNameSubChildren() throws Exception { MockVFSContext context = registerStructuredVFSContextWithSubChildren(); URI uri = context.getRootURI(); assertGetPathName(uri, ""); assertGetPathName(uri, "child1"); assertGetPathName(uri, "child1/child1,1"); assertGetPathName(uri, "child2"); assertGetPathName(uri, "child2/child2,1"); assertGetPathName(uri, "child2/child2,2"); assertGetPathName(uri, "child3"); assertGetPathName(uri, "child3/child3,1"); assertGetPathName(uri, "child3/child3,2"); assertGetPathName(uri, "child3/child3,3"); } public void testToURI() throws Exception { MockVFSContext context = registerStructuredVFSContextWithSubChildren(); URI uri = context.getRootURI(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child11 = getChildHandler(context, "child1/child1,1").getVirtualFile(); VirtualFile root = VFS.getRoot(uri); assertEquals(uri, root.toURI()); VirtualFile found1 = root.findChild("child1"); assertEquals(child1.toURI(), found1.toURI()); VirtualFile found11 = root.findChild("child1/child1,1"); assertEquals(child11.toURI(), found11.toURI()); } public void testToURL() throws Exception { MockVFSContext context = registerStructuredVFSContextWithSubChildren(); URL url = context.getRootURL(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child11 = getChildHandler(context, "child1/child1,1").getVirtualFile(); VirtualFile root = VFS.getRoot(url); assertEquals(url, root.toURL()); VirtualFile found1 = root.findChild("child1"); assertEquals(child1.toURL(), found1.toURL()); VirtualFile found11 = root.findChild("child1/child1,1"); assertEquals(child11.toURL(), found11.toURL()); } public void testGetLastModfied() throws Exception { MockVFSContext context = registerSimpleVFSContext(); context.getMockRoot().setLastModified(12345l); VirtualFile file = VFS.getRoot(context.getRootURI()); assertEquals(12345l, file.getLastModified()); context.getMockRoot().setLastModified(67890l); assertEquals(67890l, file.getLastModified()); } public void testGetLastModfiedIOException() throws Exception { MockVFSContext context = registerSimpleVFSContext(); context.getMockRoot().setIOException("getLastModified"); VirtualFile file = VFS.getRoot(context.getRootURI()); try { file.getLastModified(); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testGetLastModfiedClosed() throws Exception { MockVFSContext context = registerSimpleVFSContext(); VirtualFile file = VFS.getRoot(context.getRootURI()); file.close(); try { file.getLastModified(); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IllegalStateException.class, t); } } public void testGetSize() throws Exception { MockVFSContext context = registerSimpleVFSContext(); context.getMockRoot().setSize(12345l); VirtualFile file = VFS.getRoot(context.getRootURI()); assertEquals(12345l, file.getSize()); context.getMockRoot().setSize(67890l); assertEquals(67890l, file.getSize()); } public void testGetSizeIOException() throws Exception { MockVFSContext context = registerSimpleVFSContext(); context.getMockRoot().setIOException("getSize"); VirtualFile file = VFS.getRoot(context.getRootURI()); try { file.getSize(); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testGetSizeClosed() throws Exception { MockVFSContext context = registerSimpleVFSContext(); VirtualFile file = VFS.getRoot(context.getRootURI()); file.close(); try { file.getSize(); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IllegalStateException.class, t); } } public void testIsLeaf() throws Exception { MockVFSContext context = registerSimpleVFSContext(); context.getMockRoot().setLeaf(false); VirtualFile file = VFS.getRoot(context.getRootURI()); assertEquals(false, file.isLeaf()); context.getMockRoot().setLeaf(true); assertEquals(true, file.isLeaf()); } public void testIsLeafIOException() throws Exception { MockVFSContext context = registerSimpleVFSContext(); context.getMockRoot().setIOException("isLeaf"); VirtualFile file = VFS.getRoot(context.getRootURI()); try { file.isLeaf(); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testIsLeafClosed() throws Exception { MockVFSContext context = registerSimpleVFSContext(); VirtualFile file = VFS.getRoot(context.getRootURI()); file.close(); try { file.isLeaf(); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IllegalStateException.class, t); } } public void testIsHidden() throws Exception { MockVFSContext context = registerSimpleVFSContext(); context.getMockRoot().setHidden(true); VirtualFile file = VFS.getRoot(context.getRootURI()); assertEquals(true, file.isHidden()); context.getMockRoot().setHidden(false); assertEquals(false, file.isHidden()); } public void testIsHiddenIOException() throws Exception { MockVFSContext context = registerSimpleVFSContext(); context.getMockRoot().setIOException("isHidden"); VirtualFile file = VFS.getRoot(context.getRootURI()); try { file.isHidden(); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testIsHiddenClosed() throws Exception { MockVFSContext context = registerSimpleVFSContext(); VirtualFile file = VFS.getRoot(context.getRootURI()); file.close(); try { file.isHidden(); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IllegalStateException.class, t); } } public void testOpenStream() throws Exception { byte[] bytes = new byte[] { 1, 2, 3, 4, 5 }; MockVFSContext context = registerSimpleVFSContext(); context.getMockRoot().setStream(bytes); VirtualFile file = VFS.getRoot(context.getRootURI()); InputStream stream = file.openStream(); byte[] buffer = new byte[bytes.length]; stream.read(buffer); assertTrue(stream.read() == -1); assertTrue(Arrays.equals(bytes, buffer)); } public void testOpenStreamIOException() throws Exception { MockVFSContext context = registerSimpleVFSContext(); context.getMockRoot().setIOException("openStream"); VirtualFile file = VFS.getRoot(context.getRootURI()); try { file.openStream(); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testOpenStreamClosed() throws Exception { MockVFSContext context = registerSimpleVFSContext(); VirtualFile file = VFS.getRoot(context.getRootURI()); file.close(); try { file.openStream(); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IllegalStateException.class, t); } } public void testCloseStreams() throws Exception { byte[] bytes = new byte[] { 1, 2, 3, 4, 5 }; MockVFSContext context = registerSimpleVFSContext(); context.getMockRoot().setStream(bytes); VirtualFile file = VFS.getRoot(context.getRootURI()); InputStream stream = file.openStream(); assertEquals(1, stream.read()); file.closeStreams(); assertEquals(-1, stream.read()); } public void testCloseStreamViaClose() throws Exception { byte[] bytes = new byte[] { 1, 2, 3, 4, 5 }; MockVFSContext context = registerSimpleVFSContext(); context.getMockRoot().setStream(bytes); VirtualFile file = VFS.getRoot(context.getRootURI()); InputStream stream = file.openStream(); assertEquals(1, stream.read()); file.close(); assertEquals(-1, stream.read()); } public void testClose() throws Exception { MockVFSContext context = registerSimpleVFSContext(); VirtualFile file = VFS.getRoot(context.getRootURI()); file.close(); } public void testCloseDuplicate() throws Exception { MockVFSContext context = registerSimpleVFSContext(); VirtualFile file = VFS.getRoot(context.getRootURI()); file.close(); file.close(); } public void testGetVFS() throws Exception { MockVFSContext context = registerSimpleVFSContext(); VirtualFile file = VFS.getRoot(context.getRootURI()); assertEquals(context.getVFS(), file.getVFS()); } public void testGetVFSClosed() throws Exception { MockVFSContext context = registerSimpleVFSContext(); VirtualFile file = VFS.getRoot(context.getRootURI()); file.close(); try { file.getVFS(); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IllegalStateException.class, t); } } public void testGetParentRoot() throws Exception { MockVFSContext context = registerSimpleVFSContext(); VirtualFile file = VFS.getRoot(context.getRootURI()); assertNull(file.getParent()); } public void testGetParentSimpleChild() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); VirtualFile root = VFS.getRoot(context.getRootURI()); VirtualFile child = root.findChild("child1"); VirtualFile parent = child.getParent(); assertEquals(root, parent); } public void testGetParentStructuredChild() throws Exception { MockVFSContext context = registerStructuredVFSContextWithSubChildren(); VirtualFile root = VFS.getRoot(context.getRootURI()); VirtualFile child = root.findChild("child1"); VirtualFile subChild = child.findChild("child1,1"); VirtualFile parent = child.getParent(); assertEquals(root, parent); parent = subChild.getParent(); assertEquals(child, parent); } public void testGetParentIOException() throws Exception { MockVFSContext context = registerSimpleVFSContext(); context.getMockRoot().setIOException("getParent"); VirtualFile file = VFS.getRoot(context.getRootURI()); try { file.getParent(); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testGetParentClosed() throws Exception { MockVFSContext context = registerSimpleVFSContext(); VirtualFile file = VFS.getRoot(context.getRootURI()); file.close(); try { file.getParent(); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IllegalStateException.class, t); } } public void testGetAllChildren() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "child2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "child3").getVirtualFile(); VirtualFile file = VFS.getRoot(context.getRootURI()); List children = file.getChildren(); assertNotNull(children); List expected = new ArrayList(); expected.add(child1); expected.add(child2); expected.add(child3); assertEquals(expected, children); } public void testGetAllChildrenStructured() throws Exception { MockVFSContext context = registerStructuredVFSContextWithSubChildren(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "child2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "child3").getVirtualFile(); VirtualFile file = VFS.getRoot(context.getRootURI()); List children = file.getChildren(); assertNotNull(children); List expected = new ArrayList(); expected.add(child1); expected.add(child2); expected.add(child3); assertEquals(expected, children); } public void testGetAllChildrenNoChildren() throws Exception { MockVFSContext context = registerSimpleVFSContext(); context.getMockRoot().setLeaf(false); VirtualFile file = VFS.getRoot(context.getRootURI()); List children = file.getChildren(); assertNotNull(children); assertEmpty(children); } public void testGetAllChildrenIsLeaf() throws Exception { MockVFSContext context = registerSimpleVFSContext(); VirtualFile file = VFS.getRoot(context.getRootURI()); assertChildrenOnLeaf(file); } public void testGetAllChildrenIOException() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); context.getMockRoot().setIOException("getChildren"); VirtualFile file = VFS.getRoot(context.getRootURI()); try { file.getChildren(); fail("Should not be here!"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testGetAllChildrenWithNullFilter() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "child2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "child3").getVirtualFile(); VirtualFile file = VFS.getRoot(context.getRootURI()); List children = file.getChildren(null); assertNotNull(children); List expected = new ArrayList(); expected.add(child1); expected.add(child2); expected.add(child3); assertEquals(expected, children); } public void testGetAllChildrenWithNullFilterStructured() throws Exception { MockVFSContext context = registerStructuredVFSContextWithSubChildren(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "child2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "child3").getVirtualFile(); VirtualFile file = VFS.getRoot(context.getRootURI()); List children = file.getChildren(null); assertNotNull(children); List expected = new ArrayList(); expected.add(child1); expected.add(child2); expected.add(child3); assertEquals(expected, children); } public void testGetAllChildrenWithNullFilterNoChildren() throws Exception { MockVFSContext context = registerSimpleVFSContext(); context.getMockRoot().setLeaf(false); VirtualFile file = VFS.getRoot(context.getRootURI()); List children = file.getChildren(null); assertNotNull(children); assertEmpty(children); } public void testGetAllChildrenWithNullFilterIsLeaf() throws Exception { MockVFSContext context = registerSimpleVFSContext(); VirtualFile file = VFS.getRoot(context.getRootURI()); assertChildrenOnLeaf(file, null); } public void testGetAllChildrenWithNullFilterIOException() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); context.getMockRoot().setIOException("getChildren"); VirtualFile file = VFS.getRoot(context.getRootURI()); try { file.getChildren(null); fail("Should not be here!"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testGetAllChildrenWithFilter() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "child2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "child3").getVirtualFile(); VirtualFile file = VFS.getRoot(context.getRootURI()); MockVirtualFileFilter filter = new MockVirtualFileFilter(); List children = file.getChildren(filter); assertNotNull(children); List expected = new ArrayList(); expected.add(child1); expected.add(child2); expected.add(child3); assertEquals(expected, children); assertEquals(expected, filter.getVisited()); } public void testGetAllChildrenWithFilterStructured() throws Exception { MockVFSContext context = registerStructuredVFSContextWithSubChildren(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "child2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "child3").getVirtualFile(); VirtualFile file = VFS.getRoot(context.getRootURI()); MockVirtualFileFilter filter = new MockVirtualFileFilter(); List children = file.getChildren(filter); assertNotNull(children); List expected = new ArrayList(); expected.add(child1); expected.add(child2); expected.add(child3); assertEquals(expected, children); assertEquals(expected, filter.getVisited()); } public void testGetAllChildrenWithFilterNoChildren() throws Exception { MockVFSContext context = registerSimpleVFSContext(); context.getMockRoot().setLeaf(false); VirtualFile file = VFS.getRoot(context.getRootURI()); MockVirtualFileFilter filter = new MockVirtualFileFilter(); List children = file.getChildren(filter); assertNotNull(children); assertEmpty(children); assertEmpty(filter.getVisited()); } public void testGetAllChildrenWithFilterIsLeaf() throws Exception { MockVFSContext context = registerSimpleVFSContext(); VirtualFile file = VFS.getRoot(context.getRootURI()); MockVirtualFileFilter filter = new MockVirtualFileFilter(); assertChildrenOnLeaf(file, filter); } public void testGetAllChildrenWithFilterIOException() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); context.getMockRoot().setIOException("getChildren"); VirtualFile file = VFS.getRoot(context.getRootURI()); MockVirtualFileFilter filter = new MockVirtualFileFilter(); try { file.getChildren(filter); fail("Should not be here!"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testGetAllChildrenRecursively() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "child2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "child3").getVirtualFile(); VirtualFile file = VFS.getRoot(context.getRootURI()); List children = file.getChildrenRecursively(); assertNotNull(children); List expected = new ArrayList(); expected.add(child1); expected.add(child2); expected.add(child3); assertEquals(expected, children); } public void testGetAllChildrenRecursivelyStructured() throws Exception { MockVFSContext context = registerStructuredVFSContextWithSubChildren(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child11 = getChildHandler(context, "child1/child1,1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "child2").getVirtualFile(); VirtualFile child21 = getChildHandler(context, "child2/child2,1").getVirtualFile(); VirtualFile child22 = getChildHandler(context, "child2/child2,2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "child3").getVirtualFile(); VirtualFile child31 = getChildHandler(context, "child3/child3,1").getVirtualFile(); VirtualFile child32 = getChildHandler(context, "child3/child3,2").getVirtualFile(); VirtualFile child33 = getChildHandler(context, "child3/child3,3").getVirtualFile(); VirtualFile file = VFS.getRoot(context.getRootURI()); List children = file.getChildrenRecursively(); assertNotNull(children); List expected = new ArrayList(); expected.add(child1); expected.add(child11); expected.add(child2); expected.add(child21); expected.add(child22); expected.add(child3); expected.add(child31); expected.add(child32); expected.add(child33); assertEquals(expected, children); } public void testGetAllChildrenRecursivelyNoChildren() throws Exception { MockVFSContext context = registerSimpleVFSContext(); context.getMockRoot().setLeaf(false); VirtualFile file = VFS.getRoot(context.getRootURI()); List children = file.getChildrenRecursively(); assertNotNull(children); assertEmpty(children); } public void testGetAllChildrenRecursivelyIsLeaf() throws Exception { MockVFSContext context = registerSimpleVFSContext(); VirtualFile file = VFS.getRoot(context.getRootURI()); assertChildrenOnLeafRecursively(file); } public void testGetAllChildrenIOExceptionRecursively() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); context.getMockRoot().setIOException("getChildren"); VirtualFile file = VFS.getRoot(context.getRootURI()); try { file.getChildrenRecursively(); fail("Should not be here!"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testGetAllChildrenRecursivelyWithNullFilter() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "child2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "child3").getVirtualFile(); VirtualFile file = VFS.getRoot(context.getRootURI()); List children = file.getChildrenRecursively(null); assertNotNull(children); List expected = new ArrayList(); expected.add(child1); expected.add(child2); expected.add(child3); assertEquals(expected, children); } public void testGetAllChildrenRecursivelyWithNullFilterStructured() throws Exception { MockVFSContext context = registerStructuredVFSContextWithSubChildren(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child11 = getChildHandler(context, "child1/child1,1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "child2").getVirtualFile(); VirtualFile child21 = getChildHandler(context, "child2/child2,1").getVirtualFile(); VirtualFile child22 = getChildHandler(context, "child2/child2,2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "child3").getVirtualFile(); VirtualFile child31 = getChildHandler(context, "child3/child3,1").getVirtualFile(); VirtualFile child32 = getChildHandler(context, "child3/child3,2").getVirtualFile(); VirtualFile child33 = getChildHandler(context, "child3/child3,3").getVirtualFile(); VirtualFile file = VFS.getRoot(context.getRootURI()); List children = file.getChildrenRecursively(null); assertNotNull(children); List expected = new ArrayList(); expected.add(child1); expected.add(child11); expected.add(child2); expected.add(child21); expected.add(child22); expected.add(child3); expected.add(child31); expected.add(child32); expected.add(child33); assertEquals(expected, children); } public void testGetAllChildrenRecursivelyWithNullFilterNoChildren() throws Exception { MockVFSContext context = registerSimpleVFSContext(); context.getMockRoot().setLeaf(false); VirtualFile file = VFS.getRoot(context.getRootURI()); List children = file.getChildrenRecursively(null); assertNotNull(children); assertEmpty(children); } public void testGetAllChildrenRecursivelyWithNullFilterIsLeaf() throws Exception { MockVFSContext context = registerSimpleVFSContext(); VirtualFile file = VFS.getRoot(context.getRootURI()); assertChildrenOnLeafRecursively(file, null); } public void testGetAllChildrenRecursivelyWithNullFilterIOException() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); context.getMockRoot().setIOException("getChildren"); VirtualFile file = VFS.getRoot(context.getRootURI()); try { file.getChildrenRecursively(null); fail("Should not be here!"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testGetAllChildrenRecursivelyWithFilter() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "child2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "child3").getVirtualFile(); VirtualFile file = VFS.getRoot(context.getRootURI()); MockVirtualFileFilter filter = new MockVirtualFileFilter(); List children = file.getChildrenRecursively(filter); assertNotNull(children); List expected = new ArrayList(); expected.add(child1); expected.add(child2); expected.add(child3); assertEquals(expected, children); assertEquals(expected, filter.getVisited()); } public void testGetAllChildrenRecursivelyWithFilterStructured() throws Exception { MockVFSContext context = registerStructuredVFSContextWithSubChildren(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child11 = getChildHandler(context, "child1/child1,1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "child2").getVirtualFile(); VirtualFile child21 = getChildHandler(context, "child2/child2,1").getVirtualFile(); VirtualFile child22 = getChildHandler(context, "child2/child2,2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "child3").getVirtualFile(); VirtualFile child31 = getChildHandler(context, "child3/child3,1").getVirtualFile(); VirtualFile child32 = getChildHandler(context, "child3/child3,2").getVirtualFile(); VirtualFile child33 = getChildHandler(context, "child3/child3,3").getVirtualFile(); VirtualFile file = VFS.getRoot(context.getRootURI()); MockVirtualFileFilter filter = new MockVirtualFileFilter(); List children = file.getChildrenRecursively(filter); assertNotNull(children); List expected = new ArrayList(); expected.add(child1); expected.add(child11); expected.add(child2); expected.add(child21); expected.add(child22); expected.add(child3); expected.add(child31); expected.add(child32); expected.add(child33); assertEquals(expected, children); assertEquals(expected, filter.getVisited()); } public void testGetAllChildrenRecursivelyWithFilterNoChildren() throws Exception { MockVFSContext context = registerSimpleVFSContext(); context.getMockRoot().setLeaf(false); VirtualFile file = VFS.getRoot(context.getRootURI()); MockVirtualFileFilter filter = new MockVirtualFileFilter(); List children = file.getChildrenRecursively(filter); assertNotNull(children); assertEmpty(children); assertEmpty(filter.getVisited()); } public void testGetAllChildrenRecursivelyWithFilterIsLeaf() throws Exception { MockVFSContext context = registerSimpleVFSContext(); VirtualFile file = VFS.getRoot(context.getRootURI()); MockVirtualFileFilter filter = new MockVirtualFileFilter(); assertChildrenOnLeafRecursively(file, filter); } public void testGetAllChildrenRecursivelyWithFilterIOException() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); context.getMockRoot().setIOException("getChildren"); VirtualFile file = VFS.getRoot(context.getRootURI()); MockVirtualFileFilter filter = new MockVirtualFileFilter(); try { file.getChildrenRecursively(filter); fail("Should not be here!"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testVisitAllChildren() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "child2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "child3").getVirtualFile(); VirtualFile file = VFS.getRoot(context.getRootURI()); MockVirtualFileFilter filter = new MockVirtualFileFilter(); List children = file.getChildren(filter); assertNotNull(children); List expected = new ArrayList(); expected.add(child1); expected.add(child2); expected.add(child3); assertEquals(expected, children); assertEquals(expected, filter.getVisited()); } public void testVisitAllChildrenStructured() throws Exception { MockVFSContext context = registerStructuredVFSContextWithSubChildren(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "child2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "child3").getVirtualFile(); VirtualFile file = VFS.getRoot(context.getRootURI()); MockVirtualFileFilter filter = new MockVirtualFileFilter(); FilterVirtualFileVisitor visitor = new FilterVirtualFileVisitor(filter); file.visit(visitor); List expected = new ArrayList(); expected.add(child1); expected.add(child2); expected.add(child3); assertEquals(expected, filter.getVisited()); } public void testVisitAllChildrenNoChildren() throws Exception { MockVFSContext context = registerSimpleVFSContext(); context.getMockRoot().setLeaf(false); VirtualFile file = VFS.getRoot(context.getRootURI()); MockVirtualFileFilter filter = new MockVirtualFileFilter(); FilterVirtualFileVisitor visitor = new FilterVirtualFileVisitor(filter); file.visit(visitor); assertEmpty(filter.getVisited()); } public void testVisitAllChildrenIsLeaf() throws Exception { MockVFSContext context = registerSimpleVFSContext(); VirtualFile file = VFS.getRoot(context.getRootURI()); MockVirtualFileFilter filter = new MockVirtualFileFilter(); FilterVirtualFileVisitor visitor = new FilterVirtualFileVisitor(filter); file.visit(visitor); List matched = visitor.getMatched(); assertNotNull(matched); assertEmpty(matched); } public void testVisitAllChildrenNullVisitor() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); VirtualFile file = VFS.getRoot(context.getRootURI()); try { file.visit(null); fail("Should not be here!"); } catch (Throwable t) { checkThrowable(IllegalArgumentException.class, t); } } public void testVisitChildrenIOException() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); context.getMockRoot().setIOException("getChildren"); VirtualFile file = VFS.getRoot(context.getRootURI()); MockVirtualFileFilter filter = new MockVirtualFileFilter(); FilterVirtualFileVisitor visitor = new FilterVirtualFileVisitor(filter); try { file.visit(visitor); fail("Should not be here!"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testFindChildSame() throws Exception { MockVFSContext context = registerSimpleVFSContext(); context.getMockRoot().setLeaf(false); VirtualFile root = VFS.getRoot(context.getRootURI()); assertFindChild(root, "", root); } public void testFindChildChildren() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "child2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "child3").getVirtualFile(); VirtualFile root = VFS.getRoot(context.getRootURI()); assertFindChild(root, "", root); assertFindChild(root, "child1", child1); assertFindChild(root, "child2", child2); assertFindChild(root, "child3", child3); } public void testFindFolderChildren() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildrenAndNonLeafs(); VirtualFile child1 = getChildHandler(context, "folder1/child1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "folder2/child2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "folder3/child3").getVirtualFile(); VirtualFile root = VFS.getRoot(context.getRootURI()); assertFindChild(root, "", root); assertFindChild(root, "folder1/child1", child1); assertFindChild(root, "folder2/child2", child2); assertFindChild(root, "folder3/child3", child3); } public void testFindSimpleReverse() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildrenAndNonLeafs(); VirtualFile child1 = getChildHandler(context, "folder1/child1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "folder2/child2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "folder3/child3").getVirtualFile(); VirtualFile root = VFS.getRoot(context.getRootURI()); assertFindChild(root, "", root); assertFindChild(root, "folder2/../folder1/child1", child1); assertFindChild(root, "folder3/child1/../../folder2/child2", child2); assertFindChild(root, "./folder1/child1", child1); assertFindChild(root, "folder2/./child2", child2); assertFindChild(root, "././folder2/././child2", child2); try { assertFindChild(root, "../folder3/child3", child3); } catch (Exception e) { checkThrowable(IOException.class, e); } try { assertFindChild(root, "folder2/../../folder3/child3", child3); } catch (Exception e) { checkThrowable(IOException.class, e); } } public void testFindChildSubChildren() throws Exception { MockVFSContext context = registerStructuredVFSContextWithSubChildren(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child11 = getChildHandler(context, "child1/child1,1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "child2").getVirtualFile(); VirtualFile child21 = getChildHandler(context, "child2/child2,1").getVirtualFile(); VirtualFile child22 = getChildHandler(context, "child2/child2,2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "child3").getVirtualFile(); VirtualFile child31 = getChildHandler(context, "child3/child3,1").getVirtualFile(); VirtualFile child32 = getChildHandler(context, "child3/child3,2").getVirtualFile(); VirtualFile child33 = getChildHandler(context, "child3/child3,3").getVirtualFile(); VirtualFile root = VFS.getRoot(context.getRootURI()); assertFindChild(root, "", root); VirtualFile found1 = assertFindChild(root, "child1", child1); assertFindChild(root, "child1/child1,1", child11); assertFindChild(found1, "child1,1", child11); VirtualFile found2 = assertFindChild(root, "child2", child2); assertFindChild(root, "child2/child2,1", child21); assertFindChild(found2, "child2,1", child21); assertFindChild(root, "child2/child2,2", child22); assertFindChild(found2, "child2,2", child22); VirtualFile found3 = assertFindChild(root, "child3", child3); assertFindChild(root, "child3/child3,1", child31); assertFindChild(found3, "child3,1", child31); assertFindChild(root, "child3/child3,2", child32); assertFindChild(found3, "child3,2", child32); assertFindChild(root, "child3/child3,3", child33); assertFindChild(found3, "child3,3", child33); } public void testFindChildNullPath() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); VirtualFile file = VFS.getRoot(context.getRootURI()); try { file.findChild(null); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IllegalArgumentException.class, t); } } public void testFindChildSimpleDoesNotExist() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); VirtualFile file = VFS.getRoot(context.getRootURI()); try { file.findChild("doesnotexist"); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testFindChildStructuredDoesNotExist() throws Exception { MockVFSContext context = registerStructuredVFSContextWithSubChildren(); VirtualFile file = VFS.getRoot(context.getRootURI()); try { file.findChild("child1/doesnotexist"); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testFindChildIOException() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); context.getMockRoot().setIOException("getChild"); VirtualFile file = VFS.getRoot(context.getRootURI()); try { file.findChild("child1"); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testToString() throws Exception { MockVFSContext context = registerSimpleVFSContext(); VirtualFileHandler handler = context.getRoot(); VirtualFile file = VFS.getRoot(context.getRootURI()); assertEquals(handler.toString(), file.toString()); } public void testHashCode() throws Exception { MockVFSContext context = registerSimpleVFSContext(); VirtualFileHandler handler = context.getRoot(); VirtualFile file = VFS.getRoot(context.getRootURI()); assertEquals(handler.hashCode(), file.hashCode()); } public void testEquals() throws Exception { MockVFSContext context1 = createSimpleVFSContext(); MockVFSContext context2 = createSimpleVFSContext(); VirtualFile file1 = context1.getVFS().getRoot(); VirtualFile file2 = context2.getVFS().getRoot(); assertEquals(file1, file2); MockVFSContext context3 = createSimple2VFSContext(); VirtualFile file3 = context3.getVFS().getRoot(); assertFalse(file1.equals(file3)); assertFalse(file2.equals(file3)); assertFalse(file1.equals(null)); assertFalse(file1.equals(new Object())); } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/FileCleanupUnitTestCase.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/FileCleanupUnitTestCase.ja0000644000175000017500000001304211137562372033247 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2007, Red Hat Middleware LLC, and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.io.File; import java.io.IOException; import java.lang.reflect.Field; import java.net.URI; import java.net.URL; import junit.framework.Test; import org.jboss.virtual.VFS; import org.jboss.virtual.VFSUtils; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.plugins.copy.AbstractCopyMechanism; import org.jboss.virtual.plugins.cache.LRUVFSCache; import org.jboss.virtual.spi.cache.VFSCache; import org.jboss.virtual.spi.cache.VFSCacheFactory; /** * Test file closing * * @author Ales Justin */ public class FileCleanupUnitTestCase extends AbstractVFSTest { private File tempDir; public FileCleanupUnitTestCase(String name) { super(name, true, true); } protected FileCleanupUnitTestCase(String name, boolean forceCopy, boolean forceNoReaper) { super(name, forceCopy, forceNoReaper); } public static Test suite() { VFS.init(); return suite(FileCleanupUnitTestCase.class); } @Override protected void setUp() throws Exception { super.setUp(); // nullify the temp dir Class clazz = AbstractCopyMechanism.class; Field field = clazz.getDeclaredField("tempDir"); field.setAccessible(true); field.set(null, null); String tempDirKey = System.getProperty("vfs.temp.dir", "jboss.server.temp.dir"); String tempDirString = System.getProperty(tempDirKey, System.getProperty("java.io.tmpdir")) + "filecleanup"; tempDir = new File(tempDirString); if (tempDir.exists()) { deleteTempDir(); } assertTrue(tempDir.mkdir()); System.setProperty("jboss.server.temp.dir", tempDirString); VFSCache cache = new LRUVFSCache(2, 5); cache.start(); VFSCacheFactory.setInstance(cache); } @Override protected void tearDown() throws Exception { try { VFSCacheFactory.getInstance().stop(); } catch (Throwable ignored) { } finally { VFSCacheFactory.setInstance(null); } System.clearProperty("jboss.server.temp.dir"); try { deleteTempDir(); } finally { super.tearDown(); } } protected void deleteTempDir() throws IOException { // use vfs to disable possible reaper VirtualFile td = VFS.getRoot(tempDir.toURI()); td.cleanup(); td.delete(); } protected void assertTempFiles(int size) throws Exception { File dir = new File(tempDir, "vfs-nested.tmp"); File[] files = dir.listFiles(); assertNotNull(files); assertEquals(size, files.length); } protected void assertCopyMechanismFiles(int size) throws Exception { File[] files = tempDir.listFiles(); assertNotNull(files); int counter = 0; for (File dir : files) { counter += dir.listFiles().length; } assertEquals(size, counter); } protected void assertCacheExists(URI uri) throws Exception { VFSCache cache = VFSCacheFactory.getInstance(); VirtualFile file = cache.getFile(uri); assertNotNull(file); } protected void assertNoCache(URI uri) throws Exception { VFSCache cache = VFSCacheFactory.getInstance(); VirtualFile file = cache.getFile(uri); assertNull(file); } public void testNestedJarCleanup() throws Exception { URL url = getResource("/vfs/test/nested/nested.jar"); VirtualFile root = VFS.getRoot(url); assertNotNull(root); VirtualFile child = root.getChild("complex.jar"); assertNotNull(child); VirtualFile nestedChild = child.getChild("child"); assertNotNull(nestedChild); assertTempFiles(1); nestedChild.cleanup(); assertCacheExists(nestedChild.toURI()); root.cleanup(); assertTempFiles(0); assertNoCache(root.toURI()); } public void testExplicitCopyCleanup() throws Exception { URL url = getResource("/vfs/test/nested/nested.jar"); VirtualFile root = VFS.getRoot(url); assertNotNull(root); VirtualFile copy = VFSUtils.temp(root); assertNotNull(copy); assertTrue(VFSUtils.isTemporaryFile(copy)); assertCopyMechanismFiles(1); copy.cleanup(); assertCopyMechanismFiles(0); root.cleanup(); assertNoCache(root.toURI()); } }././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/CopyFileVFSUnitTestCase.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/CopyFileVFSUnitTestCase.ja0000644000175000017500000000264411001155136033141 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, Red Hat Middleware LLC, and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import junit.framework.Test; import junit.framework.TestSuite; /** * Tests of the VFS implementation * * @author ales.justin@jboss.org */ public class CopyFileVFSUnitTestCase extends FileVFSUnitTestCase { public CopyFileVFSUnitTestCase(String name) { super(name, true); } public static Test suite() { return new TestSuite(CopyFileVFSUnitTestCase.class); } }libjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/CopyJAREntryTestCase.java0000644000175000017500000000261511003575267033043 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, Red Hat Middleware LLC, and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import junit.framework.Test; /** * copy jar entry tests. * * @author Ales.Justin@jboss.org */ public class CopyJAREntryTestCase extends JAREntryTestCase { public CopyJAREntryTestCase(String name) { super(name, true); } public static Test suite() { return suite(CopyJAREntryTestCase.class); } }././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/CachePolicyVFSCacheTest.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/CachePolicyVFSCacheTest.ja0000644000175000017500000000263111104021156033074 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import org.jboss.virtual.spi.VFSContext; /** * Map VFSCache Test. * * @author Ales Justin */ public abstract class CachePolicyVFSCacheTest extends VFSCacheTest { public CachePolicyVFSCacheTest(String name) { super(name); } protected void testCachedContexts(Iterable iter) { assertFalse(iter.iterator().hasNext()); } }././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/AbstractVFSContextTest.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/AbstractVFSContextTest.jav0000644000175000017500000003067711112474030033300 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.io.IOException; import java.net.URI; import java.net.URL; import java.util.HashSet; import java.util.List; import java.util.Set; import org.jboss.test.virtual.support.MockVirtualFileHandlerVisitor; import org.jboss.virtual.VFS; import org.jboss.virtual.VFSUtils; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VirtualFileHandler; /** * AbstractVFSContextTest. * * @author Adrian Brock * @version $Revision: 1.1 $ */ public abstract class AbstractVFSContextTest extends AbstractVFSTest { public AbstractVFSContextTest(String name) { super(name); } protected abstract VFSContext getVFSContext(String name) throws Exception; protected abstract VFSContext getParentVFSContext() throws Exception; protected abstract String getSuffix(); protected abstract String getRealProtocol(); protected abstract String getRealURLEnd(); protected abstract String transformExpectedEnd(String expecetedEnd); protected abstract boolean isRealURLSupported(); /* TODO URI testing public void testRootURI() throws Exception { } */ public void testRealURL() throws Exception { try { assertRealURL("children", null, null); assertRealURL("children", "child1", null); assertRealURL("complex", null, null); assertRealURL("complex", "subfolder", null); assertRealURL("complex", "subfolder/subchild", null); assertRealURL("complex", "subfolder/subsubfolder", null); assertRealURL("complex", "subfolder/subsubfolder/subsubchild", null); assertRealURL("nested", null, null); assertRealURL("nested", "complex.jar", null); assertRealURL("nested", "complex.jar/subfolder", "complex.jar"); assertRealURL("nested", "complex.jar/subfolder/subchild", "complex.jar"); assertRealURL("nested", "complex.jar/subfolder/subsubfolder", "complex.jar"); assertRealURL("nested", "complex.jar/subfolder/subsubfolder/subsubchild", "complex.jar"); assertTrue(isRealURLSupported()); } catch (Throwable t) { assertFalse(t.getMessage(), isRealURLSupported()); } } @SuppressWarnings("deprecation") public void assertRealURL(String name, String path, String expectedEnd) throws Exception { VFSContext context = getVFSContext(name); VirtualFile root = context.getRoot().getVirtualFile(); VirtualFile file = root; if (path != null && path.length() > 0) file = root.findChild(path); URL realURL = VFSUtils.getRealURL(file); String realURLString = realURL.toExternalForm(); URL rootURL = root.toURL(); String rootURLString = rootURL.toExternalForm(); int p = rootURLString.indexOf(":/"); int l = rootURLString.length() - 1; if (rootURLString.charAt(l - 1) == '!') l--; String middle = rootURLString.substring(p, l); String end; expectedEnd = transformExpectedEnd(expectedEnd); if (expectedEnd == null) { end = (path != null) ? path : ""; } else { end = expectedEnd; } String expectedRealURL = getRealProtocol() + middle + getRealURLEnd() + end; if (expectedRealURL.endsWith("/") && realURLString.endsWith("/") == false) realURLString += "/"; if (expectedRealURL.endsWith("/") == false && realURLString.endsWith("/")) expectedRealURL += "/"; assertEquals("Different real URL:", expectedRealURL, realURLString); } public void testGetVFS() throws Exception { VFSContext context = getVFSContext("simple"); URI rootURI = context.getRootURI(); VFS vfs = context.getVFS(); VirtualFile rootFile = vfs.getRoot(); URI uri = new URI("vfs" + rootURI); URI rfUri = rootFile.toURI(); assertEquals(uri.getPath(), rfUri.getPath()); } public void testGetRoot() throws Exception { VFSContext context = getVFSContext("simple"); URI rootURI = context.getRootURI(); VirtualFileHandler rootHandler = context.getRoot(); VFS vfs = context.getVFS(); VirtualFile rootFile = vfs.getRoot(); assertEquals(rootURI, rootHandler.toURI()); assertEquals(rootHandler.getVirtualFile(), rootFile); } /* TODO getOptions public void testGetOptions() throws Exception { } */ public void testGetChildren() throws Exception { VFSContext context = getVFSContext("children"); VirtualFileHandler root = context.getRoot(); List children = context.getChildren(root, false); Set expected = new HashSet(); expected.add("child1"); expected.add("child2"); expected.add("child3"); Set actual = new HashSet(); for (VirtualFileHandler child : children) { if (child.getName().startsWith("META-INF") == false && child.getName().equals(".svn") == false) actual.add(child.getName()); } assertEquals(expected, actual); } public void testGetChildrenNullFile() throws Exception { VFSContext context = getVFSContext("complex"); try { context.getChildren(null, false); fail("Should not be here!"); } catch (Throwable t) { checkThrowable(IllegalArgumentException.class, t); } } public void testFindChildRoot() throws Exception { VFSContext context = getVFSContext("complex"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler found = context.getChild(root, ""); assertEquals(root, found); } public void testFindChild() throws Exception { VFSContext context = getVFSContext("complex"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler found = context.getChild(root, "child"); assertEquals("child", found.getPathName()); } public void testFindChildSubFolder() throws Exception { VFSContext context = getVFSContext("complex"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler found = context.getChild(root, "subfolder"); assertEquals("subfolder", found.getPathName()); } public void testFindChildSubChild() throws Exception { VFSContext context = getVFSContext("complex"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler found = context.getChild(root, "subfolder/subchild"); assertEquals("subfolder/subchild", found.getPathName()); } public void testFindChildDoesNotExist() throws Exception { VFSContext context = getVFSContext("complex"); VirtualFileHandler root = context.getRoot(); try { assertNull(context.getChild(root, "doesnotexist")); } catch (Throwable t) { checkThrowableTemp(IOException.class, t); } } public void testFindChildNullFile() throws Exception { VFSContext context = getVFSContext("complex"); try { context.getChild(null, ""); fail("Should not be here!"); } catch (Throwable t) { checkThrowable(IllegalArgumentException.class, t); } } public void testFindChildNullPath() throws Exception { VFSContext context = getVFSContext("complex"); VirtualFileHandler root = context.getRoot(); try { context.getChild(root, null); fail("Should not be here!"); } catch (Throwable t) { checkThrowable(IllegalArgumentException.class, t); } } public void testSpecialTokensOnLeaf() throws Exception { VFSContext context = getVFSContext("complex"); VirtualFileHandler root = context.getRoot(); VirtualFileHandler leaf = root.getChild("child"); assertTrue(leaf.isLeaf()); assertNotNull(leaf.getChild("..")); assertNotNull(leaf.getChild(".")); leaf = root.getChild("subfolder/subchild"); assertTrue(leaf.isLeaf()); assertNotNull(leaf.getChild("..")); assertNotNull(leaf.getChild(".")); } public void testSimpleReversePath() throws Exception { checkSpecialPath("simple" + getSuffix() + "/../complex" + getSuffix() + "/subfolder/subsubfolder/../subchild", "subchild"); } public void testComplexReversePath() throws Exception { checkSpecialPath("complex" + getSuffix() + "/../simple" + getSuffix() + "/child", "child"); } public void testDirectOverTheTop() throws Exception { checkOverTheTop(".."); } public void testMiddleOverTheTop() throws Exception { checkOverTheTop("complex" + getSuffix() + "/subfolder/../../../complex" + getSuffix() + "/subfolder"); } protected void checkOverTheTop(String path) throws Exception { try { checkSpecialPath(path, null); fail("Should not be here."); } catch(Exception e) { checkThrowable(IOException.class, e); } } public void testCurrentAtTheStart() throws Exception { checkSpecialPath("./simple" + getSuffix() + "/child", "child"); checkSpecialPath("./complex" + getSuffix() + "/subfolder/subchild", "subchild"); } public void testCurrentInTheMiddle() throws Exception { checkSpecialPath("simple" + getSuffix() + "/./child", "child"); checkSpecialPath("complex" + getSuffix() + "/./subfolder/subchild", "subchild"); } public void testConcurrentCurrent() throws Exception { checkSpecialPath("././simple" + getSuffix() + "/././child", "child"); checkSpecialPath("././complex" + getSuffix() + "/././subfolder/subchild", "subchild"); } protected void checkSpecialPath(String path, String fileName) throws Exception { VFSContext context = getParentVFSContext(); VirtualFileHandler root = context.getRoot(); VirtualFileHandler child = context.getChild(root, path); assertNotNull(child); assertTrue(child.isLeaf()); assertEquals(fileName, child.getName()); } public void testVisit() throws Exception { VFSContext context = getVFSContext("children"); VirtualFileHandler root = context.getRoot(); MockVirtualFileHandlerVisitor visitor = new MockVirtualFileHandlerVisitor(); context.visit(root, visitor); Set expected = new HashSet(); expected.add("child1"); expected.add("child2"); expected.add("child3"); Set actual = new HashSet(); for (VirtualFileHandler child : visitor.getVisited()) { if (child.getName().startsWith("META-INF") == false && child.getName().equals(".svn") == false) actual.add(child.getName()); } assertEquals(expected, actual); } public void testVisitNullHandler() throws Exception { VFSContext context = getVFSContext("children"); MockVirtualFileHandlerVisitor visitor = new MockVirtualFileHandlerVisitor(); try { context.visit(null, visitor); fail("Should not be here!"); } catch (Throwable t) { checkThrowable(IllegalArgumentException.class, t); } } public void testVisitNullVisitor() throws Exception { VFSContext context = getVFSContext("children"); VirtualFileHandler root = context.getRoot(); try { context.visit(root, null); fail("Should not be here!"); } catch (Throwable t) { checkThrowable(IllegalArgumentException.class, t); } } } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/ExceptionHandlerTestCase.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/ExceptionHandlerTestCase.j0000644000175000017500000000411411112474030033275 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.net.URL; import java.util.List; import junit.framework.Test; import org.jboss.virtual.VFS; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.plugins.context.helpers.NamesExceptionHandler; /** * ExceptionHandlerTestCase. * * @author Ales Justin */ public class ExceptionHandlerTestCase extends AbstractVFSTest { public static Test suite() { return suite(ExceptionHandlerTestCase.class); } public ExceptionHandlerTestCase(String name) { super(name, true); } public void testZipEntriesInit() throws Exception { URL url = getResource("/vfs/test"); VFS vfs = VFS.getVFS(url); vfs.setExceptionHandler(new NamesExceptionHandler("_sqljdbc.jar")); VirtualFile root = vfs.getRoot(); VirtualFile zipeinit = root.findChild("zipeinit.jar"); VirtualFile child = zipeinit.findChild("sqljdbc.jar"); List children = child.getChildren(); assertTrue(children.isEmpty()); } } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/CopyJARCacheUnitTestCase.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/CopyJARCacheUnitTestCase.j0000644000175000017500000000340311001155136033074 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2007, Red Hat Middleware LLC, and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.util.jar.Attributes; import java.util.jar.JarFile; import java.util.jar.JarOutputStream; import java.util.jar.Manifest; import junit.framework.Test; import junit.framework.TestSuite; import org.jboss.virtual.VFS; import org.jboss.virtual.VirtualFile; /** * Test the caching strategy of VFS with jar files. * * @author Ales Justin */ public class CopyJARCacheUnitTestCase extends JARCacheUnitTestCase { public CopyJARCacheUnitTestCase(String name) { super(name, true); } public static Test suite() { return suite(CopyJARCacheUnitTestCase.class); } }libjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/SoftRefCacheTestCase.java0000644000175000017500000000303511104021156033024 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import org.jboss.virtual.plugins.cache.SoftRefVFSCache; import org.jboss.virtual.spi.cache.VFSCache; import junit.framework.Test; /** * SoftRef VFSCache Test. * * @author Ales Justin */ public class SoftRefCacheTestCase extends MapVFSCacheTest { public SoftRefCacheTestCase(String name) { super(name); } public static Test suite() { return suite(SoftRefCacheTestCase.class); } protected VFSCache createCache() { return new SoftRefVFSCache(); } }libjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/VFSUtilTestCase.java0000644000175000017500000001071211112474030032026 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.net.URL; import java.util.ArrayList; import java.util.List; import junit.framework.Test; import junit.framework.TestSuite; import org.jboss.virtual.VFS; import org.jboss.virtual.VFSUtils; import org.jboss.virtual.VirtualFile; /** * VFSUtilTestCase. * * @author Ales Justin * @author anil.saldhana@jboss.com */ public class VFSUtilTestCase extends AbstractMockVFSTest { public VFSUtilTestCase(String name) { super(name); } public static Test suite() { return new TestSuite(VFSUtilTestCase.class); } public void testAddManifestLocations() throws Throwable { URL url = getResource("/vfs/test"); VirtualFile root = VFS.getRoot(url); VirtualFile file = root.getChild("badmf.jar"); assertNotNull(file); List paths = new ArrayList(); VFSUtils.addManifestLocations(file, paths); assertEquals(3, paths.size()); } public void testOptionsPropagation() throws Exception { URL url = getResource("/vfs/test"); VFS vfs = VFS.getVFS(url); VFSUtils.enableNoReaper(vfs); VirtualFile root = vfs.getRoot(); assertOption(root, "nested", VFSUtils.NO_REAPER_QUERY); assertOption(root, "nested/nested.jar", VFSUtils.NO_REAPER_QUERY); assertOption(root, "nested/nested.jar/META-INF", VFSUtils.NO_REAPER_QUERY); assertOption(root, "nested/nested.jar/META-INF/empty.txt", VFSUtils.NO_REAPER_QUERY); assertOption(root, "nested/nested.jar/complex.jar", VFSUtils.NO_REAPER_QUERY); assertOption(root, "nested/nested.jar/complex.jar/subfolder", VFSUtils.NO_REAPER_QUERY); assertOption(root, "nested/nested.jar/complex.jar/subfolder/subchild", VFSUtils.NO_REAPER_QUERY); VirtualFile subchild = root.findChild("nested/nested.jar/complex.jar/subfolder/subchild"); VFSUtils.disableNoReaper(subchild); assertNull(VFSUtils.getOption(subchild, VFSUtils.NO_REAPER_QUERY)); } protected void assertOption(VirtualFile root, String path, String optionKey) throws Exception { VirtualFile child = root.findChild(path); String optionValue = VFSUtils.getOption(root, optionKey); assertNotNull(optionValue); assertEquals(optionValue, VFSUtils.getOption(child, optionKey)); } public void testRealURL() throws Exception { //Regular jar URL url = getResource("/vfs/test"); VirtualFile root = VFS.getRoot(url); VirtualFile jarFile = root.getChild("badmf.jar"); URL vfsURL = jarFile.toURL(); assertTrue(vfsURL.toExternalForm().startsWith("vfszip")); URL realURL = VFSUtils.getRealURL(jarFile); // TODO - JBVFS-77 --> do proper tests! assertTrue(realURL.toExternalForm().startsWith("jar:")); //Nested file in a jar url = getResource("/vfs/test/nested"); root = VFS.getRoot(url); VirtualFile nestedFile = root.getChild("/nested.jar/META-INF/empty.txt"); realURL = VFSUtils.getRealURL(nestedFile); // TODO - JBVFS-77 --> do proper tests! assertTrue(realURL.toExternalForm().startsWith("jar:")); //Regular file url = getResource("/vfs/context/file/simple"); VirtualFile regularFile = VFS.getRoot(url).getChild("tomodify"); vfsURL = regularFile.toURL(); assertTrue(vfsURL.getProtocol().startsWith("vfsfile")); realURL = VFSUtils.getRealURL(regularFile); // TODO - JBVFS-77 --> do proper tests! assertTrue(realURL.toExternalForm().startsWith("file:")); } }././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/IterableTimedCacheTestCase.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/IterableTimedCacheTestCase0000644000175000017500000000310611112474030033247 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import junit.framework.Test; import org.jboss.virtual.plugins.cache.IterableTimedVFSCache; import org.jboss.virtual.spi.cache.VFSCache; /** * Iterable timed VFSCache Test. * * @author Ales Justin */ public class IterableTimedCacheTestCase extends TimedCacheTestCase { public IterableTimedCacheTestCase(String name) { super(name); } public static Test suite() { return suite(IterableTimedCacheTestCase.class); } protected VFSCache createCache() { return new IterableTimedVFSCache(5); } }libjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/FileVFSUnitTestCase.java0000644000175000017500000020240411112474030032631 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, Red Hat Middleware LLC, and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.URI; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Properties; import java.util.jar.Attributes; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.jar.JarOutputStream; import java.util.jar.Manifest; import java.util.zip.ZipInputStream; import junit.framework.Test; import junit.framework.TestSuite; import org.jboss.test.virtual.support.ClassPathIterator; import org.jboss.test.virtual.support.ClassPathIterator.ClassPathEntry; import org.jboss.test.virtual.support.MetaDataMatchFilter; import org.jboss.virtual.MemoryFileFactory; import org.jboss.virtual.VFS; import org.jboss.virtual.VFSUtils; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.VisitorAttributes; import org.jboss.virtual.plugins.context.file.FileSystemContext; import org.jboss.virtual.plugins.context.jar.NestedJarFromStream; import org.jboss.virtual.plugins.vfs.helpers.SuffixMatchFilter; import org.jboss.virtual.spi.LinkInfo; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VFSContextFactory; import org.jboss.virtual.spi.VFSContextFactoryLocator; import org.jboss.virtual.spi.VirtualFileHandler; /** * Tests of the VFS implementation * * @author Scott.Stark@jboss.org * @author adrian@jboss.org * @version $Revision: 55523 $ */ public class FileVFSUnitTestCase extends AbstractVFSTest { public FileVFSUnitTestCase(String name) { super(name); } protected FileVFSUnitTestCase(String name, boolean forceCopy) { super(name, forceCopy); } public static Test suite() { return new TestSuite(FileVFSUnitTestCase.class); } /** * Test that a VFSContextFactory can be created from the testcase CodeSource url * @throws Exception */ public void testVFSContextFactory() throws Exception { URL root = getClass().getProtectionDomain().getCodeSource().getLocation(); VFSContextFactory factory = VFSContextFactoryLocator.getFactory(root); assertTrue("VFSContextFactory(CodeSource.Location) != null", factory != null); } /** * Test that one can go from a file uri to VirtualFile and obtain the * same VirtualFile using VirtualFile vfsfile uri * @throws Exception */ public void testVFSFileURIFactory() throws Exception { URL rootURL = getClass().getProtectionDomain().getCodeSource().getLocation(); VFS rootVFS0 = VFS.getVFS(rootURL.toURI()); VirtualFile root0 = rootVFS0.getRoot(); VFS rootVFS1 = VFS.getVFS(root0.toURI()); VirtualFile root1 = rootVFS1.getRoot(); assertEquals(root0, root1); } /** * Test that NestedJarFromStream can provide access to nested jar content * @throws Exception */ public void testNestedJarFromStream() throws Exception { URL outer = getResource("/vfs/test/outer.jar"); String path = outer.getPath(); File outerJar = new File(path); assertTrue(outerJar.getAbsolutePath()+" exists", outerJar.exists()); JarFile jf = new JarFile(outerJar); URL rootURL = outerJar.getParentFile().toURL(); VFSContextFactory factory = VFSContextFactoryLocator.getFactory(rootURL); VFSContext context = factory.getVFS(rootURL); JarEntry jar1 = jf.getJarEntry("jar1.jar"); URL jar1URL = new URL(outerJar.toURL(), "jar1.jar"); VFSContextFactory pf1 = VFSContextFactoryLocator.getFactory(jar1URL); VFSContext parent1 = pf1.getVFS(jar1URL); ZipInputStream jis1 = new ZipInputStream(jf.getInputStream(jar1)); NestedJarFromStream njfs = new NestedJarFromStream(context, parent1.getRoot(), jis1, jar1URL, jf, jar1, "jar1.jar"); VirtualFileHandler e1 = njfs.getChild("org/jboss/test/vfs/support/jar1/ClassInJar1.class"); assertNotNull(e1); log.info("org/jboss/test/vfs/support/CommonClass.class: "+e1); VirtualFileHandler mfe1 = njfs.getChild("META-INF/MANIFEST.MF"); assertNotNull("jar1!/META-INF/MANIFEST.MF", mfe1); InputStream mfIS = mfe1.openStream(); Manifest mf = new Manifest(mfIS); Attributes mainAttrs = mf.getMainAttributes(); String title1 = mainAttrs.getValue(Attributes.Name.SPECIFICATION_TITLE); assertEquals("jar1", title1); mfIS.close(); njfs.close(); JarEntry jar2 = jf.getJarEntry("jar2.jar"); URL jar2URL = new URL(outerJar.toURL(), "jar2.jar"); VFSContextFactory pf2 = VFSContextFactoryLocator.getFactory(jar2URL); VFSContext parent2 = pf2.getVFS(jar2URL); ZipInputStream jis2 = new ZipInputStream(jf.getInputStream(jar2)); NestedJarFromStream njfs2 = new NestedJarFromStream(context, parent2.getRoot(), jis2, jar2URL, jf, jar2, "jar2.jar"); VirtualFileHandler e2 = njfs2.getChild("org/jboss/test/vfs/support/jar2/ClassInJar2.class"); assertNotNull(e2); log.info("org/jboss/test/vfs/support/CommonClass.class: "+e2); VirtualFileHandler mfe2 = njfs2.getChild("META-INF/MANIFEST.MF"); assertNotNull("jar2!/META-INF/MANIFEST.MF", mfe2); InputStream mf2IS = mfe2.openStream(); Manifest mf2 = new Manifest(mf2IS); Attributes mainAttrs2 = mf2.getMainAttributes(); String title2 = mainAttrs2.getValue(Attributes.Name.SPECIFICATION_TITLE); assertEquals("jar2", title2); mf2IS.close(); njfs2.close(); } /** * Test reading the contents of nested jar entries. * @throws Exception */ public void testInnerJarFile() throws Exception { URL rootURL = getResource("/vfs/test"); VFS vfs = VFS.getVFS(rootURL); VirtualFile outerjar = vfs.findChild("outer.jar"); assertTrue("outer.jar != null", outerjar != null); VirtualFile jar1 = outerjar.findChild("jar1.jar"); assertTrue("outer.jar/jar1.jar != null", jar1 != null); VirtualFile jar2 = outerjar.findChild("jar2.jar"); assertTrue("outer.jar/jar2.jar != null", jar2 != null); VirtualFile jar1MF = jar1.findChild("META-INF/MANIFEST.MF"); assertNotNull("jar1!/META-INF/MANIFEST.MF", jar1MF); InputStream mfIS = jar1MF.openStream(); Manifest mf1 = new Manifest(mfIS); Attributes mainAttrs1 = mf1.getMainAttributes(); String title1 = mainAttrs1.getValue(Attributes.Name.SPECIFICATION_TITLE); assertEquals("jar1", title1); jar1MF.close(); VirtualFile jar2MF = jar2.findChild("META-INF/MANIFEST.MF"); assertNotNull("jar2!/META-INF/MANIFEST.MF", jar2MF); InputStream mfIS2 = jar2MF.openStream(); Manifest mf2 = new Manifest(mfIS2); Attributes mainAttrs2 = mf2.getMainAttributes(); String title2 = mainAttrs2.getValue(Attributes.Name.SPECIFICATION_TITLE); assertEquals("jar2", title2); jar2MF.close(); } /** * Basic tests of accessing resources in a jar * @throws Exception */ public void testFindResource() throws Exception { URL rootURL = getResource("/vfs/test"); VFS vfs = VFS.getVFS(rootURL); VirtualFile jar = vfs.findChild("outer.jar"); assertTrue("outer.jar != null", jar != null); /* ArrayList searchCtx = new ArrayList(); searchCtx.add("outer.jar"); VirtualFile metaInf = vfs.resolveFile("META-INF/MANIFEST.MF", searchCtx); */ VirtualFile metaInf = jar.findChild("META-INF/MANIFEST.MF"); assertTrue("META-INF/MANIFEST.MF != null", metaInf != null); InputStream mfIS = metaInf.openStream(); assertTrue("META-INF/MANIFEST.MF.openStream != null", mfIS != null); Manifest mf = new Manifest(mfIS); Attributes mainAttrs = mf.getMainAttributes(); String version = mainAttrs.getValue(Attributes.Name.SPECIFICATION_VERSION); assertEquals("1.0.0.GA", version); mfIS.close(); } /** * Basic tests of accessing resources in a jar * @throws Exception */ public void testFindResourceUsingURLStream() throws Exception { URL rootURL = getResource("/vfs/test"); VFS vfs = VFS.getVFS(rootURL); VirtualFile jar = vfs.findChild("outer.jar"); assertTrue("outer.jar != null", jar != null); /* ArrayList searchCtx = new ArrayList(); searchCtx.add("outer.jar"); VirtualFile metaInf = vfs.resolveFile("META-INF/MANIFEST.MF", searchCtx); */ VirtualFile metaInf = jar.findChild("META-INF/MANIFEST.MF"); assertTrue("META-INF/MANIFEST.MF != null", metaInf != null); InputStream mfIS = metaInf.toURL().openStream(); assertTrue("META-INF/MANIFEST.MF.openStream != null", mfIS != null); Manifest mf = new Manifest(mfIS); Attributes mainAttrs = mf.getMainAttributes(); String version = mainAttrs.getValue(Attributes.Name.SPECIFICATION_VERSION); assertEquals("1.0.0.GA", version); mfIS.close(); String urlString = metaInf.toURL().toString(); URL mfURL = new URL(urlString); mfIS = mfURL.openStream(); assertTrue("META-INF/MANIFEST.MF.openStream != null", mfIS != null); mf = new Manifest(mfIS); mainAttrs = mf.getMainAttributes(); version = mainAttrs.getValue(Attributes.Name.SPECIFICATION_VERSION); assertEquals("1.0.0.GA", version); mfIS.close(); } /** * Basic tests of accessing resources in a jar that does not * have parent directory entries. * @throws Exception */ public void testFindResourceInFilesOnlyJar() throws Exception { URL rootURL = getResource("/vfs/test"); VFS vfs = VFS.getVFS(rootURL); VirtualFile jar = vfs.findChild("jar1-filesonly.jar"); assertTrue("jar1-filesonly.jar != null", jar != null); VirtualFile metaInf = jar.findChild("META-INF/MANIFEST.MF"); assertTrue("META-INF/MANIFEST.MF != null", metaInf != null); InputStream mfIS = metaInf.toURL().openStream(); assertTrue("META-INF/MANIFEST.MF.openStream != null", mfIS != null); Manifest mf = new Manifest(mfIS); Attributes mainAttrs = mf.getMainAttributes(); String version = mainAttrs.getValue(Attributes.Name.SPECIFICATION_VERSION); assertEquals("1.0.0.GA", version); String title = mf.getMainAttributes().getValue(Attributes.Name.SPECIFICATION_TITLE); assertEquals("jar1-filesonly", title); mfIS.close(); String urlString = metaInf.toURL().toString(); URL mfURL = new URL(urlString); mfIS = mfURL.openStream(); assertTrue("META-INF/MANIFEST.MF.openStream != null", mfIS != null); mf = new Manifest(mfIS); mainAttrs = mf.getMainAttributes(); version = mainAttrs.getValue(Attributes.Name.SPECIFICATION_VERSION); assertEquals("1.0.0.GA", version); title = mf.getMainAttributes().getValue(Attributes.Name.SPECIFICATION_TITLE); assertEquals("jar1-filesonly", title); mfIS.close(); } /** * Basic tests of accessing resources in a war that does not * have parent directory entries. * @throws Exception */ public void testFindResourceInFilesOnlyWar() throws Exception { URL rootURL = getResource("/vfs/test"); VFS vfs = VFS.getVFS(rootURL); VirtualFile war2 = vfs.findChild("WarDeployApp_web.war"); assertTrue("WarDeployApp_web.war != null", war2 != null); VirtualFile classes2 = war2.findChild("WEB-INF/classes"); assertTrue("WEB-INF/classes != null", classes2 != null); assertTrue("WEB-INF/classes is not a leaf", classes2.isLeaf()==false); classes2 = war2.findChild("WEB-INF/classes"); assertTrue("WEB-INF/classes != null", classes2 != null); assertTrue("WEB-INF/classes is not a leaf", classes2.isLeaf()==false); VirtualFile HelloJavaBean = classes2.findChild("com/sun/ts/tests/webservices/deploy/warDeploy/HelloJavaBean.class"); assertTrue("HelloJavaBean.class != null", HelloJavaBean != null); assertTrue("HelloJavaBean.class is a leaf", HelloJavaBean.isLeaf()); VirtualFile war = vfs.findChild("filesonly.war"); assertTrue("filesonly.war != null", war != null); VirtualFile classes = war.findChild("WEB-INF/classes"); assertTrue("WEB-INF/classes != null", classes != null); assertTrue("WEB-INF/classes is not a leaf", classes.isLeaf()==false); VirtualFile jar1 = war.findChild("WEB-INF/lib/jar1.jar"); assertTrue("WEB-INF/lib/jar1.jar != null", jar1 != null); assertTrue("WEB-INF/lib/jar1.jar is not a leaf", jar1.isLeaf()==false); VirtualFile ClassInJar1 = jar1.findChild("org/jboss/test/vfs/support/jar1/ClassInJar1.class"); assertTrue("ClassInJar1.class != null", ClassInJar1 != null); assertTrue("ClassInJar1.class is a leaf", ClassInJar1.isLeaf()); VirtualFile metaInf = war.findChild("META-INF/MANIFEST.MF"); assertTrue("META-INF/MANIFEST.MF != null", metaInf != null); InputStream mfIS = metaInf.toURL().openStream(); assertTrue("META-INF/MANIFEST.MF.openStream != null", mfIS != null); Manifest mf = new Manifest(mfIS); Attributes mainAttrs = mf.getMainAttributes(); String version = mainAttrs.getValue(Attributes.Name.SPECIFICATION_VERSION); assertEquals("1.0.0.GA", version); String title = mf.getMainAttributes().getValue(Attributes.Name.SPECIFICATION_TITLE); assertEquals("filesonly-war", title); mfIS.close(); war.findChild("WEB-INF/classes"); assertTrue("WEB-INF/classes != null", classes != null); assertTrue("WEB-INF/classes is not a leaf", classes.isLeaf()==false); } /** * Validate iterating over a vfs url from a files only war. * * @throws Exception */ public void testFindClassesInFilesOnlyWar() throws Exception { URL rootURL = getResource("/vfs/test"); VFS vfs = VFS.getVFS(rootURL); VirtualFile war = vfs.findChild("filesonly.war"); assertTrue("filesonly.war != null", war != null); VirtualFile classes = war.findChild("WEB-INF/classes"); assertTrue("WEB-INF/classes != null", classes != null); HashSet names = new HashSet(); ClassPathIterator iter = new ClassPathIterator(classes.toURL()); ClassPathEntry entry = null; while( (entry = iter.getNextEntry()) != null ) { names.add(entry.name); } log.debug(names); assertTrue("org/jboss/test/vfs/support/jar1", names.contains("org/jboss/test/vfs/support/jar1")); assertTrue("ClassInJar1.class", names.contains("org/jboss/test/vfs/support/jar1/ClassInJar1.class")); assertTrue("ClassInJar1$InnerClass.class", names.contains("org/jboss/test/vfs/support/jar1/ClassInJar1$InnerClass.class")); } public void testFindResourceUnpackedJar() throws Exception { URL rootURL = getResource("/vfs/test"); VFS vfs = VFS.getVFS(rootURL); VirtualFile jar = vfs.findChild("unpacked-outer.jar"); assertTrue("unpacked-outer.jar != null", jar != null); /** ArrayList searchCtx = new ArrayList(); searchCtx.add("unpacked-outer.jar"); VirtualFile metaInf = vfs.resolveFile("META-INF/MANIFEST.MF", searchCtx); */ VirtualFile metaInf = jar.findChild("META-INF/MANIFEST.MF"); assertTrue("META-INF/MANIFEST.MF != null", metaInf != null); InputStream mfIS = metaInf.openStream(); assertTrue("META-INF/MANIFEST.MF.openStream != null", mfIS != null); Manifest mf = new Manifest(mfIS); Attributes mainAttrs = mf.getMainAttributes(); String version = mainAttrs.getValue(Attributes.Name.SPECIFICATION_VERSION); assertEquals("1.0.0.GA", version); mfIS.close(); } /** * Test simple file resolution without search contexts * @throws Exception */ public void testResolveFile() throws Exception { log.info("+++ testResolveFile, cwd="+(new File(".").getCanonicalPath())); URL rootURL = getResource("/vfs/test"); VFS vfs = VFS.getVFS(rootURL); // Check resolving the root file VirtualFile root = vfs.findChild(""); assertEquals("root name", "test", root.getName()); assertEquals("root path", "", root.getPathName()); assertFalse("root isDirectory", root.isLeaf()); // Find the outer.jar VirtualFile outerJar = vfs.findChild("outer.jar"); assertNotNull("outer.jar", outerJar); assertEquals("outer.jar name", "outer.jar", outerJar.getName()); assertEquals("outer.jar path", "outer.jar", outerJar.getPathName()); VirtualFile outerJarMF = vfs.findChild("outer.jar/META-INF/MANIFEST.MF"); assertNotNull("outer.jar/META-INF/MANIFEST.MF", outerJarMF); // Test a non-canonical path rootURL = getResource("/vfs/sundry/../test"); // Check resolving the root file root = vfs.findChild(""); assertEquals("root name", "test", root.getName()); assertEquals("root path", "", root.getPathName()); assertFalse("root isDirectory", root.isLeaf()); } /** * Validate resolving a .class file given a set of search contexts in the * vfs that make up a classpath. * * @throws Exception */ public void testResolveClassFileInClassPath() throws Exception { log.info("+++ testResolveFile, cwd="+(new File(".").getCanonicalPath())); URL rootURL = getResource("/vfs/test"); VFS vfs = VFS.getVFS(rootURL); // Find ClassInJar1.class VirtualFile vf = vfs.findChild("jar1.jar"); VirtualFile c1 = vf.findChild("org/jboss/test/vfs/support/jar1/ClassInJar1.class"); assertNotNull("ClassInJar1.class VF", c1); log.debug("Found ClassInJar1.class: "+c1); // Find ClassInJar1$InnerClass.class VirtualFile c1i = vf.findChild("org/jboss/test/vfs/support/jar1/ClassInJar1$InnerClass.class"); assertNotNull("ClassInJar1$InnerClass.class VF", c1i); log.debug("Found ClassInJar1$InnerClass.class: "+c1i); // Find ClassInJar2.class vf = vfs.findChild("jar2.jar"); VirtualFile c2 = vf.findChild("org/jboss/test/vfs/support/jar2/ClassInJar2.class"); assertNotNull("ClassInJar2.class VF", c2); log.debug("Found ClassInJar2.class: "+c2); } public void testResolveFileInUnpackedJar() throws Exception { log.info("+++ testResolveFileInUnpackedJar, cwd="+(new File(".").getCanonicalPath())); URL rootURL = getResource("/vfs/test"); VFS vfs = VFS.getVFS(rootURL); // Check resolving the root file VirtualFile root = vfs.findChild(""); assertEquals("root name", "test", root.getName()); assertEquals("root path", "", root.getPathName()); assertFalse("root isDirectory", root.isLeaf()); // Find the outer.jar VirtualFile outerJar = vfs.findChild("unpacked-outer.jar"); assertNotNull("unpacked-outer.jar", outerJar); assertEquals("unpacked-outer.jar name", "unpacked-outer.jar", outerJar.getName()); assertEquals("unpacked-outer.jar path", "unpacked-outer.jar", outerJar.getPathName()); VirtualFile outerJarMF = vfs.findChild("unpacked-outer.jar/META-INF/MANIFEST.MF"); assertNotNull("unpacked-outer.jar/META-INF/MANIFEST.MF", outerJarMF); // Check resolving the root file root = vfs.findChild(""); assertEquals("root name", "test", root.getName()); assertEquals("root path", "", root.getPathName()); assertFalse("root isDirectory", root.isLeaf()); } public void testFileNotFoundInUnpackedJar() throws Exception { URL rootURL = getResource("/vfs/test"); VFS vfs = VFS.getVFS(rootURL); // Find the outer.jar VirtualFile outerJar = vfs.findChild("unpacked-outer.jar"); assertNotNull("unpacked-outer.jar", outerJar); assertNull(outerJar.getChild("WEB-INF")); } public void testNestedNestedParent() throws Exception { // TODO } public void testCopyNestedStream() throws Exception { // TODO } /* public void testNoCopyNestedStream() throws Exception { URL rootURL = getResource("/vfs/seam/jboss-seam-booking.ear"); VFS vfs = VFS.getVFS(rootURL); VirtualFile clazz = vfs.getChild("lib/commons-beanutils.jar/org/apache/commons/beanutils/BeanComparator.class"); assertNotNull(clazz); URL url = clazz.toURL(); InputStream is = url.openStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] tmp = new byte[1024]; int read = 0; while ( (read = is.read(tmp)) >= 0 ) baos.write(tmp, 0, read); byte[] bytes = baos.toByteArray(); int size = bytes.length; System.out.println("size = " + size); } */ /** * Test file resolution with nested jars * @throws Exception */ public void testInnerJar() throws Exception { URL rootURL = getResource("/vfs/test"); VFS vfs = VFS.getVFS(rootURL); VirtualFile inner = vfs.findChild("outer.jar/jar1.jar"); log.info("IsFile: "+inner.isLeaf()); log.info(inner.getLastModified()); List contents = inner.getChildren(); // META-INF/*, org/jboss/test/vfs/support/jar1/* at least assertTrue("jar1.jar children.length("+contents.size()+") >= 2", contents.size() >= 2); for(VirtualFile vf : contents) { log.info(" "+vf.getName()); } VirtualFile vf = vfs.findChild("outer.jar/jar1.jar"); VirtualFile jar1MF = vf.findChild("META-INF/MANIFEST.MF"); InputStream mfIS = jar1MF.openStream(); Manifest mf = new Manifest(mfIS); Attributes mainAttrs = mf.getMainAttributes(); String version = mainAttrs.getValue(Attributes.Name.SPECIFICATION_TITLE); assertEquals(Attributes.Name.SPECIFICATION_TITLE.toString(), "jar1", version); mfIS.close(); } public void testInnerJarUsingURLStream() throws Exception { URL rootURL = getResource("/vfs/test"); VFS vfs = VFS.getVFS(rootURL); VirtualFile inner = vfs.findChild("outer.jar/jar1.jar"); log.info("IsFile: "+inner.isLeaf()); log.info(inner.getLastModified()); List contents = inner.getChildren(); // META-INF/*, org/jboss/test/vfs/support/jar1/* at least assertTrue("jar1.jar children.length("+contents.size()+") >= 2", contents.size() >= 2); for(VirtualFile vf : contents) { log.info(" "+vf.getName()); } VirtualFile vf = vfs.findChild("outer.jar/jar1.jar"); VirtualFile jar1MF = vf.findChild("META-INF/MANIFEST.MF"); InputStream mfIS = jar1MF.toURL().openStream(); Manifest mf = new Manifest(mfIS); Attributes mainAttrs = mf.getMainAttributes(); String version = mainAttrs.getValue(Attributes.Name.SPECIFICATION_TITLE); assertEquals(Attributes.Name.SPECIFICATION_TITLE.toString(), "jar1", version); mfIS.close(); } /** * Test a scan of the outer.jar vfs to locate all .class files * @throws Exception */ public void testClassScan() throws Exception { URL rootURL = getResource("/vfs/test/outer.jar"); VFS vfs = VFS.getVFS(rootURL); HashSet expectedClasses = new HashSet(); expectedClasses.add("jar1.jar/org/jboss/test/vfs/support/jar1/ClassInJar1.class"); expectedClasses.add("jar1.jar/org/jboss/test/vfs/support/jar1/ClassInJar1$InnerClass.class"); expectedClasses.add("jar1-filesonly.jar/org/jboss/test/vfs/support/jar1/ClassInJar1.class"); expectedClasses.add("jar1-filesonly.jar/org/jboss/test/vfs/support/jar1/ClassInJar1$InnerClass.class"); expectedClasses.add("jar2.jar/org/jboss/test/vfs/support/jar2/ClassInJar2.class"); expectedClasses.add("org/jboss/test/vfs/support/CommonClass.class"); super.enableTrace("org.jboss.virtual.plugins.vfs.helpers.SuffixMatchFilter"); SuffixMatchFilter classVisitor = new SuffixMatchFilter(".class", VisitorAttributes.RECURSE); List classes = vfs.getChildren(classVisitor); int count = 0; for (VirtualFile cf : classes) { String path = cf.getPathName(); if( path.endsWith(".class") ) { assertTrue(path, expectedClasses.contains(path)); count ++; } } assertEquals("There were 6 classes", 6, count); } /** * Test a scan of the unpacked-outer.jar vfs to locate all .class files * @throws Exception */ public void testClassScanUnpacked() throws Exception { URL rootURL = getResource("/vfs/test/unpacked-outer.jar"); VFS vfs = VFS.getVFS(rootURL); HashSet expectedClasses = new HashSet(); expectedClasses.add("jar1.jar/org/jboss/test/vfs/support/jar1/ClassInJar1.class"); expectedClasses.add("jar1.jar/org/jboss/test/vfs/support/jar1/ClassInJar1$InnerClass.class"); expectedClasses.add("jar2.jar/org/jboss/test/vfs/support/jar2/ClassInJar2.class"); // FIXME: .class files are not being copied from the resources directory expectedClasses.add("org/jboss/test/vfs/support/CommonClass.class"); super.enableTrace("org.jboss.virtual.plugins.vfs.helpers.SuffixMatchFilter"); SuffixMatchFilter classVisitor = new SuffixMatchFilter(".class", VisitorAttributes.RECURSE); List classes = vfs.getChildren(classVisitor); int count = 0; for (VirtualFile cf : classes) { String path = cf.getPathName(); if( path.endsWith(".class") ) { assertTrue(path, expectedClasses.contains(path)); count ++; } } assertEquals("There were 4 classes", 4, count); } /** * Test a scan of the jar1-filesonly.jar vfs to locate all .class files * @throws Exception */ public void testClassScanFilesonly() throws Exception { URL rootURL = getResource("/vfs/test/jar1-filesonly.jar"); VFS vfs = VFS.getVFS(rootURL); HashSet expectedClasses = new HashSet(); expectedClasses.add("org/jboss/test/vfs/support/jar1/ClassInJar1.class"); expectedClasses.add("org/jboss/test/vfs/support/jar1/ClassInJar1$InnerClass.class"); super.enableTrace("org.jboss.virtual.plugins.vfs.helpers.SuffixMatchFilter"); SuffixMatchFilter classVisitor = new SuffixMatchFilter(".class", VisitorAttributes.RECURSE); List classes = vfs.getChildren(classVisitor); int count = 0; for (VirtualFile cf : classes) { String path = cf.getPathName(); if( path.endsWith(".class") ) { assertTrue(path, expectedClasses.contains(path)); count ++; } } assertEquals("There were 2 classes", 2, count); // Make sure we can walk path-wise to the class VirtualFile parent = vfs.getRoot(); String className = "org/jboss/test/vfs/support/jar1/ClassInJar1.class"; VirtualFile classInJar1 = vfs.findChild(className); String[] paths = className.split("/"); StringBuilder vfsPath = new StringBuilder(); for(String path : paths) { vfsPath.append(path); VirtualFile vf = parent.findChild(path); if( path.equals("ClassInJar1.class") ) assertEquals("ClassInJar1.class", classInJar1, vf); else { assertEquals("vfsPath", vfsPath.toString(), vf.getPathName()); // why should this be equal? // assertEquals("lastModified", classInJar1.getLastModified(), vf.getLastModified()); assertTrue("lastModified", classInJar1.getLastModified() <= vf.getLastModified()); } vfsPath.append('/'); parent = vf; } } /** * Test access of directories in a jar that only stores files * @throws Exception */ public void testFilesOnlyJar() throws Exception { URL rootURL = getResource("/vfs/test"); VFS vfs = VFS.getVFS(rootURL); VirtualFile jar = vfs.findChild("jar1-filesonly.jar"); VirtualFile metadataLocation = jar.findChild("META-INF"); assertNotNull(metadataLocation); VirtualFile mfFile = metadataLocation.findChild("MANIFEST.MF"); assertNotNull(mfFile); InputStream is = mfFile.openStream(); Manifest mf = new Manifest(is); mfFile.close(); String title = mf.getMainAttributes().getValue(Attributes.Name.SPECIFICATION_TITLE); assertEquals(Attributes.Name.SPECIFICATION_TITLE.toString(), "jar1-filesonly", title); // Retry starting from the jar root mfFile = jar.findChild("META-INF/MANIFEST.MF"); is = mfFile.openStream(); mf = new Manifest(is); mfFile.close(); title = mf.getMainAttributes().getValue(Attributes.Name.SPECIFICATION_TITLE); assertEquals(Attributes.Name.SPECIFICATION_TITLE.toString(), "jar1-filesonly", title); } /** * Test the serialization of VirtualFiles * @throws Exception */ public void testVFSerialization() throws Exception { File tmpRoot = File.createTempFile("vfs", ".root"); tmpRoot.delete(); tmpRoot.mkdir(); tmpRoot.deleteOnExit(); File tmp = new File(tmpRoot, "vfs.ser"); tmp.createNewFile(); tmp.deleteOnExit(); log.info("+++ testVFSerialization, tmp="+tmp.getCanonicalPath()); URL rootURL = tmpRoot.toURL(); VFS vfs = VFS.getVFS(rootURL); VirtualFile tmpVF = vfs.findChild("vfs.ser"); FileOutputStream fos = new FileOutputStream(tmp); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(tmpVF); oos.close(); // Check the tmpVF attributes against the tmp file long lastModified = tmp.lastModified(); long size = tmp.length(); String name = tmp.getName(); String vfsPath = tmp.getPath(); vfsPath = vfsPath.substring(tmpRoot.getPath().length()+1); URL url = new URL("vfs" + tmp.toURL()); log.debug("name: "+name); log.debug("vfsPath: "+vfsPath); log.debug("url: "+url); log.debug("lastModified: "+lastModified); log.debug("size: "+size); assertEquals("name", name, tmpVF.getName()); assertEquals("pathName", vfsPath, tmpVF.getPathName()); assertEquals("lastModified", lastModified, tmpVF.getLastModified()); assertEquals("size", size, tmpVF.getSize()); assertEquals("url", url, tmpVF.toURL()); assertEquals("isLeaf", true, tmpVF.isLeaf()); assertEquals("isHidden", false, tmpVF.isHidden()); // Read in the VF from the serialized file FileInputStream fis = new FileInputStream(tmp); ObjectInputStream ois = new ObjectInputStream(fis); VirtualFile tmpVF2 = (VirtualFile) ois.readObject(); ois.close(); // Validated the deserialized attribtes against the tmp file assertEquals("name", name, tmpVF2.getName()); assertEquals("pathName", vfsPath, tmpVF2.getPathName()); assertEquals("lastModified", lastModified, tmpVF2.getLastModified()); assertEquals("size", size, tmpVF2.getSize()); assertEquals("url", url, tmpVF2.toURL()); assertEquals("isLeaf", true, tmpVF2.isLeaf()); assertEquals("isHidden", false, tmpVF2.isHidden()); } /** * Test the serialization of VirtualFiles representing a jar * @throws Exception */ public void testVFJarSerialization() throws Exception { File tmpRoot = File.createTempFile("vfs", ".root"); tmpRoot.delete(); tmpRoot.mkdir(); tmpRoot.deleteOnExit(); // Create a test jar containing a txt file File tmpJar = new File(tmpRoot, "tst.jar"); tmpJar.createNewFile(); tmpJar.deleteOnExit(); FileOutputStream fos = new FileOutputStream(tmpJar); JarOutputStream jos = new JarOutputStream(fos); // Write a text file to include in a test jar JarEntry txtEntry = new JarEntry("tst.txt"); jos.putNextEntry(txtEntry); txtEntry.setSize("testVFJarSerialization".length()); txtEntry.setTime(System.currentTimeMillis()); jos.write("testVFJarSerialization".getBytes()); jos.close(); log.info("+++ testVFJarSerialization, tmp="+tmpJar.getCanonicalPath()); URI rootURI = tmpRoot.toURI(); VFS vfs = VFS.getVFS(rootURI); File vfsSer = new File(tmpRoot, "vfs.ser"); vfsSer.createNewFile(); vfsSer.deleteOnExit(); VirtualFile tmpVF = vfs.findChild("tst.jar"); // Validate the vf jar against the tmp file attributes long lastModified = tmpJar.lastModified(); long size = tmpJar.length(); String name = tmpJar.getName(); String vfsPath = tmpJar.getPath(); vfsPath = vfsPath.substring(tmpRoot.getPath().length()+1); URL url = new URL("vfs" + tmpJar.toURL()); //url = JarUtils.createJarURL(url); log.debug("name: "+name); log.debug("vfsPath: "+vfsPath); log.debug("url: "+url); log.debug("lastModified: "+lastModified); log.debug("size: "+size); assertEquals("name", name, tmpVF.getName()); assertEquals("pathName", vfsPath, tmpVF.getPathName()); assertEquals("lastModified", lastModified, tmpVF.getLastModified()); assertEquals("size", size, tmpVF.getSize()); assertEquals("url", url.getPath(), tmpVF.toURL().getPath()); // TODO: these should pass //assertEquals("isFile", true, tmpVF.isFile()); //assertEquals("isDirectory", false, tmpVF.isDirectory()); assertEquals("isHidden", false, tmpVF.isHidden()); // Write out the vfs jar file fos = new FileOutputStream(vfsSer); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(tmpVF); oos.close(); // Read in the VF from the serialized file FileInputStream fis = new FileInputStream(vfsSer); ObjectInputStream ois = new ObjectInputStream(fis); VirtualFile tmpVF2 = (VirtualFile) ois.readObject(); ois.close(); // Validate the vf jar against the tmp file attributes assertEquals("name", name, tmpVF2.getName()); assertEquals("pathName", vfsPath, tmpVF2.getPathName()); assertEquals("lastModified", lastModified, tmpVF2.getLastModified()); assertEquals("size", size, tmpVF2.getSize()); assertEquals("url", url.getPath(), tmpVF2.toURL().getPath()); // TODO: these should pass //assertEquals("isFile", true, tmpVF2.isFile()); //assertEquals("isDirectory", false, tmpVF2.isDirectory()); assertEquals("isHidden", false, tmpVF2.isHidden()); } /** * Test the serialization of VirtualFiles representing a jar * @throws Exception */ public void testVFNestedJarSerialization() throws Exception { // this expects to be run with a working dir of the container root URL rootURL = getResource("/vfs/test"); VFS vfs = VFS.getVFS(rootURL); VirtualFile inner = vfs.findChild("outer.jar/jar1.jar"); File vfsSer = File.createTempFile("testVFNestedJarSerialization", ".ser"); vfsSer.deleteOnExit(); // Write out the vfs inner jar file FileOutputStream fos = new FileOutputStream(vfsSer); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(inner); oos.close(); // Read in the VF from the serialized file FileInputStream fis = new FileInputStream(vfsSer); ObjectInputStream ois = new ObjectInputStream(fis); inner = (VirtualFile) ois.readObject(); ois.close(); List contents = inner.getChildren(); // META-INF/*, org/jboss/test/vfs/support/jar1/* at least // TODO - fix this once no_copy serialization is working int size = isForceCopyEnabled(inner) ? 2 : 0; assertTrue("jar1.jar children.length("+contents.size()+") is not " + size, contents.size() >= size); for(VirtualFile vf : contents) { log.info(" "+vf.getName()); } VirtualFile vf = vfs.findChild("outer.jar/jar1.jar"); /* VirtualFile jar1MF = vf.findChild("META-INF/MANIFEST.MF"); InputStream mfIS = jar1MF.openStream(); Manifest mf = new Manifest(mfIS); Attributes mainAttrs = mf.getMainAttributes(); String version = mainAttrs.getValue(Attributes.Name.SPECIFICATION_TITLE); assertEquals(Attributes.Name.SPECIFICATION_TITLE.toString(), "jar1", version); mfIS.close(); */ } /** * Test parsing of a vfs link properties file. It contains test.classes.url * and test.lib.url system property references that are configured to * point to the CodeSource location of this class and /vfs/sundry/jar/ * respectively. * * @throws Exception */ public void testVfsLinkProperties() throws Exception { URL linkURL = super.getResource("/vfs/links/test-link.war.vfslink.properties"); assertNotNull("vfs/links/test-link.war.vfslink.properties", linkURL); // Find resources to use as the WEB-INF/{classes,lib} link targets URL classesURL = getClass().getProtectionDomain().getCodeSource().getLocation(); assertNotNull("classesURL", classesURL); System.setProperty("test.classes.url", classesURL.toString()); URL libURL = super.getResource("/vfs/sundry/jar"); assertNotNull("libURL", libURL); System.setProperty("test.lib.url", libURL.toString()); assertTrue("isLink", VFSUtils.isLink(linkURL.getPath())); Properties props = new Properties(); InputStream linkIS = linkURL.openStream(); List infos = VFSUtils.readLinkInfo(linkIS, linkURL.getPath(), props); assertEquals("LinkInfo count", 2, infos.size()); LinkInfo classesInfo = null; LinkInfo libInfo = null; for(LinkInfo info :infos) { if( info.getName().equals("WEB-INF/classes") ) classesInfo = info; else if(info.getName().equals("WEB-INF/lib") ) libInfo = info; } assertNotNull("classesInfo", classesInfo); assertEquals("classesInfo.target", classesURL.toURI(), classesInfo.getLinkTarget()); assertNotNull("libInfo", libInfo); assertEquals("libInfo.target", libURL.toURI(), libInfo.getLinkTarget()); } /** * Test the test-link.war link * @throws Exception */ public void testWarLink() throws Exception { // Find resources to use as the WEB-INF/{classes,lib} link targets URL classesURL = getClass().getProtectionDomain().getCodeSource().getLocation(); assertNotNull("classesURL", classesURL); System.setProperty("test.classes.url", classesURL.toString()); URL libURL = super.getResource("/vfs/sundry/jar"); assertNotNull("libURL", libURL); System.setProperty("test.lib.url", libURL.toString()); // Root the vfs at the link file parent directory URL linkURL = super.getResource("/vfs/links/test-link.war.vfslink.properties"); File linkFile = new File(linkURL.toURI()); File vfsRoot = linkFile.getParentFile(); assertNotNull("vfs/links/test-link.war.vfslink.properties", linkURL); VFS vfs = VFS.getVFS(vfsRoot.toURI()); // We should find the test-link.war the link represents VirtualFile war = vfs.findChild("test-link.war"); assertNotNull("war", war); // Validate the WEB-INF/classes child link VirtualFile classes = war.findChild("WEB-INF/classes"); String classesName = classes.getName(); String classesPathName = classes.getPathName(); boolean classesIsDirectory = classes.isLeaf() == false; assertEquals("classes.name", "classes", classesName); assertEquals("classes.pathName", "test-link.war/WEB-INF/classes", classesPathName); assertEquals("classes.isDirectory", true, classesIsDirectory); // Should be able to find this class since classes points to out codesource VirtualFile thisClass = classes.findChild("org/jboss/test/virtual/test/FileVFSUnitTestCase.class"); assertEquals("FileVFSUnitTestCase.class", thisClass.getName()); // Validate the WEB-INF/lib child link VirtualFile lib = war.findChild("WEB-INF/lib"); String libName = lib.getName(); String libPathName = lib.getPathName(); boolean libIsDirectory = lib.isLeaf() == false; assertEquals("lib.name", "lib", libName); assertEquals("lib.pathName", "test-link.war/WEB-INF/lib", libPathName); assertEquals("lib.isDirectory", true, libIsDirectory); // Should be able to find archive.jar under lib VirtualFile archiveJar = lib.findChild("archive.jar"); assertEquals("archive.jar", archiveJar.getName()); } /** * Test configuration change detection on test-link.war link * @throws Exception */ public void testWarLinkUpdate() throws Exception { // Setup the system properties used in test-link.war.vfslink.properties URL classesURL = getClass().getProtectionDomain().getCodeSource().getLocation(); assertNotNull("classesURL", classesURL); System.setProperty("test.classes.url", classesURL.toString()); URL libURL = super.getResource("/vfs/sundry/jar"); assertNotNull("libURL", libURL); System.setProperty("test.lib.url", libURL.toString()); // Root the vfs at the link file parent directory URL linkURL = super.getResource("/vfs/links/test-link.war.vfslink.properties"); File linkFile = new File(linkURL.toURI()); assertNotNull("vfs/links/test-link.war.vfslink.properties", linkURL); // Setup VFS root in a temp directory File root = File.createTempFile("jboss-vfs-testWarLinkUpdate", ".tmp"); root.delete(); root.mkdir(); log.info("Using root: "+root); // There should be no test-link.war under the new tmp root VFS vfs = VFS.getVFS(root.toURI()); VirtualFile link = vfs.getChild("test-link.war"); assertNull("test-link.war", link); // Add the link properties, now test-link.war should exist File propsFile = new File(root, "test-link.war.vfslink.properties"); VFSUtils.copyStreamAndClose(new FileInputStream(linkFile), new FileOutputStream(propsFile)); link = vfs.getChild("test-link.war"); assertNotNull("test-link.war", link); List children = link.getChildren(); assertEquals("test-link.war has 1 child", 1, children.size()); assertEquals("WEB-INF has 2 children", 2, children.get(0).getChildren().size()); // Sleep 1sec+ to allow timestamp changes in files to be > 1000ms, JBVFS-59 Thread.sleep(1005); // modify properties file - add more children URL dynamicClassRoot = new URL("vfsmemory", ".vfslink-test", ""); MemoryFileFactory.createRoot(dynamicClassRoot); ByteArrayOutputStream baos = new ByteArrayOutputStream(); PrintWriter webOut = new PrintWriter(new OutputStreamWriter(baos, "UTF-8")); webOut.println(""); webOut.println(""); webOut.println(""); webOut.close(); MemoryFileFactory.putFile(dynamicClassRoot, baos.toByteArray()); PrintWriter out = new PrintWriter(new OutputStreamWriter(new FileOutputStream(propsFile, true))); out.println("vfs.link.name.2=WEB-INF/web.xml"); out.println("vfs.link.target.2=" + dynamicClassRoot.toExternalForm()); out.close(); Properties linkProps = new Properties(); InputStream propsIn = new FileInputStream(propsFile); linkProps.load(propsIn); assertEquals(1+3*2, linkProps.size()); assertEquals("vfs.link.name.0", "WEB-INF/classes", linkProps.getProperty("vfs.link.name.0")); assertEquals("vfs.link.name.1", "WEB-INF/lib", linkProps.getProperty("vfs.link.name.1")); assertEquals("vfs.link.name.2", "WEB-INF/web.xml", linkProps.getProperty("vfs.link.name.2")); assertEquals("vfs.link.target.2", dynamicClassRoot.toExternalForm(), linkProps.getProperty("vfs.link.target.2")); propsIn.close(); // You need to get a new reference to LinkHandler - to get up-to-date configuration children = link.getChildren(); assertEquals("test-link.war has 1 child", 1, children.size()); log.info("WEB-INF children after update: "+children.get(0).getChildren()); assertEquals("WEB-INF has 3 children", 3, children.get(0).getChildren().size()); // Sleep 1sec+ to allow timestamp changes in files to be > 1000ms, JBVFS-59 Thread.sleep(1005); // modify properties file - remove all but first BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(propsFile))); baos = new ByteArrayOutputStream(); out = new PrintWriter(new OutputStreamWriter(baos)); String line = in.readLine(); while(line != null) { if (line.indexOf(".0=") != -1) out.println(line); line = in.readLine(); } out.close(); in.close(); FileOutputStream fos = new FileOutputStream(propsFile); fos.write(baos.toByteArray()); fos.close(); children = link.getChildren(); assertEquals("test-link.war has 1 child", 1, children.size()); assertEquals("WEB-INF has 1 child", 1, children.get(0).getChildren().size()); // Sleep 1sec+ to allow timestamp changes in files to be > 1000ms, JBVFS-59 Thread.sleep(1005); // modify properties file - remove all fos = new FileOutputStream(propsFile); fos.write(' '); fos.close(); assertNotNull(link.getName() + " not null", link); assertTrue(link.getName() + " exists()", link.exists()); children = link.getChildren(); assertTrue("Wrong number of children", children.size() == 0); // remove properties file assertTrue(propsFile.getName() + " delete()", propsFile.delete()); assertFalse(link.getName() + " exists() == false", link.exists()); VirtualFile oldLink = link; link = vfs.getChild("test-link.war"); assertNull(oldLink.getName() + " is null", link); children = vfs.getChildren(); assertTrue("Wrong number of children", children.size() == 0); // put back .vfslink.properties VFSUtils.copyStreamAndClose(new FileInputStream(linkFile), new FileOutputStream(propsFile)); assertTrue(oldLink.getName() + " exists()", oldLink.exists()); link = vfs.getChild("test-link.war"); assertNotNull("test-link.war", link); children = link.getChildren(); assertTrue("Wrong number of children", children.size() == 1); assertTrue("Wrong number of WEB-INF link children", children.get(0).getChildren().size() == 2); } /** * Test that the URL of a VFS corresponding to a directory ends in '/' so that * URLs created relative to it are under the directory. This requires that * build-test.xml artifacts exist. * * @throws Exception */ public void testDirURLs() throws Exception { URL rootURL = getResource("/vfs/test"); VFS vfs = VFS.getVFS(rootURL); VirtualFile outerJar = vfs.findChild("unpacked-outer.jar"); URL outerURL = outerJar.toURL(); log.debug("outerURL: "+outerURL); assertTrue(outerURL+" ends in '/'", outerURL.getPath().endsWith("/")); // Validate that jar1 is under unpacked-outer.jar URL jar1URL = new URL(outerURL, "jar1.jar"); log.debug("jar1URL: "+jar1URL+", path="+jar1URL.getPath()); assertTrue("jar1URL path ends in unpacked-outer.jar/jar1.jar!/", jar1URL.getPath().endsWith("unpacked-outer.jar/jar1.jar")); VirtualFile jar1 = outerJar.findChild("jar1.jar"); assertEquals(jar1URL.getPath(), jar1.toURL().getPath()); VirtualFile packedJar = vfs.findChild("jar1.jar"); jar1URL = packedJar.findChild("org/jboss/test/vfs/support").toURL(); assertTrue("Jar directory entry URLs must end in /: " + jar1URL.toString(), jar1URL.toString().endsWith("/")); } /** * Test that the URI of a VFS corresponding to a directory ends in '/' so that * URIs created relative to it are under the directory. This requires that * build-test.xml artifacts exist. * * @throws Exception */ public void testDirURIs() throws Exception { URL rootURL = getResource("/vfs/test"); VFS vfs = VFS.getVFS(rootURL); VirtualFile outerJar = vfs.findChild("unpacked-outer.jar"); URI outerURI = outerJar.toURI(); log.debug("outerURI: "+outerURI); assertTrue(outerURI+" ends in '/'", outerURI.getPath().endsWith("/")); // Validate that jar1 is under unpacked-outer.jar URI jar1URI = new URI(outerURI+"jar1.jar"); log.debug("jar1URI: "+jar1URI+", path="+jar1URI.getPath()); assertTrue("jar1URI path ends in unpacked-outer.jar/jar1.jar!/", jar1URI.getPath().endsWith("unpacked-outer.jar/jar1.jar")); VirtualFile jar1 = outerJar.findChild("jar1.jar"); assertEquals(jar1URI.getPath(), jar1.toURI().getPath()); VirtualFile packedJar = vfs.findChild("jar1.jar"); jar1URI = packedJar.findChild("org/jboss/test/vfs/support").toURI(); assertTrue("Jar directory entry URLs must end in /: " + jar1URI.toString(), jar1URI.toString().endsWith("/")); } /** * Test copying a jar * * @throws Exception */ public void testCopyJar() throws Exception { URL rootURL = getResource("/vfs/test"); VFS vfs = VFS.getVFS(rootURL); VirtualFile jar = vfs.findChild("outer.jar"); assertTrue("outer.jar != null", jar != null); File tmpJar = File.createTempFile("testCopyJar", ".jar"); tmpJar.deleteOnExit(); try { InputStream is = jar.openStream(); FileOutputStream fos = new FileOutputStream(tmpJar); byte[] buffer = new byte[1024]; int read; while( (read = is.read(buffer)) > 0 ) { fos.write(buffer, 0, read); } fos.close(); log.debug("outer.jar size is: "+jar.getSize()); log.debug(tmpJar.getAbsolutePath()+" size is: "+tmpJar.length()); assertTrue("outer.jar > 0", jar.getSize() > 0); assertEquals("copy jar size", jar.getSize(), tmpJar.length()); jar.close(); } finally { try { tmpJar.delete(); } catch(Exception ignore) { } } } /** * Test copying a jar that is nested in another jar. * * @throws Exception */ public void testCopyInnerJar() throws Exception { URL rootURL = getResource("/vfs/test"); VFS vfs = VFS.getVFS(rootURL); VirtualFile outerjar = vfs.findChild("outer.jar"); assertTrue("outer.jar != null", outerjar != null); VirtualFile jar = outerjar.findChild("jar1.jar"); assertTrue("outer.jar/jar1.jar != null", jar != null); File tmpJar = File.createTempFile("testCopyInnerJar", ".jar"); tmpJar.deleteOnExit(); try { InputStream is = jar.openStream(); FileOutputStream fos = new FileOutputStream(tmpJar); byte[] buffer = new byte[1024]; int read; while( (read = is.read(buffer)) > 0 ) { fos.write(buffer, 0, read); } fos.close(); log.debug("outer.jar/jar1.jar size is: "+jar.getSize()); log.debug(tmpJar.getAbsolutePath()+" size is: "+tmpJar.length()); assertTrue("outer.jar > 0", jar.getSize() > 0); assertEquals("copy jar size", jar.getSize(), tmpJar.length()); jar.close(); } finally { try { tmpJar.delete(); } catch(Exception ignore) { } } } /** * Test that the outermf.jar manifest classpath is parsed * correctly. * * @throws Exception */ public void testManifestClasspath() throws Exception { URL rootURL = getResource("/vfs/test"); VFS vfs = VFS.getVFS(rootURL); VirtualFile outerjar = vfs.findChild("outermf.jar"); assertNotNull("outermf.jar != null", outerjar); ArrayList cp = new ArrayList(); VFSUtils.addManifestLocations(outerjar, cp); // The p0.jar should be found in the classpath assertEquals("cp size 2", 2, cp.size()); assertEquals("jar1.jar == cp[0]", "jar1.jar", cp.get(0).getName()); assertEquals("jar2.jar == cp[1]", "jar2.jar", cp.get(1).getName()); } /** * Test that an inner-inner jar that is extracted does not blowup * the addManifestLocations routine. * * @throws Exception */ public void testInnerManifestClasspath() throws Exception { URL rootURL = getResource("/vfs/test"); VFS vfs = VFS.getVFS(rootURL); VirtualFile outerjar = vfs.getChild("withalong/rootprefix/outermf.jar"); assertNotNull(outerjar); VirtualFile jar1 = outerjar.getChild("jar1.jar"); assertNotNull(jar1); VirtualFile jar2 = outerjar.getChild("jar2.jar"); assertNotNull(jar2); VirtualFile innerjar = outerjar.getChild("innermf.jar"); assertNotNull("innermf.jar != null", innerjar); ArrayList cp = new ArrayList(); VFSUtils.addManifestLocations(innerjar, cp); assertEquals(2, cp.size()); VirtualFile cp0 = cp.get(0); assertEquals(jar1, cp0); VirtualFile cp1 = cp.get(1); assertEquals(jar2, cp1); } /** * Validate accessing an packed jar vf and its uri when the vfs path * contains spaces * @throws Exception */ public void testJarWithSpacesInPath() throws Exception { URL rootURL = getResource("/vfs/test"); VFS vfs = VFS.getVFS(rootURL); VirtualFile tstjar = vfs.findChild("path with spaces/tst.jar"); assertNotNull("tstjar != null", tstjar); URI uri = tstjar.toURI(); URI expectedURI = new URI("vfs"+rootURL.toString()+"/path%20with%20spaces/tst.jar"); assertEquals(uri.getPath(), expectedURI.getPath()); InputStream is = uri.toURL().openStream(); is.close(); tstjar = vfs.findChild("path with spaces/tst%20nospace.jar"); assertNotNull("tstjar != null", tstjar); uri = tstjar.toURI(); expectedURI = new URI("vfs"+rootURL.toString()+"/path%20with%20spaces/tst%2520nospace.jar"); assertEquals(uri.getPath(), expectedURI.getPath()); is = uri.toURL().openStream(); is.close(); } public static void main(String[] args) throws Exception { File file = new File("C:\\Documents and Settings"); System.out.println(file.toURI()); System.out.println(file.toURL().getHost()); URI uri = new URI("file", null, "/Document and Settings", null); System.out.println(uri); } /** * Validate accessing an unpacked jar vf and its uri when the vfs path * contains spaces * @throws Exception */ public void testUnpackedJarWithSpacesInPath() throws Exception { URL rootURL = getResource("/vfs/test"); VFS vfs = VFS.getVFS(rootURL); VirtualFile tstjar = vfs.findChild("path with spaces/unpacked-tst.jar"); assertNotNull("tstjar != null", tstjar); URI uri = tstjar.toURI(); URI expectedURI = new URI("vfs" + rootURL.toString()+"/path%20with%20spaces/unpacked-tst.jar/"); assertEquals(uri, expectedURI); } /** * Tests that we can find the META-INF/some-data.xml in an unpacked deployment * * @throws Exception for any error */ public void testGetMetaDataUnpackedJar() throws Exception { testGetMetaDataFromJar("unpacked-with-metadata.jar"); } /** * Tests that we can find the META-INF/some-data.xml in a packed deployment * * @throws Exception for any error */ public void testGetMetaDataPackedJar() throws Exception { testGetMetaDataFromJar("with-metadata.jar"); } private void testGetMetaDataFromJar(String name) throws Exception { URL rootURL = getResource("/vfs/test"); VFS vfs = VFS.getVFS(rootURL); VirtualFile jar = vfs.findChild(name); assertNotNull(jar); VirtualFile metadataLocation = jar.findChild("META-INF"); assertNotNull(metadataLocation); VirtualFile metadataByName = metadataLocation.findChild("some-data.xml"); assertNotNull(metadataByName); //This is the same code as is called by AbstractDeploymentContext.getMetaDataFiles(String name, String suffix). //The MetaDataMatchFilter is a copy of the one used there List metaDataList = metadataLocation.getChildren(new MetaDataMatchFilter(null, "-data.xml")); assertNotNull(metaDataList); assertEquals("Wrong size", 1, metaDataList.size()); } /** * Validate that a URLClassLoader.findReource/getResourceAsStream calls for non-existing absolute * resources that should fail as expected with null results. Related to JBMICROCONT-139. * * @throws Exception */ public void testURLClassLoaderFindResourceFailure() throws Exception { URL rootURL = getResource("/vfs/test"); VFS vfs = VFS.getVFS(rootURL); URL[] cp = {vfs.getRoot().toURL()}; URLClassLoader ucl = new URLClassLoader(cp); // Search for a non-existent resource URL qp = ucl.findResource("nosuch-quartz.props"); assertNull("findResource(nosuch-quartz.props)", qp); InputStream is = ucl.getResourceAsStream("nosuch-quartz.props"); assertNull("getResourceAsStream(nosuch-quartz.props)", is); } /** * Test VirtualFile.exists for vfsfile based urls. * * @throws Exception */ public void testFileExists() throws Exception { File tmpRoot = File.createTempFile("vfs", ".root"); tmpRoot.delete(); tmpRoot.mkdir(); File tmp = File.createTempFile("testFileExists", null, tmpRoot); log.info("+++ testFileExists, tmp="+tmp.getCanonicalPath()); URL rootURL = tmpRoot.toURL(); VFS vfs = VFS.getVFS(rootURL); VirtualFile tmpVF = vfs.findChild(tmp.getName()); assertTrue(tmpVF.getPathName()+".exists()", tmpVF.exists()); assertTrue("tmp.delete()", tmpVF.delete()); assertFalse(tmpVF.getPathName()+".exists()", tmpVF.exists()); assertTrue(tmpRoot+".delete()", tmpRoot.delete()); } /** * Test VirtualFile.exists for vfsfile based urls for a directory. * * @throws Exception */ public void testDirFileExists() throws Exception { File tmpRoot = File.createTempFile("vfs", ".root"); tmpRoot.delete(); tmpRoot.mkdir(); File tmp = File.createTempFile("testFileExists", null, tmpRoot); assertTrue(tmp+".delete()", tmp.delete()); assertTrue(tmp+".mkdir()", tmp.mkdir()); log.info("+++ testDirFileExists, tmp="+tmp.getCanonicalPath()); URL rootURL = tmpRoot.toURL(); VFS vfs = VFS.getVFS(rootURL); VirtualFile tmpVF = vfs.findChild(tmp.getName()); assertTrue(tmpVF.getPathName()+".exists()", tmpVF.exists()); assertFalse(tmpVF.getPathName()+".isLeaf()", tmpVF.isLeaf()); assertTrue(tmp+".delete()", tmp.delete()); assertFalse(tmpVF.getPathName()+".exists()", tmpVF.exists()); assertTrue(tmpRoot+".delete()", tmpRoot.delete()); } /** * Test VirtualFile.exists for vfsjar based urls. * * @throws Exception */ public void testJarExists() throws Exception { File tmpRoot = File.createTempFile("vfs", ".root"); tmpRoot.delete(); tmpRoot.mkdir(); File tmpJar = File.createTempFile("testJarExists", ".jar", tmpRoot); log.info("+++ testJarExists, tmpJar="+tmpJar.getCanonicalPath()); Manifest mf = new Manifest(); mf.getMainAttributes().putValue("Created-By", "FileVFSUnitTestCase.testJarExists"); FileOutputStream fos = new FileOutputStream(tmpJar); JarOutputStream jos = new JarOutputStream(fos, mf); jos.setComment("testJarExists"); jos.setLevel(0); jos.close(); URL rootURL = tmpRoot.toURL(); VFS vfs = VFS.getVFS(rootURL); VirtualFile tmpVF = vfs.findChild(tmpJar.getName()); assertTrue(tmpVF.getPathName()+".exists()", tmpVF.exists()); assertTrue(tmpVF.getPathName()+".size() > 0", tmpVF.getSize() > 0); assertTrue("tmp.delete()", tmpVF.delete()); assertFalse(tmpVF.getPathName()+".exists()", tmpVF.exists()); assertTrue(tmpRoot+".delete()", tmpRoot.delete()); } /** * Test VirtualFile.exists for vfsjar based urls for a directory. * * @throws Exception */ public void testDirJarExists() throws Exception { File tmpRoot = File.createTempFile("vfs", ".root"); tmpRoot.delete(); tmpRoot.mkdir(); File tmp = File.createTempFile("testDirJarExists", ".jar", tmpRoot); assertTrue(tmp+".delete()", tmp.delete()); assertTrue(tmp+".mkdir()", tmp.mkdir()); log.info("+++ testDirJarExists, tmp="+tmp.getCanonicalPath()); URL rootURL = tmpRoot.toURL(); VFS vfs = VFS.getVFS(rootURL); VirtualFile tmpVF = vfs.findChild(tmp.getName()); log.info(tmpVF); assertTrue(tmpVF.getPathName()+".exists()", tmpVF.exists()); assertFalse(tmpVF.getPathName()+".isLeaf()", tmpVF.isLeaf()); assertTrue(tmp+".delete()", tmp.delete()); assertFalse(tmpVF.getPathName()+".exists()", tmpVF.exists()); assertTrue(tmpRoot+".delete()", tmpRoot.delete()); } /** * Test VirtualFile.delete() for file based urls * * @throws Exception */ public void testFileDelete() throws Exception { File tmpRoot = File.createTempFile("vfs", ".root"); VFS vfs = VFS.getVFS(tmpRoot.toURL()); VirtualFile root = vfs.getRoot(); // non-existent directory - exists() not tmpRoot.delete(); assertFalse(tmpRoot + ".exits() == false", root.exists()); // existing directory - exists(), delete() tmpRoot.mkdir(); assertTrue(tmpRoot + ".exits()", root.exists()); assertTrue(tmpRoot + ".delete()", root.delete()); tmpRoot.mkdir(); // non-empty directory - delete() File tmp = new File(tmpRoot, "testFileDelete.jar"); assertTrue(tmp.mkdir()); File tmp2 = File.createTempFile("testFileDelete2", ".jar", tmp); assertTrue(tmp2.exists()); VirtualFile tmpDeletable = VFS.getRoot(tmp.toURI()); assertTrue(tmpRoot + ".delete() == false", tmpDeletable.delete()); // create child to vfs assertTrue(tmp.mkdir()); // children() exist List children = vfs.getChildren(); assertTrue(tmpRoot + ".getChildren().size() == 1", children.size() == 1); // specific child exists(), delete(), exists() not VirtualFile tmpVF = vfs.getChild(tmp.getName()); assertTrue(tmp + ".exists()", tmpVF.exists()); assertTrue(tmp + ".delete()", tmpVF.delete()); assertFalse(tmp + ".exists() == false", tmpVF.exists()); // children() don't exist children = vfs.getChildren(); assertTrue(tmpRoot + ".getChildren().size() == 0", children.size() == 0); // getChild() returns null tmpVF = vfs.getChild(tmp.getName()); assertNull(tmpRoot + ".getChild('" + tmp.getName() + "') == null", tmpVF); // directory delete() assertTrue(tmpRoot + ".delete()", root.delete()); } /** * Test for caseSensitive=true * * If this test passes on unixes, it doesn't mean much, because there it should pass without * case sensitivity turned on as well. * * If it passes on windows, it means the functionality works as expected. * * @throws Exception for any error */ public void testCaseSensitive() throws Exception { URL rootURL = getResource("/vfs"); FileSystemContext ctx = new FileSystemContext(new URL(rootURL.toString() + "?caseSensitive=true")); VirtualFileHandler root = ctx.getRoot(); String path = "context/file/simple/child"; VirtualFileHandler child = root.getChild(path); assertTrue("getChild('" + path + "')", child != null); path = "context/file/simple/CHILD"; child = root.getChild(path); assertTrue("getChild('" + path + "')", child == null); path = "context/jar/archive.jar"; child = root.getChild(path); assertTrue("getChild('" + path + "')", child != null); path = "context/JAR/archive.jar"; child = root.getChild(path); assertTrue("getChild('" + path + "')", child == null); path = "context/jar/archive.JAR"; child = root.getChild(path); assertTrue("getChild('" + path + "')", child == null); path = "context/jar/archive.jar/child"; child = root.getChild(path); assertTrue("getChild('" + path + "')", child != null); path = "context/jar/archive.jar/CHILD"; child = root.getChild(path); assertTrue("getChild('" + path + "')", child == null); } } libjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/VFSUnitTestCase.java0000644000175000017500000012564611112474030032045 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.io.IOException; import java.net.URI; import java.net.URL; import java.util.ArrayList; import java.util.List; import junit.framework.Test; import junit.framework.TestSuite; import org.jboss.test.virtual.support.MockURLStreamHandler; import org.jboss.test.virtual.support.MockVFSContext; import org.jboss.test.virtual.support.MockVirtualFileFilter; import org.jboss.virtual.VFS; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.VFSUtils; import org.jboss.virtual.plugins.vfs.helpers.FilterVirtualFileVisitor; /** * VFSUnitTestCase. * * @author Adrian Brock * @version $Revision: 1.1 $ */ public class VFSUnitTestCase extends AbstractMockVFSTest { public VFSUnitTestCase(String name) { super(name); } public static Test suite() { return new TestSuite(VFSUnitTestCase.class); } public void testVFSOptions() throws Exception { URL url = getResource("/vfs/test"); VFS vfs = VFS.getVFS(url); // currently we don't test any vfs root's behavior VFSUtils.enableCopy(vfs); VFSUtils.disableCopy(vfs); VFSUtils.enableNoReaper(vfs); VFSUtils.disableNoReaper(vfs); VFSUtils.enableCaseSensitive(vfs); VFSUtils.disableCaseSensitive(vfs); } public void testGetVFSURI() throws Exception { MockVFSContext context = registerSimpleVFSContext(); MockVFSContext context2 = registerSimple2VFSContext(); VFS vfs = VFS.getVFS(context.getRootURI()); assertNotNull(vfs); assertEquals(context.getVFS(), vfs); VFS vfs2 = VFS.getVFS(context2.getRootURI()); assertNotNull(vfs2); assertEquals(context2.getVFS(), vfs2); } public void testGetVFSURINull() throws Exception { try { VFS.getVFS((URI) null); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IllegalArgumentException.class, t); } } public void testGetVFSURINoFactory() throws Exception { try { URI uri = new URI("doesnotexist:///"); VFS.getVFS(uri); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testGetVFSURIIOException() throws Exception { MockVFSContext context = registerSimpleVFSContext(); mockVFSContextFactory.setIOException("getVFSURI"); try { VFS.getVFS(context.getRootURI()); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testGetVFSURL() throws Exception { MockVFSContext context = registerSimpleVFSContext(); MockVFSContext context2 = registerSimple2VFSContext(); VFS vfs = VFS.getVFS(context.getRootURL()); assertNotNull(vfs); assertEquals(context.getVFS(), vfs); VFS vfs2 = VFS.getVFS(context2.getRootURL()); assertNotNull(vfs2); assertEquals(context2.getVFS(), vfs2); } public void testGetVFSURLNull() throws Exception { try { VFS.getVFS((URL) null); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IllegalArgumentException.class, t); } } public void testGetVFSURLNoFactory() throws Exception { try { URL url = new URL("doesnotexist", "", 0, "", MockURLStreamHandler.INSTANCE); VFS.getVFS(url); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testGetVFSURLIOException() throws Exception { MockVFSContext context = registerSimpleVFSContext(); mockVFSContextFactory.setIOException("getVFSURL"); try { VFS.getVFS(context.getRootURL()); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testGetRootURI() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); VirtualFile file = VFS.getRoot(context.getRootURI()); assertNotNull(file); assertEquals(context.getRoot().getVirtualFile(), file); } public void testGetRootURINullURI() throws Exception { try { VFS.getRoot((URI) null); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IllegalArgumentException.class, t); } } public void testGetRootURINoFactory() throws Exception { try { URI uri = new URI("doesnotexist:///"); VFS.getRoot(uri); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testGetRootURIIOExceptionGetVFS() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); mockVFSContextFactory.setIOException("getVFSURI"); try { VFS.getRoot(context.getRootURI()); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testGetRootURIIOExceptionGetRoot() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); context.setIOException("getRoot"); try { VFS.getRoot(context.getRootURI()); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testGetVirtualFileURIRoot() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); VirtualFile file = VFS.getVirtualFile(context.getRootURI(), ""); assertNotNull(file); assertEquals(context.getRoot().getVirtualFile(), file); } public void testGetVirtualFileURIChildren() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "child2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "child3").getVirtualFile(); VirtualFile file1 = VFS.getVirtualFile(context.getRootURI(), "child1"); assertNotNull(file1); assertEquals(child1, file1); VirtualFile file2 = VFS.getVirtualFile(context.getRootURI(), "child2"); assertNotNull(file2); assertEquals(child2, file2); VirtualFile file3 = VFS.getVirtualFile(context.getRootURI(), "child3"); assertNotNull(file3); assertEquals(child3, file3); } public void testGetVirtualFileURINullURI() throws Exception { try { VFS.getVirtualFile((URI) null, ""); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IllegalArgumentException.class, t); } } public void testGetVirtualFileURINullPath() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); try { VFS.getVirtualFile(context.getRootURI(), null); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IllegalArgumentException.class, t); } } public void testGetVirtualFileURINoFactory() throws Exception { try { URI uri = new URI("doesnotexist:///"); VFS.getVirtualFile(uri, ""); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testGetVirtualFileURIDoesNotExist() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); try { VFS.getVirtualFile(context.getRootURI(), "doesnotexist"); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testGetVirtualFileURIIOExceptionGetVFS() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); mockVFSContextFactory.setIOException("getVFSURI"); try { VFS.getVirtualFile(context.getRootURI(), "child1"); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testGetVirtualFileURIIOExceptionFindChild() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); context.getMockRoot().setIOException("getChild"); try { VFS.getVirtualFile(context.getRootURI(), "child1"); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testGetRootURL() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); VirtualFile file = VFS.getRoot(context.getRootURL()); assertNotNull(file); assertEquals(context.getRoot().getVirtualFile(), file); } public void testGetRootURLNullURL() throws Exception { try { VFS.getRoot((URL) null); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IllegalArgumentException.class, t); } } public void testGetRootURLNoFactory() throws Exception { URL url = new URL("doesnotexist", "", 0, "", MockURLStreamHandler.INSTANCE); try { VFS.getRoot(url); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testGetRootURLIOExceptionGetVFS() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); mockVFSContextFactory.setIOException("getVFSURL"); URL url = context.getRootURL(); try { VFS.getRoot(url); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testGetRootURLIOExceptionGetRoot() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); context.setIOException("getRoot"); URL url = context.getRootURL(); try { VFS.getRoot(url); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testGetVirtualFileURLRoot() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); VirtualFile file = VFS.getVirtualFile(context.getRootURL(), ""); assertNotNull(file); assertEquals(context.getRoot().getVirtualFile(), file); } public void testGetVirtualFileURLChildren() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "child2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "child3").getVirtualFile(); VirtualFile file1 = VFS.getVirtualFile(context.getRootURL(), "child1"); assertNotNull(file1); assertEquals(child1, file1); VirtualFile file2 = VFS.getVirtualFile(context.getRootURL(), "child2"); assertNotNull(file2); assertEquals(child2, file2); VirtualFile file3 = VFS.getVirtualFile(context.getRootURL(), "child3"); assertNotNull(file3); assertEquals(child3, file3); } public void testGetVirtualFileURLNullURL() throws Exception { try { VFS.getVirtualFile((URL) null, ""); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IllegalArgumentException.class, t); } } public void testGetVirtualFileURLNullPath() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); try { VFS.getVirtualFile(context.getRootURL(), null); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IllegalArgumentException.class, t); } } public void testGetVirtualFileURLNoFactory() throws Exception { try { URL url = new URL("doesnotexist", "", 0, "", MockURLStreamHandler.INSTANCE); VFS.getVirtualFile(url, ""); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testGetVirtualFileURLIOExceptionGetVFS() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); mockVFSContextFactory.setIOException("getVFSURL"); try { VFS.getVirtualFile(context.getRootURL(), "child1"); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testGetVirtualFileURLDoesNotExist() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); try { VFS.getVirtualFile(context.getRootURL(), "doesnotexist"); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testGetVirtualFileURLIOExceptionFindChild() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); context.getMockRoot().setIOException("getChild"); try { VFS.getVirtualFile(context.getRootURL(), "child1"); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testGetRoot() throws Exception { MockVFSContext context = registerSimpleVFSContext(); VFS vfs = VFS.getVFS(context.getRootURI()); assertNotNull(vfs); VirtualFile root = vfs.getRoot(); assertNotNull(root); assertEquals(context.getRoot().getVirtualFile(), root); } public void testGetRootIOException() throws Exception { MockVFSContext context = registerSimpleVFSContext(); context.setIOException("getRoot"); VFS vfs = VFS.getVFS(context.getRootURI()); assertNotNull(vfs); try { vfs.getRoot(); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testFindChildRoot() throws Exception { MockVFSContext context = registerSimpleVFSContext(); context.getMockRoot().setLeaf(false); VFS vfs = VFS.getVFS(context.getRootURI()); assertFindChild(vfs, "", vfs.getRoot()); } public void testFindChildChildren() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "child2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "child3").getVirtualFile(); VFS vfs = VFS.getVFS(context.getRootURI()); assertFindChild(vfs, "child1", child1); assertFindChild(vfs, "child2", child2); assertFindChild(vfs, "child3", child3); } public void testFindChildSubChildren() throws Exception { MockVFSContext context = registerStructuredVFSContextWithSubChildren(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child11 = getChildHandler(context, "child1/child1,1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "child2").getVirtualFile(); VirtualFile child21 = getChildHandler(context, "child2/child2,1").getVirtualFile(); VirtualFile child22 = getChildHandler(context, "child2/child2,2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "child3").getVirtualFile(); VirtualFile child31 = getChildHandler(context, "child3/child3,1").getVirtualFile(); VirtualFile child32 = getChildHandler(context, "child3/child3,2").getVirtualFile(); VirtualFile child33 = getChildHandler(context, "child3/child3,3").getVirtualFile(); VFS vfs = VFS.getVFS(context.getRootURI()); assertFindChild(vfs, "child1", child1); assertFindChild(vfs, "child1/child1,1", child11); assertFindChild(vfs, "child2", child2); assertFindChild(vfs, "child2/child2,1", child21); assertFindChild(vfs, "child2/child2,2", child22); assertFindChild(vfs, "child3", child3); assertFindChild(vfs, "child3/child3,1", child31); assertFindChild(vfs, "child3/child3,2", child32); assertFindChild(vfs, "child3/child3,3", child33); } public void testFindChildNullPath() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); try { VFS vfs = VFS.getVFS(context.getRootURI()); vfs.findChild(null); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IllegalArgumentException.class, t); } } public void testGetChildNullPath() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); try { VFS vfs = VFS.getVFS(context.getRootURI()); vfs.getChild(null); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IllegalArgumentException.class, t); } } public void testFindChildSimpleDoesNotExist() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); VFS vfs = VFS.getVFS(context.getRootURI()); try { vfs.findChild("doesnotexist"); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IOException.class, t); assertNull(vfs.getChild("doesnotexist")); } } public void testFindChildStructuredDoesNotExist() throws Exception { MockVFSContext context = registerStructuredVFSContextWithSubChildren(); VFS vfs = VFS.getVFS(context.getRootURI()); try { vfs.findChild("child1/doesnotexist"); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IOException.class, t); assertNull(vfs.getChild("child1/doesnotexist")); } } public void testFindChildIOException() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); context.getMockRoot().setIOException("getChild"); try { VFS vfs = VFS.getVFS(context.getRootURI()); vfs.findChild("child1"); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testGetChildIOException() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); context.getMockRoot().setIOException("getChild"); try { VFS vfs = VFS.getVFS(context.getRootURI()); vfs.getChild("child1"); fail("Should not be here"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testGetAllChildren() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "child2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "child3").getVirtualFile(); VFS vfs = VFS.getVFS(context.getRootURI()); List children = vfs.getChildren(); assertNotNull(children); List expected = new ArrayList(); expected.add(child1); expected.add(child2); expected.add(child3); assertEquals(expected, children); } public void testGetAllChildrenStructured() throws Exception { MockVFSContext context = registerStructuredVFSContextWithSubChildren(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "child2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "child3").getVirtualFile(); VFS vfs = VFS.getVFS(context.getRootURI()); List children = vfs.getChildren(); assertNotNull(children); List expected = new ArrayList(); expected.add(child1); expected.add(child2); expected.add(child3); assertEquals(expected, children); } public void testGetAllChildrenNoChildren() throws Exception { MockVFSContext context = registerSimpleVFSContext(); context.getMockRoot().setLeaf(false); VFS vfs = VFS.getVFS(context.getRootURI()); List children = vfs.getChildren(); assertNotNull(children); assertEmpty(children); } public void testGetAllChildrenIsLeaf() throws Exception { MockVFSContext context = registerSimpleVFSContext(); VFS vfs = VFS.getVFS(context.getRootURI()); assertChildrenOnLeaf(vfs); } public void testGetAllChildrenIOException() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); context.getMockRoot().setIOException("getChildren"); VFS vfs = VFS.getVFS(context.getRootURI()); try { vfs.getChildren(); fail("Should not be here!"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testGetAllChildrenWithNullFilter() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "child2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "child3").getVirtualFile(); VFS vfs = VFS.getVFS(context.getRootURI()); List children = vfs.getChildren(null); assertNotNull(children); List expected = new ArrayList(); expected.add(child1); expected.add(child2); expected.add(child3); assertEquals(expected, children); } public void testGetAllChildrenWithNullFilterStructured() throws Exception { MockVFSContext context = registerStructuredVFSContextWithSubChildren(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "child2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "child3").getVirtualFile(); VFS vfs = VFS.getVFS(context.getRootURI()); List children = vfs.getChildren(null); assertNotNull(children); List expected = new ArrayList(); expected.add(child1); expected.add(child2); expected.add(child3); assertEquals(expected, children); } public void testGetAllChildrenWithNullFilterNoChildren() throws Exception { MockVFSContext context = registerSimpleVFSContext(); context.getMockRoot().setLeaf(false); VFS vfs = VFS.getVFS(context.getRootURI()); List children = vfs.getChildren(null); assertNotNull(children); assertEmpty(children); } public void testGetAllChildrenWithNullFilterIsLeaf() throws Exception { MockVFSContext context = registerSimpleVFSContext(); VFS vfs = VFS.getVFS(context.getRootURI()); assertChildrenOnLeaf(vfs, null); } public void testGetAllChildrenWithNullFilterIOException() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); context.getMockRoot().setIOException("getChildren"); VFS vfs = VFS.getVFS(context.getRootURI()); try { vfs.getChildren(null); fail("Should not be here!"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testGetAllChildrenWithFilter() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "child2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "child3").getVirtualFile(); VFS vfs = VFS.getVFS(context.getRootURI()); MockVirtualFileFilter filter = new MockVirtualFileFilter(); List children = vfs.getChildren(filter); assertNotNull(children); List expected = new ArrayList(); expected.add(child1); expected.add(child2); expected.add(child3); assertEquals(expected, children); assertEquals(expected, filter.getVisited()); } public void testGetAllChildrenWithFilterStructured() throws Exception { MockVFSContext context = registerStructuredVFSContextWithSubChildren(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "child2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "child3").getVirtualFile(); VFS vfs = VFS.getVFS(context.getRootURI()); MockVirtualFileFilter filter = new MockVirtualFileFilter(); List children = vfs.getChildren(filter); assertNotNull(children); List expected = new ArrayList(); expected.add(child1); expected.add(child2); expected.add(child3); assertEquals(expected, children); assertEquals(expected, filter.getVisited()); } public void testGetAllChildrenWithFilterNoChildren() throws Exception { MockVFSContext context = registerSimpleVFSContext(); context.getMockRoot().setLeaf(false); VFS vfs = VFS.getVFS(context.getRootURI()); MockVirtualFileFilter filter = new MockVirtualFileFilter(); List children = vfs.getChildren(filter); assertNotNull(children); assertEmpty(children); assertEmpty(filter.getVisited()); } public void testGetAllChildrenWithFilterIsLeaf() throws Exception { MockVFSContext context = registerSimpleVFSContext(); VFS vfs = VFS.getVFS(context.getRootURI()); MockVirtualFileFilter filter = new MockVirtualFileFilter(); assertChildrenOnLeaf(vfs, filter); } public void testGetAllChildrenWithFilterIOException() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); context.getMockRoot().setIOException("getChildren"); VFS vfs = VFS.getVFS(context.getRootURI()); MockVirtualFileFilter filter = new MockVirtualFileFilter(); try { vfs.getChildren(filter); fail("Should not be here!"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testGetAllChildrenRecursively() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "child2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "child3").getVirtualFile(); VFS vfs = VFS.getVFS(context.getRootURI()); List children = vfs.getChildrenRecursively(); assertNotNull(children); List expected = new ArrayList(); expected.add(child1); expected.add(child2); expected.add(child3); assertEquals(expected, children); } public void testGetAllChildrenRecursivelyStructured() throws Exception { MockVFSContext context = registerStructuredVFSContextWithSubChildren(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child11 = getChildHandler(context, "child1/child1,1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "child2").getVirtualFile(); VirtualFile child21 = getChildHandler(context, "child2/child2,1").getVirtualFile(); VirtualFile child22 = getChildHandler(context, "child2/child2,2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "child3").getVirtualFile(); VirtualFile child31 = getChildHandler(context, "child3/child3,1").getVirtualFile(); VirtualFile child32 = getChildHandler(context, "child3/child3,2").getVirtualFile(); VirtualFile child33 = getChildHandler(context, "child3/child3,3").getVirtualFile(); VFS vfs = VFS.getVFS(context.getRootURI()); List children = vfs.getChildrenRecursively(); assertNotNull(children); List expected = new ArrayList(); expected.add(child1); expected.add(child11); expected.add(child2); expected.add(child21); expected.add(child22); expected.add(child3); expected.add(child31); expected.add(child32); expected.add(child33); assertEquals(expected, children); } public void testGetAllChildrenRecursivelyNoChildren() throws Exception { MockVFSContext context = registerSimpleVFSContext(); context.getMockRoot().setLeaf(false); VFS vfs = VFS.getVFS(context.getRootURI()); List children = vfs.getChildrenRecursively(); assertNotNull(children); assertEmpty(children); } public void testGetAllChildrenRecursivelyIsLeaf() throws Exception { MockVFSContext context = registerSimpleVFSContext(); VFS vfs = VFS.getVFS(context.getRootURI()); assertChildrenOnLeafRecursively(vfs); } public void testGetAllChildrenRecursivelyIOException() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); context.getMockRoot().setIOException("getChildren"); VFS vfs = VFS.getVFS(context.getRootURI()); try { vfs.getChildrenRecursively(); fail("Should not be here!"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testGetAllChildrenRecursivelyWithNullFilter() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "child2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "child3").getVirtualFile(); VFS vfs = VFS.getVFS(context.getRootURI()); List children = vfs.getChildrenRecursively(null); assertNotNull(children); List expected = new ArrayList(); expected.add(child1); expected.add(child2); expected.add(child3); assertEquals(expected, children); } public void testGetAllChildrenRecursivelyWithNullFilterStructured() throws Exception { MockVFSContext context = registerStructuredVFSContextWithSubChildren(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child11 = getChildHandler(context, "child1/child1,1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "child2").getVirtualFile(); VirtualFile child21 = getChildHandler(context, "child2/child2,1").getVirtualFile(); VirtualFile child22 = getChildHandler(context, "child2/child2,2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "child3").getVirtualFile(); VirtualFile child31 = getChildHandler(context, "child3/child3,1").getVirtualFile(); VirtualFile child32 = getChildHandler(context, "child3/child3,2").getVirtualFile(); VirtualFile child33 = getChildHandler(context, "child3/child3,3").getVirtualFile(); VFS vfs = VFS.getVFS(context.getRootURI()); List children = vfs.getChildrenRecursively(null); assertNotNull(children); List expected = new ArrayList(); expected.add(child1); expected.add(child11); expected.add(child2); expected.add(child21); expected.add(child22); expected.add(child3); expected.add(child31); expected.add(child32); expected.add(child33); assertEquals(expected, children); } public void testGetAllChildrenRecursivelyWithNullFilterNoChildren() throws Exception { MockVFSContext context = registerSimpleVFSContext(); context.getMockRoot().setLeaf(false); VFS vfs = VFS.getVFS(context.getRootURI()); List children = vfs.getChildrenRecursively(null); assertNotNull(children); assertEmpty(children); } public void testGetAllChildrenRecursivelyWithNullFilterIsLeaf() throws Exception { MockVFSContext context = registerSimpleVFSContext(); VFS vfs = VFS.getVFS(context.getRootURI()); assertChildrenOnLeafRecursively(vfs, null); } public void testGetAllChildrenRecursivelyWithNullFilterIOException() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); context.getMockRoot().setIOException("getChildren"); VFS vfs = VFS.getVFS(context.getRootURI()); try { vfs.getChildrenRecursively(null); fail("Should not be here!"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testGetAllChildrenRecursivelyWithFilter() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "child2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "child3").getVirtualFile(); VFS vfs = VFS.getVFS(context.getRootURI()); MockVirtualFileFilter filter = new MockVirtualFileFilter(); List children = vfs.getChildrenRecursively(filter); assertNotNull(children); List expected = new ArrayList(); expected.add(child1); expected.add(child2); expected.add(child3); assertEquals(expected, children); assertEquals(expected, filter.getVisited()); } public void testGetAllChildrenRecursivelyWithFilterStructured() throws Exception { MockVFSContext context = registerStructuredVFSContextWithSubChildren(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child11 = getChildHandler(context, "child1/child1,1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "child2").getVirtualFile(); VirtualFile child21 = getChildHandler(context, "child2/child2,1").getVirtualFile(); VirtualFile child22 = getChildHandler(context, "child2/child2,2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "child3").getVirtualFile(); VirtualFile child31 = getChildHandler(context, "child3/child3,1").getVirtualFile(); VirtualFile child32 = getChildHandler(context, "child3/child3,2").getVirtualFile(); VirtualFile child33 = getChildHandler(context, "child3/child3,3").getVirtualFile(); VFS vfs = VFS.getVFS(context.getRootURI()); MockVirtualFileFilter filter = new MockVirtualFileFilter(); List children = vfs.getChildrenRecursively(filter); assertNotNull(children); List expected = new ArrayList(); expected.add(child1); expected.add(child11); expected.add(child2); expected.add(child21); expected.add(child22); expected.add(child3); expected.add(child31); expected.add(child32); expected.add(child33); assertEquals(expected, children); assertEquals(expected, filter.getVisited()); } public void testGetAllChildrenRecursivelyWithFilterNoChildren() throws Exception { MockVFSContext context = registerSimpleVFSContext(); context.getMockRoot().setLeaf(false); VFS vfs = VFS.getVFS(context.getRootURI()); MockVirtualFileFilter filter = new MockVirtualFileFilter(); List children = vfs.getChildrenRecursively(filter); assertNotNull(children); assertEmpty(children); assertEmpty(filter.getVisited()); } public void testGetAllChildrenRecursivelyWithFilterIsLeaf() throws Exception { MockVFSContext context = registerSimpleVFSContext(); VFS vfs = VFS.getVFS(context.getRootURI()); MockVirtualFileFilter filter = new MockVirtualFileFilter(); assertChildrenOnLeafRecursively(vfs, filter); } public void testGetAllChildrenRecursivelyWithFilterIOException() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); context.getMockRoot().setIOException("getChildren"); VFS vfs = VFS.getVFS(context.getRootURI()); MockVirtualFileFilter filter = new MockVirtualFileFilter(); try { vfs.getChildrenRecursively(filter); fail("Should not be here!"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testVisitAllChildren() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "child2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "child3").getVirtualFile(); VFS vfs = VFS.getVFS(context.getRootURI()); MockVirtualFileFilter filter = new MockVirtualFileFilter(); FilterVirtualFileVisitor visitor = new FilterVirtualFileVisitor(filter); vfs.visit(visitor); List expected = new ArrayList(); expected.add(child1); expected.add(child2); expected.add(child3); assertEquals(expected, filter.getVisited()); } public void testVisitAllChildrenStructured() throws Exception { MockVFSContext context = registerStructuredVFSContextWithSubChildren(); VirtualFile child1 = getChildHandler(context, "child1").getVirtualFile(); VirtualFile child2 = getChildHandler(context, "child2").getVirtualFile(); VirtualFile child3 = getChildHandler(context, "child3").getVirtualFile(); VFS vfs = VFS.getVFS(context.getRootURI()); MockVirtualFileFilter filter = new MockVirtualFileFilter(); FilterVirtualFileVisitor visitor = new FilterVirtualFileVisitor(filter); vfs.visit(visitor); List expected = new ArrayList(); expected.add(child1); expected.add(child2); expected.add(child3); assertEquals(expected, filter.getVisited()); } public void testVisitAllChildrenNoChildren() throws Exception { MockVFSContext context = registerSimpleVFSContext(); context.getMockRoot().setLeaf(false); VFS vfs = VFS.getVFS(context.getRootURI()); MockVirtualFileFilter filter = new MockVirtualFileFilter(); FilterVirtualFileVisitor visitor = new FilterVirtualFileVisitor(filter); vfs.visit(visitor); assertEmpty(filter.getVisited()); } public void testVisitAllChildrenIsLeaf() throws Exception { MockVFSContext context = registerSimpleVFSContext(); VFS vfs = VFS.getVFS(context.getRootURI()); MockVirtualFileFilter filter = new MockVirtualFileFilter(); FilterVirtualFileVisitor visitor = new FilterVirtualFileVisitor(filter); vfs.visit(visitor); List matched = visitor.getMatched(); assertNotNull(matched); assertEmpty(matched); } public void testVisitAllChildrenNullVisitor() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); VFS vfs = VFS.getVFS(context.getRootURI()); try { vfs.visit(null); fail("Should not be here!"); } catch (Throwable t) { checkThrowable(IllegalArgumentException.class, t); } } public void testVisitAllChildrenIOException() throws Exception { MockVFSContext context = registerSimpleVFSContextWithChildren(); context.getMockRoot().setIOException("getChildren"); VFS vfs = VFS.getVFS(context.getRootURI()); MockVirtualFileFilter filter = new MockVirtualFileFilter(); FilterVirtualFileVisitor visitor = new FilterVirtualFileVisitor(filter); try { vfs.visit(visitor); fail("Should not be here!"); } catch (Throwable t) { checkThrowable(IOException.class, t); } } public void testToString() throws Exception { MockVFSContext context = registerSimpleVFSContext(); VFS vfs = context.getVFS(); assertEquals(context.toString(), vfs.toString()); } public void testHashCode() throws Exception { MockVFSContext context = registerSimpleVFSContext(); VFS vfs = context.getVFS(); assertEquals(context.hashCode(), vfs.hashCode()); } public void testEquals() throws Exception { MockVFSContext context1 = createSimpleVFSContext(); MockVFSContext context2 = createSimpleVFSContext(); VFS vfs1 = context1.getVFS(); VFS vfs2 = context2.getVFS(); assertEquals(vfs1, vfs2); MockVFSContext context3 = createSimple2VFSContext(); VFS vfs3 = context3.getVFS(); assertFalse(vfs1.equals(vfs3)); assertFalse(vfs2.equals(vfs3)); assertFalse(vfs1.equals(null)); assertFalse(vfs1.equals(new Object())); } } libjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/VisitorUnitTestCase.java0000644000175000017500000002651611021315425033043 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.util.HashSet; import org.jboss.test.virtual.support.MockVFSContext; import org.jboss.test.virtual.support.MockVirtualFileVisitor; import org.jboss.virtual.VFS; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.VisitorAttributes; import junit.framework.Test; import junit.framework.TestSuite; /** * VisitorUnitTestCase. * * @author Adrian Brock * @version $Revision: 1.1 $ */ public class VisitorUnitTestCase extends AbstractMockVFSTest { public VisitorUnitTestCase(String name) { super(name); } public static Test suite() { return suite(VisitorUnitTestCase.class); } public void testDefaultVisitSimple() throws Exception { MockVFSContext context = createSimpleVFSContextWithChildrenAndNonLeafs(); MockVirtualFileVisitor visitor = new MockVirtualFileVisitor(); HashSet expected = new HashSet(); expected.add("child1"); expected.add("child2"); expected.add("child3"); expected.add("folder1"); expected.add("folder1/child1"); expected.add("folder2"); expected.add("folder2/child1"); expected.add("folder2/child2"); expected.add("folder3"); expected.add("folder3/child1"); expected.add("folder3/child2"); expected.add("folder3/child3"); testVisit(context, visitor, expected); } public void testDefaultVisitStructured() throws Exception { MockVFSContext context = createStructuredVFSContextWithChildrenAndNonLeafs(); MockVirtualFileVisitor visitor = new MockVirtualFileVisitor(); HashSet expected = new HashSet(); expected.add("child1"); expected.add("child2"); expected.add("child3"); expected.add("folder1"); expected.add("folder2"); expected.add("folder3"); testVisit(context, visitor, expected); } public void testLeavesOnlyVisitSimple() throws Exception { MockVFSContext context = createSimpleVFSContextWithChildrenAndNonLeafs(); MockVirtualFileVisitor visitor = new MockVirtualFileVisitor(VisitorAttributes.LEAVES_ONLY); HashSet expected = new HashSet(); expected.add("child1"); expected.add("child2"); expected.add("child3"); expected.add("folder1/child1"); expected.add("folder2/child1"); expected.add("folder2/child2"); expected.add("folder3/child1"); expected.add("folder3/child2"); expected.add("folder3/child3"); testVisit(context, visitor, expected); } public void testLeavesOnlyVisitStructured() throws Exception { MockVFSContext context = createStructuredVFSContextWithChildrenAndNonLeafs(); MockVirtualFileVisitor visitor = new MockVirtualFileVisitor(VisitorAttributes.LEAVES_ONLY); HashSet expected = new HashSet(); expected.add("child1"); expected.add("child2"); expected.add("child3"); testVisit(context, visitor, expected); } public void testRecurseVisitSimple() throws Exception { MockVFSContext context = createSimpleVFSContextWithChildrenAndNonLeafs(); MockVirtualFileVisitor visitor = new MockVirtualFileVisitor(VisitorAttributes.RECURSE); HashSet expected = new HashSet(); expected.add("child1"); expected.add("child2"); expected.add("child3"); expected.add("folder1"); expected.add("folder1/child1"); expected.add("folder2"); expected.add("folder2/child1"); expected.add("folder2/child2"); expected.add("folder3"); expected.add("folder3/child1"); expected.add("folder3/child2"); expected.add("folder3/child3"); testVisit(context, visitor, expected); } public void testRecurseVisitStructured() throws Exception { MockVFSContext context = createStructuredVFSContextWithChildrenAndNonLeafs(); MockVirtualFileVisitor visitor = new MockVirtualFileVisitor(VisitorAttributes.RECURSE); HashSet expected = new HashSet(); expected.add("child1"); expected.add("child2"); expected.add("child3"); expected.add("folder1"); expected.add("folder1/child1"); expected.add("folder2"); expected.add("folder2/child1"); expected.add("folder2/child2"); expected.add("folder3"); expected.add("folder3/child1"); expected.add("folder3/child2"); expected.add("folder3/child3"); testVisit(context, visitor, expected); } public void testRecurseLeavesOnlyVisitSimple() throws Exception { MockVFSContext context = createSimpleVFSContextWithChildrenAndNonLeafs(); MockVirtualFileVisitor visitor = new MockVirtualFileVisitor(VisitorAttributes.RECURSE_LEAVES_ONLY); HashSet expected = new HashSet(); expected.add("child1"); expected.add("child2"); expected.add("child3"); expected.add("folder1/child1"); expected.add("folder2/child1"); expected.add("folder2/child2"); expected.add("folder3/child1"); expected.add("folder3/child2"); expected.add("folder3/child3"); testVisit(context, visitor, expected); } public void testRecurseLeavesOnlyVisitStructured() throws Exception { MockVFSContext context = createStructuredVFSContextWithChildrenAndNonLeafs(); MockVirtualFileVisitor visitor = new MockVirtualFileVisitor(VisitorAttributes.RECURSE_LEAVES_ONLY); HashSet expected = new HashSet(); expected.add("child1"); expected.add("child2"); expected.add("child3"); expected.add("folder1/child1"); expected.add("folder2/child1"); expected.add("folder2/child2"); expected.add("folder3/child1"); expected.add("folder3/child2"); expected.add("folder3/child3"); testVisit(context, visitor, expected); } public void testIncludeRootVisitSimple() throws Exception { MockVFSContext context = createSimpleVFSContextWithChildrenAndNonLeafs(); VisitorAttributes attributes = new VisitorAttributes(); attributes.setIncludeRoot(true); MockVirtualFileVisitor visitor = new MockVirtualFileVisitor(attributes); HashSet expected = new HashSet(); expected.add(""); expected.add("child1"); expected.add("child2"); expected.add("child3"); expected.add("folder1"); expected.add("folder1/child1"); expected.add("folder2"); expected.add("folder2/child1"); expected.add("folder2/child2"); expected.add("folder3"); expected.add("folder3/child1"); expected.add("folder3/child2"); expected.add("folder3/child3"); testVisit(context, visitor, expected); } public void testIncludeRootVisitStructured() throws Exception { MockVFSContext context = createStructuredVFSContextWithChildrenAndNonLeafs(); VisitorAttributes attributes = new VisitorAttributes(); attributes.setIncludeRoot(true); MockVirtualFileVisitor visitor = new MockVirtualFileVisitor(attributes); HashSet expected = new HashSet(); expected.add(""); expected.add("child1"); expected.add("child2"); expected.add("child3"); expected.add("folder1"); expected.add("folder2"); expected.add("folder3"); testVisit(context, visitor, expected); } public void testExcludeHiddenVisitSimple() throws Exception { MockVFSContext context = createSimpleVFSContextWithChildrenAndNonLeafsWithHidden(); MockVirtualFileVisitor visitor = new MockVirtualFileVisitor(); HashSet expected = new HashSet(); expected.add("child2"); expected.add("child3"); expected.add("folder1"); expected.add("folder1/child1"); expected.add("folder2"); expected.add("folder2/child1"); expected.add("folder2/child2"); expected.add("folder3"); expected.add("folder3/child1"); expected.add("folder3/child2"); expected.add("folder3/child3"); testVisit(context, visitor, expected); } public void testExcludeHiddenVisitStructured() throws Exception { MockVFSContext context = createStructuredVFSContextWithChildrenAndNonLeafsWithHidden(); MockVirtualFileVisitor visitor = new MockVirtualFileVisitor(); HashSet expected = new HashSet(); expected.add("child2"); expected.add("child3"); expected.add("folder1"); expected.add("folder2"); expected.add("folder3"); testVisit(context, visitor, expected); } public void testIncludeHiddenVisitSimple() throws Exception { MockVFSContext context = createSimpleVFSContextWithChildrenAndNonLeafsWithHidden(); VisitorAttributes attributes = new VisitorAttributes(); attributes.setIncludeHidden(true); MockVirtualFileVisitor visitor = new MockVirtualFileVisitor(attributes); HashSet expected = new HashSet(); expected.add("child1"); expected.add("child2"); expected.add("child3"); expected.add("folder1"); expected.add("folder1/child1"); expected.add("folder2"); expected.add("folder2/child1"); expected.add("folder2/child2"); expected.add("folder3"); expected.add("folder3/child1"); expected.add("folder3/child2"); expected.add("folder3/child3"); testVisit(context, visitor, expected); } public void testIncludeHiddenVisitStructured() throws Exception { MockVFSContext context = createStructuredVFSContextWithChildrenAndNonLeafsWithHidden(); VisitorAttributes attributes = new VisitorAttributes(); attributes.setIncludeHidden(true); MockVirtualFileVisitor visitor = new MockVirtualFileVisitor(attributes); HashSet expected = new HashSet(); expected.add("child1"); expected.add("child2"); expected.add("child3"); expected.add("folder1"); expected.add("folder2"); expected.add("folder3"); testVisit(context, visitor, expected); } protected void testVisit(MockVFSContext context, MockVirtualFileVisitor visitor, HashSet expected) throws Exception { VFS vfs = context.getVFS(); vfs.visit(visitor); HashSet actual = new HashSet(); for (VirtualFile file : visitor.getVisited()) actual.add(file.getPathName()); assertEquals(expected, actual); } } libjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/AbstractMockVFSTest.java0000644000175000017500000003565410773146670032730 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.io.IOException; import java.net.URI; import java.util.List; import org.jboss.test.virtual.support.MockSimpleVirtualFileHandler; import org.jboss.test.virtual.support.MockStructuredVirtualFileHandler; import org.jboss.test.virtual.support.MockVFSContext; import org.jboss.test.virtual.support.MockVFSContextFactory; import org.jboss.virtual.VFS; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.VirtualFileFilter; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VFSContextFactoryLocator; import org.jboss.virtual.spi.VirtualFileHandler; /** * AbstractMockVFSTest. * * @author Adrian Brock * @author Ales Justin * @version $Revision: 1.1 $ */ public abstract class AbstractMockVFSTest extends AbstractVFSTest { /** The vfs context factory */ protected static MockVFSContextFactory mockVFSContextFactory = new MockVFSContextFactory(); /** * Create a new AbstractMockVFSTest. * * @param name the name */ protected AbstractMockVFSTest(String name) { super(name); } protected void setUp() throws Exception { super.setUp(); VFSContextFactoryLocator.registerFactory(mockVFSContextFactory); } protected void tearDown() throws Exception { mockVFSContextFactory.reset(); VFSContextFactoryLocator.unregisterFactory(mockVFSContextFactory); super.tearDown(); } protected MockVFSContext createSimpleVFSContext() { MockVFSContext context = new MockVFSContext("simple"); MockSimpleVirtualFileHandler root = new MockSimpleVirtualFileHandler(context, null, ""); context.setRoot(root); return context; } protected MockVFSContext registerSimpleVFSContext() { MockVFSContext context = createSimpleVFSContext(); mockVFSContextFactory.addVFSContext(context); return context; } protected MockVFSContext createSimple2VFSContext() { MockVFSContext context = new MockVFSContext("simple2"); MockSimpleVirtualFileHandler root = new MockSimpleVirtualFileHandler(context, null, ""); context.setRoot(root); return context; } protected MockVFSContext registerSimple2VFSContext() { MockVFSContext context = createSimple2VFSContext(); mockVFSContextFactory.addVFSContext(context); return context; } protected MockVFSContext createSimpleVFSContextWithChildren() { MockVFSContext context = new MockVFSContext("simpleWithChildren"); MockSimpleVirtualFileHandler root = new MockSimpleVirtualFileHandler(context, null, ""); context.setRoot(root); new MockSimpleVirtualFileHandler(context, root, "child1"); new MockSimpleVirtualFileHandler(context, root, "child2"); new MockSimpleVirtualFileHandler(context, root, "child3"); return context; } protected MockVFSContext registerSimpleVFSContextWithChildren() { MockVFSContext context = createSimpleVFSContextWithChildren(); mockVFSContextFactory.addVFSContext(context); return context; } protected MockVFSContext createSimpleVFSContextWithChildrenAndNonLeafs() { MockVFSContext context = new MockVFSContext("simpleWithChildren"); MockSimpleVirtualFileHandler root = new MockSimpleVirtualFileHandler(context, null, ""); context.setRoot(root); new MockSimpleVirtualFileHandler(context, root, "child1"); new MockSimpleVirtualFileHandler(context, root, "child2"); new MockSimpleVirtualFileHandler(context, root, "child3"); MockSimpleVirtualFileHandler folder1 = new MockSimpleVirtualFileHandler(context, root, "folder1"); folder1.setLeaf(false); new MockSimpleVirtualFileHandler(context, root, "folder1/child1"); MockSimpleVirtualFileHandler folder2 = new MockSimpleVirtualFileHandler(context, root, "folder2"); folder2.setLeaf(false); new MockSimpleVirtualFileHandler(context, root, "folder2/child1"); new MockSimpleVirtualFileHandler(context, root, "folder2/child2"); MockSimpleVirtualFileHandler folder3 = new MockSimpleVirtualFileHandler(context, root, "folder3"); folder3.setLeaf(false); new MockSimpleVirtualFileHandler(context, root, "folder3/child1"); new MockSimpleVirtualFileHandler(context, root, "folder3/child2"); new MockSimpleVirtualFileHandler(context, root, "folder3/child3"); return context; } protected MockVFSContext registerSimpleVFSContextWithChildrenAndNonLeafs() { MockVFSContext context = createSimpleVFSContextWithChildrenAndNonLeafs(); mockVFSContextFactory.addVFSContext(context); return context; } protected MockVFSContext createSimpleVFSContextWithChildrenAndNonLeafsWithHidden() { MockVFSContext context = new MockVFSContext("simpleWithChildren"); MockSimpleVirtualFileHandler root = new MockSimpleVirtualFileHandler(context, null, ""); context.setRoot(root); MockSimpleVirtualFileHandler child1 = new MockSimpleVirtualFileHandler(context, root, "child1"); child1.setHidden(true); new MockSimpleVirtualFileHandler(context, root, "child2"); new MockSimpleVirtualFileHandler(context, root, "child3"); MockSimpleVirtualFileHandler folder1 = new MockSimpleVirtualFileHandler(context, root, "folder1"); folder1.setLeaf(false); new MockSimpleVirtualFileHandler(context, root, "folder1/child1"); MockSimpleVirtualFileHandler folder2 = new MockSimpleVirtualFileHandler(context, root, "folder2"); folder2.setLeaf(false); new MockSimpleVirtualFileHandler(context, root, "folder2/child1"); new MockSimpleVirtualFileHandler(context, root, "folder2/child2"); MockSimpleVirtualFileHandler folder3 = new MockSimpleVirtualFileHandler(context, root, "folder3"); folder3.setLeaf(false); new MockSimpleVirtualFileHandler(context, root, "folder3/child1"); new MockSimpleVirtualFileHandler(context, root, "folder3/child2"); new MockSimpleVirtualFileHandler(context, root, "folder3/child3"); return context; } protected MockVFSContext registerSimpleVFSContextWithChildrenAndNonLeafsWithHidden() { MockVFSContext context = createSimpleVFSContextWithChildrenAndNonLeafsWithHidden(); mockVFSContextFactory.addVFSContext(context); return context; } protected MockVFSContext createStructuredVFSContextWithSubChildren() { MockVFSContext context = new MockVFSContext("simpleWithChildren"); MockStructuredVirtualFileHandler root = new MockStructuredVirtualFileHandler(context, null, ""); context.setRoot(root); MockStructuredVirtualFileHandler child1 = new MockStructuredVirtualFileHandler(context, root, "child1"); new MockStructuredVirtualFileHandler(context, child1, "child1,1"); MockStructuredVirtualFileHandler child2 = new MockStructuredVirtualFileHandler(context, root, "child2"); new MockStructuredVirtualFileHandler(context, child2, "child2,1"); new MockStructuredVirtualFileHandler(context, child2, "child2,2"); MockStructuredVirtualFileHandler child3 = new MockStructuredVirtualFileHandler(context, root, "child3"); new MockStructuredVirtualFileHandler(context, child3, "child3,1"); new MockStructuredVirtualFileHandler(context, child3, "child3,2"); new MockStructuredVirtualFileHandler(context, child3, "child3,3"); return context; } protected MockVFSContext registerStructuredVFSContextWithSubChildren() { MockVFSContext context = createStructuredVFSContextWithSubChildren(); mockVFSContextFactory.addVFSContext(context); return context; } protected MockVFSContext createStructuredVFSContextWithChildrenAndNonLeafs() { MockVFSContext context = new MockVFSContext("simpleWithChildren"); MockStructuredVirtualFileHandler root = new MockStructuredVirtualFileHandler(context, null, ""); context.setRoot(root); new MockStructuredVirtualFileHandler(context, root, "child1"); new MockStructuredVirtualFileHandler(context, root, "child2"); new MockStructuredVirtualFileHandler(context, root, "child3"); MockStructuredVirtualFileHandler folder1 = new MockStructuredVirtualFileHandler(context, root, "folder1"); folder1.setLeaf(false); new MockStructuredVirtualFileHandler(context, folder1, "child1"); MockStructuredVirtualFileHandler folder2 = new MockStructuredVirtualFileHandler(context, root, "folder2"); folder2.setLeaf(false); new MockStructuredVirtualFileHandler(context, folder2, "child1"); new MockStructuredVirtualFileHandler(context, folder2, "child2"); MockStructuredVirtualFileHandler folder3 = new MockStructuredVirtualFileHandler(context, root, "folder3"); folder3.setLeaf(false); new MockStructuredVirtualFileHandler(context, folder3, "child1"); new MockStructuredVirtualFileHandler(context, folder3, "child2"); new MockStructuredVirtualFileHandler(context, folder3, "child3"); return context; } protected MockVFSContext registerStructuredVFSContextWithChildrenAndNonLeafs() { MockVFSContext context = createStructuredVFSContextWithChildrenAndNonLeafs(); mockVFSContextFactory.addVFSContext(context); return context; } protected MockVFSContext createStructuredVFSContextWithChildrenAndNonLeafsWithHidden() { MockVFSContext context = new MockVFSContext("simpleWithChildren"); MockStructuredVirtualFileHandler root = new MockStructuredVirtualFileHandler(context, null, ""); context.setRoot(root); MockStructuredVirtualFileHandler child1 = new MockStructuredVirtualFileHandler(context, root, "child1"); child1.setHidden(true); new MockStructuredVirtualFileHandler(context, root, "child2"); new MockStructuredVirtualFileHandler(context, root, "child3"); MockStructuredVirtualFileHandler folder1 = new MockStructuredVirtualFileHandler(context, root, "folder1"); folder1.setLeaf(false); new MockStructuredVirtualFileHandler(context, folder1, "child1"); MockStructuredVirtualFileHandler folder2 = new MockStructuredVirtualFileHandler(context, root, "folder2"); folder2.setLeaf(false); new MockStructuredVirtualFileHandler(context, folder2, "child1"); new MockStructuredVirtualFileHandler(context, folder2, "child2"); MockStructuredVirtualFileHandler folder3 = new MockStructuredVirtualFileHandler(context, root, "folder3"); folder3.setLeaf(false); new MockStructuredVirtualFileHandler(context, folder3, "child1"); new MockStructuredVirtualFileHandler(context, folder3, "child2"); new MockStructuredVirtualFileHandler(context, folder3, "child3"); return context; } protected MockVFSContext registerStructuredVFSContextWithChildrenAndNonLeafsWithHidden() { MockVFSContext context = createStructuredVFSContextWithChildrenAndNonLeafsWithHidden(); mockVFSContextFactory.addVFSContext(context); return context; } protected VirtualFileHandler getChildHandler(VFSContext context, String path) throws IOException { if (context == null) throw new IllegalArgumentException("Null context"); if (path == null) throw new IllegalArgumentException("Null path"); VirtualFileHandler root = context.getRoot(); assertNotNull(root); VirtualFileHandler handler = context.getChild(root, path); assertNotNull(handler); return handler; } protected void assertGetName(URI uri, String name) throws Exception { assertGetName(uri, name, name); } protected void assertGetName(URI uri, String path, String name) throws Exception { VirtualFile file = VFS.getVirtualFile(uri, path); assertEquals(name, file.getName()); } protected void assertGetPathName(URI uri, String path) throws Exception { VirtualFile file = VFS.getVirtualFile(uri, path); assertEquals(path, file.getPathName()); } protected VirtualFile assertFindChild(VFS vfs, String path, VirtualFile expected) throws Exception { VirtualFile found = vfs.findChild(path); assertNotNull(found); assertEquals(expected, found); return found; } protected VirtualFile assertFindChild(VirtualFile file, String path, VirtualFile expected) throws Exception { VirtualFile found = file.findChild(path); assertNotNull(found); assertEquals(expected, found); return found; } protected void assertChildrenOnLeaf(VirtualFile file) throws Exception { assertNotNull(file); assertChildrenOnLeaf(file.getChildren()); } protected void assertChildrenOnLeaf(VFS vfs) throws Exception { assertNotNull(vfs); assertChildrenOnLeaf(vfs.getChildren()); } protected void assertChildrenOnLeaf(VirtualFile file, VirtualFileFilter filter) throws Exception { assertNotNull(file); assertChildrenOnLeaf(file.getChildren(filter)); } protected void assertChildrenOnLeaf(VFS vfs, VirtualFileFilter filter) throws Exception { assertNotNull(vfs); assertChildrenOnLeaf(vfs.getChildren(filter)); } protected void assertChildrenOnLeafRecursively(VirtualFile file) throws Exception { assertNotNull(file); assertChildrenOnLeaf(file.getChildrenRecursively()); } protected void assertChildrenOnLeafRecursively(VFS vfs) throws Exception { assertNotNull(vfs); assertChildrenOnLeaf(vfs.getChildrenRecursively()); } protected void assertChildrenOnLeafRecursively(VirtualFile file, VirtualFileFilter filter) throws Exception { assertNotNull(file); assertChildrenOnLeaf(file.getChildrenRecursively(filter)); } protected void assertChildrenOnLeafRecursively(VFS vfs, VirtualFileFilter filter) throws Exception { assertNotNull(vfs); assertChildrenOnLeaf(vfs.getChildrenRecursively(filter)); } protected void assertChildrenOnLeaf(List children) throws Exception { assertNotNull(children); assertEmpty(children); } } libjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/DetachedCopyTest.java0000644000175000017500000000444611137562372032317 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import org.jboss.virtual.VirtualFile; /** * Detached tests - no parent re-wiring. * * @author Ales Justin */ public abstract class DetachedCopyTest extends CopyTest { public DetachedCopyTest(String s) { super(s); } protected abstract boolean isExploded() throws Exception; protected abstract boolean isSame(VirtualFile original) throws Exception; protected void assertNoReplacement(VirtualFile original, VirtualFile replacement, boolean unpacked) throws Exception { if (isSame(original)) assertSame(original, replacement); else assertReplacement(original, replacement, unpacked || isExploded()); } protected void assertTopLevel(VirtualFile original, VirtualFile replacement) throws Exception { assertReplacement(original, replacement, isExploded()); assertNotNull(replacement.getParent()); } protected void assertNestedLevel(VirtualFile original, VirtualFile replacement) throws Exception { assertExplodedReplacement(original, replacement); } protected void assertOnURI(VirtualFile original, VirtualFile replacement) throws Exception { assertReplacement(original, replacement); } }libjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/ExplodeTestCase.java0000644000175000017500000000340411022735656032150 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import junit.framework.Test; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.VFSUtils; /** * Unpack tests. * * @author Ales Justin */ public class ExplodeTestCase extends DetachedCopyTest { public ExplodeTestCase(String s) { super(s); } public static Test suite() { return suite(ExplodeTestCase.class); } protected VirtualFile modify(VirtualFile file) throws Exception { return VFSUtils.explode(file); } protected boolean isExploded() throws Exception { return true; } protected boolean isSame(VirtualFile original) throws Exception { return original.isLeaf(); } }././@LongLink0000000000000000000000000000014500000000000011565 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/URLExistsUnitTestCase.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/test/URLExistsUnitTestCase.java0000644000175000017500000000767611031777100033257 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, Red Hat Middleware LLC, and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.test; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import java.util.jar.JarOutputStream; import java.util.jar.Manifest; import junit.framework.Test; /** * Basic tests of URL existence based on URLConnection.getLastModified * * @author Scott.Stark@jboss.org * @version $Revision: 75186 $ */ public class URLExistsUnitTestCase extends AbstractVFSTest { public URLExistsUnitTestCase(String name) { super(name); } public static Test suite() { return suite(URLExistsUnitTestCase.class); } /** * Test file deletion can be detected via URLConnection.getLastModified == 0. * @throws Exception */ public void testFileURLs() throws Exception { File tmp = File.createTempFile("testFileURLs", null); URL tmpURL = tmp.toURL(); URLConnection conn = tmpURL.openConnection(); InputStream in = conn.getInputStream(); long lastModified; try { lastModified = conn.getLastModified(); System.out.println("lastModified, "+lastModified); assertNotSame("lastModified", 0, lastModified); } finally { in.close(); } assertTrue(tmp.getAbsolutePath()+" deleted", tmp.delete()); conn = tmpURL.openConnection(); lastModified = conn.getLastModified(); System.out.println("lastModified after delete, "+lastModified); assertEquals("lastModified", 0, lastModified); } /** * Test jar deletion can be detected via URLConnection.getLastModified == 0. * @throws Exception */ public void testJarURLs() throws Exception { File tmp = File.createTempFile("testFileURLs", ".jar"); Manifest mf = new Manifest(); mf.getMainAttributes().putValue("Created-By", ".URLExistsUnitTestCase.testJarURLs"); FileOutputStream fos = new FileOutputStream(tmp); JarOutputStream jos = new JarOutputStream(fos, mf); jos.setComment("testJarURLs"); jos.setLevel(0); jos.close(); URL tmpURL = new URL("jar:"+tmp.toURL()+"!/"); URLConnection conn = tmpURL.openConnection(); conn.setUseCaches(false); long lastModified = conn.getLastModified(); // the following ugly block of code is // the only known way to force jar file lock release on Windows // and it's not even 100% reliable conn = null; tmpURL = null; System.gc(); Thread.sleep(500); System.gc(); System.out.println("lastModified, "+lastModified); assertNotSame("lastModified", 0, lastModified); assertTrue(tmp.getAbsolutePath()+" deleted", tmp.delete()); tmpURL = new URL("jar:"+tmp.toURL()+"!/"); conn = tmpURL.openConnection(); lastModified = conn.getLastModified(); System.out.println("lastModified after delete, "+lastModified); // TODO - fix back assertTrue("lastModified", 0 == lastModified); } } libjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/0000755000175000017500000000000011146622514027000 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/ps/0000755000175000017500000000000011146622514027422 5ustar twernertwerner././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/ps/ModificationInfo.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/ps/ModificationInfo.jav0000644000175000017500000000402011026734334033342 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2007, Red Hat Middleware LLC, and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.support.ps; import java.io.Serializable; import org.jboss.test.virtual.support.ps.VFSDeployment; /** * Represents a modified deployment returned from the modified deployments scan. * * @see Profile#getModifiedDeployments() * * @author Scott.Stark@jboss.org * @author adrian@jboss.org * @version $Revision: 63730 $ */ public class ModificationInfo implements Serializable { private final static long serialVersionUID = 1; public enum ModifyStatus {ADDED, MODIFIED, REMOVED}; private VFSDeployment deployment; private long lastModified; private ModifyStatus status; public ModificationInfo(VFSDeployment deployment, long lastModified, ModifyStatus status) { this.deployment = deployment; this.lastModified = lastModified; this.status = status; } public VFSDeployment getDeployment() { return deployment; } public long getLastModified() { return lastModified; } public ModifyStatus getStatus() { return status; } } libjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/ps/VFSDeployment.java0000644000175000017500000000241311026734334032765 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2007, Red Hat Middleware LLC, and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.support.ps; import org.jboss.virtual.VirtualFile; /** * @author Scott.Stark@jboss.org * @version $Revision:$ */ public interface VFSDeployment { public String getName(); public String getSimpleName(); public VirtualFile getRoot(); } ././@LongLink0000000000000000000000000000014500000000000011565 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/ps/DeploymentPhase.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/ps/DeploymentPhase.java0000644000175000017500000000227611026734334033376 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2007, Red Hat Middleware LLC, and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.support.ps; /** * @author Scott.Stark@jboss.org * @version $Revision:$ */ public enum DeploymentPhase { BOOTSTRAP, DEPLOYER, APPLICATION, APPLICATION_TRANSIENT } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/ps/VFSDeploymentFactory.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/ps/VFSDeploymentFactory0000644000175000017500000000270711026734334033403 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2007, Red Hat Middleware LLC, and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.support.ps; import org.jboss.virtual.VirtualFile; /** * @author Scott.Stark@jboss.org * @version $Revision:$ */ public class VFSDeploymentFactory { private static VFSDeploymentFactory instance = new VFSDeploymentFactory(); public static VFSDeploymentFactory getInstance() { return instance; } public VFSDeployment createVFSDeployment(VirtualFile file) { return new VFSDeploymentImpl(file); } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/ps/VFSDeploymentImpl.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/ps/VFSDeploymentImpl.ja0000644000175000017500000000300511026734334033256 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2007, Red Hat Middleware LLC, and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.support.ps; import org.jboss.virtual.VirtualFile; /** * @author Scott.Stark@jboss.org * @version $Revision:$ */ public class VFSDeploymentImpl implements VFSDeployment { private VirtualFile root; public VFSDeploymentImpl(VirtualFile root) { this.root = root; } public VirtualFile getRoot() { return root; } public String getName() { return root.getName(); } public String getSimpleName() { return root.getPathName(); } } libjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/ps/hotdeploy/0000755000175000017500000000000011146622514031431 5ustar twernertwerner././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/ps/hotdeploy/HDScanner.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/ps/hotdeploy/HDScanner.0000644000175000017500000001547411026734334033253 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2007, Red Hat Middleware LLC, and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.support.ps.hotdeploy; import java.util.Collection; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; import org.jboss.logging.Logger; import org.jboss.test.virtual.support.ps.MockProfileServiceRepository; import org.jboss.test.virtual.support.ps.ModificationInfo; import org.jboss.test.virtual.support.ps.VFSDeployment; /** * A DeploymentScanner built on the ProfileService and MainDeployer. This * is really just a simple ExecutorService Runnable that knows nothing * about how to detect changed deployers. The ProfileService determines * this. * * @see MainDeployer * @see ProfileService * * @author Dimitris Andreadis * @author Scott.Stark@jboss.org * @author adrian@jboss.org * @version $Revision: 64997 $ */ public class HDScanner implements Runnable { private static final Logger log = Logger.getLogger(HDScanner.class); // Private Data -------------------------------------------------- /** The ProfileService used to determine modified deployments */ private MockProfileServiceRepository profileService; /** The ExecutorService/ThreadPool for performing scans */ private ScheduledExecutorService scanExecutor; private ScheduledFuture activeScan; /** Thread name used when the ScheduledExecutorService is created internally */ private String scanThreadName = "HDScanner"; /** Period in ms between deployment scans */ private long scanPeriod = 5000; /** The number of scans that have been done */ private int scanCount; private boolean skipScan; // Constructor --------------------------------------------------- public HDScanner() { // empty } // Attributes ---------------------------------------------------- public MockProfileServiceRepository getProfileService() { return profileService; } public void setProfileService(MockProfileServiceRepository profileService) { this.profileService = profileService; } /** * @return Returns the scanExecutor. */ public ScheduledExecutorService getScanExecutor() { return this.scanExecutor; } /** * @param scanExecutor The scanExecutor to set. */ public void setScanExecutor(ScheduledExecutorService scanExecutor) { this.scanExecutor = scanExecutor; } public String getScanThreadName() { return scanThreadName; } public void setScanThreadName(String scanThreadName) { this.scanThreadName = scanThreadName; } /* (non-Javadoc) * @see org.jboss.deployment.scanner.VFSDeploymentScanner#getScanPeriod() */ public long getScanPeriod() { return scanPeriod; } /* (non-Javadoc) * @see org.jboss.deployment.scanner.VFSDeploymentScanner#setScanPeriod(long) */ public void setScanPeriod(long period) { this.scanPeriod = period; } /** * Are deployment scans enabled. * * @return whether scan is enabled */ public boolean isScanEnabled() { return activeScan != null; } public synchronized boolean isSkipScan() { return skipScan; } public synchronized void setSkipScan(boolean skipScan) { this.skipScan = skipScan; } public synchronized int getScanCount() { return scanCount; } public synchronized void resetScanCount() { this.scanCount = 0; } /** * Enable/disable deployment scans. * @param scanEnabled true to enable scans, false to disable. */ public synchronized void setScanEnabled(boolean scanEnabled) { if( scanEnabled == true && activeScan == null ) { activeScan = this.scanExecutor.scheduleWithFixedDelay(this, 0, scanPeriod, TimeUnit.MILLISECONDS); } else if( scanEnabled == false && activeScan != null ) { activeScan.cancel(true); activeScan = null; } } // Operations ---------------------------------------------------- public void start() throws Exception { // Default to a single thread executor if( scanExecutor == null ) { scanExecutor = Executors.newSingleThreadScheduledExecutor( new ThreadFactory() { public Thread newThread(Runnable r) { return new Thread(r, HDScanner.this.getScanThreadName()); } } ); } activeScan = scanExecutor.scheduleWithFixedDelay(this, 0, scanPeriod, TimeUnit.MILLISECONDS); } /** * Executes scan * */ public void run() { try { scan(); } catch(Throwable e) { log.warn("Scan failed", e); } finally { incScanCount(); } } public void stop() { if( activeScan != null ) { activeScan.cancel(true); activeScan = null; } } public synchronized void scan() throws Exception { if(isSkipScan()) return; // Query the ProfileService for deployments log.debug("Begin deployment scan"); // Get the modified deployments Collection modified = profileService.getModifiedDeployments(); for(ModificationInfo info : modified) { VFSDeployment ctx = info.getDeployment(); log.debug("Saw modified ctx: "+ctx.getName()); // TODO: cause the file to be opened/closed? } log.debug("End deployment scan"); } /** * Inc the scanCount and to a notifyAll. * */ protected synchronized void incScanCount() { scanCount ++; notifyAll(); } // Private ------------------------------------------------------- } ././@LongLink0000000000000000000000000000016200000000000011564 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/ps/MockProfileServiceRepository.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/ps/MockProfileServiceRe0000644000175000017500000004675311026734334033407 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2007, Red Hat Middleware LLC, and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.support.ps; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.SyncFailedException; import java.net.URI; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Set; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.zip.ZipInputStream; import org.jboss.logging.Logger; import org.jboss.test.virtual.support.ps.DeploymentPhase; import org.jboss.test.virtual.support.ps.ModificationInfo; import org.jboss.test.virtual.support.ps.VFSDeployment; import org.jboss.test.virtual.support.ps.VFSDeploymentFactory; import org.jboss.test.virtual.support.ps.ModificationInfo.ModifyStatus; import org.jboss.util.file.Files; import org.jboss.virtual.VFS; import org.jboss.virtual.VirtualFile; /** * An implementation of DeploymentRepository that relies on java * @author Scott.Stark@jboss.org * @version $Revision:$ */ public class MockProfileServiceRepository { private static final Logger log = Logger.getLogger(MockProfileServiceRepository.class); /** The server root container the deployments */ private File root; /** The application phase deployments dir */ private File[] applicationDirs; private LinkedHashMap applicationCtxs = new LinkedHashMap(); private Set lockedApps = Collections.synchronizedSet(new HashSet()); /** The last time the profile was modified */ private long lastModified; /** A lock for the hot deployment/{@link #getModifiedDeployments()} */ private ReentrantReadWriteLock contentLock = new ReentrantReadWriteLock(true); /** Should an attempt to overwrite existing content fail in {@link #addDeploymentContent(String, ZipInputStream, DeploymentPhase)}*/ private boolean failIfAlreadyExists = false; public MockProfileServiceRepository(File root, URI[] appURIs) { this.root = root; this.setApplicationURIs(appURIs); } public URI[] getApplicationURIs() { URI[] appURIs = new URI[applicationDirs.length]; for (int n = 0; n < applicationDirs.length; n ++) { File applicationDir = applicationDirs[n]; appURIs[n] = applicationDir.toURI(); } return appURIs; } public void setApplicationURIs(URI[] uris) { applicationDirs = new File[uris.length]; for (int n = 0; n < uris.length; n ++) { URI uri = uris[n]; applicationDirs[n] = new File(uri); } } public boolean exists() { return root.exists(); } public long getLastModified() { return this.lastModified; } public URI getDeploymentURI(DeploymentPhase phase) { URI uri = null; switch( phase ) { case BOOTSTRAP: uri = this.getBootstrapURI(); break; case DEPLOYER: break; case APPLICATION: uri = this.getApplicationURI(); break; } return uri; } public void setDeploymentURI(URI uri, DeploymentPhase phase) { switch( phase ) { case BOOTSTRAP: this.setBootstrapURI(uri); break; case DEPLOYER: this.setDeployersURI(uri); break; case APPLICATION: this.setApplicationURIs(new URI[]{uri}); break; } } public Set getDeploymentNames() { HashSet names = new HashSet(); names.addAll(applicationCtxs.keySet()); return names; } public Set getDeploymentNames(DeploymentPhase phase) { HashSet names = new HashSet(); switch( phase ) { case BOOTSTRAP: break; case DEPLOYER: break; case APPLICATION: names.addAll(this.applicationCtxs.keySet()); break; } return names; } /** * */ public void addDeploymentContent(String name, InputStream contentIS, DeploymentPhase phase) throws IOException { boolean trace = log.isTraceEnabled(); // Suspend hot deployment checking if( trace ) log.trace("Aquiring content read lock"); contentLock.writeLock().lock(); try { // Write the content out File contentRoot = getPhaseDir(phase); if(contentRoot == null) throw new FileNotFoundException("Failed to obtain content dir for phase: "+phase); File contentFile = new File(contentRoot, name); if(failIfAlreadyExists && contentFile.exists()) throw new SyncFailedException("Deployment content already exists: "+contentFile.getAbsolutePath()); FileOutputStream fos = new FileOutputStream(contentFile); try { byte[] tmp = new byte[4096]; int read; while((read = contentIS.read(tmp)) > 0) { if (trace) log.trace("write, " + read); fos.write(tmp, 0, read); } fos.flush(); } finally { try { fos.close(); } catch (IOException ignored) { } } //contentIS.close(); // Lock the content lockDeploymentContent(name, phase); } finally { // Allow hot deployment checking contentLock.writeLock().unlock(); if(trace) log.trace("Released content write lock"); } } public VirtualFile getDeploymentContent(String vfsPath, DeploymentPhase phase) throws IOException { URI rootURI = this.getDeploymentURI(phase); VirtualFile root = VFS.getRoot(rootURI); VirtualFile content = root.getChild(vfsPath); if(content == null) throw new FileNotFoundException(vfsPath+" not found under root: "+rootURI); return content; } public void lockDeploymentContent(String vfsPath, DeploymentPhase phase) { lockedApps.add(vfsPath); } public void unlockDeploymentContent(String vfsPath, DeploymentPhase phase) { lockedApps.remove(vfsPath); } public void acquireDeploymentContentLock() { contentLock.writeLock().lock(); if( log.isTraceEnabled() ) log.trace("acquireDeploymentContentLock, have write lock"); } public void releaseDeploymentContentLock() { contentLock.writeLock().unlock(); if( log.isTraceEnabled() ) log.trace("releaseDeploymentContentLock, gave up write lock"); } public void addDeployment(String vfsPath, VFSDeployment d, DeploymentPhase phase) throws Exception { switch( phase ) { case BOOTSTRAP: this.addBootstrap(vfsPath, d); break; case DEPLOYER: this.addDeployer(vfsPath, d); break; case APPLICATION: this.addApplication(vfsPath, d); break; case APPLICATION_TRANSIENT: this.addApplication(vfsPath, d); break; } } public void updateDeployment(String vfsPath, VFSDeployment d, DeploymentPhase phase) throws Exception { } public VFSDeployment getDeployment(String name, DeploymentPhase phase) throws Exception { VFSDeployment ctx = null; if( phase == null ) { try { if( ctx == null ) ctx = this.getApplication(name); } catch(Exception ignore) { } } else { switch( phase ) { case BOOTSTRAP: ctx = this.getBootstrap(name); break; case DEPLOYER: break; case APPLICATION: ctx = this.getApplication(name); break; } } // Make sure we don't return null if( ctx == null ) throw new Exception("name="+name+", phase="+phase); return ctx; } public Collection getDeployments() { HashSet deployments = new HashSet(); deployments.addAll(this.applicationCtxs.values()); return Collections.unmodifiableCollection(deployments); } /** * Scan the applications for changes. */ public synchronized Collection getModifiedDeployments() throws Exception { ArrayList modified = new ArrayList(); Collection apps = getApplications(); boolean trace = log.isTraceEnabled(); if( trace ) log.trace("Checking applications for modifications"); if( trace ) log.trace("Aquiring content read lock"); contentLock.readLock().lock(); try { if( apps != null ) { Iterator iter = apps.iterator(); while( iter.hasNext() ) { VFSDeployment ctx = iter.next(); VirtualFile root = ctx.getRoot(); // See if this file is locked if(this.lockedApps.contains(root.getPathName())) { if(trace) log.trace("Ignoring locked application: "+root); continue; } Long rootLastModified = root.getLastModified(); String name = root.getPathName(); // Check for removal if( root.exists() == false ) { ModificationInfo info = new ModificationInfo(ctx, rootLastModified, ModifyStatus.REMOVED); modified.add(info); iter.remove(); if( trace ) log.trace(name+" was removed"); } // Check for modification else if( root.hasBeenModified() ) { if( trace ) log.trace(name+" was modified: "+rootLastModified); // Need to create a duplicate ctx VFSDeployment ctx2 = loadDeploymentData(root); ModificationInfo info = new ModificationInfo(ctx2, rootLastModified, ModifyStatus.MODIFIED); modified.add(info); } // TODO: this could check metadata files modifications as well } // Now check for additions for (File applicationDir : applicationDirs) { VirtualFile deployDir = VFS.getRoot(applicationDir.toURI()); List children = deployDir.getChildren(); for(VirtualFile vf : children) { URI uri = vf.toURI(); if( applicationCtxs.containsKey(uri.toString()) == false ) { VFSDeployment ctx = loadDeploymentData(vf); ModificationInfo info = new ModificationInfo(ctx, vf.getLastModified(), ModifyStatus.ADDED); modified.add(info); applicationCtxs.put(vf.toURI().toString(), ctx); } } } } } finally { contentLock.readLock().unlock(); if( trace ) log.trace("Released content read lock"); } if(modified.size() > 0) lastModified = System.currentTimeMillis(); return modified; } public Collection getDeployments(DeploymentPhase phase) throws Exception { Collection ctxs = null; switch( phase ) { case BOOTSTRAP: ctxs = this.getBootstraps(); break; case DEPLOYER: break; case APPLICATION: ctxs = this.getApplications(); break; } return ctxs; } public VFSDeployment removeDeployment(String name, DeploymentPhase phase) throws Exception { VFSDeployment ctx = null; switch( phase ) { case BOOTSTRAP: ctx = this.removeBootstrap(name); break; case DEPLOYER: ctx = this.removeDeployer(name); break; case APPLICATION: ctx = this.removeApplication(name); break; } return ctx; } public String toString() { StringBuilder tmp = new StringBuilder(super.toString()); tmp.append("(root="); tmp.append(root); tmp.append(")"); return tmp.toString(); } /** * Create a profile deployment repository * * @throws IOException */ public void create() throws Exception { File profileRoot = root; // server/{name}/deploy for (File applicationDir : applicationDirs) { if(applicationDir.exists() == true) continue; if( applicationDir.mkdirs() == false ) throw new IOException("Failed to create profile deploy dir: "+applicationDir); } } /** * Load the profile deployments * * @throws IOException * @throws NoSuchProfileException */ public void load() throws Exception { File profileRoot = root; if( profileRoot.exists() == false ) throw new Exception("Profile root does not exists: "+profileRoot); // server/{name}/deploy for (File applicationDir : applicationDirs) { if( applicationDir.exists() == false ) throw new FileNotFoundException("Profile contains no deploy dir: "+applicationDir); } for (File applicationDir : applicationDirs) { VFS deployVFS = VFS.getVFS(applicationDir.toURI()); loadApplications(deployVFS.getRoot()); } this.lastModified = System.currentTimeMillis(); } /** * Remove the contents of the profile repository * @throws IOException * @throws NoSuchProfileException */ public void remove() throws IOException { File profileRoot = root; Files.delete(profileRoot); } protected void addBootstrap(String vfsPath, VFSDeployment ctx) throws Exception { } protected void addDeployer(String vfsPath, VFSDeployment ctx) throws Exception { } protected void addApplication(String vfsPath, VFSDeployment ctx) throws Exception { this.applicationCtxs.put(vfsPath, ctx); } protected VFSDeployment getBootstrap(String vfsPath) throws Exception { VFSDeployment ctx = null; return ctx; } protected Collection getBootstraps() throws Exception { Collection ctxs = null; return ctxs; } protected URI getPhaseURI(DeploymentPhase phase) { URI uri = null; switch( phase ) { case BOOTSTRAP: uri = getBootstrapURI(); break; case DEPLOYER: break; case APPLICATION: uri = getApplicationURI(); break; case APPLICATION_TRANSIENT: // TODO break; } return uri; } protected File getPhaseDir(DeploymentPhase phase) { File dir = null; switch( phase ) { case BOOTSTRAP: break; case DEPLOYER: break; case APPLICATION: dir = applicationDirs[0]; break; case APPLICATION_TRANSIENT: // TODO break; } return dir; } protected URI getBootstrapURI() { return null; } protected URI getApplicationURI() { File applicationDir = applicationDirs[0]; return applicationDir.toURI(); } protected VFSDeployment getApplication(String vfsPath) throws Exception { VFSDeployment ctx = applicationCtxs.get(vfsPath); if( ctx == null ) { // Try to find the simple name log.debug("Failed to find application for: "+vfsPath+", scanning for simple name"); for(VFSDeployment deployment : applicationCtxs.values()) { log.info("Checking: "+deployment.getSimpleName()); if(deployment.getSimpleName().equals(vfsPath)) { log.debug("Matched to simple name of deployment:"+deployment); ctx = deployment; break; } } if(ctx == null) throw new Exception(vfsPath); } return ctx; } protected Collection getApplications() throws Exception { return applicationCtxs.values(); } protected VFSDeployment removeBootstrap(String vfsPath) throws IOException { VFSDeployment vfsDeployment = null; return vfsDeployment; } // this is an infinite loop protected VFSDeployment removeDeployer(String vfsPath) throws IOException { VFSDeployment vfsDeployment = null; return vfsDeployment; } protected VFSDeployment removeApplication(String vfsPath) throws IOException { VFSDeployment vfsDeployment = applicationCtxs.get(vfsPath); if(vfsDeployment == null) throw new IllegalStateException("Deployment not found: " + vfsPath); // Find the application dir File applicationDir = applicationDirs[0]; File deploymentFile = new File(applicationDir, vfsDeployment.getSimpleName()); if( Files.delete(deploymentFile) == false ) throw new IOException("Failed to delete: "+deploymentFile); return this.applicationCtxs.remove(vfsPath); } protected void setBootstrapURI(URI uri) { } protected void setDeployersURI(URI uri) { } /** * Load all the applications under the applicationDir. * * @param applicationDir * @throws IOException */ private void loadApplications(VirtualFile applicationDir) throws IOException { List children = applicationDir.getChildren(); for(VirtualFile vf : children) { VFSDeployment vfCtx = loadDeploymentData(vf); applicationCtxs.put(vfCtx.getName(), vfCtx); } } /** * TODO: this could be dropped since the serialize aspect loads the data * @param file * @return the deployment */ private VFSDeployment loadDeploymentData(VirtualFile file) { // Check for a persisted context // Load the base deployment VFSDeployment deployment = VFSDeploymentFactory.getInstance().createVFSDeployment(file); log.debug("Created deployment: "+deployment); return deployment; } } ././@LongLink0000000000000000000000000000014500000000000011565 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/VirtualFileAdaptor.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/VirtualFileAdaptor.java0000644000175000017500000000755411026570116033414 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.support; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.ObjectStreamField; import java.io.Serializable; import java.net.URISyntaxException; import java.net.URL; import org.jboss.virtual.VFS; import org.jboss.virtual.VirtualFile; /** * @author Ales Justin */ public class VirtualFileAdaptor implements Serializable { private static final long serialVersionUID = -4509594124653184347L; private static final ObjectStreamField[] serialPersistentFields = { new ObjectStreamField("rootUrl", URL.class), new ObjectStreamField("path", String.class), }; /** Minimal info to get full vfs file structure */ private URL rootUrl; private String path; /** The virtual file */ private transient VirtualFile file; public VirtualFileAdaptor(VirtualFile file) { this.file = file; } public VirtualFileAdaptor(URL rootUrl, String path) { if (rootUrl == null) throw new IllegalArgumentException("Null root url"); if (path == null) throw new IllegalArgumentException("Null path"); this.rootUrl = rootUrl; this.path = path; } /** * Get the virtual file. * Create file from root url and path if it doesn't exist yet. * * @return virtual file root * @throws IOException for any error */ @SuppressWarnings("deprecation") protected VirtualFile getFile() throws IOException { if (file == null) { VirtualFile root = VFS.getRoot(rootUrl); file = root.findChild(path); } return file; } @SuppressWarnings("deprecation") public VirtualFileAdaptor findChild(String child) throws IOException { VirtualFile vf = getFile().findChild(child); return new VirtualFileAdaptor(vf); } public URL toURL() { try { return getFile().toURL(); } catch (Exception e) { return null; } } private void writeObject(ObjectOutputStream out) throws IOException, URISyntaxException { URL url = rootUrl; if (url == null) { VFS vfs = getFile().getVFS(); url = vfs.getRoot().toURL(); } String pathName = path; if (pathName == null) pathName = getFile().getPathName(); ObjectOutputStream.PutField fields = out.putFields(); fields.put("rootUrl", url); fields.put("path", pathName); out.writeFields(); } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { ObjectInputStream.GetField fields = in.readFields(); rootUrl = (URL) fields.get("rootUrl", null); path = (String) fields.get("path", null); } }././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/MockVFSContextFactory.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/MockVFSContextFactory.j0000644000175000017500000000713710506715240033326 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.support; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VFSContextFactory; /** * MockVFSContextFactory. * * @author Adrian Brock * @version $Revision: 1.1 $ */ public class MockVFSContextFactory implements VFSContextFactory { /** The protocols */ public static final String[] protocols = { "mock" }; /** The contexts */ private Map contexts = new ConcurrentHashMap(); /** When to throw an IOException */ private String ioException = ""; public String[] getProtocols() { return protocols; } /** * Set the ioException. * * @param ioException the ioException. */ public void setIOException(String ioException) { this.ioException = ioException; } /** * Check whether we should throw an IOException * * @param when when to throw * @throws IOException when requested */ public void throwIOException(String when) throws IOException { if (ioException.equals(when)) throw new IOException("Throwing IOException from " + when); } public VFSContext getVFS(URI rootURI) throws IOException { throwIOException("getVFSURI"); VFSContext context = contexts.get(rootURI); if (context == null) throw new IOException("No such context " + rootURI); return context; } public VFSContext getVFS(URL rootURL) throws IOException { throwIOException("getVFSURL"); try { return getVFS(rootURL.toURI()); } catch (URISyntaxException e) { throw new IOException("Error creating URI: " + rootURL); } } /** * Add a context * * @param context the context * @throws IllegalArgumentException for a null context */ public void addVFSContext(VFSContext context) { if (context == null) throw new IllegalArgumentException("Null context"); contexts.put(context.getRootURI(), context); } /** * Remove a context * * @param context the context * @throws IllegalArgumentException for a null context */ public void removeVFSContext(VFSContext context) { if (context == null) throw new IllegalArgumentException("Null context"); contexts.remove(context.getRootURI()); } /** * Reset */ public void reset() { contexts.clear(); ioException = ""; } } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/MetaDataMatchFilter.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/MetaDataMatchFilter.jav0000644000175000017500000000601110511311513033270 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2005, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.support; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.VirtualFileFilterWithAttributes; import org.jboss.virtual.VisitorAttributes; /** * Copy of org.jboss.deployers.plugins.structure.MetaDataMatchFilter for FileVFSUnitTestCase.testGetMetaDataPackedJar() * * @author adrian@jboss.org * @version $Revision: 44223 $ */ public class MetaDataMatchFilter implements VirtualFileFilterWithAttributes { /** The name */ private String name; /** The suffix */ private String suffix; /** The attributes */ private VisitorAttributes attributes; /** * Create a new MetaDataMatchFilter. * using {@link VisitorAttributes#LEAVES_ONLY} * * @param name the name to exactly match * @param suffix the suffix to partially match * @throws IllegalArgumentException if both the name and suffix are null */ public MetaDataMatchFilter(String name, String suffix) { this(name, suffix, null); } /** * Create a new MetaDataMatchFilter. * * @param name the name to exactly match * @param suffix the suffix to partially match * @param attributes the attributes, pass null to use {@link VisitorAttributes#LEAVES_ONLY} * @throws IllegalArgumentException if both the name and suffix are null */ public MetaDataMatchFilter(String name, String suffix, VisitorAttributes attributes) { if (name == null && suffix == null) throw new IllegalArgumentException("Null name and suffix"); this.name = name; this.suffix = suffix; if (attributes == null) attributes = VisitorAttributes.LEAVES_ONLY; this.attributes = attributes; } public VisitorAttributes getAttributes() { return attributes; } public boolean accepts(VirtualFile file) { String fileName = file.getName(); if (name != null && fileName.equals(name)) return true; if (suffix != null) return fileName.endsWith(suffix); return false; } } ././@LongLink0000000000000000000000000000015700000000000011570 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/MockSimpleVirtualFileHandler.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/MockSimpleVirtualFileHa0000644000175000017500000000356010743732504033415 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.support; import java.io.IOException; import org.jboss.virtual.spi.VirtualFileHandler; /** * MockSimpleVirtualFileHandler. * * @author Adrian Brock * @version $Revision: 1.1 $ */ public class MockSimpleVirtualFileHandler extends AbstractMockVirtualFileHandler { /** The serialVersionUID */ private static final long serialVersionUID = -7967261672121081602L; /** * Create a new MockSimpleVirtualFileHandler. * * @param context the context * @param parent the parent * @param name the name */ public MockSimpleVirtualFileHandler(MockVFSContext context, MockSimpleVirtualFileHandler parent, String name) { super(context, parent, name); } public VirtualFileHandler getChild(String path) throws IOException { throwIOException("getChild"); return simpleFindChild(path); } } ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/PatternVirtualFileVisitor.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/PatternVirtualFileVisit0000644000175000017500000000443411031446223033525 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.support; import java.util.List; import java.util.ArrayList; import org.jboss.virtual.VirtualFileVisitor; import org.jboss.virtual.VisitorAttributes; import org.jboss.virtual.VirtualFile; /** * @author Ales Justin */ public class PatternVirtualFileVisitor implements VirtualFileVisitor { private String subPattern = ".class"; private List resources = new ArrayList(); public PatternVirtualFileVisitor() { } public PatternVirtualFileVisitor(String subPattern) { this.subPattern = subPattern; } public VisitorAttributes getAttributes() { return VisitorAttributes.RECURSE_LEAVES_ONLY; } public void visit(VirtualFile vf) { String pathName = vf.getPathName(); if (pathName.endsWith(subPattern)) resources.add(pathName); } public List getResources() { return resources; } public int size() { return resources.size(); } public String toString() { StringBuffer buffer = new StringBuffer(); buffer.append("sub-pattern: ").append(subPattern); buffer.append(", resources: ").append(resources); return buffer.toString(); } } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/MockVirtualFileFilter.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/MockVirtualFileFilter.j0000644000175000017500000000413210506452640033361 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.support; import java.util.ArrayList; import java.util.List; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.VisitorAttributes; import org.jboss.virtual.plugins.vfs.helpers.AbstractVirtualFileFilterWithAttributes; /** * MockVirtualFileFilter. * * @author Adrian Brock * @version $Revision: 1.1 $ */ public class MockVirtualFileFilter extends AbstractVirtualFileFilterWithAttributes { /** The visited files */ private List visited = new ArrayList(); /** * Create a new MockVirtualFileFilter. */ public MockVirtualFileFilter() { super(); } /** * Create a new MockVirtualFileFilter. * * @param attributes the visitor attributes */ public MockVirtualFileFilter(VisitorAttributes attributes) { super(attributes); } /** * Get the visited files * * @return the files */ public List getVisited() { return visited; } public boolean accepts(VirtualFile file) { visited.add(file); return true; } } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/JarOAContextFactory.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/JarOAContextFactory.jav0000644000175000017500000000315310734323332033333 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.support; import java.io.IOException; import java.net.URI; import java.net.URL; import org.jboss.virtual.plugins.context.jar.JarContextFactory; import org.jboss.virtual.spi.VFSContext; /** * @author Ales Justin */ public class JarOAContextFactory extends JarContextFactory { public VFSContext getVFS(URL root) throws IOException { return super.getVFS(OptionsAwareURI.toURL(root)); } public VFSContext getVFS(URI root) throws IOException { return getVFS(OptionsAwareURI.toURI(root).toURL()); } } libjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/MockVFSContext.java0000644000175000017500000000776211001375747032477 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.support; import java.io.IOException; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import org.jboss.util.UnexpectedThrowable; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.plugins.context.AbstractVFSContext; import org.jboss.virtual.spi.VirtualFileHandler; /** * MockVFSContext. * * @author Adrian Brock * @version $Revision: 1.1 $ */ public class MockVFSContext extends AbstractVFSContext { /** The root handler */ private VirtualFileHandler root; /** The root virtual file */ private VirtualFile rootFile; /** When to throw an IOException */ private String ioException = ""; /** * Create a root mock uri * * @param name the name * @return the uri */ public static final URI createRootMockURI(String name) { try { return new URI("mock", "", "/" + name, null); } catch (URISyntaxException e) { throw new UnexpectedThrowable("Unexpected", e); } } /** * Create mock URL * * @param uri the uri * @return the url * @throws MalformedURLException for any error */ public static URL createMockURL(URI uri) throws MalformedURLException { return new URL(uri.getScheme(), uri.getHost(), uri.getPort(), uri.getRawPath(), MockURLStreamHandler.INSTANCE); } /** * Create a new MockVFSContext. * * @param name the name */ public MockVFSContext(String name) { super(createRootMockURI(name)); } public String getName() { return root.getName(); } /** * Set the ioException. * * @param ioException the ioException. */ public void setIOException(String ioException) { this.ioException = ioException; } /** * Check whether we should throw an IOException * * @param when when to throw * @throws IOException when requested */ public void throwIOException(String when) throws IOException { if (ioException.equals(when)) throw new IOException("Throwing IOException from " + when); } public VirtualFileHandler getRoot() throws IOException { throwIOException("getRoot"); return root; } public AbstractMockVirtualFileHandler getMockRoot() throws IOException { return (AbstractMockVirtualFileHandler) root; } /** * Set the root. * * @param root the root. */ public void setRoot(VirtualFileHandler root) { this.root = root; if (root != null) rootFile = root.getVirtualFile(); } @Override protected void finalize() throws Throwable { if (rootFile != null) rootFile.close(); super.finalize(); } /** * Get the root URL * * @return the url * @throws MalformedURLException for any error */ public URL getRootURL() throws MalformedURLException { return createMockURL(getRootURI()); } } ././@LongLink0000000000000000000000000000016300000000000011565 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/MockStructuredVirtualFileHandler.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/MockStructuredVirtualFi0000644000175000017500000000432010743732504033531 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.support; import java.io.IOException; import org.jboss.virtual.plugins.context.StructuredVirtualFileHandler; import org.jboss.virtual.spi.VirtualFileHandler; /** * MockStructuredVirtualFileHandler. * * @author Adrian Brock * @version $Revision: 1.1 $ */ public class MockStructuredVirtualFileHandler extends AbstractMockVirtualFileHandler implements StructuredVirtualFileHandler { /** The serialVersionUID */ private static final long serialVersionUID = -7967261672121081602L; /** * Create a new MockStructuredVirtualFileHandler. * * @param context the context * @param parent the parent * @param name the name */ public MockStructuredVirtualFileHandler(MockVFSContext context, MockStructuredVirtualFileHandler parent, String name) { super(context, parent, name); } public VirtualFileHandler createChildHandler(String name) throws IOException { for (VirtualFileHandler child : getChildren(false)) { if (name.equals(child.getName())) return child; } return null; } public VirtualFileHandler getChild(String path) throws IOException { return structuredFindChild(path); } } ././@LongLink0000000000000000000000000000016000000000000011562 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/MockVirtualFileHandlerVisitor.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/MockVirtualFileHandlerV0000644000175000017500000000423110507221160033377 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.support; import java.util.ArrayList; import java.util.List; import org.jboss.virtual.VisitorAttributes; import org.jboss.virtual.plugins.vfs.helpers.AbstractVirtualFileHandlerVisitor; import org.jboss.virtual.spi.VirtualFileHandler; /** * MockVirtualFileHandlerVisitor. * * @author Adrian Brock * @version $Revision: 1.1 $ */ public class MockVirtualFileHandlerVisitor extends AbstractVirtualFileHandlerVisitor { /** The visited handlers */ private List visited = new ArrayList(); /** * Create a new MockVirtualFileHandlerVisitor. */ public MockVirtualFileHandlerVisitor() { super(); } /** * Create a new MockVirtualFileHandlerVisitor. * * @param attributes the visitor attributes */ public MockVirtualFileHandlerVisitor(VisitorAttributes attributes) { super(attributes); } /** * Get the visited handlers * * @return the handlers */ public List getVisited() { return visited; } public void visit(VirtualFileHandler handler) { visited.add(handler); } } ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/MockVirtualFileVisitor.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/MockVirtualFileVisitor.0000644000175000017500000000405310507235743033427 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.support; import java.util.ArrayList; import java.util.List; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.VisitorAttributes; import org.jboss.virtual.plugins.vfs.helpers.AbstractVirtualFileVisitor; /** * MockVirtualFileVisitor. * * @author Adrian Brock * @version $Revision: 1.1 $ */ public class MockVirtualFileVisitor extends AbstractVirtualFileVisitor { /** The visited files */ private List visited = new ArrayList(); /** * Create a new MockVirtualFileVisitor. */ public MockVirtualFileVisitor() { super(); } /** * Create a new MockVirtualFileVisitor. * * @param attributes the visitor attributes */ public MockVirtualFileVisitor(VisitorAttributes attributes) { super(attributes); } /** * Get the visited files * * @return the files */ public List getVisited() { return visited; } public void visit(VirtualFile file) { visited.add(file); } } ././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/AbstractMockVirtualFileHandler.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/AbstractMockVirtualFile0000644000175000017500000001727711031776370033470 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.support; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.Collections; import java.util.List; import java.util.Iterator; import java.util.concurrent.CopyOnWriteArrayList; import org.jboss.util.UnexpectedThrowable; import org.jboss.virtual.plugins.context.AbstractVirtualFileHandler; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VirtualFileHandler; /** * AbstractMockVirtualFileHandler. * * @author Adrian Brock * @version $Revision: 1.1 $ */ public abstract class AbstractMockVirtualFileHandler extends AbstractVirtualFileHandler { /** The serialVersionUID */ private static final long serialVersionUID = -7967261672121081602L; /** The URI */ private URI uri; /** The children */ private List children = new CopyOnWriteArrayList(); /** Last modified */ private long lastModified; /** Size */ private long size; /** Does the file exist */ private boolean exists = true; /** Is a leaf */ private boolean leaf = true; /** Is a hidden */ private boolean hidden; /** Is nested */ private boolean nested; /** The stream */ private byte[] stream; /** When to throw an IOException */ private String ioException = ""; /** Delete succeeds */ private boolean doDelete = true; /** * Create a root mock uri * * @param context the vfs context * @param parent the parent file * @param name the name * @return the uri */ public static URI createMockURI(VFSContext context, VirtualFileHandler parent, String name) { try { String uri; if (parent != null) uri = parent.toURI().toString(); else uri = context.getRootURI().toString(); if (name.length() != 0) uri = uri + "/" + name; return new URI(uri); } catch (URISyntaxException e) { throw new UnexpectedThrowable("Unexpected", e); } } /** * Create a new AbstractMockVirtualFileHandler. * * @param context the context * @param parent the parent * @param name the name */ protected AbstractMockVirtualFileHandler(MockVFSContext context, AbstractMockVirtualFileHandler parent, String name) { super(context, parent, name); this.uri = createMockURI(context, parent, name); if (parent != null) parent.addChild(this); } /** * Set the ioException. * * @param ioException the ioException. */ public void setIOException(String ioException) { this.ioException = ioException; } /** * Check whether we should throw an IOException * * @param when when to throw * @throws IOException when requested */ public void throwIOException(String when) throws IOException { if (ioException.equals(when)) throw new IOException("Throwing IOException from " + when); } public List getChildren(boolean ignoreErrors) throws IOException { checkClosed(); if (ignoreErrors == false) throwIOException("getChildren"); return Collections.unmodifiableList(children); } public void addChild(VirtualFileHandler child) { checkClosed(); if (child == null) throw new IllegalArgumentException("Null child"); if (children.contains(child) == false) children.add(child); leaf = false; } public boolean removeChild(String path) throws IOException { if (path == null) throw new IllegalArgumentException("Null path"); Iterator it = children.iterator(); while (it.hasNext()) { VirtualFileHandler handler = it.next(); if (path.equals(handler.getName())) { it.remove(); return true; } } return false; } public long getLastModified() throws IOException { checkClosed(); throwIOException("getLastModified"); return lastModified; } /** * Set the lastModified. * * @param lastModified the lastModified. */ public void setLastModified(long lastModified) { this.lastModified = lastModified; } public long getSize() throws IOException { checkClosed(); throwIOException("getSize"); return size; } /** * Set the size. * * @param size the size. */ public void setSize(long size) { this.size = size; } public boolean exists() { return exists; } public void setExists(boolean exists) { this.exists = exists; } public boolean isLeaf() throws IOException { checkClosed(); throwIOException("isLeaf"); return leaf; } /** * Set leaf. * * @param leaf whether this is a leaf. */ public void setLeaf(boolean leaf) { this.leaf = leaf; } public boolean isHidden() throws IOException { checkClosed(); throwIOException("isHidden"); return hidden; } /** * Set the hidden. * * @param hidden the hidden. */ public void setHidden(boolean hidden) { this.hidden = hidden; } public boolean isNested() throws IOException { return nested; } public void setNested(boolean nested) { this.nested = nested; } public boolean delete(int gracePeriod) throws IOException { checkClosed(); throwIOException("delete"); return doDelete; } /** * Set the stream. * * @param stream the stream. */ public void setStream(byte[] stream) { this.stream = stream; } public InputStream openStream() throws IOException { checkClosed(); throwIOException("openStream"); return new MockInputStream(stream); } public URI toURI() { return uri; } public URL toVfsUrl() throws MalformedURLException, URISyntaxException { return toURL(); } @Override public URL toURL() throws MalformedURLException, URISyntaxException { return MockVFSContext.createMockURL(uri); } protected void internalReplaceChild(VirtualFileHandler original, VirtualFileHandler replacement) { children.remove(original); children.add(replacement); } @Override public VirtualFileHandler getParent() throws IOException { throwIOException("getParent"); return super.getParent(); } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); } } libjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/MockInputStream.java0000644000175000017500000000367410506452640032742 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.support; import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.concurrent.atomic.AtomicBoolean; /** * MockInputStream. * * @author Adrian Brock * @version $Revision: 1.1 $ */ public class MockInputStream extends ByteArrayInputStream { /** Whether we are closed */ private AtomicBoolean closed = new AtomicBoolean(false); /** * Create a new MockInputStream. * * @param buf * @param offset * @param length */ public MockInputStream(byte[] buf, int offset, int length) { super(buf, offset, length); } /** * Create a new MockInputStream. * * @param buf */ public MockInputStream(byte[] buf) { super(buf); } public void close() throws IOException { closed.set(true); } public int read() { if (closed.get()) return -1; else return super.read(); } } ././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/InputStreamCallerChecker.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/InputStreamCallerChecke0000644000175000017500000000766411037323106033433 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.support; import java.io.InputStream; import java.io.IOException; import java.util.Collection; import java.util.Arrays; import java.util.Set; import java.util.HashSet; /** * Track down callers. * Checking if they close properly. * * @author Ales Justin */ public class InputStreamCallerChecker extends InputStream { private static final Collection excluded = Arrays.asList( "java.lang.Thread", "org.jboss.virtual.InputStreamDelegate", "org.jboss.virtual.VirtualFile", "org.jboss.virtual.plugins.vfs.VirtualFileURLConnection", "java.net.URL", "org.jboss.deployers.vfs.spi.deployer.SecurityActions", "org.jboss.deployers.vfs.spi.deployer.SecurityActions$FileActions$1", "org.jboss.deployers.vfs.spi.deployer.SecurityActions$FileActions$2", "org.jboss.deployers.vfs.spi.deployer.JBossXBDeployerHelper", "org.jboss.deployers.vfs.spi.deployer.AbstractVFSParsingDeployer", "org.jboss.classloading.spi.visitor.ResourceContext" ); private static final Set callers = new HashSet(); private InputStream delegate; public InputStreamCallerChecker(InputStream delegate) { if (delegate == null) throw new IllegalArgumentException("Null delegate"); this.delegate = delegate; Thread current = Thread.currentThread(); StackTraceElement[] stack = current.getStackTrace(); int i = 0; StackTraceElement caller = stack[i]; while(excluded.contains(caller.getClassName())) { caller = stack[++i]; } callers.add(caller.getClassName()); System.out.println("Callers = " + callers); } public int read() throws IOException { return delegate.read(); } public int read(byte b[]) throws IOException { return delegate.read(b); } public int read(byte b[], int off, int len) throws IOException { return delegate.read(b, off, len); } public long skip(long n) throws IOException { return delegate.skip(n); } public int available() throws IOException { return delegate.available(); } public void close() throws IOException { Thread current = Thread.currentThread(); StackTraceElement[] stack = current.getStackTrace(); // should be at index 3, 4th in line StackTraceElement caller = stack[3]; String className = caller.getClassName(); System.out.println("closer = " + className); callers.remove(className); delegate.close(); } public synchronized void mark(int readlimit) { delegate.mark(readlimit); } public synchronized void reset() throws IOException { delegate.reset(); } public boolean markSupported() { return delegate.markSupported(); } }././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/MockURLStreamHandler.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/MockURLStreamHandler.ja0000644000175000017500000000321310506715240033237 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.support; import java.io.IOException; import java.net.URL; import java.net.URLConnection; import java.net.URLStreamHandler; /** * MockURLStreamHandler. * * @author Adrian Brock * @version $Revision: 1.1 $ */ public class MockURLStreamHandler extends URLStreamHandler { /** The singleton */ public static final MockURLStreamHandler INSTANCE = new MockURLStreamHandler(); /** * Singleton */ private MockURLStreamHandler() { } protected URLConnection openConnection(URL u) throws IOException { throw new org.jboss.util.NotImplementedException("openConnection"); } } libjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/OptionsAwareURI.java0000644000175000017500000000767311030447715032653 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.support; import java.net.URI; import java.net.URL; import java.net.URISyntaxException; import java.io.IOException; import java.util.Iterator; import java.util.LinkedList; import org.jboss.virtual.VFSUtils; /** * Flag holder. * * @author Ales Justin * @authos Marko Strukelj */ public class OptionsAwareURI { public static final String Copy = VFSUtils.USE_COPY_QUERY + "=true"; public static final String NoReaper = VFSUtils.NO_REAPER_QUERY + "=true"; private static ThreadLocal flagCopy = new OAInheritableThreadLocal(); private static ThreadLocal flagNoReaper = new OAInheritableThreadLocal(); public static void set(String name) { if (Copy.equals(name)) flagCopy.set(Boolean.TRUE); else if (NoReaper.equals(name)) flagNoReaper.set(Boolean.TRUE); else throw new IllegalArgumentException(name); } public static boolean get(String name) { if (Copy.equals(name)) return flagCopy.get(); else if (NoReaper.equals(name)) return flagNoReaper.get(); else throw new IllegalArgumentException(name); } public static void clear(String name) { if (Copy.equals(name)) flagCopy.set(Boolean.FALSE); else if (NoReaper.equals(name)) flagNoReaper.set(Boolean.FALSE); else throw new IllegalArgumentException(name); } public static URL toURL(URL url) throws IOException { LinkedList params = new LinkedList(); if (get(Copy)) params.add(Copy); if (get(NoReaper)) params.add(NoReaper); if (params.size() == 0) return url; StringBuilder sb = new StringBuilder(url.toExternalForm()); // if options are set on URL we overwrite them int qpos = sb.indexOf("?"); if (qpos > 0) sb.setLength(qpos); Iterator it = params.iterator(); for (int i=0; it.hasNext(); i++) { if (i == 0) sb.append("?"); else sb.append("&"); sb.append(it.next()); } return new URL(sb.toString()); } public static URI toURI(URI uri) throws IOException { try { return toURL(uri.toURL()).toURI(); } catch (URISyntaxException e) { throw new IOException(e.getReason()); } } public String toString() { return "flagCopy=" + get(Copy) + ", flagNoReaper=" + get(NoReaper); } static class OAInheritableThreadLocal extends InheritableThreadLocal { protected Boolean initialValue() { return Boolean.FALSE; } public String toString() { Boolean value = get(); return String.valueOf(value); } } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/FileOAContextFactory.javalibjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/FileOAContextFactory.ja0000644000175000017500000000317110734323332033310 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.support; import java.net.URL; import java.net.URI; import java.io.IOException; import org.jboss.virtual.plugins.context.file.FileSystemContextFactory; import org.jboss.virtual.spi.VFSContext; /** * @author Ales Justin */ public class FileOAContextFactory extends FileSystemContextFactory { public VFSContext getVFS(URL root) throws IOException { return super.getVFS(OptionsAwareURI.toURL(root)); } public VFSContext getVFS(URI root) throws IOException { return super.getVFS(OptionsAwareURI.toURI(root)); } } libjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/OperatingSystem.java0000644000175000017500000000325210773514422033005 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.support; /** * OS. * * TODO - remove together with OSAwareTest * * @author Ales Justin */ public enum OperatingSystem { LINUX("linux"), MAC("mac"), WINDOWS("windows"), OTHER(null); private String name; OperatingSystem(String name) { this.name = name; } public static OperatingSystem matchOS(String osName) { OperatingSystem[] systems = values(); for(int i = 0; i < systems.length - 1; i++) { if (osName.toLowerCase().contains(systems[i].name)) return systems[i]; } return OTHER; } } libjboss-vfs-java-2.0.1.GA.orig/src/test/java/org/jboss/test/virtual/support/ClassPathIterator.java0000644000175000017500000002015011023170167033231 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, Red Hat Middleware LLC, and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.virtual.support; import java.io.File; import java.io.FileFilter; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.VirtualFileFilter; import org.jboss.virtual.plugins.vfs.VirtualFileURLConnection; /** * ClassPathIterator logic used by UCL package mapping * * @author Scott.Stark@jboss.org * @version $Revision:$ */ public class ClassPathIterator { ZipInputStream zis; FileIterator fileIter; File file; VirtualFileIterator vfIter; VirtualFile vf; int rootLength; public ClassPathIterator(URL url) throws IOException { String protocol = url != null ? url.getProtocol() : null; if( protocol == null ) { } else if( protocol.equals("file") ) { File tmp = new File(url.getFile()); if( tmp.isDirectory() ) { rootLength = tmp.getPath().length() + 1; fileIter = new FileIterator(tmp); } else { // Assume this is a jar archive InputStream is = new FileInputStream(tmp); zis = new ZipInputStream(is); } } else if( protocol.startsWith("vfs") ) { VirtualFileURLConnection conn = (VirtualFileURLConnection)url.openConnection(); vf = conn.getContent(); rootLength = vf.getPathName().length() + 1; vfIter = new VirtualFileIterator(vf); } else { // Assume this points to a jar InputStream is = url.openStream(); zis = new ZipInputStream(is); } } public ClassPathEntry getNextEntry() throws IOException { ClassPathEntry entry = null; if( zis != null ) { ZipEntry zentry = zis.getNextEntry(); if( zentry != null ) entry = new ClassPathEntry(zentry); } else if( fileIter != null ) { File fentry = fileIter.getNextEntry(); if( fentry != null ) entry = new ClassPathEntry(fentry, rootLength); file = fentry; } else if( vfIter != null ) { VirtualFile fentry = vfIter.getNextEntry(); if( fentry != null ) entry = new ClassPathEntry(fentry, rootLength); vf = fentry; } return entry; } InputStream getInputStream() throws IOException { InputStream is = zis; if( zis == null ) { is = new FileInputStream(file); } return is; } public void close() throws IOException { if( zis != null ) zis.close(); } static class FileIterator { LinkedList subDirectories = new LinkedList(); FileFilter filter; File[] currentListing; int index = 0; FileIterator(File start) { String name = start.getName(); // Don't recurse into wars boolean isWar = name.endsWith(".war"); if( isWar ) currentListing = new File[0]; else currentListing = start.listFiles(); } FileIterator(File start, FileFilter filter) { String name = start.getName(); // Don't recurse into wars boolean isWar = name.endsWith(".war"); if( isWar ) currentListing = new File[0]; else currentListing = start.listFiles(filter); this.filter = filter; } File getNextEntry() { File next = null; if( index >= currentListing.length && subDirectories.size() > 0 ) { do { File nextDir = (File) subDirectories.removeFirst(); currentListing = nextDir.listFiles(filter); } while( currentListing.length == 0 && subDirectories.size() > 0 ); index = 0; } if( index < currentListing.length ) { next = currentListing[index ++]; if( next.isDirectory() ) subDirectories.addLast(next); } return next; } } static class VirtualFileIterator { LinkedList subDirectories = new LinkedList(); VirtualFileFilter filter; List currentListing; int index = 0; VirtualFileIterator(VirtualFile start) throws IOException { this(start, null); } VirtualFileIterator(VirtualFile start, VirtualFileFilter filter) throws IOException { String name = start.getName(); // Don't recurse into wars boolean isWar = name.endsWith(".war"); if( isWar ) currentListing = new ArrayList(); else currentListing = start.getChildren(); this.filter = filter; } VirtualFile getNextEntry() throws IOException { VirtualFile next = null; if( index >= currentListing.size() && subDirectories.size() > 0 ) { do { VirtualFile nextDir = subDirectories.removeFirst(); currentListing = nextDir.getChildren(filter); } while( currentListing.size() == 0 && subDirectories.size() > 0 ); index = 0; } if( index < currentListing.size() ) { next = currentListing.get(index); index ++; if( next.isLeaf() == false ) subDirectories.addLast(next); } return next; } } public static class ClassPathEntry { public String name; public ZipEntry zipEntry; public File fileEntry; public VirtualFile vfEntry; ClassPathEntry(ZipEntry zipEntry) { this.zipEntry = zipEntry; this.name = zipEntry.getName(); } ClassPathEntry(File fileEntry, int rootLength) { this.fileEntry = fileEntry; this.name = fileEntry.getPath().substring(rootLength); } ClassPathEntry(VirtualFile vfEntry, int rootLength) { this.vfEntry = vfEntry; this.name = vfEntry.getPathName().substring(rootLength); } String getName() { return name; } /** Convert the entry path to a package name */ String toPackageName() { String pkgName = name; char separatorChar = zipEntry != null ? '/' : File.separatorChar; int index = name.lastIndexOf(separatorChar); if( index > 0 ) { pkgName = name.substring(0, index); pkgName = pkgName.replace(separatorChar, '.'); } else { // This must be an entry in the default package (e.g., X.class) pkgName = ""; } return pkgName; } boolean isDirectory() { boolean isDirectory = false; if( zipEntry != null ) isDirectory = zipEntry.isDirectory(); else isDirectory = fileEntry.isDirectory(); return isDirectory; } } } libjboss-vfs-java-2.0.1.GA.orig/src/test/resources/0000755000175000017500000000000011146622514022001 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/0000755000175000017500000000000011146622523022577 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/0000755000175000017500000000000011146622523023556 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/nested/0000755000175000017500000000000011146622516025042 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/nested/nested_copy.jar0000644000175000017500000000231311024465404030047 0ustar twernertwernerPK ùqÈ8Ä=ÇhMETA-INF/empty.txtemptyPK à’j8<›@ÞÞ complex.jarPKø±L5 META-INF/þÊPKPKø±L5META-INF/MANIFEST.MFóMÌËLK-.Ñ K-*ÎÌϳR0Ô3àår.JM,IMÑuª ˜êĘ)h8¹:*W—¤æë(xæ%ëiòrñrPKš¼‰ŒCCPKC‹>5childKÍ-(©PKÄ=ÇhPK í±L5 subfolder/PK ‡°L5subfolder/subsubfolder/PK°L5"subfolder/subsubfolder/subsubchildKÎÏ-ÈI­Ð/.M¢´üœ”Ô"('9#3'PK³NOi PKC‹>5subfolder/subchildKÍ-(©PKÄ=ÇhPKø±L5 META-INF/þÊPKø±L5š¼‰ŒCC=META-INF/MANIFEST.MFPKC‹>5Ä=ÇhÂchildPK í±L5 üsubfolder/PK ‡°L5$subfolder/subsubfolder/PK°L5³NOi "Ysubfolder/subsubfolder/subsubchildPKC‹>5Ä=ÇhÄsubfolder/subchildPK½ PK ùqÈ8Ä=Çh META-INF/empty.txtPK à’j8<›@ÞÞ 5complex.jarPKy<libjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/nested/nested.jar0000644000175000017500000000231311024465404027015 0ustar twernertwernerPK ùqÈ8Ä=ÇhMETA-INF/empty.txtemptyPK à’j8<›@ÞÞ complex.jarPKø±L5 META-INF/þÊPKPKø±L5META-INF/MANIFEST.MFóMÌËLK-.Ñ K-*ÎÌϳR0Ô3àår.JM,IMÑuª ˜êĘ)h8¹:*W—¤æë(xæ%ëiòrñrPKš¼‰ŒCCPKC‹>5childKÍ-(©PKÄ=ÇhPK í±L5 subfolder/PK ‡°L5subfolder/subsubfolder/PK°L5"subfolder/subsubfolder/subsubchildKÎÏ-ÈI­Ð/.M¢´üœ”Ô"('9#3'PK³NOi PKC‹>5subfolder/subchildKÍ-(©PKÄ=ÇhPKø±L5 META-INF/þÊPKø±L5š¼‰ŒCC=META-INF/MANIFEST.MFPKC‹>5Ä=ÇhÂchildPK í±L5 üsubfolder/PK ‡°L5$subfolder/subsubfolder/PK°L5³NOi "Ysubfolder/subsubfolder/subsubchildPKC‹>5Ä=ÇhÄsubfolder/subchildPK½ PK ùqÈ8Ä=Çh META-INF/empty.txtPK à’j8<›@ÞÞ 5complex.jarPKy<libjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/path with spaces/0000755000175000017500000000000011146622516026707 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/path with spaces/unpacked-tst.jar/0000755000175000017500000000000011146622516032064 5ustar twernertwerner././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/path with spaces/unpacked-tst.jar/META-INF/libjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/path with spaces/unpacked-tst.jar/META-I0000755000175000017500000000000011146622516032721 5ustar twernertwerner././@LongLink0000000000000000000000000000016300000000000011565 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/path with spaces/unpacked-tst.jar/META-INF/MANIFEST.MFlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/path with spaces/unpacked-tst.jar/META-I0000644000175000017500000000053010530000650032702 0ustar twernertwernerManifest-Version: 1.0 Ant-Version: Apache Ant 1.6.5 Created-By: 1.5.0_06-b05 (Sun Microsystems Inc.) Specification-Title: tst.jar Specification-Version: 1.0.0.GA Specification-Vendor: JBoss Inc. Implementation-Title: tst.jar Implementation-URL: www.jboss.org Implementation-Version: 1.0.0.GA-jboss Implementation-Vendor: JBoss Inc. libjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/path with spaces/tst%20nospace.jar0000644000175000017500000000053111043041151031760 0ustar twernertwernerPKŲr5 META-INF/þÊPKPKŲr5META-INF/MANIFEST.MFóMÌËLK-.Ñ K-*ÎÌϳR0Ô3àår.JM,IMÑuª ˜êÄX*h—æ)øf&åW—¤æ+xæ%ëiòrñrPKrr`ŠGGPKŲr5 META-INF/þÊPKŲr5rr`ŠGG=META-INF/MANIFEST.MFPK}Ælibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/path with spaces/tst.jar0000644000175000017500000000053110530000650030177 0ustar twernertwernerPKŲr5 META-INF/þÊPKPKŲr5META-INF/MANIFEST.MFóMÌËLK-.Ñ K-*ÎÌϳR0Ô3àår.JM,IMÑuª ˜êÄX*h—æ)øf&åW—¤æ+xæ%ëiòrñrPKrr`ŠGGPKŲr5 META-INF/þÊPKŲr5rr`ŠGG=META-INF/MANIFEST.MFPK}Ælibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/badmf.jar0000644000175000017500000000674011025433745025336 0ustar twernertwernerPK !WÐ8Ä=Çh empty.txtemptyPK Ý’j8ía+Qyy innermf.jarPK 0¦q5 META-INF/þÊPK /¦q5¾oà‰¢META-INF/MANIFEST.MFMÌ1 Â0†á=ÿQ‡„©`¶êäP*®rÆ+=i¯%‡þ{#.®Ï÷ñ¶ÀÔ£d{Ã$4s0•óZ5ü'Íq@S¬Œ{WkuJŸö¸~ÿµów°¿3›îͦ¥˜fY%ã$æÌÑmµêŒÔS„\’öJyÄ`ˆÓÔ»¤ÒAÄ^ Á¨~ªÕPK 0¦q5 íAMETA-INF/þÊPK /¦q5¾oà‰¢¤+META-INF/MANIFEST.MFPK}æPK Ý’j8ãl2jar1.jarPK ®\S5 META-INF/þÊPK ­\S5ÐÃåͳUMETA-INF/MANIFEST.MFmޱ ƒ0„÷@Þ!c MÔA‡lZJ±´Km»–TkD£$ñí›:‰ÊmwwJ–`,}6²SœÌÇ(V³&îE^q#btÔ ,4ÿ|Èü·Ñ’]rŠI6 ­9TålQÖC.K™ ëtô!mœÔBËiþÁå¯Utš“KÒ3é1JÛ¾”ÝÐ/¶çýÊIemÏ=oVœ†uú»"WOèÄnpëCýPK xNS5org/PK xNS5 org/jboss/PK xNS5org/jboss/test/PK xNS5org/jboss/test/vfs/PK xNS5org/jboss/test/vfs/support/PK xNS5 org/jboss/test/vfs/support/jar1/PK xNS5†”øØ)8<org/jboss/test/vfs/support/jar1/ClassInJar1$InnerClass.classQMK1}Ù®»v]íZ¿o"=ÔM "‚⥠TŠ”Þ³5Ö]¶Ù’lû¿<ˆàÁà'‹P¯•™7“™7/É×÷Ç'€.ª¨ ÀÅ–» ^ñ’˜F‡ádë1OãÜ^HSðù³áf6æºà©Ð]ÞË„1}uKø’¯•× æRÇC·—?I†Ú Qòn6‰¥~qF™ú ‰l(tbãߤk%2}¥¤.©ÂE )¼XFBcÑK÷ò™ɛĎŠþ”¦b.B¬À ácÏÇ>ÃùÿƱ%ã™Pc~§rT0Tšö)ÚK0â¾Ï¥ŸdQduYDÛÇ*ù*¡38´€ Õ~k½Ãy¥ÈA@Ö+k°F6,q@¾VžG¥ÝÄF™%iØÆ:ðPK xNS5òï_>1org/jboss/test/vfs/support/jar1/ClassInJar1.class•QMO1œ ¸ˆ‹ ~¢^4üˆ,ÄÄ‹Æ Ñd DÌÞ»X±›µKÚ.ÿË“‰€?Êøv5+‡7yÓNæM_¿>¿t°_AÛvì:h2T|¥„îÆÜwFQ'¸{úƒ>C£ñ)÷b®ÆÞÐj©Æ× Õn¢ŒåÊ1¤²org/jboss/test/vfs/support/jar1/ClassInJar1.classPK Å?PK Ý’j8…çSä°°p0.jarPK çPS5 META-INF/þÊPK æPS50Ø56ÀdMETA-INF/MANIFEST.MFm»nÂ0†wK~TÂŽ;„Á[‚*”ª]ÊeE&9)F‰mÙGŠx{L&Àèlÿùô_~µ5=DäÑ8«Ø§”TöA©¼nÏÀ’–ž+QR² :^_ï|)äQ®øI–lQUl{c\²Æ¶âƒ’­‡Öô¦Õ˜ìøÎàŠùàz3€ä^‘Ç.é6UØÎžkãCI3úF°ø3pL3dÿ÷£ØÑ«¢˜¦I\NÉM¸ðŸ‘Y!>³o¸¼%7PK çPS5 íAMETA-INF/þÊPK æPS50Ø56Àd¤+META-INF/MANIFEST.MFPK}PK\Ð8©íG š×META-INF/MANIFEST.MFM‹± ƒ0†÷@ÞáÆvHˆƒ…ºÙN„B¡k‰ñĈ^B¡¾}c]\îþûþïM¶Ç˜ÄC´Ž*(¤â¬¦©½6Bf¹¼È’³{@°·uóK©>ê*ZUÀéµ4ÖטpŽð #ÏùcÒ1ЧNC£…ÌFòÂL)ígë²s^ý—%Â0÷gœ¿œÁ²»Ý¡ŸÜºEÎ~PK !WÐ8Ä=Çh  empty.txtPK Ý’j8ía+Qyy ,innermf.jarPK Ý’j8ãl2 Îjar1.jarPK Ý’j8…çSä°°  p0.jarPK\Ð8©íG š× â META-INF/MANIFEST.MFPK® ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/interop_W2JREMarshallTest_appclient_vehicle.earlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/interop_W2JREMarshallTest_appclient_vehi0000644000175000017500000030217711025627635033507 0ustar twernertwernerPKy¢Ð86interop_W2JREMarshallTest_appclient_vehicle_client.jarþÊ„¹c°(M°-¸mÛ¶­³mÛ¶mÛÆÙ¶mÛ¶mÛÖ;_Üù1ócîëŽÊè¨ÎµªbEUf–¼0 Ŀף`Žàÿõà€Èˆ( ÐJÈŠÒ»9[ÓË8:™X[+›89Óý×ó3p­£‘´Ù†è‹÷ %êÑÂJœ«0Íar»ÑœôP“ô|T&Y¬ˆñÂ0Lˆšðp+H½'<‡ý6NÌ:>gî×AÿûöÌÅKþÉDûP9<\ø8Œ¯ÇÛ¶E†¿È]}1;Aw›T9<{ßÓÕxEFY)ò´wUùš›x‘ú1éˆngÙY±Q*•r§PÿÛD²dfÆšÛuU>1­ãˆŸw!7I´ƒ8@ÌvX¶:­ö"–ÑûvÚ“²ùSO¯×Ãýñ&_;3KŸòûö¾ Δ8D9Î.j,'£l½˜¥f¥ÃX [Ç6·¬èTãÔí}·wÕðÑ"5‘ú<˜Jk0”¹©R‡}¥Ë·Ëãñ÷Eïùvgò»6­£H6_Ò¶k2¾Ž;üI²±jýr^"Ù2Ýzv‹ïë=Êz´)Ѿµ$}FãÛ¼;º»ãg­~œ‹fü–sFT›ØeÉÇÝyR±ÊïŒýo8çØªq‚§ý †ËŽM¡å³;‡¼HìŠÐg"Ë/–/Ÿæ2Úv[‘·Ó^´ÉØýÄ}qR-*áK>ëO‹æjüÏ¿WÝT’&Ý%=ÍÜõ¡û#l@Yê£5kŸÏÄ {Cš¶I2žøfºÏELYꋞ #¾ß$Í|Qƒ6)o.äˆûCž;h")Cíj"å0¥+OZdz¹°È—¯©dÛ%û¾¬˜jã2 ã²þJ·iÕ$9ȱƉE)L¸1\‰DHÇ'nB×â%kÊ”ô³^VbLã?åWœö®éÆã>šy?ut²'Ö&òÃG­Ò¾„í v•‰ü¬…¹B£3z}ñ¹¦E[lâûnæØ /¡÷%›~"ÑXú=±úQ™õ C£Ç³~¡X"Õ“ûçðÀú›èV£ãòy± Y= à±AœZýøCcû¿¶ÛßÃõ˩޳€`k¤\qžÁºfß¿3Ï¡OÁ!Iõ;RËÌ˜àŸ”¾Ë›ð³ž¥Tm•¥ê¤‘Ïc¦û=ú²†ÅX»S8©Óu{$ù¸Ïdü|æ<•:²?©“ÁòÃ[÷¹ecî Ãi;BÑÓ·pÖQÃ/.Ph8³‘¥Ýpᯱ֧ï?˜8â!iEh°·v÷ƒ›†‡m˜ hÁ^wÞ/qb‡¢ < ‹×6½7MÆžw?·¿ÿ/c`Uxv² ðÏñ)­ÿrzš¦ó„ ˆAÛx¯îHv¢î „ƒMÝô®o4ÊÃWËÖ`Oz¯‡ñË~Ò(öÔ’†:žÎ–…š]ñ¨7]°þRåâ–þ*ƒÐÒË?Q¡6ç}¦F„ß!•áÒ¤sbÐÞYv\bŠ‹fBƒSA:ûiðþ`ÁºÑñcRŽ=;xh¥*ö 팟›Áʤƒ8ôÑ*t%¸Ý‘픣ïŽûMñân vrÃnñ›¿‹#ÆÍY5gÈ3~?T²Ò™:ÁŒ$@F¹Ý¦rÏßq6ÉGs¥£_Î&^ÞÊ?õ?6.èjG /'½Z|ÆÜ=ttç¡ïì® °°æ(ðþîÍv€pôûÏîûkèÇ`¼9ÃeW\õÁH|Ü'Eh±°âäÕ¼dæ»õ:/ú¶W>£_ÒžgÇ °gËÐ8ï_u…P‡¸eQu¢&*@ä{´ŽŠ}÷£DŠo±UÇÖ“5RÇ Ÿ/|^äå‡åÁ·WæåërzÐ,õ()œ©KSÙ£L_Ø’—Š˜ñÑV°Z˜>Uu‚w^>r¼cyœR;Q Õ®1ñ¢¸I"Ž^#S•R[ÓëÂØˆ¾™vÀÁmQÿüŒ·<'TÈNæšÆ¸¶Ê&)¾Ó LjíZ³ý&‹2Û"*ë ™I]1C€òØØS÷¢è¨&–éÁmØ^k!XÆF²ºx%q ·a:þ‹•A}‚7@%rÝÇê¯ÒY®¢²µ`ê_”%ÃXºf&&·56ÀõJó:ç'ç”Úï üÕ™"‚Ý0^üO¡OQW½ÌÓ¢¹þ6êa]–;õñ¬±%@'±iÁ+5#èì%0Òf‘za¸Â½‰b´mÆSÅê#ÿ±$©k ƒu£zUcñ"Ü3ÁNQíítì†U¦`Œ~×-<¬9I›é_ DAÍRîxÒ§~àxTÁ0tñ3ûÉ®ŽÜæŒP—ÔË2„ƒŽkWîàÂ$ ¤Ç*óYÃÍBXÕ¾fŽDŧ}¯Â-ÅOÔ¨9GlÔ­«<†_ß&ÌÍ€)ĽHV@ŸØ¯–O…‰oÜnâHŠ]Æ%Ö4'f~tZP€Þ=ß.P Æ7= ƒ˜¤3HÅ>ˆZëðÀ„"NiË¢¡Ø¦nɦ:p~ÝrF(‡¿i´\Ua‚šTÎ0€"8Å'Ðz™{ˆþG‰› yC ž-XxL€âtjþaþä5lfR•Øú(áÃÇ‘7üà Ž=½š€c5ÌÀÚÅø&Vûhá[†¶wŒ›¿BðýÆ)Ÿ1ü}«ïÓìï Lñœ5t@ æÚF„O÷uü¬ñeº›áþ™ˆªÕ¦³-÷•j¾S˜“õç@1ŸÜ´h˜ù!>ðåþâ𪠟€Àê*€fˆD¬x@Xù1¤R'âáªÀ¯ÑíàU„Ðah%ØòeæÒ] W‹Ü°œ‚a”¯÷¡{ŠL[C°[{Õ 4fiè*aƒÈµKÒ+K²*#¼'›l $7‚I‹Њƒ&êTÂø—kŸhRP…oEÒÁ!”Mxô@Û G룚ÏPk±ìSªë…Ç Òø£R\ _¬ÀèYF³Å'Ó, (P7 «¹Äah<ÞB1¢u`BêÇÅùŸ¡j¦;|‚a®/˜á qâ `&ОXP iF!®»Æ¬ arøÑª@Süe¥Š]q €6Ý\ ïÖQyÚ…2`B±):®HVžÛ…±xšBöÐ,4ÅT«Ü²0Ë(°ÀØh°d†]üû¬¦iò¶cWæ? çÈP÷gøáÛ´°F¹Οjƒr}×(ƒU°XÏ€T/&Ëø u䃚ü±V;(PÞ^Éȉ_í³5Ø¥ÞWŒ6z^F bõ†ô—u‘)*ѹýÌò¦ÓÈ Éø9mâéÅéII x—¦@]|— Q]^e¿UOWïOØ[ÁóK.K’ùu‘Âê…Þ üÅitϯϓ‘’\ndMUsï^ëÊaê©?a2bäP\cBÉA÷¶p‰âs{~ßÂñ‰àÀ,0Õý§nµÚÉ*GmSíº~t†c€ŸÔ•2Ê ¸gwªµ<)ȸ¯ÿÞ *䇿;Y¹Òa‘KÒ’|qÞïuf€² >iõ¹›óàë‹Fôn¶6'>iýûj2MˆŠåV-µŠÈƒBb¦¯ßo»d¬ÇO­v,Þ™•’Ý]&W)#_¿J ï¸Ä;©É«Ê¡p=MIÒ‹Ì^±+Ém[–Kæ! JiÌ«f¢€sê¡vžÝ𔉨I÷yùSº Ë5Ÿs >ôùG5N:ËíñÖðÚc´zÖ ¢šÍ¡T•¨PG D-(Z¤È,ëë†ðZÉ’lÊ¢<Ñ‹xuÝÓH#µSjEåo¦1HNAèâVƒÄ> Cƒ4Z*ú»ãq]ýKCÃ.û%HbeV¶± “šG B06›·À =Îò8y…ü¶[—+ÙsÍ,{»äá󠉩’Ï•´5V8ZõJnöЋ@.…ÍZ›G˜ë‡eýá†Jñ Ø’÷ÇæþÕkvóÐ0íèº*ôýìªÖcßÖrüQuûÍ-•eÛní”ÌÎ#^:|ŸîÙŒR<ÔO¹É¾É/ªòZKò»<ËoÓ£åf8FÒw;rÝúï•£ˆgû÷’5²MPÌî­áÌ¢ÔX•˜ð–p—é¡Ê™˜XïuÈ’|¼Ìå Š´Œ˜þ¯ž)|éÛÑ'qTk¾úk!Z ?ÃÃÇ9†ß¡3Ä9ý¯òSÞ¨c°K9kŸ ;†ß¥|:ÐÀkò-N ¿‹²YµP¸—\®mú`ÉÕ~`ik~²ì㙲„L2{)鉭™\>_28É RÝMßο²,˜) ïŸFÞcTÆóýv™·kúKHr=ñZýN”ØizIŸ%•;<¶I«VþJP¦ieˆØi§d-dòVBóû/a4t“{»ÁQä›Ñ™zfdïû=™×¶^EÝJÌj»K_%·q¯¯Ë¹'é¸ Ú¦Ûo?L†`±²w×Á'©©ýÐ=Ý £u{`ÉØÜMt0±òœ†lý°Ï ÌË{àÉø%7fo~W! aü›û¾Âßåc-㺠¹Ù1|ÕX ¬„}«I/è¿|¹–àUàÞ¢G¯año:@ÍàXw`5uP'{u0%÷€›³‹W¦~ß#<Ý4J™¿6YÉý?ä­¿ÇlÓØ ¦F=4›è eäêœgÔ S"WëÇ5kjP |ìufÂaÝÿ…³¦½¾Û¾„Ú犟C›×¼”“Ôl—ú–®j—?†ßß=lލÖÑ;ýVVÙ¯Î&é“H4$h4úScŽ„=*ì}¸4m“â,rؤ'SáÀå¥À!6˜{i–0èäÿ/‰þµÿϵ»õµŽŽÝ&šO®žÂã¡ š@†³Mè†aë8 š: Ô°²›É¸Ñ¸ÌÇ­e~ƒÑ¼ÉðdfSJ³Kì ¢‹ÈŽî×G—¤Þ·8Û0ÓìNV–H­œ.é:Q¯ž)¼¬oo7ï÷çxmj¯¶wœßP©Ü°gGäê¥åa%õNwÊñ‡7[e«Ø0[Ú»¥ªM†ÉðÕ'·„¬¯‡È+·]ÊõŽœœÜü¢^÷#Cf¯¯Ûçli{Ô¨1j.]cAt#h uÊ)èû»QO¸TâtieA›Í­ªqXéQ8_JTQú«ñlíîáé´ç}²ÎÌjc­™Bs5/}ØÈú¸Éóà0—x†U­ß¡/­_MÒä7I~CøDQÙ\>©ÄË/^ßJÙë<ÕJœCÆÊ§ÎTpá°Ù=eÅnÒn¯w›ñêc趪H[TzVöI¹¹S­?/‹ã¡ L’“8º@ ®èü&K7%û¦goš‹X¡Øî‘‡Äì‡X6UgÌ%>ïn»ánq¶öBöÌ{¡”˜Ñ)/-gw¨K÷®ê§öÔ¬ó*þ½)æn1,ÔµªãÝ…ÝrDeöšJ„VfÖ2‰Œª„*•Á[ÆP_Tþ¸ÏØÄá:ÌLM 6OöÒˆì¥Q,{}æ¨73#«­åmâ°#jiP’ÕáˆÌ-×ôáþX}YBÂdë²^ðèÀˆÌ Õì"É ˜ÙêHLÖά#‡#‹ùÖÐÏsûÇàÞ”úÒØ«–6Y«TÌUG_‚]Üj‡œ ó‰Ë0áPlnIΫCÂaiÙy€wY +¾ƒàÕ›ÅLÅðÄ ö s˜sõ£ò9˜ïѰÈCk¯.m£û£Ó[¡û¼Él††cØYüÙü´à¨LƒO;n1:'‰ˆkNfߘJ`æQœM3!b z“"A.¡2´`3ÁÿbþîÉÓ2èÑÖ½Rýx¤ïض÷DH‘3|åÐ.ËïZŠvV(é‘mæ9 S‡b; ÿ[ÝÐ8õŽ2¥ÎUŒr{ƒC2·Rf‚ãCQY»;§fØŒÐá‰m‡á,³2‡Ðÿ1äsØ*e–¤h–Yù#íì“ò‡WÔÊÿϿӡä4kaÖ™KÚZG(3•ùcYJeNŸÇHf:1Ÿò,"en¡aæÿÅ$ïÉßg `Íí„$#%”*pºçÚ¨}9A7™Æ;ƒûµkÊÓ\Z ØÕ÷Ñqw%Âñ¸s ƒ‹…áy ì9Ø[å“ÃÄÜÖR»>A“¬ Œ¶ùí“Ã$ÜqÇÊ;ýëRQïßÏÍaà8ð"ûº^Äñe WÇ_[4!=žnuÏuNæi<¤ Å{6,Áëád<¯Ù´>á7滼?jØ>ïz­š¨Ç,¸´¤ %žû’v=Œ{‘cº¹hqùDîz•øSçÐíý‚çì9.Õðé¢{Ý5Ìó'0~ýxÝ)P‹iüy¹•À¨áçó:‘£ýê… ]Ž /‰o~›©›­q±®÷šOª3É>‘úƒúú¦zYe‘÷Ôí§ê:Û€kƒûTH>t¯BÛ'5 x¡¡èÆÒ¶ëÇ¥;ríÅojˆ'ýªóvºÒo‡- ÍWÁ4@ṠWx†t[Œ7ÌuT6JÈ‚™Ç¨ltÙÇ¿] Z¸ùO¶[šw¹^Ö¦V ®ó-&$7ʽIËN PËïCþXù2­oGE‘Ãû>ó`ÁgĨQ ~|Ô:áÐü»Dû¶q)ßs'ðÆ ÝÞëU~ý=Gê%7u¢ÌõAXÉ«uÜ6Äóšr®qr ǯüºM¼ŠEíÁc‡&oÓúZ*»Ô±»O„•}¿‘…`ÑC?Tk©-“Ê$cĺ"rŒ%Zœn;ÑH@`1b йÂfªuÌÀ}ÆqÝ“\Ó_*¥Šâ`ýÚßí«¹Tc,C©6똟c$€(NŽïE:£ÉµN†c(Ïჷ€› ,wTÛÆzzó”‰ûD4Ĺ¥oŒw)d´äG%?¸%èúbû–µ™ž"H¸Ñ9ï"'s‹ôyªC H÷ÀS˜þ<ÍHŠo&hù ¨t€;Écøù~(ƒÑ¬¾(4bT”œ²¶±ÔÈõ„Í'—©:½1¢òïß-GSÉ Zfó¦­é^å1’ŒÈñuÜxûdpß?4<(ôíF¤ÿÍ£7ü»!ӥ洬€½™ô÷Î{H±¡Ö4qìÞñ„ðEnÖ ƒ…Ôqä_©Ë{x=Ûª•¦Öc¦ߨŋ #r27Ö6€.¾(ˆOJ—t~#»EZuãçfާMft3•‹™[À7Z£«òµké•“ð×j  s½µ›¿‹Æú ·^Õa"I‰bjÆIZ´°ò]Çv«ÛÙŽ×jWh¨՟߬Zû³E3 >›ªɰñí×v[Û>3éµÛ¸t ’¯_•­’ùÕFŸ`5®ßØ/ çγ٠¬÷Ê"JóZ™ÞTs!ïA«F-/øwp´­¦e}âÛ§É«ÏBÙ”OÆú ,¶õN‡³¢‹-äVa5ÜìX^´ÖhFvz9}ëÄ3e¦—Z1·.Ù¥Æa›ßü]Ä_´î;ÇXLˆLÔiüiúxgR¾$ÈuÙŸvú—x×íª[§Ò‘ØgáÑ,QݸàÝxçRÚ,âtÙ—¦–µÖí|ÜŽ0½<Q 8.“ò RF4^uÙ…g„€VÜ×íÒ¾03'¨ê‚EÏø¤²Á9ÑMef¤=­úýÏ'®Údfåoÿ#¿P¡*´ä5= eWªÇ^´#²Ô°nWk²øø.Ë Þ¿$©zæO†e3ý ë ˆûÞçç-0UúÈΞÈD;ÿêê)v'Žõ2øV&ýðúfòZ}Rè8äµ§e“}›cy90È$V®vzí[y—Èöí£c•s›ë©U7œ~¦9 ›½ÍÇg÷ôÜOl-È&{€œÏrê^ÀaÌ0øæïLm|èdÓéeżjwß8g'“hl "Gàp{'•Kšµ€d5†…ŸùÞÒƒNÝÍ"7¿éBàž–ífËñò·ó^OyiýŸpºUð–Y4{#ï÷œ¡ÿFÌÂ¥Ù`÷§6;‚šë{®)ø¡Æ†}¼›&8Úü¸˜‚S´ñȶ½}AU×ÏÔü¼ÄM1…«t6˜÷ÛüUúr´–Ô½Ì{wˆ z«a¬»±Ï…‡KTã°ÃæcR1W–#ʱxáu:Ý-oïÇa“ß®ŸýZéú~Y3+ší):3׃j¦òMýc,ÄÉ¿“£éÿ·áÿl}¹[Ì¶î¯øª}r‚mb¤ä¼-®.¶àE+Ó¹L-¹ Õð3¾!Újm=@–„Ф»òίµàZmÀ¶öÙTãwѲȄٳÎb„"•/Û•ø‡X¢Ê¦å´¡•çU—6 >~9œ‹Ždã`UÓLHBt•¯Ó"'Ff×9!ÅH7¼©ØþõÃ,ˆgEÅû¹½ncÍx†+êìLª™Ô=Ó\H¢Þð·É¶6†«ù—¦ïÜ;‹5ûO#W‰pIrËíCËœvfÄ«>® tµcMëb(RT›_¤[i>¾y„Uw«T½êå#Üë˜WÜíà¦sÝ® v&¢³N°KL‹%ØLNê]ÀUUL?\Uëʈ9¸ØßÏkìÀÊífBZ@1À¹äŸ Ï?=HÖ»ˆÚÖõ°ç`=7sÆØ…ðg~·j…×2}Z»†iعl ›€¿-zxöUaûÇË{ Äó¶[×±¯[=ƒN,µ)—~úË߀¸ôi[1Žs61pùýrq¬wAµ­;a?TûøÐ±ìŒž·ßƒÿéݾö•íÌ ä× sã¶'fàmf‹lÝnBûb¼üh3`Ó‰¸n3;²©:܇îAÐz7˜ME]y÷™hïz^à•Š*¾»-èAŒ:êi·ä\¦}n ãtÀ:Â'¡¶À0SÄ1µVä‰Çw§ ]!QXîññݨ¥ìææÓ|ø­ö5ªméºS8sêþ…@é —€ÁvBžCwž3bA06»ª´ña¤ ­w—à Û £ 8¥½dxŠÜšÞ©tËîŒæqÊKœÝ–Ê):ÔqªÏ„÷9ar«>ÇóŠ >(5ÕàQ4ÈúÍQiwnhž²c¬^é‹ÓïÓ–ØD¾àÚˆÂ}º»OÝC­³týÌ{ãüO_“ÍhŒ,|ÝÜ r蟰mWiˆç:3ýsQÈœ`N…¡Å@¶\ù{¼ºÃ?áPBðy¾Ò-#Ä: ÐÁùå‡sx‚AÉ7œøÔˆŒƒòüN'? À„‰?`FÅôUtÉnsÑÇ;xë¶’õµz([ËœúHì²ât22uÍN[ Vˆ—¿À¼•™—6?±U—ȆŽN°÷ÁV8g³ ú«Lƒ–H»¸9íšÔ$ Ä?Ëâà¦ZÃLÇŽ˜¸GøƒÝ„„¶6ÜûˆK6j_t €ìŒ„Ä©´*Ø䀔›º_Ú5ÁvN£Y©>)'»â7ñ_dß›*Sþ~/÷_ua¹?÷ˆ@{à«.PþkFv6ôN.¶ôÎNôÖ†ôæ޶&NNô""ÿ•HD \¬éŒ¬ œœb’¤ìùQBf¥;¶ŠàÀ>üÐÉ«)ãT3©DÄ©$)°Ùl냌ÔZ€¿ò¤ðÑP‡Àʨñ Ç…¾†p7%…2T)ÞfÞrn·¼xÞßÌNaýAµãóõEG(³d‰BºÖf&ä„EQEXÈ 8!3‚™a¦ÌÆRì.Ý\¦®;Tuܲ½>2Lh˜ž´Yl{…!ß[¢#o3\}\“ {޶˜0˜LÙjذ­BµPCû”«U¶Y‡y¹¢?/KFãÕW2ÑÚ©Ô¬7íSi¶a¸r(W³BOXm¦_Y&µW\Vٸ娓+BOåÀ©¨¨Vî.ôõ`,S™:[È,gá½“× ÊõîŸ7²+*WËžÔ{t ¹6$Óö±<‰ãjYGb[?MصÙ·øS®?Bj8dZMi2 mËí‰TÀ¾‘ÐP²Dzy‹†ÇË‚ FèR ë¥%9fžñ‰M062…Î}§×îdFM1.çØ|‚¯¸@ÙiJu·ý–ª)™¢ñ/¢%:Š¡tt°²Î ð"ËX5ÁÍ[adùøU¡7õCR÷ä,FÅ­°¡ð úñ‰Æñ ÂgB­qú!„9q`Ï0q¢ÒV)ÂþŠƒJ7¿ÕËžòLå‚Î!xBgDæ!‰<ðaíÓ‹‘‚¿µižî~QôÚV¶ãÒç˜~Ä#:“®)Õ|àÔëºr<_Q4‰9êçrÌÝ8Egø¥&IóÂ…E>¤‡¾íCgªlÿ%G‰óL8Ìy%î*ž©FþxQHD„0ÃI­³gën?»nh ˆFHUAňÎáƒÕ¾W¬p@Mò}U®€Aö@‘^’WQ< ˆ-…éüefMÖWïEõâꦼÐ' —Â+'²Z¸Àòá¯év‚|‰à†•2†u©øVý Aº¶’@›(¨o \ÆXægöâÌZ1Œ^ÞùºÆª+Ü@ü íG ²%9gž3„ªà&U%ÎIÀv&)þÆÜp£)?úÂñüDúÊ(¥ ¼œóÀ#Õíc"ØŠÆœ!4Q>Sü¡Ã NÎK]jp ˜â|¨Èžâþ¡ÚWS8aUvÇuéq5’^©"†¶jÿ,‘êͤÌd29MÇj’ÖZ")¹öcâ!ƒ½tø&¦]ïfq€áûO Ù>éþ©QäS#ñÿMÿ#¿i-Hwååg¾Ó㓇&¦+ÂJ"RS@$×jéDpÌ´©¡tH­áŠ=ÕJÚeÕþåÊyKjº`ܪ–µ•êæU­òjI­Îu¿×”ßۮדii¦þ—Ïßž^ï®Îl¯›v3>·»?\^Yá¤eQ|ÑG–š‡{ïš™âS÷€)š¿;Dô«oc“]]kbíÜrdôóm+bAm²‡žø#°@õ$q©Lï,ží¦)“f!#Ô ®ÉÞª“f1#VÅÝÊò:dâ|%÷Ç@3“ôìŸæ,³IrQ#Õ X¼Pwžôvsm2‡ññí 3ÛGÇu#׺±îœa}ºùÒ}‡¼²ö¥#™Ý΢‡´XvËî™#›Ý_øÓGÔÇ]¸ “¹so–€½#“«–]J‡:º=²‡—ÝÞAqh1Ž+2X~Š™¬?GZÇ^´|¾,~¢· [Sù¨™[-¼;µÏœÞ»FÜÞÞd ºÄîn“gu˜¾ãnO¼º¼kG^ÇߢK?Y}ù zH˜á?Ê2ðÚ¤îøhãÌ¿L,ð—ß#Gô–ßb^Ç»ÿ‘ˆÉ]x³ˆyµÚ¢ÅáÍ»ˆ·ðV ¦;v’¶ÇK…ŒÉ½¿_}Óxç>=®µú‚å<Œ ç«½ggýI¡7ÿ²IÿŒÙ]~9ï)ºŸÄê-¸¯äýÁ{‹)¿µúÊá›{s‰ñ£hä[xƒ¥ÿU?dïþJở×ùRÂW —ZŸ{³¡—[xû+ý-}èÆòÓç×kù•3r ½\ÊúS<Ò;q¬÷Îô3Ò›üâ†õ«»Á7Âû·ñ§ìþ×ü‹<æ·ê^å§’àC‹äÎ-æwÿÐï¡·Ë{¤R\éªðPÒb"$¥ö‰ªUí˜áÙŠ)wYK+:V˜Ë`ÁŠ‘XnäPt«’[š:0{Dé· t:Z'žõ1ÝQÉW…I„8µß¾4á13Ï!&/‘g»OY¾“±S1R•&"„(bDx ¢ev¨1Šñx$3Ú½€ ƒ=í ͘c]°NÞ¸ïAÚD˜aÓŒªÊ&¢Emè1*PFŸdH3Ș6f†13¬´‰¬Á¶YõªÿÚT#V;-$!¥"êHö Cöb7"Ô,lÐÊŠ k‚<Ð*œ »f€‡Su=ï|Ýz8¤Ž“ö\ƒ¬u¹: ò=~Ü.‘W ›ª"l˜ª"œ7f„·?(-¤ ‚ Ý˜¥+4øUá“]4¾f{ð|ôÔx“K­ž€9Þ¬ÿ¥ážd4\Ýv“\ÎÅ•ÞòºhWsëƒ}›rϯ€Xe_XE`ä­¥ 5•@¬Âj§eù…*j!–i5¡•ˆ˜”N:Ù•.ž!ºË˨uËrÆÿŽ1ámb¸ýWnS]3Š-Ë!gVÕ`zzöÁ¢š‘JÈŽŒ²H}=|Ä]røEuŸ6V„2 K¡„NÜ:eò:^,äͼ§d@ # t"”×lì>àRy0™C’h(õ´yŽ&}Qïx„PËìÑF‡÷F2Bi#/*à4ë {ÔQJ%eF(]Á‘WìÑ"jN¢de®}r—dôIô9²”Uµü¹¾ÓvæTš 08f×"…ÃÜìÅO%›ŽËS¦l¬«rj+A-O‡U ñ7LoÅhåQmn!° ox[×>×ÒÆ—Ü9u¤´Î<ô¸õ‹Y4h¬T}j<Å<…i‘ > uטâÕÓCÅ`úøým¬×‹*±šÕÕRË4u–Ëû¹ºeù–ÎÅžÀK‹Fš î+Žbå¹Îa€¶”>(A|ãé9û û/ µ‡4t›¥ÍZ÷p4U´xZy©qƒ@ÄN˜î¤íÂ1 °cc6C¦^>©‚©©îÉeå~ öY]8pÞÇF»—¨‹PoæŸptĤõJ¹±$w Ðç~Ù)?à® ÐÏIŸÜæ'M/SN™›Ô&™ñÇýjçá§ÐBÒ× Ø˜7ñ7¯3ŸRÚáEø4ùì{eJï¾1E›9‚æá(yùµ¯ÔÀÇ›s·†‡·ÿ6ærË¥±tÝ8b÷µ>œsSÉãÏÍ2juž£?ÕxŒx=õ„¤ïö…µóáÞ^-·—xDÆÉÓ}ô|ÿ=Í8¡½KÁéÍÍ¡¦¼Ë¹]í¤ô£fÿüžÛBGO½z`Ù^êí©ÊS¶ Ù Äk •˜}‚­˜¢¥¢¥žº.éßV®k¸œÒÒišff–ùà|Àd¨Ìœ9/ÉO¶Åäd¾qÙVVOWÒ<£›bd”h÷Qg‡Ý JR¾*E¼±È¡»Pûb9NN3Ž’\M‚âö*Ó+ÿÕ¦‰>+Q –zåÔ޼˖Àš5>õ—{ì¤Ê}¼7¤-Yfm‚ëvíæ"ˆãXž'/Ëá•‚}B Íµ ä‘˜<ã`dÎÈCœÌ¯$Üôˆ?,Þû2yúó‘Fó¼÷f˜Á_zžÊá„ ›§' æè  úÁK€^vÆžæÜ*Û+Buî¡ÿFé!¢ÙBRüêõ¸¶ViôzDZÄk©¯5#tÅ}Ã%tá« ß\‰r±Ø¶a#¥ ö Ó‚Ÿ?WÁºÂ—k‹¿.[æì6;‘…ä§àÈR£Ø4ü*”× y^Þ6·(Cªã,a ¬´M6œþoÉÒœˆ`ï¸ùÇ6ŽXê_y· Yt¤,ˆŽ” wäXF¨X7ÿ”mY÷Èj6T— ¼±éAgCÏÄ• ¬´Šê›ƒÇRû“‹®Úô¡ÊzÛ‰ýÂ=½Ì™êo ¾Î©r nâ¾Ó+<™}@·i‹˜ÄéÙ ’ŸÈ.êÍocþÄüÄîð° uûåïüQücë ¢Á%üü…bÞ÷#bVgDz Ûy&.©Kbýn3¹öB¬jŒèìe-Á.#ñàh鸈'£IDìZ"`ùHy  :º¦]4KÐÁ-ÁÝ]wgã¶qwwwÙ¸;w‡àlœ»»»Ãy¿ÿÿNÕ¹U÷~uþºU#5«fMÏêêõôÓ«§ÇY§¡kÝà&˜OÑ$ÂÈÇ{½þÇàlJVédœZ)¿ŸûÖgý¯0‰å»oñ œÂ¿!ë§afDH~‡4QUy[Nô²EYݘ¼®Šì6ˆÏ'GpË~ y¾¤Þ 6½ïGÊŽˆÎÓ%²µtêñ$Hع“ìÁ[Ÿ+Xþ9ÜÚ)ã0’F‰[PbK—ï. šx!M‘ttj/̰kñI2»H{‡ûŠYpUAÎìJëR¶Û?<3' Æ Ì ¸ø‰ä|#ÀWÓ ÝG3*‡Ö%Ý#;/(äþŽ(اК”ÓÕÈÎý'(•®¯7´Gºš°«QïmÄÇŸj¼Â]¦(´õàý­‘lôËjžºG¶>\B?x!Ý [º¡®1`ßæ×tà•;”&Á‚‘öиÙþq´“bÖYýñèfŸIR6ãrdûá T³¯\ÞËñ³|Úéj–—²»¦†;ééœ #oÅågÑCÆÃZ]P“ÀçéaÀ-¿Æ¥>”M…qÀ´Íœ|È´ñ¡ù»ÚÊN‘ÙÂ_jÜûG„ «Ð}=ÓX×Ñn~ó”ÏJË´ŸjW@Ë:q«[[Ö¡äßÝRäÓF/U3?¸0§6y`¸ àè‡~£™ *šõÙëû~NðA7%àåCZŽñ!møvr§¡'%ÿ3Ž?ºõ§!\åЯ349E®Ñ\ÁLcN3˜Q~¤åXÿgÒHAÍÔNîéC^˜N$XÿmÒ©‚‚©´[ Å„KPSø.0ÚQèæ»ÄÛË”Öá{º#desl`¼•ïÖÆnÿ¼Þ“hC¼šÈˆÐ_ùöh4sòíwõ¡Á¹-œÆ>ß”\ÕË&ì5i,³ ½>øh^¨à›‹(Z›(…d¿aöÚÛõÚÔ,‡°‘s*+;ÊÚ§²Â} Jù*ö!†h½Ã€*RDÿW–«[ŸëëáÛñr½b³tàöA‘¨LéÎÚ÷;W.?ð-“²_{:7a¢y5+²µ. [l…;vÝóÇYËåJÎ'è:¯/Í[ºÕ¢Û‘FXòÂO_mzÈi’n…Zá®™ðæðzE̹¾[²õk~&’t|ÔÖ+(õ‡nˆŸÑ$ÉâKnºæjK¦œ¢tGŸu ñNŒþ>ƒ¡-ÌhG-“ôG[ÈöÒýö§|±àÕ÷gZù=!/(Ô­-¾Æ]E¾,ÆmÜÕᤎxS^1-w,½è{ìq΂õñ‚f~Õ.ä² B«É»!^Ú ¡§g~²$»Ø$Ëm…”¨cº?3''—ÿù `v®”ìlæ ~óZ³Pÿq3öY(DwÉ*|‡<&Q×ÄKÚ¬OEf€“ð+1å=0º%kÀ§PÏÆÞK7 ƒn\VÂ'Á$ÍÖ"ˆÎar£Öx#ó»| ¦_1|ðÊÙFWo56—5£Bë%ÉF§2Ùd‚|Á…H³ƒJËóEèÑß+¿1.üÄö’0µt>²(–Û!×AÇDÕ€9+ÉÀ§€,éÕ5Ùã¿kÖóÅþÉK¹÷ýœŠ ·ßx»îæ_¥ÐÇÂù)߸]qµ©üO¤@Öz U3¨eŠÏÀóI†›¿w@™cG¥œø;½g_±NOb%âhÚG¯e£&ÚC†úN8fùåÐxqÂ;ÚGàä'”JÑçû¦[y]1ÛÛø·ÎA~ØO·üïXo©Ý²¶7®Gœ¯$¥¾°ECîLÝp·<Ø7¨ö9®O^S¼I¿:¼SÔ/3:"6¶Ë§ºC|GxŸ¬}>½…>š¾2u÷Å^O>Ѿ"úøo@?ÔÞ,ø=úùNvÃÊ¿ƒM]#žhþ~¨=‰°g”2ug&_æ¨Â?Û¿—ïv—U¾º6f¶‰´ÎòT©]–ý"TÖu6?¦<ÌQ¸‹qÜûó9¥ê¹õ¹ì½ÊᖲܿŠzä"½®µ¸¼§jï˜`†ôfiDÅýIe{Oõº ¬4ö›„õ“®Ï¢ò͵úéSõö. »@«½ä¹B˜Ð¢½~'¨~'kE½{eôÏ~»‹rµ&ù›}ö1]ÿúr—ü4±ŸÏ;W¿ß›¡«’Ã’óÃÁ¬ÁûgÁu\‚o$œ[?Œ:¬þ³‘n³ÞðÉ+j~:ê“jQ{ÿFRÔ•Jêì[虫 3Ú¬’Ú—ê[2eÍ g¨½µÛ°§ú²³k…êEýä×7I«_¢œÞ¢ÏÁéåk·-|ÁXÛ±¾Äbó3-ü†ÕŽMdkFÀ‰ß©–i”´ÞUæî°îÁ»UŒßŸ®ãU˰‡ 3÷n®@ƒ®óMµ‡ž¼Ý—éÝ6Â5Ë{ §ÈŠsÕC¢š6{'Sµ&2̧#»’ŠýŠ\Š gð:Êy§Ê}ôoò+2B¹s´hˆu1“®{?Ćq©Rc«ïs¨~O¿}Ý¥‘uUîâ¾k„¾­àöGh]g×Ùdè› a¶H#®‚¯‘ÙJFïÁ"<#íG©Yó^DI4e[…eŠl¿~®ùÝàæ N›±û3¨ °‰')ÔÓÄєȩ ñι;e¤ »–—݂҅ÄUÉù«M ´ Šô»µbLKát+“íدÅ3]Ë0½ þìjÍuhUn­Ìjv©WÄ=”™”j>æFó¼e+9‘/|ðüŒ‹©ßËAòÕSPdϦq™9¹)c·¼¨àiNŒ"4‘¯?Â!Uâ?€åXSò Ü0Cз¯ìz«IÖ–ÀîT¨»Ca·4Ú³°ÃɶÐ3|ȸh*¹€ëÃ…¬þwç™Ü GÆ«à[,¤ýy¹~­­n!OŽ3öšä“ Ê€ýr$E¹¯ÇÅ*Ч‰’sB6ÎÁî=?±âûö.E÷QF»',,äUÔ?ÏÅÄþr¶WSáõÌo#*µy”P©·V‰<-ù$/i²d»µ,Ë}\o^Ô5Ô³Wk^5¯ŸUçw¹Ñæ1OfB¨ðŠé‚‚â½Ï½ü×G ß›ý@ƒ„Ÿ>‘óÿ§´0ÍÿwZXèàbnü?³ÃYæúÚsÎï1l¬æ·V»=F¬‹!PV@²Z<5ÒQ&:|édf¸1‰2~O6Ö1+<©HÉ•©„ Å0@"3R,‰4`„F ƒŽžW(™ø+ƒÂš#9®è«¤H½P×Í~4‡ÃnèùªëyëCöKÖE¦gU×åȬ]Ó÷@»Ë\ÿЀҞ@çGl>«Í°p¥¸µ Õw‰oÄ}µ?bäSÝfÿRjøÁËòwÇZÞ”ýˆ¦ Àé1uê5=¹"0ݼ¢ëÁ–áÃìǾ"_‹èe„¯•iÆëé>öÑc¾RÕÙÞñ¢«ÞÁo[*qz)‘åÃøôa³-ètd{ ùÄÚn­,¿¦ø¨]e¼ÔçºJÆŸü9&ÓÝä|s²t™®DÞ¼ÞãÉOúsRËðîÛ'e^Wû¥i>D¿u÷üy®Fê°Úþpz]à¹ÆÇèžÃô)¿P}ðW\$Ëí!YžU kº ßùý ¡¦˜¤t¦AMWª>N6¼Š F”à€0 {@¢!A2ÜÓ â Y€á0äÜ.™5ÉræØÌ0K:ù(2À`˜: Í«›©ø´c³_gÍÝ(ü^…„u]k˜ûh+–ò»Øézüï 9ÜE#T,˜<\ îÖ¤¢VÆ(ùý$ÀQŠÛ.<Ñ!å«~Æ3lWŒ d_nMnùœ:e±µ«ÿ×È|K`¸Š/ÉÁa3å-¦f{›'ër6cñ âÓ=ˆujb|ÆE`cÝò`0S¨½¾~râÄ„6ä,Àux½‚ÿ‰;zH»iŸÀ0;¯ÁQ«a§tFSï;4¡·ª¢CW¡ö ll5Ô¬©ªEH¾±VæEÁ6c½ÃÎgÀÚ44ç¥äòÜ7P¥Üë1£XP´»öZgæ2•¥õÓðõEtÅkï›ØŽU´x7q–dêr¦JíÞð‡+:K‹6³ÆÓJ{…¯^âT޶» q÷æWÇØõèæŒFU#;JI³ûí‹zEùO8ÙÏN#ÈQTÚ]4‚ëx^Š IæN0<ŽÐg¹P2`Þv'O„Ù¸7r$®j aJi³œ3ÉLK 2íé'•4r¨‹?šžÐ,Xî?ä%æy˵Õ|?ÕvÞºzõXŽ  ÒËGS d½ÀU¸Ö"eU±©aÖÃòr+q$áf__ežqPóôÜ›ŽÊ<ðvNÐ+B,¬Gø½ÅIªór|Þ¼²:ñUÏúÍþyä·/êY?KsPÔRÈoúeædØOY X®WN…™Åmè2G\¼ÓÎÜI Þõ8Œ¯ ½Ó:]Ò¨£ JǨ̃—™V—w‹ŸdXf‰²Ë;[jË4îM"Z…<;wàv*v犱êZÂëË¡ †Ë’Û§äÞ9ï‡:ì)9A¦—<ã1¢e§Û™$5Ò3å6;ÀÉ™?i‘@°÷Lœ˜tz!`jù¢ £uÍœ“•.ë$™6Rަ תÑôWC\8Êâ´áºœX(Kk)ÅM©&óõ•ÙlV8B3Ò€0˜Zp_踵&˜wµ}8¯ÔÊæè¸åí5•–J2y D¾~ΰbÝõ’ž†mðÀöñø‘X¿+Ü:œÀuž·`b€î:®'š†i–ý3EáLÛ¼!/k9Ÿ@kLoTÉÞsž1ó±w’«ƒá¤Û.ãGbXÕXAŽ`Ú´8´ ¤ZtK4ê–õ²ðÉ·Ç¿ˆmLël*¡ñ~ã^ê=‹ûh¦FÙñãËš‘ ] }ßËUu~*c}ð„¾#1âÏ S`“¹ÑÏP÷pQcߎN)ð·ªýë·EÈy£´‘9ÜFd¾hÕj't~×Ñé”íè™bëÿô-«[À6oŠÙu%*ìÞê„ì<Ù)TjæÒ1Eýþõãz°j‡Ûbp·+q¶ÿw׊bUµEŵq:·<=’mƒÉrÆO öà LZc—a^=%Q‚Ù¬Äò‹IÄ“ùý²’—JÆmpã½mfO;ª:aîiøë¾ÌĹÌRA…Øõ9oÜý\É™7¬¼îWÒ–šÀþ€©pàA²*ncë»Ø¾$ìêŒDÒs#ù§Úa=ƒ76üµîwzóÓ?Ûâüö?F£ ‡xr7nŒ‡I¼Xä ಛ¹SŠ<ÄòE××ÃYÓ4uК­W4uöxf(ûõ¸IJs;Ä‘vm„¦¼çh©zæ:¿YIG®Ë‘­\üzomλ¼fyϱš¾®³,ðuº:Nðž°©ÅÞ"¢Ä»’¢ øV&tžúHøé½ÕKW_/V›¥4Oº‹ô†ß²´åo{ú£‰$ÙÃd›£Æ±R±í2Èú$£É¾`¬ëlHRŠ"FÎ/›Ïû™~àsÁ¸gp+ÎXUý©SU†“²&9òqùp%Ôá-O´öƒÈ‡`¢£˜w‰ ŠŸæ{­P«€Üÿ%C,¤Û™Në±Á cG×þ»áõý:·<Ùß.¸\Aß2 S¡§a«ýo†××FËGK"‘ñ‰‚R~>Ów8×÷„ºN=ÏûÈvzb̽$cddî&y¢€ÉSk‚w{2IœÚ8€°Îê‚¶pMÐs‹ VÊ7®ØUWƒÃ t<rº|Ÿ~Îp…Õ0ö!)®Ú ´òû/½‡i¿DVÃpÈé³ØÂ‡·æûÆék ¸ž˜ÎûmZæ¿Vý†^ññ9Ó·¥ìmÁ¢­A,·‡^.] 'k30â yl e ¥V¼$ìÍ$ù x¸]@»´É Óº*a*UŒ]¹4=­üEüNÐÜ7„ɹõÉÓ§jÅŸw‘ ]Ùí¬/ãHÂÞ3"ÓP ¤û¯:kŽïÎüêc¤†î…»Qýà ©}Nÿ[£åçñ¡š¨„=ñšíŸ™,1Å>%èmÉâÒa!r3ëdrŒ[Q™´– 8蜖 ³Á'šDüA9MA'áh¬ ‚æàký:Y—ð‡–÷“yƒ ÈÙî’§¾£Ju {Áx5Å쨜5~!¡Ó%Žœm;>@×t•éx>ûÚ‘uÒ4%ƒHjÒWDž9@Úè±ÆÞv„:ób:äÆJp»¦ÑËM&üÅk§Ý´lº¬å³"è‡DЋÛuÙFoia¤þÂWo¡M÷Îùuú…ÁÌ{Ö#½£æ±“D¸IGbº¿<²×ßž.*˜!ÿñ}›×pæ»ï'Y«ÈÂ3œ¯¬:±»K±_túmŠG›!sNŽ‚Y¤Y|¿Ö…]ÿܼ‡TyâgqÆðÚ ¾ã¡*:À¸ Û¤p]³­Ç\lÚ¼~ñÔÛ&êˆr•øtmQÇ2ÒNÞÎÍŒrKuhºÅj=Œs‘eyµÛô¾Õa¢3È´u@#¶x`”¹Rh{²?´g©xá•(ø`y¯Ð:#Éýifªeøc7XîðŒY6„³¨ðÍóÐݵEy“þ¢Ä-/~ú{’‡uMþêÆyôŒI·ùÛÝGj‰êìT­q¸-©Ý;eC½iéæÞFÕÁj뢥¨uQ$jøâG¬òBžûA{F”ûõ]zÓêÞv\N:ò%‘ÔüKN¯g«”äåRà‚Ð×Ê€Zª›5’îMÖH£.›+!ÁómÜð-ÀTY‡«´‰ð¢åÜÇl§·t7n—f“KØ‚ªèKÆÐ]ÖÐrGp®äK"9„?{¥„xÇöä11\¹»úu’=už=?Ùk¼¶Y|ggæºz°ˆÞÿCn3JMÞÎ6¼¿ßmé[MNÔ ;Lk íÊe°‘ˆø)zȈÿƒ¡ ãÖ,檇_íPÒKïQz‚öº$ݹƒÕ¥7Zc^/–û+úÜ>C§÷ž Û˜™‘êöµ³›,e_'©R?+·Ã_Nj+"£îV—­ ^f¶I'«V®[¾Cÿ+gVôÓ£EýôI˜è?…à\ÿÏÜéŸhÛ‘ñŸk[F ™¹‘QÔÚÎÉ]í¿/”œml€ÿ®PÕRÇPÿþŽB&ƒmök…†,JÓ“9W”¹Á ¯ìç-I¥e*A‚=9+€£¢»´ú x—W>ù¦¨ó6!Sø‰ùR7)ðrúÒü0¦çûñï§õÈÙ’Ô{Æ&Лõ]@nÃ+}д¥\B¨Ïϲ%E áóI»Ï↠¼‘Qì3AÐ3{TêKúLjsôâÙþ9¹š–B*†v4k¾ëÖµâ‚<-ÁTk\gÔu¶“V&™ò[‹r]g2®“6+Ò˜\á÷¾>òTý¢EhµëÎh}̉”oÚ[ í%ÕCÇ-„§a¬xo~\êׯ›=ÙI¸ÄÜæEWë94pn€Ó~¶á·7í)Œ…•?" GºZîî×~ýâú7y ãê-Ï?D=‘~%o§u–Ðá™­yõGÃêT-H¸º8w[%ÖðB«÷ú$ôs"ôH¾Ö&dóf°7dÕ@_V¼-ﯗ­^ÆD×R—:œ? þ=ÏhÔPÑ|ÆŽMAfÑÿTkTåF¸‘œ`ûÌFG;ò{ˆ\ñW!¹9SUGGêŽv99;È™o )¤Ú™ODtåÏç… rävž.!Õ¡æG¹!ÕFýLXo[ͱV“ lƒ—U\«d´v¶Ì/”îÞÕ;Ü÷N¯¹u TÈôóð£ Ñ9Ÿ9éúb˜?—PDŸk#®¾$2Ú½oäÊ?èIe(d˜>Ù£]¬ßúú%ÙÔ×QÄMfõ4ŸM 9‚þŒÖxúŽç:ý-•¿õ§É%tóIÛ!er IL<#tÞ+¯dhc\(ÇhŽ‘zr=]kÊÖf§VÛ Ï`ÃÝK;”ì”UïÊläŠÓ+'j‹|J×í<Ä8,‚ÞK¸àu=Håárr‡… &{À¨û†QºÆß²ØRÈW‘'Hw ½âñ›JŠ“l¹kÿœ3‚íÅÍ®T·¢›g’‘ÝüÁêµ%lÈÈ%|ClÌás&_8òd”É+Ìãkôô¥ ¸²EKÂd°no2ŠÐH8|_>’‚z¤?_†l„ÂÇ€ Yz˜•Ô¹ŠUÐYÍ./ãÎÈX¢„ªSØ&Wo€®^§¡ ‹wôc…}uÇ›Ðñ5œ^‘ÛêF7O st± 8:CqÏ“K\0å Ê:±È”ÔÌO押Vd´OÅmcªþ^%yC¹Úûj3Õþg–´âG+ëñøï§á€$_ÝK>ô§O±ðÿ Xÿ/pàß be´ù÷š\’òÊ¿ †ø3Ú£’[/‡pL%|’ôHm…G¤üá ŽÑ|¾Úm)7¦Õ#Ó#y¤¥R¢õT ¬HaĹ]V˜ºì¥±ÞOêmø|âúËJˆ§ lpÞ‚\~BMr/\‰aðÀë<ÕŽæÂŠ0Ç'ÓÙC}st´pXqòúö !4- Á`NMíâòdåÁVVÈ–6©ñ$T!é1íò®ýÙZäÅPYMùg~p“n夓j•N²œåIï•ôsÅÿö{ ŸÜÚ½fÚÌû2¬ô÷J[@VâtZK\Þ†E Ü†Tž…tÌŒý¾FÞªs[Éd•žl­Ð“d_îJu©vàÉU*½Å´®þjü¼öƒ’ßø#\„ñk–•Í2QãFú×ÖH:köœ?0‹1+Èÿ2PîE­_Ÿ?}²û%Dìÿ÷ú/e`hüoÕ‰mGø,„$jëU© xD[Æ©hÆ,‡í´Ðîåa™á»ß¡{ý$(µ*ô›Iô çÁ¯k¯5âOÉ8Àa¤¯:Øôì¼XØsT#j¨r+4dÌf}Zêý°ô9Ø@o 1}‰ó7bMÝàCÇ^7=qõMüŸ2¨óEñ: jYQtèò›ÕD|”+%›šZ6\æAà‹ºñ# η/„…ùº/Ÿ=Ì…»Ï‘Öÿ¥ ¤ÌÊ?ÿ u÷ÓRÏÿL@1#'[÷/¤§¸»}¿ÃêÆˆÉ²¢ £#3øõ7ðÛ(ÝÌÂo_8â`Ȱbm8D™Òt\\0„#]­;++U§–5ËK+“úà@³æÓËÒgÞ·ç"`ן ðùÄDݨØûÒEÇo÷ÃÛØÅú̇猟¨ÛdìÝ¢r–—öåëb$þÞ±Íý– W‹j@sY‹Îm"Íù·7P„|äzÙ6Ãt»ê*©GuÄËï õ+¿CS>ªgf†·ÄÀ(±ÚUØ¡æ‹(±êUjããW×aÉ9¦|˜` 1_Oñ t8Cƒ&P° ˜>PñR½µ¤ÉÆ~k‹Àþú‡‹ÌCcm[ÕKÄIe@qÚˆFWéª.bGÀk&vn±`sƒF“ÿh¨ù2½ãÙšX÷a ¶hð×Å~!×6R³oº'7«!à+o*“Õ;„§1@d0Fb‘-`͈Y¸³¸V[¨Õº?T†4~B‘G2 Ô§cNh¢9ûMebÍ(×NC°p_˜v¥bXÛ‡yÌù ©:ª*ç_n]¡ŸÅÇkª(0\œðÿ†œ½'¹€ŠŸ†”¨þ»B°(à+òM;¦Œ6Æëb1»!î¸G—tZ¯úÇrèØ¹‰Ë7s-©!­Æ³ÏLX5b0ÆôãO•Nôñ“ ]$þ~ÎP •¬²¼°H^.nÝs åXœõŒžá©šB¦Ù:!‡a¸Ä¬”ªîÆl.b:ẜÃúá"Èú¾eCt¸>Ô+ݘËrÚÜöþïhy¹Q-ÇÅâ‚[ÇRc£OÝ3õ&—ƒÛ@k}N=í5ñ î7ØqdÀÛl|˜xÅûÞ+Vb:)³iSf’œ7izTh´3ZOãSqC%›UŸ8»Õ¯òòŠR !ùŶÀÜØŸ‡Ô0Y–B¦“n O—„È%—:È}æ°=O¸¹|Žb}ÂsÜ 4UêYõ£"Ey²ËUTójw³¹{»fÄz޼Ŏçû k„Ì•è ¡IM~úö[ö÷Ì^GiÚÎy@Å:;ig1‰!ïÒ¸Ž—>uyÃäû×Éþ\W0§§>«Ö5˜‘2¬àŒz-"KÝIQ”¡¼™¹5ðñS¯%@*cÔòÇèSµ$«ÅýQ d' vC%o‰éN$<ÐÖžÔ³>…]õ‹å6oáSŽUŠ> S}‘á ÇÇg>"£ C•–Eíz&*Fk¾á–3EÊÿ½ÕíE@ŽÒ9ôšÍ‹¯…•Û³è*¯5Äñn8fBƒkâEz{‘ î¹0 rÆ•Bd¦Ëwe>ÑžXdK©ƒ`Fé‚ ÄBX ¦ø€ "€Ÿ!I·U†Yƒé¸:}R–¸ím_DȈEZ™d®˜@íH{Á8S+p­H*ŽsËsö#ãÛ·<œ}¿B Jo™TZ0ƒqš¦Ú£«€§pbÕFE'¸ˆ˜‹i±˜`ø”uBÊ‚q<^~†Ê²O‚4}ôo&··ìmàX‰ûØ RÏ R÷Ydhûk"u3œ¢ÎLœÂ’BpW”ƒ ˜ˆE’˜T™®†uÛI?Ó6‡vÛK?òõ¶ð}€É¯ù"}wœ_Cqß3œƒ¹EB þôÒ«–н£þ‹R¤b«¨üCþM1ÿ¥Pý£æ6N@[;FW ¡ã'ä- ÜìŒ]Y,ÿuÚÙ­ÿýËÎudü?C„x}LÑ…Î×뺆 ]´¯0qŸÂ~t>ˆþý&ü&@²”D_ä÷¯ß¿EaU`N“>Et>\S߯{^œ º®¬<Ô…‡ìŠ·ò:º.s;^44·ó==è< +R6òü©LY ›vuH¡®Þ;±Q>ß:ÑUÖZ8‘u‡Ö³eÛ“õê\5_Þ©)¯.¬ÈºÃë]°í t%§:ø‚޹‚‰ôíÀ휑"tçöŒ‘/«“ÛPX¨4O *tÄŠ×Ó¥^2U»Ú‹‰R %²O2 åKWrõd­›.ûñ9?áCùšœ\o¿"Tö)"¡:ýš\s_‘'¦¾³lW‹ÀktAõdÃr—pAýÔE-¸ù,¥¤çM-Q ̦BŽ#®ßÇPöùSbuöí ×Rs[º{wX½øUs»* ‚ó„lÙžç’¿üõÚsþ]„8é•ZJyw’àcÔ-fÞöMÚqj3˜£8’°Pó9°A÷î?¬f—ÖöÛC'Âç7ƒ¬í<3›IÌoˆ³L-Õ×h¨°ÞKU£‘Oœ¥ÓYÔJÄä7•-(z¬QU:@fYïžy¤mÿƇHÙö/ ҥטä§Af—3E±è RXˆ–ã¡–µF!mg%dżüýé€8 öCÑ#D;8¬ö_~Z÷ˆ´®x4”êA9˜†[TžšRî”( eAŒeÇbÌÆ÷’$‰ZcÝi°O§Šb`ÉØŒ¦ÿ-ÂО-’ƒpâ¸cX «Räéæúÿ¿–d<×jû6Sî?£:¾…¶¾÷iT}0-ø¦žŽÝÿOšÉæÛ3ží5Ù%=PßܰøÑæäÃŽ;o×¥™ÿ;¡€«E<íůföÒ©ÞÕZmnеs ew(€Ú¥»n(6jƒ¢Rr››X@íŠÂñ5 vþ®$A‡ n 5wxà Ⱦ5cZjGмÄήŅŠ;)7©Á¼[ W–;:PÃí€` ?#jQÃmOâ ôÕªƒéPtK¢N’ì¡ámUe¥L/M€«ù»t(ë¢V@ /‡.ÀÕ¼]+1_Ê!w?6)P¯Uw‚»î®v—!Æ9hÐ0iâÑ„‚½_„ ÃÄfO 5ÊáM¹®úÕbÀGíSy8) êH•9¥ ¥|“b7Tù€’£°ôé©Èœ†EtDˆL± ENï¡W4q4&JKì²SDÁë¢jw¬¨Ø¦ ,A™dHݨ5›ˆ%ŒtŒøq`BO¯ºÆLY²“0ÖJx¶`õ¯|çµ¢7Ÿðô”Ye¤m¿ù3Âð$z…‰T¦ë­ r'ðôdü xÝû–¯`ƒ,˜p„Å—‹€0a,7¸—Ùöü'*ññŸÛÎÜ¢áõÍTU{¨,4j̺Œ.’(Õ°¤ªÀµ?#Öòáժ̚™@Ö­ŠÍ«]I )ÞY}ˆ^DϪU ágËûÆrB˜‹z !›ÌÓŽ'À“j_•Vê¾ÿ,@uÖ¤jrþ›.=-G™½i´w§³àVqÕF—b¯‹ŒÄÂÜG´À££´5 >„ÑpºÚ¡ˆ"Œ= #‰ó$çow¼Æœkd¥(ÁXÈ )^T<¥ŠÈLDIÁ»KéXSà? ¿ˆ#ãrûÀ!`ƒ¼ -ï}¡±ÇýlíBû ù€'—Ò6å€Ìí9e2l#.ÃÏb-ñWav&†tu'€eû£W/Þ.³´ülwÄëÏ<k%‰½ (4†(»ù‡énþ«#Âi^¨› ýðÄHNªjê½:uäÁ®sQF:¼<¼7aÊîݵvfJÖg÷jÓÃèähm77gI*”ÆìÓ{ïi(ézG,¬¹¡þ¨ïH†ÅÀ,b‹¥6á¦16#æl?l´Àö:ÑçRwÀ“Æ÷º=͆ü¥€cr¥†ÔPj S±xþEÖ}Ó=z¿ø†4MJƒúÕÔH㲟Í?pÐп¼Zo&šgõtr•»¡ágè‚”;Ìòr£j"zéAåØú¹r?'±"¾#.ÕÕE´ÜSÿ á¤´„ZˆoûV„;*$ÈLö$Ú}fÝ{ü\¢+DÙXð•Ÿ?*ÝGµNI"|ü¼VLþO€˜iHs›ïÈñàäQmqŽ×®¬¼Fx‡¯Ý\¥ã19´!N±*f˳¾fU¡EAi0 ˜ÛÞÒT›ˆ;èQÕ 3åA5˜[‘¡W^u‰HhN'5Q'“±@"*â/Þ”hÒ6I‹Aé‡ÔhÒæ]¥öÔt» Ø,uÌ>]Õ¨Ì_š´µîÖ™zä¤ÚIQ ʆɺIu™A[Å#p¢ M6f–BǪœ6ªkŸÂàÔëÕáî!Kº” æuèBmjPwq¯¯™«¯Á­‘ûFö˜Ú˜lŒYQØ?¹{Ø~IÓÓ¶öÝì3ŽM¦±rq¾Öýó¶5PY=lùàÖéáv´XpçÊXû(â^­æþÓlI “%@8¾à9 EvKP‹„‡óø…óWzû ½mã½ôÝ¥>ßðA‘õç*¼{¼ð¾ ôè?åÞð”—˜Ò‡:#óh^Ôò³/¤àWð¹Ú¢u‡òükÅ67áËþÞ`ø®8Ùyˆ`›MBÁøø[ÔZ‡–ó¶!ÕÉ„ÓÊâr‚!©0c×M{+ø4 ûS¹„N\'iÂá"áßYÑ™åg“ša»]°°c·Ë` 싱Uco|<› Y“BULòvG-fjRÖÌ´œ_¾<ýCS°Í(nÎA’*oÒyJRN ÎgVuS‹–®ç–€Šà›òž®/eþ®¶—m¥mx¦¨qª´q#+ %2ÈŠËÈ_Ññø–n]Çì3ô,›¹«";øÒß„ÆR·¿õÏrø¡Á¢¹ áØá+²<8ÿœ˜è˜Ÿ…´¥{×G8ÄœA8m…ÔòNææàè­-2u‰—±p¾X´¡–Ò•~ž¶8¥õwsn_ ^ÀEÝЧgJZ¹ëIÇÔè¯(AGhfÀ9•1ó"™YÂG1çÊ]EÓÕ)ÉV2Eë×ë¼HбŃ4usàœœø±¦,•—ª•_'¤­2é«Ð8ÖåzžW}ŽÿaG©d#ÑX,VÆÌ,î:Eœðd¤µ´ikn;1,Ùß1¿·@ÎP-”:ˆÎ@ÞæaΟ½—©ã ”ΪO攂ƒ7Δ`Sò©N–rëlj,wF.=Uv2éì ±xÅìþ\ï©A¿¸”D¤’T¥]½k¥ÕÜDõ¥×P:«A]þÇ^ûÃ69ÃÕjâ5à/Íð4‡SHEï“;!ƹѥ›Íô˜Ï@T4p“¥çñÕa×ô‹½øÝ¶)µN O¼hÓ‘÷ŸÍÅ.^û£üµ-o•EilŸ]x¹ÒWªUö“Ú5BÏï¥Ç÷žˆÑmfJsjGŒb7¹Jsü' X Ø\%ØçHÝ׆c]Õ7`#êá–CÁið.ºÒžRžË†Ž|ܤ>é•rÐõÒÏØõ 'ø0wUÆŠÉ..‰¹´'¼É.õ.ˆ¯íCóf‹fÕ’bº3—³©&0‡·t»òŠº$´]Ô*Dªá-©0y‚b_ÛM}¡N#Ý.ݾA1ÐMv^VË'»T7MCÎg8´–ß<üDPÑÎ¥=e&-ó-øBÏVÙhܪ´£ú(Q–I¬Ç|@”º±žýoBÐåû_Ö M–¼©F¸göHå”ÍÝœÍõŒœFTê\¥è}-ÝÜ5 Y˪2®FÀ´>7˜rBý•¬v—‘ÓULz<›˜š±øÕ¿Š«§M&ûeνÁe"% :ñ>QÜó,CÌÉWQÀÏFiÃx wš=NÆyÊVݽL~dš10=ÕØ¨æ&¡°½¯LÓõ¾Š –é(_Z»m:÷KI†7#œ«k…Á£QZ‰]_ÝØy2÷Ì)0miÿÛL&0».8ÁáHïˆÉǺÀØ94\;äVDè…<#™C%J~}Ô¦#W1„‹¶¾¤;³8ÃÍ´œ(B´=¦³Nq©ÌRu:·1ooäON³ÀfûAìÄ4› Ð7DçOúŒÓqn°Ìån…ãùr÷¾£0lR{Ô¶)2Že@ÖøÄEÖ÷ôÖω²ÃП’ÝÛZÑû¤µã YñüÙç°öM1(R7 ºÞ¨$†}»z!º»s7£«mb;gÜõ\åßêµÒ›6à÷·e¸+­»?u×Pʤä.j’XÎWôf擌j«½Jù­ÓM¿X¤Õ ¤'ª¶|*ãAÁùë¨SfŽ?<ŸÃ«Ó’Ëë¼Ût>€OhXh¼L÷9ç–0“JÑi~™ÌƖ3¯Ì /ÐwÁãªÁFäÖ€*bÓ¥f¥d4Mù6å‹kXãš­È蛈úS‘/b"LN¨lËt6â¯þÉ6¼-Ön1^ìlô=°0²P] ‡er?X¥1ŠípumÄqŒ]CÕCŠj‚}áúÏ1ŸqS#_¤Pç_ÎÜImeÝÜ=Üœcz)¯‡°»+XÚtÒDáqáPQFÝÚ„€´Ò ‚”Hww§t#Ý1t "%RÒÝÒ Cƒ€t#1ÌÐ=CÍ?~÷»ký뮵×yæÄÞÏ9ïŽó¾cbç²û@Z°‘=x­Ei4{û[¯–È—d GÙµÛ³b‰ ·=¿{|m—Ø%±IÃÄÅ4Lp’eIôKĵ’§0“zYóÓªKáŸÑ†Ýbz5ÂF%Ü稥˪ Çðö SJ6fôþÚÝ 7ÀºÕ).Éé™oŽ_×’”o…rœ²ÞÅS#aËméÂðW%wpÂhܨ‹á±QðM{|òàÊÒãÉ/ß÷\ó¾?} WÒWôâ䈸ÑTf; 8Á[s=mGÝ•ŽAÜP¾¡´ÜµÍããUl¦rj iÉÙSŠ|?&²_˜ÒÂw»Ö|¯rrÝLx'nßòÕ–#½OG¯±ˆZ¯Š°¸ëp*°à?üK­·u­kÇѹ:p:ïë/Ö$±ôUju8ˆÂ0Ù¹»úi÷qu¹Å¯*¢¨Š’FéÓ“äÜ;0&1+`;lCbŠ'‹k\ÅѸÉãºÿ@vˆ1ý‚w%À­»"=fœ…¡KQë¥ÃÖ'Ÿ•ÀMA²äÆÙìá‡þY劋èzOÚ ‹‹×có/„wCž ¨·t`Å´[ã‰Va;Ô«ðGuê®×œâ£V0uûï',“Qô,>Û('-V/ ‹‡= .ŠCK}ZȦ»‘¼r„©¶ž o8;ë9è³ørlñy°·­‚×Á(£¦¶;Ê‹ÑyŽfæít”Œo²êí& ‰c‹ šlfr‡>°qxÙÌä ±ù7ìOrÆ"³¡7õ[ Äj²É5’ lŠüE2¹G|³·u9~˜Ë`›´tçûìJðD‘·G¥Ö5Ôζè‘K²#¦®'›²D‰acjˆzC¢ýIÅÆ;Öž­´ñgß&‰›mÈí‡XY¼Ø¿l»u#[>·S)gN_6ZÚ³mhbI. ØÌÝYcQH° ˆÞYjŽ[¾ŽbK«ûôÇ’|è€M¯áÓ¥·ñê@å€ëªÐdƒXã&íLÛœBZ×ö}H–ö¯ê¥yì˜ñè—[õÔ7¹š÷C'à&aAçûçë__³†ßƒ›f‚~ÇSNoÄâ´¾ }J»ýv‡EOü>ïWÜз7ä©È‡}áÅ)ê“F¸ÝÑÙºq}¿“7×áüjÍê4«Êú”ö_ÿ úÅÖßÈŠ”˜-® ~Ê p:s_q´•W^Lòf¿ðþ;ϽÁµ1 м-¶ T–:Bp×£1¥’»ÞîìÞ?¼‘—ÌÀmÇ·v{˜~øíEŽ˜Ž¤ó{| RÅY|•yù1Ã"#/Ë,_å¹>v:ÒìOBÚmê-ïMœ¨íëÌsʘõ«Ö]_ú!š˜ªw]·¨ø¢‘L·š>ãyãy3ÏIéÓ‘=?{ w]w¡dFÈøôcÉÕù~ɬ²o v7vÅÉ2h¬0•k®ëS4^KÚ»'VG2-Z‡(+–t²³äIÛ¸í5+8Þò”°`)U¼©£ؽå±×ÁkÔihX»Ns”®Ì¤²¯8¬D»1W²[ɬL+ÑúT\i.”~=ËF“ûçJW×háµu›#š®þ€…p\ƒNЗײxËZ¸ºŒlÛ~Üúñº„Á×¹ºÚ q‰°cÃ’ŠÝwniÉ«H*K´óùë«ôß±1Ù å8U,®=éR™Sf–Ìê)7k{³¥ÔÑóÜû+ —'Ó}*å¼¥xÕBü“tÒ %Üíç‡aF--‡›"É»HÇ• ²“2ÞÚëÈ3¦tå[oÜ®5†*™Ç rz LÙü=WÕt®ØäyëtÌF´u•¯ô'Øx%x[ç%fµ"æ5Ó(Æo¢ÊùÒ(þ´E¹ƒ •]%rå iBDÌ4՟ℵ¬t}•ã·¾ýnü™Ÿ@:_âµÑ¡Üë!ì[(„yM7—ÿQ˜Ër¶oÄN!Nרÿl®¾œ*z,~tªÈ`]ýÅãwkvwûÛ!«Œ{2æïQ§ÒxÛ¶kçºV‡ªP¼ÊJ«Ï`mÊ£<ãýhKJ4>ÂÂÆÊ¿sެ}‡”ðBHøçÆÓ 3s5@Í¢T˜v•åÒþ><’Ò •„n|Š…õÏŸ Ìj{6Þa'Å·dò^=)(ÇáRºøô>Øcc}k÷ó›tUà¤ýÑödçMœ2Ÿ}®. ‚³nI¦?;wgN-Ô¼ž¿6‹Åš_eÜ>CŒí¡èöz× }k]³D¹¢¦½Ö©q+J}/B‹þ)X0Œ" JŒõ"¯ŠMGÖxGÎç×96Öµ-9þôÞaìC7¡ÿš%nЯ]ñ¥ŽOìC~Ô£"¢ò‹HX´ó“g‰òwÍ¥åÍXO*QSQ¼Û“gÎØ‚½ñß²æíÎ ÷ói×U×”LU½ŒBŠú•ºi×é×ü‹6}{¾RaM¬[òȾÁ^Á”¯æBZ9a_)©Ó…‘Ùbϱ=ä‰vÒÎþ É|27èá—ï1—”ÿ,•IÑå6s¦þš‘k¶98òJÏa™Ò5-y. Ïå“B÷l&ýs½Û‹ñt¾ e@ÎßöWÂd*ùϘ÷<_»=“XœðTÇ¿wŸo,¨ú­tü”'Q’Î1¼Ù¸ê«eHlÙØv!·|ÖØÙù:1ý«šEï$§(+8ÄxQg–[Iwí±[³}gV¨f5o§QqÞ/¦N·f.éj5Sm‚S“)8ºŠÌ ©ã Ùß_ yÌNz´â¸wCÄ0FF+Gmý™‘/L3ܾP"ýîq}ƒÔHûì©¥vFÁ5sï=VaWø<@’¦ëÜo–öÓgVˆXÍ+xÇãåÏý§–Òq¢ïŸŠáM¥òë2ð%ŽgPðö‘±êÆZÜÙ‰1žé&UAÎ7Y¹,zi'ÏŠÓEÈèm¹iVÝ’‘€½*iZ€®\Oe‡¿JNeoó¥õeÝ î»AØ'5T´v=|ÏEO‰V¥5F³ãËpz-ãS”󿶕΢.COœ/Ü_f³öÆæ¢Vm?úÌ›­V³CˆG,tábðÁ¶á°ßìïY'38ÞÒ9A¦«Íß²»ŸxÚìÏþuûPzÌD‡MÊnÝ{¨“êÖ°ñÜà(×ÿÍpšÔ NªóY†cgã‹ v'è|¬÷æòs }+ÕO·…{ÿàòWJ#Í*ËtŸJt0 ÷O.7Wl]­Š`.\Ý”o3ñ‹ï`ÿü3~-ýÈrñ™ùÕN:Ñ–©/8w+F\`vçw¢×U—`Ãeg¸b{}˜šã€ÏocíIò ܸ¨‘)ž8ìœò.n#2iîÁØg:ØVSí×ÏÐÿbxÄ£ŽUÍ” P~ÿ^&¾w`æ’ ,#­‘iô4‚ãtÞõÔn¨ù¦¸l¢° ¶cZyš$† úâ;î¦Ñdz*ãOxo.JÖëã:n3áý­pgéÂxB]‡8«äá¨Íÿák7g¢Ý¼<±›~7Gß,jÕu¦TâjmBñïʶ£â.T…z,ôª¦Å-™:\}ðÉ©Ÿ¶—œn vQ×m¦IJÔ•bý¾Á°šÜ¾(½Â-³CpA¯‘‰œ'jÕ0àt}éóψ*9þÝìêµ¶T³æµâ\£¶Æðˆ 4¨­Œ ©k‘Ãk ãGŸBÞf:ýòÙpêÆ™M –Ê&£>œ0,YJÿF÷Úþèa»ÍÕën⪣Ù{™ÅdIæ!û‰ò½é¶ëËM ¦6~zЇÂÊÄÙ«H”Ó3ë‘'zX—ÆXÙ_II"Žt7¿e–ÓZw?˜ð È`YËéE Þ£³„Ó¯zý‚8±ãªïyá¿ÈÉ×Ö†›X¶´Ål‚QF<”Ý•%V£‹/ZC+ý¬ÔŽO{=Ñix‡4Ŭ“§Oš¡Užâc× £ÎÝŽ‰ñZnIë={=Õ'zÛtH°B¼X/¤xQ‹E±<4ç;€ò7A姉 5…òYçÝ/SLŸöÂТ_´J<Çfa¢J“oà(ÅÓb®I90ßôT¹¬2KK@Ìð•b.[#•B8߉JUœqÐ:änEË—û„ïu¾Ç¹ xW)S¥êvŸ" Ž/»s°üù‹ZÎÚÄk®Îê‚t7»Î€˜pnÏ»)ê‡oü{Œò>¦#Ѽ8lßzz9IÒº¤CI³–]qf%CeæÚÓ&°)溕ÙñÜN²4o•×z†ž½Üjd¬ þø!W]ìõ¹ì‚«†ã´ó£KP}bo[ b}xÂ3PµWc“~QÑ-L-†j¨¹ÓØžÆúæ×£{^+¦¿å÷”ü!ÀŸŽQZ}¹þ=çpÕ 0~Õ"L;¿Y÷Â{­R@A)Æ1säí\¹ðp {¡ù|èÎ>¾½¨;ñÙ¿*ÿÕA® aS7ëËñ_è x ¿Ü<‰ƒ¹ÛþLR¥ºT(¤)id.ƒX>Sj)ó $S}É㮩üñbßþ—2t‘µ¨UËÖ¨câÚ6I¼uÇÃäeHޝÆéÐ^$lÞ¬U$lù†ç—çJûv FqHËó«ÖX¹ê.N@pZBò³~‡»®‡¿£_¼Ç¤ê¢Nîd2—®»Ñ¿ðç,ÃrqŸiCÞèæî‚[Ê+% Cݼ뻵v òÔíIá»òoÉŸBxÎäY3o0Xu=^ GxÖi*~vK”ªÜÜN]ݳØië1>¬¦ÝðŒ9ç?~²/Ñ“‹1Ë®­ / *«f.,*/h‘\UêDªÙ,¨MB:Ãnž05î|yÆvßCìN÷„±i„zòªç iäMI˜Ñƒ¢ˆåcËOÓNªÚ隦Õfêkï2ŸÔ .ÃÎßݧ³5͵͢®vgÇGW+¸×Wr'L÷þ>±A]ºÝ šu 3èüõß%çž Ñ|ꦱÿtvÓÌžÖ×ÂWNbaÑ“ÇG.È ®ÐVâM|´Mçï§üŒ+ES9ç¾3ÇG„+Éml²+eMeôy’ŒrIjàHS—Î<£úDç«…¬_1îÉ%d­‰o†¯>­ÛÈcß'0mj&0o’ W m.š2’ÔŽžÖ°†µ­ÎVœ¡¥BÉpíõ ÄUýg¥ˆ ù:çj[æÓ"¹_ök| ‰™nå,±¶l³Ÿxz&J!#1: ”ЇêŠ<¶|Q³ölÔò[v/ãËFyÂο;çÈìͼéˆ+æÈTZšõÂV-"ÈTóÃéȳaL‘V×z-*?´âùnÁãå|î’iÝQÀëm¹ŸÆÅ|Óoe°µ ©òÓXªñ¦5V[º’Kš¢œ¾öį¤NÏØ”²`½žüÍhO>,äoçiKÛR40ˆö×÷÷×ìô¤†ø-ÛŒ¾‡gG¨MYgbógËËk‹åH\„ù k„ÅÔÌ©‘JsïØ=7ƾ|{ürnzí®Ê<ñ{µ„ÐÁ1ëGÆì-’w{^GøMŠ•Á—ÝâuõõÍ»|Cɦä%³X•êeÚʆäàºTíãêèGCN™j ¸¥’/åƒ;Ò†àÏÙ×&å)æ5õ.¹âËÝÃZG’B¤\²î"¿{ Sx0é5¾û2YúÛ oÄ@:ÇŽZyïo¼’g¥§b…œs³~“þ̯ßó ªÔ%h”wQ{Ú¼êr­¨ Þ¢YAóøN—‰pÙˆûÄ­¯8rMãö½Û)a÷ö˜¸×<ÒLK¥÷öÌx˜#ó’¡ê½½füµŽSYܺú–’°,#4>WLy\Qª¢–Ñ‘§ÆQ`Ÿk{·YŸ‹#rQ-u{ß"Íø0m'ÎÂW½–ž{˜fqÞMiN´•úH(ÑÊM=ªBþIª1›)U#ýAæ ¹‘T»é˜·<ØŽoSö"j8 ÚUvA)øºb‡?£…v=©o¹É$í±•Ê{1AªØÌeÙyXÊå#]1‹DÂ’¼±Ùuë™C¦¥o“µÓNËlÞ6­MD^çìÚHÝë X4A½˜OŒvLyÑÖr5¥>ûg62-‰ÈŽ>zù`æl¥µ•FN^¹Ü¯7.ÎÝtùç–Å\vH¼Ÿj5jÍÝÈ5õÍ ²Ù•w>¡È{ ;³`£B&Â`²|=,FÆJ%ÒC”Ü=«”+^§·¥ü7¬zrgIU³âŒÕü¦²j¬$8·ÃQ­ݘʬúBê¥ù š"¢·.¾,©x%–)JѳΈQåƒJëz§qš¬ÔJ­¿ß!&«žbþuô‡Þ¥"+Ù„jhb w;Кà®/ÔmU™w,Õ˜²G¼Nðì ¥6;ERC}Â[¨¡îýˆæŠûÖ'0' Ó'°+ÑDFQoìG.'¸ž{Üû6–Õ+ò;ͺº+GRo®_ŸÜð©o­žä2Ùû¾0ËÉýݺô¯ÿ6÷OëÖcÂo&¸] ׫î1Lá4)ßU¯UÛ®1Lôñ;Cø®^ºÅÒ/¸€Åê/¸F`c÷äDÓ„Í2ïev¹Ïøg«ë"E–±Õò‡#£®Õ3œáŒ«|‹¾ö¿Ý²  <9Îtº  ¾<¢lB-ÈÍ?Ù EMâ üÁ?) ÈoÃÐ ~ÄIy-ÊMæþëAŒ™¬îü~=«î#;ßy_Èbõí9÷­ÞS]¦ÞÓ×tDSN•*¾¹ü‡îq¯÷Y†·¨Þñ¶ÿOÞ¹Ë}¬©ì¬ú\°ñü3jµ×¯Aõ-£Û Ķv8¬̼xø–ž±#Ͱ"ÍZn›'î”\GJ#%“ÆàiÌUÛÇïé£üGÑëÿ<ŽšÇTN×þõÍöñÙÞŽ§¬Î»æé6ß²·´}tÊO¶JùqõjñÕ/Õ‡ÿu³0Ñ4ì”xùÌâçi•SGíˆù`ýÖR¶yo‚™¯k†ÂÍ=‘ÎÂÁccÛ«g«.LËg¦ˆ¦SÌç!—ÐR8xcìdõ #—‰Ë0d?í¥ðÓH'¢?üÏ©ê"ªã â¸M³õ[S"ñ®Ãy™?©C ÂO³3ËÛÁÄ/C¨_†lERq¸:w87Oüó²÷½¼áÕßbгcs>qçÌ?Ç÷Ÿ!ïþY„[á]kÝ!`{”¢«h—˜U“(–¨­ñ;BuÂGê¨ÕkäV“¿Äá/?õkßÚ>–Å|`CÅC¸¶ ÂO\ܸ `tº“ ú(PÖÛt#”¨Î£ÕJ6‘mÆÖy¯IUí[ÚµÌòz±¬GVŸ¯ÈáOï\™HrÎ¥^â9—MÙ1ÉëÏlx5+:ÊP¯¼Íœkfˆð‰=m’¿,é²|aÂÉ4kÉ´þkŸ©>Û…äè€Äsµ¦`uÝ«zúJ}.gSw…TFpF|Bú<¦ÀJÇSÒÉ0<½žÔíõŽ;ì4f{¶+ÉÆËÌZtö¯¾LM#Ùþ,cÒçý™áËOÛžþ"çE d÷«ùDKx‹Êš}.ãSsÔŠ÷šê/|Y¦Ój%¤Íû!+C—?ZH³î;¿òÖÚA§«V|/3¯I»8’÷q ¢A?T÷ÿ¦’Ö÷Mþ¦ƒ’·‚#ľ_ìK·GŠýØ›öÀbð-;÷¿S9-šÚ±ºüÑB;§®g˜8ËïOx§UØ8ÚyÌŸ*¥½’ºS4S?:Ú'}ä¾SÝí9z{ý„ôX!.rP;³qGz™øÔHÇÈióUSÝN®ãûoL)~tìŸ *Œfï¬R¸9ˆ4·(’œR^ŽŒu>š,ÄûÊân)kÎÝHÿÌTàuü¶bK¨9ìÄx˜)*#êZîšðwܾ°À€Ž"cLÖÊ3ÞÎÒ…@ubLöãS’­]f–z,ÉîjaÉmµ] {J%£aUÑÐLe´]QT¬¯b“n£Œp³†uùœL@³¤—Fú·‡t¹uV¡ ÙR9/½ÚŽCÔÝ öU†öŠ–ýÜyªôyÅK…CæõÌwþL¯™ß°“výàû RŒQäÿ*¦x/»Q-ó\\6Z¬?Ô[œ8˜_ì:¶“Á‰Ñ#”.¬Û×´4e‘½>y/''ÿMsFÑÒ‹Ç(.†ƒÀªh/Æ}†Ý2Ыõç+Q:&¹<fÙ ‚䯣£¯?¼moù™™Í¤¦6ùjîGgìÁhÄ Ë¨•¬Þ9Û‡íÖÌyL¶oóÞ{üà$lLöYÛ6ÊÞî”1=g´t9oizNÊ ~ûùÆ–eØ‚ѧ“!©ªV F¬jƒÂC¶oÕ‡‹>99*ÿ:œ]†|õî ÀK*îªèÚÉæÑàS¼+ì[¿¤f*‚F·:?º ?~’yWgMâ ´É£e‰¶@R¦TÏí62#@YŠøª1\é,—Ópžm†7ÁYÂ+Ŧż&ÍL4¿%x6O,Ë_ÙÔ¶³ô¤L×Þ£VE%&ÍúŸR©ÝVG÷à|qËÿ¾‹ôØžHqB_íD‡?½qr<ŸTàNç¹e¾«#izÊtÖ®ý¥®QþûÛ¬ >¹¦ÎplÜ’¡4ÖËåvƒJ®‡¹å™eXÉP*"¥"Qk£YšÊ==÷Ö¯jjÄ£¸ÛÁëKÖ”¼*Ä x_+ Ñ‹<{Êýh=²Xµ”d驽˶83¥cíÉk˜ºä\W˜eÖp;Y¨/éLœÞh;nJy Ù:0pzÕY‰©ž7q*Úú€•KÇQÒ½É}ÈY“Ÿ´©”I×2GTa›Ã#o¬;äb•tÎS«ëx RŸÎ÷õÈ.«-·%–’뤀ÿ-k_Öýc›KÉ’ÄRÖ&ž¿Ñš"í× Ëj ño—oÖ˜ ¡F4æ‰ñÿ–~ sS9a<±òº·ÞwVr—æz±Ä*8ÈôæxšyE”‹J{~^lAŒqB˜™P“lnï) Tïdìäe^Û2‘ûù—¦XQbaä0ÊpëàU‰ìMcV §—,…šMé7!÷á 5 õô¹XD¶w{ÍffíÑ÷ÓAÙ>u®ÂÞ'J2¢«>‡ÂIèo½T*íöe(R¿þ®(Œ!´7dÈ,ùÆÃ<»Ö=×ÓÔtÑäÁ Ÿúu±bÓŽy¶T¦¸ì[‹Ú‹çÊUá$<d꜑>È9Ù ¥ÔÇ2ËÎG‡2 ÍP/O†õ“wµâhjAPÌe#³@’©Oq+¡àLÂ¥;CЉ‚8ó¬¸.ŽúJ3®‡Nj%}‚Cymxúú!<,ˆŽ57>‡7¶¯‚ó[à‚÷TþÆÈØEÝÉ-ÀÒÃRûzf®÷òzpX׃ûÀ¼\FbîÆ\]17h®žMt£Ø—û“ê8†Ç1ɢؗ çP䥞­ÕÁÜ€R™!òB*½Ël š9…bòñ/4st?z\skzÙÈ~üÌÛa’Lyœ)ØW3Ší3±f¾4Ží£\縋Ñi+YçˆnÒȵÌ[†ÞYŠÙ¾<Ÿ‰Bó%6ü@®ÏDìI#Ðk)[/!YÆ:Cí¼hPÜ^ü9+ùb«}¹ŸÈct@}ó1\ÔݶŽyq°¿}¹ÌË„Žˆ—:æEô€M ¹ú/ÄoKicpûr—ÉŽc°ÃEë+¼Ô?u0óaè¶«5Øô´ 3ÓÞô,›\T]g­òjGŸc¤NëâV\~÷-¼UL©"ÐB5¦Íš²ÖõU÷|{@…'\k1åë°s5û?òI›~j Yëêo@sTL­ŸLþG~±¼v çüG ´jÎOMOÖºVÚxëx¯×™øï€—%™/iä“FÎt>Î&Ï2t•Kó_}»,€,ÿÌ¡:P÷dDµó³~USªÌ(mïkM–*#7=”t©eÝ4aoÍž¨¼ôT·w0°’÷R¶¡Â•qÔÍüê®±9ŸÑ:R~ÌòÄ °.Þ*K“oÀÊ)9pÍb,úú{ÙIRßM ÀzÖ$ú€¼½ \šk˜€7t¬Ü‹œÄßX†D\«¯òG,ÉãN‹™;@9Ð4¹Šl¯“s¦fSâðGÝa3íýf¼Žgâ’õ+ڥ̶S•~5Þ7™l£½>ÂVI›¡ZÍØžò:5:KyXvWª vÖÿ: … "•ùŠ%’ždæXáÃD [éPÒÛ&††=¹´¹Žû&–†p>y½ÙëÖbÜa‘d—ØlÙ{ÆÏs}#ûí—ÖÖì¢Ôòµò“e¾ŒG#rw|ÈTezäø°=’êŒd®Fôf B‘f„ ÈC¢ûði£iÅ0ű‚ox`7OØÀ$š³ÿC<3@|ƒõÓ½ÁøÁÑ®ýøQ´Ý¨â¤Á7b0ÔH4l ׋/þ…6Oü%øæíÌñÂp…Do à‡„Ò>½ ¾Á~€éß@ °qpt‚#Šö‰±c`$Àîõ/zÞZÉ–M¶_2Ylí•Æ ?)“Œñ*ÿš®Œõ6Ä­W¬básd±,Kcõql2­®(_ „Û_ ¡JŸ.*+yIjU‡H ?žå¤1OÊ0Ž}5”-4°wfíªÉQ:Ìí9£UåH‰;\V¥±ã8§Õ5QišŒÇ7 ~Ic6´¿)MÃßËÂß{zÁy‘ƒµ÷>ü‚xà–¤ï6­÷6­ÿ6­ïV-â¢:ô"oÏmÏwOuÒ—$ê$°!èÖí t„îõÝNF_TG_8‡^˜ÐÏðYX®ï¾¹)Ç|úÉ…I1‹“óBßzYxôÅœ°hDkJ ^+ÁJê^+V¥.&^+EÇž¯º+?!õ©ŠÝ”Š[[c¾ðû>ÈdÔé1 Z£Òs“ÚEª€˜7¶›bßqsüx,ê€rxÁ hÌÜw;â,!`ï3ì‘u‹Ÿab|3>kXÔ?°…M"€cÌŽH4çsx&žoAÏ–ª[ÛÄS7¿;ÁÚ h0íó’¢Fç‹zeHtz~k~m(­)¦øžø¦8+ÀûàFú3¼¸Ü@Lo Þ°#H4?¾k8-GH  |€ùÜ@r`A°‚ò Dòb† €£áýøPDŠ"‰¾ ¾áz€½¾Á†!Ñê½øy‘´b¸âèÁ7l0¿6l€‘»}øfQ´4ˆ,ÅÄ ¾z€©Þ@Œ`­h("}#h»ñÅÖ^?À¬n e°)ptÞ~O$m0šøEð ûLø‡ Ð~À|ŠT„}V ï±$x &\5³Q ï¹Isb&çÿP¬Q7•‹:™¸ßÆ<Ñ"¼v¥b_)j)¸IˆŒ&Ò*d4Ü…ÖhÜ! '‘¢›o«ýLèŒÚÿŽX1v€›áq†|F5ûùïAÃã…ÏΚ®áŸ^ÔM4µrëãáÏg›ÈgâÖæŸí#Ø8W „èLtªT¥ñ¿d3³æ|Öç„|Öz1Xµu=íš,Qºô ’¦çÈkña*ƒüFÕè.ŒQÁ_Í8•-m äZà}–ŒAÝtž44)5ö‘F\_R&=™½_«Žy;€1xŸÝPªBLKõŠ–Á>7‡‡RQü<¹Ô¼ä±QfUÉÙ)¼¯SIMé9MÂ?‚!Ú:FU˜ý=Û)Í6Çe¾g Èg¼ oV ¼N"ók̇'¨këS(ºMxÚUb8J:÷iŒó \÷Î~|ýj[ˆV“aYNvÄS¯À6ä]½üÞEBhø±p>}ÂõšúW†Ž:«}òÁ;2Gò¾ÙBŸ ïT^»ï¿­lXU¿7Ûª(6ð©¦z¿“_,úÒ –ÃH9cø7t2÷ ðïO¾?L^NrÖëofE×ßM?6‹¾I,ü¼=s™é$½1âsÙ¥RFkmt§h;]ÛÐõu$¡°EDŽ'9Gû¯bSJÆæ»¿²MI&²¥ÇLþ£§–å"¦q߇c’¢Éؾ¹Ÿ¿ø zMâw.S¯pM¨lC[¯rM\6údYBE·øGr“AðÓqêÀ ®Ç×6M…dób{®Y62El¹L Föð¤´>…*óíróbo./®Y&2E|¹tÆ“ð¤8óâ _ï¯Ð)œš Iß®ØSÚõ+äŽ#i¯%ùýšDˆK^ïºØ—Î tß{ªÓk´µå¶U}·ÖZˆËFïz7bÃ÷žæôuíD¾mUÝ­5âÒÓ»ü¥ó‘£cT\ÆìösïÂÝmO ÂÒÖÑ]‚é-¡Ì Ù(Žœ£IxRMßH}ŸB«yq—‡1×,#™ Ùy\ö«¸K,9 FftÆ ð¤î>…óâ.n:2r²Ù«©Suziõ·%KBþ&KE þA‡üùôþÒ™åü…N]Øç³¦üµ Ëø‹”/yVJøËV/I¼jA?rgfªî4/“@™ÝK‰¥!—|ý³s²¨]ÕvÕ­„9W×…Y ÉËá§½õ3ùªÔS»Ô òcïÇït³ô ÑCŒÎJL߯Ñg Úh¿_c̆ÍÒÊä\ö…Õ¿›£]‰jb]p]Pw©â+–‹ ¨¦xí´0bn­ÃÅ-DFN‡+÷q+" “>”ù7ê©ä2€I\Ȥ.½¤&¿4)±”^3!µ4)³d[äøy†Ü¯zé3ÆÈ28Ù]í%yó@Çþ›Ä8Å>u<û³”:!\vÓ0’Z™Xý‚¡Ïù±“2¤9W´ïúŸ_–ßgAn&¦€Wö‘9)p¼×·ó¹fu*ñ*Wy¯V àÜ>÷Öð–rлëäüG·œî¨â`Žæù©"ÐÝmXôÑÝøó•;Åozü*E§»3|Ÿš°ù‡oÛºIö|&­ò¥‰ ñãàø›z¤ïîÐž× MqBÜæÛ)/ã·§­ˆœŸÉÈÊ•V>“€‘“Ø\Ú«å¶n¿_‹!UïýÕ:¾ÝëõòÂvoWà;åÿþ6É Xh/¬3×™²ÀäžQ¹ i‡dåÌÈBüÂIŠÓä«éŠJZ÷­Kåòú`–æ!Šºª`Aï¥Úüà»Ô”*h¾ÈÚûi_í‚`^⣥i´;Ž•B3e£«®&éžI¦ZRŸng{¤ëQJIêLJ‡,I¯Í0ñ¢ª±žñ’ÅÂXÆꬕßó“>ìÑ+‚6cæ.Ï*Dw¿Vä˜p4ó‡­dIž°ç_ûhtâϧ…® æ_Ó•‹¾p€"7ÃÃV‚ò¯55îéʃ^΋á8Ð"7'F¬0oV %Ô†Ïÿ)åkžtèl›wQŠ÷®ÈIW8AJ_ÁÃ`¼}}¸!Œ¢2éû³)Иá®A•ì«:ÚŽÌT¦6µ-Q‰Æ”‡œ<>º×»k~nÃåG¦Ò­”qçHöÊWœV]Ú(c{tƉ„N+=š)‡$NΈÇßÉ#£wö ð¯â๓ãqµ~v«žÿ5çš°­kŸ¢×q¤[ÿR‘„Æ&áOCNµÏUî+BfP®¹±KµæaÚ¯íŒu•ð ’¨jáˆå­øÎ2¿…wóAX¤/ÞeK~$|÷€CŒ‡ÕƒôÅ,¢*çÃä=Ë0ôL[ïÛî‡Ì©<úf–ÈÏiÝ!cÂ¥uA˯ÚgKÜt ¤­Ë"’(pU÷Ào%±¦Ü¢FÔ^©ZIÉ‹ÈÔ°¥÷Wäì5p‰rQ°%!l”D»áý"?q±HÃû5h‰8¾ å×½""y«±\Ð/m-ŸÕoˆС°wØVIïo$¨v‹tü’ƒ/7¹KïA™á¯¯+Œª’»Efõ9øiŽ’õãfÜÙ5ÙV2ÓgmS”dåÞm-®v•¤äªÞm.?¦+®ÉþW~x9(ëNV¢þì'Q#Žö·WÌ"ÕÍ^™70ïM91 ·ýà4K¿Sq9Ï0Ægþ«b¥ÊçHÅd¯mŒûSd)ÇIƒ9«Y,B÷Ãß_,¾ í/q\#H#ú”ûÀ;æ0,®6êä <>}‹†v*•Ó!ëFì䉿ŸN>V #FwýUøøß¨ðå¼ùëUO~LÁ÷7{oe³Ãƒ)ëb,ÓéaúJWèo¶þ©µ'ö».âºôEɽ䲆ÿ«ä “ŸNuTüÿ‘á.Ô1÷ÿ#Œî‚ÁN_˜³\øš×ƒ´°µ)ø™´¼âV°ê×¼è< ºh[Ûý›QŒ_ºy3\]´7äáñÕÿ¯˜"«×öǘ•Æûö.Qòô'HvÈ\#:ávgÁ¡yà=¬<qT”¢»‡ñ«Û Ü`ÿå*Z[ÿ¬ç¦ûÂç¦QVIÖñÄN&h8ÿ‚pú–eÿÅ+W¨9g£ï²£D<ô­äÆWW­…HßepÄÁ#ÞÜ=j)œYJ»b¡EìÜ¥P¯|²èQÞUÌVÛͪpR¢{¸@š._ÃU‘ÌÛ "ËbËÍËÇîà¨WTcë}è²XlËþ‡W›Ž5¥c·XbÙHcb¾XÆn‹ºâÀ‡ÒO¼‹Ä ðæÌZYÌ›îjuVS9prÆ®¼˜7Õ,™7Õãhžp¦(wÆs0 _YÌ¿¶ÓXEŸ/XñÉçC÷Aj®–tÖ×XÅœ· _™ÌoÁ.%™÷QοÄÒ^.mq%kÖï˜wáŒ^¡¶ÑìdT8™d-¹þãQq‚ìˆÑ,*éÌ©±Š1Öü(á¢!üj¥YZ™VC˜b£™QâDACk>¹ÙаüDßÂá~uïeÑuås]ðNü„¥¶BË¡–5}3߇¡\s^ ½™9bÅ>ßG¨<Ù¡QâDEC{>Ça/lÅXCc~7l¥=Ÿv~²¶Pt§—ËÁ·}ÞÔ¯¹s¬ðú]s@eÊŠÉŽVç«ù\,lIçå&(éá+6ù>‚å&ÈêÍU'èó¹˜S(ÍŸ#V<%NÚó}œQš#XUN̳Vè-æO½+ºj¨jr,b¤Q2Êž¾r!yâ¯Ñ‰AyÇ|ûNþþ]t'å0“—Ù¡¥8© ô€ H[Ócáºà \€¨5nˆ£ƒàapTðã+€8 H= Þ¨¡&Œ‚Oºï^Asv6±=è ×P¸0øñ5 ´ÿ ~D„ 6BáøàÇF-Àp„ݶrßôøˆALŠ 4Ò¢1};¢ñZK‰Qù ¥ˆWSqÞP·Ì‹¸Ä‡556ªÂGj¡8¦RO¶bÄDÉ)çkLê4¶Ÿ >g4•t Î?CF€#WQ°30>¬Ö‚*í]ÅÌ…¶ ÂZP@E¬ó=ªOÎ[Ô´QpR(„w Ut €?CYx@ç°Vj˜H­7 ¸Úúæƒ ªé `ƒÑ`EY#ù'†³l·r^EÁƒI]%E@Æ@|½WÐÇÍ\ 3Š+-øêËK@Ñ÷ ¢‘¡n`j4`ÑûÈÖ’ÄÖ’x_K2P´1Pö @ës&¦% ÄO%Uöùò¶³ÿ‡‰*2ȾW˜Ðæ‹ËEô ÌWfŠ õe†™¢†›{;;¥sAÀ>‹ Ïó,ÁíG ÅFh·\‘@”ap&p1ŠƒÓÁNQAàu| F(Ü,ªCÌ æ8µ`ÝdŸÌÐ`OЗKúœi±ð`p€öH>îB䡘Ãà,à @2h/ þE©ºV oàþÇjÏÑæY÷ñ5‚µTa äD…Z€ƒÐþØÎàG$À2È7 . ¢ý؉We%¶fÅû’ô”[g݇›ë:’@Ê?C÷‚°`d  ”¿÷^ö„ìA&öÞžp€=HPhï½üØ5ììºîL àÞðæîöŠÑXÜ•ƒ*nýò#’„É>凵Fò›dCfƒ”Üâr-\•o³uÅÖI:ñLLºµów~rd ~c ‚ù`3¨*ÀÉïªÅFć¸xÖŠ ãCEõ®¾P¢º‚Ñöć¦ÁÏ× g¹QpgRh mlTÓÆþ ­Œ¡š½<°4OoÌÉ5|‚¤k%„Ùê½t¥¥u¥¥tÕ#Á«nèæc~8 –ÔU,JèD†º÷®Ô‘@ݽ«Ø€ThLï*àÙõ rÝ:qÝÊ!‚À®~ËË·nÚŒÿ'ðA½Âyd(L ´ õeƒ% ‚0{…뵎⹀ym€ÚøáûŠXx#Öæº.h´W P†å‹¢C}ù`“/@Nà4 `o6Г5Ò·.Ñ·.Þ±Û)àÒÐÖcÿн ÚÙ);)T<ºí}”"¸ÆV\æ|cÑó=òÿï4áÒõ_B¹h¡\”®jd Zc ?ÂÂÊн*Úè(µ·ë_ndôàÁjAapc° 6p*ôŸÜ@ð'úÇûú\M€m™º\pùKëØP=Ì„ÈÁ÷0Stàj¨/̨EØ¥Ô¢€ªÞGò/ g9nå êç°PœšD;6ÔI €#AMÁ]ÈWtQ(\í_r¸¢‚VÃàx`vdÐcji|Ï ØCEÊC0‘Â@¸ÀèP¸éb8N"Ð"ƒäÃþåF¡`/ òÈ(z»úº†9ñ|æzïq`bØ@N$¨rï=7¬'ÌPAüaðj¥jæ½/GÑ‘ëDF‘ÄÇ.c zß{ Ææ!C÷zïqÿ› ú½÷¼°` à†þ¡Ÿ84²WB ñ;ÎC\ä€dYØ¿ÒO x.XÔT<Ð,ôÑ”D-zMA²`'3Ÿ£Ù¨µW1{¢¦¹Ÿz;üdB*—•k¢¨°ón(l~÷Ö0+SæÉU\ ¼ mƒñ!~÷®#ô°¥`Dþ4U1ŒÂ‰ åÆ@öÐÖ·ˆRozLZ¸Ì)SoöÕ²çÕP0ý·G)¢û/ï®±gTÀ'ÆËá\À¤é‹OªÂ ŸØµ8@.½«Ô€DTPnï*%@ýù?â*þߊîV2iEI-Ø«Ï ¶F4l¤Ð—`jL`Ñ¿XVCÅô ÔQ@нÂä€2$Dàæ˜"x•‹¢àžqB¤á1É6%Ö— f‹ eO Ú{…ñ¤(®b°I Z¯ðK¯‘NÅ£¦™)1âDo©ÿúý*ý3ÔIHG†z€E©ÿ§Xw¢¦^€CáN`Q À Ô/U(‘k€W4qáGⱈ^,âN@…¹¼a‡ú~„™âÂàà®N4ÐX¨/%̸úޛƈ*j ¡TùÉ65N^G",þO¾­†þ«ÎäWdÑ¿ìúç©Ø~˜>BËá!${¸?-n_Ü… €"ƒîÃàÈà ¢AˆˆGD}¨NÐszÌÐt à¸NL_5ê=o‰ðÝý'ú¦9§4å}—G,´|¤ºüvåIt´·OÙ{o[²8¥Ü+Ìv¨x¦Ý«Ÿñýß÷$PbœüHGM…Â=Á(€P-âP<8®'ÏVO>û9]"^Dh!H ¼P¸>øðŒþï„€gPˆ%·î¡ˆ¨áYîçÄ‹eëø8kEVæ÷‹S¶ßñ*ª•.Žò²ˆþ-ô]°3÷ð¾ëÙ<aûv‘€z£.Ï"ö/d¸•¿{Å™ÂHVNŠRÈbÊËð þ…®ãHnð}á«N:× §*õ9gšCg'ŠxùäyÇJ¾ßÏ> êkòÖÓBõgnáÁAè^PO‰iúß0KÑo„”t®9öÝ~¿¦½³‡¿Å'µbžóÉ‚vGV üŒèk9Ïý]·¯$A|#GÑ@çª+«‚™;>~‘Db é°ß¯e?a:Wùm\ÚÈ*¹ŸtR+öy«þöIÐb„Ò´úb™­ÈŽ3eõ%­vKDï8 (šÔJz.Gçúæ\ŽÞU|;^D¶Dèg•DºÁùµ&¨  ÉrNiM…øý? MZ IŽPFÏF„_øE3º¢œ'È€^d}*ŽdÅYF„+ ±wÞÂ'RK¸&\Kh(<‘õ hõÝ—í\MäûÝ—à\Mij<Fó+£‡^:ä,íí8[e/-M³wsâžß}9Î9$@lÛr¦Ï9¤@TÛ&q@åï¾äç»zï¡–EÀàß~«KSö Àm“0 ÚH'–ßTh›]t5Ò‰ì·! ŠéÄô‹­LõÅ yôãN1PÇ‚à!µu–q'E yZíÙôNçÉÔ¿ k+à€%Åwâ=ˆ?ó&ïÕKZ£*RòG_ÌŸÚ5¯ù ^aÓy„™vÈ6ºAÚ]mÄ‘«m9oêªXb¾T–lÍê2ÓÄŸ‘ª·$ŸxõÞŽ¤»EBDÁ`£IaMÞhð±IZDBxh@‡ƒâZ‰_ Øñ¤}á µåìZiV¼U^+ás‰ñïsì¨^Ù&ÿ_ïY×tÆéØvž8Û¶m;Û¶Õ±mÛìØ¶m;9yÏ÷_žq.VÕ.Ì=«Ö{}W}!^›$`'ñ —T#gŒ/Æ Î;aK9_°œŸ³6y‰ÇH²g>Í52Šà~ýê&ÌûèY\µh§€é§SÖHdÄX"áo!3Qî[&7%ÁNÿÀþs‡S9*Q9z@ó•ý1[Úó‰Mè# µG)‰&7Ï~ »tô{i…ªï‘ñZ%,G±È-^6<å$Ó-m*Rí4Ý-ºF7º¾J²ÈF¥ú^¥mDí0ÓZ¥ó´E}VG*ùî1M_+g€ŒHX+yYZñ5¨Zâ‰ÕÉS'HÞ§Ÿ½{F%´†·œXï À+LvKºMÛ“%ànd;èCè›mÄ7œuã›PÞžÎõVù-ïP$…Ò„ÌKÂÄžÑbö žêŽg}XìL¹“ü‡d(U´[)³aÄ$¯œ™oêúõáúJ U´ºéB˜]Wk5’-»­°ë2Žª'À“ºgÇПźDZtȧžB aøÂ¦NsgÚ4šã.ï{$ª®#©O\Ä(ºŸ*Ì”*Í¥úßv,EQ©Ê£OQÿ«+qNwž`ÿÙ5Hº$ÿŠ`³ä—4ó’ë΄a·‹>xìÞPz<Ö‡òº‘ÖĊۖò§°û4!ï‰ä– î|âlŪÔ=-‡9å)`r»Çåk 5èëPÀè±5°Q¤8p£G ýÀÀ”8,Â×gÃG»8\¨£ÕmÂ~ýט·®; 2ÒÐVXo_dcÃF8¨A”ž¢¾[=E¼R v©ˆû{– ÓOV°7æÆlHÍóˆ$Z˜‹n.ŒŒ%% -@²íX ÛìDêøé‹…XQ+§‚Î#&lŽ…ø-x‰áM´Ó‚@LA%_>&^ ójG€ð'' +@:5De6¤ÂŽ÷•˜æ#Y˜‚0Âc3`PÓ#D§ÆŠþÔãbߊª'‰à°«ÒUÿîQûÆE*°ÔúÙO׺¦^­å¬àÌ`¤ãPGûj>Íœ­,Z)XÊG:Ÿ {4„`ÎG<¯ƒˆ^‰µ4ç"i͆Y›Â3ç¯LŠª»~KTolÿ>íÔ=vÆ“åõ4óòç,Â4EWì!šýÚƒþl géY@)¥E•Ì»áEý½à§¢P•^Å?› *ÅY—2°"x4xýTÀIŒMò€YÏ.ê ‘šÔ÷Ò_ûÚ!3ð»;f…µÖ#å¤\$ID¬©¬&»'ìG$ {cê;¦CP¡…ˆY»~Æ6ý–Èú$‹ øæb‡Xa·ÜC¸’úê×?\N*î30ëu@ÿ},nš‡ÑÁÏ{¡tg²\+@›ß™B SLÂ-k fŽúeZ_Ñ¡S"ø„ñ…E|I!ܪ3î°®°ä[߇fßÚ„kóI;i#ìC»_ªÏ¾UËïÄÎrúwxcÙïÚÎØÁNôŠwèŠÀïÝîÛ Ô†%Tª — *ÜRIšE–%¡Y%1®ÒOȤœ¡’`y˜\%à3͘¤XçFHä•Ò™H¤Í]ތ֨k—þºÇ7î.w,µÜÎ@šô.BÏ&(,ßføÿ[nÅòŸÐYÏh,ø‰#t\˜`6* ³v¹ÈjäáŽf5‰B·r(ta{£²Eì yrlŒøãkXD1æ®ÍyUPå*k%´ÓÀæñ–Ù>|î"¦êá˜Òˆ&àeûƒîËž/}À³ÿ[0XNÅ]éïûóÚî°Ý‹òfh¤Í@¬  B”»ädiÞBfº„îi!_é«Ô–ß3x'ÁÎ'ð6ü Ð5ÌË”˜âN ð6Ô ‘ßõPÏ”É 4¸OhŽqàpEQö8œn(Áø.ÏåÐåÍ¾Ê ÕuaÖ]Û˜Ï}‡þ£Ú#‚¶üã•ü5ðc¶ü5øã–ü5è£yé0?Orˆø'…Ò™œF«i2„á¡D`©p Uîp‘“n±LLÐ;0Ÿw¯H—\xíѵÍ#ým)‘^A©'¿¬g`‘Üá±ÝåÑÀåQ¢Ü#},£Ù>2Æ›ÑLn¿å¼*²A“¿w~Œ7%«¾Ðû¯Zò¨‹Q}¨'ÔÚXˆwÌÚXðw7l*™Üà9a«†FåtÉñ"f«—Qeª"¥4fpÞ@x‰y§ ýíÒZòµ•{ç 1vOR3=¨'ohϼYS¹å•ïÊ:¹Ý‹ÓÌ,,›§2*ϱŒ¼í‹ùVŸ3e³†®Í ¦<^˜3Ç\^Œ³û\^‚³ŸÛñŒC^Ö™‰õ]ÑêIÛê ×êIeåâu傺v¦vUͰ¡æŸ©Þ~í*[[ç*Å™ˆhƒw{±’RNßb‰£óª]ó´ò¢YYgCR‡ðê®™ã‹ÆÛ*oçOÒüj7þ PÒM°ß6Ø q¯-ćjï5ÃŽ«AsŠ~EOìj7è ÚÊúÄãÄ“ƒÕ#Oê¥'Ã:5žé»iŠÙ;¸O¤Íدµ¤´‚¾í¹c‡Üîîݤ´’þi5÷cŒ³ØžÝúœíRvu理´}§± ÈwàZwƒZàw…ZÐwûÚ w‰Úox¥#!é´X~_¥#Øâ o†â Jé´ù\¾HÊ{òPʆÅCJGaƒmSæ &–§uìwÁ©ìÑUìz³²‹U*[—ølo$³é#6¶ŸmÌ>Múä^¡óû$^¡óÿd\©ñûdªÕ}‡«Ý{?Öï¢ëõ½xîõÁ¹píýB[¹øä]!`¯µuMûLíÿÊžµ›ž]!0¿ˆäð„7³5fßH)½0ý»\Ip%ÕÖ®Á·1¹ˆuÅ!úÎ&ÿ~†÷…·Ðú(å yC)å |s,ýÛýB1c¡ßȉ×x*ÔÆЬ–!­‡Ô8ÈQhÓ…sÆ y‡O }·éJ­@h¶~RL¬•æÒ ³ïJ¹Š£Y¾£‘æ2ÖªîN‰s}ðÝÜÿ+”iÒ.”‰ÅÜq¦'6Æè>ò8¢T-—°'í`dIÊ–ÇßF<>Yz!Rç#™¨¥ÀÙÍ*d#Õ`BNÝ’÷XOgðiÞp!×qàÒÞsAΖM ùg iJφrxó_¬+ð3¸k ’Mw×ÔUÆú‰½Z·â†WI+ž?Ðÿh Œß:Zë¦Ćݎ ¤ ÆÎ¸ Ý΄ ˜Ý;r«|+_[”VåÎU¿šåUYV”Þ¹&UéSØš„òqÏóH8YŽt €€â ÿæ;ÐÿÍwø¿Yÿ79JR@]Q^HOØÀÉࣽ!½ÐD0®ÒºžÉØÚNÀ IH‚ð=®Û!jÁ~!þ‚"É“@) “D*¤ˆD¦Ð©¯Ë-Íé2àWp3#ëñ§ »>~ή¿â¸çsœšÈÌâr45smøÞXÂû•'\?ˆ´eµKãVÑ¿ÎíÆå#°‡‡?xkìjù–ßOç>ãþQ/Û™/׺u)°ê;(½Û…½VrS 3y¥öâ7(ÙPCùÑ>ˆŒ y¡ô7è¼Ç®¼;€JùQ<ˆÝCjŸÔo+…[ðwKá%l°ÍGm¯ÛMn·9EíÅ;œÚr4˜/©5¡ÿ;¾µªŸ@bC`7–¿à†ÙUéE)Ü“â#mú£­_ïäÌ—Ò-¼BR[gO=üd&¡}þ 3I5¹=hx"‰Ío{¥ð © Ž%äçäÖšÁD’+ò[ p%´/ÉÝ´/Ñ][´/Ù]#hßšäïÐ&.Ÿ»Ü¾tüç\¢ô¯ fž]žS¬ôì»\ißÛ\…ô/ª[ „±Ù Ûöú©PÈèùS&|fù|f¤k…¹àiJ/]¤Â_ªAê'Üy ô"­2ä‚H§Dꜻ·¹ ƒ9ÄøÈÒúYAÈåâü0¨PË«€JÅõˆ€â8óÉ!ù ©œemJstʪ6Æ7eÕœ1 ÷I•òVúçô aÛÐl‘’lº™*XrfWžeO‚åþ{—òEÇE¬ú Î&~yÐLaC r+‘ßÅ_N d?ö‡V ÇòT)Ÿwq©„óMY-çìTÉÛÛ2Wî‘R"ûTÉÈÛ2_Næ±,—E­0˜˜Í¢Hü\ãlIsBã}î@a¯;Ëœ@癹÷Y¥8F«Õ±Óâ©Í[R¥¸kköEÞ<ÏcY ïãR /²ëRc ïf®U†õÃ|cäɼ̛SI‹¸CIYìB/!'<ŸÁÏ7(6‡ŠÒ# Â÷/f'/6LB͸U66ŽD(!S#p>¤0ftär¡à†v@i¸˜,jTfZü$‹—±JOÕTÓ(Ê ´¡žqN‘É+3=#éAû*B÷F™I‘)”l…x¦NjÒeQÓuÛoA Í[C}ÍrÑÅa^{QÓ];—U\K'.Çnæév|lÊyÑx®™¢Ò,·`މÎÜ)ˆÌebBçl©QÅ:¾ÚLTõH^­ H‡H¤¼Ø^§‰K£ ÚR¼CP<¾ øÄ Ò,+Õ¾ÏÈR šºR…¸ÉÏqW´\¶¥aîëí \ q¢÷aò1îÔš¾‹Qmj` ü=®£ÜÓ‚ðçÜÖ™ÿDoB޲µãt`îÔ9œ°Ò×~™]]o?òaW2SÊÛÝV»uÏÇqˆŽckûаÓpqN h÷I7jƒ8w…,0+ÊÞE´p‡‘æ'‹´v¤(áömøÒ¢fãÒ¾®ù~Åç’=Q9Á€…å¢Z!sFÊÇÃdh®Ý2=Y*Ü<-‹“þ7+;}•“@ãXËE–D]é+AF¯ú¤8IœüY5Šþ™&ºJ&V|/ÕJ®|§kX(³–û_†•Â`(e Ý"´ÖÓÙz¬Öúü'4ä’ÔóÛÑbæ<éú{;C¡´/˜¥à]oI )8ÝUä/ þíÃI2çÜ)¢ t}´&#€å&S¡,pY}ÓæÝ^[Xµµ±þ³Æê€…¼¤¸¡ žÕZÞF•Uæµ´¦ÌQiW ¨Š†ä".i¢Wsž~2Œì4í´mrçX¥ÊC/Jý¼²Ïâ-4;;mÉzbÄßbµ ¼ÝNrò$hŽuÄ!´èXuÙD~i$(“! ªªÍ‚Ã?›“×s!¬WÌÔ„ÌÉÒÝhúªÊÖ¿"»œkx‡ Ö41%›5ÃÆb$YªY%š ªÊÜݨuú¶ëôBÂÄ­«Œ­Vª´ó{™2.€°¥´÷²z·]TçñR‘†[pz+…rˆ™fùàꯖfx øŒ š9Ûï4{çaÄ]0ÿ±"Ó´ãÅ·Ç x%Bˆyu¥2+ÔËű0M‹n5ºç9¯á˜ôãENgFuòÉ–?f/.é¶óÿnè!ÈuÚšSjøNæo ôéi]‹W-7h=G'°N­°4'>ÔV‚õ¼ L<“©*/&¸‚=C¹bƒ´9í‚1¶É‰é¸èõlÌ)½‡õõ–‰»Ç è.kòV-ÚŒê™"õ +'…ÑÑ-BóûZ‰¸öU¨Ðñ*Â×I¹jÂAV GïÑocÂÂÁÁBÝ~Á–»;Îÿ;&{$à Èt´é¨>‰;*¨ËÚ¸GÏDR¥Žáqœ±–êí«È@˜¬f”¨-¥^X\Î=–¢)š³G,“¾ë+cÑJÇ#dÁŒâè0«J0®‰Õ‡wÃb¸^«Í1A”ôÑÉ4ãQ½ˆÓböLA—­ñkã¾T±=E$G=ÆÛs‹ÎÁxƒ´Áq+ΟȀ P‹ÅI‘YÄöÅ Ü' Úûbú‡¡ˆS µBú?Qå¢ö Л¸ŠŒ qY›@ß¼¥iÈ´וÅÑóŸ°#¥ŠÚ†*÷ŧ4Tw Ϩ3úÅÒ=¼mŽ÷ŸNcª´®Ô 9ýƒ6Mþ}V[†Yލ£Þv²¢õD<;T@}…`Ó%ûBf7”:”¦±ÏÈÁ¬z’ž úi5S+ЦoàOmm†·OÕ«Ÿ”Ì»T(H‡U¥ŸIišpÒq‚ ž¸)PF2ªîˆŒ‘Y¸€Av¸Qs •²›ÍƒÆõ8ž ]Þ)ч¥¶©lÇt©1˜0¦ ³‡yïi%ªÈ”P™Qêè8'½Š¡‘¿(*UŽz”â’5Uy±o…æbè+]8ÆÅ!ëõeép©âp³[ÜRár2gv0.ÈÌ|ÑíòPi……ù|/¹ìxJ6Nݸzˆ?5‰ ið: eÄ \¢éh¼\*6™†®Jìp±]m0ª9°AC¦^¨ÜÙé¢j¼Xm\Ç÷Öt‰?°!Hrðr ìþ=T¾D«‹Æ­¥}•Žæá|µÒå9ls™çò"ñ²ØŒŸ˜˜Á2'våo8¢ýQˆ 4á$tõhŒ UétÇKÐ\;Úµr< ð–${õ¼«ñ¼‹ˆ[žxïÅî7àÅŽ+vràE3¨À‹määàÒ_äÝ K[‘ãÝŠK{=€f'’åÕZ3ð׫•±zo`y¿œWNíy›})tßN† fŠW†üÍÎZ{8ô|σW›€íf7„}4g÷ïØ@Ø ,Ûó.zkB?¦zÑxÀUΉC“N5¼è¤€”0ƒõ@^EëHèú>6ª_>6«†0£Õ€b9¤×€B%¤ŸäÇúQ¿,Ô~æëGqÿXh!ýV? 3¤?óGá„ôOü(üþEô0¤& é×þQä!ýQ?Š*¤¿Ób7¤¹R>Ä¥‘R)Ä¥ŽR:„lÂWÈs µHÈ• DÈ€–µTÈ •í=£_ß–v6¤ŸÂš"j*ž‰Ä +Ùÿþ—8)á/÷GQåh™_5!;°ì0 ªÿ»Ô#~Löèò0±ý0IU»a}|ƒ¡¶ü$ülÄN8{”q¿F¢Å‡ú¿adY ÙÓ¢›a^qÔ¬ˆHàtp–avNE“cÿ.Õé0€«ZëYóg@²NQ³¾éc÷Wø{Uà÷ïÆšØòoˆÇ¬Ô¬ûUb‚~Îlù¥ùc † ³Õ°¸jJ%+ü”jm̸jV -¥òV¹QÚè1iÝH8ÇT)¡? GZÚ4Ú08e»¿Ôýö,¤ÏÑpÚÇTj?‘Û”$\œÒ *5ÿ}*I2‚Õ®+úí݃¢K5ÑêüϪëy«‹üëüÕÕ8àcÆ©—×Â,ÑUª‘qÂ\ÿ¢ì´F$ܲÕùkV;㦨Én„Yb¨øP±Ê«Tà /&ebá”S-‡îGŒ•—:ZåúWl þ”‡•GÒ6½ÓŠ}(Sçÿ¯Ú…½Zôµy…_I­ W­`ƒ™ufƒbüÝ.I{/O‚’…ˆŸ’xh?¼8;(}´”';/¤$éÅ%)²$Oâžo;\H'¸¤€ü¶ZXëæ÷r7Œ÷¯&nïðkQ¾=Ž5/ÎÐã=L/ÚØëàð'^ÜÈëaçî Ìéaoø^ý=_‰c ô€ßýû·†ü軤/¸S7ŠðtÓBgp¹b7B/>˜¾!j;×7€0Ÿ$°]1qL] â[£BnŸLå¡ q]Nà˘{qº0,¿’À[ìÿâ¿©¡?£Ÿnx9d±{f#‰/õ0'>Ù1lqö¯ €Þî1å¿i…p6E„-áSMlÛ¼¿7ªk°æ8ÑÍÃë® ]H×¹-{YNÄ3/"œx=ÂÇ{)§ /hoˆ["l ›þ®ó)7øí×E¶{ÞÞTŸà'X9Ù©ƒ5 |>Y"»•¬3!/ˆ¢¶õ­o –À{F=ö[ÔÑg^¬Yñ{ŠwV¬>)“×uMül;î¼ëþ|úž7¡„_ïè'r/߉©9ö¡º¯(=fxß)”ŒN¢¯„–^½[ø—?¼¿Ì9¿T§×^#ÄhT2£E&œ3av±”´­úÀô×µ­"ûPõ{ÚVj îù{*ŽõÙ-& Õ›#£S jÍ´­²úß·†º™Ô1‰ ÛãË!"¬Â"áXÕQõcÛV "/P0ÞGô‹òLð¢’YÕ5zßÚV¢!¨V 1<{õÑ€=ׇ¶˜ÕI…ÕKzúÖ@–&‡Ú1+Aõµ­šûþ5O=aVâgra–@œ«Scü1¨Íè{FTØ­sËtç7gÿ¨'ã3Ý]Ïloɧ‰³*ݯNN ïÐ\µWûã:á¼WMKÑè?€å’`îÞ§_ Ü}V$$F€“Zgn›½rf´f¨Å.iU7Óª:¸GO.8¾Þ§` ÒLŒȪ•ѲBnZŠ¿v0ä°®ÅUÛ³µGoÈ’Óºø5̲\€òh™µCQ7ä1´ç$(`]Ç„»¬)Æ:ŽÐ4Dk—´bøar¦>…Ý4Tm§ýïÔS–¤ŒÆ%°`€ Ïò ¢zãæŸäEð+P·ãåˆ6ÜÚšãáÑôùò“xCt<¨ˆôûæ³Ýr<óÆò†B}`ö0±èk§jÇÓk§Ùi'þÒŽßH¢ØˆWw£˜‰›"ÒåN~¹Q 7‹×÷"¸Ý7!³nG™ëºT¥‡“ûB5<"G½MG–$ö‹$*ÚÑ#ULL`,„§”JOt8 Ë $Ì’¥ŠƒUŒ"ZŽûQ&}Ou€•;-äS&égiLW& } S{Ç^:¨(a9Cˆ,'$MÔd.’ ^‘¸Öˆ_&ä ,ãÿ@Sˆ'~6TuE6yz^Î#©97ÏÿM2‰EZ•FhšÓh¢PˆG-·Ö >çï –{Ê[ˆÒïdZV#E®³j>-C6j…5#F”%æQËRH>NÞµÂ:—Ñ%øV+TH÷|"!þ-kcl&}\H€@üé†ÕKáæ˜kM´™¶Ñ߯õ Gòw[â.Ïqš(ð•;7’諟€Hè5ÑSOnî1óš ðrÌßü gLÂ'ÀøŠ•@JEÚiÜF¼š?ó/ÎFÂA‡QÔ‰ÔH„€QvCø_¤£À'Æ̈p]˜42õˆq¼Xq˜Ùˆr]ôm È'æœ^× Ûì-S­9 “ b©‘?™`;p›–ا1œe g^º±pìÞ7™ÍÇ6¬á8¢­kŒö)7  zŽ@ç4¥úÁPß“ŠƒÊfWXK63§7åZÔ súP5G§} YýPOÆÏ¬·Ÿ“4ˆmA,~íP¤¤sj ¨{Ö95Pó?Ð&8· “¤Æ¶“µ/2Ò¶ˆ‰'ó€Sk_þ{Å:÷qWïX\# `¢ º†ZØVíD-Ã6wD¸¹/©gW´ÕHZ •GùÌ¥ˆo\X%À¹ñ·¸}N+ª‘M¼¥cÎK­}Kü˜8¯l'FY6§¥s WÝÿz ¡öVH=É4&~$9Ý:·ͬRcn,d&šÙŸU‚Zi>‚:ÚvCÜ•ªf^µ×pt­~^Éâõ­-ÜÖQoŽ1Ûb΢8&òà­däͤ8ÔÞ&Zÿ ñ°8dEžx¦a—]¿A‰V»"y/+u„ °Ã‘¼}å·´ù¶o…É‘'\îØeûÄoO™¢gmaÝÇÅñ?¡B ’Q‘‡M†hf$ïq)€ŒŽðöðœ¸#Æ,[‰K%éŸMoÿ* üÏxâç*‘£IcàB®‡1’¥(¾ðå(òBÖo!Jclq|QÀt õó¨1iº¾Øs¼Ê‰@B(>©\. ½áabÉŒK=ü%™\AàÆ­F,/Ñë‰Ö.§k>“1Š©1 <±–=ÉjÌx"†K= y†=àŽÑFF·OgÄf#ô¢-Ñ›¾¤;B,Ô Än[~ãQW>£+j$@÷èAÄq»<—Nv¨ãAä–2Ê•¨Yëyè+øÍ0¿ÁÆ¥? ˜sb82¾W&½  Î×Q€ù¥rÞ%kÈ^b‘X›¥„¶L³±Â4¹T…ú°<­ÉJbq¬ÕÒ´OS±É¡:]ão²rUÀO8›T¥cJ…é|<¡\Åeq‚¸¾Ðr¹ÃÒ´H]±éì' >Y™fI…éOwBùÐÛ@M±IóÇÝõW¹*æmNªRq\žæ¬.±ˆýóò:Å&µÉÊRÉò¥¦ñâ„rçʼnµÒBËI– ª4Íd³¬<HBfáƒ_°›×ý3ŸøDb ŽwÀgü¼A»o|æ¿_1eHsr5”c¼bXèfàïHß¼¢}·sõFZj“8 ÆS¯íq_ŸIøv¿Øñ…}þ5ŒJpçdöKÒ½ˆ8`÷Hú]¿0s€Þ¿iäädg†ì$2KJ™ÿ>4æøM¯ª ²¤Ù)Òu tЛ!<ËóÁ2·À–ÔY™Ïfˆ)QpÂŽ.n°€õ†(̰Àz#¦‘êÉ?<•ká‘¡®¯oDîÈV5½m„>—©¨Ï0gI­hà`N¦)´·â¨Õ-†2•d÷ÏW€mÇ—cÚµw8•wKÞ%¼á‚…$¢}²ãÌŒf ªv‹Û%”’‚ƒ$¢äµbÿÅΈ”^ضKXIbôã$‘öH´Còªâøga1 €)î‰ /È˹n‡¸5‹™‡ËcÍþk]½s—PØÈ"$Ð.І-ªkÅÆ¬t*íêª×uMHúwꕼÌR£SšHòl‹ [À)s´´Å3½µæ‘ 0bÙµð|»|Þ›øD)§Œ`]c½u0È€g¶®fU¸HhžbºÝ òA5²Úà¹ò çjD£_Dc@DcHDcpDcO)qÃfÄDw!±ëwÚ)Ú)šDHă_ÄC{)±ãFÄD[!ñóGZÛ¬U€ø•ŠòAr$U¾*ÉqBÄD5c“þ0iý[¥`[°”|Sd9ȼ‹Ò_è+k9Ç?G{c°!h ˆÆ³yòñN¨rb¨åÒÄÊGºJiÂ¥]òà{2&©eÞ.&d«ºáf2Ô:Ͻ R ‰>2J)’W—“†ŒÐ Ѩ•O–½kt11Ôʉn¥£ŸÅd·ò‰ïÑZ{Ðm&º 6e.Ÿ{R› HÖJ-¯t& 7AdŠJEJ´Šýµ®:GhîuZ&zi`.Bíu!µ õÌ&÷.Fé'ÐAqêÔ½¸CªD3«¢w=ã# <äa·AÉwP­“CÏNpqfs‹JßD&gìZ-Ä`]mKý¡ 0ÍÄ²Ú ûŠ ûHé(«Hë¶÷.”R˜“˜ Háº"®¢ dtæè•æjR’|ÐHUb~n¸9;¥¹›„æüÒÙ*{—¤2©1zR“¤ÎÂx5Ågv®þR“ôF)]EÕQ)b½¡ÕÙ"Z‹$J åQ)lo4R™ˆPEÅfJÊŽRp ½)E IèÁU†JZÊá¤$¥»ÏÙ‡p&ÞÓY¿ԄI…“æ*I` F-…öÅ…ö¤¶ó/ )A[1 tæÀ”æ‚RœÖU’˜¹§b†•ò Ë ÃIé,Ã¥¨ÎeQY<É":ô—ÚqÜOqQ%¯œh©Ä®EÐN¼Ki³BÏæ_)Âiù«N™“hO’Rrœ(ÓÅSò,œ8Ú#yƒ®Š BO'HoQÕÂç'F'ô:Á[ùî'¿¼A¼¥s„õæXN0½¡³rÿÌR¶ÃS¿Á>͘Ù#êÄœ@l¤ò†fÌE·‚oqÍM²§ÙôyŸ¨rûÙ °Í_²g\õ¶9‘ã‹é ΟH¹¡yƒÏnºÁmÞŸêv_ pV…§{?}ÅuÇðåCÞ–< òŠnú¼‘AÙ&Ú½ýü¦ÅÆI>è(fu‹Yβzç4$À?ð2}†=ä$B=(1ÆûÈÏÐü~#M“ê!†9Y6¦ü„HÆÜN0;e¨÷÷‘Ë.á‹Ëz»ãà‘í.$a{ yMË&.9¥;{£6©õC|`ÓŒø†‰dª-e—ª˜ç³PóÈ&c’öd|g’TÂ*Â*I“žQž;ÈgJ 2Õm÷{=!C—n©ElÏ žÛüÍPKï‘<ÿ¬æ#2G ÁÌ3ex"¡ñ5*ɤÞX+YÉÝ‘­¢W>\m l1DÕÀZ ݯbò©Îâ‚R1Rmiä¨ÁÝAà@gд<¢Z·fES1mê¼:Ž˜xa·¢»‡g*qQë’Îbâ[kšY´aHÓšÓt_‰kZåŽûg|_ƒ+{díþ_%hO°ó^Y% ÁDû]|%δÁ¨Èù”­Ï ^%¹Þ Ç=¤AwÔãaŠ܇Jr?B-ðÑj*b{P>έà¥B)¹.n¨›ªQ$p†iퟷE-$0—i-$Òð(„Væ•Q-©Ÿ5Êb¯ ¶å^aB_2‘h9Ž–¾#\3n-8„üŠE ØJ„ç/ûtËZ¨jœé‡G¿2à‡Çº2pcTmV‹V÷B x:d…*'€½ö©´Í¬¦N xœaE²— Óªþéåq{ýžÌiÿa~±÷4«òï+0ʚ¯K|GÁŽŸ¼pyqjo1Æ(XÎAêVò¶Þn>›„½ô€KuC˜h¥ ̆ zþd©ÓÆî0D *á*C· R”FRÔ¹Ë`Õ@²ý`4ƒ†Sã¬íìcßÁp„•–S™!XG´™5­åÜ'K’»ýÄ­ÈNˆµÈ~ièºyÓVkÑ ¦!–Ò§`ûB…Bùû„¡Õg#Œ•Øb6S¹åE–R­Î’Ç{i›!ZîÎÖnO‚Z6.é!ØûiÎËwN š©nŒ®Þ­ 8ƉïKÞKš’. ÷µçô†'v}[¬´¬£œÇ‡™ž#‹ë4öwÞÏáqæúå‹SvˆÇˆg§®þìjײ’.Ь¦e`ÏýIå úïÊ’ùïôžû½ ž0ð§î<‹8ƒêÕùÛvˆÛ!OÎîÚ’}ºÇÆÇŒ†'n}[½ôÿ1„ý0TXfv}×Ïly³üÓÄ\ÚDK'°Lh°›`ø'yg㑃n㋪tµ™›eYË ÖÕ_fò§‘v=Ǧ |3[^šF¶:™@XÇÉêê¢?òçþ{::ãm fº­Ç­šºÇÞ?=g¤ÿ0:;/ý NÌ®;isÀéY:8– íío«e®´Ó31®t9«22×é /Ì¥ÿÇõ çÈò>Ö6îØëSØÿ³ßVtë„*­g{"ìl‰ð+rA©? ÖòWz‚ÑŽÓg~Ÿü‘?{ð5 ‘¶nà[$@2ÜÆâÒëƒ?üß .а¿—±ƒÔ8]wàWbQÒþ_쌵o•ÀI­cmÎ'sÒØU™7)¸v;¾ø–þM$Ã2ñ:ÿ‘ˆúä±Z¢Rhœˆ½Uú… 81o I€Ù¸0B½‚9e!Ç CräR=É;+ú¥þþŒ.+þg¯_Ä +–+¸çвv Ì€ý|fïÕàäªSæ”é’2þ¤é¾¶ [öÄÑNÚ¾AF$ñóÞ…ÏqF,B-ø Osbs=kŽÛ 2ò`r‚xsT’ٸˢ„1B"Î €$¸Š$pÕȘÙ3ó ^Řh¹‚b å™À=ºײ¢yðêÇ#Äk8P³êáiMØÓà%¹â؈½.þ§v²]P«®Š9к$-nÊ„ë”ý‰¸+«Kج!åÔë ZçŸËlÊ þôºB½Ú)¤ßg^îñÊ9l]`T½Ð郞¾ôz6 ÇæØ&“ëZø‹_ç}[&Ÿ+žVˆ\cŒ+ïV¼ïq4ÆuhFÍÉÞ ¼ §b7×RO”ïÞÃݦä«l¿ß“ŸðbM¶ïÓ/Ķâ>×ë÷;AßÓŒÈ_í\"b{nF/Ô²‡}öå³ÍV°ºý³×Wr¼0¸†õÌŽ_‘b^4d_8¦‚†ÚÂw$œ ¯Ð²ÚäŽöÈð‡ØõŒìíã#Fº·ªCábáS²ÞPÜ’Å"ÙÞ+îéèjzMŽÈëʆÜÚa P1~pj«%ÜvÖ[õVŒ xp©%¸Á¥ 2ã“çìÝ:àÞ»çoŒüÏêŒÙ>èÌöÊYV cSbS謣Ê(­ï,³˨8ê ¶Ò*Ïîü›>¸^JgÆi[cz æ³¥@³›µ ¹¥Á3ÔQ:ЙáéªFp‹æ¹5qÐUe¾µI5l[Ku‡S…Í=T>ð®!ãæ[AC ½Ã¦x­Zr˶œÜ­êx!<‡Ê6­Úªtö*}!0õž ÕÚÌÎy?›nœºù°_À-àÕHž`æ™~£-ÇÄ»4{¿Ñ;ìY|»Îí*èÁšsÑ*wËÝ[âÔây÷Â<Ýð?Ä»yŸsúš9}‡{ìê.{·ºEÏ;ŒÓw}+zß¶eù¡k+çÓÓ–sz9Œáf»Ó%ôºõ»{„+›îIvÁãþEñ:Ñ«í™ã+î™ô«ÖCo÷3€ïì3¢æÁgœàþkŠàYe¯Â[åÅAï·ïÆôò öM‰Í‹¦žX÷Ôr"ß%ÎtÎãæ?¶Ó¯m¯¯Ìkà¯Îk÷îÑ–pÛ'ëC-¯÷WÕmÊîÍgêŽq×·©{Œ@T_JФ\åˆdåðk賑g0ç£÷€·;µ@ˆÛO¡ÿÜ´ÇÜŽ—¾\ŽùÆ/Ñ›/ÓÝ‘{N_ò8’ _¶¦/ÝæT_¾VÔoúVØoŠVªoöVÚo’Vàoæˆ/w;èob7 oFö@_´Î0_”Â÷TŸ$_‚ÎoÄÌi_Ø­)_è­ÉXH‚}òß’ßýžŽïÅš _–¯Žˆï½Äœ[¶C³O¡W_N¾Ãi䕚0ßüܯӀ×cè+=’ ßù/¼þ}_·O± i_e°W_ Ÿo,¤=>rA¡¼_$ÜD4Âî{>–¡Šòž÷ƒ ü&3Nˆç5†Ê(·Ä•9ìþÅksdz.qÐqWü¯„ho׿ØÛÝŠgUÂvߣh?pG€ÄR’ØÚñÅY Î2—œœFí ÎAO¯E—!çxbh³¬>é&ØÚ}W ÅR™ÚóÂêDÙPíuÇgMÈ£m0ŧ±7éÁ]œ^i pü1}7ODýœÊ ¨mÛ‰DÙ í9@œ)âÆÜ˜A ÂF!Ì‘ÅÕ6fÿ¾GÙXÄá³¶ x ΪHEÙh .Hh¡ÛÿI*ø³ÈÐ~ˆÔ޹yæ©ÉÙŽoêDM|ÅØŽ&ðæ_pî¾r¢ b‘=[ÔêZx4ŲÐìÜn¤ÙëYXîç"<:7/ÄCD8;Œv‚5(Šr‚Ýë;Ô95]ƒ+ŽjÄåšÛñ\ú«ß¸üÈÖoR±³›B6Àɨ¨GÖÙ/‹Ã & ³k& µÚé(‹“+&î« &ånPbA Óˆ-³Ö®Þ‰÷U3”oÌâ•3Íѽœ¿dÜ«ÄèµòÏÈ0Øt^0.\îæ@Utc}Ò3ÓÔ_6w–í ‹Ô´¬ »—0\—¢âÈÄ…Îd²Øq<£[ý2—%-2pŽ4pß_Ø8Ýíâ ë6ºô£Ïùg1úTǹž„íÆ²(ê.Ý+Q«4mQ0‘¢©à§Ä´¸ÆÚ˜#‘’.²²krõ8ØG¾5× MjÏõÞ%#!QY´Í×Â͵®¦ÒÛ³Ó{!8GÛ3®sÕ]×Aß§àYÛRô´Ìߺ۔³­û]æ·èë®ýi]ËÆo1> ýÌôß!ÝLkï²;¤f®ç…ŸÉáöy_Ïo²<î´ë®g: ?«ú:èªÁuú‡ãz4õÿ8j~8&ìžÎe×®a±þW×àúddÕvxOéõ ^õõËuÝ3¨Ìö¬-OÚÿ0¢ÚžÛPW'üÙõÛ@L?u5µÞÔýqÚ•ÑNµbôÙdo-vJGZY­ÓèýÑÜ⣣XÝÚeÎë4Õ´Iõ:Ær¿Ì>v|R–[¥{øïýB}FɳÝü±V“KûÊÔ>ÜŠgsñý‰+²Ì8Ü½í ·Æò–{¥Ðí-åû§ô¾àÀǵs¶p‡»Çñ+# ]ý«UIä%÷ž'ÆšþgD™E›Á\–ÙC“+>ÇöÖ3+íBÍ:öÓöNÿu›¼Î J%ŒH}×¼v©ëO=}ÁmË[0mÓ[ël?ÙÿÓ·/F:ù¯êÅà•w }ÁOÉöÿ¶öÛ5ÏÝtWSGÜtmšãlù>æ§F»]ëå+Á5C¶z>}móTß@r:î"Ͻ$d“xäÃ81e~ƒ|b*@µŠ0)*UÁ֞ǂš²PY>'6©eî!1<ÏoË|1nQ’Ü'ÁÑÂÏÐÒxs¿2ó0ob(±0ÑÖLó¨Š²Ö óD˜ ¹ÆÁÓ|4þƾH­N对°'·Œ?×°˜®Y,_ºöaµ~6E9'r8a®9åFÂ*‚9ÙÒÑ=‡‚ÖøÂTFíÀs$°qwk7‰ ÑŸ¡ª†¸N:ˆøï°¾ƒTqÀñ "6]Ȭ¦!½öe† C+FZcàH>Ï Åš\Tq 0kÃ).C2-òþ C6>zËlË °‡°t¾^ØèCcªà7¢Òê£!vÙ•~Ýžì’¢´YÁt2€¬ÊðwÕQ-× ULê8z„çªÐo³æÆ´.Êýª@]B­í 1>-þA¼!T,’”»J]òø«Ý-ý´ŸS³úÈpäð‹ð-{­êm›!‹ÉÝ ô-Ø6ÍÒM—!¯Rå~ND‰Hœ›êË"Ž0x<ÝYر°÷m'&kxŸa&Usبa…:ys¤áô½aÕ ™.2×à¸a›H'‘KxaË‹ôE¼äE"~žhh}½›Œ ¤‰œ½ø’íˆÀ^-.õVRÅÐú”8Ük6ŠØ!Ùm·—‚¡ÁÛïä xˆ<"bZ¹öEû/š^iÌõ¢†WU{¸íÐmÕòv™•½4ÏoùØ0‚E£=ò&\µí”3̃W,'¹Èù3„Û ‘¡ëd¹‘0&Uû%KÀ”Æ%I½‡¸Õ&U¸s¬ñRW‚Ö}a­ª¸…uÜØ›´G%á'Þíç’–aÖß<|ZÐl}¬£ð„ÝìbƹymQOÎQL¹ˆß‡iDãn¦£õÙ&ÓõÇ”}÷•'îzªw^Ôž¼É*Ü=#ç]*Æ,¶*SZJ¢žç#é[oŒ[ëÚdn\#š[øŒ³ërKO[´ç×q]Ž& ×«3r¬wW)Ñ]5ãd[ÆJ×rõi5V»/åcoÝéõU5ÉVÇR —ÞUÆzf«³ËZ.w›d/d£6ÝŒ«-â.Ï]¿=ß\Fu»»ê[®ñV‡Ÿ£/ιÈlE$P 0ÔëÉc­ò•6ã"2Ëoá2«?ÁcÓv€G'8ìäJ0Ò˜‡à";Õàb7ªÃÃxÀ#¬Q2<Ç ˆ™˜Ò§áâ]įöÍ2’³ËA ÄÚ†<è§!qkËÂâS’ƒÇþM ,£ìs-ë»?¸ìË8ÀëÓ:xØÑq½Ñr0½qwO!_õ!»~‚<ÀõEsíIÏ<¿¦¹¾þûü®tÀ훜y­G„ñFÌíîÐ½ç«Jûh?þA7~øzGô½~gðMp‡ô­ÑÆ(<6,H|¸OTupÇÊHWØåE\ëÅH¢S ¥A¼ò;ð¡ ŽN®AÀt0þwy×·y÷è`4BÙÆq ÖÆ‚:nGäàiŽÒhLÛÀZSìÆLÿ­G¡/“X4•Ø!„1“y°5Óä wêà{"w 3ó)‹ý)ÐôVÁë¡Û%WÅ_êÅ5ÃE2ú b}0ËO÷ê£_þAO/óEN¯ãƒšJÇ_™–—±•œ3B"v˜âŸs fpxÈf€v(f rèiÀrˆ`Ðtk qWR«zç¦nöê¨nëN|ÁêNe•ðÁb•Ì×,þ…þTÿ°JáFiVˆóûÂzŠæÆp‘ÎFˆUdç¿aŒYVýí•‹¼x¸z³{·|£0†“]൛¨,ÿ‹†ëSsJ§J´KWÊÿ"‹†ß­'D ¤-"&ކ²«PDœ¯r¦®BF¬û7ú¤dL VØF ð¯ôœXµl É=Î, :vDmÀZŽÄ¥b5È‹†a¯¾å¦7$F¬BPº/P.kŒ¥ÂVXN°*ÁvQŽ-ú¤&ŸV®p`¾È~G´Èìl‰Þ¦È»Q©)ìS )âéxUSî}p].„ª€WÐY®¤Üz†«¢ênYÕ.Ò¤²YÐ^¯ÐRš­à¨|]ÚV.·ðYn»0pRúxö¯ôXYr¼ÜwÁÌ’!嬸”éìèDÝù“Ì"[{Ì~Vá\~F)Ѭõẩ¥úÏ›* ·GñXX·”‰(¼Æ,õbéI ×Ü_”Ïä±è/åèpÞ¢¢9ªû†TeP * Ö ‹ ƒ©¦–ŠÒÅéÈL’‡ÿ¢TÒœ>'àu" r‡ôî»Ãå³ß¦0܈ª ³·^è@böCgà¯vr Ÿ…²`1¡^*H‡vh#jhöwáF±Ü;+6lÏE$@Ù?]çÁS…aü®å:1OLÏ:D¨¦'C¤c\Ï‹Z£Xæ'KâøŒ?’–×Ó«Ç(všå q?2ª lð0:†ë`ÅÓ3<,¼àŸ.ñ^y¨‘Ôp¶×âJE`ª×ülmš©3svºÐà5ªÁ7T ªSC°ŸÖÎ.ùk4=ÝæðŸôÜægC=¸Ÿâ—[‘[wâ×ì&ìä™ £ƒ²ßöζ-7š^[ù•ZÓP·Œy»C8¬;3Ó•‹õOWi0àŠå)ø*%¦kçògý´å8pÍø”ÀŸ­;æ»^¹ï±ºhžðí]ùîfŽ3¬;rÓwùO÷Ï   Žg„Ãx:û«àt†W Eb ÛžçÀÆSZc ¡øåe¤›p\"݇ ¹Þ l¢-²áîsºW"bìÅÕAälw˜7™ß 1|†×'b¬æÎAäÙϺK÷EŒ„f{… Ä÷ÅàÅØœ<ùý‘H§Â‹Ê4äŽÅþîN²sqoè°y¯Ê¡gØ(*¤ÙÃÀâêÜÝ—jÜs½1é%VRüU@éR‰Wb»¼\’~EðûÄ’÷íC?Ö¹{è'鯗‰3³ëÂêóVâ…«_M¥ Ö^yc÷äO¸ÌӹȌsÛ\º~;ò³Æú]Uή{ñ'Ðå¡R4¿?ņ󃩩ԭ1?u꺿üGò=UAͳþb”ðùuðwqŸŽª+æžf˜äf¸‚*+Ó¡ûô®äfâì8¡â»õÚü“¸·½ø—wéõßÏcúæßÅKz„ä4½BÉöÊ‹º¾ûsll±t¸m;’$ÞBÐ’•øÌæ@ÅQ>µò¯Š£‚PîäBWiQ;‚³âsA¶%>vîQ=?yø‰Kâ¤*B®»%’f1zA4Kä¬lØ¥’Ô,Ž%–‡XO¾àñ€z9ÚJ ~Ù‚6†9  ™M%v×åÌ~C¦ªŸ­|‘òìo(yù ì#IvÅÒÎÐe'ð‰iº­Òù í#³ O`l©Ùí4¿\Åã B“¿ü_¹Î3ä¼lò&¿%5‰„5aͲÉÂÄ5AŠ*˜̦è(µõQæG´*—8pKrwìÇ3‘z‰.a]eºDï3´»â5 ÅK²žržƒÎ5©¢51¡Å fxs릜%%Hs¦GlëÝ’ÍENsç°£r¶cçÔ)yÛ¹÷-'¸³Åuf½.¡– €SŠG ¾òõ¬­ÿWaÌÊ™·‡¨woé[xÙw­%ÿþ¢Øoï ì29uêGÊó|^#!ÿ圅3VïÑⲚÜG-8§ª·ž‚n“ŒE× ç¨Kµí:|%¾Z‚ÅØ‹Æ·ð,µá¶"Ÿ£¿þKòän2Î Ëj%nL0×¹>‡~ÅÛº[BPÈ*Ló–{Ÿu-œP‘¯H5|rY®mB'^BRÕL™wíYŽM±ûÔÖîmË+5¯Aa$^?WO™{Õ±\î‚Å>Øû Éœj7J7ÿ?´œS(MÖhÛ¶m÷iÛv÷iÛ¶mÛ¶mÛ¶mÛî>­{¾™¹÷q^þÿ¾íÈÌÊÚQµb厬ÄGëä,´)S2ËA¶#ÛœÕÿÂe¹>ÊI”P5]‚•‚Æ&õåì7oøš›ý;ÛCrÙfl¿ÖßÔ‚h šR‘ÇÈ6eÓ>aY†O³îX×}N*¢+¤¢yÏAºÇ_!|Åd<¹òíºé~Ø0DN³8ÖwÊ¿¹¢jìNŒd!êg¼ñ‚Õ!’›é+ô—ÍØÄ_[0:úÎT¤òôS„×Si y@žÄùÌÝç5&CsZæ Uè7,ßç7U 8ŸØÄs04õ× ƒýPý'ÕâÛ:Pƒ7¯¡ÎuT`n,“ZÕŠïå*a𬓇«Ü8æ’ã|*ür¨N«.ï\*‘v •GlÕ•ïþ~³Bd+©„a—ÃŒ•ÉóU`6"H—«ØàÌÐÅ_›$ð©ý·¬–‰„ª„'*dÈ4Çób9g+ÄVÔž%z–ý¬±¶UÜ-„c€¿PL«ÉŽº–“¨*1aë3T 5–-$6®aÎñT,76-„l6˜+q§6%TÀ;PΈãt¬ d5²ÏÁ*¡·-œ‹;«lžê’¥}þ@ͪñœqT’'ªÐ´z4bTÂwî\Ln\ƒœß¬DW¥&€©}­éUòM6Õ…¯ÈXAΡÆéoäÔÙ_V+µ céÔƒÕ³Uõ_‰åý³¦e ú2‡=À ¬v³†=U®Bìb™‹‰ûÝ"ú£Bvkk|/°BÁ»€5mÛØðÈòt¨B;Û8rgZ]ïÕÈÓk}Zù žGNøÕÉŸÛLi#ƒ&°‚‚h,ƒš\½)B‡K°=Ý!ôTwƒòUunÇ"d¤Æ4 b™¢óD(Îg2VYÝ9Ì´‚S?Þ!Öe4 ^í9üÊ/Ëÿ‡íÒÇ~$ƒöpœ|îã<«ßsÓ$àœ\QH †$?Ja¾1˜ØœŸ¤¥Y» pr^–†~*@7„œ;,Až€d^–†y^2@7Œ)l5㕟`YDÈLø­_……Yµÿ Pv–Ç¿,px;l5Ûœ‡ß PR^¾ð1p|ž0¬5뜉ŸhYMH –5ÿÇ246í ?P­¿pm 90¸g±øõŒÐ‚=¯1˜Ž·2\iİ 7 çj&ö¼æÉ€Y°› š8ú X2Ão¡ Ž<ú=‚lÕ 7¡O8Z<É^€IÁG;e?ßjTÁ¢ïSqÁ¨r¹w¬2НYT”µ„Ш˜âŸv¢bÍ7—°?¾½4ïg¸Þpº QvæÀÕÞõʽÒÝ‘µOÇWmßa._?ÔÎ3b·¶úY5×mI}ž™sòв{»l]éæ¼{ªc ±¼ ÐÈMn‚’{|™sb¢0Ÿ£!lh¼ûÿêµ÷þ‚æ5òéø“‚å±Éo üÄÁ¯kvæðDÊ/ÃüäïÏ pFí—a~† ì 4·*×ÞñNéoËšo+sÞç[ª8zEå3[›F‰ÿ€©a6¸‹=¸ üDŒñM zp~œŸÛ¯„Á ¸9g¯æ›;!ÖkÅßÛ³æÓÝ_Ô¨TÊ–¿{ÅŒ“±â–½û8=‡ïÏÜ4³“¿üÇ·_ä®ú¸æô»ð”¹c‹ÈðóÁ{(ß.)ì" až9˜T›ÛY>ÿæ  Ð;Âf ߌþWlÈ¡Žóo±Ã;$fÐZ¡Å{p3¸oÌibÔytÉÂå"|ˆ(áÙ„ÍùG#À I•Âl#è ¡Ú„Øy nXÑŸ9µ'Lëžž9{N¨/QÓÇ*ò—; œ~ÝQÔar•½ pÞaÒk#Œ›_µ£ÛÆH7Ä{>hÜr¿G¨¸lZ^&WÞýÕðw’L«ZQZc(z•”›vT«à•/‰—çÿ(=×óËZ1Ïï–üÿsèÆÁ|v*?€A9ÀÿÊ¡ÊNæVÿ>ô [Ò {¹™W¬¡°ž{=iÙÞ€ºÓÕÉ”Ðé@ë"‚»µ)“”Aj]pmµЦ AƒB ˆŒtC0ZŽ¢I.ƸôÎîeà÷ëŒs‚ñ0·o®Iûë–ãOcn»ÏMä(yÁùgz*­‰-djCÅ?üA?iSl(÷Ò /ûZå}phêžúD¡[S[’»[-ú a7w 5J ŠkïÀ!h(¤NÎX"7·ú>¥WÅ€2^Í‹BûžñMó9ís@›À¾ßÀ"JíŽ ·â¾ºN]Æõñᛃ[À€#JN¥]¡lÔìëNÙ]8BÛøà´NÆp$ªŽÂ„Ô;Ip*åVÁC°¬J›ò>kð&ªŽüµ{ò@¥”;l­²[öÀ%h,”-ŠP&ÊNÕÚ}Ûò`)J©‡;6¼Ê3íÛ·U)¼Œ)•ñz4ö-QzTìzkõÔÜ=ø¦Úe-N4춺½©”ZªüÒàðæL¬u6µS¥G€á¶Œ2b_Yc®ãÀ[ŒÖ›RÃ*jbfy…-˜ÇíC”u)åP’„óò,ˆ÷Ã'²Î¨çj.&S7¼IÀĘst‹š>&$ÃyÂÆÝxQ"G¶5¡ŠŽâ‘&¦A«×C!ðÏ¿f¨S“ 3©°³J”²l:ª±ó_BFš4ÎA Ž•¾©¸x^+âØ±mzQrêLÑÂÞ›ú>È×3ò¦ÇD»]Ñ‹ŸG]I¿Ðº7ã— Á£gÆ]Íîç10Œ;¬ï{ÁV­µÚi™«kß@ÔÝéi+fÁããIÖËPø»ø]ŽÉGÝtµ $Ì£F›0›CêåÁXÎ ÐÖÅ„!PD¼Œ›Ø„j%­WR’‹¶ã&£`Gì’z j ÂXäñ–ž+ǼTi¥•)¤N¼÷ékÌO”" tšF@³Švu1ˆ)Ÿ:@ŒW)Šžè#¢Á°FÁ2å±^ÔY”~VnOaVØÄ†¦d‚m 2§™|.+¯ø£–307ÚÖÒA:]g”qDåTI@HS'©VVkÝW¨Æv-§£ÇâTYÚŠ¹L^J&5Î0 ÑýCÇž³í!„ØØÎ°ürñŽÛŠÐJ0“!]­q¾à&…ñbg—ˆ%b㮵E¼UÈg:éɆ(‹e1zë‡X(mˆ£$a-b舷ôèùžN*ÎçŠ k 'Zôc)A\Õ_~zü€âÍ8E(äE´-ìáÙÈrù›4P>Rq~hã&hMš¤Ï²y%ü=‡§„Îß(‰@Hz"}Õ ß-t Îeૺ•v3î(¹¨[_›ï­x_¿X1òÒÀƒŠpªØ¹J\ rÓDií7JåÁH¦¶xÕ¹´%šxÈ~€‚«ÒíU!DñjÑU ôUÝìþã2«ë™+·ñ“…iG?.½qJT2hkü°…'}M)t£Þú’µYd¸žëo,) Q*LÇ*Ý¢LQ£ ·L/“×c½í:ÄΈ1<=adkÁÑÂá§„04‘xkVËꞣ(%¼í4W¡È–ú9-–Y.ââp¬ÔÕ(s…óL eØ £jóßè_ýçžFC&ã!YÝŒrºç•n®ªìK¤x}Q[+£*ï×ÖLh/pX!שpœ•âoÆ%D°0Â¥d”³ Í&·G+͘çZÈâù2MDH‡•&¯ÒL±ò0̸dæ­Yÿ ’uŠ)©Lžh#Ë’ÊW  c˜5`€'ÛäkòxuJÚ.æîÇǼ·ÏÀM î*½kz…J²ÍEÓ 1ŒÌ}’µï^å}6N[™™ñ—Ï\Tkø‘âD©yS(ÊP;dá«oÐUÖðáP÷A隺V8¡ûnîÊ¿Óöh{Á/¸îÊäôýÑNîsõxÓI¾-ôLá0¾\>-ûôA‘&˼‡EXPê·y¹û¢âã%8>5÷Ø#~iäÃ*N¨6¬Ñ='lsñÁ(Slµ‘ &Æ%ý=j\xFþU¹ÞLƒø ÿ@hï®v,Ö&v,vÑ ‘k¹{¦~2¨~!ö8œ0Ú˜GXW‘qîT¬+ËA6Õ–8<†4‘êgà¤É¤[zޝòÁWò ÿ H4r° ĺ`çÇHäjéÄn°+ÙN§ƒÓfp;q2æ;[ùIì30([ñ‰ò“fîrƒåt gÊÉAh\P£×0H‡ã;0_/¬³ê×gÉi‹Ð¿:gŒùbêO…¥Ð&*Äf1J¬Abv˜»g™ïû‹ûS19÷ÄôO»)#won•ˆjY&ývø™¨«°e¦þ¸rU.6ÄY>- ÖÒ0Ò8kγbìöpžá9›êœhòCªl«lÏSÉœ!dãéyiQ±£aß Ÿâ»ºO ¥.ôÉêË^ÍkýÃ)ÕO€oøl-)Ú ÐHÇ2G¾ó]bwHÑÞ¬v‡ÈÐm­ˆ¬¿ß,î\Ø÷»OQÂðFŒ•Á‘tÙ'ÑφC†s,•7?¾ÇéQ:Öý©í@ CïY†ñÆX½G¬´F]òÃÝ$ÕOH¡î¾ê¼P¦4ú¨¡aŽcLóký“ñ:¦(ýéBŒMÍóm|Ô»+UïH­Pww_óΚOíög ÄP«Ò7ðü1ß|5U¯LëÔ†ÜG_Œeó:OùÇ2¥só¶ê´YŒ²@üì—J豘Å}i&uo¡ï½&8-ÕOúnë¼ø×ÐÓ7½Öï§èo*kY šèÿ¬õ'å”ÑÑ *&DRhR_>툌“%ñ `’gÍîtÉŸ‚ùwmÙã×öÐò![ùþd>àa7v”A!¾£XîÏú ßýÎj¢ŒÅ †ä?Á‰Æ=nÈtpŸß¾Šï·Ÿò·Í–ƾû÷ÃÀ|ˆ\±ç¦WÛèG.öÀC ç‹Ê 5 çPŸ–n%ï çX+ƒ?´ïå’«óÍTÞÙ5b“‹?‡tOæí2X#0“ýŽ²ÕŒÝ¡†ç6$1fãß1Gè† R¢G–ôó’ð³®af¾Ç×bÐYÅÊ(%y5y;h²iò9Æ×!ªÇ<2c@ÖÑPsÀD+ñûj¡Äû×&£=hlÊZPêäˆÛÊ¥ŸdØšgeЕ7h\É‘ÊR gsP¹ýU×’#®‘‹rÈ„ŒÍh—uð71öfÍþÑOæñÐsÔ¢Ü_€™ÕCSë.â/÷.ðœì§m¢ˆL‡ö s%³¥’Ä÷z¡Ó RLd»§úPV×\UTø·H˜¹'îËáîwV熼¿›D_YÀ‰ƒ ;J…ü8Ü“zŠëpw“•3ƒû½»eKóȶÏ}¡¹â{ÅŽ”ñ2ËÈn)U…j7 q¸–Ÿr±ä£­™h$kUćÌw ëë•i‚½\åZØßc9>ˆÓÄQ÷Œ›%Õ•>I1E·C::?%×V¬+â¹ó·°Æ¤1ÊžÌ1fõ°b¢”`i/›Ú`¨Þ9ù™{)ÿÀ!l È[§£ÑêDpG2>F¯³ Jb¡ˆ€CÓÕì,=h7Kð79„МGèˆ1þ>y©Ï,„žôõˆçÐÂÉY*¸×Þ(š7ƒ¼YÈèôSÈÃ"ØD펬[W T>ša­hŪÊ|øá ‘¦Â;ú©›Bº³(i--b-yT¸Œ«}-S_Ø0FE>bÅ¿ä _îf>}úÝA1­'E²Í?L™K½Á›8ú9³H”ñûãÌ€èAS[0iÑØÍq~õΧýð J.ÑlIÁu +Ü#·uÚïzÅiñºÂ£â˜š…»aûµ­?QP†–©E%¥=òÞ"R9Ë[^#*`Ɖîë.ç±Ê-?Ïíëö@wd3‰Ào„a•¡¬j(”Å€ÉóD…áßUšaMý9™‡Ñˆ(eÍ¡>gß‚w’Ú-¹õ›”sDߦ)^—/b¼é¯… Þ ÖÚ-ô¤ig”䟒ŸøU¼•:l‚²æ•{Óº¶t@^æqÞ¼ÜpHiÌú ­ñx‚û—‹8ñ´§xh˜•IÖð•¾ÇPÃ3fš%ù¯Pó4[vZpó!&%‡4Q¼D7Ÿ;£]³1­‘ -[µ´Íß~'áуÉHÌ W¢ H(œÉ‰‡”ÆRÊpxJ“úœã Ñ~\Ûld¦§…Jpb˜—Ø«B¨,‰@t‡š–LhÀçá3 a{p¦‹rœ¡%D¢@N5Bø‹ç œTÓgøsðŽOöix­Û¯7žtü=â…fù2BÖhÜ]26•“{•~ˆ× =‘~¶øwÚ0Ò©}Q©¶´ÙHž ±{$¹ #]á+É/ÐÕD[™^Š8{%{TÒÒ¡å¨/•6•"ËM¥á;`:¹‘¯T{ÝX¢)TñBd„¾KYaŸ„w+i Š ‹ÔæD_ïAª|ù¹а‹ü73‚ß0_S‚߀&AÛ=‚c› /œÕéšGA:*F†²ð«™%uhÐ!7ù}[  DÜ2“ zé%æµ8~T œËD…,„¥Ö¢—~¶©ý4þ¥¦ÆÕE.”-ÐÔšEk6U¶ èúÎ3ùÅøü¤yUFÄó£¸cà ßý»)qj½€‹9~l§·”­ê ~lb‡´bqÏbR‰¤6Ë VâÇ9t]òLÆC*£:è›ß»ÿF­“€¤lÂrÑã1‹@z¸P}l{O¦è§;i;)Ò7kv'ßµ¶¦éî÷s³®¿ŒJKDT7Tïrвü"Ö®F·jW}‹„´˜7váíÝó¼gÚÊmaüè-ñœ—UèÙ3ÏÔþ …l¥Chƒ0ÎÆ\M=c{®f{5zëžE-x §|P$•:\Iïá5ò”W._à¡\ÆØ2_~Þ Êwjv먚øRaø(²)¢‘;à1Ðj¬Õp7L8hÇq3Ü0nɳ¸4OÓ>…õ‰Þ ÂÛë\ŠËÑAõ[¶B®lkéFG¶´5GL`KXOžÁH)L§Egy¸®§5s¦”^eS\wØ‚Æpy0¸T»‰ÿ*ÿ’‹bH¾ø ~a@û\i/¿ •ªèϤõ×Oò÷‰,¡~³-6ÎM«.‚œ¬å«5¸Š¼àÇøåeŸÔ¼7ï5ýµÝ®©gÁU€†»;ì"s”˜Glå¤Pê¢Þ)EÆ2ý2ù‚På9¾Û@+»•2/„ÎfÎ–ß ‡´©à¥´' ~ÁŒ“‘“zòú Iñ`Ó#ó d¿w<•;’ÌÑxŒ\:T/=ô†’[À*ùðIÉÍ—É“vt–;çä ÷€¸ Ð48bºÜø'sVYúžQ¿²Q²1ÁDz ¸™÷NrOÛ;¾.Q(’à3LüL¬œÂQÍæ_mýËòñ5YÕ%>‘­‚")„Üg# FâhrÒǶîiÚ|ÓûžÍd'?´'¼Vâ`_w¬¸›q‚ãŽ_E²¨¢kåíS+îI¤ÎI"„ʽ4|8W£'¦½¢ k¶Á(ÛæEg3I£L41ãŸU¿lûN¬òaØ_ýét¦Ž~°åÂ*Y”ú›™C/ÍpWEmòݱ¶'™Îf‹ ¹#sÖŸ~á‹Í>Þ?ñæö ºÆwe¤ÞsÚìWwe±ð¦‹÷p¶Ú³µ>:wÜž&Õ¤ò¿ƒÖ:ƒºu[ÂÙÚÑE×Ðt;ÃÙºdjj}¸U^:ð.;£Ú&¶ Þpk‹ÿHýˆBðùÄ}ÇnmÁŽ÷ ÖŸQõ ÓR9\'B—cwªf8]‰#¹k¥æ ~´¾e²¡¢¥çmk=[^>Z7¼eð‚ƒ6Œ¼²œ“¾¡p¨útTñ Ÿ¼÷:ḛ́!‡ŠïéG‹ÞÃaf3çÆÌΫ„Ø5EiEEe™^>6¶öðÛxïvÌ®yØÞ¬p¶°Ö9CiÞ¬tÖ?s€¶ªÈ-€£\’Àêà ÞrÒöÙÖ~ hy2ø · Ü ÄÈ*ó¥E.‚X1!Â.“,…Ž¿)¤T°%§FGJ}ÿ«^9¸ò} €Kÿßê•bÿ¥^ilLçÊhA÷¯ÐÆÐÖÈØˆÎZßÁÑLßÊêŸqtVVŠNΆNÿ.c§XÚa/£úÍn`¯'¨$Ш7¤" dN‡4ð»%C*&¢àl­ÜF7¬16 49ع§âïYLvÎ-¤ˆ¹Ñ6å‹q-âÓ/â_Kû61}ÍÏ‘zMœ‹çbr`âóýÕ*>ž~h øÕK©ØZ´òüKå+>‘Ÿî‰Î•q„d³F¢^oºL «‚Öê3ÉïÖ™»Nrxꇗ{"êø@¼¡±pP©ôõ‹Òi–³·‡ýLg°y ;Hió:¼˜e=`œÒ~Qv@ä=aØß‰,ì ¿—÷˜é™×@JÀ2÷`{LÍôúÓ±|ärªûÑxÀg–÷¸Ùué@±¬H­íòÁÐû]`iCèÌë€+°¤ÊÁz|œÖt\oµ].´IVï¡Ñõp”  L©†‡Ea¢£1p±øY ¢¬†è×Ãâ‰G&EaÒ£1X°[ï¾\X Þ¬†`êì©wÑûD¥A±°­†‚êìbYXs ¡²!'¤îWÑpPqVÓm ~ƒí1&aââ–ŸY`™fÔ‚píO²/€1}ƒMÓ!9[ëÙ¼èõqo 8‚W¨Ëólµg=_áÁ¤âÁd"›Ã/˜p\ Œü²Ä3’á9õ7¹p‡w(ѹ#°½ ÆC‘ö^ DT¤ó ·¸ …(á=_šÄ‹J÷l(õ”cx†„‘Ñ~Õ+@eqÓòƒT`1—–ÃST9O+ˆNËS¤'Íd0Õw˜-£’6ÐZ4ëÆ>VƸ±2슴ã¨ê£µ»çß§¶ƒ¨ñÛÜ—d‡iü%†ßrìf¢D•)S‡‰:N)Ÿ^f%œ`ÀD•LÈZh€iÂD•Êœ)ßo´%)jÈD•“)¿~´UÚg¢ÄIl%:Ì4a¢Ä+ÂZDU™<‡‘)˜¼5Q6`¢$~h%Z|$&1\dè”j(ú©Ð0 à ¦K0ŒvZdÜ„½x†m+f-)‘§öhÖØçRö¦¡Ÿ È=…7’Œ'€x¤©§¾F Œ‰"ðR Ã4“†£Ü?"°„gYD \;Ì¿r¨Œ$2²‚@Åàðé<¥ ÀˆPå)`.!€¶‡M8FP¹–ÔŽhÛ± €ÍD•Åß®kJBjrä‡r´i×ü‹˜ñ¬©0ˆƒ£åà@È z‹´|W=&œ`W$s‰ÿÌ'Ñ<–ŽÑK ]ªBŠ!.±®:‚€O0s’`Ig̘šR‡ø<$®³˜`UI…¸Tß]àF,‰¿¬q jEŸ›³^/% I¿·J”‘hŒØìÑ ‚EÕÁ 7Å ‡„:€›Ô>Ÿx<‚@¶pšéï¼›ã÷T:aìadh— q—ú2*U8ܹõ¶  øØ$ˆGa(G¢m` È:"™«ó5&e“ÚÍè‚xA9B{×LDˆ)˜Ö„$Ð|Ót„°IöCŽk-&Øí‡#¤ #ðåÏä#ó›ëücx+Á/*Ç'!`3úMˆ‰(°#éŠÌÖ€ã‹ïCˆ‰*ðý ô°… r¬ â½éÝÂ{9îppMEà› ´]qç ’hlwþÿï Ý#{¡3MpŠH>¡à·¨)à ~3}ÉýæØp9zà?lqŒ¤AÞcQŽÝäÀɺBYoÿv’“rø@tºâý øT…z0| ‡ùzù±þHäÓi8|*zA " QŽÞ¥Áx±âÿ½œ…ÃG Š‘6À‹ Ô]ޑ֏î7¦4@ú¬¤))¨»$#a€I&€Â!Ÿ!«¬/Ø?:d”yš õßtHüC‡ÿíCÕ©Úv$ʨ£²äÙ& ñï’«Æ žö£°ÔeþÊdþCm}&i"Å® dÈäLö F¨¨¨¨q²"""džèhÅ ˆ¨¿¤*½æ¨ð›&À«þÎ=dm¶zzØìžÓ”yÞneyÎÞf}ôž¾|_øÎö‚xî/£X…Ž&ÖÁæä€°—»'d”–qˆL/.}úeà+<°вðœ¨[䞌.qËNË–¹ûg —»‡gä*<2²ðžœÞE껉ø1T6Î]3kPC®Vª›7«Píl%Q2§Y;_£vò¯7ªµvT&[Ï*4*ð§+ëaøNµš‹ÿöG|¨Û¸™ÃGïú²pé®·a!þ¸§´—n´ž/ÀŒmXÙáÞhºwÞ,Ú°a³® F–Ê™¼¸§ýj¿¨î¹ÈkŽáke‚×L®~6)fš Qn¥¾Š=3IziîxÙ[Gãɘ¶)TOÿGÕÖ ÖþjÑÆÝbÒ~/°Ÿ …­RªùVT(£b~ö×ÜøÞ´Ìó¨„Ô=dÊmÝíŽý[ûÎ`Ï: |¶HC t¨“Y\q’FŒ÷~E¡±s 5½]Ñ…µw{÷ñì;¡[ÊN.5+ƒj¦ó7®m­jÖ´Jñ¥RGKàuFóòz™ªU§Ãà‘F0¬æóKCwã{¥J£„K²²Âêp´Ja§®¿€ájÐsñžW¡1þ–Ÿ…+œ&·ïuDzVç_›"_¾±”Ï{‘ +E9ŽCì&ybàj%P}•¶.ÿÃY‘N?cš{DY!G/'L_À£tÞ»h×á”·±­}µœ_P/¥Î\:[A¹ñëÚm© Ò·ÕlY’뫤ƒ°µÈ:±¿E:Dí$á·­(‹É8Å1¦û0|uÝgqÖ\’ÅTü:Eìjg¶Y¨³ýälùˆ EÊÞ…˜Á¹²4ž”ÕÈfÈçãDз)Ð×oAðÃUò¦*ÐÓ=Ù ÑètÖ¬a9yÑÅbª4åèb¹Œ®…À”e™$ %¡´®„Û½úÑr+ï{Α&÷P4¥Ÿ†\ÍúoSœ~‡­8Ì…ŸºüU¢Sá’IïŒÛn"ÃßK-VâÒãÞ-­ |£‚»-߉Έ È÷±?`µJÒ» ·BÌ(>y+riýZ¦£7j¾D­ìu—R²oP¡ ƒµê¾Ÿ¥ Ix6«©x³¿Šòw˜2nùDn §Ù”û¢Í¹ÿ*’lÅUÛ­ø7«NyÈÏ·ßœôÁW*§“Á7Ê.å“~ŸßïQè™pA®YŒÒó{qš&6.gόɼKž$CXÚPuØ.fv` ;²¬âþÌ}+Ø S3;Ú¬RÀNfzýV°ÓAM–5`TØ0O–´ hæ51Ë]8t ;Ä.¡@×Næ´côAR¬«PWË;¼6¥@*iK¹Â&»t e¶ïiðeäIT±Õ+ô™º·ë·Ø0H9JfœrÜKþèªQzõØø¼@cž‘I˜ôg –K»ëªÝÑ×Q˜:¼Ä>)àËÒ·ž4ØCAµX}ž’àg–ü=žð ¹³ ºìA]t½Z=>#^è‰Ev ¿WƒÌ¼¹üÚSû"wÑ;^ö0k»àÖ~~80uƒ›|Ø©mZ˜´ÓNz³;–ÉŠH®T$Ziïµ`}G¯¡`DG¢sÁ…_ÑqŒRÐ…%9.LÏQÐæŠ³q ÏYÐêŠøŽ„¦îè#ÒÝ{‚;K‘´(ÒÝG‚óK“´IÒÞ[Á å²mô6ÐÈ%=Ó ÝèÓXxxzJÒjH‹ÉýA¨ôÚœdVä%—8Òs6Ò«:ÒË"i%Rôò‹¿$1Nq´¢;qú¹Õ0~ LôpMqÛb•ï(ÙAZû€¼á·Í$Ö=`]G¢î¬æÃH ëÃMü¢ÅY­„ä×Êõˆ‘fé±ã½D×Â@’Œˆæ(°ãØY‰0‹×Â’ô‰R¢Å¥9X‰8¢ë!©fEIʰãË"¬„¨þ6TN‰’TÛ³ÙËÔ!ŽOF¦‚´Àv!=ŒW"]bb°£âˆÈèP'¯J—´ºñi(V I«°×²àëq%ñTlCæØ€ÆY@ŽåA8t£!ÖÄûÃDL¶Äæ/’®|\@)C5 ´># d´™ð€ ‰ÆÔf½ŽÍI A=¼É0Ž5eÒ»À¢ t´™05ý&X=´Ž0!!41’‚r@¹hˆ"ŽÃ¶Ÿ&7à?«ˆ?4æî¢«+‹Ï,"Àñ ˜«ƒp`ªi' ²áäÐ 1:’Õoþ+Rƒ,¯£~rÙÄq°oe$Ä”òÄðâœj¤Xáð¶C~r餣ÚIŽ(FJ îjP06qþQ±{·#~Wû1­wÓáfjøÉ^0¼´È•dY},ä†ügñ„£lÝE"qŠ q²•”€‘ji}Ñ€éG¹´l»QY(G‹­dÄ]~–:Q€ë£»³}¦¤êˆGÆ”cÓj¸$ÿ„¨Z0ÝwGo*oY $äŸ PØ^:ÿ¸™O´¥2° >ÆÑô›< (æß&jÐvÜÉ$·æÝÂ{7”—.àSêÔ=|6’ÀwˆÅ70ý€ô›öS8*௻ñI Üø{€"ѵÔ2<9‹Åü]9cƒRFø&xaöÿ޲ü„æÇJ9|x)) |S‚¾cyiƒý[~ãÿÅäÑ›€H1âŸBœí€c\ÄVÍ»íßt4C‹  ¾é€ßSpŒ´ä•0B ø-pŽ6â „¡p9Æ‚ Å9ÁŽÀÝAr‡)ÂhŽŠvo'ù‹ÂŠ1þ¸Ârø$U»_ýü£Y+G©÷5Kç¿i–èÿ@³Dlœ­ÝŒÿ#YÊ2šØÊS®}±A8h^8h_mѤí_jp¹j/ý‘îæ:òv£‘¼^³]jÊu'Bè+Çu†|©B x¶m§Bt'ÅÆÚ’yÖªlÔ!~aÐn×Ï=ÄsÍ]Õ·ÃéX°‹@BÌTiÔh):u {¼¼¼> |1íë†þ/Ž^ŠS–Ç’ÆI6—±’\˜ÓôM·›Ý¿Œ"2GJRV¥Ži¶™‹sS(”îoi ;RhF†¥kâm ÜïíqI6´úÛÇK£:rXÍ!iÑ™:Ò—¤8Ú]£ð,©UM2Õ ¡´ûp¡ocl%‡» %èï/ý®¤¸'0¸Tb”(ß<Õ §©Ž¡ÔýÊ$kËÑ4–Ù¿4*ÀfOŒI VUêU¾½(¶&fuŸ¦• µ˜]£MJ;Ï­‰ e¨ßˆ0vUœ…_Bf<‚Ö+;Óvx£‡9H"hº»”Q£·èæépeÌóŠzš Š“Ðêù«[íÓ¥†7Ó”ü"©h÷aQ‘Ûjö¨Q_ïù‡B”£ôÔôΊî̱Է³hŒ©Ý õ–Eäït¡·þôf=*D‹&BAÜ‹7Öce“C¥‚ø(SÔ”c ¶Ed¾‰ç…o“Q¿t^ÚœHï=¤Û¬üÚf¼¨†€ÙÀk/@€åÙµÃcN ·/èJ¤Y²Ì7¥FÝVw/¬iIèMöt}4Dõñýó^l*51ž,K5á¸Ý5Þ Úî[©ïìyaõ½æΠåÑ5¸ÍÓvú$GH”êh‰3ÈnæhxˆÎ%fgŸG„§eàÕÇ>Ðô¤|ˆXß8¹ì§­+þœE•Ñ ¾AÔ;ð\•Ó°Í*zÍl±Ü/A µ(Æ·÷kVôe~æ.’OhßÂ_Ò»ô ·?“SxÿyË{ T‹\†m.\b ƒH{¶Y‡ˆå›»©k²B~(«‚Ï.%ZFœW§ït ÷Ž.ö;ºe¾[\އo”*F¼®±ÅÐ0쇣„>oÈî1(>O:¨aŒ5K-‹ è•ãƒ7v/È« .WQI¦eÎ9¨&éè aülÝÒÀ¥8ó¯ý ¿§9yDq4¸QºÝ¹fYÆèZ‡½rÞ³ð+~Þqú)Àiúöÿ ÛÎ4Ê/ˆè!á>pzy‘õê A±Š{Tøû÷ÿáÁ‚ám|¸æ26Éê ,ýàí{?‘rîô˜?/†kü] Hï¤CµòŠsCü¦¸- g¿Ï±qýlèY=FN€¥{÷;‚MÚr‹–ëÿBÕ4ùÂÒ‚D@ü7BIü %llhn­ÿŸ ¾Õ*Û*ȪÛ‰‰AáüÂA–ÍJ†˜A’ G¥a*ÑË1ãud2dKègBM³}  ÐÍUÅ×2tä´·M! a\©Ìpìºöìv÷rDúþ|<òø¦j X!`1â4ÌÅØÖS >éIäà•¹a"4>Üp¡Æ©ÁéƒJr§ˆB/Ø+Óʽ)‰pÙLU¸‘ßG:¸ZûÈÝ+\¦è+ä ÃNÎ=†d/Þf¬›Ç3<†°Ôìal±±¢:)YSµ˜Ÿ+Ý1~.´ãj´H™V(4×E ªÔ^Í+Õ˵DtkÈs’Zþ®À.ò‘¤2«,7AcîÒ©Aqê¬Ú,˜rtSܘ:<ã#es:UCY欤Kv 1–àò.‘ÇožW‰åÖG“öTÐ]ê<^«H¡I„Í­W¯ _ˆ¨7\×c0T«Oj¨´ªw4I7©Þ1»b欕î²|9hBš);Ÿ›ÊŒZk’9¨=@5NïóäôH¨j”¼¢ƒÌô[Öh¸Á"+ì&‰z+Ðjjnœl†¯UÆ ‘ùTcøeàEè±@ôi‰=::Ûm„ÊQ˜Uùp;rRž6¦v#'Ð"49,II|“ž05ò̈–AÚò #•Å+€ËF_z8#f…Ek¶•¡œ0ª•ÞVÈRÍUr]RåŠ D‡:¸Õl°<ÿÈÎÂJÏŒ„¥‚Hs1 Ž –Œ…—AÖÕNU`u[L-k¶cÓÌx•ö«áröI(kù°ro"<&ÕzíÙUËå×TÁ¥àCp¼m<¾§²ø„I°½­;ýu7úáwUVÏ¥NáñÎ:wšŒ¡Ê«Š}òì )ï:àÛ÷Jq7|îCÊçã•PÚƒ)¬ø±ÏhlÀùŽi,§' ’¾ Op®¿í'€$÷=—WçÝèë<’o¨ _Îç‰p÷8‹ Ÿž_å F`›xMo^IéÅ,6¦vŽQ7Ô;‚ Úv¼ÿÊ›æ›Ëá&Îq²h%V›~€CœiöjûdçíÆÙÌÁ’nžÂÚºHž<â‡0½·ß\¨Gž(ÈÄ¢êÙ;a\",æ!m×àg³ÓÀeTG»ï í¦”„ÒNþvho Ù·€¥9äía–¦$÷‚<2÷D›(ž?e Ã4£‰^£4—Ùéø0ФºUãpgåÖ Ñ•Ô@>3Jé[¿ËyV\ÙMa#æZ(¬5˜–ž7ˆÁ–õ͘/¾¶/ÁÂÕÏÚ`¯Ê8ˆ¯Wä–¤ŠVš²¯ÐGr`c6ÁïìRFçN¼wœSXñÀ „³ÓRé¹Õ·‘òhøp×ÚÓÖL ïcyK¿0ÙÎïqè-^a¶öö:ðŸ¿oYü íMþ*‡+ûiÙ¹öÞ^!O“r0¯ÄX¬€yZ¥O’|Ž! {?aïø&fiç¿JX®Sù 3Èÿ_U­ÁÌÖÙÀêÿ ×µÂ_áòùÔ@¨Ž%îï#-՜ 9€FEâ–BU-‹¯±IZE8E9æ ¬hhÛÇ7öW¸ÒU~Þ+ï¡pr׃Hr·¥gÖ_ynO³_n}u»Á裢éiõKp§&ö}Òµ@r÷)g&õúéÓâ/B¡x¡÷éÑêQˆAuƒETà\Õá¨Ü•û50xÒ {ÞÁgˆSúÃådîŠù7clT`ã!8n¡ÿ´ð;ùHíÎ7WhÓ³P-M ›:«åNP)[u™ZÖÜL„ñ×Ù$¤Ïª‹T+И»ˆ4FCÒ|©»s•b†¼l¥œt¥8¬„Ôç£>;+²É˜—ʤV G)k³E;ñäÀpëP ^uù “¥3‹Èªçq—¡­F?gÓÕ»S—fªwkÅ5T¬eCmNb?'|…“|Xÿ”X¡jOÿîÍ.\œuiÑ&‡ê)øÕøkýX’®.¡ Ðò¢¸KE±dWagí|̪Éjíj«åÔ‰<¡úŠÈXhW™*¥Ý›Gk—ÑÁE£ßIßKsY&`=‘Ý:^ËPÐÒû҈憨rm‰:“å ìõcñ8jK§¡â8‹A1®J$¶;a^Ik4)bòLÑô¶¬-šT·Ò- ”ª&_Wç H5Vq6½$~uzÜ¡GƒYÒ%•sôæËw ”<4ÔÆ ”õð- w‹»]ððpÃ⻡<(B¦|ÎNh„ ´#~×Ûà$klÆD´&ëÂi|źp¾¤Ïx´@¯¶hs.2ç9¹4‹ÙJÓµ ´•fÍf¸žîU³kùÄì/®ºPïikˤº²î$*²¥"­{úšyãt{>ìb<ñÞ‰ŒoGio¦®!ÄíÌ㋚€ø|ûÞ—…/þØÞ]ærò<#Yûüú9–°š‡ÇØ{ã5„a\D ÍK½|*mÙmçåz¾?IºjWgÞ€˜±.×ÝÿhGd<£ͦ·˜îƒ]¤U/Mvò™HbñÂèõuƒ ®õü‹1¾…È_jê5¾5fÞCóíÃÈoXȱ²GŸÐÿ^Š¢¿•ñÚ;ùÊiœâ¢Bt¯ƒ÷%`ä»Cß{Q`xÀå[’žY F3Ö þ¬‘ÎN<àÉ ‘þ؉Y’N*鈇#¦¾@q Çè)!k/ˆg>φGØA%Ï#| Øñ’Q§}ç„í\ÿ<ÿ.Ô:Š˜š†@ûÓ8ý‰÷w©KG1Í7Û¨9—1©°Û—Æ}º³ŽK õKœê3ÈÏ·ñ'ªñºásƒùYÄ;ºz)´ómm]’ûÛ&Ǿõ~m|~®{SéÃPöšÍ$ Dº=¾$ö ??4é¹Çï"~Ù&‹k(b%(2&oÌ‘€;X÷ð]ꆤ|š=¼ôßÄZÙ¯æþK¬Îÿª_ÿ“m ÿKÔÊVßéÿK[[Ç ÒJ<¥¶inAÃ2˜F‰ BE%X0_ɲ3ˆ%¨qÜ ¡_ÇãPönàЖGÕŠ£t›îS/wýï±½q|üjŠëvô‘wvê$÷?¼BøË+Hý© BÌzôí©ÉãR‡7éAA)ñÇ‚O-ø}G/Ä¡„cz¢PÌb•ã—ŒpB'=²»pþ U EE¿gÿíEZ "J„§“È“þË–vK,6Clfi³Øîm}ÿsrU»é¬N (e.b hãÔóà¤D¨á¬}4˜U*»-ÖÜW…cÌÝX+ìæTÖjbËhÍk)>CVÕ)2ëQ'ò‰s£qiÚÃ4áÄzeÞL ‡•n—Á‰Ú4lVšxPrãJ^âÕ »VFP—Ô–‰°¯yŒMë?¬·FɤãC¶ Žf/æöLEâƒB5ÆñÆl¹ãÅ +¤ÖL©¬’#á­Š¬¬ ›Sš´.Ù_ój<½v;Œl©U†·Í¿_ÙZª“¸ò÷©'ô¼U™­Öy. }L ?˜Ñš%P4Mô+I°×sKõ©•ÍóÊòKÓdÕÇ£–ªŠ¶â¤KyHœ´F¸8kò4G)lÌß4F‰½ Á»9ÿÌQÏ9*¸ï´T7™“?œ¬L´£ª;q ûý˜dwÁÂÁoËá¼#A¶©3<„å<q‚Ùi„8m]“§^Óš?ØèiÒ„©Î:µ^eÔ(›ËìEœÆÛ+A ¶LY-û<–kÊœ¸FLq©ˆÍp­&.禈Uõî¨xþ±‹®-”òd ?ö×çí´K¶ôwåxÝZ]­XÑþTp­õd%$/ýÐâñËÕé~Cîzu}ƒÛ‹Å'Bð ã[ñynæŧBês>Á0*&2;ÿ5L|cœÚ8©ãM¸¬¨ c Ë<äxëNj\hŠó²pF ž,ІQ ã3PºuÉÇO<èéã½ølF.eýƒÑÿLÌÜ]ntkĺ‡þG÷Á°Àö{€¬¢â™š ö¨iKo[?ª¬ƒïR;9ªKx,”Qã øã>Ì'ì$WŠÿ >å¡. ïPÑLèº-Ð1M^ý"‘$‰ƒ•Swø‚pû¨1½?Jô÷ÿ©í, âZ¶u[p îînÁÝ  ¸»»»KãNpw‡ÁÝ!8$HàAò ûÜs gß}e߃1ºþÿ®ªµfϪ5ë[{e¸…V5³úuR*ÑN!—÷XVè¥-–ÊË?ú“¿Û C£ämÆðÙT°ySñ­ûôÝlȨøàQ5´@>^cŽ­í1@Ëš¡^ƒÿÔ"õ~… ¤rsÔ":;WJ±S“o%½®@Xù©„¹+:ÝêqûÊ¬Š¯¤ OžÓ•(›IÆÊgUßA®f ýŸ¸¯Ù& œ~bgôck3™µo‘ßJÿ:é2F¹skÍôOà§H…˜z}Çú©²ÿ2R‰üÍH%aõÏ8õþÖã$ €aM’Z”o_ 1CÙ÷êµ¹žŠº´º„¸IZq&Q™nU·ÎÙlû¹XÝ[Ï=)¼2Óúbó‹Ó©à‡¢Å#XP̘F£jޤ#¤ûOø»³#ëO âüú°»Z`UdAŽ|pØÀË}¸Õ£!k Ðø?Ö„Ô“k‘Ù<›öúy<6»û‘î0øea±‰.Û1ðB6Z‚½`‰‚¨ íÇî/vw‹Ä`ynKf¿ÂÒt­MûŽ×ÍßsX*ÙMcƒ©;¥¸ÇÒ9‘T±ë¨øyÔƒy†7Åð¸AC¥¶W]¹˜Ý¡·Œš¬rZUþ¦»H ý·Ò…0=Ú =Ëà# åÏEG%©dwñŽmò£;F% Òšt{†ö(ƒÂg,ù”Òü4{wV¹-£‘·ßDuT”ê[Íâ{WÙÜFVì2ܨO^k9“HŽ^zéΔ4F"‚èy¸0i7N Ń_ G朦Ø# ‚Œ!ËO-IŠ/`¼x1^˜ÿÎJaܨ\ù^dq”^ÇÆÑ8|Î|‘÷È¡¥QsM„™t %ÖÇ{AŽ5Ç–Ãn•XþpÑéÍë[€Ü~ÉÅJAû·#s "@üƒF¹.ê¨é’Ìh ÓjŸ 憋(”õPr¿_À[C ~&2J≠ÐwhÌ©}R% fñXÊi–ŒÜŠAØ?ãÌõÌÝØ9’ZÛ’â›#®”¬±Ñ1ƒplâ’š±šÉˆ£(1§“cªýŠ?\´"ò̦aï“D¯ 5Ú˜:™ÃçjÔ ‰«U¨àn{¯2ž´ÏeµÒ19!5¤¥Æ6©Ïµ¬ø[úg4¿ۅ4‰ð iµv-ÿ@¢¼%¯‘ÍÓý¾Îi ù òÍeî9á í§*Ö«.âÒhg“+(«Sºþ¨N½OŽPÎûP™óRçM'ÇäÔR}½¾¨':avÒŠù˜ÂƒLSb#Ct**žd3µ¥³x;¡÷°sgN’•†Òª¦›þ¢¨É„ôHwF¶¯y’ºú½|„Ký…Ä2l@´×0Ú¼ëì£åèt|MÔ…ùbÁÌCuòqê»Øb`à~©ÖvdËòU¡x@ù2=êŠGÞ• $†ìêÐ/yíÕ…°)ð³ZØ­³“¿È3ZPµïöuGÂ%zÃ-|æÁ-:ýg}Èó¬Œé`ì@àQ¨–kiý˜ÀÿüùHšŒ0`-2u;ÝóËíÒmz‚÷ÏÛ{ !}Žà] –‘C¶>à m}­X½n?n¥Š Š‚ü}l´hbÕ]èWHÜ1’öS6jtoIo¤Eè‚´¤K]èv­ó£Ñí\)ÛO$nƒt•ýÚoXõ»'¤‚ÞÏ¥ª-¡¯EP…¸À D8‚k²f”˜«¿ÁDíÓvÊ™c<ðó–éfÚ÷ÓÚÈ­Ñ´…[Ò¬<¬q$þì<Åaˆæ0£¦xvc'Q©d¹R¾SQd£É¼úfÏUê>x?õ÷ÀÃU¹ŒÉ½P…Fêû®¢S½ƒœ¨X÷Y²iÚa“Ÿ¯Í`±!¸%Ê9ù+6Ëj9Úr(ãAÕꚪtö2ÃnFÒæ¥å5Bpyúj¾”7ðã;Ø…§Ÿµð’º ÑpÓÜÒÐ÷*$î”[ÉhõçtÇI£Ùöò@‚q×5fßCn›8¼éRõ¤¡24ª£âÑPCquV ì,=* ‰'‰6ËËdÖq5<8¾¾4’g¡êUç뜡ÁÔwþÌ40¯×ü}³×S‘­öcq¬ùTF*«GÈo8\£ÍûÞ° nV>48g† ÂPj:\sµUç Áz‹ÆI8kTét ©VÆnb¡…5$2¥"öJó‰NC(58gÛ·ãm„«†‡p©ÜjæòÝYeŠÍy2’ò"ª&›¼1‘9‘\qðm¸Úý´ªo]¬ƒÁ«È zm’ŸA~`Oœdñ¿²Û¢ƒ„¸9ïq4À¾»¥Ù ¶÷("†¤üJIé{ Ä[¯¹ÍÀ±û6u‡nÊ?óÁlz‰“n5óü’b‘¤«nàÄPîópŽï°õ. Iö(‡öï@—û¾÷Ì-ÁÜÏ©ƒµâ§F¿Úåf»f—ñâG§$gÊ×ü×òÑ‹ÓGˆ‹fMûÇÉìÜìê2Î( þ´¦­CšCSK;YœqŠÞ~’zæØ1F¢æø“ËxzÞlDç“Ä6i ž¾xÈ]Œ ¬«¨ŒÝ\#•‘éØ<~i^ûøÍç¢$TG“˜]Ú[Ì?³xjd{œm‡Þ’fì” ›jèáûB0²Ø`MÃruËŽÕ ÛK·C# ÑÙE×ê@ϧäiã-QÃÿ"숾RÞÁkFżŠM„˜ëe yùqç.Tå–øòBºïúü”YíT÷ûøÜ1ü˜QÇàªKJqÜx!‡5?ü;–6³€ö:5=;/Ig}æªÅà…#ïîÒ+z:cü¶ýÑÜ€«É$©ž+'ÈûÕæa.„}¡aË\oüý¬\QXaa-ˆ|Ó WÊ8îÂù¯°ÁwTùŠZzW?!±5ög'ec˜É_.cýÝ«†ÒÖVÆÿʵ°•1Vâ^¡ÄB'ÙìÖ ˜w’@f#2¨J™štNPÍÈM,ÂëÂêÊ%KWYÿXç;î}Ö¶¡Íƒ±TGx pü0H`O+Kgþâܾ·ú%åî~|ï P„þp4µª‰s¯Ýø¸!£©IOj¢áòUw0x¶Á†>>ï‰>x)/wüI1~Æ@ˆ¡üuEè·­¤ê51ü×­_r~ ‰a±ÿTácâûº2F' ûµöCR½&tÆ.®å[Ej•U¹bqIÀ‡ù d¿3‘Z Ó‚„â–7ä¶Ð–¬qK»ÕY‰Ôf ÊRôö+“™ Nµ%¥ÚýÎJ·“#¯Ïi볆–Ru¡¸X U`vsR¤fsB«j]™­W⿆҈0/oí’›¤ý¸—ÔU¤ç™aƒ3ÜÕSafR§¤7Û­n83dKš6ÿH,ï´ô`X¬jÃB á…Bz«8^ó£"œŸ‰·Æ®L=¿5%ª$ÀÊÂ\¨’0ÈËêÀK—F³ûúcCXýy[Œ õG~‰¹•s»Éùé´H<‹Ã5jÊ F‰‰O%&¾ûáé!V º¶öÛ´c„¥ó³CKÊS!÷DhµjÝkñ0 ßµiU$Õ< é1^ͺa£U£¶†»‚¿CRaðiD%a ÝxþöX©Ó– £++À¼0NhÜ´OƒòåN2¹ˆo tãýV©Þ‡dñž~²‚rkä¸iý2ªR×øâ;œÞ©€ [õì"¬p ŒÎ"4}+]YÁ«ÝÞb3ûKóŸ#Š|íW*ÔSóçÞ'Ø|n@ÇEG®0 :ûš‚-KäDÁµâ·òÚ£Qo!…}ÆŒ[=Å™xukoF[ÑÒºåý5æ¶W¨±.@ÿq¦è{Êwj8”ºd5°º´†ôuŠHriù]¿ ú©ë™µËŠêíBòV>ÃÈO†n¼$?ßøîÛƒ¬{¢6“¹þÆñÁœ)ÑõÃÈ{¹·Ë»eø\%¸t†?GuèíBiJXÜœÈõ£B[„›Šò¼¾Ö÷Ÿær¯˜±D¾"ß&“¡2ÓÐ,,|íÒùXm·2:àÈœ—EV%|¨¯5¯A}ϵáñ{‡üø”^…¾1 gª8ùþ…`k"ri§—)…Èù•´}-ÛWŽÁX²fÈÁ ÔlVX\Ï…bFµ#ÿ6ô›9ð’þ7‚W( Ãp+Noæ[vîÚ§õ— ûĆ„è'§÷?M}=²¿3'½Ùˆt‚Y´Q…AøÚa?6öÀ°¦§›Ãѳ-æ²|{q{9oH YTÉÎX­€Á~’Í#Ùú ›©Vx2±Ð=ññ‹ÒíFТ¬4>t²3Qþ¾/ÄÛ ±¡Úž~nôt8S¯ê”‡ÂÝ XQ½2®è»¸ó/£28.~]NTó2K{ ]ÿ_׳M¬ížW< zY#'`µM³'Âêã$("òNIç%o¨`ÊI¡"g #¹ã`eÉæ5?žˆí e¤Ñ¨T]ñøØèîä×ÝÉ…0œbÜ8¯–íWÏÚ¯dn®¿ÃêòøÑ°†©qŽˆpŒˆÙ"¼šº‡Ç§V ˆÀÜÕR°á‹€Dòð Ö¥¡›Cã®ý0¤«lUIé‚*i”g," š¥+Æ>ä#þ*`å"¶v¢¥)ÿhG}a0 dHÑÙY<Ëu‘*§m§LRìxg¼d©˜àøN<ë„ÃÅÑ­N¡¹ˆ“t”Q§ñÜøÒI…ö m&q‹.\ͼ{~¦EsqFF±Ï´¶×ްÍta¬Ç¶=îFoµ™1¬¥4½ÀU®k=òö[W‹nåÎOµuiZiKFRÃ6,gÚ òí&Ú>H§‹_$»§á{ðqæþk0{ƒKµÙy§S©Nã:Ø:ýípNßz—@Eú­º0ûõÑøÈ ™6ËnÝ/QŽ?=¸åéḛ́ôÕÈ×Œàæ²ítþHŒq$CõÅŒ¨n‘ âZ7&F¶`3)·Îè[·Dî-ÐZ,½DßIIÍ,q›_¤ZRÓ§£g5/fc§ˆ+n ¢D[i*ZG^U`Œ@×.r‰ §r³UÁ¯€9ÏTÒb!.LStªÐ`“U~öö$¿cæ§Q†ì²ddT%AûU'vÏPø.±ZäõœòùFA0lIS$ÈyôÞ ­¶Î{ZG¤ñóx'‡þ"6’‰ ÑMÚ#(GÖs?ëO73¥d_– ·pK‰õpÕöB1GÃÛVi‹ÐWUÜ·mµsè¼.±9vh1-v‡¢–¾Íð_™œ=.Ñ•–"÷ì·ÉHš#šöü"@Zb!¥>TëØágoš³€U_Æ¥‘Ž1öÙg.Dkt Ÿ;¨Œï%•Z5¶¾»*³ÌA`ÅòפÖL:Â7›ÎHú$‰¾Æ0ˆç¾ ¨]Þ["ŽÖ¾†y÷Ñ]®$±Æ=Äf HÆ[ÉÞ™ A0UtÒ± ‹\¥]Ý/Ë›ÐmÕð3a^kÉ»ÄH8)^-bäŽ!t—?#ƒV ¤WÄΜÑpU‡«å!Eézú LFPÖmÐé1OâdÔŽ‚ã‡w8„Û3·‹ ¤ÞÎoا— ¾VG˜LIÇ˲Ä?øÈ:BwÓby‘ ˆf¬ì'—Jöë÷êm^<n?Ó=ºc̲}¸àáÇŒ.Ï|ø„xŸÉ¾mÈ÷´œ…è%LáBäñê´T®JtŠ™­äª2îº| ñ(!åüGTÆ¡;þ¶ùã,ÿ<9‰Y· Uº–äë"á›"Õmj0¤ÑºOÀt­‚¹æÜ|vp"¼ k «ýïѶAÅ'Üçh¹ïÅ©zd3[æÇ8•ø—qêï^)Tt°3ýW’eþ[Õ‹zŸÌBPb¸Ýdéf#\U ôæƒAØ~¨ä‘—&ˆùâN°‘íg Žâáí{˽ޭOçEµ!R(¨ù†vøPºl$ÒÇ Í³ôYyª·¤Úr'Q÷ݹá8ëÁP˜ˆ/CÉ9ûv¦én^ÖèÌpÁŠ’},€†Ãi…Ùº³Æ`IA}ÉD/oß[£8½÷þê{Kÿw•Èw‡*jÆÒ?É´?÷NÑqa[UbZyNWÑXŽ/Eªû¨Ã ^¥6ì®Ä2$sªi9) –ñW»ØŒâ±™íh2ÎÒ +²•)w³6ïS믨‘ï£ÍRH“a÷½¿£ž+¾!3×-þùAå¬rÈb˜9Ô Óœä¬Ž¶&—î ªt»Õ“Ž™-³ªEßòÿƒIÛÐÐjDrL_»†J[8Ë¢Ût"®½Ï}_òÒD=kMYâ4‰z-NÝùaô¸«÷Y–™Þ3pfߨ‘¹² ­7„ÙsT®ƒ<¦H Ìqe tª>[µ^±¦l=$Òˆú3zµ×¥³¸SEŒK¯LäO8Û6WŸjË×y¤K&l•{eäXAöªÄYùìJ>N¶fF„1jsqxä ¦„“©^ÂFƒ³Š7ÐH÷;gOŒ9î“G¯H¹• ØV;Ðç}ÐÕŒP¹žL2ÿ)F7ùÞ.1“i•SÔå̯W$–´Uf*–Dû;@‘$úV^6*¹¸W/чQ–ÀÕ@B](¾Õé16ñ)†G¸´§Ž}'t}¨DT?õÎGË1Ì­û¼uKœyæ¼ )£r šÙºâƒ:ÓDn›¨;Ôuüœ0F½é×àÐ3!•eW£öƒì¤eèô;\d§«,ªøâ©`ñ;,Œœ¬Œ8X ¨tR7+Gƒ·Âð²·Í_ì¼¥˜é­SkO!<‘î ê“oAyš5i3,„&§Š½}E=Á`Àô£tF¦6ðH5ó2iåSo{”ªý‡Mñb["wo:$î.”myª }þñ1ÔsY¾`»òz‚¾âÀÛG‘O7ké§iˆ÷«AÇ;ŸcÊ®Y"7½‚ðà¦gàœô¸¹6Q3سÀÜ|BvÐÚøÉà`óÀ¬Õ8·Tyaú)wö7Ü2Ç 7¹LϤ1߆àéVÅËâé™àwëe ïÅåóÀâë9à·Éè CÁ|‚UèoÆ*”JÉvLÄJÏEqt:‚ÒqþùkØì(ÂcòûË $ù7‚Ì?ž(=>ùGJÞÕÆÁèÿ`#Gñͪô¢,D­Ìż¼°Ç/~B>tYÊÊÉ4ŠÍ¿~6LݼüêÂúº‹¯ƒo(º¶vÜÂ)º]çŒàa¼Õ8Îù±öçÝíÜ €ʱ9ˆ—TÇlËÁzjR¥²ä!•õær‹ã$î°&+¨ËÐ’6ë Å"v}ì¶ Ê1¤?ž¶a_ùB©S`'ØP|ùbj eùºO|N²HóŽø3l‹Ãö ›#‰q¤„{@†¹–ˆô¶k«É,]âPb®6*䎩hoú†š £ñ&†Zeûþ<ï0–Z«dßÎ’g“M¶gÊhjr"#S‘“Õ*•½C¾.ÛPÔ®ÒJUX¥èdæ¬>ì%Ì«²Ô6¹Ó„¾Éb·òÍdÅDýÔ*bhLóä‚›jØLžÈ[ä¹Ð¢%ªLmvŒA&,-J †ºüD¢ T¬hü†„9!õº’î$HùÙó²’’ºHKÕ:¨KàŠÃꈰí!Iûº¤ª8Å1§Àþ^òÐ*Ÿy½híʇÈüÇ õQ™LúL?Bv̓å½K«ßåR3™ô£ÅÐÂôìû,öͬü¬am‡ùg(Ìò%f.ƒÃ-îŽV“æVd^/tùzêq„ŠZMWþdÐ!X¬¢pv“Yl 5dÈ»¤ ƒÛá®@Ÿï*'ðÈ–ו–ï•ï¡#Ý2  ²ê$¢+™Ä7ÝKÔš,!]á)rp–ª¬êw €Ž“‰ ûœ¦2å´¸×ÔJ­v̵j}#ÿÍÖCüÀ–è¥0hLbbº•z»—¾ä:[‘?ã;£Ð‘‚œ9»|šžSùŠmH~yäoôƒ:u u^Êèbâj…&¨ØÁŸ‘g„Câ@c†¦áDKù»îY>…‰&+6鄯VIô¯yÍ…ßmÙ³r¾;2ª?L­/Q«-½;jù\d*³ÄFŸ?'sò™Öúæ "õgÖaÛ;W£¢®#îÖ‰=Ĭ¶9—“ÆÎ§ú@‚ƒ÷èÚì+QÇùߢæI0:ÊÀV¡ º&Ûå¶-ÕØðD•©D)BýA[ò1¦Ò%,Ób—¥PS/#-§ÑÖg(•õlª«1Vß[¾².«ùlùz»D¤²®KÇyJµ'äCã°Ö(|tºÇOkGÙoµÐI{ÊQÊåf¥=«L³Ã§¨úÖ¦C=jÂ`Ö¥¼ÐÑ“ïOFÌñb³ý …aéúÙèÚuO¯×Âj½Ö5N Gž¦!ôE&úÔ ÍÒ'Ä_„Ü8u ÌASwœŽ[;‘j­¾˜ŠÛî‚ÉuSAÔ.jð*Æš]ÏŠpíÀ"œJèâT‹y)f½Ì¹[+Wl_[q´\vÃO|Râï»±EShÖ連*㔌¦7‘qõ=!'ƒúÆÝb›î¸å¡ àT˜fv¢¯{6ææäºr‰w V/edóöÛøë€çYX§“q+ †Ÿ¥ëJÙ‡RÿŸom¦ÀÝ¡vƒð/é o³¢^ˆAP˜AH‚—ÝÀ‚ð]ËÀÁPÍ(‡D›V£•î_µý»–r¸³\!cÁü¶.!âcB,FV;T…€¼5$Á¨ÎÜœà~(Nàh;dY¤S0n‰ÅcÂñBÌÑ-Êd&8NÁÌÏwoà˜FºìF:1·XéǺÎÒýÏ6u}è:1tÖÓXQ­ÙVÕ©ʼnš³°ÄŒwõû­7-‰ìuûªêN‰õû¨õûe& Õ¬ŸVgjjK e†e%Îô4‡ÇÞ«;áÐrÒžVˆrGZt€ RÉ‘æA8 Òu‘ bUI ,Ãu¹´"à#žzôC&±žRjn27IlÛDèuÂôkÔ‚íA{ ìP7¯­Oq—‰6ݯ}øk…k>Ü\i{?}Ì`'ZЭÿå&ùÿ£EC;'Sýÿ(ŒK‚ Àö}ª3/œåƒ":Ÿ©Õ‚u»(ƒ¢‚¹ï3-ú8rŸbºb|öôZN¯!~Ê_ ð&6Z[¼Ý›÷ÆÚ¼ŽŽ8G†”W cÛû#mÒoIˆÌkwë“©Ó5ké{¶†KM64]øsh•Ã})#M«@o𦬠r—f‰’²% ÄJ u13–´ 64Ï”ÖKìÔH¹ïúàbm¦–ŒÆÆ­8ÚNÊÌë—g½FÕɽ/ßÁBdŠj{K€gwd–ø–ÖNb˜­t?Ð?u*ã{›½ÙÇ.³þ«N•þ*kj!ªkaoø*Rçi½,ŒØ÷¡Íþ–Nbº€ÕDŠÒ±BFK †˜®“ÅÔ!ÁŽÂ;OôK¯Œ‡“ã%Úµl+T19 É5E³ù¶›£ÇOB©\µÌ\Ÿ<îÇ?y?Àé -Á±â:zvÏ1ÕÌÇëJYØ”\7„Ã$L Ü1ÈË-Á(c  âM.ÊM†EçúZ8)œ©!6ë½qL ž¬Âv©kDŪû(êb%Þ/à¦zU(Üð¾ì¬áÞ@(Û‚ö€#m’ÐyËé~ÂámËêW®wøõUØË:_p¯õŒe‰9/õƒ?¶íôDggô8­÷âÜFûoó,íã^X¶Áºsÿ˜àµ…<©ÆC6n¼ï°õŸß#ñ×¥W#/¯o›¶m€WQä;u"=¡æñúÆXf m–'PÌ‘ÃéÒe¨Ê…Ì–dØÂ54ÚÇÛý]Ì(ŒiÒˆ·ÛŽdBôm½Ég¶¹ô ú|¡û&žIð „í©‰ê¹*x²Ã8§˜òO…$]SK¬ Ž×(zCºÖŠ É/žk©.(Ö)ɦë8« ŒÁ®(ÛÕ:ë t©ª=¤(I¶"7Þ-… ôŽpÑûý+ísR6þo[:ñ³`„Ä›˜ÀDÇ7'™cÎ¥©xP¤Ç 6¸HÑ×\f±Œ{] n gŽ4âÙú!Œ;ô¦W׆¤ýé*lA+Œ!ïk ÔAS߉Q°VFËYÑacŒ3ãyæ3 æ7«bg/j”E˹+B6u :7«oɨˆ[Æ %ª~{à9,3 á™É“ƒ ,]€µP3—›¢–žÔ­ Ó }½K™#š±À~¬å„æ^Ö+ï…G¬Rw'ˆkµ~Oãê? "7‰µ™p—ι÷#@Êtæ9a¦ÑeA0…‘w'o‹¸É–棰EN07Ì-Ι¦È/,¬&XËD\¢e|@%×3à¿Ï°=‰ à¼GK«Sb:3‡ÏÓ„Ò;ÿ&`uʺ%p™<BD/SyŠ–i)ó­gÀ‹p‹÷ÍtêÒá)äˆ+¸0^•Lj³‹JŒY;ëÛW¼½÷9³Jgš[ç>?‰ù6âx_) ûsSƒ©õûÔñòÆÓ }ލ?MpbÿQëÂ7=A§ „ñ—‰¹Ôß;¹•ì_žÛñ VÓü¨AÑØýcëSmˆ—5ñ,šÒï/ALÓŠÂfTÚ€ %Vf;ëcª4Že  {@åBìû¦I2¥›R0ÇÕ¶Ò¾|ºß>ÿÄ€Æ9ÐGc°F 7nB1]%Ù·Ç¢ä0?±Ö ’ºÝ…NÉP£ÜÈ«Z`î*¶U€¾ æT•ç¥;w…бb½ÁŒ}Tü&çc]owp…5ôŒ¥.Gøè'yGKð ®us »d¹ Ϲ†V-ÎÕM—Ïã1=Ôðõ†ýö9hà ½Åžà3Ê?P pÆW­Ò•tÆ×ƒoY‡WA‚3o °p¹²A°ß³þìÅÎÄ 42æ˜-Ûy›jº´ÕØ2˜¨÷?™\ï}…”ëVÃÆ!8œ;; kËaRްŽü4ÚG‡½×’DEàš|îbKwšÑh…yÖ\Ø ö}†­3èìašŒé;=ž1¯¸˜DÃô@XûešÜE‘5eïã¸ìEÃ5)q#›Æc#e3ú°OÒ…s9±0msÅ¢ÈÞÔs›„–Uë9#³îE§Õ/§¡¶|y`HIB¼g):Ÿß“˜l^jÞ±a)ga€ÐcªG3ÌÏD$Žk¾z”=žï5b¦òðëÜŸŽL'ñ<÷×þòâëßù`W4´u|üÃË“?Q€£ŒæóöÈÉÈÙÈÍÈɨɍ1”PÊáx¢®“F­D\éáú[ã©ý1#'2éñ 8Š¢;(’ 4´oïäo ?Á!ÇC–Ÿ¿àctPáÇçpl_df.5ºæ4|_æroÞæÚÎt·útq˜Â¬ƒ}GjÜg:±ÖOâ%¸N‰ÌGzÂŒÌG~Âj,Î-µÎ‰\(ñr˜KhÏ0‰áZŒKB9‰—Àº#²qÐ×HÂë|]}'ã†%Óº×hc4Ký¥¦¯i½-A0•’­3D sù{çT«?J©ÔWÌÉS3§Ì’¦fà3Z¬Ë­yë«{Z5s8Ág|o&ÛV­Ç®{r±Ò>©Tk7ÿVͼÏìÍõÇ-kËÆ´¨•®@×/†.Išå•KÖ•_Ç/FºSë¦êÔ›Öñê÷¢zB­jê*WáÙÄG ÕØRgóVÔƒ-ÃhÅ€ërROäÂ6#ésRú>»`ä"‘6 .pBѺ=,f~d0Ålï8ŽXáŠê`wŸa¿ž]K¡:+šCø† •"¿ao¿5oÑd!c–Fé¾üêy§:¢_eh HîçCy‰y¦BŸ7 ¼KèFX´Æ?¿ÚOle7ì9Ù²ì°k+}”‚{çÛÆ|qö­¢¡¬ÂÜý[MÛ,§z#N‹ámMoAù+O ó º…Q²]µÚ±ÑÒkÈh³ú(ù'fØô)Væ*;5}ß3Ì3L\…Y‚÷–ŠDá¤; TB–Û©}Ýö‰&+ü‹ÆÅgd³âöœöðÄ ;B|Î ûŒÔÿŒ–+@kÁú‹v+þÄ ³ù®‹0ôÌ0­ZUš¶ÃgÌ0ðçÌ0­—Ì0SŸç̰ÑgÌ0çÑ'fXû®hý8Ûê?˜a²O̰ËÅÌ0æ̰7—ÿÎ Ûøþ?`†1?g†Åýb†M¾`†§™YdCV#%N¶ÜšÁZL4YßÑ"Ñùˆ0ãøÑ"0 Qp%=fªlF¶\"ªZÌùÀÑ"@ßB„ä`tl˜DÿNEoÄu¾A`þ9 l+"ž@í˜ÄðPÁ$ûªÿb|*5a5âö¤‘ïÜI}I¡K,wÄ)?ÑÀvA­…Ž`šT#g;°¤Ñ8 »„/ø‡(ß²þR?šÜј?˜a˜ÿÁ “ýƒÖ‡hP¶ZiTÛÍŠLD“%øÐ[ÖÏ‹Ìl' sêzí÷‹¦R×Lû’F^Ü­û‹¦-’Æ…òŒ¦Ô,ö3Lf^Ep;¹% Un·Ü!6'þÃx˜rɤÏldŸh qbK Ê‘D­óM„1 ñì€s>%UiLÔ)h+p@*5g;¦ÔøX4¼¿¦‰_ùÄÖ â÷ƒM4zaa”ð JÊÚ*2j0W,ËL  êùF?¿è•rd@:”ú—Bþ3L0- å3L;¶ÕiS™ràà´‘ŒÞ/] ™ßé¸q þº,À¯•üÆ Z\ì†uñŽ 8`ÕÑ΃|™ô ö³À¾ 3s}eé•$ømóÚܦÌ@ ì¦ u“×B ´‰`rÖ†ø£„°Ÿ<¶ÂïNÆNá3ìÃä=4ÁG—ðŸoØF9Ä%ÀnJQ7±e0Ÿb/Þñ´ïœøÏ{oè ðå~]b0"m~09«|ÔÌ#éÿÒyˆ INð3ÑìKœo¼ qr‹šà\D*êS4‚NÑ/¢Ã„’ÀC0ÛÏ·@ÙfvwÄ”MP§¨›HœM@9°o € bý¹©ÀSùããQ7ŸH± ñHî1‹L—_µµvÅvOåÿ: “ù?Kþ”Æœ2ònê#5ÁÔR8—•ª\6! ¾ˆ‘ünFÝ`Ï tr&šˆ˜È·[)T%%¥MÕø-)~¥¢š¢§Œ@…—õäˆØÞêËán³gZ!êL›³ÕXÛ¶óØý{÷ŸÇŸ¶µA|VŽÍ`ºÆc«À½dGmÍdåÎ8XßÊÙǦ’߀³~ÊÛ¢4Ó0Ë,ØÂ4ËÌßâ4Ë,Üz7ÓÊ?>Ó*×|…*öA½úBÃðœLYüB•š9íbxQ`C­+–Á»Ã•P'­6µ£}å¬/óŒ•>-sß-ÚLñ5´yôÔ¸ãÊS?'7.:>áÃÆìVäuÜâlÈÈоI»o:¸ÉÒ]ü¦)L5m>Ž.zþ- G<§(ÄK¸§bÂ;ÍqÌ¡n1v%åh¶À¯ZH%ƒ¥°¿„‚þ|Xµ­w£ ©WÛ¿ðaÕ±²Î¢¬¿ðaàHåU$¿ða€†è¹Õ&ÁõvóOø0 ŠÄ,a½]ùáÃÌ áà žða4ue¿ða )³7rÙ¢Ó¿ðar©­v‰ àÓ[[¬7ªûgÉ-<ÃNèþÀ‡µB‘ò5®§lÁ†…ŒÄÓŒn:ƒ´e()Xêà)”—&í·5oä—b I¯ˆW"o8·Ü.¾ä ‰ÕQc 1âýlr§7>¶ ì:§u§£`Ï“Zƒ4ƒ ÄÉÿè´uQ@aú1ó< Ò†‚ç.õ¢ ß›Nhw͉g÷dDë;oyóªâ9Þ\±ê7¸É¶á©É3ØÒ>x·û¨Mkо5Iв ¡QP¨Ñø)ï6!ò­·hM Çã:Ji—%è8ÅÑá£r öåN£™%̽0ooè$Û! uÔý¯:Øàd}°ZÑŸ@«šþW˜X­øc3>¸XÉUŠþµ_A±öýj ðV°¤3­ýìz|?{tÞ²N±¯¹XÒS5g_=à.»úYš€x+À/MåòøXm²AЭ¦Œ¡ñôßI&á¨U›ãr }ºi\çãêÈ¿¶ÉS)ë§P‹ö­ÁÓ7ä v‹H¾À`Ùc´šÕß)ëßQ‹†Ö¹Çkç+ð½H†žÕgRå¼ê¯Â«ír“†Ýcd/«<õâ;b”˜ë#ØpûðÛüø S.³G_#ÀÆ?˜ª%½7f ³³×Ñ}ñ+²µ;Íymϲv2—æó¸]ö—å-?³D%tg:2 ñäY¯ü·æ¯„¶\¦óÔpœ _³¢Éðø}ÇDŸ*à]웩¥‹HþQôJMq¼™Áì»+º]– ¡õwt˜-»l“ïú0Äç41Ø/hévVLTަóõºb“+`Éh¢w§u—5uüœôZœôKÆzY2¢CûcY"mÇ:К†uGüOèu!Tlg}¥Ö04 Ø;¾Ù¼édÿЏ™_îlc<5þ:Rœ ;ÆäÇ|ˆÁô¸( NB¤øh6¢Ø¤AãHq~ 6"h¸Z¤Pq}âXùÔHqqL6"ÊÈ*¤PÊaQ’By6"oó!$ ÆÄÈʾ‘â*"lDº ó!y¬}¢$¶lD®®'± :éIzZÜ®  ®<àžäþ Uƒ¥yS-8q»´«á³ñ%`q c¥¶£ä ð¤ãTâÎ~…ï;‰›A¦èý4ˆÁS‚© *ªõùwêO”¡¡CÜ4€Ôýh²®…å.mˆ µH`Âê˜RFc^qm &A µ8?^\Ÿs沑—n|…Z40a9Ê«KZ¦DæÀÇ7•†iÓMã,±ÅlÓ †‰ÂlS”rÀ¸ Oœå1¥[Ž0· ÎN“JʦÆ|toV†©ùé“•¯Ö 7·Œ*„Ã.'"Iò‘ÿ0Ö%mr Eõà1é²½g$PÚ†2€«H0 !5Û Ç–ª~Jæt5Î20©j7›üí¢ü`à ¢Å¢º™ºH›òg¹ÍåˆvNyDÔ=}Àxç¶¡ÞgaÀFÓ–0,Óæµ[ë;y@”Ì©ˆ+))Ø+”&F”»éo¢»ïã2ü<$f „è6£áŒî×ïíQ<Ô@˜ˆüZiÀ›1KýåMàs­X ‚ôÜœ0Ê ù=x3Z;Ù¶r-uîq@ýq¼qùÂrr‰ðó uSb}"¼»X½£€³°í<‚ëz¶…ŸÄã“®Ó¡Nßiœ‰ÂП8¯‘ë¡’Ð?¥q͇ ¾›©‘ÍèÒs|XÈ>ŒèK¼/ê£ÄFªwÏD?)§b;)0eÁÏx?l¼X_T€÷Zªw¿ÏD#-§¾/ÅS†ºùñ˜ç)Ys…œ»c‡à-øs‡ë¡ £ Ô(ð»ß´@)ðô`¡î?áðõÍÞÿ‡e#‘S]>&\~yåÿ)éQ •¥×µ±±0Õ×u0µ¶¢Õ·05´r s±´T¶Zb@lÝ£[¬ÏÀñW™a q/Ò¬c÷Íše„ #ŸUøÙ^ IEÊ n>›ÇTàvˆ¬ÄÈqrzWvS20IõÎü¶…Ú ïÃ|ÒzöHÀùª )Jv2–åP¨ÉFGáf#ºk÷CµF3„ [—¡¿jD“%ú…·ÅRCkÛ]k—Q½z÷Ñý°@FuŒôRržrz™Ã[,yë WÛ×°¶?Œ¬éç™i®œÑÍ‚ƒW0–dyòÑF§wÜÄ߆—è †d岟Ò×Öt*,tÞ|ŸÛºéßÐ rIìÃa, «•(ÄŠ&iDî±ù £Ö1½4 •L§cgÆžÄ!æ‘5BºK‚–èÉ…[¨îr†ßw3’á›b¢o9/MsÝ_¹¿tE¾S©ƒ}ÅbdBFWCl:+góC1®#Vp Ä*›iMSWY QE%:Q™Ñj˜nÔÀ5Íc\œ¥ÎpÜXÂ÷ßg:‹õ!m¤~Zþs¨§—õ»_ý?lp÷¢ÛM¿R‰ $s&,ßÁ潸¸îÚÒul9ÊÓ€­?î„c.ÅçbœÖæ³æ-+j¹° €Ù&6Mã>ËìàÐ7¹OÌ¢³ÖЇ¶¶ —¡ä}jN‹Ñ|Ðã»Ìú«v`>o‡™žµ½ý³#Ó1Vêm7bÀÑ=Ù•‹Ô h‰4Õ~“¢,(Û0¿Úü(¥ù‚â€ë#„¥ÚL—O)Ÿ“e.ßK8™dL|ç~“ß’µÞò8!ävS×ì3ž$Á­Š»¹·¸¨Ñœ*s¡ÛSʹÖx¤®jŒŠ£‚j¼õ‡gÐ dT8^†$J©GcV]!Yt±îRVž„©÷ôgèBŸ(4ΥɈ˜êô¹ðÎT-†A*õ/–Ã+g[°·»¯j-_ÚT¨˜¸¡a/:°!nê)ãa➣ v"çè{=wq£jZéâ`¤¬ ¾ì¤ÅëÂxÍ:ÑÀ»åf^3ž ]Òµ…}ýf;9ø;/êEÔ¬ƒØ°‡5\a‹êôV­ô«Å··{øD÷ºÇqÙ¡W«›÷û%»Ì©Ní?†˜`v"ëÍ»¼Ýk†Ð˜f×Õäu]ÅGí›'ǢǃºÁÊ©ØÓ¹ùƬ1p⾯-â„è¯ÜÄ~6+QéÞ§ëÖË Oà ‚ ô¯[dþD3ó8bt5À èå×?‡ÑÙÞÀâeuÙÓo†þ]ðsç‡MD .` Äb¤ÓȇÃï¯Î몌y|›„à@@”/^íOõbšiaªGo¢kgehoO/"ò$G"ªëhñåõße§âÙnée5ÈôBÖœö¿’U4tp´qÑ7´y ²®Úè߇ûØD âú7ôÿ…þŸ 2ÊûhS# âQ½D”ýOÿQŠñWºÜ5·9Q(èÅI §ù'ÓøܳÙÉÐÄTßÂ^ÄÒÆÁUå' ŽVVÿ±#öwÎy¦÷üÝmóØÝÌ/\Òtÿk—ý3þÔ@6½¼äQnóñ‡õ…·ÁÛ੺ÿ$;ýn‘Œ®¤²÷ØKÆh@@o^XHþ, íDuõ¬í\ÿ܇ä ë–æc¯Ä)¿ðI·üS+C;kzgC=û?†ûŸ‹-¹ÒòW½ùüÞÞ /Þ‚Çø÷~Þºº®þüNGž¼<–šDþžë3 Ó¿5õÀ@ä…©žäß3•øOÏ÷gû_*ôÛ¿mù/NÂï¶Ï÷ ¾<~Gÿží¿¶6ÿîù|ßÏË! Qý{žÏö$þnú¼Îÿ·ð ù7MŸm0úÝõyÙ§ä ×zÝÿ½ë¿ï(ø·TåYe¤ü _“ÿß%¦¿Û?¯Ý’~aokú¿·ÿ³bÌߟWŽH½p–µü[οWŠýnüüºÌË&KÚþïÿ¬Låwçç 2/œ Ýþ¯œÿ“O¿çshüÖ³þÀÿÕzÈïbÏ'²¨/Ä*ÿtþ»Âó9æ § àÿ|ú+'ñôO„ßÞp@@´!@ÿPKÎ[­3•PKy¢Ð8META-INF/application.xml•=oƒ0†w~òŽh† Q‡v¨’¥MÕn–eNÁÈØçý÷5AмEÝì»÷ãžê° :`DeMMrº#)i[e.5ù:¿eÏäÐ$•pN+)|P¥Áa°&÷®d¬“ x5TÚ…3Èú€lºrAu×ÎóLç'jÇ +v»œýœŽŸ²ƒAdÊ FWtË>d *ñ&9Ú­þaqú`Ï"žó=]°%±”£rë¸y‰p£yÅbQ°(tZüfF Ð(ãa´Žï¯'1b'´>z ¥V`<Ÿ SRCȉI5Øöª×Çzô’øö¥½«qÈ`÷´µIþPKN]âEûìPKy¢Ð8META-INF/MANIFEST.MF}P½ Â0Þ y‡Œ:¤TP‡ŽŠCÁº\%¤W ˜KÉ]Á¾½­b *]ïû¿R£m€X!õ˜ËUš‰„骑*\{Èšx aíƒ*ê\ïRê0&W-ÛXóæN–k‘ìh†Zíúñ°I³K¶•‹ªCYZ<õÄàHhÒ¥H “:ÜptP'í`dz?âœêh‰Ÿ*95œ]»ü™›þ]6нæ>#’PKÉ=Ȭ†PKy¢Ð8META-INF/jboss-app.xmlu»NÃ@Eû|ÅP¹aH…í4!HH<„Œ(­ñzbo4Ùµf ÿ=ëPPõ™{æÞbûyb˜HÔ_f×ùUämèœïËì­Þ››l[­Š càž< Fê !c˜î€q&¹„§çZÔăýðǑŘÔùòƘd:¶AuAÕ  à€‰ƒºd®Î<·Qo¿Yé|$ có¾yx½{DÑ™kÒØ$‰eG>6 Î2å„’¬y þàúêˆn^PRjGLý¹]y@V*Öÿ¦–ª¿iZ³þ™óPKlÕCÑÙKPKy¢Ð8Î[­3•6interop_W2JREMarshallTest_appclient_vehicle_client.jarþÊPKy¢Ð8N]âEûìéMETA-INF/application.xmlPKy¢Ð8É=Ȭ†*META-INF/MANIFEST.MFPKy¢Ð8lÕCÑÙK‚META-INF/jboss-app.xmlPK45ƒlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/filesonly.war0000644000175000017500000000512310541620615026274 0ustar twernertwernerPK r[’5ÕÌ·¨FMETA-INF/MANIFEST.MF}޽‚0E÷>EZtí&£‹{…-)-i?iˆáÝÅŸÁÐÄÜñœÜ{wÒ¨<²38¯¬tÁçdå@",í<*ÙJîîU ¼ýx=~A ¦°®Ÿ‘C¹*U.qàì¨Pƒ ¥Òà­Ñ Ò”ßÉ!ëeÄ_Í‚nRë=ÍLÎIV7j0øgdäœö[AoˆH’¯.C·î:£;ì­ÆZôŠ<PK [’5†”øØ)8LWEB-INF/classes/org/jboss/test/vfs/support/jar1/ClassInJar1$InnerClass.classQMK1}Ù®»v]íZ¿o"=ÔM "‚⥠TŠ”Þ³5Ö]¶Ù’lû¿<ˆàÁà'‹P¯•™7“™7/É×÷Ç'€.ª¨ ÀÅ–» ^ñ’˜F‡ádë1OãÜ^HSðù³áf6æºà©Ð]ÞË„1}uKø’¯•× æRÇC·—?I†Ú Qòn6‰¥~qF™ú ‰l(tbãߤk%2}¥¤.©ÂE )¼XFBcÑK÷ò™ɛĎŠþ”¦b.B¬À ácÏÇ>ÃùÿƱ%ã™Pc~§rT0Tšö)ÚK0â¾Ï¥ŸdQduYDÛÇ*ù*¡38´€ Õ~k½Ãy¥ÈA@Ö+k°F6,q@¾VžG¥ÝÄF™%iØÆ:ðPK [’5Èb$´>AWEB-INF/classes/org/jboss/test/vfs/support/jar1/ClassInJar1.class•QMO1œ ¸¸.‚ø‰zÑxð#Rˆ‰¢É‰˜½¬ØÍÚ%Ý.ÿË“‰€?Êøv5+‡Nß´“yÓ×ïŸÏ/mì»(`ÛÁŽƒ] ××ZšN$’„Á›IÔ î~¿ÇPï†b*x$ô˜¬Qz|ÍPéÄ:±BÛ@D©,c)Z>ÃòÒÊÞ2NN†b'~– Õ®Ò²—¾ ¥yÃHf¾ñHD0*ãÿ‡Eûª¨ûE76cã$áV&–O_ž¤“Il,…ió<¨¯¨¦8î NÍHÞ«Ì£6w×̲{¨`á|Or™½º? åÈ2\-`pÛõ`å…Ø{§[ kK½L’Z/4Uä:ÏÜgAs;³mŸnïÙvK!ðSžYçÒ:‘B·™¿ä;s4J’ß_’­jÄR»t‰ÞJ‰C® š{"Üœ’/zçû4Sîäì#}]ÿ¦Ì]–¤ç´æ÷ÃäóÇíÿüL`£êã™ÉuòË‹B Bf}Ó¼åmðh¾óK秦”FºÜ>®õSk¡±Å–†W똳÷®\zÂÑášvvÿ73B‡}aóÜ—Þ=â6S5óÆ1«̨Qp"Ie‹0 8€Q`HZ@Â}j ¯?“¡È®;ôš~tV]¬ø ÔÑ)Þ+¾è¤S猽âknœ½¥zWïÿéÉìõ ö§~”™6j·ûÝß2¹òòõ÷óÏë3ä¾Ù­‘pû`_s,;/ÛõëQ³üT&µœ-èy…ó{ÝþãïÛ’´*T¾Ìà_XUs6àå«N·\Vê$÷7jFÙþÔ{éÔ=#??æ¶$õºiz¸4h=þßîú{ÕŠß®æfÉr|U†©Móš·d²gŽkæg›ëåW,³x§àwÖãÞê3‹ÍʯŸÙT½"¡÷a £Ñ̽»ìyžž0ŠÑM(°±¿´ûfÖ¶‚Õ_Œfð´M³³eõŽÌ¦È°CZOÏa^º™Ã÷˜(å’Lv¾€#‚×V~úç²"Yùzγ­Oc¼UØê¼™D˜q¡ ÀðÖ‘¹”„¨0­Ø‹TXÒ¨£€E¶[i…°\ˆVváÖÁ…¢Ã„µ,íE_ #–² ·fa͘š!en¤Q Ø…ÝDÙ‡Û ƒ>ã7Z""[iK ™(+ÑmBÏô›¶0“Qx³²ARÃQ ‘ެ PK r[’5ÕÌ·¨F¤META-INF/MANIFEST.MFPK [’5†”øØ)8L¤ÚWEB-INF/classes/org/jboss/test/vfs/support/jar1/ClassInJar1$InnerClass.classPK [’5Èb$´>A¤mWEB-INF/classes/org/jboss/test/vfs/support/jar1/ClassInJar1.classPK [’5‡O¿X”¤ WEB-INF/lib/jar1.jarPKmÐlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/level1.zip0000644000175000017500000000107210763474044025501 0ustar twernertwernerPK ùRe8\î'f test1.txtSome test.PK WSe8*ò§\\ level2.zipPK &Se8\î'f test2.txtSome test.PK ESe8Ú¥~~ level3.zipPK &Se8\î'f test3.txtSome test.PK &Se8\î'f  test3.txtPK71PK &Se8\î'f  test2.txtPK ESe8Ú¥~~ 1level3.zipPKo×PK ùRe8\î'f  test1.txtPK WSe8*ò§\\ 1level2.zipPKoµlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/p0.jar0000644000175000017500000000066010515742367024605 0ustar twernertwernerPK çPS5 META-INF/þÊPK æPS50Ø56ÀdMETA-INF/MANIFEST.MFm»nÂ0†wK~TÂŽ;„Á[‚*”ª]ÊeE&9)F‰mÙGŠx{L&Àèlÿùô_~µ5=DäÑ8«Ø§”TöA©¼nÏÀ’–ž+QR² :^_ï|)äQ®øI–lQUl{c\²Æ¶âƒ’­‡Öô¦Õ˜ìøÎàŠùàz3€ä^‘Ç.é6UØÎžkãCI3úF°ø3pL3dÿ÷£ØÑ«¢˜¦I\NÉM¸ðŸ‘Y!>³o¸¼%7PK çPS5 íAMETA-INF/þÊPK æPS50Ø56Àd¤+META-INF/MANIFEST.MFPK}libjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/outermf.jar0000644000175000017500000000411710746271111025736 0ustar twernertwernerPK À‘88 META-INF/UT èE™GdS™GUxôôPKê©q5(ãz­META-INF/MANIFEST.MFUT è–^EèE™GUxôôMŒ± Â0E÷@þá:$¦J³U'‡‚Pq•_i¤MKÞëп7ÅÅåçNíbh‘X=0Q£…B)ªøGªÉù!³|u)Å%¡c|«ó²ú¥6OsR/s€M3G¨ƒO#-Ä8\£×[)š }hƒwœ“ê¸G ã̘†V\ÊÍÞ©›ãÎBÅJAïòî‚_PK0¦q5ía+Qy innermf.jarUT Ü^EèE™GUxôô ðffábƒe…¦ H€“…Á×5ÄQ×ÓÏMÿß)†¨R} Ò}¢ù:¼E@,Äp¥¾Ž~žn®Á!z¾n¾g ¹´=´ðB`{‹ÈÊ„m¯žh­+:¦m›¹^U¼ý_µ²Þºóß?n;peqJõa“bƒ©Ÿ£Lÿ¨Ÿe*t^ÓSž]êÅ!9ÿÛŽºÿ[?—×oàßo<ûÝÙeKg¤Eª>VyvæbîÖWb=W‚[b&}óª<’Ð!yùÊnñ%—dÄ)ðYQ·ê*{€7#“3nB€Ã[Gd¯@| ÓŠÝß0°¤QG(x³²T0a-~VPKk™88ãl2jar1.jarUT YS™GYS™GUxôô ðffábu1Á¦ H€“…Á×5ÄQ×ÓÏMÿß)†¨R†µ@¥?=»È ed`Òp¥¾Ž~žn®Á!z¾n¹}¹š $Z¾;ÜSLæö½âØžåµq‹wîîi!õÙ.‹U?¾mÕy*·\^¾\ØkZ‚Nm£Ù¦à9,gŽk„mV{çÇX8WZY,©äŠ‚Žˆ‰äÿš¶Ë_ì—Ÿ[Ôåi&ŽÖrBÈÓœþÀkÎzÞ3¹_—|QÌežsʼnýt濃OeÖ3†–Ìšì}IÒø¥¡×í}bSî^Ðßöüï)ÏÔÜó¶ùlaõsÚJíV ÷q$¯àµ³Ä_¸'*üPÈó‹Òõq«à‚ªÈJÊ/.Æ£ŽE]Ijq ŘŠËÒð™.]CqiAA~>›ðkÌJ,2ÔG¤î¶)?nhãß‚‰Á†ÝÎ9‰ÅÅžy^@¶Šg^^jX@/DÎ ôõf6¨½¹nwYìÛ¨ýùJ¶WÄ|¹•š-Ué’›ro³éµØm7'åüÞoÓñà üƒ~!õî€õS'Ì4Ÿ<Ó\ÿäõïÇÕôøV­X wàè´~YùÝ š{Ü™mût{϶[ ŸòÌ:—Ö‰ºÍü¥ ß™£Q’ôøþ’lU#–Ú¥KôVJrUÐÜáæ”|Ñû;‡Ü§™r'géëú7eî²$=§5¸&Ÿ?nwøçÿcUÏ H®“_^b2ë›æ-oƒGö_:?%0¥4Òåöq­ŸZ -¶4,¸ZÇœ½÷påҎ״³û7¸™é:ì ›ç¾ôî·™ª™7ŽY}`F‚Oï¥ãí€QÀŒCÒ¢îS}ý™ EæpíèèV¨[g"÷§CçÈ‘îcÜSx]ÎÜÛ±qöVï[zÿOOîd¯o°?õ£Ì´Q»Ý¼ò²ß3ßøýõvûJ6Ä;2Þæ+“yc•aR³´åݱ;lån,ê;ªe~5Û9/ÿ¨ù=iݱ{²V»Îs5oQÏÓSl6~®’Õ<>A?yN›yVŸ°°ä•èºû$ÒàJUPgÝ/1®¿GG¤ì;ÙqœñºÑãÿí®¿µ2¹ê_LÖçN¶ÑîùºLÿ˜ñË”I¯]cÊ÷جX/·b¹ÅÔÄI¯&î˜>Ó½öݺ©©åG¥ÿdš÷Ĩú«BÏ‘F1º 6ûo-¿š·µ°Cõ£€Ùÿd•¨ÆÎpDðÚÊâÿ. Ê×sžíh}ãm­ÆTÇàÍÈ$ÂŒ»…†·Ž Èe$¤8…iÅ^ ÂÀ’FmÅ+²åØJ+„匰² ·.FŒ¨en}ü(ú¢±”m¸5 £hnÇÔ )ëp bÀì Ê>Ü) ô¿AвØJCXÒ¨ÏDYÙˆnz¦GØ´‰™Œ" À›• ’¸Ž´gñPK À‘88 ýAMETA-INF/UTèE™GUxPKê©q5(ãz­ ´<META-INF/MANIFEST.MFUTè–^EUxPK0¦q5ía+Qy ´innermf.jarUTÜ^EUxPKk™88ãl2 ´Rjar1.jarUTYS™GUxPKlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/withalong/0000755000175000017500000000000011146622516025554 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/withalong/rootprefix/0000755000175000017500000000000011146622516027755 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/withalong/rootprefix/outermf.jar0000644000175000017500000000606010747304166032142 0ustar twernertwernerPK À‘88 META-INF/UT èE™GJ„GUxôôPKê©q5(ãz­META-INF/MANIFEST.MFUT è–^E‚GUxôôMŒ± Â0E÷@þá:$¦J³U'‡‚Pq•_i¤MKÞëп7ÅÅåçNíbh‘X=0Q£…B)ªøGªÉù!³|u)Å%¡c|«ó²ú¥6OsR/s€M3G¨ƒO#-Ä8\£×[)š }hƒwœ“ê¸G ã̘†V\ÊÍÞ©›ãÎBÅJAïòî‚_PK0¦q5ía+Qy innermf.jarUT Ü^E/ƒGUxôô ðffábƒe…¦ H€“…Á×5ÄQ×ÓÏMÿß)†¨R} Ò}¢ù:¼E@,Äp¥¾Ž~žn®Á!z¾n¾g ¹´=´ðB`{‹ÈÊ„m¯žh­+:¦m›¹^U¼ý_µ²Þºóß?n;peqJõa“bƒ©Ÿ£Lÿ¨Ÿe*t^ÓSž]êÅ!9ÿÛŽºÿ[?—×oàßo<ûÝÙeKg¤Eª>VyvæbîÖWb=W‚[b&}óª<’Ð!yùÊnñ%—dÄ)ðYQ·ê*{€7#“3nB€Ã[Gd¯@| ÓŠÝß0°¤QG(x³²T0a-~VPK˜»;86 ~êu jar1.jarUT 0„G0„GUxôô ðffáb‰»­-'ƒ(ƒ¯kˆ£®§Ÿ›~h'³RË\w ­`aøÂø…1¨W¨’ƒ¡¨·°åôéC@^6#ƒ²^_G?O7×à=_7°1l@#䑌Éí än2i½Ïþ›¿Z'ã2SíÙn.‘{mŠö+9Uæøë»î|§§‡j-ž?þ ;õ¢~Á‰ü„¹y=)Þ‚A“fìWÉ cø‰4¸RÔY÷KŒëï‘Ã)ûNvg¼nôø»ëo­Ì_®ú“õ¹„“m´{¾.Ó?fü2eRÆkטò=6+ÖË­Xn15qÒ«‰;¦Ït¯}·njjyàQ©Ã?™æ=1ªþªÐsä„QŒnBÍþÛA˯æm-ìPýÅ(`öpOÛÔ9¡+ÂùKŸÙ$t­#ö™ŒÆÜÚ†½Ï/Y%ª±ó¼¶²ø¿KF‚òõœg;ZŸÆx[«†1Õs#“83®ÚÊ`x뢑ê VH]ZÁÀ1W-1ÈdXÒhƒlJÁ ©3Æá*k‘ä 4Rò²BÒ!í\(Úk Úa%0‘†ð£²ÅhIL¤IÂ(&ýÆ4 R"iš4ŠiŽLXMC”ÌDšª€bj?~S¡%4†Ñ¸Êf^¸5Ka4þ’µ¨E²µU,$Y‹Õ.V6Hââbpff`óPKd¹;8Eå¡  jar2.jarUT  €G‚GUxôô ðffáb‡1Á¦ H€“…Á×5ÄQ×ÓÏMÿß)†¨R†@¥=·’×nòBD€4\©¯£Ÿ§›kpˆž¯[nŸ#w“ÌÑ÷͵í²Ü·¶àÛé"Qzò•Tðÿg.Ës˜?ÞÞnÓyj÷ÞïïæVå6˜¶ÏQú¦–ß·3Ç5B&«½q c*œ+ݯsàÅLj™&~6ü”ÿïl¯0û…̤1©ÍÊOÝ[¼¤ÙGÌHøÚËÁ·¤,V¶ØYþ’}º÷–{Y~ë³Ï¬8®‘·KJ* ÌÕþv\¿´úÒ­²ß÷ì{9ÕŠ7ûk¹£Þ¼ cNk7øÅ ?Ôð`âü¢t}Ü*¸ *²’ò‹‹ñ¨ãGQW’Z\‚G±0¦â²4|¦Kc×P\ZP_„Ï&ü³‹Œôi¤{ãRÁ$`üÏbC"t;ç${æyÙzÉ öÔ_&CÚ©­®,Žº:Åóë\¸âLã:Ôfðª$}»w´ë®Žnæî?úþjrÿi<~“µ(œÿ³Qþ¯g¥ivv÷ï1òl¸ïÀz[±ÌéQËdzKL$K‡¬a9ß2ïóÊí^çõ%£œÏ¿u\étªl5O`DV¸—výÙK»Nɦ…•SxÞzdZžïܯt2åavšRwk(ëM¶‘–mŸOܰô~,óýR循¢;OO/Ý8où¡¸‰js¤_ZŸÊœsìÊ“2µüЇ~¾¦–¿¨‘·ms}ŤÓï¯MV™j|>@ö˯½v}ܦ3=dd qÔž®³dEòÜ"+—ª‰“%ô-lkY«5—ꊊ´9¢–ø9ºÁÌ*õwØÊWuÀ”ÈÈ$ÂŒ;oB€Ã[GäìÉ©0­Øó* ,iÔÆ‘s‘-Ç–– 0²n\(:ŒQ³ n}ü(ú¢±dÜš…Q4·cj†d#ÜH£°»ˆl…Û ƒ>â7šÍˆ-£ÁÀ’F}&2²]€7+H;'F ˜Å âPK À‘88 ýAMETA-INF/UTèE™GUxPKê©q5(ãz­ ´<META-INF/MANIFEST.MFUTè–^EUxPK0¦q5ía+Qy ´innermf.jarUTÜ^EUxPK˜»;86 ~êu  ¤Rjar1.jarUT0„GUxPKd¹;8Eå¡   ´wjar2.jarUT €GUxPK_» libjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/WarDeployApp_web.war0000644000175000017500000000650410542050257027500 0ustar twernertwernerPKÍŒ‘5 WarDeploy.xmlþÊ…Q±nà ÜýˆÝ`§KÙÎUª”.m£v³~rHF~48_Œ“ÈQ†.½»ãîÅjÐGr‚UgJš³Œ0²k”iKºý|IŸéªJ’â N"õØS-¬ ( Bƒ%Ý;g—œ8Ã_Ãd§y€¸A~XЄLÌå€êÆöÞ3ÿĺ¾å‹,Ëù÷ÛæCîA‹TtÂÈI‡j‰q¼é¤p1á?vAEÈÌDít¤xØ!ô'%ù€MäÖ1ôVÖ—Bu^ç,`£ól!9 õ )¬?¢…ký*:ݦîl¡ F1“CæÃ9se Øcwf^ôëx+øvzÎ æ°}­.5¾®Šq]¿£ŒÁøC²‚?üV•üPK‡™=ÕêPKÍŒ‘5WEB-INF/webservices.xml…R[Oƒ0~߯ ¼—ŽùbcɼD5&jôtålv–¶áÔ1ÿ½¥ClÈœ8ßåœóµùb_Ëh ­æqšLãוP›yüò|MÎãE1É[X!4;Á#§P8ß­5¥[¶c ~ª„ëš:ˆ*¤Û@<‰Ìlb`·m›´g‰n6t6¦ôíþC͈Ph™â®ÅJÂWÖ\‚‘ú«ÓzŠ ½ôNsfýøÿŒäTQ "Vµ§ËÑ=Vž[ºbùS-Ó2MÒõ ²JãÂ[é 7ÂtóÀèƒ(VC1¬–ÓS´ÐÍ%CÖB:íÕ’Ü>\Ó®dÔýæô—h·lßNjfŒ;ãÞeº´rzŒ8ÝXâr3Z²rmøx‘Óc„‘‡¼ãÝWvRêW|t…~)D?ÁªŒÎÙ=Ь‡Âuó÷ÁbbÝ;8ñ¤ê#2èÛåô„ã½Em$YS#Â@’`‰êã7’¥cZ ØÈœžrçÙßÈ?nRMB‹É7PK"©½‹PKÍŒ‘5WEB-INF/wsdl/WarDeploy.wsdlÍTÉnÛ0½û+ÞkÊm`9è‚¢ºu‚ôf0ÒÔ “‡Ž¢¿ï")nã{#‡oÞ¼Ù¸¼~Úwì,¶ZU|1/8Uë¦UÛŠßÝ~zuůW³e¿[Õ:!Sr¿—ö#˜Nœ9i·à¾“¬émçœ)…ȹ¶[Î(’Âò › èû~Þ¿ñ¯âuQ,įo_×õö2ÂçÙPK“|qNOÞx{l:áo"º\FóÕŒ±¥ `8‰éH¢ÜB,Ágè:}”C8þ¤ü©@m¤uj£RUÅ©%:K5æb ‰_ä/äë@µY¼ŒÞhën wÊŸhµ+}ŸãsË( Yض{uô$ßV™ƒc1VÅ©yå™z‘Ñúà.ÂsE£ÛRd}cb)™p{h•ŸÛÓÄÞÆT›£()eßý2ù¢:ß/S“‡• }„gg& —Ï"ÿYÜ{9Áüõ]í U(Ô3ݲPÝ ì€Döšia×£öKZœ6B]ØÙI‹8›÷¿h;Vs6"±³á‚`Ûξ°´S:ïTœ‘²p)N¦'ÍÕiOeÓЪ#ët-Ç~FíÞÐí4ºòª(Š)•/{Ómzx ¯ç-€è“}BÜ|˜¦ß ³Š™Ð×,ŽþæÕìPK€›ª¥òÑPKÍŒ‘5QWEB-INF/classes/com/sun/ts/tests/webservices/deploy/warDeploy/HelloJavaBean.class¥RMo1}³M²!li Z %¡¥IŠÀâÀ)À¡|¡@%‚Š8:«¸Ú¬W»Þ–ð«àÒJ ñøQˆñn¢ô€àày3Ïž{ž¿}ÿüÀ]l5p«>®6àaµŽk×ê¸î°å£íã†u„Ú}kû0×íí*ÌX:V/óÉH¥¯å(b¦90¡Œveª]<#+öΡ™ˆ,…Í„UÛC5ÊTz C•‰±J"3‡2}\zÏT™çò@n+÷ õLN ްÙìó†ˆd¼'†6Õñ^¿÷'E¨ê8É­»×)›'ïC•XmâÌÇMއ&OCõT/ù­ý— À<áòÉRÛ¹ŽÆ*%P'À&:„ùNËšÖÔä ¦ ‹¡ÿÏ',þêº3ÚW!?êÞ?|ÃB,¥´CÅ:EúC)ÓrA§-^©‰±êçtX~™$*nÿÕàgqšYSRܵ{ŠBh£Î¿ÐCgùSz 7c¶ç8ŒÄXÝ:}*¶ØÖ r ‹lƒòΣÉH¸€%>å’_0zŒ+_à½=Æ\³r„ê-^Í›#øOl/•I³‚λÈ‹Î~…q™×J‘yåPKè`gˆÇIPKÍŒ‘5KWEB-INF/classes/com/sun/ts/tests/webservices/deploy/warDeploy/HelloWs.classeO»N1œ GÂñ(ù - ¤HIAí3«È‘ï|²} ÷kù€|TÄP ØÝ™‘fgw³ýX¸Å©ÂXáX¡$Œ’éŸÙû@¸¼zY˜¥ÑÞ4s=ËÑ5óûëÿaüøn¹Í.4IáDø,tÑò“óL(wÛ^ÓÍ—‘pgC­S×èœtæ$}ÅUâ¸t–“~ãÖ‡^¯L|øF?fÂùoî¤Z°Í„³k§§\‡,Y”ý]Ca u SA(p(l(¬©¤F‚8úPK½±íEÊPKÍŒ‘5WEB-INF/web.xml•QÍOƒ0¿óWîmbb–¢1ƘyR£·¥–çÖ¥´„WÆöß[˜ƒ±Ëâ¥iÞïë}ðžÔájTÖdÑŒÆQFÚB™u}¼?‘»h‘¼…o"ª*ôlƒY´q®š3¶;A±1TÚ’yˆdÛ :òæ{T·m[ÚÞP[¯YÇ3öõº|“(Q0Ò«†>šzTsì)K+…ë+ÁáœýͱJV)ÝcùÑ …•bD ù§¨¡ÒöpïIžÌÙ8B½ÓàÆß…î„ál‚T©bî{ê{sH }NÇP½ mO~ô´¶/~ž©óÑ*àÚŠ‚XCü k×TyÌÙe)Tg­”~ þÆÿ›£©5©„sP›œµ˜v = 8;GÇÌIvç%Òšu^pªÛ¸ü6ídÓZ0–ÝéŒyð PKØ€¿CÀPKÍŒ‘5META-INF/MANIFEST.MFóMÌËLK-.Ñ K-*ÎÌϳR0Ô3àår.JM,IMÑuª ˜êĘ(h—æ)øf&åW—¤æ+xæ%ëiòrñrPK% ÕGGPKÍŒ‘5‡™=Õê WarDeploy.xmlþÊPKÍŒ‘5"©½‹MWEB-INF/webservices.xmlPKÍŒ‘5€›ª¥òÑWEB-INF/wsdl/WarDeploy.wsdlPKÍŒ‘5è`gˆÇIQXWEB-INF/classes/com/sun/ts/tests/webservices/deploy/warDeploy/HelloJavaBean.classPKÍŒ‘5½±íEÊKžWEB-INF/classes/com/sun/ts/tests/webservices/deploy/warDeploy/HelloWs.classPKÍŒ‘5Ø€¿CÀáWEB-INF/web.xmlPKÍŒ‘5% ÕGGa META-INF/MANIFEST.MFPKDê libjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/unpacked-with-metadata.jar/0000755000175000017500000000000011146622516030654 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/unpacked-with-metadata.jar/META-INF/0000755000175000017500000000000011146622516032014 5ustar twernertwerner././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/unpacked-with-metadata.jar/META-INF/some-data.xmllibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/unpacked-with-metadata.jar/META-INF/some0000644000175000017500000000003410511311513032662 0ustar twernertwerner libjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/unpacked-with-metadata.jar/org/0000755000175000017500000000000011146622516031443 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/unpacked-with-metadata.jar/org/jboss/0000755000175000017500000000000011146622516032563 5ustar twernertwerner././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/unpacked-with-metadata.jar/org/jboss/test/libjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/unpacked-with-metadata.jar/org/jboss/tes0000755000175000017500000000000011146622516033277 5ustar twernertwerner././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/unpacked-with-metadata.jar/org/jboss/test/vfs/libjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/unpacked-with-metadata.jar/org/jboss/tes0000755000175000017500000000000011146622516033277 5ustar twernertwerner././@LongLink0000000000000000000000000000016300000000000011565 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/unpacked-with-metadata.jar/org/jboss/test/vfs/support/libjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/unpacked-with-metadata.jar/org/jboss/tes0000755000175000017500000000000011146622516033277 5ustar twernertwerner././@LongLink0000000000000000000000000000020400000000000011561 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/unpacked-with-metadata.jar/org/jboss/test/vfs/support/CommonClass.classlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/unpacked-with-metadata.jar/org/jboss/tes0000644000175000017500000000047010511311513033265 0ustar twernertwernerÊþº¾0  ()VCodeLineNumberTableLocalVariableTablethis(Lorg/jboss/test/vfs/support/CommonClass; SourceFileCommonClass.java &org/jboss/test/vfs/support/CommonClassjava/lang/Object!/*·±    libjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/unpacked-outer.jar/0000755000175000017500000000000011146622516027261 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/unpacked-outer.jar/META-INF/0000755000175000017500000000000011146622516030421 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/unpacked-outer.jar/META-INF/MANIFEST.MF0000644000175000017500000000054110503765274032060 0ustar twernertwernerManifest-Version: 1.0 Ant-Version: Apache Ant 1.6.5 Created-By: 1.5.0_06-b05 (Sun Microsystems Inc.) Specification-Title: outer-jar Specification-Version: 1.0.0.GA Specification-Vendor: JBoss Inc. Implementation-Title: outer-jar-test Implementation-URL: www.jboss.org Implementation-Version: 1.0.0.GA-jboss Implementation-Vendor: JBoss Inc. libjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/unpacked-outer.jar/org/0000755000175000017500000000000011146622516030050 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/unpacked-outer.jar/org/jboss/0000755000175000017500000000000011146622516031170 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/unpacked-outer.jar/org/jboss/test/0000755000175000017500000000000011146622516032147 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/unpacked-outer.jar/org/jboss/test/vfs2/0000755000175000017500000000000011146622516033027 5ustar twernertwerner././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/unpacked-outer.jar/org/jboss/test/vfs2/support/libjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/unpacked-outer.jar/org/jboss/test/vfs2/s0000755000175000017500000000000011146622516033212 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/unpacked-outer.jar/org/jboss/test/vfs/0000755000175000017500000000000011146622516032745 5ustar twernertwerner././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/unpacked-outer.jar/org/jboss/test/vfs/support/libjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/unpacked-outer.jar/org/jboss/test/vfs/su0000755000175000017500000000000011146622516033315 5ustar twernertwerner././@LongLink0000000000000000000000000000017400000000000011567 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/unpacked-outer.jar/org/jboss/test/vfs/support/CommonClass.classlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/unpacked-outer.jar/org/jboss/test/vfs/su0000644000175000017500000000047010503765274033325 0ustar twernertwernerÊþº¾0  ()VCodeLineNumberTableLocalVariableTablethis(Lorg/jboss/test/vfs/support/CommonClass; SourceFileCommonClass.java &org/jboss/test/vfs/support/CommonClassjava/lang/Object!/*·±    libjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/unpacked-outer.jar/jar1.jar0000644000175000017500000000376510503765274030634 0ustar twernertwernerPK kp35 META-INF/þÊPK jp35S5ÈŽÍMETA-INF/MANIFEST.MFmŽ1 Â0„÷@þÃuHH‡tÈ–:ˆB§Š«ÄôŸhR’8ôßq)"·Ý}Ü]ïM˜‹8cʃF*ÎlX9vvþ†P½¶Rs¶Kè Ž¢[>¼–ê¢ZqU6Ã+@O>żä‚Ï ‡àå–³aFOyWj¥8Qy »KÍo´þQµ·â?Ƙ »˜¿œqöPK ip35org/PK ip35 org/jboss/PK jp35org/jboss/test/PK jp35org/jboss/test/vfs/PK jp35org/jboss/test/vfs/support/PK jp35 org/jboss/test/vfs/support/jar1/PK ip35)•ã.3<org/jboss/test/vfs/support/jar1/ClassInJar1$InnerClass.classQËNÃ0÷•RZʳ7xHu{AH .HEU+Q”»SLqœÊvú_œ8ð|bÊ.»3ëñìzýñùö ‡Ž2¶<ìxØeðÂë»ép2fhb±<zΧÎ(=¿`h RmÐ.I&ëØc¨]*­ÜCùè8d¨ ÒÉÐ)-ÇÙs$ͽˆ™û¥3‘„¨œÿ+îIY¨µ4ƒDX"ÁŠH¢ç£ÔÌy¥Ör'­ãËGËm¶X¤ÆñX˜>/¤C}Køpu—¦õ§iffòFå­Z¿dÝüiêXó°Ïpö¿ä¹ZÑ$ŠåÌÑ:úÝ^·§Nÿ`Š”è†*¨R®+Á#„|NÊ>!N9¯TO^Á^ É:ÅZQôP ¾h Uœo±f¡`„·±úPK jp35&¬î4ø1org/jboss/test/vfs/support/jar1/ClassInJar1.class•PËNÃ0÷•RZʳG$K†æ0Rr”½…R?‰0‘¹_:I t”óÿažFôêÅ0Õ3‡©1ÜJcùâÅp“Íç©¶<ºÇ‹€õ@˜b¸“4ÓSyå­•3?ÏìaÃùžä²üí8ŒåÔ2\­ap¼ºÓjÏïú]¡D›:pP§¾A¬—Ë3RmÐä²à@õìì½lQu©ƒ.V5 y"´°]hÚEÝA­ÐÒ.‰UQÿPK kp35 íAMETA-INF/þÊPK jp35S5Ȏͤ+META-INF/MANIFEST.MFPK ip35íAëorg/PK ip35 íA org/jboss/PK jp35íA5org/jboss/test/PK jp35íAborg/jboss/test/vfs/PK jp35íA“org/jboss/test/vfs/support/PK jp35 íAÌorg/jboss/test/vfs/support/jar1/PK ip35)•ã.3<¤ org/jboss/test/vfs/support/jar1/ClassInJar1$InnerClass.classPK jp35&¬î4ø1¤—org/jboss/test/vfs/support/jar1/ClassInJar1.classPK Ålibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/unpacked-outer.jar/jar2.jar0000644000175000017500000000273410503765274030630 0ustar twernertwernerPK kp35 META-INF/þÊPK jp35¨î‚ŽÍMETA-INF/MANIFEST.MFmŽ1 Â0„÷@þÃuHˆB:dKD¡SÅUbúŠO4)Iú︑Ûî>î®sFÌEœ1eŠÁÀF*ÎlX8vrþ†P½6Rs¶Kè ¢?¼–ê¢qUVý+@G>Å<ç‚Ï ‡àåš³~BO#yWj¥8Qy »KÛßhù£joÅ* 18¶178ãì PK ip35org/PK ip35 org/jboss/PK jp35org/jboss/test/PK jp35org/jboss/test/vfs/PK jp35org/jboss/test/vfs/support/PK ip35 org/jboss/test/vfs/support/jar2/PK ip35áNÒŒ1org/jboss/test/vfs/support/jar2/ClassInJar2.class•PËNÃ0œm›¦”––ŽÜxˆ:pq©@*ŠZ‰¢Üb‚£`W¶Óÿâ„Äà£N@‚+—Ùñhvןoï"ìuÑÄvˆQˆB˜\ß-¦óaç|ÍYÁUÆÎH•]ú­¬ãÊ%¼(E»„ö¥TÒ]š‡G ¡5Ñ‚0ˆ¥³ò9æž§…¨òô’ 7²â?bË=IK8µÉXžjk™Ö±õ£e¶\­´q,çæœM níTÝúÞ¯Ñ]èÒ,Ŭ2†ÞÆÕÎ=t°A8ùG¦Où½vžæbéÁÙ8G8@Ãÿ@ØG ¯mÏ}GÕ(]¯°šÁñ+襶lzl×bˆžÇÞ·}lÕƒÚ5üPK kp35 íAMETA-INF/þÊPK jp35¨î‚ŽÍ¤+META-INF/MANIFEST.MFPK ip35íAëorg/PK ip35 íA org/jboss/PK jp35íA5org/jboss/test/PK jp35íAborg/jboss/test/vfs/PK jp35íA“org/jboss/test/vfs/support/PK ip35 íAÌorg/jboss/test/vfs/support/jar2/PK ip35áNÒŒ1¤ org/jboss/test/vfs/support/jar2/ClassInJar2.classPK [klibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/jar1-filesonly.mf0000644000175000017500000000052510515733512026743 0ustar twernertwernerManifest-Version: 1.0 Created-By: 1.5.0_06-b05 ${java.runtime.version} (${java.vendor}) Specification-Title: jar1-filesonly Specification-Version: 1.0.0.GA Specification-Vendor: JBoss Inc. Implementation-Title: jar1-filesonly Implementation-URL: http://www.jboss.org Implementation-Version: 1.0.0.GA-jboss Implementation-Vendor: JBoss Inc. libjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/spring-ear.ear/0000755000175000017500000000000011146622522026372 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/spring-ear.ear/lib/0000755000175000017500000000000011146622522027140 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/spring-ear.ear/lib/spring-beans.jar0000644000175000017500000000457211031436713032234 0ustar twernertwernerPK eÜ8 META-INF/þÊPK eÜ8«Zf^jMETA-INF/MANIFEST.MFóMÌËLK-.Ñ K-*ÎÌϳR0Ô3àårÌCq,HLÎHUŠ%ÍôLy¹œ‹RKRSt*AêMõ â Mt“ Œ4‚Kó|3“‹ò‹+‹KRs‹<ó’õ4y¹x¹PK ÜdÜ8org/PK ÉdÜ8 org/jboss/PK ÜdÜ8org/jboss/test/PK ÚdÜ8org/jboss/test/spring/PK ÚdÜ8org/jboss/test/spring/beans/PK ÚdÜ8›û7€‘ª,org/jboss/test/spring/beans/Calculator.classEŽK Â0„ç¯}ÙžBtcð ‚• Oð· ¥%6%Á«¹ðJLVÎæƒùf1Ÿïë à„¦B]aMXqßн”I¨ïAûqÑOBs3Ávê2jEØœYwA³7ö8ñƒ ;c1µÆ9á•óÂ-vœÑ*žø¯ Û´𣼶“ê|I dHÉòx9Y$FS¦ÕPK ÚdÜ8çMµÆ¥0org/jboss/test/spring/beans/CalculatorImpl.classQËN1=ò€! å‘‚ªÂ¢„j±.B‚HH‘¢V‚*k<“8õØ#Û⟺骋~@? qg!ºÈÂ÷܇ϹgÆÿþ8ÆNŒ9l5Ñnâ}Û eT8e˜Û?è3Ô:v –{ÊÈoE–H÷C$š:«=› ÝN•õ´Y #åŽzÖ ù8±Þó }à>wÊ y"…ñ¼#tZh¬ëf¹þJ›Ä`ÀPßïvº LÐ)1a˜Ï T®ïâ+[¸T^¨rÏÚK/cqK¬öea‚Êd_yEvÎŒ±Ae Y:¬,M|Ü8‘É;ë~r¤“6Üç’wl–[#M Cõ[¡ Z§ÏkZ¨£A2³ÃJi‹kA¾'c™†O³ñ±‹ˆÞ…~(=R‰´œb“*NÈë‡À~Sažb£j~ÀÅÖäb,2ª—¦äóJ¨mï\ÿzÅÝ«¸'ó)·ÌÞ`¹š×°BYDùÛÿé^ë}žQ/ÂjÅ\Ã;ÂEš­ÓÙðØ|PK ÚdÜ8<æü ·,org/jboss/test/spring/beans/LogManager.classRÛnÓ@=›¤Í—†ô(´@ƒãÒšOU‚H<¥ ‰ÇM²5œÝÈÞ€ø,$HH|…˜µS¨xðììÙ3gÆ3óãç×ïŽð°ÛÖ\/ávЏ„Ý–JšcâºõC®©û‚a¹%•x>vEôŠwCB*-Ýãa‡GÒÞ§`μ‘1ƒ{!±ñãQd“tW±MuÂOÓ­¹­ÇýÓ{ÛXZÃæÍãÀ&™{d(µõ8ê‰g2L û­vh¹ [/ÇÊÈ¡èÈXRQO”Ò†©æ%…¥ÕœF|(Þëè­ m>Œ„ßÔÑVB™†ƒe”Ôáå±ïà.,á2ÃÆlIOÇ2싈þ¾uòhÇÁ!|÷päà>0Ôþ¯ å?Â/ºÑ3 …@˜fÈc*}Å­_hFR/6ÿ6I†"Åžûî\lýŸKÀG#¡ú3ç㙃¦ À‚Ñ)İêΉ‘“êTÏÌ=ý]š;viÚp†Œí6yòid¯Ðí8¹eï Ìó&È|Aö3rf…l‰NÐÎçHk…<'åck‰îÖ§ZmdîUïrß°ðú ‹•ü…}ú&(NPš•ÝCµDv= ÊZo›IÙ[IL•`‘kÀ/PK eÜ8 íAMETA-INF/þÊPK eÜ8«Zf^j¤+META-INF/MANIFEST.MFPK ÜdÜ8íA»org/PK ÉdÜ8 íAÝorg/jboss/PK ÜdÜ8íAorg/jboss/test/PK ÚdÜ8íA2org/jboss/test/spring/PK ÚdÜ8íAforg/jboss/test/spring/beans/PK ÚdÜ8›û7€‘ª,¤ org/jboss/test/spring/beans/Calculator.classPK ÚdÜ8çMµÆ¥0¤{org/jboss/test/spring/beans/CalculatorImpl.classPK ÚdÜ8<æü ·,¤Jorg/jboss/test/spring/beans/LogManager.classPK Ä libjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/spring-ear.ear/application.xml0000644000175000017500000000064211031436713031417 0ustar twernertwerner JBoss Spring Test spring-ejb.jar libjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/spring-ear.ear/spring-ejb.jar0000644000175000017500000000542211031436713031131 0ustar twernertwernerPK eÜ8 META-INF/þÊPK eÜ8«Zf^jMETA-INF/MANIFEST.MFóMÌËLK-.Ñ K-*ÎÌϳR0Ô3àårÌCq,HLÎHUŠ%ÍôLy¹œ‹RKRSt*AêMõ â Mt“ Œ4‚Kó|3“‹ò‹+‹KRs‹<ó’õ4y¹x¹PK ÆdÜ8zB dàÉMETA-INF/ejb-jar.xml…‘±jÃ0†÷@ÞAh·äÔK0¶:”dJ Ý‚*ŽL|2:%vß¾ŠpS·”æ&qwúô«ØŒÝ‰]À‘±Xò•H9Ô¶6Ø”üõå)YóMµ\о'­rË›*pH%?zßçR¶ê¢QhÛÉ0’H±À!ùHæ† Ã †LX×ȇ4]É·Ýv¯Ð©Ä y…úN&§8ÝZ­|¾{ý7þWÝÅåôîCvHÅHõLçZB«b¿¨´3ýÕ­z~´Dlß»%3è¡qQºó­‰3ÔŸÔG‚ªƒÿÀùZø”/»pþPK ÃdÜ8o{+mëZMETA-INF/ejb-spring.xml‘1oà …÷HùˆpRUª,»Ù:%S[©+&W‡¦>,ÿüLª¶S“›8xßã4›iød'ðd¶|%+ÎÛ[ì[þúò$øæq¹h:ÐH,‰‘Z~a¬•Š1J}’¾{=@tþ(ï™ Ze„/l®ÌÖÙ_|¼ËȺªVêm·}Ψ°HA£¿´q` ÿ È¸­ç³­3:äÌW„ùö9לš"7b-ïåDûÌJžÛÉË ¥½ŒÂÓŸM›²ŸÞyAF#ë4µ9êZžlåGçˆd åV®²G3Në/PK ÜdÜ8org/PK ÉdÜ8 org/jboss/PK ÜdÜ8org/jboss/test/PK ÚdÜ8org/jboss/test/spring/PK ÚdÜ8org/jboss/test/spring/ejb/PK ÚdÜ8RÒC¯Ý2org/jboss/test/spring/ejb/SpringBeansManager.classe޽ Â@„góãi´°_!ñ°¶³ŠEÀþ’GBLBî"øj>€%^D°p‹˜o‡Ýçëþ°ÁŒ!`˜\‘ç?Œã(&°K_™¢½Ù¼jaJq¼µâ‰éŠZm£3!Hš¾Ë侨$a™´ØIQ루…’ÝzhVM§x™6Zs#µáú³Èe™òÿaþ»uJK™™à`׳?Á¬û_YB[u0yPK ÚdÜ8툚Þ6org/jboss/test/spring/ejb/SpringBeansManagerImpl.class•TkOA=ÓR¶–¢€o@­ZvÅ·‚¢˜4©˜€!Q?M—±nÝ%Ý-ÿä£Qýhâ2žÙ.- hš{{çÜ{çñûÏ·æ±”C׎`ó®gq#‡4nàn›åŽñÜÍâ^÷±`aÑ rŽÔNKË(h «A³n7jAÚ‘ #;Ülº~Ý®)é‡ö“Nä‚ÀÙÕ–¹žZwC·¦UÙ÷ƒHFnà‡“{`dDZ ¶ Bdþ†»"=%VkÑAý¹ôe]XKµI >cè_t}7bOéâô:­O‚ B«º¾Ziy5Õ|)Y©ÀH5`Óë²éšÿ‰±/zç²ôëÿae}IáK†?á®x›šüi¹±!)V*Ó!ùÉŽ,¯¥#ws‡1ìMàd±Ú[ÒÖÒ "ŠajM{aݶÏÉ¡¬­¦£ž¹¦Ê±×P2yDó·ÛÅrèJ«0\ØÅmÛW•DŠÆÌ–Ô-B–zꘉ…Íõ#ÅÂ6yìJW7„·÷`&pœ¸®Iç}‚Yuß*gÇÑjOæB§q&£8&0ÑEEkU—ºÜ¬·<åGËÛ&œJ`h¥¥u¡{‚KaÊ£<ÎãBÍr'†ãHîAÁk7R²PÎcS×zÝrw«{Qk('˜ëEàòánoIûérº7y×óDŠ?Ž“ú_‰Êa~#!ŽÓÁÁ$Ž¡Ø‘j;N…ôôÑÂÍàz–~›RPff¾@|¤’Â(×þØxc\óíŒã¥0óO’>DiÊs3Ÿú…ÁïH¿éû‚ÌOcÿŠþ4>t@ÆÁóà+ÆšnÆà…6@n´›±6A-EýR„Ö~Â{$¼OÂÅCòì$„¯¢%~v—ðHB˜ýŒ\wf#-P&ÛÙž29f<ÕFè0Žâ2'+h-ƹÓñF'Ó å,=so \E©£ÛPK eÜ8 íAMETA-INF/þÊPK eÜ8«Zf^j¤+META-INF/MANIFEST.MFPK ÆdÜ8zB dàɤ»META-INF/ejb-jar.xmlPK ÃdÜ8o{+mëZ¤ÍMETA-INF/ejb-spring.xmlPK ÜdÜ8íAíorg/PK ÉdÜ8 íAorg/jboss/PK ÜdÜ8íA7org/jboss/test/PK ÚdÜ8íAdorg/jboss/test/spring/PK ÚdÜ8íA˜org/jboss/test/spring/ejb/PK ÚdÜ8RÒC¯Ý2¤Ðorg/jboss/test/spring/ejb/SpringBeansManager.classPK ÚdÜ8툚Þ6¤Ïorg/jboss/test/spring/ejb/SpringBeansManagerImpl.classPK ûlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/spring-ear.ear/jboss-app.xml0000644000175000017500000000032011031436713031003 0ustar twernertwerner libjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/with-metadata.jar0000644000175000017500000000223010511311513026767 0ustar twernertwernerPK RF5 META-INF/PK KF52y1wMETA-INF/some-data.xml PK )F5org/PK )F5 org/jboss/PK )F5org/jboss/test/PK )F5org/jboss/test/vfs/PK ,F5org/jboss/test/vfs/support/PKÇ…35œýUÚ8,org/jboss/test/vfs/support/CommonClass.classŒ±NÃ0„ï'iRÒ@+Þ€µjv*–HL  îNjŠ£$®l§ïÕ ‰¡ЇBµÓŒüÃI÷ýwwüý9xÄ$A€›·1Æ„h)[iŸ Át¶"„™Z Â8—­xíšBè^ÔŽÜåªäõŠkéý†öKÂ4WzêBì0–í> 3Ýv«´e™jÕf57扼«N—âEúúäÏoQñOb@xøßœð%VóvÃÞŠJ”÷¸BòkN#¬÷À`þ Ú.;zcè4=p¤¯úTzPK RF5  META-INF/PK KF52y1w 'META-INF/some-data.xmlPK )F5 worg/PK )F5  ™org/jboss/PK )F5 Áorg/jboss/test/PK )F5 îorg/jboss/test/vfs/PK ,F5 org/jboss/test/vfs/support/PKÇ…35œýUÚ8, Xorg/jboss/test/vfs/support/CommonClass.classPK|libjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/filesonly.mf0000644000175000017500000000050610541620615026105 0ustar twernertwernerManifest-Version: 1.0 Created-By: ${java.runtime.version} (${java.vendor}) Specification-Title: filesonly-war Specification-Version: 1.0.0.GA Specification-Vendor: JBoss Inc. Implementation-Title: filesonly-war Implementation-URL: http://www.jboss.org Implementation-Version: 1.0.0.GA-jboss Implementation-Vendor: JBoss Inc. libjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/inner-container.jar0000644000175000017500000000126110527516530027351 0ustar twernertwernerPK éªq5 META-INF/þÊPK èªq5{Y[Ã^jMETA-INF/MANIFEST.MFóMÌËLK-.Ñ K-*ÎÌϳR0Ô3àårÌCq,HLÎHUŠ%ÍôLy¹œ‹RKRSt*AêMõ â ,u“ Œ4‚Kó|3“‹ò‹+‹KRs‹<ó’õ4y¹x¹PK 0¦q5ía+Qy innermf.jar ðffábƒe…¦ H€“…Á×5ÄQ×ÓÏMÿß)†¨R} Ò}¢ù:¼E@,Äp¥¾Ž~žn®Á!z¾n¾g ¹´=´ðB`{‹ÈÊ„m¯žh­+:¦m›¹^U¼ý_µ²Þºóß?n;peqJõa“bƒ©Ÿ£Lÿ¨Ÿe*t^ÓSž]êÅ!9ÿÛŽºÿ[?—×oàßo<ûÝÙeKg¤Eª>VyvæbîÖWb=W‚[b&}óª<’Ð!yùÊnñ%—dÄ)ðYQ·ê*{€7#“3nB€Ã[Gd¯@| ÓŠÝß0°¤QG(x³²T0a-~VPK éªq5 íAMETA-INF/þÊPK èªq5{Y[Ã^j¤+META-INF/MANIFEST.MFPK 0¦q5ía+Qy ¤»innermf.jarPK¶ålibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/zipeinit.jar0000644000175000017500000216316611112474030026115 0ustar twernertwernerPK½\C7<^#Æ\ C8com/microsoft/sqlserver/jdbc/AppDTVImpl$SetValueOp.class•W |gÿÙc&ÃP†‹¡PI Ù%)E»A„Hhš@6Õt²™$ »3ËÌ,­G½ï³I­Ð*Ö¢åÈ&–ëY­Öz[EÛzß÷QOð}3³›%Ù†ìþ~™ïxÇ÷ÞûÞû¿/^|à<€µÌWŠm°ø'Í?ùç„Væ³aþy¹€WHq‹D‹W x•€W‹x·Jq‹€×Šx„×ã |ýFNy“„7ã-ÞŠ·ñÙÛ%¼ïä Þ%áÝxÿ¼WÂûp›„å¸]ÀûEð Wã(ß"¥#Và~òùçNò]r¥X…c\ÉqwIX»%|á³î‘°–«YQ ÅÇÜ[Šõø¸„ûp’kÿ„ˆOríw‹¸Ÿuª§qFÄY‰Æ1 Œó Ÿâã"ΉxPÄCÊpžÓ?-àaŸc÷õ÷ź†S*k¥¥EÓVm@gXÕÓ“õÉxÌÐM}Àª7$LÕ8¨õ\¤¾Ëel`ðTiRhÛ§TêŠ6XßÑ·OYD”LÕ²Tc‹1h2xbºÆ°nfÍÑmQ{Ù¤k)‰ëéñ[Cq³j-CíÌÒ[R©æ®îÖd*AB¥ÑaÍR­xŒaΠjmÏ9ë©©%w½Mz?-D"u;>,¨©-äÅ\âˆæ9âß×âÖ&†#5³6g–ñœ~|ñáªífÔÃj,m‘O kòtF-#® 6´r©åpLMq SÀçÊ]F:¡¾)¡÷9\ òŇ-ÕÙ^”¿ÝªYê j8”ëòÔtÅ“ê øL—kV¬YËE¦œgZJ25[áŠ|7¶&tÅrö/ Z³žîK¸~/q IŪoŒ6«±xRIˆU›ž ôe‡D‡tÃ*ÃF]O¨ŠæPü5{íIþ4æî¤ÁÝëúTÚ¢[U•äl}Þ0)Ý©*ýto³¼ÊÍ©fu@I'¬)QrÓ•8elÇ 2ÚÑ!cÿDÑ%ã&|AFn”±«Baä\_”ñ2ìcX6©º=ìS­ºA칤¥øÙ–zت¿Q5MePuX–vö¦53JQ¬Õ~* rÆ$™­†žìÒe<‚/1”MµâîÔ‡€/Ëx_‘ñU<&ãkx\À×e|ßð-߯nßá‹ïÊøžàk¾/ã¸ ã‡ø‘€'e<…§eüO0Teã½kÒ¨-¦÷ÓYyþ;{Õì®aèÆn#nѼ«9z™±Ž2~‚§æO«B?åöýŒ~Ž_àÎx»y 4 q2~‰_Éø5.P,³ÆóâßbÊpGÚÊÉðû€ßÊø~/ãø#%m.9;rÞÉøþ,à/2þŠ¿QÎhSÓb(1²¥]7ø»Œà¾ØÍ°¸³77éÚcCj¿#ЦjƒÖøÍô ø§Œáß”Àܰ5tØÛÿÁüOÆE\’‰XäK§: 36¹§©Öš]m¤¥³WÓ­hö"©=ðlÛ¯é‡4ã2+a™yùíÌúÉîPu[PGŠp9!·¬M Å4Uê<µWªÔ§D¹hýìG^R[œWNÃàû2uAÊKg‡ae!¶é[ ×ÌhÇ.+žpS&z ÁØ¥g¨¨i-¨Ñ?àÖùÊTP¢<©ìWyõ7qî3//†ÄÚw¡æZ AO;oúÎÀ•3_žb)Ü}ºå²¸Ù×cx{sc“óbñR(ö0TÏêá¼XÚ‹|uÄŬF†ðŒ*vPå%U*7~/dЏM=Ü¥“lá‡DíÞF†µÅ‘@ÅTµ~GGîDs‹¹K‹Çì7e"y»€¼àaéSLµIO$G¸®æ ¯@:2ÇÞp¥¢Ég¦â£#9üлuês0—LüÁÈÁÐtØÝÞìe’>3¦$øé‰:Ó%5­Ùlžúx ŒN¸Å¶ÀÄÍžô~]ë0Úèd8—ß«“˜MD„þdhåÏZß!êÜÚábs,=Ý\—}gùýdØ´TRTªpŽ˜ž"®P¡Î^`˶kùÌyÝÜD•³{°å<8&+¼zÚ[¤půš%ÒÅ8VÚ·ŠØª\·ççiµÑ”Ýa´âÙ ,+0oÊÝÜlÕèÅ©ÅÔ)À™E#JãÀ“¨³\¾I­¥Ên-<³\Íå5…,ìºNªô/â6ú?𣄿¶hà+KøÃËwØc€¿·ì‘ža`Øþ[HÝØMë—Ðl>Ôÿà »ί{ KîwÉ{ ’=YòMx©K^I¦øh\ Á'¾Õcð‡êÆà ½cN¹2Ô¬‰—dX99&ÐÎ3þÊc}•ÇÑ:±'<ŽÒÊ ¤Q<Õ~rO`î®Ǽˆ×÷Êz<ùÑoåш± 7èË œy'°`'i¿bUŒÌôŸÀ:>d°p‹Ž¢º¬Ê]C0ÄÂ÷@`£ÂX\v1ƒà(t¢ ,Á^>nÖvvž“Y´´}×G¼¶MË\›|^Û¦sXÞôfpÍ8žø¹ ú‚þ¬e¡ºJû„¹<>%¡Ê1°S ‹°spîÅI\MÁ¸™þ¼TÅUŸ*â*‡Æ9ùâ˜Æ+޽¿8v5Ý;ɾôYØŠc,Ž}¨8ÛãűïsÙ737fO‡jžúcE;«;ÅuT…3¨>†¹a>§Ë_Ù6³ÖýÅ‘(Ž=Y»V»^{Êe?C¨PJã'v«"^É[ &è=‹Ðm#H;ÁþsXÝ3ÙæqÔE|4>(Füž B8è÷ýç3X³A¬ï„ÕNiÕWâÍ„ÑKOFDB1ƒç98pé± ‹shXGÒž a׆‚þ¥T…§ò3«BÖ^ÂÚv‚3>Nuå€ëÊ‚+‘ÆÇWÖ;®,,áŽ\wœ*Ûñã("Km ºÖÅ Ê| š—àãäÐÆâšô°­i">Gé1ìä<ß]4ÛÀóxü>xVôØôq\O°h/¹ _F Š?Hg”"6 }€† ..¦ëò]ä2GõÛOcã#˜xá6õœÁÆQøi‡²ÿE#h8Íœ¶Å¡m¶i›Ú²Óhä´&‡ÖhÓ9í(ŒšÉæ±{½í\‹ã\û$¨óÖ ^lê—±:²å¶ÌTÃ>Ks‰Æm8Ï ìÿPK½\C7¼å;¡p -com/microsoft/sqlserver/jdbc/AppDTVImpl.class­VÛSgÿ}ä²É² Äk-Ö¨€Jlk/ÛŠl¡²€ ½Ø%ùÁd7înz¿ßooñ¥©/>X­À”iµOéSÿ‹þžo³Id 353Ùó]~ß9¿s¾sÎî_ÿþú;€øNÆ%ŒJP%ŒÉð`\<&dtb<ˆ#¸,/IHÊb\¤Œf¼,ã¼*F¯‰í+bôºxhb:%!@ZF\Æ6LKÈȘAV¬˜_;9 yíÐ%2ö£ áZ¦ŒXB‰@Q&9'è]—0/aAV¹=¡åŠ|¤À $t›ñœfYÜb̦§Rc ÎÀ ¾9c ÍjsZ4§é™èÈÔ,OÙ1ÒcqÛæfŸ™¡ƒÛ"Bƒig ÝêÏZÚTާIÇ$CP]ÐíngS ÇSÂP$eä#ùlÊ4,cÚŽX×rtrŽ›a<ÒW(ôM$ò…CÛ*»G2»½¤Clˆ£‘>ÓÔȫКåQ>]»¨s;2>:Äà?Õ³ös žÎ® oÜH“‹Aëj¶0QrWí"ŠÑ Åh…bTPŒŠ%ôi#¶ ¬_åZš›±IaH˜Oñ‚! ´å^ÛX£hlf¨Ì'±þžê¬l¨K½4¤:Ó¸A™‘tc‚ý– ·ÕU¾½³«^Rø³Öp1—s‚K—ßL§ÎWRª»Ñ¸vQî2•ýÝ@„“‰A ½P´UÛäZþ\Å7À‡ÂÈG ­kSAÂÇ >Á§ ÑÆÊ²;Ÿás¡ö ê“Uµ”T<Ã)p_‚òªeÕÕ‰ôRð.0l­.—’Ì+„‚¯ñ‚'p’á±é©°é©°élzªqT0Œß"^:ÓHì"›et Ö²&¨,¦ sXË‹~-r-®-[¢c3¦q]¼j²´ºÊðý&UeÚpa=¤&Û±Y\Èo>ÏSEÛyy§þwk Ä@Y_/‚”B­ˆª«Tú ‡7éîÃŽz@Òw`CFãÔŠésBœT¯åD„ÇŒ²é‰º–üÓn!Öps}¨{"V¸·~%á¼ÉY½üj’-QVî$8EU䎩SÝ™æVÖäéJ›RmÍ.ZÔÆŽÐÇ!@“èk4j=Ç‘QGî­ÔÐGU¹jödÍ쩚ÙÓ«f ý©ƒÒ¼×ÑÙD#Zí^‚¿»ÍóÏ=H?;¸VÄpšvj/I/É–;Ü@ó ‚É%È÷KÀgéï%%a’Ïáy÷ÈøÉ0prÍÉîca_Ø¿¥W:–ÂÞ}ËØÒ–±õZœA+Ùum÷Z¯—Z®K¸¤ ìëþ¡Û(ýÎ"înïqýÙÊh¿å'HÞ›ðzn¹¸~ ¸ô„š&Wtk½Aœs— Ñ80 €í? ¶‚mÉÐöeìXÂÎÞ ï7ìJzÄÞ2v«Io»½ò ÂI†åEìaÏöÞ|n¯3ô.ó]®c꿒ܯW¦}êƒö/â‘2h]Ê—‰²Ÿäú7pª†´w-éе×W¢ì ûj)?@Ç"]¡€èñ®¹Ã$E(CÝË`·‡Và¡äð]„ï¾ÃÕ Ÿ³_NÆ+ÉwÂY"wpðO´„"Ë8”¼‹ƒ7á§•E¾áÞß]J9AŒô”I6S¹t¡õ?PK½\C7{']tß{ ;com/microsoft/sqlserver/jdbc/AsciiFilteredInputStream.class•U]SW~ŽÙ°IX AÂW‚Ð5Kª¨m ¢€ÐS¨†Ò*meI6°²qwƒÚµ3þ^ÖÎxa;ã©h£S;zÙ™þŒ^ö¦ÿ ö}“%)Ìžsö=ÏyÞó¼›?þùõ€·ðã˜ñžŒ÷}p!Áäa$¼8¤`ʇi|(ã‚>œÇE^¥<˜áù#Þžõâ>æsŸðp‰‡Ë<ÌñƧ¼úŒWŸË¸âC'Ó„1σÊÃid<Ð|4g9°EK2t¦´‘·U=¯eR¶©©«䲺¦Æt#–ÈŠvÅPFRc‰Ä•‰Drfü¢Àž¹Q}aÕ²4ÓÖ¼uN·Ô…œ–—¼©y{I³õ´@<#X8m¬†Wõ´iXFÖ[WstrM3ÃË™…txÄJëú„ž³5SËÔ8ðWâÉ©ùÅØQ, Cz^·‡ŽF’D«Òƪ´1¦ª–V›F߬€4fd4ßøõ´V(‡.cYÀÎÙ]‘¾Y+„³VôM‘ɾIJˆ‚Ðsœa’  b¤lÝ‘¹Q~•iN$xµwU5WRÅBÁ0m®Á©"[™.ÁA¸MÍÒlʤRƒ‘š<)Z=¿ï«“ºg(+'/#§`c½ÛPS†=aó™j‚û7!SFtNËV@¦i˜ p\A†Œ‚‚«0eX le¬)¸†ëmÛÃ-f³½/|‰¯(‡Þk¦Z(Ð^¯žïÝíJ|Í'nâ–‚ƒ8¤`}ŸÄÛ ÞÁ» Nñp^Åô¡_ cÓùȆâœÈOaHÁi +8ƒ³ F˜ìÞ8Aʨ*c ªŒVÆÀîÑbLÁm Wv×Öî’ÝW§ƒbÿÉ–ºL•_knm“gºÆÚ´íºIzYÜRWI™^–ƘZd!©UÔÌ’i\cõnÕ¦•àÿ§‘H¸9cqQ3º*|E[ÏÅØF·K–÷ˆ´½Îž¶¦å¨&SãõN3"¾qéuˆ©yu‹—•v Ev%áÆk´ ÂV4+ÐéÛÙh”éVËg¶U­NÖjŸÛÑ66˜¥,}FéûY€:¾-£Y:)¥ªß”­ÚE‹~*Ð'ÐÂí@«.V?ͬ}DÁVuõM¡g1ì¡óÀYúmÙCóñþ§hˆ>¼O ÞïÐË/Ïá»ôÑ”ö¶¼FC M%4÷GÿQ™ïh9côP?:¼­ô&ØwÿøKhÙŠ=Aµ­ƒ P .š½Œí)aßO;ÀÔÞõ‰[îÀžªbÓÌÉ+ØÀPð{4ýxõ¼ëh > Ö;wŽOÂMV`˜S ÚO‡îáØ::îÂоøÏÑIõézéîÝG{´›X£ÝƒäáæàÌ—xðê¯P=Cއ94Ð?0]öê.!xR H÷0\öÒ Hó[tÜé>º£¡€{žÝñ¼áÑMÿ H;]ÒWŽÆ:õsÂü t§jåë–ÐýÈŒìv»û·ß®‡?…öC×Òÿ âçäs¸(‰Êé~Yæ¨Ê¼¿¡Õsä¥H–TÁˆËëèùM-½Ïðú¥Çèy€²”ðÆ]ÈÒH®Çèð üæyŒ6W¼ËÛ÷ÑL¥éêúvæ¨$“‰ì޽ùŒc¯ÄPK½\C73ÚH9¾Bcom/microsoft/sqlserver/jdbc/AsciiFilteredUnicodeInputStream.class¥UíSeÿ=É%——+´´å%–Š­!¡\•¶V@*IAƒÚF¨ߎä’„»ôrÐÖþ¿8Ž_úEg¬#GÇvúøG©»IÈ9ê8fæž}žÝßî³»ÏîæÏ¿þx à2v˜ÄTïa:‚x_ÆL2bgyw3„Y¦s,þ@ƇD‘‹à2aÚÍóòQù°È‡[|ŒÛ¼Üah—Oø¸Á2î2îÓVpy«¼|&ãs¦_ÈøR »h™Žf˜z鎮•t[àd~]ÛÖTÃR›œIE« #{_³ º#ÐßD˜)¯®;j¶I ]+f¥ªg;º€o5#0¼ mè3lbΨ:º­—–L£h•ôœYÛr Ž­k›;É|ÑÚT7¢mÕ­²£ÖT뺽­Ûêzi­¨f´úA…É£n޼Zý_î'Ï¥,±"³ŠzÍ1,³.ã+à”aδ@O²ãÊe@±jÕIÍŸä“Tß0jD’ó#óa‚Um­Ú”çH@w•H)¹šá£L4—ã݉MÍÞ(lÕj–íè¥üÁ™Ëær«lr,CS°†¢Œ’e÷aœn¸WÕÌŠJAÑ+d¶ÊeÝVƘ‚ul(¨‚2}aè¡­Õj2Ì¡C‰9&kX x¦þOjùþQoà‚‚!œ-.Ͳ¹œŒ lÔ¼ŽaŽ‚Kì©ŠË Æq…—«¼lÉØVð<Æ×2¾Qð-¾Sp ï(¸Žwémö_&w«ý| &0vPt°ÚÔWFT¸/4Žmc£ÿ¥:©lªV¥ÂýÔê–-ǨªÌ£´«ù†ŒjLßÖ«ôæs¹ÅY>/mFòÙã SuÞ6Ko0y¬.²¨c¶Y1½É‘üÑ:¢»‚T0ºI…9šìwj4+ôB޵oY*Ó˜ˆ{XÞÆc¨P›”-{QÛ$å±ão÷G]‡[¶ÑzYn¸ž¶ƒ›þ’Ü”uå=œ Ý,6Å~&Ž èñ lëõx°©Ï+à@sxjÒßF”æ?àGŒû‡v1î—¥¦"Eñ&|HÒé!}DÇS¿CüŸ ÿ÷âÃsH+{¤\]ȱ-.Â."Ï]IïAùü¡O‚@ŠÌPë¶Ì^$ÊfûS{8‘’^„vÑ•Jï¢;;ù §v{zD[p;·´{é$ˆ†Èn=‡± ú¨ë[Ø8à'fì9½¿t€ßÂÛ-pW˰Ïÿsj¼i9ŸH‘Í.ñ)ßÀ}O(bøÇOáï/WÚ>I áTÚŸ~éâ´øj |“x2Ñë‰ ‰£è“\œ¹ˆ~Àp<ø Áx`š±>éκè›öÓƒ ýwãNÛ4éhõHä@+x ¶çÉ NGÖ=àbð ¤…§M%*•D>qÜ˼vôeðPK½\C7VÜ“‚ 4com/microsoft/sqlserver/jdbc/AuthenticationJNI.class•V[WÛFþ„Œ-„BÁMh¸»MIŒMì’¦7B/˜ÄÁp[XÛk#%dJú”¿Ñ—ž¾å¥% „Ó¤í{TOg%ãR0 åvV;ûÍ|3;³ë¿þþí`[Å fÛ0€¬æÄ0/†¯ÅpO 9•†1ÜÃbT´cV|<³%ËBæCøF,~«à;+*VÁTQë<„²ŠÌ*¨åZzëÂU¶£WkÕMK7]n;ú\‚”–pnÊ2—™î"3j\&Æ%¨ÙôÊìäÃ;s¹Z HBÜdƒ—´LzVs×2V¥Âm ½™u¶Í’5W7’­éf%éënHèpœM=eX…Y¶cpSBÐ1õ/Jhɧ$´ù_¡iÉŽ›Ù\–Uù¤Yš·l—ˆûÖ FVs®MÆÉjpB7u÷ rtdQB`Ê*Q8áÛÜ%7¹Ü|ZxÌy1Ò2Û–v¦  áÂmnr›¹|ÊйéR\¾Cþ´h>•Χòéü²*eÝd†géü=npæ„ÓDå8ë+Ñ“´O®î*‘®£%\ni–€î\6My£ޱYzÜC8 ‹ÓVš¨HI¯ï»y6""}¯Çwùx‘¶yVÜ` |(šªñ·«t".o@¢¯¶rœKßôܤÞì†je«ÆŒkªfÛÜY TQ©&‡—ÿ¿ÉU&ІWÛÝcbˆkÅU $5Œ ¢a—5\AT×øJÃ8®k˜uS÷qg©Z¹Ìm ŸƒìmÀ î×Pu[çñ½b׌HH­j¢ªm˱ÊnÂÙ2nos;±^*“Ôú”½È\Ý2ïfÓ!X6±E½C[Åžq=„@ޏ¦@ùü×ß}Ó!¬SÖy)£›Ó¶mÑ5réÓ©?#®1,FrGŽÚK” CC ®O0Ù ˜lLŠÍÉÿì\aÉFmnr“®ƒÑ3õœŸIê<ŵüº¢M{óâiLµXáîá:ÂoÑ0Jÿûè<’ jÓ:p¸î·'ð;º2±¸ç)ü#”¸~;—¯ý*’*nORÿ{’z͓ӸåÉÛ¸ãÉ4îz’zÜs•i¤`µî*#?C0|þž!DóÖp÷LìïЩeâžì“¸ø3E!'Hÿí/ÑCQõþ èh3´#Ü·þ]²ÝIÜRôS„þþPK½\C7UAø¯x‰ 2com/microsoft/sqlserver/jdbc/BaseInputStream.class•VéwUÿM›6étZÒº`@©é´&€¢l"Ý`(ÐÔbëÓä%LI2afZqß÷}\=‡‚$päýîåñÞ™IJ«%çpßÜ÷î¾üÊßÿüñ'€Íøµ wá¨ȨäŒ)<*ã1<ÎìãçãÌhL3“ ͼ`&Ó„,NÈÐ1#{’¿r2¢˜ @yƒ‹LN11™XLl&³LæXùI§ñ³O3y†ïžå»çx^Æ xÑ—xYÆ+xUF^c‰×xƒ…Þôã-?Þ– ëÖ@Z+Úúœ MIhÖ­¤m -¯²ÚŠš) vÂÈf‰2†„PbF›Ób9­‘(Ýï’ДóD†ÉL\BKN³ªjt×Èï”ÐájÏÚz.æéÄÎ[±ׇ KмfžéäüMsjÖähÒƒ„þDÊÈÇòzÊ4,#cǬS9K˜sŒͤ§S±ñáä˜ÐÒÂdi2]Ÿ¶çþW)é|OÄóÅÇc§-׊„È2ý±…œNèyݖЪ;.)袥 N×V¦>ÒKõò iê@³mГ[U «"½‹ÕºÕ7vduäf±Þ *ún½ Û{$L.;ø©©[©; ¦rB3‡j[C)Mp»r†%ö‹\‘Ë'œN š3£àtò„Hâ÷4U„;œ- ÓfžÔiÊrl¾Ž¾HÜ1j º¯ ìNåœÜ‹mÚ–ap6“¦‚8èÇ; ÞÅ{~¼¯à<¨àC|DvÃñá îÁ6¾øXB]8¢`+î¦9îUð Þ‡í~|ªà3|îÇ ¾Äûøå+Pï@ÃAE‹V‹­-ÊE‹Æ ÅYÛd_ã;ØÝN&L±YÁØ« Æ_[˜$8äoœÅw va·‚ûAyaXÁ÷8(¡;̦$Ãö Ö¼-»+õã?â' +¢èF,~¨ÚjÛØ1W2n¹}ðãgçpž‹Wp˜]tT„ŽjÖ¨átW¤EÆ0…‚ ø…ê?§eP³DMòµ±ÔÞçÛvhzF¤¨Ý¬°‡ChXVÞ°Î%-ÁŠWü¤2ªåi‹µbQh’ú[Œ›®Ü!!›4cK¿l£²˜kÁ01'r4Nûâ£#Ö-†r,AvÖ.€ó§6£,º"KáýðeôI5e]0`õèÒé.Ž·=ËCr–w;J­¸%Ôm´¼«ËGª­8!¾Î“:±…é cCß²‘ŒÑ"öß^$\Ç5k¡P9GL³Òèže %Úàày\n|Nz'|aú«¥ÿ[´ ÈËO_AÞ:ë…è 18Ñ)3Æ„GιÃãwz'¡„£G@áð„(Î9à½:v›¡2Šj×Nòü“/CòŸüÒE‡2Ày2{H†`[¯£nò*êÕ2|e4”ÑòQ¯ PFSHv¿›ù^!RFËož­ýˆ{¶T²Å׫}%4“xëe¬(#x­Ìé¶2B—àþà!O/EZ tU¯b¥ZÅÊ¡Õ×Ð^"¥úÖ0YËd“6ß©v•Ð¥v—ÐÝu2Ù^Ôúʸ­„°ºÎWÂõ6–¸äJ¨ë9ì÷’« ;6¯€ì´ÑÑÍæ® ³ŒÛ+¡Ž’f£yõŽæ¸+¿W¢sÃ9l¯M6ÌÌ|9Û¸fw¸5£ôYÁ5¿Éõ.q2D6¸ÞÑ?ù衈Wýnôü¶³ÃÎó^GÏdèÎkˆ\Eï_ 5%Á˜—k+¬Yç»èe“ĸ÷¶ÑkX»—}çY´¨\f*_G%û‡«Qlñ¢ØDi©I¸IŸ GÇ÷eô/ *€‰jÚ3@C= ¥çç_PK½\C7ü ñd'“<com/microsoft/sqlserver/jdbc/CharacterStreamSetterArgs.class}’_OAÅÏжÛÕ–¢X-T”Û‚]ü_ &¤hBBêC ¼mw§í6í®ÎNQ¿ ¾ðªH"&~(ã¶´H”ÝdæÎ̹çÞýíüúýý€<×qshx¨#‚y5˜:R˜#‰ ‹:býÅ#5äc(è4Uâ’†e &ÚÜoÈ&Ûd˜2í0äBznx¡]ks—NvâÕO¾lré9 kN›d¦tÌŽçˆ êÒ ß·)s ³åֳܴ…íH.ªRp»Så’âuÑ&·Zöžmµm¿a••Ó*u±æùž|ÉÍo¶i*.§í~%†…ü¥$²ôüÆjá>1êmàɶ5” X˜a˜»¢­òuÐõÝWþN}/Cn$©=ѯ÷EBÂ@9ƒÀ?10…[ ™‘~ý‚Ú@9‰´iÜaxA”JCJ¥!¥’¢Tú/%YÌxŠg} kha -,ea]:5jðM­Åɼ‚A«¢bwv\+ÛÝâå˼ß6EðAÝ…¿v¦]z‚»CUiËnØû »„,I·t=SŠ EE ·¡ž˜B5\Ezçwi}¢Æèf‹'˜8„¶Tvì3gˆíœ ~^Ì~ƒþu`CÌH¬Òiéâ)Ø—­3DH]:Æø9QŒ÷Î/˜EnPp¥·˜‡HüD2mœâÆÎª|â7÷¡EAë×ÅPK½\C7}Ùj)com/microsoft/sqlserver/jdbc/Column.class½W w×þFid1€18Æ–)°È²ŒHšBkb,ã bœ`¨&éXÛi$F#‚›¶iÚ¦Iºï-éFBÒBËnhÒ}K÷toÿKOïÉ’glɧNuŽÞzï÷¾{ß}ïÝyå?/¾ `?þ݄ȱç%èAxqžG \\yìp÷"·fƒx; R÷A¼ïâ±Ç‚x7çÖ{¸õ^n½[OpëýÜz’5žb§¹ø@ć$|8€1ŒÂÇ$|<ˆOà“<ù)ù4Ï}†×þ,#}Ž‹KÜ}†[ŸgÌ/°ð¹ø9ˆËøJ_幯qñuž»À³Ü¹ÊoðM ß0fójB›Ê Ø;”ÊecÙtJÏrSF¬p>SPõ ª;;9‘ŠÚ‚‡‹ùIÅPõÑÓv®¬F2¤Ñ4­eQS²ª€–¡³Ê%–Q´éXÒÐÓÚ4ËÊDF6üSé éè^y…x.SÌjƒ¦0AlàÁS&A¦,@HXGëV,í w5l«ÏM2™»ÒZÚ8,`8Ü ªÓ<çH¹£5ì>îKeT…¬÷†¹×T8—ΟV2Eâ­Ga 9¢*“äqV ½˜RóF:§$|›¡TcÐví¾:P5¾e0º0\ÌdLZã>äW›U_8Ñ(­®*‹ï›8«¦ rôIÒ7‡‹F:‹+U›TôCÿæõ8%´|Ñ §«Jö3BèÓ…CkÎC"7õÏä¥î†÷®«Ÿ¼Mz ÍX•ZÂÚ•äLN_b’މu°í=VÞ‘jcV†KžJšÝxNÓHœ‚Î ›qW¨5Î(ëÀ¬O)ZJÍTúíÚdÿìÈýqÕwÆ=Í¡¾z" f²95£¦ÎQ$)¤Òi+®ÜbŽZŒj&¶šBPF¡fJ ›gwK°?­)úly¶­ ±v¦½ÒM‹Àâ3Š®¤ÈÎòLGžc²³Ò1½Å˜ÑsXÓòÄQ]ÏÑÍÒV³ãö½F6É8ˆ7ÊÄq·Ö{9dB¯Œ»Ð'ã0 —q/®Éx3î–q#ž“ñ|WF§%\—qÏsç{^1‡’Œ3˜çÖ‚Œ1|Ÿ[/Êx7¹õâa/±ÒËx^Âeü?&Lö†zшP eZÌéY…ÎÔ¶‘‡‹Z¡˜ÏÓ S'-ÔsÙÑœŒŸà§là1ÍK#\ÂÏdü¿ñK.~…_Ëx¿‘ñ&¶ó·øŒßã2Ž _Æþ(c Ó2þ„Weü‘ñWüMÂßeü#t\«BF†Zû,‹ÿ¯ «7_F–'þÅ[x[o€€Xcg¢òÚH6üV®æ=»cõ7:et%¨SJ1cXêåîOƒ€Ý ™d_Â)z>Ì·’nåç‰ÿ×k´Z¿º>Z] g”¬(ù|f–rȰ)áŠ>²Ö±Áï¥îçjí±Œàjí±“Œäj=…̰b¤/Ø™«LýÊÅ!U›6fìYùºT …Õ(¶wÒhß×£¹E@¾ŸŽôÇ-p?…c‚s8^….m늦UÜòQ·\}ÇŠtNQ¼ÒƒÈzÉó^r4W^¢5œpEl%ŒEº‹òþ)ûæÝã^®H›³Ê9ÓÞ=Íw’õ&eêìÛ»¾bÚ²lbo^TB%9~¼Ñ¨y Ó$þ:NÖöGeÄAo¸ÄEÏøkœNí^ŒcÞËêШI–·…þ`rÚ)-2?ìøXÓèF¾­OÑ­–Q¬Ç«§ÞQ-^÷º¬Ån³³+ç[Ì øŒ/krm2·kyA~ß-1ì§þí$x8‡S ª[8µÿ(»2ëÃvM™•)G9ÕhFp”z›¨¨öE^€pÖo÷ØÓÝðB¤z{džÈMxÇæ!Αt÷„HtþHϤÅc¶âRôPÝê¢è·Ä›9ù³Å·Ø4DÃWB ,q/††%:ˆ‡—ê ,Ád»;Kh²äNÐ_$ýaªïÃý6f i2?¯,#R†é¾æºk¶IŒÚk¶Ág®¹.Z€,DKXݱ`§ªÄÅŠx´gñÓ¶xm¢ŸêÛyý›T†h7ÚÅ6öúj¯ ™«v_¨„æ«ðµûœ gðtfÊ;+n*aSŸ ľ ’ÛZ®Bì¼æ@Ãø (›—¢lqGyo]¥u)Ê-î(â!¥ÕöjS$ȧmÎ=§„ß~’< úQË[ø¼­>«ÝN›ÒqwÞDh¬¥sÛæñº^¿ï%lóÒÔ­É1±Õ·€É^IÚýíR ;q·1á]ÏáJïâF E{x«vGx€ÖØ3‡½Nzo«„\ÑäÛ`b^$’õÞrà)•ãÐbËù#­V>]HÙfD“é“n››xÃfä§ÿ^Ûv;¢¼ÝÑm%„—ÒjÆ$-çY²œ8.§¤ê"éu‘ôðÇ-·ÏëA¦±€H_ç%ØA¾uÝ—Ì ªž¾Îg°)bO¶ì Í#æ$1ãNw¿S2íN×!éá+[rñeÑáµøÞ~¹ŠÑîŒÎ¹3z½S2ãÎÈ!é᯺eÝYÍè nŒ<üÅhkÑ©áËåîšp9Ü{é Ùv ’—bO qÄ[}3£I ~±ÝW~G4ÿPK½\C7‘›”†åm/com/microsoft/sqlserver/jdbc/ColumnFilter.class}ÁJÃ@†ÿ±‰ÑZµíxkÖËzW<´( "ÞÓí*6Ù˜¬E˓ЃàC‰“D ¸0üûËìÌÿùµûpéœD80&ì_™Òøk +B°pM³ª²¯„Y¼Ì³m&mV>Ê»u®•¿LDŸ†7/JWÞ¸²‰0á⹘·’Š´•D$# B¹BFÕ®q^6O¶ÑõV×2߬•\8û\”·Æz]Æ'ä¿íéý2íìÏ:Áö8p{B.^œšoVjéù;è Ý"0<ì ‡êÈQŒzäø7¾PK½\C7#‘æ”+com/microsoft/sqlserver/jdbc/DataType.class‘ÍnÓ@…Ï$nœ“¶IS’B¡@ÿ2!rÅE .šl‚¢V(Ut5qMê(±[‰Çba!!Ôà¡PïD¢,º9Ç÷ÎïÌŒÿùyàE”ð¼€"¶Y^°¼dÙayÅòšåM»6ölì ”õù·ÿTÍüáçAç@e0QsåNU8v‡I„ãÔ|85ôã¹ uwª´æ®@ar5òxH d.û¥ÑÐW±w­FSZ_h$¡e³…jš¨xQH Dá§ÞI—7 TÄ÷ÃÄû1åç>a œþ{¼Çt.ûÿáö›V7º¢ÜìaóÂAÏ8xâ Ì²Ê²†uTl⩃ Ô °çE3wxq¤£¯‰«o§Ú¼‹ËáöT¢Zû›{6šø^‚ðl¢P˜V^úêÒ)Ô8å§Tãtò }ÕÑ Ý¢ê=Õ6yKþ€­ù6EV¶SX²a¥X‘$9ÙXIaËZ.Eþ;`ptß%¤c @Û@*¦°fZÒúUdP–A$y)¶ÀàPK½\C7ª%}K1com/microsoft/sqlserver/jdbc/DataTypeFilter.class}QËNÂ@=—" ‚‚ŠùP“š˜c|JÀ—¤BMjJGÛbâ7Ù+~€ÿãc%Þ•®œÉÌ™sν37w^>Ÿžlb% ¹8–âX&¤›•²Ö==©wkgz…@:kšp<ßpüŽaMe4½fÿϵ£RKª„ìDí”Z¿Æ;!71êÍF-d¾…ïªÖ›¥¶Âuű=˱ü‚R(vQMôMBRô/zmq̬ô¢žBYÂzO ÔÕs…'.}Õ»±=Ó½5]õŠÔŠáí»k³jÙ¾é6þÖ_öpàŒÃ¹KȪ¦°Š(ï\³âÌ!>Í<â3ÌS!žf>âs¼ ËgežOI¾³özÀx,`ñÇn0Ê„rþþÛ9”¡ò;·e+÷e¿wå‡0îÈfòÚÊ$‚(ÏL*ˆù`|õPK½\C7?è•—ÓF.,com/microsoft/sqlserver/jdbc/DataTypes.classµY |›Å•Ÿg]Ÿå/Ž,ç²ì@HŒãÇ&@ðøJ"°¥Ë'PW‘e[‰ŽÄ’C’–†Þ'½èE MÝÃiŒ¡IÚp”ÒB¡»Û ºËv»m·Ý¦w=ìÿÍÌ'rœ…íï·?ùûÞüßüçÍÌ›7oFòSg¾ö°b5}ÇKµ´ÂC+=t‰W8¨Ž_«¼"Muª/·RƒA« ºÔC^QB—y…‡Öt¹AWt¥Ak ºÊ ¦b¨› j1¨Õ « ºÆ k j3¨Ý ƒ: ê2hAë Ú`PÐ ë ºÞ nƒz 6h£A7´É ^ƒ"õ´Ù  ºÉ ~/²…G³•;º™á-\z ë¾–'e¸Í ËAƒâ,‡ø5lÐË„AÛYîàW’_)~¥ù•á×N~íâ×(¿²åXŽ´›å­íáŽ÷²3öyéuôz~ÝÆ¯7°oê¸v?So/¦7Ò›¼ôfz‹‡Þê7SAocùv~½ƒ_ïäêwyèݽÇ+bt·~¯Aï3èý}ÀC4èC^rÓ‡½b;Ýá¡°ü(k>æâìYƒîôÐ]}œ }‚ñI}ŠDù`4ìÝïŒgc£‰¹D&M¢vkw,“jH%b£™lf(×Ý•ÌÆGwÇG¶n‹5têFÍ$ä³W^Ú1eeמÜh4Û‡ ’˜Ó‘IgsÑtns49Ç@„‹ÄÂÞ áM‘Ím›"ý»zÚnèØÐ¶©ÕsÌZÝÞéâê ¯%17éº)bkuÍÙ³gIÌ ö´­ïÈש&ûeÝ|VœÛ¾²·uw[oï@G¸gcw×Myl[B+¥Œtõl oRc(ÊSÙU}J途rÚ/NcÉh6‹ü¤“Ë’plݺ»µ¯·kÓ€o¤Ãp.‘Š÷梩ð–Ú°É(6jonû•s•´YÍ5Õ\S­j°Mmìæ€\Ü»7‰çXÎr[C¤ÂêŽd~›7Ó\ûÞ\ l¦:˜ÎÅ‘)Î5ÁxÏÕ"B»hnVÍmþÌÖ%3ÑÜ,ÓëÌŒmKÂVÀV‘ŠæFªÛÃñX"MÎ2‹î »äœNzG2£¹YfמÉ$ãQl2Ott4º·ºýܵKwUØ´‰ ¼²s,‡ˆGS…ƒ@ݦxtænI¤9¤1GíŠÍ$œ™AL§x(‘Lòñƒ°X‹¦u¬ͤBÑ\bwœë"N¹\‚™Ú`0¸áãŽçúp±Z®3lÖWà¤*CMxÛöx,7ÝlA­-,Te³${»öÄâò¨ÌzèÓ$–²`‚«VÀ6ÞHfz´öf$.>ÿ¤Ú²±DÂòÚÊÚÿý˜æ&ÁôP¦™{®9¿ÑöD::º×²Z}~"ó­³î$.áù½êKÃ"[[ä£^É Ey7,”k5Ûîg]U ¥•ÏÐ×ÎnÆ‹ÈÒÒË‚±Ú'j%†r TMwšáÜHob_Ü®å¯j0¾´=ø0cÕÅ•¯°HùùÃçi„¢ªY ÊHd{Ãéø ŠÒ-R£Ö 93‘ eÒ}éDLî o"‰§vfFyKû,šÍ‰l_:;¶Œ\|pZ?'‘]—Ø´&qÅ?2Zš[í`oí¹^_1K~5ZbI¹»=t·I÷„%3X¡Ln]f,=˜ßn$.˜¦„2’ÔR¤ÑÑ̨)^§Mº‡îå]ôj¢Ñ{ÜéH¤‘ÜÊØz=[¯Ï'í²éµÐgøõY$½\"½W¶;ÝV§J#‹›”•s’Hª»££Ûôê¹{‡áþ¢­í&¤Ïa;iF [ ë‹ïA3ŸÍ¦ŽHWZU9Ñ“oâJ+i¤ó*·Õ]±­kǶDáLó ܉ˆNLD,ò`Õ‡]ÏɃË/‰ðk½ípš#'=Mò æIçó§Þ~þ¸R™tãò¤ÇRØ™8m]Cª[Ûì­“Ì+­ë¾±tb×X<1OçC ^,GßÖ{RI9ûaéüÒi;|¶™TJsMñ_â&‹×™DTdÒçé ¦øµøISI_¤/™âwâ7˜P~–|ê›â÷¬´™ä`Š? ¥øc!Ÿ½bŠ“…J>ÝMñÓOñëy~ý‰_æ×_øõW~ý_/lÜ.Gð+Ë¥2‘©·£¦xqzp¨RǨItȤ/ÓaMšt6iŠ_÷óëqÂïïöÐWL:BG=t̤¯Ò×püÍÜÆícCCìäRÞ7Kҙܒ!Þx&§ùõIÓ#&}Õ‹goM¸«bÏÕqmÒ·èq“ž oãÌáv£ñXf8$>Ø‘IŽ¥Ò* m•çc&UŸOõùtQÏé¢ÞJY“ž¤§LqFœVM^9Ãà’Ñðêrª-ÏÍ‘ ±?†2úˆ,æ´ÙË¢\g϶‘‘ÑÌ­Ql”‚„;­Uç.RáYrô«Ñl vŸ“ ›¥Å’m½q™vä6¥-œ4¦/YÅÛõq˜egåq”¿ ÄäI}î=‹LÞB²pÈôU>Ëø`Ô¿1È«bð•’¿u1ÂÞÂQ>Gp¤³W 'ºÇ:ýYVóäWÌ ÔÂâ»ãÈ?Î`h]×ÞÙ~:`߃Î÷«‚ô•?«jÏkDž½Ñ;ãéÁÑ0ËÙkßÇè¾r¶+R¾ÖÈå¯Aójg½J9Ò‡ógëu3'ëëj¦|‰#Ú²XóªFŠ>ÜCzß×Ì%³µ(OEwÈ»`'ßóFå½€Dò¸ØœÛá«Ù$[xîŘ®µ”õçŸël?(‰ÕâV‘ÆWÚ ðòå¥EbŸx ñzþ-n~ƒ ï¾Ý†ßü&~3ð[lø­Ào³á·¿Ã†ß‰~q"È~ßcÓßü^~ðûmøÀ´á؆?üQþð6|ðÇmøÀŸ´áOÚ†ï>`Ã÷ßkßþ¬ þœ Þ†¿üEþð„ þ² ž´áû€§lø~àlø+ÀGlø(ð1þ*ð×lø8ðƒ6üðÃ6üð×møQàoØðcÀß´áo?nÃOÛ†Ÿ~ʆ¿üO6üÏÀÿbÃßþž ø6üCà§møàÙð¿ÿ› ï~vF¼ý» ÿø?lø'ÀÿiÃ?þ™ ÿ·<Ç¿´éÿ[įĉ<^& ¾ùÿ–µú]ú}úCúc:Y€ž+@§ ÐóèOèÏè/è¯èoèïè…ô¢ UáÁ×$à—Q*ƒÄÝL¸Vîû4ýŒUí\!JDäâ2Íž–ÀCÂs¿0œzûžpÏ”0|5Ç…§ß_Œ·î¸(é÷¦ó¨˜Ó+I¾Ã!fy%«Ÿ¹«˜å{±€f„›œL+‘4>s+œÌ3,šKZ;îw–yž7¹˜½T²Ëü~y…KZ= º‡é²ºÑñ1O6,’íž 7¹¹b™l7ß¿À¿°ÂÍíŠÐÌm5[6K3WÄt³Ehæ¡K+æJâŒÐ¹%ÜäcbF—ù«ýWø$ñ]–ÿM]]ÃÕäÊ·w‡›Ê¸~»¬_ŽOmE7wtšŸiiM[šŸ¦ë]á¦r®OÊú•øÔV”³WáhÂó˜—’¼K𩫘'G›a®.ÕݬšÑ –x>×Wëu©ÇÊÍ'›_7-+ñœf4`%íÐË8ô¹­Àu†û]ýn¬z¿‡÷Ž!t¡¤ŸÒѼ-$GÞÌ©épö½nZ%þvJþ¥ø4V,’ózÉš—J‹ÄY:«¬á‚l T—!¬Yõ€¸¼±ê˜¸â²»„Ë9á¸Â9ß Ý•ß+Tqa¾³þ×¼ÅIãgå˜P6ùÛ¹¶ùW©~ø’¬;gÁÙ³g_€|òEÈŸC¾yò4ä!¹í/ Ï@>yò!¤­oÉ@à,‚ÿð¨”û”“B+…*y36èíÃ[å"òu:ä—ûŒ–qQR„—Ûwº©)áŠÆ@a*¨ºW4LÎw6+ué±é Xœ/½èzŽÂ˜v±LÓªÏ —cÂÑZ¥óÉüªt:)ç×ù­Tüÿ¢¼T¢mÞ ¶§ ÎH‹¯ËàEbf‡9&pæ¢Pêc§÷IM%J›Ñy»]ß-J<,±jÎqáÌ›7óæ;až³ÕZig2ì/ô-Å» yÛÖ™Swæ³uæœÎ'sò·è‡fð)»±ÿëÈ þ¡U÷s™îgyÀWƒaUúŒÂ«Ž•fˆ@cOÝãÂU7ÉgÌQqã¤6à£2m …朘£ç3Zõ¸X„Ó·±ê€pû—MbÑnšœýSb˱õ.Q…òqq3º¸Åÿš#b pD¼öˆˆÛŽ‹X¿ð¨ˆ[]ûóçN›ûå>7Œ»}wøp â­ò^qÊU‹r)#Žz\U*î~–wE9ÍÓæ‚Ú\ëlæjµ¹@9S£¡IiõYÿ 5Êù´@›½OÇÆÁ€o-›­™øö[…5\(Aa5¼(4qÁD¡• öq¡….¤Qhæ‚…«¹B¡‘ #r Ê+ÊX¥Ë²ž9 J*=–åt±ÕTÁ¢å•…–Wè`w ºGîô¼–áñ¢Ì²²Fº„Ì"J!{ÕáK+ —BîPmhd5äíhC!WC®…\y9o!ÈFÞýÍx¨²r=¯äÕx¨ 6éÍ1È8ädävÈdòV§‚ø†Ü ™€Üyä~HΖ!ùGžqÈ~ÈC» CÂ6_nè6È“h‹/“‚Þy òþÒI¿oÒѤ¿fÒ_lû«–—È¿òïB©_%Ë©aÁ¤Ѥ¿bÒïŸô_0é_<é_>é_9鯔œúIÿð¤dÒ¿zÒÚ+‰é½bEÞ¢üþ¸]ßËrú^¶Kß–*wÈeL)²;Ø…Ôx\ËCZÖò„–'µ„ Äå±Ãß“ôh*ò£9¦G3¡Gó$0²'‚ø ^üª€ïW!Þ«B|J„ø„ ñYânâNâÃz&wª—¼Œæñ¢Ý«\¼ÛgèáòGò•OªT÷<‘ÃQʇéHeN«ž«‹íýþÇDò¨H59‰t¿ƒ¯á•¸…÷6¹VR…³ÂuDdÈyLìôïB\¾J&öÃxŠô]¸R¯OEÑ„ïô„âÌ<ø ª¢Åùõ-Rë«Òm@ Ú»¼ŠÕö7j/Ç´ÇûÕö½j›Èû0¶‰Ð^Ûª½Õ^êsNÌüä=sA~4Ýz}¯Õ#àuqéh»RÈ/®ÒÑu¹ŽªËtô4Ïbù¼å5Úr­¶|±P—šeú×’ãs™ÍÂ’¼…:ma‰¶°X¨o¦ö:ÇF¥­åEù–«uËêÀeÝEüýEg¹P[ªœ1ò¥ùÖõz…––y¾¸Ç óÆß &v«ßÄÿPK½\C7qòÂØš'&com/microsoft/sqlserver/jdbc/DDC.classÕ9 xS×uçØ’žüx€ÿÁ–퀎,ì’†42%ñ/±± Ø‚DdûوȒ‘dbò Í ! iJHÀi»xKY«„NrqJ»%Ð¥[Ò5K÷×®ÛºuI³î§]×­?Á=ç½û¬'!ÿdË÷­î=÷Ý{î¹çïžs.úÆ¥sç`5ž–á>˜àË2dÁ9 &e°À+|Eœ—à«2Øákü¯ÿ¡ 2¼*Ák2,„ \”a1|]†ƒðG¼.C>¼Êèßà™?æµ?áî îÞ´‚þgŠ÷~“»?åî[Lò-îþŒ»·¹û¶ ÷ÀŸs÷üùwßäî/¹û«¢þ×<úwßåÃþ†Gß“a;ü-ý;>ñï™ãï³8ÿÀ ÿÈÝXªâîfô]~ï1–áGð/ü« n˜°Ã¿1üw^ù1¾'ÁO÷?d¸‰µñSšà?™âÏ$ø/ þ[†Vø¹ àüÒ¿’¡ÞçõK2L!ä bè³Ñ"¡U†n´ñ´$¡]Â;Ê2lÃ2lEEÂ…´ñÞÅÄær—'c>P—$,”Á‡E2ã—b‰„¥2¨èà2˱‚׮஌i-ãn9w•¤?¼’´‹+X´s2®Ä*áU Aó =Mmm<— ߥ†CÍ¡‘Þ€Šß±Ç·ÏWðëô¹zÒ4c´B¾(Bž A›¢õE¼ÞèlVûüC¾B±Ž4ä‹î®KÎfþo´{s“˜Ðĸ »-UÕ0aÛÖùƒþèz„lgõ6KS¨ŸÑûBÁ}j8*ð<¡M½{Ô>bm©³þT›ÔWˆRØÓ &7,q¶Ï€Ÿ—<ÃjÜU#Ä ‘¯ÞшP(5ñÍÔZg –Ÿrº gu¶kÔŠÄ¢®m3¹æÈ-;’š&êpfÖ¼ÎxI†Æq53íÌ̃ÁuO4ì7«Ôí4aë‹õ—ÏÌ@TníS‡£~òr2A¯?è ïßܱ9Iý9gG_h¨nÈßEBѺÈÞ@D #u{ú{ûê<Í=ݪ¯Ÿœ§mvĶàðó®ú†6¨Ñ¨nFêgßÓ£›=ÛÚ††õX4:Haø ¡¦®PpkÐßGþK£Œ –HžýÃj[p ô$zaßn_Ø×GôRÄ{mÞâýFK·`P6û¢êf_˜„ªÊàäÕ—OéÛ<þ!±m…Jî­öG:Í1ps˜`„\~S¸§ÏÇ!¸d†›X½=yítyBúI+ŨÎ𖌠Ù×õ´˜ªÀ“pœ.YG„SZÀ ,6mÞ GyúºüÆP( ú‚¼°–ÄxÆ%<¤à'ð„«gç×OqF5ÍÄ”ð!ÆÃ>¢à£xáºY©4DúüþV Ê‚¥{LÁ£è•ðqŸ@rãc왟Ä'<ŽOqG÷ï|’ýûS>­à§ñ»Ú3 žä°P0­ŸM&o¸ªûö‘ ::L!‘NL®l‡úÔHÄtŸeŸÃS Ç8 §‡p(œÞ0¯?ËfUHssSŠ¡Œdq¶iÕ£³GÛuÐÎÀ¡EÎÌ!³(S°×(4ë •AÑ˼»5sfèר€©¾m¦à: ”ݾ;I7þhD'O•¿¬-%±[™rsFÊý¢$2Š :ÍÕíTÃFüƒÁ‘!‘µFô”c¨Ñéìc¨áòê}áHPÛÐ/Y꬞±tªƒ”/IÐhh:0Z!j÷ aä§—¤d=ôÜ 3ûÂ$Â,É¸Ï xÉ$^¡3£J,4 ™¥}Œ»i`î>ýòY9¢ñºj¼¤b梨e[V`@ FwÓ€ «áÇäáÅäÀ&|‘†çÁCsŘì6ülII8ôðFpμ7³Þœ°š5W¸rö­ŒÄ‚û†‡Õ`òE2{•¥‡vÚ'‰Z aÃ5g2+†‚A Â2¼Q´ð@4Å˪87ìË2átRøó ÒÑõf,Q=ÎëA¤%«sG#ÃU³²OõuJ&•‡|w¨ÆGâCª·?Œ:úHAö»æƒóÃÑC›â×ÂòY)lú”zÙœžÐÍê¨ø—Ö3‡þëÿޤ[PöGú}”÷_T1‚+Y ›ÅÎìv—Uó<Ë|fÆÏ!ìáböÒƒ´~kgGŠû,d÷¡IãûÜÿ#J•…,öØoÐaVÎëMKÏ2 9SS(ðéµV­séÍè$xõ¼‘¢ä´ú"Q­ŒlÒ^•m•2)ùëš9Ù苘+XMZŽ„M”¬¨˜@X7ÿâUüÏHŠW^ÙI^9'ÖÈåe×jöísœÏ)ŽDîòñ5×Cäö«£\bp¶æ%2Ò¦ØÙ–9Τ9FµÀ¥²L„éhÊŽ’s=ž£BÍœ­}P„˜SˆÙ–p؈{|ñ[á¡æ°ŸqápˆÈþwÉóä™+lÞìÒÓ YÆÁ’‰fìÞÒC#Ù[:  Ðx¡·ôá,¢ÑboéC È•:& /f-ƒÅ“/P b cBèOà !ô»`Ó„þ®ú‚Iè£Bpè‚h_3¹‰6*pã¢IÃKoGYž ]œ,oÅaCüŠÃÓòçT?‘¢Ù[1…†ØbW<ÂbÓZQRj³€g ©Ÿ“BêZaêåŽWìŽõå^KÿúSPXS^šSŽyJsíwÕO½Wcl}ž[ Vmë»]aoeP+ä-Ñ^7ßÞð¢Ia!Ñâixéí(KZÉ‚²Â* «<2­°•OHó˜ÊÇ ©œ€bCu©8,aÒÒR‰}†qº¬ec ° kYµ†NÁi¡ÕÂeVäÚI{¹vC}E5å…Prðð1OE®ýîǧ~8­¿1x^ìþíæ_0ß÷-“þXoŒs–çE{Ý4æöÑŽÜQÑBixémŒ¯2\ÆøˆƒÃPiÕã†J«ŸV颪§ÓUZõ„¡Òª (c•,gção·…]p!ë¯Ä ,±:ø |Vè€ÈQð8éú:XI‰5ÙŽcžK¶g»âPñ¬8s=}\ñ,串ã°l#},w[ÊO€\b‰C¥ÛÂàJ·µÄzÞ¶‹¨d¯µÕÙ°!ï"zÚ˜-»ŒÚ+eaË1Ï÷¯•Ф“d8Y$]ëy@šŸúÑ´á>¿-˜þ1™<üpü7M†{^ãËoH„…ÂKAHÀÛ…………………u/ƒéÚ!>=' t¶RÝFq.ÿ–Üš¯Û:ÎÓù4½Ý«ÉÀ+;H>^)ÎàVCf+‰Æ;n›€ù·8xz>ÓŽ¾=ytšŽvͬ#¤sŒêµtëŸßÖ§È9|+'Áçu9J,¼½×m#âÚ!KjâЇþl'U³Ó@Lئ¯ ’Ôn‰³ë‚Ù“‚DJ’¶òKl¬¯‰Ô4»c%Ui;r ™å%&k`=4\Æö(Xè&>JlSÀ½®Z¾­]n+É­)GLíI“c“nr ^pJà €ŠÙäØ$LÞžïÐõAWmš±­Óƶ™m5›VîwKºN$“Nju½®JÕ«•õªS–<†ö$*K9H_3Ž*Îp”µVø‰-&NÍ×OX@nfÓ `cRìnL­¬V@£ï¶‘W•M{•Mó*E ˜pŠŒóÚ0'ÍH¥üSŸH–Ë)–qä/rå.‹Ãë²ÈG­®˜+Û‡€~Kù>^)ЋÓЖ]q2’ÑYzNèø[›ñ[ÐE–Ï>ù,·ês`µœÑ+†EZÅ@õÂ8H\6tèU…d­ìXõ2ã:%"ÿ¼Ñ7c/e'ÎO;5òËrÐ]qŒƒ-oñØ+ÖNÎæ© w¹j²kÎÇa¯w­å,®­É.¢ë¾…j@:9RK "Ö‰˜?2ûòï$·Õ®¨Ð Ñ5Ú)í/6·–.®æ `¥ÿ³°Ÿ zÐäž…»8ýÑìÝg2á=Þü{pà,õ§üPK½\C7WÈ|– Z2com/microsoft/sqlserver/jdbc/DTV$SendByRPCOp.classµWy|Uÿ¾f7“Lî¤éBBi-!Ù´&V šbi7ipÛôÜHÚZ&›i2ew'ìNÒD¥ˆZµm=èZ<°µ9hñÀñV¼ñ¾o¼Q©¿ßÌìf¯fãæ“yïÍ›÷;¾¿ëýö±gÎ=  ]x=ØŠ1=çÕ!&x˜äáÅ<¼„‡—òp‹ŒÃxY)^ŽWððJ ·Ê(ëd â6÷yçO«KðÞ{­Œj¼NÂí^/£oà÷#Ìä<¼I›eÜ·ÈhÀ¼swóðVoÃÛeeî[qŒc¸WÂ;$¼Óƒã8!£ ïâáÝ|æ=¼z/÷1ñI ¦KØÞ'㿞â×S¸¿þ|îý> ãƒøŒ«ðï|XÆiœ‘ñ>gy˜âaš‡™RÌ2ôY<(ᜌNÌñöG%<äA7.ÁÇ$<"#€Kø„„G\Q5¢ T÷TÇÕ¶°n š1=:¼^@Žª¦>®õNŽÒ (1ÆÌ`H Ó«¬ÇwŒ™;Õ˜¡os(~}L7µ˜@sOȈ´EôP̶̈øÍá¸×bm‡Cm½]Aû$Ép…ŒhT`íÂÁ]=A뵓Nk!S7¢DëÖ£CÚ„@±9¢ÇWµ ¬\˜KWoQy‚“QsD3õQ^­GusƒÀÝTfÒ\‹Eú¿ã ´ô‘y:!²¶¤Mh¡1“VK›ó¨Á'åÍ!m”)ã>-Pã$ImacÐ>U›NîŸ45{»>};5µaRÙú².M¯Ñ a;åÐu©æ¢é:²äÅM52ºXâºtÝaC5íý £ucƒa÷E·ˆjŽ´ùõá.-¤GÔp[õICg Ž13 ý†ÖTljÅÍ{üÖ"Ý'þ”OÖ;»ºA¦¥ 3cšY,æ+ç©wkêPÁPK–;1Õ¥PÇÂf–•v ¤8ä“ ú1 `/>£`¶+Ø vñ°A½¸NÁ üÚ‡ë%|VÁçð˜„Ï+x_PðE|‰l–‚M‘ž T_ÆW|_#ëY'LmÂlÛ¦Åãê°ÖmÄÈ-»÷ëÑq5¬õhÑasDÁ×ñ Öç Êl… V¦Ïøà7| ßVð<¡à»øñÌò „ï+x?àÓ?Tð#üXÁOðS?ÃÏ%üBÁ/ñ+ ¿V°7Jø‚ßâwT4-.c¦NFE1:¤Rík˜gÝVãñN5n¦Kø½‚?à þ„§ü™mú¶Ò_YÉ¿áï þJxš_þ%áß þÃZ=ƒó`í–!ÄÒZ)Â%Ü’(V„$J$áQ„,J¡ˆ2E”‹ ETŠ*IT+¢FÔR½]0FÒÂ0¨™T¾6ņã,¥NKE=Ý‚ä#t-„ˆ,—ÅãØ)pñîýQc÷ÎÎmêè(Õ/r4_1Fx,BWAUN%bÉËVŠëUAò’8ï(ÍxSTXc–G´¸@K!^›íä`ҶŕŠš9Ášw5PÈâ)j×sÒ.O‘ÏݰҸ,£ÊS± [Yb)±…btX3³üA›Í-ÙEƒ.wÓHʯM~Ïìj"êMZẅtÅt‹¤}¸ÀÕ™ïnË-4‹ÌxD’“ª6å1U^åëòä¶y‹U£8å¦)OÌËÐ­ÙøSÞ³-IÝϽ7oî-¶óÒŠ_Æä=jö©á1Íò_€Õ Z^N…—+Ë Dˆu-ÙöJRÚòÙ+»%°èJ“t”„#2Ù2 Ž{jTN÷¸ÕCöj‘Q#¦†h e =œùö¸´P¢ EÄ|ÉŽ^Ç…ÉòiUëÃnb—\Lµ¾ièp)ñ D©ùˆ†´y¦ŸiéÉ­þ!º÷)$b`#¨ˆÛ«@t›ë¤`ípWXAP•´tªßð]ÐÞ™2KwZ¤C³Í¸:·“¢#Ŷ«Q#ž”á‚1e÷S–ÀЬ]råžç#·›Úe…xRˆ}g-”éí™%§€ó»:ViTvµ¡ø6u‚eØýÛÎÍq*4;bÎÏï=¹Ú|_Èz©ÄIÛ\sAåsZÈÌìã^¤`öYMfföùõÂÙ—l62¢‰SyS,¦NΣO§ßãϾ?üÖýQAñá×£jl2y[Ô§Ýé ªhVñ¬™¯©Ïûªƒ‹ïtó6#6V®}h§ßß=JèÇ;5¨´ªæÕšw93uªÖLͪ5S«jÍ78ߩŅÀð_ ={±Þ_D« XÍk}­S¾,ñ­žB‘¯q ._k n_{ Å>oñ$_]ÉJ|^i žÓ°ÿ¨g$Ìë¸QÄò|géèYµÒPÜ0 Ù>«Òã"¹ƒUÈ¡ºaÆ=~Ñá­÷aOëƒ(ðÓ¤ÐO&wµÅÄÊ#¼ÅÓ(E³¨XQ‹Ê»îEûªû«kfQ;ƒºŽb×CXÚ_4‡úþ3Xì`-$o±Wš†w%õòºW8š]|šô‘áEÊr4r4 Òž‹ækY¹+*e¢u‡§ò醸l ý­Óh¬ÂùÃwÎà’íI!kXÄ4–ŸÎ°Æ4.Íg ÍÕH{lª,¢ùˆ8DÐ^1ÍÇX±£XÉÓ,VÞƒe>Ñz’H@"ŸåšÆªUîk<ŽŠÊ½ŒaOã j?;\ mãêi\öš:\ ¸É^×I”žAó,Z:\ÖÉR/ñð%°Ôë"†ô¿Ú몒ÎÑîš”q]¶ÊÏN@ñ±ØFËfÞˆòå90†:0N/ £Í†q$FÌÑ· Œ½i0V[0Ú-•¥EÓxÍŠ3—9s9Ï×V܈î)Ü“ ƒ[kƒ;—î¸îÖ…ÀYpžkÃ)§åÕë¤|ãýv¦rá°žåôøéiH ½øÊ »ym!KèŽ%zœlÚX)Qþ,Í ô+hI¤bWqn=ïÈ žŸWù2â`4ÊKt“C´‰Ê+¶®uë¢$_)•KYõéLÝ6ãäc. Í†|D‘DËóE ]“È(T¶7æ£u¨î ¢Íeû–Œ²½É.ÛþÿSÙžCg¿‹ÎtÙ°6/T½ov]å¸uY žB)¹ cíZº›˜¶)EkŦ'r›I÷Y\{3j´î’lNq˜§­ÄÉMó5òÚÈ·»àþ†l ö»xIìJ\7ò{‡Ë2ß.W^Aõ¢"[„À§h-Ó¼ÇðITþPK½\C7“»py ¼&com/microsoft/sqlserver/jdbc/DTV.classÕX xÕþŸ-{×ÊÚ–;‰8 ‰HlÙ‘B€@ã4mdP ‰4 i+ËkGA–Œ´1÷Õz—–Ò„h9ÔRhƒ'%-Г–^@¡÷Aozßg;óÞJÚ•Œm(ôûš|YéŸfÞ¼÷fFyð¹{î°RïÅ-Èjøˆ†zQ‰[ùñ1/vãÖÄq›†Û½ÐYüq|BÃ/f)p?rü¸“ïÒp· êÝ?òãŸÄ={1Ÿbɧ5ÜëE+îcp?S?£ã³^úü‡òy _ðâ‹x€ß|IÇ—5<Èø+Œ¿ªãk ¾Îà:Òð0ãGSÇ£cü-ÆßÖñ ßeü=Æß×ñ ?dü#Æ?Öñ¸†Çÿ„ñOuüLÃÏÿ‚ñ/uüJÃŒÍø7:~«áwŒÏø:þÈàO þ¬ã/þÊøoŒÿ®ãþÉø_ŒŸÔñ”†§?ÃøYÏiø7aÂBè¢B•Œ=ü¨ÒDµB£Ä5¬æÕÅ,Ê’04Q«‰:Yýfr0<¾åÔžSFŒH2i¦{ÑLÆÌxâ#£ e›b©‘ÐH<–NeRCV(sv"c¦÷˜éÐîÁX¨wëéÒë˜ígbÚŠ§’™Þx&:0Äv ±jÇÙ?Ó8§QëíW©éÞΞk‡M«ß´,3½>=LWª©½£|Q”Åx¦o,‘Y¤ë2‹XÉûÌ4²Že~¸ùÛÛ#‘©™Ž >±¤õ1+žõDT¢ééýBs3i4 ]ÝŠ-/õ^tÐ ¬&ótý_ëvÞí»øÒÛï§äЊÈrÜ1ù|=æãWcî5cc–ÉÅ=6=ošˆHㄼ½IîfDzÌ䊀ÕîPR…º;‰lŸvÝg¤ãt_Äe—!T«J%pä$þ;&i*úÚXBV1Mø Ñ€›—hõ¥¬ ©±ä`¡,,ªô¥¤R¯9¤”ÒéTÚÀñ&C4ŠÙF@ú˧\ÍúÑQ{ã4Ñdà ÑLêõËï6ÉÀÛñïÄ» ¼WH¶|^1ÄõùÎl÷¼×ÀÕbŽkÄ\MÌ3D‹h¥ž[dØ­ÒóÅûÄzG:ù¬¢M,4p-?,Pyó±B‚*ßnÄM†X$Û/›¡‰# ±D,50ÆäZI¦UUó–˜WbÌš~{X³¡è¦åq¤sÜvTS/ÚaÌšË ìeÍÆ‚¦£Ñ7Ô Bæ,70Μú¢o{pdEJX»ÝÀ¹¬Ý$µy.:ç)±8T3¯ÃÀyÌ«Øf0p>ú¢SU!ëŠ>YÀº.(ÑUÄC—¬ÛeàÂ’ýÊOŽ]R"Ö_a࢒ÅÛ`‰¸Øv5|ÔºòÈš!—”l_a q<[ÆŒ•.uÛ—°}4Ž2pkΖšñTÐ5¼Hi(žrv}V¢ú¨?WàJJ¿AC5}.» Ý‚ºÀaèÛ¢ænh, t.XÑâi©š€W‘ßBÿhž,<•·ÙQÑ;ªNú¬ ÏE9øöc¶Û¬Ãh Ðï“M`ömeaÑtf›X…Ê °ìy˜ïQ l©ž@Ó2K×àýŽUN‘¢@gךËcÙ‡ý¶…“(NòÚç³ UVÂÁ†šúÄ JÑŠû1wó²ðªdµ”Û¿˜©}}2û­˜_°¿ ÜþqãUÈCÔY8D:ÁÊåÕêU^™CÛ¨o\x‹¶Ý‰¶,ªIBNï§ÍﺋšçœAœ×faæ°9Ûg›älcÎ>ÕŽêÌ,Öæ°“_§wJÅŽµ7Wäòz¦¼!‹Y¯£åõúCø°],Žƒ—þR=ŒmζfO3ÕÀ­Y?ˆØšš@KM`A³‡Ë…\pf©9ÿ+È6·Ì® C6F%UçªûdÑ÷ J¾Ï7Ä› ­i¥”S{Èaˆ—9¬–9$—94]ûíþp'|*=½ô9@cÆYðýPK½\C7Åld›¥/com/microsoft/sqlserver/jdbc/DTVExecuteOp.class“MOÂ0ÇŸÊËEßð†^êEb<Œib²ÄèŒOe(ÙVÜŠÑåÉăÀe,ÛÔI‰²dYû{úºçÿ´ï¯op»9HÁ–Ûì Èž0‰S©úÞ-‚t“·)>R{(ä¨R7ûä`‡x]l ŸyÝÆÅheîìѦÁ¸hPCPŠ÷n:¼­ZIÊõ'A#¼šÄž ]êG‘ÃDšæÒ†is»ÌöyÀ;bÄê?P÷Û-7·ªÎ bjÝñØ~ î`Zq9YƹɈø/Ó >l9qÝÕ8àÑÃ:ëÔf.q&xeò/£mbõ¸/&x¨sîPâE‘lýNÉžèß=iÄ”qiý`(dW)q§­ùèG}MI[ömJa!>Sí¡#Æ\ºlõ©V–‡4dìý—õ,Jw9@°4žþSn]™V8ý>ÄéÌÈ{1zJò•¿ÒH9*Ê/’ßÌþ  gc Á¬„sáD^…Ì+$¯…²¨%…²¬’BVRVHE!« YSȺBªcd6“àPK½\C7tÿþžV*com/microsoft/sqlserver/jdbc/DTVImpl.class­SËNÂ@=#`ßï÷cáÜÔ}‰¢15D£5,ØÕ2b±Lët0ú=~+~€+¿Èx 1H  ›4wî™ÓÞ{ÎÜùøz{°‹ÍRX5°f`axϾÚgHå e†t1¬r†lÌUÙ š´|Η¼°a6|O†qx£Ìø>ˆ¹|àÒ¬W¯=óèªlõg\=EÜ7¡e—êîƒk®¨™ç×uî)«Ò÷_ÎEÉÑi1‚è~(¬Vß¹ãGG­46°Á0^ãÊáJqy k1Ã\¾ð·©÷ã³fhõ†Qúê”Ê´:fØ ¼£«`“cµŽcŸ ³+v’-¢¦r”än㤣£mWSùYt.ª®LjþÚ‘sÉÝ*—VoŸH-”ö©-Ö¹ åà0>)¯þo\w|È0ßùQÛ'é¹%-P)”ÇF†a{6»Ñ4Mu[È`&ëΧ·0D÷´õäè¥ê c Õ4EF1³ó ö½YGtB—QŒéqLè8‰©.Æ4fºYÌiî<t\ÄRc+¿àPK½\C7ÂI‡âmH /com/microsoft/sqlserver/jdbc/FailoverInfo.class¥VësUÿÝ&dÓt(PZ‰啤” À‡ª^ÉÑ>­ U|„Uì`«?Á§+¦ KŽÌ±M»qAÅg¸Hê§O½ôï6­‚æÜ‰7ÅÚåpä„“è•¶Mi뱬<~Z7Ƶ¼žé¿S=*>Ç%*ŸiØ£#£äe_àK_ákýÿ³jØþoTìÄ.{Ñ®â[ŽÓeØÉûO$F½"°q:é~™ÙÉÎ Ñ>Wñ@lAê¼J,ìÖ3<ï‹rn[¬·(09éL¯{̜ۭÂј—æ%GÏ'¨7ä(KÞi{5γÏä¸ÌS;éNõu ´Ô’fn¾0õÝfRÉK¶á® 1jà ŽI¼^ý¬ª<»‰´bQTé[jtÌù^’ÜÚèð=NƒŽYÕëÏêÙººüà¬Ü®JòÒÈ9gÝÑã¡èFFNÍT4ÅõviÄ®ð6ES©š÷Z3È¥¤9²W› °’#tƒ+Z`s­§¡¦mË(òÕ‹ó[`ÏÂdkÔ ‡l*‘*ávYVõ¾›äyŽU¶Ò+fIx-¡¶ÄÊ‚vNv[fá¥s9X–II”¿¦>_áB<á> M5î—â5ÍÏ\E ÅÕ]öè½|±2éÚa ȱ’–·çäXÕ-ÃôÜ´Ñ?3` êøý!ªŽŸ w¦WÈwTö© ºœ þµO¡}?Í«âSñÖIÔÅš„/^7 ÿ x¿$Ú+ÜGà#~ £µŒ%¿!P†rÛyq Á¡)Ô*£¡Q¥!þ;ê˜^êѾ2(cYË=Ü:îÈ42îm²*Hó¿>OhÅ5,¯Xr™Œ¸Ž¿yoùÉ2÷‰>‘ô‡¯â—™ú7ß[¿§“aÿ™ |+“þ8/|a¢éÖ­«Züe¬Ž·ø'ÑÔÊG¼^Ó¿…æ¡¶)´”ñ kÎÎ$) 5>tOa]2àÿ‘!_Û@Ri-¥ŒG„ï&½ŽP儱~ˆ!éóOaÃ$6Þ ^Âø kéÞûèóÓNÅc?ž¬xåäo` ¹?#oÂ&¦ËØì_#|—ŽÞB¬ ÏôÓ×4…ø¯®ŸgbÀÁ ¶FÈ÷,þ»fztC ÒÜÐ6íÎ0%Iø šY-mo¹Bkãìîåf+ÆPK½\C7™;þ 7com/microsoft/sqlserver/jdbc/FailoverMapSingleton.class½VÝsUÿ]šf7ÛÅ–ð¹ˆu…Ò4€"˜"Rúaƒi(‹­ø±M6í–d7$›Bý(*ŽÎðâƒãƒo¾ £/–v¦0vÆ:ðàŒ”ã9›4 %Õƒ;³÷Üsî¹çüιçžÝ¿þþíwGñ•‚Óx] o(hÀYúÆY çH,‘Ð/c@Æ O‡hÇ›2†¢1fÎ+8„·˜+A"€ Upo3›”q‰™wXkLÂeûñ.k˘ñžŒ+¼ô>Ë?`{Jøˆ%†„I )`,»ë‹÷%‡GúF“±‰AhÊVÖ™5 #F^`g|Ƙ5"%×ÊF†â4 {N¦²F±Ø–rrm9+UpŠNÆm+^ËÍml›IO¦Ú†ÖÍ$-{*kºŽ-°£l/kØS‘~6BÖÉ9Û6]‹`ùO[¶åžhuŒ øú´)°;åØ)Ã-X9£07`¸Æ¤Q$ùùP¹¤[ ?½[‘t<)hž2Ý5Ð1;ã|ŠSˆ‘jˆ‘jˆ1’¼Ozl¿cÛfʵ{KîëúWGµ°i¾´éÏÿÒ§:Q'N:SeðFÊÌ3„¢„4y¹˜ÚëœfGz‘O§²^•H0UdÐ7h%wÈ)Ùéª+Öu•„ã) ˜™²R¡àTô ¢b Ó{6Â8WÊdLR±0C—ä ½½*®"«¢ ÝÇ('=ÕœôTsÒÃ9é©wT¼†¨ŠtªÈØc8.ÁQ‘Ç5 ä©WBIÅ,®«¸¬À=î8WÉ€^Êëå—®ž3òz©È W͹¨®b«øŸ tlù°T|†y/ãýúÚŠgÛH§õò¶¨Ní¡WOWîå=ЫXœ> æ&>Wñ¾Tq!ºéO4Nñ­r¶þÔãm£eýD.LÎP D¶Vð5м¡H¤ŒSH9ê$.¨~£Ä]¥»¶/MœëÆdÖ|¬×¥T¿F>oÚé û6í4åZâ2v²D`W¨nG’¬â`.ïÎyÝpBàèÓÞqêßÔÔÖù¸35e¬ùóŽ'KRr)¯’ß½uÖÌY“ŠÐ7KÐwB«·›5hó¾Í ÓÍ·Š<å¼1†Mp¬M®Cºk òe,›¿õ2L-¥¢8\»Z.“Çò_‘:¹8ñ =ÓsFÝWàTg[t_ýÂö¥©j†ŸÆ&ÕŠuŒÑH;ýj€þ9¾‰4S¸Ñ•¹]A ~üØÆ=ø£Äí *ˆ6vÞ‡ÿž§ pWª,Ÿ!eÑã+ÆïCN„;—¸,ºî %TxîòÆ`“Gº½qê‚gKæÖR±õ A“‰~½ˆí¢9øÜ4/aû]øI2õ=ô-¢e;~„,4ߣ…®îð£ärç"v-c÷hg¦†¦{È]p/ Z# ävûÈsÚØõ ͇Vý¤û¼æg«Q‰FMZ%4%jž…¸ Ç-2îx•bgÜ¿¢‘r|· nù¡èô J?a¬îÉ:p_ sl¥!Ì“9måÐ5ß2ôËw±]“:w7²ÆKšüè.š¢¢Z`õAÔð n¼ÛøÖ£ÀIz}”ôS}o*a&ºh°óÄB| ÊG@W½ ðQ˜¼®$ ·Z#­”*~‚ò®àÐø"ÞGÛZʃPK½\C7ŽkK@eŽ@com/microsoft/sqlserver/jdbc/FailoverServerPortPlaceHolder.classmQMOÂ@œ-+ߨ øq1´êY#‰Q"n¥,¤¤´Ú.ü*šØ˜xðø£Œ»µ $¥Iß{™yof’ýùýúpŽ“<²häAS”QZ¢´³8Ì∠81,Û]R¯gxÌ¡Aå~f, Ý6œ©ÞgžåL/9¸ðib“ äg×c|ì”â…®ã3Ã1)AæÊr,vM v’ªÃnS\òÆóÛú”²ÛØ’›<,æ#ášê¨Ü¬²ÎÆjuSøêÚî*›ÐòiB„ëq¬` 9 vä±­ €Á…éÎõ¹ez®ïN˜î¿Ø>õø½>L=V뇘ˆÝ³ “Þ¹öXh—VéG3j²ÐnÀ_*à ! S>IÂ2ìÜ?ì…Oó¿ˆÊ|:å¸@šÚ'ˆv@ÒÚRZ+€¬5äéwüT£›2ïD(iH½Ft õ ´ôÑ»étLïa-GâPK½\C7a:9ws8com/microsoft/sqlserver/jdbc/InputStreamGetterArgs.classQ]KQ=×5×lS³/5í»Ð}و襠„ ‡BÈ·u½.+ë®í^¥þUHPÐèGEsW¡ §ºs†™3gÎe>>_ßìag*VRH¡$³² «2¬É°®b#‰Í¥[*¶R¡¸Ù»¾ïsV§‚ž¶Í¾p†²Ðd˜q«ˆãx6µ]ß®ùžàw‚!wÑ5‡¦ášžm‡GÄoóŽ9pÅi`‡ –ß3zŽø¡ßFxë†<òÀè¶[–Q÷ú1–?çBð@N‘HÚæâì§Îa¥ú?¥xÍoÓOǎ爆|¥Þlþö]m0$-wÂR*Õ††æ5,£¨aš†Y¤5ddÈbŽaÿï~ ó Ùo—­.·N¥£S¤Në(ËÊf&H{ óÒ¡BÙÁ°uI^ü ìãG«&Ý]ÄH(ê/ˆé+#(zi„¸^aJ/ÄGH ¦T¨è´4O¤ÉFa¨äs²ÌŒ‚YOT_xܬnì×8[aè¬p§(J´Yeè×Mßçž°]Ç_¶}s§Â t²ÍЕßwD‰ Ûb˜³*”¦[nU¯Ú–çúî®ÐýRîqO/v,}Å©ÕE>è•çBpoÑ+ú }kesÏ4*¦S4–d•yš`Ávlñ†!’ZYMo2„—ÜM×ÙhÃL]SQMÛ)Χo)]°*ÍR¡TzSÁ3 Ï1θ‘»îŠwnÝ)¼ýdñšüX†Ñvʺ$-óÝF’繞†Lhx—†pŸa¨¿x…¬™9€»qOÃ02̧l‹S¶Å)+9eoå¤!q sxÕ-¹Ñ’Rnüso{º÷;en †Ø  ʮ뭛U"Ý%©-™uŸÖÓ×ao”<÷£¼ÿðnG Ü·=^hAÈ SÔýàlÓ%ŽÓuÂè•X "CvHbà •¨Z»½#¥ý­fH&ŸÌœ¡óÊúˆ~þ‚î ¨[gè¾Ì Ÿ@Ë$Npç[³ñCG Ÿ$ßA>ž9ûºvIÂS§ˆ\R9Z$8¿ä&šsAÐÐó±xì½[Çè9”côœ¢ïJøáÐ1”F_üPK½\C7Â-Rý2com/microsoft/sqlserver/jdbc/IntColumnFilter.classTËRA= I&Œ£¼DE@ÁGH ¾ð ©BÖš88™‰3 %[«ü‹*þ€å7IJJ˵?àø.ÄÛ“(¯H™ÔÛ}úô¹÷Îíéo¿>}Ð ]E3Î+ˆ¨¨B§ŠˆÊQLA—ŠDBèVУ¢FNjpAÁEɈËG¯‚Ka\VqWTÔ⪂k*®ã†Š›¸%‘>¹Ö¯`@Ám†Ð€i›âCu46Ëræ9ƒêÌ?OÏ8c‰Á!¢ÉX’!härÖ Cg4µh,q˰3ñÉç‹<-ú“±ý© ¿Nóœ0ÛSpG Æ¥Ócº†“ha¨ßÞ–´ÏpWÃ]ÜÓІS’rŸ¡v›¢¿p\!aR9² §;#QʵnY¸¦ÄÖ0‚Q†ãþ¢à¯E|œ{ž‘á#Ž›5CÛô³%Û[ÊåHŸÏ9ö2w=Ê{Äu²3ކHÊc»”êTðPC £ Æ5L`TÃ$i˜Â4COÚÉÆ³fÚuØUû(×ß êpítƒHÚé|o}ommý$¯‘Ùdo$¶ÃÖöxiOËÜõØÚ&ªæºº¿¢*ê<76ò¡P A«„ «ñ±š·qK›Ø‚-¢1 înÒ¤Zñƒ¶¬mˆXlK!ˆhg–ä4Ig» »¦r Îø— @þð£V ŽÎxÞ7ãøž“‚„gêf²ç=ïçyÞ7'Ïþù÷o˜G1†ãÈŽa9±Ì+xWÈ÷bXÀû1œÃbù0ŠbCVÁÇBžW°¨`IÁ²Ð.ˆ SÁ'"iEÁjù(.2Œ·ÝV•×:.ß´v9Cb}Ǻcål˩犾Ûtê‹ S Ë»ÆýŽëܰì/~ëøÖûš!îݶ×jÜñ›ÛMînY®O5ó-Çó-Ç—Ñ ³Ï…}Ùô­ŽÉmuÚž‚ON¼àï9ŽíÔnUó–mNé!ìøM;çò:ßËmY¾Ï]‡€ŽS™Â¯b#KM§é_`jú †P¾U£'ëÜßz¾í)MÕ8¥Q³_¼º>ߘïZŽg[>U9«½Xdd]e©jKd*Îàm'ðšŠÌ2|¯iæyú–K´”¾)W*ß ­R®èzÚ¤U¨)éKIW*%)i/Ó¦®ëb—ýê覊·Šâ’ŠÏ°ÅeŸCW±Ž †ãÿîkµ³½Í]†páf!ŸT±‰+4r3¹œdÝ2mASq)†¿4ÓÓËža–ïŠU+›B,ëR”ªùJÉZ©”ìuù”½´yø~zc9ôTîÎgš€¯iYC/ëxù^ÖH«¸ŠkŒ5d#¼P)íݬHIM‰Ê/*%ÿº4é¦Ùkíˆõ& Œ5ld8#­¦­ë 窭ÝÜn³ê¶¼Ö¶Ÿ#ð¸{‡»9A¹ËWóÏøãzÿßÚ¢‹:ùì_¹µÃ«D]+‡ÆÉðÃQÑëK(“!ºkùÕ†øÛ. “W¾a¹E~»Ã*PØPúF/iqDåA½~e¢Èp]p%ô¶6’ #V»ÍCæ?ñgg‹ú­ž…£+ÐnÚÄÁs/¯1â•A¯×iz»Q Ó. ˆ˜ä,N’Îðº´"ý!ýMÒ“CzˆtâJ™wZÊ=Dîq–v')†hÆ0ƒ=FÀ>Fð'ô>ï@ëÆU’ ¿ °ßwÏ@á>’NÆÓì 邉Р7Lßy@(C$<@8ÝEd#ÓEô>lƒeB]( =DHÀ22a2ÈL„äæïûê b‰WºPŹ÷¡$Æ"œ8Ö3H°¹˜NaŽž.&a´Ý?@|èÜä¨s#½sÓûéý~ssOgxªß\<‘ø¯þL…§¤Œ÷§øPK½\C7R> äõ@com/microsoft/sqlserver/jdbc/Parameter$GetTypeDefinitionOp.class­WëwÕÿm$Ykyýˆbâ&±IJbÇ^ä¼HHLù‘`°Ä2&hXËkyI+v׉M_ôá¶ôEKCÛP !Ÿ-¥…+†””¾)íÇrú½ÿ@?·¥Ð™ÝõZ–äXôTçìû›;3wîܹw®Þyÿ:ð—JtBánd¹÷77&77“"·pS"¦E<*â">ÉŒO…ði|&ˆÇB¨Ãg™ó9n>ÄB¨GVÄ Ó/ró%_fú¸ˆ¯„ðU|MÄ׸?ß`Å'D|SÄ·xøIßqQÄSØ¿ÚË"¾#â».Ü|HÄ÷B¸„§Cäá÷«ð ž â¹vâñÄB¸Œç«p…Ù?¬Ä^^Ï^¼Äl%öãÅ æ‚ø‰ip$6Ô}OlèÌ@ì„€pÿYå¼M)™d4nZ&y@@u·ž1-%c(©IU@•§³û>ÁáÞÃÄ]f(´ˆö‘ˆß‘¨&^Wß`lè¤##-a– ô ÄŽôÍ*†’ÐÚŸÐÓÑ´–0tS·¢æ#)S5ΫFôìØh"zŒ¥TK5ÈC_BÏØys…øñþ¸ i95aiz†TfBIÑ¢„>rÈ´ UI÷«™¤5A¬{ikx:K2Ö„fnëPŸÎXª¥%ˆÙ©e4ë €™²þÿÈ•ZOÛE»[#gךªÅn÷¨ãì Æò·ö±DPR“ ­o-Þp[$Ô;•P³¬eñ’€u® ùíN风T}¾z×´¥:ì†|v_ÆR“´{dOž™a-­®²Äžá‘b½Å*[oÁ|”Æél¹Ê·ä/ãpJW,‡¿,h=úähÊ]÷Fw ­XÑ.-Ù£&´´’*«~}1ÐË&‰Oè†U"†]ºžR•Œ3RÑzºËîäïI—·'\®¦S賓VÜNàr×|ç’öªŒ­š„žb›S”nÊdÊ*ˆÒÑѳ”¡,)a÷JÆO% `PÂQ“pœ{}‡­A3áX– wåáí„»óp áž<|áÞ<!|87>’‡o#|OÞ‚0W/ꇹ€Ù/t*n6¥úfÓã6sù#½¸Í«§o÷¡^>ø‰n•#óäkX#ûæá“+çáç^@nŸG…|û<‚¯Úêkø–w”}:|±M/ño5ëé¯Å?a†è¿_'úo¢'úñŸ$ú¢¯}ߥÙ]$#=gϼÇ]ʾKÿy›¾ úþA_Ð¥¢K%W¿Žç'zšp Ñ]úCƒe?ˆ¾ËóÊWQPùÀÜšGmr@ÚUxØ’â6¨vÀa¾º–P)×µPè\@Í,ÚÜ^µo¡n@hŸÅznÏaíTÉL9Ö$•CøyÐAë® Fv»®ÈuÔŸ¼†[Âësh`Á>Þ@ý6ÚŽoÚ^mrÀ+žÕÔ æÐx u¶@“#ðD=n%ì¿øôrþf¨ \Fåڃ͡bíæC3ŸÃfóŒ‰á¦9Â[­X¸ÉYìGg…=á-^ßAø6G¨Ñ[Pë9¸Ã³¹yîÜa‡»gjæ™Zl=üÍ×¼ñ3…+iv$_7/úçÃÛ½þSî:üõh½ø,™—çPŸ·.{¶íŽ ­Ð¶ëÅñp‹g¯7ñúw-Ùn·mß±Üv ÛŽ86ªmƒ2çh'qŠ’ŸÏe3%?§ÿ9@‡PˆÌB’#9Dgø\6^C‡£rÚ>g8)?ä*ßM'…ÏL›§Ü(G^ÇÞ£þ9Ô Âí9ì| Øí£‚A7Cý•/4úq×h˜({T±âôgÊ–|8OÒoK6­ ©”-9Z¶d¢l?ÇÊ–T]Ɉ+¹™£ÞÀ[¶Ç9¿¾g :WëJ&ÆËž,Y¶äDÙ’š+¹ÕM¼ÙïæNHŽÜ¸iÚ-J;~ÚÝù?¥Ý9×èNò†ïý¶wk»}—îÝï—7ø¯b×'îÜÅî­´Ý)×ÒR©ãS! ‘¬œCcsÿU˜YÙL™²B)àÇÔíÄüuÿPK½\C7ðbõ¹ W,com/microsoft/sqlserver/jdbc/Parameter.class½X‰{×ÿ­½²dy±1²¤Ä#Ë‘¡-imH‚m "ÆË@mZ`‘[ ¯œÝ•ƒK›„¦i’Þ¥'ôJ i¡e7nÒûJïûJï#½¯? _gvŸd É–Ìåûüfß{3¿™7ofÞˆ§ÿûÄSÚðŸrTà<¼É‹œæ¯7óðÞÊÃÛxx»Ux‡—¾Î¸q–©ÍúNÞ寻yû4/¿‡¿ÞëÆ£^ÔòJ-ÞçÆû=ø€ƒø ËqÎó^\À‡xòa^þ ~”×.zÀcüõ1þú¸—pÙƒO0Ã'yxœ÷¦Í†<ÉlOñ×g¼ø,>ÇÓÏóô <|‘‡/ñðeÞøŠ_õ¢_ã•§=ø:ÓoH¨Ý¡Y“ãZ·v4ªG­h\ï— „t]3ºbªij¦E!ýh\ÂÍ=‘øXp,1âfü¨4š1¡ÁcÃG"ÁÁØ!¡ÒÊ‚•PÓsLPƒ1U †-#ª—'jö%¬ñ„%A’Pgh#QÓÒ m˜–w$#Ò^ˆXã +Qc4•uuŒH­tì“°fa«ˆ‡T¹¢ºÍ\:lMìf6ì6š6¯§E¹+>Lˆ#Ž;œÃ®o^_ôq fÈ‘Ÿ³šÖÈnï¶mœ}`ºñM KSgÜ7Rg—›Cl‹÷¥OYafΖDbq]#™NÕŠŒJð2n·j—HYWnŽïSc  48Tw¸_S‡InˆmªfÑ~Í"é°¥Z Ї–¢`™5jÄïéŠë´o’¶FÜPßÊ [cmdT‹§ÀÜjF¢QÚÑÔ1 +ìUÆ2³¶äf[nYJ®3ª«Ædj×—%˜½WŸé%oEÈY©•YR9Ûº©OM…. ?™–X[À,ÀªŠÄ4Õé"âîª Í Š¹¥JòstB›‹ÚZâØnÄÇèΆžº³Mä÷ô„í)Y×"¯¶l·PugÖ•õ9FlW‡:”ê—EÍÞD,F95mÓwÄ-KÓ[gÙRÈAœk—„=©$¬h,ØE)ª«Fƒ `>XÈ&;œ¤˜¥pÜjŒ˜×Ü7¹©sÒÒ•éäw;)¬E‰…œ[ ÆÅ †©’Ž\ùxIÐ ä‹™«qVú+7Éã“ý»»$,lþ~#Ê%yñFÚ„WD4ÓljkÛ(¡·€¶¹ ×îüG OêÖ¨fE#sš6´µIè)ZSQ¥pyØ96+èÃ.ÝØ¦`7ö(¸!;yèD—‚íØ¡ —Yöá[ ì‘°®8u îbÔì’pc¡C)0Qpߦ^øjíìíuHÁw@ή·fi'¬à.rŒ:Âïü˜J ±ªÿPB7ãã”ÚðÜ#Ê~ ®à»øŸüûô4\™Ènü@Áñ#?ÆOü?S0‚Q?Ç3 ~ý ~‰_)ø5~ãÆoü{©çÈxX ƒ,<Æ2¿Ç3Ôf>ž b¼ñÞ¨Êy×Õ7Q ÏYM•Ca¿ïÆø#'Lb¯Ï*øþ¬à$îåá/ îÃ_œÂß<€¿óýî—Ð^ÜÕ6åizYí?üÿ¢Ž¡ÿÐßNoÜ Ó[72‚â!ü[B°¸ìM7~Ü­ÙIrA ˼¨FÎ+úZ¦«¤ÒI˜“F”ÍE–ˆº|Œû %U·j©l4õ!u´Õ«Z¢cˆ§,¨£8ŸÂ²£"²LOU^‰Ú1õ¸Æíæ¾ÈífìjÞ……:¡ožvmDÕEóȦdž8«u->.èן´9$ºDêsâú^=±¼ðâªâçtOOW<Sàk-Ô¡f²“×ÍL¥K'§#Ÿ+Póº » ošŸ‘ëJŠíT±®ºŽåÆÅ·gÔ¡Ó…P©Q1ËYØTè>ò÷yký¿:ÄÅ–˜¼dÿµ.dÜe^{ÐÐõ s?_tƒvMøæ‹Úrí„IXÿ×N¤ˆßž9¶¥ðò$–ݧZyž‰P(4t]Ûc´¡ ÊQÂí}•pkhSêmJ ¢Mw z—ا>Ϧ½‚öÙtýQ_ úZCëÑåþi”ú¥)”ø—–>;Ùïž‚ë2œa þ¥D™ßåe—Äövìͳí¾(¶©!-¼Ý$´­hßs•L¤$Ê/ÀMŸ²#ñ"ú“‰oèèF’-!Zå—§ˆ»‘mL›2ñŤ$×Wʆ—¤qjNCˆVã ‰ýƒb¿ƒÓPzZø¨S(cZBbJÎq3%Sd¦.‚bºd K˜VN¡’©g ¦äX©å’ÐuªðÇF:g)ß û£ò<ùcU¤´šÄý-I,åeVß²2‰šËWx§GH D©rµ°lW€Äë®”(áöWHôÀ…2¢wÌbù`Mý VLÃ×.»žDC»ËçZuîÒ åÆ4†¹LóÒ@X’|²Ï•ÄJIžÁª\«Ž¦­ª¾¬p#Ocu®IÔÀ ö.áŽ[ùÈ3¸aËÊ3häï$nœÁsÎ8¾HbM7mYy–ÅfMSã4ÖæZ]À’u¹–K[²ŽÖ˜½¡Ô1åæG3”5çWv|eës•ÅæUæÏTÖ’O0=O¸{RÇxF`08ÅŢ߉I)ðîtIhIZéwYâ²àI噑æ»AðÕò~e ™'e)f3í’6ºX6£‰#½ì!˜ƒ¤Ÿ³æ&¡–SEj ´údÖæs-èãÉt\-|WcãE ‘$ž{±4U°^šæM߇àuÒ0Åw/¦ùéìšÕù\CYü<öÈó/åXu/Ï@B´Îƒp¯@h‡›0€[ò!°ìŠÆ9í ´ò½óÚ¦\Äûp¿@Ü gmÁ™Ä­¹ïÇ)¼â*€^ ô^y@/Ìz¯@èUçXê㢗³öM2cJç¡ðs.éÒ,:ýþ–ilnwµR¬µžC}kÌ”ì\¢KÝD!ÕQ1ÞÂOT®7ÂÃBåý¤Òà Å1Ú.Û:]TÎÏc—£q£ýÜ&^ƒ2™^ƒÁRN©UòaJªp»; ùÊ|n®þ¥TýSi ûȲˆ“ÎÇÖ-©sq9³–Àª$n¿2Ã?`™³¶SR”•fÏœoÎÌ73gίÿ3€ DœÁ«"Fqžÿ.ø1&"ŒÿÅE !Áá¤ã~¤¸úši÷‘0Á‘‹\{kopmÒ‡7}˜bðf4]³² îXü!g”TÿugŘÓt†áXaK¹«¤+о‘^¶LMß˜Ž¯Î1ˆ ;Eµfi†^÷áÃ@nS1W ò¤0±\œŽœª}y©°h˜ÜÈp6–ë–ç$M¯«¦µ´mXjáB?Ö^ˆÒ3ÕZE)ªŽã ÍÚœ7¶×+ª„ †}xKÂe¼-aùãÛuÇíªaåuÊS ÎIÈâ D%¼‹Y0°1 sÈQôçç¶ËeÕ”0 ‹xOÂä¹ö>Ç>`HjºªM£n”­tý³ •uW5Ó[¥õbú#ÅTªª¥š×-­BeÊÏâ_[ßR‹CúP3—íaói'I·ZQõ kÓ¹Ujî ËàýŸ5M応ø*Õ&m¨Ö‚iv]†ªÊuÑ4ªó¦Æã›¦AV‰Ž—OÎÐuÊŸš.<_ÔtïÅõ"ŸòñóyšÏ1§}š^Rw®•û¡38^¥VSõÃø±F¦}48õíõz§ö ±õ.¿etÛs&Öübùþ®azÿEN/zˆ4ÿ¼$4©4sgI;ÍgVOâ Ø7Î?^À‹p9æ[tÜCëR¢W†~îÞÚçd, ÀÃÜð†=•ýWÝSBP õ!Χ‚¸'(lNÀçÛqTaoÖî¯ì ¬iÿ‘zìP…Hâ)=‡©B”.Z¯»3!yö‚!yñI/ÉâÚýL„+^vp¥‹†ä‰„äË ‘^âàÑ\÷{ˆ_ÂËíf°a¸yµLŒ$©Ü‡ô´"».Ö‚ÿæ”ð5y|ËE2Bò ÉXgM‘ì’¤I.’¬’üäÄhÀÛ´¿KF(†œh`’µcÛ{]Ðþ3"¬µ±§IR9šnØ¿ïº\Mû^ûTʉS9ÜĞŹÑÅ=œlk'öS27í™PPhØ—"Bi_¾Å/'Ûqí–mØq(²gËŽstóŽûoܲߙˆWp®30w¨­·÷L" ’߉lô D~€tó eÑ©ƒ´¶ ’¢¼ÂÓÛ¿,±ƒÑ™¦ýU‡xäØ ZÞü¢C,d;ܼ²c³…¾äÑ ù—9þPK½\C7]*¨Iûá1com/microsoft/sqlserver/jdbc/PLPInputStream.classµWùw×þÆY‹'660–1$†Ø#/“Æ&/€@–l 6 xÆò`IãÌŒ NÓ$mCJ“t§ K¶€»˜Ö,–Ý@¡{ÚtKÓå§þ ýBï-–—Ãrz¢sôÞ¼;÷}ß}÷Ý{ß›÷?z÷6€ ø·#xÑÃÓ ,nF½(ÆQ^Â1nƸy™eŸöâ|Æy7ósáU–¾æÅV¼î¡§Ïró¹ìûxôynÞàæ8ë¾ÉO_ðâ¾È÷\xÛ ?ÞñâQ|‰%_v’]xÍFÿ Kßá÷_åi_cö¯»ð /‡åÂI/jÙàWðM~ý-¾íE}ZònN±ø4£žááY~—‡çxxÞ‹ ø¿Ï͸¹È*—¸¹ìÆ8K~Èú‘ ?àîu ï …»<Ò¦'MKIZû”ø¨* doxw¸kø«…:Â$éèìîí³Ç­}½= ´ÒÄe,®+ÑšŒYCàb¥Ž®;N@YdÔ0Ô¤Õ64šÞ£&-) 4¡Ãjt®,®Z]GUcJ€ZB³HzRm³Ôm†¡Œ XZ­˜¦jX™Û®™Êá¸%Ò~žž±¤5¤ZZDÀÆHœÔª#z¢:¡E ÝÔ­jóÅ8Í$ôê#ÑÑj²1˜µz,CUD:¢UãJ2ÖØÆÓ›'”aµWMŒd•Þ¨ hc´1ÚÈ ½í=l»j4÷ß[±Ç~nïÝLŒÄ›kï­<×T²KlÓ£´IÞŽcuÄö ØÖ¬Ólç½õòhw¨–¥ÛŒ˜yŸ9ÿßÒŽ?¸‡?V¶hIÍzV@ÿ´ë!-ÚGAS­læ8jj)wÜ$áx§kj9ÃDsXáÑ®ZJT©ç¸'ÙJÑï¬9ÐÊS]ÔƒüTÊ/l”`’6-©ÄI™Ža‚LìŒÄuSµIyd¨¦JÉV˜Îëjò²|¢%cäÁ… ân‰Äm?¹ð  $^3O+¬[ÛõÑd4«VϪ„u[©]L+†nH8€a WðS ϣ߅ŸI˜D·„«Ü\Ãu 70åBJÂ4fbgûSÜü\B'vJc»„üâf771 JèÀvÞ•p·$¹n©m¶¦7»r‹‘ð Ü–p¿”ð+Vj¼w<JAÀLIø5~#!‚ƒs3wëoaž÷›U&£ê±®Q«k°•½gæ¡þ3ºÐ-`å¬þ¶líÌøY&áwø½„÷ص`·áÞÇŸ$ü™ßþuáo>ÀAÖ?,áï¬õ!7ÿ`gíAOz r«nÈ­ºWÝ0  ÿ‰ ¨»§·ZSS£KæÅÅü n„•E²‡ã°M娮ËßÞ!C‰fNÏJ<ñð5ê­fn‹*äí£DX¤™i Jz×ctžZê1Ê©²…™D ¥[HÅhLê|‹%eæú«=”‰œò!é)§©Pô}\…”¬Z’gë˜i© ®K|@Gô:¤åüÅt>¢F¬æà""»y©àuª¦©ÄÈËjjs×R>Û¶z¢ÝÐ8y8zÄï³Â\²Ñ^$‰â¾y¡ ùJúÙТÈnãºIE×cEͬïØÓÁ¼M{“¦KªQ*Δ«Õ¹ NdÅš™»õpi^‰«ŠÑ–¾IuÚ¥¼¡æ>‡ZŽ˜õ›yùÓën²D!›w/{„¶mÖ¯6ÝϘÅvCÀ†‡Cž f2®[‰ «Vö2§Ÿ}šíTã#¼Eöi–Ùþͽ<ªšš¡Fsu°ÇR¬QÓN™~ú€(¦»?P„•؆Vh£Q$¬B{Þx)étà«=ŸÔ®Búìû]ôßmË øP±ûÎL¶ç­äÊLúÏÙn®¡¹Q)½íÅ^ÒÝG£eé†t䊊ºNÚ:ûé/ÒŒGI÷yôetkI&R_)nÀE7Ï õ—PTOCO Þúù«øˆÍÈ”Bê«äŠ6‹Ë -Ož†S˜¼‰â>y¹XᯟFÉ|ð™šØ '\Ôo’>Ñç,/œÆÙ1…RY¼åžB™¼ Kל<÷šã ¦à“eGÿ–OaÅÕ¸/à =í³½B·|êò ø&þÂ@†öM¢å¥²àpLcåþÒ[q®k(Ÿägßyx¹‡‹ßÜr‡[ló¨ Üö_Àr?n¹ÃG½Ã?ƒUõ!¿°¥8°eüî‡ä–Šq”„¡>…JAœÁêÀ$™õŒQú°Ë7^àÃ2cÝ~²Ž¿›  ªÊsò,œž+U˰æä9¸¨ÛJVW –ã­äóµìrÏ•µWÂ7áï#¦Ç¦Q}‡ VÒ5t}6ØþÉÒùéO—‡ ÝA’PßÊtŽ´#Šæ9Æé˜ ‡u)¬o©`ÉEŠ0êZ*&B̘eQ‰§ˆm56Ùý\ÖhŽu'-‘Y똵@&´2‡HŒçQl??YŠ»¯N,‚ïGáVCÕ"øj¿-“ Bà2Šnâñ¾iÔܱ—¸^P€žˆq¢“)ê²ʱ–€Bf Œ÷gÇhÿ”TžA‘¿r pû"ËkI.§)+3ŒþJ&|FdÆrq–r6ãéy”|±ÌPþ‡dœjd÷£`ÂÑ$f6k“œÞ›À ÊŠk¨;MyC/β õdCÃÜ®R­Ç^ŸHŽ#Té£MNŸ3½§îšœ¼¬†ô9Sh§d¤ç€ß'°`'ê@“(÷‘²ÏeÄ»Ç|â9°Oa u¥çPÎÃRŸ²JÏR*¥ð„OœÈ[Ãļè>©er¸‰ÖÎ" Ì Õç;½Ô'§Ò«^A¥@®`†ŠžJW¯ß¿m´qu6ÆeˆW3M)l>žÂÓ*.…ãwÿK¦}bnAá=ç€ÖRÏ@>R|†1š™”ú…•ÈOe‘®¬™‰ë3«(“g LR4;hGD hçPÌäA¶¶ëD9»~þÉ×ÐòJʶÌàÙ¾ëhG!IRøäi¸DªŠŽë¨sÜr_GyÚüPK½\C7. ‰[Ë\4com/microsoft/sqlserver/jdbc/PLPXMLInputStream.classÕTkSQ~,.àZ¤– v±+W1»*fEVà ¦c1~i]ŽˆK»‹#¨¾ôÁnâ¨ãèG9½gAGÇ™¾ôa÷½œç½žgÎïƒ}cxæÅMÜ’qÛ îx #(´Œ°Œˆ—ì¨pÆlÔ _óæ˜øÝõb÷dÜgèÚ(—’s³ ŽÅ$ƒ§Zªf,ƒ«e†XZÓËñrQ3tS_¶âæ§’ÉunÄWóKZ|>=ŸªTkVž`è)«küÃlú0~'xr‚ìLæWóÜHœŒë¨òš[7ž󔘌­ÏdRåj):ujûè0Ò =ϼ/74^µŠzÅ”ñ€Á¥•t“üÎ`hv7U¬­i†ò?õ¯¦WÕu5^Ô;W…=n¥y¥`­Ø­¤ÜäIÖ-nRëÁ¸Ê¾6æ}ÑZÑk–}Ëî)­d7-ã¡‚GxÌ0tXe¾f®,©ÚZG5ØPp½ &A{ék·4×^ ÃèÙö+²^VЇ~ƒ攂+¸ªàFdÊä@ðX¥l×*dä‰×ÁŤpø‹#Ÿ}PR+…x¦nZœ–âQ C­kzµÎnEÚ€¹¥U®Y‰Ô1.ªK˜LÏèÅÔ"­W¤ ?.â õ .t‘G¢Û`oXì3\lsŽ\ÌÕ€sR Hß!mÁõ®I×.ä\8po‚Ç=u"ÞOŸd{˜à[+»Ÿ,FR ÿ„g ÞpÝ߀¼ˆ%¦’&ð'‘ìÇýOAÝ(@ ‘´§™´‡ÚÛÿøµ#r·jOÐdN’±&ì\:²o#÷ܳ$Q§°¶q>⌠-"ôèæ‘æ$¯·ëö·†q·ê6KºqƒÆm"†íæŸkÏs:²9Éwý©5ÃPK½\C7S=¹ü x2com/microsoft/sqlserver/jdbc/PrecisionFilter.class…PÁJÃ@œ×´FckSõ ÁC+Bzñ&B-¬SjéµÔt…H’¥ÉÖŸ2O‚?À_Ò‚Þ\fç½™å½ýúþøОM¶‰áп½ñfƒ¡ß›ÌFã¾'„O Ahx*Éô<ÑÓy´’‡/ ¥Üï íE눰u&¡¾&íΔPõÔB,µx &êŽc\k‹Ž¨ÃÂ.á"P±‡Aª2õ¤Ýle2}‘©ûÌw”Ê ÌB• ÂHËô?»H´§¢U¼±óšcUpŒ*jàéJe²Þþ£w(æáJo-fb®¿ƒÞ°> ìmÚ]æ"pæ¼–ÓòÞžqR|ñ›¹mæN¾ÿPK½\C7—6Ú¼ /com/microsoft/sqlserver/jdbc/ScrollWindow.class­Vé{eÿm³Í&a±mZÎ  ¦Ð”K”VZŽj)Ò´ÔÒdÓ¦¤Ù²»)oÅûV<@•/ý@‹ <¢ðÑçñŸðÏð›:óîæh —:óÎ;3¿92ïlÿëçšq·èVUÐム½Lzш>&Où°½|ê÷`rˆÅ§<ãÃ|ô*x–åç˜fS0èC-z=ˆ3O0Ñü}I;īΣÒ5Éù;¬àvŠs‚pëE[ ⊞p?ŸÏäñlwéìsMJü“ØÖ~À†Æ1G9¡7æl,B“¸JždÓ¨+:ÑÅê¨<¶%úå\öl>N2µô êT'ö9rÙŸÿ{§\v•òT^{±d°ù¬žÞ±yTˆR@0KKûöcížú75§5þ`Û­Ájgvýák.w^‡‹ðeÊ©ò¦˜L•BŸ_$O^E³¸§05¿¡Êº††þ+Xs nºÉ!|†â_‚ìºÕÎÿPK½\C7[Z/j– Û0com/microsoft/sqlserver/jdbc/ServerDTVImpl.classÅX |[UÿŸ&íMÓÓ6ëÖ­‘µ]Ú‰t“®Ù ³ÍÆÒM;¦x—ْܶÜrs[V|¢ ˆŠ">‚­â¨ò¶®2a>@_ø~¿Ì¾Ÿ›ßwïMš¶¡Íö›?úûÝsNÎ÷ïý8§xà!«…Ï  \é… ûxò"Œ} ®òBá×àµ<¼Î‹×ã å¸oäájÞäÅ›q ×zñ¼ÕK{×1ÞÛz=Þ®à^,dBïÄ <¼KÁ»çF¿‡W7ñð^pò$ï½¾Ÿ‡0™›™ô~·xðA/‚¸Õ‹¸MÁ‡xØ‹|XÁGxóvÔƒ^ÜQ>ÆÃǙԼº‹Ww—ã|‚ÞË?Çxu¯îçá ‡x8ÌÃ8Gx˜`vŸd°9޲hŸòàAÖù!¶ã1ŸVðŠA59 uhé^³O@„Ê­NÕØ+ìˆé©–T"fè½ÇlÉ\‘ÌhÆ f´ì‰ï޵t…¢Û45®ŒÝ*P–ÈD’I¢³“è¤ÃisÓ¨ŠvmÛØÖÙ¾%ÝÞ¹1$PÙ®§3¦ê ¸NžÔ•lVÍ] Ñ*ªW[©ÿÍueqUˆn)ëªÔLmò”.K+ŠRÑîÇÕL jv“å®Ö©îË^Ùf—3D‰ÀǸ§sDºôÉž}á¶.dŸp˜»A©¡‘w)W‹½^XгmË™­[mþM³ž%´¼ŽHÉ”ºWëÒRýÙkоÛìœCÏüÌj×SÅ"g–Æ’:g›/545†YÏšìåÀvV4q¡ø¸,mOg½i-n7Ïyù[NƒõÒYÞ6’ÂV#®69Ãiº¤'âXSÓv©5¹ÎFò½ÚÐn(k “ÓvÚÑC}Áî=s´Mg‹Šj!DR±–,“Ï2K¸–,PˆÎ9³Úu;Ýpœ½"9•bYÓe¦ÈìäxA^­gâÍÜ [·Ç9ª[¨ü¶;‘V!Žeݦ/p[Ñyz7ÁS âWºª}©äÄúTCƒ)Û­Gѵú¹P×I­DŒžxÙH¤dxN„Y³ó4¢§‘h5ÅꜩèyŽÍîa³wèlmz)l8ÿÔ¥ ˜±¶ì6ß1S4Ø¢ÆÍápAÊY§˜.tÎR Õz5còx×ÅÂç+ø|H‹%R*Õ¤õE|q:õ´6ÄB?S kSRç:gÙ¼MÜ¥%‹jj] ¾³55† ½Ÿ…¦Eçâíá”—¬¢E%Úz;ñ-ûÆd¯˜Ï=–·BF‚ïØüŠHžÆ=áôʯU}Ïücn, ãZ&ahñÜ )jªæ@«q ”ðÛ‹V%ü³fz†ÿ¶ZûÏÃ¥4“x,Š:~‚Ñïíއoþ¹_UôÑ»~ï¤Õ<šÍ¥#(»ößeØEdÜ€2bÔ5…Ò}žq”7—øÝþRÙ8¼ö‰WÒç&2Aš_…ËÒgš«Mã¨8 ð8ŒÊ,“WCu«JĘ‹`÷ ù¡ênCܑϗţRjú|˜w÷4¡|ÐÐ㸞”Ñ<(ˆ ¼å¦àÔù×8æÓTé;1Œn^”Œ`ÍýXp 滉rí0*Žb!aѱà’ÀêÖº…ß}¿{þQ¬X[:ŠeÖ>~k>ÿÇY÷‘<ÉgQòX¾„5üx¶%’ÐMó[B±ŽyïÇ mÅ KïHNⲩ8ïT܇Q5*dÀE³ˆŒŠ:¹xý’;m£=éÏm¹¸ˆ¾]Îþµì" ¸XÒ(îQ¸™Î(1ã%…a73ìl†Õ,díÇ•,Lå(t_=qX6ŒZßr{!}1^‰.f0ãh…stMÐWG¦cNçXõÙe-ÏZjfp&°Ç¶²«‰Âº’æ¥Ì¥>àWü ×å.¿B‘ăoñF°î(Vt׬œÀ¹GиÖ[ú VuÛHD»Ý„Õ]K®v ¿×_1Žó„ËuÍÇ|'lùX°š"á@l KŘß㸑 ’—wY„ï²=ÕÅqOßúÖÐ7Jß%ô=áÌO;ûÏзÞïYì/¥¨\=–]=ŸV~Å^Ÿ?fž‡§†Qç,ŸF¥µôÅF0Ï’¤’±Çñ‚,ö½“Ø£9ìú×ÂÎR_cãûú†q޽òc‘½ªÈ[9‚ø”:}ªM Ü„•›º•ùöœýšýTr^x¡wÉ~T/ô»C¸`Žz¯#lj±#P4Ô¢ÎZ¿ÈZKkMa[O'k‰m½£žuþÅcÂyON¼äjóÔ"¼q¬u°Ò9¬ªœòYœV'5²Îøf@^â@ô]9ɽ,‹µÞÁj˜qþ¥dù0üŽîF•³<0ÍÍÂmÂNô®•Bø¥pO`ƒSóSh/’Js}¶4§vÀ5¸ŒÁ7eá:úJ¼À®sð4ÏGûÓ«¶‡ÿûäà®tZI ›ë8 •U.Ê¥Ç,nʆgû]&×ßV[ûTñîGèQT×lœÀ¦îƒ¢ŒvÆqñ-Nù8ˆNgúPK½\C7Æ(&ìÎ"4com/microsoft/sqlserver/jdbc/SimpleInputStream.class•Vù_çÿ¾ìÂ^ƒ#iÀÀ‚lLR›ºÔ*‡ºqãRèá°;»Œìî¬3Á¶I¯¦IÚ´©=ÔÔØTCl½XL°Ò;­½¯_û§´}ž™eY`E…Ͼï;ïûœßçxßÛÿ}ï€Çño/Fu!æ‚â…qŒAåḻ1îÁ.$ù3å¥Uš?52<œð@‡á…‰ &½¨d»ð¯¦Ü8Éó§ùø3LýY>{ž‡Üøï|Þ…/xÑ`s}Ñ/1Ëü1íÅKø² /»ð/šñŠ-x•y^ãá«<| _g¯óên¼Áüßtã” ßòbË} ßæá;Ìð]&;ÍÃÎòð& ~…U|IιñoŸgl¾ïÂÛ.ü@ <#ŸLjr,¬¤昀 øF#j:‘TºOšŠ@ÉH·@u³lŠnªZÚèU y4©ÄˆxXÀ9™6ÇS <MYsTK5§Ô¨®ZÜl6N$‰sRÑ›ÇF£Í5•I*¡tfÂŒ˜º"§*ÃÇåI9”Ó‰@K ”u©iÕÜ)ðZk˜äòòyy–ìR䘢Cë¨Ü«˜¦¢ïÖFp}žˆµî<"£ƒm‡œ=ZŒ@ñöME•Œ‡@i4©´éheŠRÕèˆX_ÓW34µ>Óö E~ªIFÏ:'¬d!YÚ:ÒÍŸ.šC!ë %ëã̲„ꊡ˜î„brX >iãȔ٘ ´´ÀH~RƒmEuwE“¶.\pÇšVQõkæm"Ë;)ðð2I¿fõ*q›H×5]Â~”ðf\ø¡„a¯„ó°?‘Ћ> ³¸$á§ø™„nôH¸Œ+®âš ×%Ì!뼄xW`Ój7º'âq…T¼‡ 7ñs2¸/Mlê!Üé¼iMNuJ¸ÅÄ‹¬î¬.‚A ¿ÄAƾ)Õ\—uö l^¶b÷Rêç\ý‹ñ5E(²–±ƒ­úµ„gqÈ…ß°®Àú‰õlØÎ­ˆ«-ª äw%ü–ýØÏ~üŽñ|Ÿù=`À?†ÃŽ`H`c—A“l6iñ8åŠeÔm*ð&+_5>Þ!ðè²_¡tL™˜0âÝH£@ëñ' Ãø³„¿à¯þ† g…GpT¯þJ²º“\í̻ڙwµ“]í\ƒ°„OᘄáͺJk{EǺ ݲ±’¼bUfS…Å5½_NQz¸ zä .ÝŽÂâÓµç¸HWÔÏò®À÷ßi¨g¨Æî˜LO’BŸjØ”@C÷Ü䆇ï·cy“Z¢G£z™¢þQµ¶Gl t k‰}…ÒqM ¦X+!Q3fØvܳÅԢȂó%™a£}Ñ1%:ÎMŠïÙ:º=î,w˽‚ Ëã€br‚toP­P†Õ”jFøj©à G‰E–MòèKÔ^¢IEÖ{&t]I›¬«©Ž®¦;[e1箪ܭFÔIÞ›¹¬#È@ªì¸?f‰ûв>ë]‚¸:%+{t-Õ««Üˆ¹· $ï’×ùÆM%•V¢Ü-ƒ Œ§ÍàÚ¼X»3ÌxlŠ)†ª+±ü1es 'ì.z¢NTñuI«*¾EiÞÌ×öÿÜÜó_åôÛ0JpÀz—Ò?ÐìoßzeôsÕ:çáö;oºçàñÓ†7 Ÿ¿~Ò‹¿ßÒ(èÅ(¸ÇçäçÞ¾ûŸwÀHøÖ Ýá7Ü7eÂd¸Ù9ÇŽQêòn¥ÔmnÄ픺Ãw’ÞE¸›påÝë„û\p¿rá7äÀƒNxÈ »¡<ℵd=J™ë\ð˜ÖÃã.x \°ÑOºà)<í„MnHÏž%<ç‚Ín(€ç°Å [a¡“ÚM¸`;éŽL¨€[Ø·¨ÅéNxÉæ.hº“M0 ^Â8¤¹t8tDš¡;a·^Ö sÆTßôæúêº ´: ºUG±x Ÿh_Ô@…EPÚ[B­¸Z"­Á™6ÌȈE¢ñ:ôºÏ®ñ5W7Ö×O]רÐ\åŸ]ësàT§kc¯^ˆÆ‚q ¼õKËeíp[™/ …Û&b -’݉û–ut`½A¬×]=³yNÃô†Æy Žcøg9uÕ5µÔ`'Ð]c­S¢ñcFb䘥¢q£)Z"QeE9Eë­h,EU4º’"UK¥Ô’ÐÀ‰Ñ¨rõ½Ép…û’!U«ïO†H†Ôý`2Cá¡dHÐ'C‹~$ާð¨ÙËí¡Öj51 Òàbõ8n~«-‹qiº/H5Ë®ZZ¤æñ4Ð’q%Çi¸Ú#-öàŒ@‡#Ô·D––- µD#±È¢xYì‚öX0º<-[Òº°¥ÌWo•­‹—bå^«'Ó¢‘¥>µ32&…¡ø©”þxu¸ƒf­ÁèÄ¢¹¸×h˜¸Úµ+[‚ñîG¬¿ GwüfêYXW”j¤Ù+¢¡x°:ÒÞ ÇOªýyôˆ´ï¦¶¬6z¦l¢WL6jlj¬%Â3ƒuŸ-GaÑ| ò­üiXü„2ù¶ÑЄaû¶Þb ¸¶®I-íjúИkÀj¸Þ ¯ð*\k@L1 šð…µ”º†R501ž¤É£dÀPg@: ¸¢¬Kp<ªxpe¼lF0£žD¢K8äÜYÍÖjÚO¤¯ÃÔ75ðtMIãÂ%Á|Êì²êÂñ`[0JeßÒ ìÇwÒYõ>“«mÀÛ°‡ž}OÁì:_éØò‘Nx×€÷à}œ–9³§•Ž[_ûƒNȺ`îŠP¸5²"VŠÛye© ð°TÏDÌðáØŽ¦jÙ¢EÔÕàCÂG| WàU8À€OàS ó¡HÙœpÌš‰Ú0Î>›ì²>3àsxË€/àKV¡œYÍËÂç‡#+Âr X+qi’6ݹ|—ð55Yòœ8šžo4(ú_SkÛU=¬àt‡ð2YXØŽ§lèÉL\Š(&peqÞ)…Ój [«Vű7tm4j-ÃÐÂÏLÊcÔ3UAºðd£d,R[òÊŽK]áÄO,w¢S7ŸÚëÍ~'I½‘Ê’÷@V(f{7¥ì7ûŒ@GG0Œ†ŸÔ ÈæÃn秺ɒ¹®x$¹Áq¢iÊqSç¦jbAÕI,©ÜutZ(ÁkšÉIYL½°Š&#+9#¸Òj£98¶hu †Eœ…uuóq‰ð{j2~Nip* €<8 ¦`z*½O@/ÝR˜öÒEÅZ£´–µ7L³•?xOa:ÎDµ|7ÆÓmåê1ža‹0n´Å31>ËÏÂØg‹gc<ÇÏÅxž->c¿-žñ[Ü„ñ9¶ø\Œ›mñylñBŒ[lq+ÆA[¼ã6[¼ã-^‚ñù¶¸㥶8Œ1^í˜vÓíÎó³åÇ1^f‹—cŒ7—[ÅϹð·.ļ‹0Õ N\;€'‹·ƒV\’€´Npo‡W_Ó éde`¡bÌwuBf±×Ý YŽÉ[Àؽ& ŒÀâ™k¡°x t+(Çl ¬' /”¹²ø0cd^™¦m8ö†×-EF׳Ìíà¡ï‚î~ÇNèᧇ¶CO_ÃNÈõkÃKÐKsèÛ¡÷ËÏÓ§ \Œ?™‹Ó€ï7LÑ`¾C/uOÞÓ\ªˆ§@þ†Ò‡!j¾·ÏÈ»Ö{ûlöæovî‚¿ÃÛ×ç×½ý|þtoŸ?Ã;ÀWC,ÁŽß ýÛaPIAyNÉKÀà á z§ÊÙÌÃÛ£žâšªP†ÍÛ® ú†«ä¯{3ŽëZXC!áR¸L-Û pðÈrKh©PDê4áØšÛP|ü\W¨92Q5ú^§ج&çJ¸Jeß«²o¤Y„«ñ—“,)ÓHº^éF¥J¢ú^¥û”îWz@éA¥‡”VzDéQR}“cXý°zÙ¡zÙjëå¹|&¤wMªõ&Õz“j½IµÞ¤ZoR­7©Ö›TëMªõ¦dëiô½¥&ÿufuФ?5[€§Ĥ´üµjKOµ¥©·tþ&>O¥¸cb©tL”oƒkÁPɲM¼%¾çªGþ jz`ŒJ@yŠšÛ.¸®—)ÌʆLÊÌJó˜/¹ýSßßè×þtSßÛèÏ0õ}~§©iô»LǬF¿'Ãt$Pœ¦Ö‰‚æz”LÓ±Åm:ÈÌ2õ(†©Défê‡P²Mý0JŽéX‚â1õ£[i`Æn¡€Ð—ÐO®Äþ"DŠ 9Ed0BJF(”ëµH¤X¤Dd¸H©È*^FI%n9_Ýž ‘Ñ"cDÆŠŒ“’ãE*E&ˆL™$2YäTªÿ4ÂÂTB¡šPC¨%L#œ.œ!R'r¦Èt‘z*7ƒÐ@h$Ìäç,‘Y">‘Ù"sDæŠÌ9[Ä/2_dH“È9"çŠ4‹œ'Y(ÒB=i% ‹m„Åüô„D–ˆœ/Ò.²”Ê… B‡¼ü.‰ŠÄ('NXFXNXAX)ù«DV‹\H9IúbJ¯!\‚0áR~©šp™ÒË•^Á¹W2¯b^ͼ†y-¿ƒM¸NéõJoàÜ™71ofÞ¼•_Ù&ܦôv¥wpîÌ»˜w3ïaÞË_ &ܧô~¥(}PéCJVúˆÒµJåÚÖ1c®g>Î|‚¹¹‘ù$ó)æÓÌMÌg˜Ï2Ÿcnf>ÏÜÂÜÊÜÆìd&˜Ûyßš°Cé J_Tº“K½ÄÜÅÜÍ|™ù ™ðªÒ×øóȄו¾ÁŸR&¼©ô-þŠ2ám¥{Ôsï¨òïªrï©ü÷ù[Ê„”~¨ô#nýcæ'ÌOU?Sú¹Ò/”~©ô+¥_+ýFé·\ËO˜ß1¿gþ”ù3æÏ™¿`îeîcîg`dbfaeþ’ù+毙¿aþ–ù;æï™`þ‘ù'柙aþ•ù7æß™ÿ`þ“ù/æ¿™ÿaKÃOÑùo þ PK½\C7¾MúXÞ(1com/microsoft/sqlserver/jdbc/SQLJdbcVersion.classMŽMNÃ0„ç5 éO ý[p~æˆM»µªRönb£Ä¶É½X!±àªâ™U,Y3Ÿ=zo~Oß?î°ž Á"Ã2ʶ²¶Ž@„ÙÆ¤ …l>TÂiŠm¬‹0 ÷ûí–ý4'Œœê´×ÖÄ¿Špv¯„äêºàèÆV*Ç9.·¥mE«Kg½} ¿7^¹N9QWÇR¼<ïžX åâ4¼–4oâp¬U¸ôqË—|Sð²Øó¨ÇcæI§Ìygì+±ÎÙ-XãKzóúÄÿùPK½\C7èƒ/‚ª¨ 0com/microsoft/sqlserver/jdbc/SQLServerBlob.classUmSW~.Ù;Þ”U#MCßlHH£‚¡‚µ jŠ¢Òj‘¶²$K †]ºYñ³ÌðüÒ¢öÕòEfpZA‹e¦_û±? ý'µçî.1&é 63ÉÝ{ö<çžó<çÜüñϯ›ö£¨Bůâ=þsTÂû*“p\Æ Š†TqBÂI §T4â¾ÿ¿ÉÈ–ð‘ŠVŒ¨83ˆbT|æøî¬JAÏI8¯bÆ$|¬b/>áÆ 2.JøT¸„K âÔ ÝÑ&YËd88’µfS³…¬m•¬i'Uú²X2ì놚ÉMeScçFÆÜíešFÖ)XæCðHÁ,8Gúb/ŸìºÀ Y9ƒ¡%o8ƒS·çÇÛÐgvǺFfôëzª`¥2æÜ5Ç{A§ª'od9£$a‚AæØyÇ(QB±áL/*X4̼s…ª‹u “ËœU*pÃΘ–2L ­©aîŒM º²c_3³ºC9 ±ažaK©:µ0½(ç6zÍ©LN.U&C5fÈÆ2þ([Ž[2ž%„·ðYoàÍ^Ãë ‡¶Ç#ϼ‚æsâÌMÊ1n8©ÓF©¤çS–=«; »Î_.˜×õb!wÖg"cæŒ!|Ë<ÉÐê‚‹º™ONÍH ÍÏM#–™ç޽!è˜ ! *£¥uħ»í9"c:FÞ°9È0BWBx©º‘ Ñ8dÐÊZPie]C(`†!½}.*Uà'^ ¡‡+3ž&iâÛÊÐôB«0´o©NNŠzSŸ*R§¤¶³\ŸÛ–ÔZ©íŽÛ¨¢^?iÛThÁÌ3ìó›Ù%Ü3tÕšˆçzŽ/8í7È ‘<ýëGÚ9«_5NÙÖì »Àk²mËf(þ  öÀÚój-—Ü[#–áKEËŽÍ—ƒfSÑm[ŸÏZsó$uš2uLn,Ù±¶XmÕ­|ÿK©EwÐÕ«¢®æNúmàNÿ |Üim£NÝG¿oÓ®ƒìZ[âë`ñÄ#4Ä»!ðüÃC9pÇ(¹1Zw²ø/ü‘­n@'˜¸ê:Çé+K‚¾4i>ì/HôWüéÂî#àëæ·hS£·¿Fcd R੼ê¿n*·ï¡9ê:-ÐcÏ‚ã;¤Çסô ÂoPÇh®#4Ö/’c aq MLxŒæÈÓRi¬£­&ªÇ"i!YÐË7¹OÑÅ\ZЄ§²‹ DÃb@#ÈŽpªé’ñ«ŽÐÊÉjÛ"KYñ¯Ô€ö“\è"%Ò:À÷Ѭ$ž× ޤv´¯ÄªgX|‚]:×°{¥_ð+YCØ­CY¡P$ɶ픯ÕÇôû™l*­ËÊí»Þ!ÕyFÊF $¶¶ªq¼ÓgiÉ3%6Ó’&¹¶}§Å´àî5)—5AÀQ!-ÒŠ¦hÒ÷p#]™ìIhJÏ7tBZ^†rKaËÏþÖ䯠h‚0¹°rK ÃïGêöŽÇ)lÇjwÞ-÷G¬¼?’Ôñh2Ü\Ã+ê€{ 6DU*´ö±$W$IŠ4 ‰îêwšX†ì–Ÿº³ÔÕ‚DdÍ(IÕ$È^3Iay‹MX‚ª ÉÍïÐëb#ÕØÖqMpgªX\BW~2I]ÑûÂHVâÅÿÀó™Œjâ‚®y£õºÏ$K¿¤ï¡Õ',yê$5!,E5‘+–Hªe´‘ÑY׬‰ÕÔýðoÁ›¤¿¥LÖíêA·’馺éYîÖçWÜ¢¾ƒ¼;4ÑõŽhÂd7¬toFèêè ­&ÒV;rÞLttGÜD¼Œð/PK½\C7(8€½;com/microsoft/sqlserver/jdbc/SQLServerBlobInputStream.class•TßSWþnv—Í®Š@P‹â¯&hÚ‚¢•Z ¢ã¨M§3ȃ]Â6¬„lº»2íKß:ãÀKL§Oøì´¾ûG©çܬ™ ð€“Ùsî¹÷|ß9÷œsóúÍ»>Ã]øÜ@?¾`1Îb‚ÅE—0©ã²Ž+&t|i"‰«IL±ñ•I×X|ÍbšÅu”tÌè¸!`¶œÀmF¥†¿(0Z©ù«ÅU¯ø¡ÿCT l„n°æÅÇK‹µbõA¥*Mö¾*`„Qà:«÷ýP@Ì è«N°"­#‹U¯Yo¸¥Ÿ#W ±Pè™òš^tM ˜û(ùïÔ‰hRuWæYq›õhY@Éå)¨9ûSÍmEžß丵e·¶2ÓðCwI:ZóÂÙ{Ui=$®pÅk‘ÊÍ1ØpÖ¯á,6\y^¦ºAµÜB‰Mt¹,ør ,3iŠ­ê“VË"¥Õ8&éÀ ÝÈÂ0ÎXDÚ |laÇ,Ç1³n"CU8\ :—xLÉ=¿X¾×Ùµp ·9%Ø÷Í£v?Êa»æpÇÂid,d9Ÿ³8g!‹ŠÀÅ÷¡Ül=‰ª’½;‘î]ûðl4 ¸‡&õô®†NŠ7˜ËW$wÃiÖ‹DL3Dc–ÎíßåX„ ‚öŽÀ…ƒÜâKæÊí¦Ò³ê§W¨Hp³h•àVI}<ÖÔ?Ò)ú†q§h5 …N€û„-¶‘°Õ—Ém(vׯ6TÚ?€ä dd>F¦íçHì g«ò?’ó…/`¾"zЫMÒGä21J—Ô¾˜à °×`† ô1¾ÿÈ¿°˜ °I=‘§åÐO@•O­ÿ]}UÙ܃8 1ê{ôÈl¾%DoÆXÿš±Eë~‹©’‘]ÿ]Ä›%RZf²l¸ëa ½šÔì,UeHÛ²çÉÎ8dd¶öÅý¹8îÚSHqÜ8ž²Éñ¦ Ç#ƒ‰8ž²™‘Ažî¿H¾CxYv™z×E˜Ø´ ¨(êú¦”á¿¡'ž!%·Æâí/ñÙ1ßHÌ7È|¢°!3*(…]â:WˆqÓÐèLtã:éPOù*O 'Oíàè%UV+­þÊõJ«ûyG1Ïd:ž,ƒ¯¤v†OàSš€¶K/iž€DLDÿB¹"Íg¦,ôÞYô\Þ{Ÿˆ§0%½) FùíàPK½\C7ì§„¸æ3<com/microsoft/sqlserver/jdbc/SQLServerBlobOutputStream.class•RMoÓ@};uâú•JZÊ—cGrO=âŠC¢TUª8¹é¹Jì`o \¸ñøpŽÔ¦ öÎfW¥‡â•gvŸfÞ̾oß?ŸXƒoc׋°±¨Ì ›MÕÆ–-Ü´°bc 5nYXµp›`ÂTIJ9Hv N/è—&YòRÙ«A&ÒC‘û{»½ û¬ÓÕGýPÌd*ÂáÓ$#P›0õ(Š#ù˜°æþQ»¾M07’=AÈ¿N#©¼û¢©`ûÉ›žÉ(‰¹†Å`«¥£]vfqǃ+®bÆÁ*î:¸‡û„ò~xªÂªÚ aAãQ´¶.P.êŠÎ#¬_¾ó­9:]-¡ô‹øwØpUÃÞåY …LÈæ[)øÊ·­ïÜb)úBnŠ, û¬OÉ­wt½A÷®Å}~‘²û7ZßæÁPsäx±\zÇŠ±7ùŸÅó¼«ÁÐHÉ;ytŒœç+S;†1†úX?”8[EW96Ç~†ü0Çžoø§ÞèÀ²&ç7Ó)•ó” ž¿<ûÀ;bÚ#þÒòùuÓÛáCÙ|r¥O˜`~µ³hNP8AñlÌ$à)^áô?©¯S¯2f°¯˜_ › £:‡ï><÷Fã_Má'PK½\C7%cþƒ½€Ncom/microsoft/sqlserver/jdbc/SQLServerCallableStatement$1ExecDoneHandler.classRÙNA=5ÓÐtÓ¬Ê".ˆ 0[ÒøD Ä $c"ÓÄߊž‚iì®Ò®ñSü^LtH0ñü(ã­6áÁÑ©än•{NÝ¥~ü¼ú`ufF0ëÃÇœ‹yîXµ`Õ]÷pßņM/Ñ•u†'íXea–ĹÒêØ„ú]ªE~&òð´{‡Ñ~;*ÂOS~”ŠÈp#2!Í&ƒ}”¦'LáV"ó”a«:0cíƒÓR]AtJn+IN㺃í¨#xWä›µ× þÎy,ÞšDIíb)À(†‰s[¶].»©ÈŒãÃÚßË4¹à™EÙôå¬XÅš‹j€–vì³òø‚‚=))3åZ Íм©åõFÈktøo…\φa¦Ú>åg»÷s^™ý¬ÓÌ7ŠòˆXvkŒËhüPK½\C7Jæq}²YScom/microsoft/sqlserver/jdbc/SQLServerCallableStatement$1ThreePartNamesParser.classS]OA=ÓZê"A¾üµÝ‚ "*‚šXƒ‚Ô”@âÛ´ÚÅí.ÌNßLü>ûˆ¯šX$>øèƒ?ÊxgÛ ÄÊmrï¹wÎÜsæî¯ßߘÄãN¸’@®êèš6£ÚŒ%p7¸‰”^¦ud&Á¸61ÜŠaŠ¡kKzEQªI‘ãR1ô.mòn9Ü-[y%m·<ÇÐé½q…l%®xûÍú.U‘"ˆ_ðª`jœ¯)Û±¤(‹]+Ç•Ò%˜U±ý±I†Ù¥¢WµªvQz¾·¡,Ûñ…ÜÒÚ,ŠVþåR>Xf¹ãð‚#òŠ+Q®Ò½äߺª"”]$ÀyÛµÕ#†ùÔ©Ók ‘¬W¢Þ“e¡rÇåèK¥Û bPåÊ¡&Ý´\8&ËÈ—·À´6‹®òtÒgèOý š^3Ї~¸mà,º $µéAw Óî`$†wqÏ@/θ٘ü‡ –O)ÂØÔêÑWôsºyIìÛo‹.QÏ:Ü÷±IrY)lŠ"ѧ´¬3'¶óláIVw¢ß“ï®JîúWᓜÔìb‰Z³7l!×mUy*½ÚÝ6ðŸùbˆÑu[¶C9ÑNß3VåªXÑÔ¦žÌV¸Ì‹íšp‹¢Íù寡¹6=-·ðšÈ~ É+†hYÓаØf°è{6èK¢é (¤§ ð=ïÕox0œ‚zÐÜ Òzˆ"‹ªCäGÍLÌü†ÉêkÑ&j ã±:â_Ðø c¤y¸‡<ÓæW„?7ÓÚ¦#­ôŶéh#Ä%\n¦? Là=ËìáÕÄ3ûè\ßGâ#^G÷qæ'ÖÍñõ$l=gÁÆ[U3Ø!‚Ÿ0aê{ÿÒlVP¢ïHײ„ÌI$ÈpÉ?PK½\C7Uó]¢D=com/microsoft/sqlserver/jdbc/SQLServerCallableStatement.class¤ tTÕõÞ—Iþdò€$@ KÀ¨ $ YCÀ©&3?a`2æÏ°¸TÅ­µ­Ý´w­J÷Ê„JU즵­]°­Z—Z«­¶µÖ­uƒÞû—™?3&AáÌýÿ¿w÷wß}÷½—'?ø0̇<¨aTÁ˜‚Û=‡;ìôÀS¸«á9 Îepž‡ÀùüöY/pã…Øy@ân/Vð”à¥Ü7^îÆÏ1Æç™ì ~¿È}_RðJTü2~…ÁWákÜ÷uþ¼Š?¯fùßà¶køó› ö0¸–Q®ãŽëùíoô@ ÞâÁ[ñ[ Þæ:ú pƒ½nü¶¿ƒß-¤ïyðN¼‹IïfN÷0ý½n¼Ï÷»ñûn|€[÷b‡<¸ àƒ8™ýqðÛÝø?fðãä¾Güˆ¹ý˜ß~Âà§üù3ãÇü¹Vãüñ é.ü<Éh¿æ·ß(ø[~þŽÁ!n~JÁß+øœ‰䯧|ÆñYþø“‚Ïy ŸçýEÿ¬àKüýþ~™ßþÊà_åçßü;÷¼ÆàuÿÁÿôÀ6ü·¼ÁŸÿfð&þ‡ßÞRðm~¾Ã-ï*øž‚ÿuãÿ

¾ïóð?Tð#\„óXö@ñ@?Qxàrn>$P‚†Aäyà áâ–| n…44ÂÃxEŠŠå«ñnCo¢Ø-JØñ»ù£Ô-ƺÅ8~ïeü,w‹ n1Ñ-*Ü¢ÒW‰IŠ˜ì;pG‘˜"Ž!€{`•˜Jmbš"¦{àNEú˜Á Šûf2˜ÅàXÕ,|6ëVÃ`ƒZu æ2¨g0Á| Çàx'0XÈ`ƒœÄ`1ƒ –0XÊàd§0hbÐÌ …Õhu‹eüÑFÓU,WÄ E´+b%‚gÐñtzT a|Çïvo},Ö7E"Þ]-Ú@H¡Õ±èF$$lG(M64iZ ?¤úF…Ͷö_݉PôjFC“ϧjãTwøÂõ_$¬…û¢õÚ¶ ¦F¶«‘ú-þ^_½Ž­FÕ •^_4°]íŽFTï‰4t zCýõ«{·¨>Vll•—øF¢pHk hÞÞ Áõ…Ý»BÑÍj4àCXâ#M´*’\•\•\Å’«ºOëèÖ?[¼Á óéŽz£ê€Š’!6Ñ-ÌŠ$4BèR„öaLJ2‡B¤5©Ú`ãGæBý íí³×!¸ZÂ~•ܽl§OÔBQûiÔˆåqvB~µA2¦_¦öÌ©nŸ}^Ö¢ÞH´KÕbÁ(IË«f¦r0æköF}›IóÓ.‡£ÅŽÕ¥x4î¤@‰¶50˜†Kê®gÎå¤v¦õÜS@=ºE£É""Z® ¨‡Úy\dßøjÔ^HxÆ'ã2°f9Ñ:!Ž"fÍþVÕð*Øßâ€7º¹>Ù×À.wѬØfUoȰi}›¨]aÜ]QÕ@l΂HínÑðõì ÔTæ„ÊÌ´ÕËLKn¢©ç6ÒoFvÙ°fU·Û²Í5ä÷F9°%hk8F“Ñ0¿5‹ù­†ùmÁ°×Œ’¶,˜m†ñaŽF\™q¥!ÝH4á”È?Ã…S‘õëÞŽ˜úugÛmè·6018Ü6üà˜XÃމø Ǥ”¦ž”?õ‰†£wbõð[¨sF¤¶…ÝøÉt·È•^­3 êIo½‘wš4_ `­8&Âõí¡ÁXÔè!ÚÙÙmÊÀX=Ôd瓉م§Ž2;UÚ ¦7£¹µD%Qî@±¡Ù£.qª2š­ñ±Ê±aÆÇVŽÒRë®ìnLO–L«bpR¬Õ2ЬœpÚôjT3kN'ŒvËFᄲÒd.úN8ÝŒãÑlÅ ÖzK˜±V9Åo¶ŠšˆNïêpN®FKHÖŠÞo¢'³ŸÕ3û%‘œÂŘÆ aæ0“µ½r7ú‚úK§JÑÛ¦¦au†£máXÈŸØ,!LI¢t†u¤VµÏ@ŠD ¯ÀR¬üöª„§á Ï2ø±š{׈ÓÈQTÝ­_E;o¿ÚŽ pÄ”tmämÎNÚ߬îë"Iª]ð1T¼§§"H6Q@©ý*«!ÖJqºX'ÅgÄT.š7ï$)zÄz)6ÀŠ8Sг%ü^¢2$É ÉÚìêæ(âl)6bµ›˜Ÿ—´‡çày)z© Þ‚·%ü‹Û^€%¼Éoÿ!€Ç³•>~AÊ÷ á#ÜÂ¦ï«æ/Û©úZÃ!u…7äòîoLF‹l§oDUcã7+" űõÓ¶6˜IÁi-RÙȬ¦¬kãvo0¦RÌtÓäG{SE„¤³Å6E•&¢RÄ8(^ƒ×¥Ø.ÖÒ𨇀Ÿ„ ¦nÄçñèQŠëÚNí#a]æÞ]õ“LƒTWF³ìXÓ¢Í*»,UýRì;±KŠsĹŠ8OŠóÅg)-¤O™æX_x¸PŠ‹Än2~*í—£Ô5U¿˜›/–âF¸TtKøüSÂ{ þ+.“ØïÓüOŠËÅçRâÖ áøvþN™VŠÏÃa Ãá”è6³˜W7(~1O|ºĆf‰¨H,DÉB¿H©>e‰JQÂÈáR|I\)q4Ž!“zî–âËâ+K°”Ïdgd)¾*¾&qŽ—âë‚>ÖaÙµ¨E…Ärœ ±B\E+%NÆ©vy}”8gRÝ’¹Kq5ÇÐ7Ä5 rÆ´M‡åúAGS¤_“â›Hã Ú—8X§Ü{ô‡ñTö™Å]ÊÞÓÚ4:ðnUÛ"áÖH€ó—cÁOw` ÉNIß”DTM/fºTÕ( È‚œ Ð:ë]»kP¿ê h¶¿’²w ÇÀV÷¸šUДXW¶"g´y9¸YÐÖq ¶_½úAĤê¬LøÜ¹(&\+Ù«vL8ÞÁA5äOËÈY/°Œ:è*îÁ½îhØ’ëâÅ^?na€òÐðq§9€KªÛGLéxAÂg%Æ@Ê^c'ar> •šNs¾BøTºùõ툩Ee+Ï2Þ…$›Ú(ió‘lYI„䟕$ÀH­GaU‚óvb¬¾¨.O;< f”¦ð*çâÁpHSñ§aoò{ù,_¿ëX¿Þy™½t¸‘uÜÑ8ú~ªQgù!õœµÜjÎ8I¶.WÒÎ[­›D¶ù¯jÍ „‡ê`$‹µqó¯ßÆå«·×«©-aZUŒ¬[W=Ì¥=åêzƒqàloB˜;üZ–d Ÿ9S‘ß>0Ô&lc|ä ¨½N,«¶]N$×>ZÍ» £h,uJZ•úª·ÆŽÙІyû£×Y–#¸É¨ûVó¦Åø,¦Ï±Ñ4Î,tN‹©‘]|œ ñ!ñ2Ǥ8²¥Ï(PºU¶*¹±O´Rf ©;ùAl)¨ò¼~ZIjŠ”Ë]ZàžýýLX4×±B-Ö«™y¶,ùwi^åù¥Øxiï…#j‹—c¦´—VÊXÄȈü‡-Þ¼´͵ϱéè#ÃÌy3ÞÂL»š)«nwðñçY.[&8öè]6)'œ½`Lét;2Z—ÕíÆÅF~u{s¦ ¶D‘ÐÆéþ¨[Íg›ù\i>õÓþR‹Ø~ð^æWµmÞ§»<ÑḃCð üÜ øøßÓðŒþ|V >¹ÖŸÏÁóúóx‘žøì˜hÿ¢ãºy+›øê¥ß+ð*áþÞfB>ý˜X3§vòx×Ôäí…»FìƒÂût¢¿ÓÏE,vÓï5xÝ$¾ tâÝ5qðTºnYYó=|,8²§tÔ~=c:]AqOÞ(é©‚ÒîÅ.Â[S7чq¥ãóöC1(Ÿ´&ì‚âÃK˜I¥Ë¿ ó~˜x-cÝPt*z† ò‘º8LºJë&ÅarMÏ ¸6‘¾éZ–ò‰§©eäÑ@ ™b±¦ç1·C‰õ‡©{@Z_÷ÒK!½ÜDM®¼!˜¶÷È›‰¾4IÀ§ìôÆ’’¤gMÍL×½gø÷Á1º)c‘ØÌ¸=i¡7À¿‰‡¡í &Ù¬­NTJ4ÊõIþ¼Ѝ¿ŠäÌL7½˜ûMf¯š¦?›dtC’QR¥"›ƒ‰ï,¶ÿ:85¯ÑÏ[á~)¼ èn0Ü5K§/·ZhTì*êmÇ^‚¸÷ÈC:b5ºYƒÛRðô¦[i$øÉß~ Âi†3™¿²ØjŠ–Ù‰âíž‚o9L맘֗€šrÕœf3g?ÔfR½oTX ý}ê˜j®…* Ú È[è謁^†ªR4¦=iŒ±kMñ[Ï}u¤½Ï»N&”‚½p³>eæSfq~rÎ0¥k“>q ô‰31bÍÔ'5ÄaÁŠìºà¸8ÏQGó¢zNðÓÇ^X˜¨B}8oI(Ûµiý>]AÆ‚½G^çF7O-÷%.ÂÉNiàÓÏåäg=9$=5•dõB'ôwMô&zyÝš\“ã°(slÞKLåg)á0é“)Éfžî¹ Ï­JK6ºËØÕãJO2=fNy2Õ ]<R‘òT©¾ƒÚ¸½´¨L–€MŠÙD‘Çâb\†œŽUµA>Þ[{Veêù|”Kdg&ÅÇpؤ˜eЬHˆ,0E„Õ“h²¯q¢>bRWšÔc’ò(NË á›(“¤Î$™–Xü¾Ýȼ;ÉÈ®8tg8Š˜ˆ\v®Í¤ÈC×0#xºQ~.1ë2) P1)¦›eIë'üù™L¿ ;—¬32) Ñc›ð"9á1=NèE¶±©c•D&r„K«ò¤5j sÖ„ N¤£²GF­£´Ñ8&{d¸í‘1úŠŒ3ãpÖ=LŠs¹ñìLŠ,Í.¶À.¶èn»1›îv`26—Xo&Å8Ÿ]ì‡v±…w‘ØÞ8øîr`R–K¬?“¢'˜+ˆ‚‹ÅÆ„ØU4.êÒâ‚É7SÕç^Z;ÙÔb±k¢ëQè£z‚Ÿý{hÙšèÚ3&º2±'æÒhs&EV33™ó¬'å³%“b2NÉ:[¶fj5É9[I¦fŸ-g&gKЉtZÎÙâ m:ÎÈjÏ€zUN{Iff·ç¬¤=!'ÒY9íqv,V›$UfL`’¼F4¶\°‡pceúØ–ðõ¼I»œ6W\4Ø‚ÚPt°Öu¶õPGÄü5 †Foô ôuÖÔQP×¥«Æìçä ¶˜Ãºˆµ&Å4“b¼ÓªêDX—KÔöLåæ&l_aÚÞ˜aûŽÚâØx×'0~nnãwfŽd=γU–"%nJ”§æïr"ŸKØ9™ê-ÀãLŠËÈ|Îg‘ óÏ­l}~ë Ó±îv8¡ŽÒܘ{Îë9ç÷Ô‘cJ?; Á…{¡l1…Ðîä}òŘGû¢K!”þ{ÿߨ¹ý4DqøœvV0&X7éCˆ$ú P¥H5ˆ÷/¨¼QEMüL¼ß­¢‚ ˆÖõ‚Š X¼wÔÄg}õÝw=³»®µ³ }šÝÓùöLÏÌÙÙßÙ¥±”Bªaÿ£þq—5ºFσzKqÖòÆðæáGäH‡ƒL3Íu¶¹N‡CL2Ã?•@vŠ“Cˆù:Aþ,lÙ&„?)YF)ƒ6Ú(9A¥ÑF¡ÆhSC9Kü£âtâl[%›i>=i¦¿Ù3},Œþ8dùMqt\‡~§‹Í‘¹?é´×Y„Jîžg÷)têÞN‹H1ÎMº¸Krñb,‘ üŒHq^š×â|ٵϦ.þ)™%œÑ’ãÂù…=6ŒYfôÏ Âùp¹”¾P^@Æ‹:\ââHmê…æCÒW—ããcêÒHãóH½Ê[Þ£ÅìÑj÷hIíч\:¿f÷h³z´óV³JR×ÿêkÅÐzùUL½‘"¬MQççiGZ-Pòp“Aë˜Oé‡[M4%£n»À`c¼£Ã݈öû»jØ”Ž:Ü3Tº›—´bCƦÓá~‰;è*dî`Nv»QR‰‘ð}@ + øæStèÔá!?¡të¢çŸœB¦ÁønRâ#./kƒ¢ôØn'væhàsã ² µChì$E®]§q𠤝¥µ£DÖº»ë`h¡`êò(¯P /š’Ò*§xð0Ãðð×çî®dEÚNœA3Ú«{÷œï|çyõÏÿüuÀ>üY‚3<…Wøã+üñUg1%A—1­`a%2fdÌòÝ9~^’p^A.H(+Ø æP‘aʘ—ðª‚X2l Ž‚øÛ‹Ûð4¾&þ×ÿðÝ¢B&—$¼¦àq| }CÂ7<×%¼¡`7^çß’ñm o*Hq¤¾Ã®øwe,óõ{ Þ ÿõ¶„ïKø„2ˆöaÝÑ¢cçõ‹z¶¬Wf³“ŽUªÌ1„ f…áɱ‚9—+,Ó6gœ¬ýjÙ6¬‹†•=_œ.d'_›t·#f¥bœ’Y!U•¤FÌrYç{†ôC1ê¤>Pª”œƒ Ï'Ýv«#}'„³h0´ÏÎ!»P*Ñ+CŸcx,Ùç)”Ìl®2¿àx/ˆ„rd±`ÌsHJÑ:lÃiäɰ÷áì6½â$¢d}äœnéǰj ¢ ŽzѰxøHrraÚs€¡'9šë ÊP¸lTfs”ªdß(ƒ§bC~¢â§øeÛÅtŒE';nض>k5­9Ýaˆ?»P±æçMË1ŠTN”E›yÔ2çN˜*~ŽKú ›¼&¦ÏSÑ1lçG{)Ò{y¤¶5ÄMÅ»ø¥Š_á× ƒ[,fq ’¿ÌðìÖêéðŠJÂ9\eÅýøÙRå¢^.ù“«EJú¦scfe–[ Ò¯‹ùå¶cS.WqŒYÃâ¢×T\Ço¸™QÏãK*^À8ƒV/D"Xï*ïᆊ÷ñ[†¡G LcõqÃ7ömÂ+E'p²Ñ·‰™*M Nsá /ÌÌpù[¸Í¼Cåöòdÿ¡I*8¿Ãï%üAÅqWÅ*þÄÚ:¿têMÊÐ]ë*«×ôé2õdvk˜õàRóÕ§ÚDÃ) ò¹oËc‹ZÆo Û üfc¸X§½IuIJj½;`ÀN.-H¸…güŽ|Éë´`¤®9ý‚Áûô°Uâ1°,Ób(ÿW‡o°Õ^ëÉiN;»es|sÎf 7¢|À%sü}Ä^˜¶ës2<ÿeǬ)w'%¤ï쉙àÙïNÔ}ÄݽÂúü¼Q¡1œÙR¾½r³þ1~P /9†L³ïÌðƒ[²ƒn˜ˆnYúRÁœ_¢¶ ¨—\À‘\Ù¿‰m÷êàwGßIì§ÿQ ÚèO×3ÑJ÷ø‡.z¶ñ«„ÖšŸðz¤]/‡øij ,•þm©Ì‡}à*2|Ï‘ÌCtÇYê/ná¾T!^Fzá|Tºy ‘1ñoPò¡è¶É¼U'ÇKgªØÎ„ûhçš¡ÛÙ½utäÉ`ç=×Ì!ú dl˜Öö™EÉp­aÎJ¨:‚£>¡Ñ¡Ë]°;8l´–ñaî«ýýÁþåªÝB{ˆ¯Ut½‡N%qé2”ø„£Ý÷ü÷=‰È¥ëèLøRË´yÊuXó×ãuôäkxlrP$Ñ6bbÍñøU_gg³N,_Ã'‚tŠñ\"¾¬7Øm÷'VŠùÏÄJb%>UEo«¿tƒùþ~ŠV¦(×øÄÈj qµEëŒùZ§(F"­C,M!Ф?Â'(8R7â«©´â¬|„„€]UìZ|ªø´Ë?²êf¯ Iúßß=îÚlnÜ7÷ŠoîØ®È¥kžnx[(í&Æ;hÉ—G†vé]бRÅg„6M sMX^Õa*ÀÅ1áÛ4¨¸Í¼ÜY‹K‚(PÚ¯bcÖ^lN´çr?÷ÙËYŠCPZ(%õªœ¾Çð’o¼Çï&eOäS÷Ù{-ÒÇ1Ù*½Û•ÞÓ*}/ûÒ{(˜omÖÏCØïÆJ ÝM%úÝMÉ»ê'=uö>Å%Bë»ý‡Âå/så&º ~³I¡;Pü€ „ÝÙžÐÂò–þšÃ&{•"ÅäZÜ4á TMàÆnàiW»¯Y;–×·UÔÅ+èÐMœâ7}„âÇ ¸Í¦‰Ëºæ^G*ïîWÖ”´ðutŤÍìV‘9“úÉ&·ê¤bRý”ø;8í¶§ PÅÞA©ŽÇEº|X9&7!ÊMˆ1™ËsdÙCÖÄæÌñVý²Ÿøw¨L$Zßd™Û€ËePjb­ƒ¸ˆœ‹È¹pñ^~–‰WñdþPK½\C7Hmr‘…Æ@com/microsoft/sqlserver/jdbc/SQLServerClobAsciiInputStream.class•TKoÓXþnl×±ë@_)i:$N™ð~()…I'ˆGF#1,fÜÔ¤¦ilƒ`ÉР!V°i•h;ìçG1sÎ'ªÚ.ŠªžsϽç|ßy9ÿ|ûû €£¸a¢Ç ôá8‹,N²8e’8mâ Îê8§ã¼‰$.˜00–ÄE6.±Çeã,®°oIÇ„Ž«fË Üf4Ñð§F+5¾8ïÕ?ôïGÅða#tƒÇnP|03]+VoWªÒdï F®3ËÄ”€>ïsÒêž®zÍzÃ-=\Ľ’@ט×ô¢KÅÜ÷°äP'ü‚ѼpòfU@Éå§Ä'ŸÔÜVäùMâë­»²„‰Y'¨¸Íz4+Ý(§îÚ¬[›£·Ð‘wŒÎy-R¹)ö0œÇŽ×p¦®|/ÓUEÎZî^‰Mt¹,¸@,3LŠ­ê£VË"×jÌB:pC7²0„- maöZÄ. »Yd1¢cÒÂ5ŒP;¶×ŒNµý(ã¢çË7;·®ãg¦¤,{îüÑL9l×ma ¿Xøó9€Œ…< ,*ç·?Š+aÍóÊÍÖ£¨*Ñ×'²þÖÞ>$mE#ž–I¼á†¡S§äò‰Ýpšõ"Ó2Ѿ¥s›oyÅNAûFàÐVn[á%såödéûê£Ï P‘à‰Ñ)Áó’zw¬iˆ¤Sô?„}ØO§Q(ô Ûk¶XAÂV?'W Ø>+PYhˀĠî“äÈÄ%H÷ÙÉg ] ¯¡« *‹ÒwXfCÛIþ´/qT>æKSTbúR医…U˜kèþ*uúâ“hò1À°× `„÷èáø>ë/¤`yµÀAŠ#ÿDa¿R²;2ÆÂhÆw¾Œ]%#»ðJTR–ê¡c&ˆ»ðýíÓÍÎRWµ%û.Ù‡ŒÌÒ&ÞÃÈżçèN!}„yc>e‘ùÆ ó‘Á@̧,f$É‹=Ô¹ÿÏÊ)ÓìÖ&m Tu=cÊÐ;è‰HÉ«½ø÷ÙVxvŒ7ã 0ž(¼—”ÂÂÚ*®ÇC£?àäú¸N:4.åEaßþUôžVe·ÒêsîWZÝŒ;Š#ñN¦ã1¸$µ³|?Ñòµ]væ-HÄ@ô+ÔÙAÒüfÊöðJoÞŠ£ï=ñ>¥¤7j”߯üPK½\C7VqØ3ÕAcom/microsoft/sqlserver/jdbc/SQLServerClobAsciiOutputStream.class•SÝoÒPÿ]Z(”º(Ât~RÊfqê†1ćÌ4Õ%dO…UÒ(¶ÝÔßüü'ôyÉ6gæ»”znÇ–¸ñ0›ôžsÏ=ç÷;÷þúýý@+2¦q#)ÜäË_nÉ´Ü–p'Ž»2b¸'ã>ŠT %24I”%,JXb‡–g‚zÏm3,6;n_ï;ÏõÝ·î¿ëù¶·k{úöV»£›¯šf¸åÞU†„x¶Õéú ¬Ál›Î Û³k›!²Ycˆ=uNðŒ¡¢þv£´Á ÖÝ-‰¾÷ŽU7kÜ,?ÿб‡ãˆV"£a„Þ* Yä Û†Æ!ôb$k'!GˆµÊ…ù”4B|UÔö‰jbNÝ´²©Ä‹þwñYò–MÄàRÕÎ |þ¸ÛZùÍ”mãÉÜ;‚¦~×{(¦Œô¦€4Ãê^ÞPK½\C7Tv›©[6com/microsoft/sqlserver/jdbc/SQLServerClobWriter.class•TkOÓP~ÎÚQÖU„ÁÈm0ÅÒM‹¢¨ AÄlx!jˆL)eÇŠmEÿ€ÀŸI`3bô»?Êøžv,È Á-í{9Ïó^wöûÏ÷Ÿ&± £ã1$p•¿T 2Dh2Y®å¸vMÆuè&%Ü!㦌8¦øñ-~|»Ó2î஄{fämõª~¡â¬2äMgKß²M×ñœu_÷ÞW<Ëݱ\}smÕÔ—Ÿ/.&GçbžïZÆÖ3Çc`%†¶Y»jûs “êÿ*M¼b ΚÅýèÚ>—ê›wË ŸLkÛ·*åÈY,h5½ê⦱cè£ZÖ—}×®–ó! yÊ ÷G×+¼ A ,³âx”-nnXæ»7Öô!£ I)ô2tž ă 0ʵaW‘W0‹û”9€SüËfõ ÝßvôâÓ¦WÁæyŠôyÌ4%|ñ6lÑ K’ðHAi°çëk>H—¡ã(ï‘C; ¾bË»fèSK§Ž»Hk*[þ’åyF™¦Ù£N´âè×Q±ªe?œ=Qôó•ql‚ %YpÝ£rÆO[q«‹nN‚.¡/m5Ðh±$côô¡ —HKC [ôhu0 ¢eù+}aüÃh?ƒÄæèÂFHv³ì.Ä=íâJ¶Žh m!xˆ‘(ñ€6Ü ¢-H’u´rÖ›µ2’âgƒšüŠÄŒxˆøJ¿XƒRÇ…_{H¤@ú#9~´~¨1ˆ®FGY![CG [k£@!©‹,F2Êkj^nS$9PŠçK9‰Žðë×’ SŒ÷¹‹NÞM¢óºÂnþeâ/PK½\C7²å]ñ)Icom/microsoft/sqlserver/jdbc/SQLServerConnection$1ConnectionCommand.class•SKSAþ†,¬»L4DPQ|ÜlÀ^|\9X•ƒ°‚¥·ew K%»af‚ñ?y±J¢åÁà²ì‰H8ôô×½ýøª»÷÷ŸŸ¿¬b݃ë.\Ü0hޥ禋[X0è¶y‹{6îÛ¨1”ÔA›¡ÚÜã ç­ Ò2Ë[O¦ô^¦j« ëͤè,‘…*>ê€R”‡BûénD›Íhh†Ež‹DgENÙNô9×{Bg Uz–å™~ÁðÞ»x©ÓÔN{ê; VX¤‚ú¦ÅF_$=M¸äÕ?0¸ýDtM-ec‘£ŒË,qLƒs<‚g£ÎáOË+xl#à4Î5†ð¢„kk'8,:8OfFøøkrɰ+%Ó3mçY®…”½®ŽwÛâí«è¸Np>†ÇS`˜óF+K½%zBi††÷²~ö¾ˆÆ;™/ZøÒù"¦?ð¯-CùOÕ¥ýÐÎ|o|Ï-§Ãžå–ÐÍ¢EÃÕ¢OŒg)yÄ%¥ö&–ÊP›ìÀð|Ìžp5H:‡þ@`‚ÎŒnŒPÕ\®C?èË ÙUB d[Æã7ŽÀü•ï˜ð—Pú:Œ­à*f)ÂD.’f¤ç}kËÿ†Ò“þS$ö\²¾ SæH, ¼Fò°KÚ!ý•¿PK½\C7ú¨QéLuBcom/microsoft/sqlserver/jdbc/SQLServerConnection$1DTCCommand.class•SÛRA=C6¬ÙL0F‚¢xCÄÍF\@Å ¨U ÏŒèVLj 2T‘C©³)è"¸×Ιº¤ŽaŸD2<8,pë‘Ø\Ki'Ôsr«&•æRäûc1ô4CàZs'É×§Läw5(#½’·í¨ ŽB¸ÁÅx|ŽûZXsète¤Ñø99Jl~­:¥ÊjÎÝ.5ä«Þ¤hhþ”fwCê¨Í—›ÐuBźí›L,5}ž;=L¨ûè%¤‡Þ=€v¤xL•â í4¤ÁšÓOƒ”±H§_}ÄgˆGb´ßÌô×!2©¶ˆe²uÄEöº3ÙÅ´&êèø ‰Œ =?4ë0˜NüŽWŸ~d †áltDF_"¹ôæT¶â‡ñ¥Xl~:³#FKœQgˆÙ=X´wð“~r€‹ñçè@ä+ +ÚsÇÆÈÛ6Ú‡3/ÑIÞ 7H/Afºé=tב:áÞ<À[‹gP»(ƒŸ¡ÎQ9 ‘Æ3´ÇŸÇ"g¯ÿŠ+ý]Ýû¸Ä^Éöñvì9Ãà¥=\Ž—ê¸œÝÇ•Ålæïž±$p#ªB½Õå1LTñóèúPK½\C7«š&…nCcom/microsoft/sqlserver/jdbc/SQLServerConnection$LogonCommand.classR;OÃ0þ\Ú††¥@yÃÂPÊ K`@Ê‚ lÁ5mªÔ.±[ÁbAøü(Ä%C%ÅÒéîìï>ßëãóí@%03ŽŠ"fmÌaÞBÕÂCÑ´#½Ù`Øñ¹êºÝˆ'J«ãêÛX‹d ·Ó¼ænpæ™ë))7‘’û ¥à^š¶0'¦ƒHFæˆa·6:ÕÖ%CÞSMAœMur'xß=VÛºb°Oî¸è¥8maÙ…q†B¬ZJ:°±baÕÁÖGýxÓOY<Õ톲ÉàüpO —xq¨µÐ {¿²_ÈH‘$ýž ¯cq~ yÜ¿¥5,“a¾æwÂAèÆ¡l¹I"ÙÊzÔµ@ê^ȹÐ4ãMÙüc6#G|k*¥MX Å*éðH—ž‰ ò²ÉOoœúö3X½’{ÁØc†+cSô–¢ª¤YW"Ð+òù‡ 3M’§—2ÉbÆK;B›¾€ÊPK½\C70?ºº:ÍŠ6com/microsoft/sqlserver/jdbc/SQLServerConnection.class¼| |Åõðìά5–×¶$[v”„d%qNœ @ˆ9Qð…e'$¡uim+‘%!É9zA[Òƒž´ôGHÚ%GzèIéMi ´…–ÞÐÒ»%ß{³‡V¶œ8¡ÿï—dvÎ7oÞ¼kfžòõ—>ó9BÈRe}¥ôü8&?vCò&?qË?•æ’ŸtÉO¹‰K~“ŸcŸ_`òKLžÁäYL~…ɯ]òsn⑟ÆÂo0ù-&¿Ãä÷.ùnÒ ?Íå?â÷Oôš“'ObîyL^àr'Îúgìû.¿ÈåfÿŠÉß0ù;Íz¡¹J"»I—1Ç?0ù'&ÿÂäßá?˜û/—_ÂïIH(ÁDâTvSJL*0qaÂ1©ÄÄI&*§ÕœÖ¸i-õpêu“‡¨“:l¬çÔ_Ih£›tÓœð;“ÓY.:›ÓsÜ$Bç¸è\Õ°a–ÏåôÌi'v\Ï鬌pº¹œKOpéûœvqÚz0éå´K?äô Nû9r:Àé —žæt"3“Íœ^ÉéN·rºÓ«8}…‹¾ÒMn¤C8ãvÌÅ8ÝÁi³ Nu.=Æ%ä(:ŒÁÜ(&INwrºËMStŒÓ4§7ÍÒ«Ó&yN œŽsº›Ó=œîź}œ¾ÊM>E_í¦¯¡¯uÑ×aávé?rsz-0}=§oàôØ~&û1yÎ÷fNßÂé[9½žÓ·qúv„÷LÞé¢ïÂí7&7`Í{8}¯›ÞHßç¢ïçôœ~ç9ÀéMœÞÌé‡8½ѾU #ÈëœÞÆéANowÑ;ÜäÇôNLîrÑCœÞí¦‡åÂæô#œ~'ø¶ßã¢w“g 3Ô|‚ÓOºé½ô>l¹ŸÓOá÷LŽ`r“cœçôÓœ~†Ó¸“âÈÏrú9¤ìç9ý§_äôKœ~™Ó¯pú§sú§_åôkœ~ÓopúMN¿Å飜~›ÓÇ8ý§À4ßãøáœÂþÿˆÓÇ‘?Æä L~‚Óü“Ÿ¹é“ô)ÄåiL~ŽÅ_¸è/ÝR€>Ëé¯8ý5§ÏqúNËéï8ý=§àôœþ ‡?É ˜ . ÁÜ‹˜ü“¿aòwNÿÁé?q+ÿÅ鿹ü&NÿÃé9}‰Ó“œÎ$œúg.&sF9C¡gŠ‹U¸¥K霹€ŒsùF.¿›*ÝÌͪ\Lu±j·ÔÉj\¬Ö-m`óº¥øõU±:V³3¿[õãb n©´"Ô4b2ƒ³Ô°™˜Ìâl6gç¸Ù6 “s19Øv>gó\ì·´ÍÇábÒ„=päl!g‹8[ìfÍl gK9[†–c²{­t±‹ÜR†­âl5V^ÌYˆ³5\¶éf—€Vxž j ¸ÔK§µ˜\† êÖŠIðkw³Ƥ“õ˜lÀ$‚ÉF»Ü-½‰uc×7ëe}X¼‚³~„Åd ˆ5ÈÙ&.çÛÌÙ•.¶Å-½—mål~¯âòg±ë+8{%gCœmç,ÆÙ.w îf ¦#êÃØkÄÍFYdíĺ]n–bc˜K»XÆ-}éŸu³«h²<Ô°&ãXܹ=.¶—³}œ.h`¯æì5P ¼ í¯å tÂO…À±k8»¿¯çì ø}#bsâ° {goF•³œ³·¸Ø[]ìz{›DÔ®ÌH&Ýž‹¥PŒ¤Óz®=Ëçõ¼Dêú[{¢­í‘Þž¡hOk_tCï€D¤ˆDªÛ3é|!–.lŠ¥ÆuØ ‘HÕ@¤;Ü;8÷A·N‰œ“×Ó‰h!—LôÅr±1½ çò­ùÁt2žIèÐg«DjaºÂ`6+èí™ñtÐHweâ»’czf‹y=¥Ç Ýza4HúºvÆvÇ–¤bé‘%è5ñæô|PÒÛÆ‡‡u¬”ÈŒœ~õ¸ž/è‰p:žÛ—-$3é.}·ž‚yÛ$âŽnD»‡6ö‡%ÒPÈç Q=·Ö¯ç Éád’H ­d ÉX9(3cñBr7` T‹c}_.“ÅÁH¼ÍñB2µ¤X¨ÖƲÙB‡=@X`RÐ2®E_2]ÐGr8eTç’…}@Û¼9Í`—D<ù«S²›€ :ì…9ÒÑ ÃÙœ±±¼Þ:^Èàþ& Ý‚âµÉô•­¹X:(KÄ_(–:ô|<—Ì29‰ÈÛ€HÕÉtIg׎H¾æ¤ãö²#©‹ííÐãɱXª/_D ؂̇žÐÔ™ÔS‰hòU€ Šý™=€¤×B²=“JÅŒ vÅ3cKÆ’ñ\&Ÿ.,…æÅB—ìLìˆ/‰^ÑewZzŒÑNDx¾ ¦2ÀÇÊ"ùŒ1ÊÜ»†l&“Ò޽‹åtd¾Õ§EÀ |ß„ñˆµ`ÕXä%2ËತcB#H÷è{ ÑØn½/›î®Í›[ÞKÇFt؇Öi"TD%Z '*nPF€éàO¬‘YÒ%Ú Ãx"ÛL¥’€M&ÈÛ²xÎp,™Êàòc¹è “¹ÌîdBG ’ÞI%b;’)ÁµáÎÖÁ®¡ŽèP_kûåá¡hdk8cî:à®B"ß‹ïÒ kÔÙë¬uC¯öÑ,ömÁ©©ó˜]a5@ÜT[¿Mc°Ñu1«-\>£[wlg¦(qJ6—Ù ‹\sÆ„¼Ó‡ƒaž@wë•CÐg¨«w}¤g¨§µ;<´¹}CkÅçZ”ü«S›c¹4lPÞÖ~bÛ6´ n—/ܳ †ô¬u´´¶µF‘ÂD*ié‚t°u½h‘AøŠ-b¶ð6PÐúÅcÇÌ # ø¢Øííèêmoí G:°Uí+míìj]/QQ:D¸·««­ ¶ºJ¦¼ÌÍP[HmÔÓ„¶öÞîîˆÀµøkBc?n¤±Ù]·c }(ÜӉСU“Ú€QÃí¢M-k~º#ýý½ýØ\]²ÎÁžÁh¸chÙJlª)Á¡öõ÷v÷êÕ–»×÷µvt¨žÉD÷t„e½`ÊŠmýaØ*¤B_WØ€ì+Å(îŠôtöbSD(dTæíÐkör`¾#™íH¡ÈVF÷¥ £z!—HKmÿ<àçy6?ϳùyòó¼2ü Üä0Ê®¤M À¼³vaw|ãy½k¢¡¯/1îõM Ê™÷zèØ?ÙÂÏÕSy˜,ØlèÓ3µ ¯Mæ#¥&4p¡»Äb±¦È‚M Â{㺠rè6z† Ñë˜lË7FáL´ftS÷ÁÀÛªIæ·Œïʤ{s]°PÞ—$ÓÉÂZјi€L穳¿i2]q(h¶Bk>Ÿ‰ òômmÓËPiµVâdFk[Ñ–ÚÌ4XÀR ^W2¸Ë´W³-å-²RlO—Q`ª (Köd ‘±lJƒ€©Šêñ]í©LKÞhÎc–·¯¾° ÉÊ]ØÖ,øD tß„?,‘Ó[Z9îo I`8 =¬*izŽÓDvÄezÑ›Ê{¦gë÷Lµ³Þâ¹9YµXS"ƒÓ#Ë)1± EÒÙ5‘ÈF\]½=x)Åé‚Ӛ΄Q[''·!–ïÍ&sȬi#în z?¹~},–L ^Âz<™$Ý §²8ÛŒ2³E"Bupð‰Š8Íh.³'’Þ{ Ò Dz,™dž¦Hùý«Ñ÷‚W‡šÓôeFFÎ .Â[ôm3ð”‰LTJ°B½SjÁô£ N –ö‚¦šÚ¹nœÔÙ8‚ ÚZžÅ#:3 ¾ Ãá©ÁÌ¡¦Žçtè`÷Bb9xÏ®G¥’ÍéYðç}—–ÓÅÑ}Æ€„J• ¥=–JvBƒêP { çC‰ÌŸzx)%ªQ!Û‡6d¶­–FuVÏ)ÙçÁ5-À£[EÜìÊs`cv€Q—5ŽúäO?B÷…w® “à÷y2o)Ä*€_<Æœã¤t™ƒLU q,Ñ›Nw2ï(9 #ŽBc¾<AËÈT-ˆVÑ.1+@f³©mž+öœÑ‚XžY–—ÛÓðÆi•ã$ÅÀ¾,¨ñ,^§†!åH»‡·ÄâaØÀ^ØH¤íÌ-ô<ç]˜G£}cƒ×4mkƒ?‘m[O Xpc^_lì‰@ o™¸žÏ‡Ó»ñô5¶ðôê yl7ðšÚ Üâ¢vjŠlk+¯ ýZÓzΧ%nFÔ‡'Õ*°6a ™Áöè²Teà¢ÌÔê†ØìžL½c¼Áê2ˆž{¹D?+Ú ?¥äThŠLÉÍ+¦0B§fçÓ*ÇÏËÊ: ÁÙvºAíå±>÷€ ÖAoá}Kï[P8¨hU ²Š–/áèÝtjP î, Ž‘¥–Êѯ¾doÑð–^¡ÀJR±¸nߟvÇr»ôè´¾²T9%‹Ù@Ö”7ÃÕc±]ÆL†Õw ¶GÐÙiH 1Ñû“ÈÊé …}z2ü™°ñÑÎ\f a|ļíËäð&nzÎm¹uøÄ¡ooq ðjÍ'N›n×Ú§qF;ýýZ…qn–ȧ1óÖÙØ‹£Âœ·téR‰Î\¯œùÓdõoá° q; ^ŽÉ°&_¾t¹DZÎbrÁ•”¸„Wœ”3¹Nä—ÄSâØ­ÊLVT™KßPå»äCª|‡|§‹½]eï…Ãø„Ýçª33žNØü/‘9Å.=Ñ©C6:år™œ*÷Ê}*{'{—*=&}G•¾‹É÷¥¨Ò!‘WcñGÒã`#‹€Z­«„ôvú‰ô¸*=‡¹?Hß!žÈ›Æ] È}4<  „¯w}šÊÞÍnÀä=*{¯¼N•wËqUú#Bû{7·÷ö hªô'éyU–‘•HOãTÏ`ò,&¿’~­Ê›ånUú-®‹åA÷¨ÒŸq)ÁÿÀú¥°Íö4Û{ÐŒ{Ð\fÛ\ìF•½½_•þ-ýG•þ‹^B˜'ŠI…ìRe·\¥J/à5šóŽ!êFs:˜!û€Ê>È@×þ!ÐuÑñl´žPÙMò~•ÝÌ>¤J¿‘¾¾sÿãéÃt˜]ì•ÝÊnSÙAv;¸à…ܸ®²;Øà~ ÇRès7 â@+-éžÍ眱Šú‡’Æy°Í¸…—Èý`µŠ{Ö»c§8Á{&n£Êîb‡$Bµ†Wðm7À[!‰ÈìçÝr78ñýCYóz£;¶796>†,©‹Ëu´'Þ"ؾ@é‚×K„¸Øa•}˜}DeeSÙ=ìã@†r—ªôSégªô¢ôW Á8ì¢Ê>Ôû$»W•wÈq¢¬íZ©Ös‰ù &ÈæKƒÊîc÷ÃJmÊ`}/¾@ÌuÈÎøØ=gPÑ!]nƒ{ ¨•©L<–Íäa¨wÔ¤²O±Tv„•ˆ´T•¿* 0^¶rÅ 0z¦¨Ê¯”‡TéÇÒÀ劎§µnÁ¢û€‡ÇòZ$oÖ–5¯TÙ1vö°-ܪE¶EÅFy›¼\ùާ šX£¦Û·°š–·xMÎä´ý(ŸÆ½¯H$sbÇ+ÀàäAªÙgØq`1„YdšÒçQ6<ŽÇUKIJxú”ÈL»g™GÒÆ„ql;JhE‹f›²K5lä.0Ù† ©ì²Y=®Ï&7ÒÞùÎSì⨯¡“ €µ o`ÍÆU!tM°a‹à߉\ö2 7°7{P•þ)ýKeŸ•ûÀÁ;å̰Oq”=Ñ,‘Yå»v%Ó»šUö9„6ê.(„¥J¿]É>/¿Z•žD%ö=TXU)çx½M0ëedÁž ²/²/2›ð*'ö|By9ÖÑæb_VÙWØCª<*'UyX†¤‘6ع™Zñ¢\+yšµ2WKæµB&£¥b¹]pj4Ú¥í°‚eQÇ6Åöjyì}Á:±A d2mɼډv©rNΣ§ZfX3õ©Êf¸ØWUö5ù‰,˜ö5 nä×5`Ñ\A˼°b@H†äÒ`éf=ख़„ÕÁœk¨ìr@\òM0wì[`±Ø£“žBÙŸ¥ ŒÂzbàþ,p@BKÇ `. esµšå¿ö˜m¥#á$i¡à+méÉÀärJSå´œ‘È’3t©UömÄù1Häò.0-ŸÒõ, ÓXR<ã†46û.û^‰ÿ!ŸÏâÛHQ…JW sa ©à ƒáäÈx.fÌø}´9O‹z€YÒúÍâ8- {bÒ [¥YFÉÒûXšeÑ3k>UØPp;~È~º×¶Ý0à·"h½•ùTÒ€_kWu‚&Äš §éã!=®²³'€€‚DÉÌ’H¯ƒ.ýC…x6™-ªdC4ÿ?QÙOцH0Ÿ²tõÒ¥ËT9‹^ÜÏØƒ¹ôeyëª\ÇaC4ó­ éà0!)¼tæI•=ÅžVÙÏQx¼šu嬙ê*ûû¥ÊžaϪìWˆÙ¯Ùsæ.vÙ ­'¶HPZ.Î&Xqn<7¢QI«2±c«rÉäJÍÐÂÖáé5¡Å€÷µþp_וýFîWå«Qc.œîØp/pûoÙï"鄈ÕIǤôôHa¼< ш¸7ÎiØe ,Lfôµ»4j½ ™]ºa‡Ñ—È<­wx|¨%]¢o±I(¿Œ¸Ù ²ª»U=CÓ…ƒU13ŒÀ„x–‰}Ð5®ƒÕN bºØƒÏÇUá®åÐ;hÖ@>DÎtû ±,Tƒfìm'à»ÛÃÏÅ¥~ÇŽ}@¨Mä’èw û1ž¶Û'„͵ çôÂx. ã'Nq¾V|hz…3Ëô:ƒE.kF6Ÿˆ ʉÌM’‰ÌîÊçS(KøÌÓ“1 ˜¿p¬ÍmûŒfD(2’Π׺j"—ÚÜpY\Ç’ù<Ž4I„|²(¦O\?,I-ú¼ø:$”I‹Ê~~4è§?¨ìòzU~H~X•ß!÷¹ØŸTö<Šó ìÏ*û {Qee“Hû«œe퓟ˆ¼“ꉿ£ìËkè¤ Luk¼CkŽ +X¹yso_>äm–}êAÆÿ¯DVMó™|â4iÚÃ']·[ÇsqàÞËvDz.vRUˆ|‰*_…¼×|f×pª|¯|Ÿ*¿“µÆ³f=»ªŠ®¤"+-léPá é(­×3[Ü–X®¡ž?b‡¯º¦* BªÀÄ¥pU©dO£eìÑ xx´Ì{ñÐPÆH„°žÚýw†Îà5ÅaUîAJ¼U¾^UÜìY´Ëy< ˆ'Íx+Â|†Ì6fnÖš:Ú åvÔº”*UQ•jT0¶NB( }øU¸}–+ Qj”Z‰\ræÊÖùÔå.`-ŠLcwcÄ@O˜;dE•?,U©¦ÔÝ?nPƒWåËŸPåOB¢4*3\J@Uf‚ÁQf)³UåeŽªÌ•ïQM~3äÎëÎ|í¹í3Þ ñꦴip®ªœÇ^t)ç«Ê<åU™¯\ L³øìx$QåûÑ$^+¿^UšðŠ®xã<2>–nÍåbû /NU(A0C†šŒ–¼ÒLW#X#Ï…¹b‚n½t«ˆ`4S¡ø'õY^bÂ=Z´uSØ(©Ê"45'd8:œ{:ÍÆÒÒ׎ÅÌ›ÚöÁþhoÿP{Wo4<ÔÛcOjØÙ)¹·G•[äU.e±ª4+KTe©ç–/Ë_q)ËUe2ÆJå"\g‹KY¥*«ÁëP.–¯·n3Óà£òq‹fP’˵÷.%¤*k”KÚ¥ª²V¹LUÖá¾õ*­ªÒ¦\fÝíáP˜ysÀfÁ‘]ß›R¨ vôi–óC`™fÆ+£ï•IíFË:zŠc:¸‘x}QÐ¯ÕÆY´¹J;(в•+V6«J®Íg\ž8ß¹P{?‹÷ºñì¼;¼²æÈt¡ŠI‹"ôQª’רò·äGU¥eU¸¾æÝz:\¯š%Ó«^z¦rä4lÎÚzëèuxK ã'¼KHÄçó–ß5Úcãx€[ä|ÂÀ`%_òŠU¬ÒÅDìÛ„qS>ÎW0nVSä­¼±"÷fLõhÃNZùæ©§/1xî)é=c@á -ÈlÐ÷v$óÙTlŸ…TÆ”{yT¥p.gõ«ÃU|äì'+ñ6#‘ÔÙ<øM|˜V<¡ˆò©Ð…·á°Éò`´4–ÜhXc†MîA™a~Óä>e×]ç¥X*?!ÐÔÄÐ*†Í׎ùå:”i˜1K£”î¢á׳ÎHO|êrûŒ=Öˆ`$ÜrCf7MÙqÄð¨´>1 ÙÄÑ>²D˜§béÌ«m°żI¦ˆÒ€¤&Ó }oï°‹Á°”ñy›#eDIÄ¡”Ç›ß)@c|öp—ì1öOqucïyÒüyWù€ب:/È-û†Œ:Þ¶¦öµÁ²iÝç‚_ð)½ ‚±GŠ‘ÍxÓ+‘÷½<Ù9£XÜéÇ¡–>ʉg Œ¹4ŽvhÆŒ_Óˆ€íÀÑöå<†~æ‘>íH9‰\}ËÛ:ML­Þ\¡#JЃš0tö£¯0>3¯wN|ØPN Îbi›ÐTl<…©ðL ~7°²+ÏPu%üdx¶ÒÎäÌß*`8Q_•Žýó§ÇÀâ)âŽÝˆ4«¬MmM$ÄúÏ|µåÃÝj³ã„à#ÿß„à d` ì/:›° Ç2âw†å#-7YÞ¨w¾þšñR­ø Z©§Å):Ú%ít¯ÆÆOú…ˆ¿œ£‚oñÓVtVóâ±Ù,`Þ¶¶ÈÁÜÊž\² «°¨NçAK3ƒ³ÌÔü{¬ûŠ™Ø4˜Î'GÒz": LÝ– §É¬º`u,–EãJƒzkÊÛiÅÄoµ~2INÿšbk+"ÆËðÓ6ã’ELþécnŒ¾kŒF˜èôš!¥ø†o”J$zú@Tsºi¬‚ÕÜò$€†º+œg«»*=e1¨cÚ®ñk@äyãG.­…I¼k»«Î&àJ0jä²pVuIt3z9ùðX½©ú~#T³=•¿ßLcØ ,g½Ú?VZ¯"÷±h(ó§·‘""´(Rmû]¼“¤ „žð„1]ÄÍ56,ñ[wë@P‰umÆ —cóÄ E^xc¨·PœE̲YÔ&K¦N-¦Æ‘Ïf‹§ ¸®ˆÆr­Ãý„órM*“Ù5žÝÉÌd$N›?(ô­?Ãàò¶Tf‡ÜáÃ_—tôD{ §ÐˆðT…ƒj¾jbÌxÛè†Óî²¥q¸Ð¶Â¿®Yc§Y“ °[TY;Ý-Ö™»„¿Ä›Œâ)BÿŸÇk–‘¬6Éc=­žvÅ}xÈá/“1sz-UÔi§í7€¯£@­§Ì}n=Kdçÿm\|©æmÜaÿâÓÒ‰Ëu”FgØ^Û>{V‰„ËÞ œiزDÖÿO”Ÿ Þ\Äv ±pzÛx!‘Çøðx, ót‚9™Dÿ¨½ÜÙ,bÌa†öq8"b ÷¦Ó1‘=ø1Pïx!‹áG•1TOñLvß„ßÔ™%R¦Êpkš¶µãwšo:“£Ë«Œ°sñ+%cE¦TÖÛW…HÀãE™7†¶}æOÖ¦¾š0n þ LHùF±–—\ÖÂäëM±­"ì?c‡m^þôÄ|ôžpK6åí‡mí]æ/‹‘”†CØÐóø0mÇûâÑxžœ+=Dºˆ,=,=BÖ“€ôuéD’¾)~ìÿ-2SzTú¶U&G î1é;¢í»æ÷{пߗ~ ¾?4¿?’‡ïL ƒå'Ìþ?õ>EùI³ý)óû´èGð©T|a~iŽÆü>k~%ýZ|Ÿ3ÇýƬÿ­Àk†ô;Çz~ÿþ`âûGóû'éyñ£ÿÌòŸM<þb–_”þ*¾“þ.¾ÿ0ëÿ)ýK|ÿ-ýGÌû_³þ%süIc~™ç—%ø'ý0ÚX|™¬ˆo…ì_nÖWš_·\%à¨8ÕÔȵH_Ùã¨÷BÙç(×A¹ÞQöC¹ÁQn„ò G9噎ò,(Ïv”ÏòGy.”5Gù\(Ÿç(ŸåyŽòPžï(_å&Gy”ƒŽòB(/r”C¹ÙQ^奎ò2(/w”W@y¥£|бE^%è¹øD’/ƽ#/ÜíRvó1ù(_Šÿ‹‘à!Jðâ¾GtðÈkË6WYÍ—ÉëÊ4«÷šÍ­e›«­æ6¹Ýl¾d›gÝOjn"u2ôª=HªNÏ–cÄûy,šSJO”ÅÈgaÔq*˜u¥0ë¬Aá²0ë­æNy=Л/%  ² šý³n# ƒ'H€kôÍ8JtÖAÂ}36ë(¿³}ç#s‚³Žÿ}IÞ øЈ t¡è…t.=תP Ô¹&¨¹“Am”//ƒþy™»äî2Íç[«ë±¿Ý¤Ø…vù Y (W…y~G éæy*oǨwÂè=v/ÙwAi/Ù7ßî%f#øÃ s¶ÌÙöÁÒÙâÊGH-&uAz„4aÝ̃þ ?Ô†B}ð8Yt„,Ƽ“¹A_ó²$¨!KƒÞ =G`w|Ë“GÈJ£|QP:BZܪ ×Êýü wîº#d5Ö_Œ0äûLô®ûMô|€îJEp! ¾Ï$VT(ײÚåMfû,syµ"tˆpüÜ46%ˆ?ú0;Î`Qï'kØöO‘5ðµ¨u¥¼¥ÌÖ­´vvkÙ]lÞf‹ßJÙ&‹³.ήÀ\¾KüÂãd-ä€×ºÞkB¸ vË`ÒQÄÕÁ ï²ãdD“Ö‰¬H0ÆÇ ™1Ún2H¾ö©ÆÉøCsÜvR€ ¥Ew…Þ³è~Òq”„{û:’õˆÂîYìÛ`dé='Hd‹o#À=F.1öYÒµ…ž Ý[#=Ñ X@9JzÅ´:æuËÛå˜I¢=@ üav™$ -ô¸ÜQåë3ë=LŽúEfõaÒèì}Eýf]Тò9n.¾ –ŽVr@_ £^rí]d¥X倱ÊE,rat ;A·@‡cdS4Ä‚ÁÅf­tòÆ$dݘÃÍ '„T~ß·¹™é~råQ²¥…aµ[¿@¶!WAÀ^!…)Tá{eyê*¤âP¨"Pñ©ómUuŠ£dûæ ‘‰ùvœAßxI_»:1DÈ%\‡Èþ€ ¨q+ymÀuœè-ÜÏo&süÜ7|'iôsû.m?÷ÒçFAÜ“  ØˆÉ•_\Ñ8¢2à¶èt˜, ñiöõ%'­ÎåÛ Ú⢞c}e ÂsÕQ’jqK¡*)¤úÝ7“µ ¿›mÇF’±ô¥*¬6PAýn¬©T>Lª•¾Œ`ìê` ;dCU%´ƒ¼/³TKêCĨ©õaÐ{ÀS1úlß\Ú©.Põqû®U€U¡Jc-Jìê˕ߥ|™î,Ýh_¡LŸ ˜!è+*Ž‘ñ¦•ýO Ûßz?ÙíÛs”콉Ô`vd€x¥Á’¥W¡8½èaÕQò4µ¾×Nkö׊ÙŸïue6÷Ìø®=J^¬Âw ä€Ñ±a¼Á&˽Ñä š¢Bè †j‘jµ6#]Wf®ýb®ýö\o:å\ožö\o™0×ÃäR*¶Ö}ЄöÖiC»~4졘Tlò½­,»Ð–TU‚wAË1òö£ä-5þš›‰Û_ã¾ËDä&"µ"ƒ[ü5B½y`šÚ€§(·+Bµ%C<Æ{ŽhÈ C<¯5D´¼Kà%*‘k…8ÞJö‚€Jo=ÄÕà!¢C°ú0ñQ£ìz¯9)jÜ!ᬠ·‘µøñÊäv4Ì]sò.Sñ¼»tŠI ð³dMf¾Á°ÅWù’€)V¼ šé÷9ü¹q‹Ý )ô¾#äýPñþ£äY+ùƒÅᦤgªŽœâMSu¼Ùî( d>ÈÜ äCWî0iñú]/øª//ªòVUTÝ"ªn±ªnE¯Lu¯ƒº‡ÁÁ³òbÀ’VûAçjQq£óu:_':Wô·!E]NôŸ´ ØàËAñ àÙZѽn¶óêÛmvNÙÙã÷ÜL¼~Ú$·ßÓRk «eZ¼MõSx>'W{Îlòãí¢ùèì¼@ô-6¢w” *ß”óƒk|»…äef¼ãÔHN{ˆò‡ÖCàìÛ¼k[4»ù8¹+ä9Lf‰ c|w£ïÈ0¯ðÜMjì!ïqrx•O xï&M¢í¼23øküµ ¾cäÇ­=Çf@Ócµ|„á™ð6RUaßvç£ÂîTz5r˜TxבôgÏ÷×ßEÒeDâc†øžòzm—|G!®/bAÂO˜$ô;^½Px AOEÀh%ŸD™j›Jï- ì½à=‘¨TAFYŠ`Ÿ#£ŠKY¢,'£®5®\7Â÷ÞÂ/&£ðayÄðéƒÄEfÂ÷ 'Ñâ¦-Õ~&DÁò=RÈG[ê¤Å‡ÈÜÅ!oÀ‹Äl:Jî ùXKnúý-Õ‡ hçOmY¤ÇÈ!/õ+Imå*^¹ªªrUýaòJ¿‚¾ÚþU  ±UÜw¤¡á­;ß¾ª ÊU±Uõ~Ï8™M^ëQH@qóÇÇܧ1W9ƒ´¥Á_}€4ùën"¾2è}&TƒŸ( î…¡\N÷UM†ôƒ>j,ƒÃç Ô`î󸯵¸¯_ÀºF§æœ8ꋈe½e™_Bh Æq{/ë“/û•cä+‡ÉïCÞ 3p–‡os³aµ™]ìÂÌ#·‘yÜÌÌÞ1rHúÛHM?N¾z€@í癿AÉ$爆FløòþU3føÝûo¼ÅÙ#‚D¹  ž_C<Ý6ž0ð8ùúa¢„ýn¯ôâ ýÜÊ(Š }®Å}]ƒ$¦š BÚP Slûþ$lqC}¿ñVâjà°ÝÕ7™ ðÎKí¸¯G Ðr7Ù¨ 5Jb[‘å&*‚Ô¾oô5:kEÏbÙ·L!›¡Øî­nÐËÙÂÑPtÖŒ@ÀÖY8û!r ò¹wqÐ6¦å(yô0¹é²µ ]¾=Ñv?fU¤ÍŠïXq³â»FE‹Í8À¯öTÁ…“ÕcÀk4'ß»ÈÒ5Ò;¥ÈCò…òby)ùÆ™•“†LËw‚LûáûféÊ…!õœ–j‡H×P?òéª\å®\U‹òÉ ùô6( ÞØ*ȧåÓ ewlU­¿æò©Øòéúµ=k˜U•÷Ô»{]Ý•šLefBILª{H¡#MÂ#î*°3$3ÄŽ&öBŒY] !"Œ<HDgļHh QÂÔ Î8ˆ$ºë÷¹Å]—]Qqו]Q÷½d3{ν·ª_5fìæû¦êÖ­óºsî9çÞêDú™¬ÒÏ4aÇi׬æH³ZBÍÊU±RgU¬t•b5»-m)R,+Ö R¬ צå¤X¢ø6“ ¨Es-YpQ±D©©Í”*•A…IK•ÒH¥L®RN›ã&„JEWQÃgT©DE¥¡JeÜ„T©D¤R‰Á4«3ã¤RI$-U*Õ–j3wí>ód›‰ƒxæ 9‡w‘)¦¢°Æâÿkþþ¶¥Ýãu8u5p ½ OÁaøZÝÔµèm™—éÄ:þÀØØ¹d/¸™XÝ)’\}.!/@HÊ-DÈ+æÎûÀJ­M›Å¾‡8Þè)AѤÒý]¡¯É…ŽÀ9¸v6ὩJ3(âêCìò˜îzE&ˆø\í¤©ú,tQá/i8µÊ„gUôGÙGpU³‘d;Õ€ýu™{¯øÐÅÓ3Edu7^#—)<„Ìúu‹"—¿-$¼DÔÙ™õûÖ˜”„X[H†1Iò½FZ•&‘’É̹ï°ŸèÂåi2ì§(ëë$ëÏöwëâh¤Ø6v'{µ.tc˜çÓß@ÓÒ‚÷Ùs&¬¢jgú‹šÖ_ÔÕþ¢aÏé/šX°ðÏ6èBO6LÐ%i7ᵉŠÍ¶×Dµ[é9e§ñjS1M•/=΢‹K—6ºÌ¦K;]h*¦ú{Ò6›°z+£8Äü˜áû{1uÑ ü¼Úº@Àþaˆ-àý¡f'ë~‚¾ìÖ?å&/Uó¸€é®ÖµVSm‹®†Žû/ó†â{Y‡oð Дyǵ̬̯ðŽϡۮñD%.Òê®AÔ¤Õ…Œ %רòבô²”×\}xú#®f[û¦·˜9õÂ=¼}õò›ퟱæ_´œ6Ü¿ÖÀåô1öo—rYS]UÒwå&÷±å1èÿ*ÉaŸ •D0Íëå3'Ô¼Á7l+oºf×¾X)þ³V ×4á¼¥¸Ö^f”Õ®i–uI ê‘vZ5Œ›a[%4®¦"#QÕ€ÞLô6YõÖM¸ÉR×¶*†Û[¡iÏœý¦ÌË>¨àZ‡P«ÈЉÍJ¸3ÊŸC›k ÅöÀ™š° 7¹‡-›Ù:ÀjPüœ›¸p„Óæû;›‘¡& 8¾á“mrÈQâÆ©©¾MÀ4SÓD«9`ª´qqfâFFSËå3ª"ìSÌšé€^;a©ýËâàŒJ˜qਂɻdüw™!î+¥qŒéT,Ñ/N•ù4«“­t ш¸§ö²¹R€6)@«o9Bç §#bÓÓ¿ WMâUùô«U\O7ŽksÍœß^>ý M«&¹)Û½-5íjÜu¼)ÚêiÇš¶zš}ÓV!T#üÍÊÇ%üU¸dÐ.ÙÈ5\;€.§žù1mGìfV÷Ø}ãì墟ëVµQH4Oë ã{ZŽÀ,O›ªc0~D2Ø‚ƒ«Éºø KÒ-W%Ž÷ÑŽÝÅYnH¡MÜfоºs‡¦ß•²Ä'‹?!/ô6ÖÁÎg¤Z`«ø½š{†~NrïD/„{,þ8xE?›…9b5­ß”¹-Ú »HnÐ-ɬïA‰ö)Ø9r@²|4:Ä´Ù'†°²Cw{´aÙ%I¤³'Y*ËÓ?µti¸·ù ä&$|%ÔðþS:‰Ý²C„œ"]ضBÚ¢./c›ÉÛ¿íô_á¿]5âu‰ÉÒSfÔÔÏêo¯©?'ª/ÕÔϋ꯬©?7ª_&LÏ|azz+–‡ÚA–§ÏÇi†q¢Ÿj\ËmÊõ[´Úœ½4 ÏCÛa×núkìÚ<ŽN•X8†–EåçÙ’1x[P½™Z3îw*1ç"`±` Êå“’ñl©YM~Z}#­¾À’zj@ŸõFŠ(Ž'4ûÙÞo„¿[¹gføiAT>-á3X#ö¼ÈÅ@Þ«Ü'!ïAÁInˬï%àꓽL;ÚÞZ‰îÿ,ÆOpà|Ù“,u`Y@'!`iäPsXŠ ;¢žvàyFbI½ªr¿²Jж@vy;É… üažK\2T}R¡Ær= |&f›=׃‘!²|ûª~>7®ŸWVÜ_u„­!D œ+·‹üˆ4ó‡#Ž”ß+Œùu’1Ùò%ÃŒòg_„‹‡1Ìá (ÐYñ³ÉuI$Wcƒ?¦'G„¢¨5Ã3 !((J„ż­´èhXu Û:«1èKG`U5ÎìÇ¢™–: ~£d;#É2R2®,1"íBË- ß.å¸Zd‹ÂùíÀedŽÁåá ¿‚º/2ê5ô>™+WrNȹ´´±=G§#s-ìŽaš1t’íYŸßíÀšØ÷¥wfË[úEeH/”דÿŽSL‡#TPøãð»’G3­M"'92ŒÀ;åÚ¡|IBw BñÿVˆ ÇáE¿£sÞg>Ÿ¨Z¸©+lr%®Ý]£pUœ ýr<ÎÕç÷qv+{$Ž/§Ð\9Þ³²/BÏkɾ½À¸Í ¯±q{•}‘áV¤ÇŹöGam=Ç ýꮄ¿^:Dï²»‹Ñó‡kéݽÜ=¹ÖG:ëèDZ~š5—Ù¼¾§™Þ=UÐt r™• ``=ô>£EîiËÅ|úäø½6óx@9¹b£óž ûs<ÔSëнgiOÏf'£ rIWÄ™‚õ何€ MÉ{Ð.Š4F£qzJ)˼g ë»Ò“  ¸/Vãå½}ôˆq±ö,¾[Ä„ÃCgM-ñÌ뮨*߇ûlÿZdù$¾›íg‰Tïã[ÈçQGÇšq­ØD›C¼?²neØo‘=Ìä˜ãP*fGá÷GØü2ÜG;?³pt®‚;ðvCA÷ôÉ*𬧫XÀæ*ƒ רO38ðö3Æ [øÙ‡:™(‘IÑ)N×á‚8ÄÏ7FÄÔ¸Æ|°‚É~rV[¾µ²ÆPSØjŠ:PfC¶¿Â‡ê(|´Bá†ÿ…×QÈU(œ cXf™ªÇ”™šíà£ÙÎ KíÄ~¦¤Ø{pÙûPÝZ†~vFÎú.œudÒ8šCË“ë…ãb[y6²oreJù”½inæ‡Q)‡£ó¨¦8šäÇ25!òÇÇMS¾–uà¢DöÜ?¢åC‹!ªÐ¯ÚH¢›°Ž<ýk³§˜©NXG(˜XÝ©o°úd†KïÜÏVd]=€[ImÓlzÇ£y³ÛÕ5pÍ~Y0lkÕ?¨Cyú;Ýõ&J¡ŸÑ‘®Õýh¢x|\ ô³k™ºr¼>뢡¸5½aÃÝ$ƒÚaÞîêiö«æ¶»°bXn£‚qàö(Å£yeÒ·j%×è'”P^}«ZBQÚòôn!JuD9*7Cæ‹6CÆS­ìý}¼´‰ö5^¼žŠüØ ?E Îñ„wÁì>É’‹¬CÇd >чY°´‰dQU×Ú„†…þBRÙÜú1Ø6Ä.ó*ïX‹…ó #W›T§ã-l÷NiyÉÜ(S¡ AAGƒZk}œvwš0l¦{³ï飰£Ðⵜd ¯e’ï·µúžAoSØö=“îiÛ@Ö´Ó«æÅ àÄ>\ä2‹F˜boÊ»e¶@$(m:ü¶`OU‚2³`®Ë»n«×4Yòšñ/…6þ¥'K®[¢†•òNÖ¶ød¡Íksîò(WÂÂÛyAm¸Ú¯ð)ê±aÖL[Áð©2Kbõ=Xâ0Õ×Ëuwp·×ÖMSºÌLªqg‘ˆ¼…Hpº³JÖÓ°Eç*Cèf‚®ÓC0=s[ªÌ:8û»ã®ÕŒ€Qá“jà#º-€fâ1?3ägVH¥)/À=¢32ÕÊ̯¢‘ÙB#ø$ €Â_¶ &Öì¬cëË#à~ueˆœ88<¸j†ãä5!þ0(¤Hc]3¯óZø -À >¤D-né¬!NÛRùO œq¸·è£¯s_¡ûýÿµÁ^{ÖóøÌÐôFñ¹ÈM¦Ý!²´N‡¶GDfÎtš™¼Ðc‘{¨VÜCÇР!Š^âÌÅ:rÖ2ÇÕ‰ö‡âcù‘³aÅÄéw)ÄZ"åëâXØ1Ÿ=WöuwR”.NdÂà f›ŒJ+‘)ÈÚ•ÜdØAŸ ;¨BW›‰ÜØÿ%¹”¯KrŽô´MƒGës†ú1 Ú'ã…5šHUpž…<Ça'zö£°«·›}žïLÃãUáÙp}Í5 ôˆK›Ì$‰ ~1z2>≅~(jìÕrŠ^JÐÕ­Xõ\$;òˇµâÇÆzSQ¬WþXÙç´e£Lÿ¼;Ìý¬¤Ü_ê¥üOGUúÆ'÷Þ2k¯©ÿ²¬÷sì–‰•9Ô•—$Ó)±ËŽ‘ë›´ç`ÏdikiB/èjÞP󦚷Ô|¾,ëâr¼7ŸÄ»›ôt -`Ÿk¸I×Ü\Ê„î&i‰õ`­5hÁŒÁ~|I¹ófÎM &`yOMëb 7¡˜~ªJŒÇà€( Ryúa×@/}?³éõ ö¼òô/ùI[\“6f)O(ß”ŽÑ2¼3Û©–ì˲Zɾf`ŽÜÏRÙN½d/›SzlÀ8<ÇÞ¼Ÿ-×/Óe'·îgóÅ».m3¾Ív‡øŽ*ÌÃ*ú<¯„„Pˆ5GDX}Ý*­1„Žý¢S¹~Rò²rRŠu Î5ë¿Øû’LúÐÖùFÔΧr'pyéËèž:ÊÁÚøv–‡æÐ“„NEß-“^Ìò‹=/Qºic–°{³'r»‰µâûVœ~­û[Ê·e„—ÀÞÁˆ ¾}|ß· ¥õá× C$É©òôµÄx´€†Y¥÷·Ñû2»Q|ÂàÀXø ƒgðB!é%ë`MN–ôð8AQó’ëÐG¤oš¶VxŽD¾]Ošéɤ'¯yŠÏYÍÀ¾06Âש'`"ŸPÜÄ^v¾åR–¤HÐç‹d‹2›ï&ÌR>éYö%n2€É|“g¡6ño$¼æ#@Ç?Ìnb·ÀQ6›½ÉÞb¯Ò6àx úèà}ü¹Ö*üqôeT‡ÌO¦üâóì­4ÂƒÛ Â ý'Êwbr»‹HÀ¢Ÿ&”Öe‘´ÜŒéGzÆ™‰Ã‹;KLq4Z} $~hù]åO™Zÿ¥Ø(ZÁZY#ø?Sþ\·Ë/ šý,¥FÐ@0u&¬¿P¾-u"‰húÐ'Ö9û¾òJŒ ‡#5@?ˆTòf®ÙŒmy¦N±Tfù/ƒ©2C‹6À‹a¢õk–”—ÆàD¸âÀ7ÅÎëcìV„»ÄœÐ‹*š½¢f¯(êöÀ@ѰûŽÁ±?ðm¼ÎGίÃËð-–4êë̆a£óx¿ï=ÌþPK½\C7aç˜yÞdDcom/microsoft/sqlserver/jdbc/SQLServerConnectionPoolDataSource.class•”ëRÓ@Çÿ+…”Eîˆ\ "öFƒP)‚\­tt¿…tÛ ’š¤Èø~õ-”eFf|ÊñlZC¥©bgzv³gÏoÏîþÏþøùí;€ìF0ˆÉv àv;¦p'‚â´b2BÃIÑK…1-Ú´p+bxF˜»ÂÜ ã~$ÌFÐ…¹0Š6Æ#á},a^BFÂCÛ‚nêî"CK,þ–!´jå9CO‘»Û–eðüªeš\suËdųê‘z¬8ï å¢?ÃY?ÖxI|8ž0¬Ä¼ùŠ¡šE%çÚºYÌ4Žü*S.»¼Àmnj”ÚŸ„©R¸âû22†pSÆ"–$<•±Œ «2Ö°ÎÐqÙ•râdlà™ŒçØd茖nÏÇò¼ – 7.ã…ð½DVÆ+ÑÛfãtjÕ© #Ñœ«Ún”rŒ–¼Ü£šŸ|šaN³•C]³-Ç*¸b‹wÄmå ¿¯)¹lÎû¼¸m±“× ÃÑu3ÌNE žöáižð´?ÇŠeÖTWÍYe[ã2¶±S¥\"Åf†™ËêC&Îo¼9·Ï»21‡¾²Ây'k‹Ü&1TÕTvuC1hLè¡ê#á øø7Hå›[¤‰AÑb6“Êuo}uß $‡cM!ñw ®Es«Šcè­i÷ù“šÔR‰›y†T@½4FT•Kqa×úMtSY€ÊZ" ½qDò¢²UÇù`Ù´à^,û¿—PÀÁköÖ×í¦érÛT¿í1 ¢1NÏÕ èªèa QKNv˜¾º¨eÔ¶&NÁ¾Bü¨1Š+ž{-ž{öWNÐRAè3ƨ†Ö½S´%**w·“© RAG‚†dú_­àÚ7V[3êÇkàOô䆨ýX^jw’IúðFÿußw†®½D2uŠî­:äTcH™é zýÈéÆ<'p«v>=”¯8)ÑÝWAu*~PK½\C7¤ˆ¥2 !?com/microsoft/sqlserver/jdbc/SQLServerConnectionPoolProxy.classV‰ÇþËHÈc°ÁvlR·4 dZi. ÐD˜ `°iÒ@!YKceÍzWì.Æ&iÒ¤¹zæìMzSzЖ (iÓ6éI›³÷?Ó_ßÓ®%Ù{8Fþù›™÷ͼkÞÌ•ÿ]~ Àüw ¶àÑ8KbOà nŸäÁÏó×¾˜ÄV<ž¤±/ñÄ—“ø žâ¯§x&‰!<Ëð <Ïs_eøÃ×¾Áp’áÃ7^`xq ¾…o'ñ|—¹ßKàûÜùÏfø!Æ1ü˜á' ?e8Ëð3†Ÿ3ü‚áÃK ç^fx…áC™á"Ã%†_2\fx•áW ¿fxá7qü6ŽßÅñzo(h=n©¥’,dMÃyG3 ›òæDfBË[¦mŽ9û¨nKkRZ™ñÂh>32<0RéÖ8[ÄGsö`I]9  eTµem>·ƒ†s´[É2§¦g·rÊ™=ÔZG±¬Y šsÀ,Ž8–f´§Ö Œ«“jFWbÆ¥ÝoÕ ÍÙ¦à†Ô•_w'í’¿OæduÓ–…Š4–ìŸÊË‹Øqü^Á²¼%UGŽ8Òp¬œÑ†vÉTÇIŸ–’%KªU/»!åW¼Ž=ä õ«4y«dU]ŸwRGuY¿ÀCu´IIF+XNŸíËf[:·s̬91¡‘â±ÔöFsqö0ùˆ½8ïu–©ë£jþˆ‚Æ<»‘šáHËPõ¬ÛOhöŒƒ›h±=ÒQw¨Žª`U½yˆ³gfšý@í“jaÐЧ),š]ס©,Ié&%ÇŠ 9Å:¡bì·TÃVÝ|³M]uó>–ʱtG1L€µ¾Kµ Z×&¹YÁðf؃y]ªVM²3•Ë…$ʦ•g åż¤ \`OíŸ.É=jIA›·Â1GÓ34RuSU¢uƺªˆ‚.²#ÌëušÏ’ùYA¦l b]…ÏÎGÊ‘|Œ[,Iù`ËuR–L‹AGªÎ‹3Õ  S`*úÐ׸s‹QÝÄRŠë.S/¨£š®9th–Ús[óz¥€ dAxåÜ=o;66&-ÝØ«`yïÐÜ2¾Yàø£@?vðןþŒ;vâvíøD¸‚¿ ÜŠÛ¨ˆï»'_#{EAàoø”À›xK`ö cŸÀö |w Üųwã€ÀA|Zà‹fxïÄñ®À{ø{ÿø'þ%Ô¯½5{+WOo¥4zþ¢À˜?м@–¼ðOÜÇÚk8Â&è˜0\¥LVªÄJ°` 88Æ“? *âëß×⦥aw*1›pÌ™;~ÃBÝAõŒï,Û6ó»‚çšm  TëžE:8ý–5£×ò õˆÜi™;,]bY¦¥@¿ŠÇÀÜ mñ{Ò?R¹†—ó]V]‰^FEIJô̪ÖtωqgɹsrRÒ£"¶3··ŸNJ›%ˆÜ¶på*æO7“zR¡‹ðK!6¦$Õ^"WN|ÿ$•ǽ¦£M£—Ê[éMþqlCŒZªôŽ_Äå‚Ú$W¥J¿¿Ò¦éJ ì¢^'óOœ‡»÷e(Ôž…û£2àI]GR,×õ*Ý} m±2Ó¯`qñ2}ç<Ên x”µ¥;}KÒ—¼€Åé¾ hêK—!Ò± h~É#QÁ"Q&õ¢‘è@;­Ý| Ë¥mé%j.¡Å•¤ÿÉ Ñ?Õ8×I=æ Z»•¸Me´óÉS9ôä»<åšgäûÊXî'PéŒ ´û Tf#+ü*Éa„î2Vúm¦ònsÇYŸü¡ªoä;ý뎒ïòËßS•?„†Šü0Çî$nW˜sÛ]ê5çAõœÄj¯ïe-¾Šr©íZʤ2>àÎ÷¦Ê•tC5Mj›÷Ò¦n–uÐæ¼©+Yá¸â Ôª§ºä÷•ŒŠÝj¿Bt™FdÓ‡ýОÁu~ 莎°`ºÏÃ7Xë·€®þpù”_!#*ûÖUÓ“¿†²¯Ú¥UzÊHÕ€’Ç覱µËª>í¡Lì ªG#)ëýzÙDDî#~CènøGýЃ)L§nÖ)dùq²Šªl#µ­uf¬ Š¾!Èö©yHƒvš‹JEeSãD(c}×1îb|ÌÏ WdDLnðÇ„^œ„ý;Ðë4<ˆ7ùåGjt³_£‡£Žß-þã÷HäùÞW-¬­•åÆzxõÿPK½\C7q胴ÃEcom/microsoft/sqlserver/jdbc/SQLServerConnectionSecurityManager.classu‘ÛNÛ@†ÿMBœCB áåØ$Ì}Q{¸@2 ÊRn«³ >€½Að@<'õ¢ÀCUÌ:)–vg×ûý³3ÿ>þýýÀ6ê:ò˜Ë#‡y5-訠ªcK9,«øYʆU­ãy‡Ü %«ÇϹéñ kÚ2rƒîW†‰Ý0ˆ%d‹{}‚ôXDç"(ôÓ0’‡}¿-"¶ÏÝqW~c(×F“í×[ ™Ý°CJÃ9Î å„#Ò5u¦ï]8âTºt£†5†|Ynpb ˆi70‰‚†uØÔðÅÀ'L1ã3¯×i;?y_oQKfQcøî„¾é»NÆá/i5¨ßT°iÿ°ìd;,„n¶…Ó\yyÀÞUmÿ÷qÔî%ÕV^´6ÄŸ+%°/c)|r¶+äHâÅZÝM4<&çç?j7mê6iz¥uÒû¾ï»MÛôHÏô¾ï;mÒ´éÝM“ôÜ —²ªúI;ÀÌÿóçÿ?ÿpÞó‰w¾‹ã¸s…É}€¾¶H,Ò‡J\^Àæá÷½°›{/}]‰>BeT,qm:ƒT‚á 62ªE:[âöÓ9ì(8å±"/q‡€ŒÔŠ´^âŽÐ6j‘6qâB‰;N5ë%î5°ia³Èè"\dt™ÑÇñõ‰"}’Ñ×#á7`¿Íè§©YâîAVï¡+ŒvðÙeÔbtñÖ°¿Žôl|»ÄèeF{é©SâÀ™Ç©[¤ƒ÷½ÀèSŒzŒúŒ1zq¯2ºÏMFŸÞ ¬>S¢ÏÒçŠô3ðù|‰Sè Ø|f‘¾‘ÑÏBÖ>›7á’ŸÃ苌~.£ŸÇè›} £ŸÏè[‘Ú Ô_Èè!_Ìè—àómEú¥Žp¿ŒÑ—};£ï@ü/gô+ðù•Œ~>¿šÑ¯aôký:F¿žÑo`ôý&F¿™Ñoaô[ý6F¿¿ƒÑïdô»ýnF¿ùÿÞý>úý{èÐÄæ‡ýaF„ÑÅñcôÇ}'£?ÁèO2úS(Ä»ýiF†ÑŸE›wãN¿›ÑŸÇ~ÅýEl~©H™Ñ_)qo£/é{P-ëØùU´—_cô×Q®ß@&~wå·°ùml~‡Ñßeô÷ý}$øŒþ!’û#4É?fd–…‘9FŠŒÜÂÈaFîaä#1r/âÿ #%FŒ0F#{)3r;#»¹ÀÈÃŒ¹“‘ãŒÜÇÈ4#w32ÅÈiFN1r€‘CŒdd‚‘Œ,0²—‘ýŒL2Â3r#G9ÂÈ<ã>Äeä.Fö1òjF>…‘ÝŒœaäVFÎ3rŽ‘×1r#'y#g‹ôO‹ôÏŠôÏ W긎cu†¶ëî|­ãö§ûvÇs}wu8í?Õó-ïŠåM_ê®t¦õ…št¥dÎC„Û=òzÏZµ7w°vɼbN÷LgmZz¶³{ÝšÎpÑì,ÂÖ›mI­µêvSS•š<+ë@† q¦†ï¥:¡£7eIké ƒÁê¼¼ ¯{nˆ†¢Šý‰_S¥ûp€¢jr¥¹ÒÒp™Cñ’9Ft3$½GÔ¥¶ªµ+².‡¢ahí†X—÷aÂí ºÆrSŽÆ>£èÊãÐý º¹Ê¸pFÔå`ã> |Ï´ªUYk×䯬1‹I¢VQbM1– w@šµ¶*²‘`”¤š¨ëájä&ì‡j„pzØAhÚCVÒ® |TDCŒÞ÷U@±uÐlE™U Ô&“5MœQB>öTäšlÈm­Uô‰ªR3€gImTCQ„+Vç£5÷Vçóî%ÈaW—æä:™ÕĆ!Ëñ›ª|J£"_Œ&ì; -PPU‘Ì+z;ÀE:°t­Z-ìaÛº¼@¸]‰új£Ýj( -€³u¢Ñª·•F³e´›¢&ÖA pHmÙ±}8ÖÔd©­‰å"p„`H­š+¡ò&ÔpÛMUÔssS ¬ªØLÔÔÜ¢¦fNMͼššy5íF= ½;±ZÄ‹í:$³/íGêK"R”Ðö6u¹UQ#·Ö#9‹š\µyâf]QcðTƒÁWk*ÃOþá` ‘‘×€|áH # ƒª-M’Û‰2ò ÒZ¨µ3–9õeC©½Ö ÒÖ³ûõVSÖRm1ò’ —C¶AÐt(D“’¹Ë1«Œ cdö¡”Ý…=¹=ˆ@!7…–®XCBñbˆYDZ­&J9ÔkÖPr{£¾Óôì+vÏZ³ü°ß0û–1ê‰q1õ0L3Ì•Þd¾&WöŒ&Jó2È@¤TPO€R4ev.ààëÁ/ ¨‰M{O¢}ʰ'x ¸n·i°sZ€Ð†%+j ÅΑ"}´yK"EžŸ“0>cùCͽªt-gh¯Ú˜=2û—W/çFŽÂÅéZŠ³êæ ÇZê›Þæ¼µ™_éŽæv¬îȳƱr,‹Ý+s‡-¸ à‹–çC¾GùФéCšÄtèWl uA÷cJÛt†ëÖÐîîB§h“`'“;™$ØIL°“I‚­˜CsÅô­º54ñRÆ $¤F°ë‚íØÃ×îþ©ÿ{â>³¶+¹]HÈ{:ëVç²Ôs}d¼0… ’¼Ñ±Lá6j–?ê ukXõܾâ -Ï1{ #˳QKSÛ­tûÈ™ëd3Y „<±um}èzV·’p—®kÙ1t#œÜ•ådÉ®Wì®ÕÍYÃs7ÊÒ+Äå>ÿª=ì¬K`5=w º{ CgÆÅ”cf¯—zˆnhÍM€9~t¨[=°¤|ª «U sD'1G¾åžéøf`l’ÛïÛCÐ`OYsp+'ƒ Ÿèº–_77 hèöÓ–âtz£®5ÓsW¸#M"Û‘©HÐÌtV ‡R4ݘž F!lj¬àûRdÃòúÑì-A™po¸®½>?Ëôî$¨®}ƒ‹µ¢±«ñ²ß1–RAÇOCx˜^¶ÅmÂ5n)åñx8€‹‚qûšµjy–ÓFÞøŠ©ùÿ±G€±8ƒOtGa¨¦ãÛQjsX· T2­ønÏ ÏWàFJ˜,+`W–W7/¹^2=3n;™ñ½ÉxÈÂDÒOPöü1p½¡ÕÅÔH¸Ú jñú7†ž‰,HëàPÈQZMMdaä­RÈ”ÒÏ2ÅgSû›Óã;™nŽÛ¡f‡f¯f9kÃõ°¬Xäç(ÆVHµeΑ’Ä÷±_qf=w4˜Ù ' ¤Ýޝz]ËCü[¶Â¨ºŽÚñpœÆý”öÈó]/Ëd„°EJÂ|o‹ÂnBX‡ê of#¦õ¡9´ú°õñøÄ–q?A ØÏ’8œß.vË·r’`(dËà–‚3\746Vƒ »oA´±2s1"FèB» ×Òjáp¬¶pëó+Èmû‘ñ‹À¦éºK6^³«:=4Egù¿7ò®Ó€WÅÇ´ŠãAư´›§%¨JSˆ‡òÏzfbÛ2Ϲ­®>Zy*>²Üƒ+¹¢Ttº[••/O§²óvB ]*Q_Å^ ê›ÐÁc~1>aƈÄÁîÐo³YâD Z°Iݬ˜‰ühêlá1×FF•%ÙéÖ-#3Ö¦ëtãà{l ´åDZ#Üd B[[óìá¦ì¬›P®a˜¯š»C 5û²ÆI8«ÂaO ‚£€ÕÍ2šÀ î±û£þØMïèwnuõ *{г’š!«ú¸å0ƒ£¨î_R“ ,'LÀ¾ˆ‡5?>ñ¼jG ÍíõVÌÎåŒ ˆ“&Ï<¡Ék!¥´’ˆl'³‡PFõ ~Óõó·º0‡¡5ÔÀÎÊH%Íqñe;ÎöðrjÎøèrr ^>¸l_m{l9šà_u½XžDÔôÛB\-¤K'¡CÁó,œ)m?o!Y yÃö‡¹53@ÅÙ‰ðÂÈ Íë‰$Ìï4™Ç6‚,B¸›¦‚yx *–ñpË öl"×1ûß‚GùšÛ1{UØ—f”Ç úÉû™d•8V)ÿJÆ!‚wFžö°`v¯:á6`}°hûv@‡CCÜ6 Ú³0÷e†ºÃuðô1t"ÈRd µƒ£„NfuBïé&$ÒÁýÁ‡³P°PZÔ÷"ð~QK ¡ídµ”H²73æ°³É@¸"tÿñcÒÊǤ½ÁQ?ý³ßÑìW”Üßöö‡5noBŽfοùãk’;Àb]þXeFÊã'£9Ü£Ùlsn¯k®DÉe»!åÀ(”8ÉWFþ‚ò|4ˆ 6®ëƒ°¾NÓ5œµ8÷%çÔ$OÆ9ƒn¸lÖ§Ñ»M8 ÷­ð0œ„Xݼb Âý\p‰¢vÓu{°AEú0¥>Q'2^É€,»ÂoÅ _æÛ]ü%˜]èô‚oÁEú—<ý+ú¨È¶`5\ˆx#§›|×%Ü)Jà ^†Hžçz<!Oÿšþ Ͻ{‘þ-OßKžžµvúWãð³1OÿŽ<ÇÓ¿§ï㉳ȳØ}?ýÂM_ß7ÌD;<ýýGžþý O.AÇR6ÅøC{È ýgú/„û´ëüö}ÍÌ,ô¯ôß`5ò¦ëf21=žlMžþ;øò"Oÿ›ÿ¢âé‡ÉK„“t¹&KFÙÛ(‹z9ùÃR¹ª©õ2d(°˜³Ý÷¬¿éw#¯ñË.fíòÊf0'W”ÈYØß…'o%ÏA ÞjP–>S†`Ü+ûجOÚƒäp9õˆPŽþŸyŽ'Ñyò4yhŸ†úq+­™«<ýý(`<ýoò"áèiÀ½#]$øô›£\Ò’ÐÛxú1ú?Hâã@â>¨q¶r—O^!:á^}ÍÀƒþ Igˆ<~‚~’pÂ5§4=«ccp ç?üð¯c-ø©ð;O¸s)þðÍ^Ìg9ÏhªÅr;™Î[½ ±#‹]~nq×cË`PåТøÇ} X |¢ÝH7#(µ¡¦:ý _¸ QNf¼vÔ_±<(dúæ0ã×§Æ-T>îÜýe ¸åðã!OÞA^âÉÛ¡¡)ÜL8Žp…É»…Ü ¿Sð[†_ ŒrÀy ²±;¸Ñ¿`ï,ØøÂ.Œ'ƒ=vVí5¨ Ê§¡NðÊi¸ðOó…"¢ûæû|v_·&Rò…*ãqFDI…FW‚hˆas^d¥¦4f„Iª!TäYM–uA¾ØÊÕšªjBMÅ߽焺ZšŠÐT—dMÀ¿zÃÉžŠ ©-hue¶!àú‚f¸ˆ¡µàÎ2áž}eX¸ÑåO¤›3ÈY ÚÝ*ÚÝÝYÛ†Òv›Æ{¸†Ø§žI÷‹áö ©†§²ÎºŽÈ!N9Á!Ü[ü º.C\;G- ENǘ=ÿlOgþž~ZØ·~LoûAQßÎN®œ.¯zn'„»P¾ UžUv\àÈî–m¿Œß¢Ò@{-6 ÷P* Úñ8î„ÌràM°"øÃØESrîCùÀÙž$´<#Jó­¦0£Éâ<´ê’. 3­Ú¼ËIóMUi‚Tk醬ɰ«z³eÈðl¢ÒГ—€GoKà­#ü^l, EŸÇÆÐ”˜Y*­z}Û¦ kZm±ªBUùÐÔª¢d€©VÁv ù¢‘¼„+TÁñ¦‹0§Ö*5UšXÆPŒå6p!ƒ½Æ}I­ JU˜’ø…ÜPÁôÅŠÐPÉàÙHåR«UüáµAmÊ $¼6tZ²¶¼ 2‚׋õš .‚ EW„f \¥©¡Æð® ¸”i (·£É °ª2ÛÒdxoÖ0,”F“ƒûbð4ZtÕ% \ÑÀ—Ù–RAYð‡ ‹‹Ðô¹–QQ—ÀO“ëh®‚—°Cm‚Û¾«ÌÎvì¡Ëx«I/†l9aITŒ*ðº4‡;±¤)! #Ž.)Š€Äp»†P®(x—Ln€~"µ×$Üw¼"„ @ÛÁr5` ŽÂÊ¢È,¤àV‡  ƒŽ|QЛÑ[3h+ÇZH/‚ÄF¥Tñ2«aŠÏ•ùò#16Fù¨8:½¨ÈK§cwÂk2§Ë­h¿#­ƒú2ØH=,© &y³ÔÒPo<ñªØü2Þ¼Á§Z­ƒ;Ì…¯K²<¾-Ë ¹9°&¡®4Ð{B¬  ¦6Ô%¶D3pSÑB*’†m­7ÅJ¦ƒjÂHOƒ6†“!Ô(mÛYu˪àzp¼yø¾àöÜÅà ¢,µƒ›T|aO/öò…}…ýÅÂ_8@žç  ‡‚Ã"~k >[ZpŽ N97aÜ€zpÅ:þÙ/Æz°&Ëðã?o×-;Vô‡]<|„•D˜‡á÷_¸¥p^Ä‚òëƒIº}pz1IÔƒJ¹Kò…£…c|á8´Ež\‚tOoÅ:ïvz‰‚šdhm §ë–ï›kVX”} ÔpÅìÙ]Ñ[aÙ«^Õ•K°_8Q¸jœÂm„¢mî@‰<…æU6ýrgÝô¦î=sßã‹VÂË áùå‚ÝÞ'½o!ÃQؘš\E»…èê\vºß?‰i$WB£Ìq®üpù^žÞIÿ·ykª¸ÂgöÞ½»yl.²$@å±» / ÍQ„¨hÔ`q "A"`ŠVÛRmíËÖj m‘j!<¢†6Áðò¾Ÿø~k[k}Uû²UKÏ™;{3»÷n˜´Ÿßg¾/3÷ŸûÏ9gfÎ̽wæìÈlm[‘­ Õ†ekÅÚpºÁ<Ÿ}•ºÇއý_{'9‚ÖMŠOëª")vÕ‘²éΰÂ@•Ç0m;fVžê¦ )¬±‚çèÆq»‘RƒO{1X •í…•ÝyLžòyLÚI©s>¤††ÊÓ‚AËWÉûS¢O“-ýô«g鱦ÄÄ*1S›žÍV±eø=WjϕژRzÞ”¦ tÌöLö”ek#ñ)ȲE–…ïBgÀdÐÞÑtÞÀïÕ7ŒÃÊø©_…µ§oWA¹Ò÷tnÊV~¼.mÛ Úv›aqEäݺ9Ë.#¹Iv=¥ Æ÷5fŸûõM‰0MŠ¥©llLlÿô_¹hy…GZ÷|ŒÁŠÿ!0´*õ鬓CÛÞ¹‹ëè:±Ã– g—SsÝ:|©YSG¤—'ÂITºnxö= _ˆ!}8®nBÑܬÕÈÏp8Òïµò}ñÔíC ØkJD|PKg¹ké×”¬“í¦éÈ[‰_€u—¬åß«I¦Šî§c……1­^]G¥°Nk/vˆ×4$,5h"O_cVÌÀwÖ13z©HmLìœÃ6ö:V;-:o| ÖèØ;üÃ{•pîšz‹ì•IGÙ+“Îüõöo‰ ÇÌêÅöœú¦ØÚå «f7V-â ÐWá+ª53‹ÜÓÕ3fY1BsfÖžµhñra 5˜NÍ.­ë™(g56¬¦Íh:Kh‰Y‹Æë)¯H¬4)åhÇr~ÎLÌN¨\E!N‹ÄÑK¾ë œcË5U74ÖU®HÄXeQ£Lq.dÅ è€Á:ˆbPâêµ½xÃE=ŸïÖ÷Èñ.¦% •,ߣܜڭf… Q1¾”¦óº†ÄÙ8-ÑõtÜ<{©åæ³È‘×^ØÔ3YÓØN7y:“ˆc÷¨)5e<5e‚KS2)þD4e–‘cïd¡-à µ‘Ìz­wa'L¬Ö¦ !p܇ISó 7ÁºõÅ+­âÂ|}£UÒË×ìqüŸ'òùø_¸¬ü*æÅᄹ‘BžΧ¬FX¸‚‘Àüžû-a] ê–£«¨¡Îñù‰=ì«Äø\Ø3ìÞžaòÓ0aÑ04L9€‡©ÏœL}W4Úa ö]Ôôù»ákØÑåqˆ}_7T šÊ‘ÓŠŸ²„× +®$+¾4ZÍkµ|}Ú‰º§ÕbK­‹|o3•ùÍ“¬2¿y2Ò†9ì;…ì›!ì3dûü½›÷3ös{I³Ì+çædÊ"ó|džÌó‘+}>꟟f3g}íPé:CnL3GOuRaS 5›¨´xî‚Óœü›ØÍn«×¹ ý™Ös8 ˜è§s–ßbß-Ö¨þÝ0+Ögt™U¸”WµVáÒFÕrQ@5¯Ôl›w¨RoWMUØié›|#Réw÷×ád™=UÌV¼>+g›#¬ùZ-Š#4‡ÏÁÝüìÔrn^V¶1°Dð\A¿b¿¦ž‚Î@S·¬Çô NΠ“3èä ºÁ0ñQâgä„3ƒz:OøMO¨uR7¦¡ÎqRo=–½d›N‰—ƒÌ÷‘ùþð1ìÝÄ~+$W¡\zq8™$§[*ÌskóõfkÎ~=1gç’ŽóhbÆ\uÜæîÂ.ÒÛmæÁô3®qr§,us¤nQ–Úb3“†/pR·* Ý–ÆÔ8¹ÛÓpuî›; g&Í͒·o4C±9O¼«TãÜ™¯nZkÄÄgÓZÐPä@1ŒAaÃq¡ÈÝis ±øúȧéB«ó-sViW>²+ —¹Œ÷î>ÈÛëP±àHò ü°Í\ìœÖö¢4Q,J£¨žëŠ ÄZ„ê\ˆ.ûæb±-°!ëý%õ­Õz£µ^^ƒ^ñî²”Þû.¢wƒ^¤—# ¿N öØm™,Ú26¹-¨/¹9˨9õ®Í¹;ÍÂ~±“Úm9,ór~Rß1—W‰gZ˜žs+¬ç\U ”š+“î¬wä²Q–˜ÙNý{Ó˜ºÚIÝ—†z‰“º? µÑI=†Úä¤LC]ã¤ÞcçT1œã“¿XÒ9éZÕK]Gõ^{¨ŠÄP¸úËzéÞûÒ˜¼ÎI½ßÅ2zÕ*åžÀÌËQxU8e^ßìao[‡§vy{ÀVþš›ùÇ$Q8H•õÆye5£-õ¢§\Eg|“A3\KWßbpÐz=6¯ÆÏü G߯«køÕ‹xõm~õD$ˆÎú¨K¾Ë72‚þüLC¼žãÌ ?êm9º ¾gè-Go SÍÈܰy-Ï‚~ ]GYËÑKÃ]~nX£­ÊÍP΂ÞÍÐK½¢ô+/ðzž»~+²;åJ±›4—ï&U±j󜚞¤ª°ùÃ8ÄÓ0›Ñ®Òà ÞAC~TÃ÷l†õì0Eñ}Ÿ‡1G½?Ùf”´aŸgAÊQE ”ñ¼¦ñ<٤ö³^,¾Úô|8¹¼Œš?¥·;üRÂ×;üH êøm4Ùú6Bç½Ö?ü——?¯¼ú9¶{{PyŸå!å=‘‡•e>¢,óQeæcÊÌÇ•í|BYæ“Ȩ̂”µ?­Ì|FYûeæ³ÊÚŸSf>¯Ì|AÙΕ™/)kY™ùŠ2óUeækÊÌו™oôù¦ÄÔza¾¥,ómeæï•™P÷?*3ßQÖþ'e™ï*Ëü³2ó=eæûÊÌ”[ô¡²Ì”™Qf~¬ÌüD™ùWeæß”™WfþC¹çÿ©ÌüTYû¿”™ÿVf~¦Ìü\™ù…2ó?ÊÌ£ªL(3™2Ó£ÌÔTÇÝ£+Ëô*3 e¦O™éWff(33=Y‚y:X[×S‰)Nl&ƒubCè¤Æ#r]ä~+w’ÞêÒ·ÙÊ–ôSfæ(3s•}  Ì̳{lŽ8Ç?vÂϬn›Jµ4Š4ˆbþ¾È?ù‡Vî{FäG(wí=Ó~¯X,Î æÚºBEðs®ðTI_¹ÐW!ô• }åB_…ÐW®·æim/)vQÝßnæTÑÌñ=ÍÌÓ>¼†åiïÞ yÚ˜åYYfžïH¡ê9àK™ÿ%Èø%Èô%È,°e– ™#RdæY2{•´¥ R²l).ôÁ6½XÐØt²Ù]‡~H&ê]>¾‚,«Œ<_*Rü·BøoEŠÿVìì†cæ/º ³nªÖ÷ÁÍ1NêÐŒ_ÖÖtÃ1F1·0Mï„æs†ØæÌæÌ.ÜÎÍ)F•áÿ'x=LþÿÿT2Ïоuô0åe®Ø3\0 p‘ Û:, ›ÜÂ*è‡g6?åp5¿rò³·ÉG ~a‚ò¬²_7ƒ/4Wouž¸zŽ·«OGó¨«íS•]pZU8P‡ßœX´2ÃZQ6VQ§†;áL:m­á§­Ca,„è´5Ið([ð9XFížæ"³"}an†*C6BvñTEQk*Å¥2êÐ4Úý¨Âp6vŒê¡†g¬;Óe|C¶ãœ!|•·SÇ™í÷ZîÿtͰ}´êA›\=(boƈ!MðëÊ/I˿͕_ªìûã”Üã•eNPfNTÑÿ'¨ÈD¦Ÿ~%˜£Ä2a†º€µ¡·j±NÐÃqðàÈçñ~"äÐ3…­±‚4?ïcð|Þ·†\ów]°9Ö··€%qز|z èZ˜:@ŠifKmL7·ÖƼæ¶Ú˜an¯ù̵1¿ÙZ æ˜úÌ;k;`´{…»¨BÞŸàÝëióÏé˜tÀ΀™^C;ièàvq »1õ›qL3ÌNL3Í.L³Pr,mîÁ´Ÿy7¦9f7¦¹æ^LQ¦yæ~Ô>%Ñž¤m;ik'm¤miÛ͵ʶƒXcF ǪqÕ¸—jÜG5î§PC¼Æa^ãAnßCܾ‡¹}pûåö=Æí{¥Vú¹¶ú ’ú$I}ŠK}šKÝÇ¥nçRŸáRp©Ïr©Ï¡¼cHÓ‹‘¼ÇU`±ž'Ö ÄzÑf½D¬v®µƒk}™k}…k}•k}kíâZÛx[öð¾¾›÷u7ïë½¼¯Éb{<èo¾Žš/Jô{Šæ7Hó›¤ù-®¹k~kÔó½{g‹vPVªq¯A>wiŸGõ+¨þ PK½\C7®ŒÆûX #6com/microsoft/sqlserver/jdbc/SQLServerDataSource.class¥Y |å/ÙcØLHXd9Ɉ‚°’ Ñ(èdw²,Ùì†ÙÙPñ>Z{X{ÒÚÚ ÒƒZ@Ù ´Ö¶ÞWmµ¶ö®½ì}_¶•¾73;ù6»ƒAùý23ßûÞ÷ÿÞ{ß»¾å©×|šðv$àe/|ÏEðò$€ïûèñþú¡~ä/¼,Áùý~ü”¯ðôÏ&ÁÏá>ø%üŠ—¼*Á¯yðüV‚ßIð{þü?þÈ þ$ÁŸyð þÊï¿Iðw þ!Á?yô/ þÍï×$øÿ•à¼.ÁI AB”°HÂb ]º%ôHè•P’p’„> K|(c©„“i,“°œßS$ô“R8•Ó¼Xáƒ8ð Íðb¥„ gúpÎæÇæœËyü2ê| ÏðÁó¸€gúp!ž%á"/Vù “íÕ‰Õô…5Ö2åU ëH ¬—°AÂF/6‘}ñl.Æs$<×›q‰—Jxž¶á2/ç½B%ØŒ+ø±Ò‹çK0$Á0O^Àlòc•"¸šk!+c«Û¼¸Æ‹yñb/¶“‘"©Žd4ªj3;v*CJcZÅãD‹%¢æ\3BY8™H¨a=–L¬×’ƒ)„é;“TM©)b-(ºÒ•Lkaµ{C‚ßdŒ+„×¥kKLcL­j*¬Å¡¼WI©­ö\{+‹)GrH“H¾-¦³Ø&|,IRĺI¦<+b‰˜~>BqUõ&WK2¢"”èIÒÉaZUu!áÊ¢ª¾AÙÝa7$ ’¢”è-¶fd—§vÅÇ&Á×6V •R^¼¡¹*Ÿ|ŠZYJÕI˜Xbcl@M¦uÒ¦ª•bAs'd“5kœÊª‚Öáµr4‡ÓÖ%Ï~‚\58…–§S ;VPˆQýÑÌ,?Ÿ)Ÿ­E‰æQˆ§=‘Ò•DXàÉ¥T<ºÕ]t©á4ɸ‡­±ÕØ›uWRz÷ y‹Ú’L'tS <"çV:$âoK„µ=ƒDòE…A€f6jé”Þ¥jCªÖ¾ÝÇ*‘¨ó\©½NOjªé0â¸"g~½’JíNj:&¢_œLé¬f{"²2ê85Ù8ëp¿}ø“£ã%Ä1¶KIT±¬ë“šÞ™èe`YÅ1H—''\«ê;’ó@r)Óˆgƒš$7WW§ûúT+¬¢ÉA11Ýe½¢‘Jäb©U©îD,l„g0ú†,¥ ›ÞtŠÒh`‹'‰Bz‚•a/È#z‰³;e|E³_åDëIjýävì¿ûåÑ<[~3¥¼DÑÔ”iù‚‡±9ûy¢Ö¯ÉIu¼&‡`œˆî'}b{-ÍÄñÖÜ4Œ™oÉõWVNÃJ73S¢ù˜o³P>lÆíØuÞÁHs“£oa}»é«“ɸª$Þ ÆÖlb{K”p*rêg2-¡ÄîœPuè'ba-™Jöé\%R†Û7îŒô†».ë0£`= êGõ K¼x©Y 6¨¼*%`j¬1ܘP¸7°çš³oÇ«+T%œQfpÅŽ)qòö5Zr@Ø|V•Ó*>›ò„:¬ç6 ÒŠpܨÿ2ìƒëHÀBç$ƒi¾7Ëp5쥞f¼´fö" Šð!;p-?:e\7Ê Õùõ2^†¼Ø%ãFì–ḑ’f0MÖUEÔ>%׫eÜwÉð|ƒrƒ9G¦Ž E\†Çàqž€'e¸®%%· Êð5ø:µÙ# ÒÍC .njZ¼¤uuK°U‹A†GàQ««¶r,§°úcyUU†§àiÚ;ž[;exž¥„©fKåtÝ¡út¡ðùõU¯bGáºVk˜4h/ð õ‰:±y"1†”Ñ´üÊãêKÇÉç¤N]Z|)¡Ž”õ¯®´Q"Jw‹ÅÀ‹=2næ“.+2 Án’…#,d\¨±Q†ažð Úy]Æ-¸UÆËñ æ·ýÏèsøøöÁ2nÃíóÆfM#¬IjŠn·š$!™™Dw÷)´£¯”ñ*Tdì…»e cDFûdŒâc¸“nÕª¦%…Ð7­#c?^!c¼˜1‰ƒd¼àj•œ4ÖTÒ0˜PwÇî M§›edÜ»eÔÊå¬`["R:hB7ØÐ 6tC7ØÐc!*à ð"õN&")Ô² #Ø—Ô¬hÏO)2ê˜ö⌻ùXWžîæëzw’äk”0y;…Ñ>¦ä™³•idÚpU$BåS¥˜sŒ{ñj¯Ák½¸OÆëøà®Grïòñ™IÆðZo¤ìƒ7ñÑÞŒ·È°öÊx+Þ6áã;gS+m7‘sfaË)½q5›jéA;ÉÜ$WØwÚ\ðÙÆ‰ *¬ðP>¤@>UyÉÏáÍ\DÚO1+éÉìµpF‹°:¤Rq­iïl£;@¡«2sN¥Ó-š¢>f\¶M{Ì®rá^ÁÕK×üSZ§›ÖRqŠ'“ýéÁì-Ájûí&eÙéÜ=…Óo¶n 6ÐY2w³‘²µ·÷ÄöœLguUTT†”xZ]ׇ°è v²–ÐVr¯ù¹‰—¡”d³å^ìm}<š:@)}œ*ÖtÁŃ\ƒ–`Ÿ €i‹nΩÆY«ü_Q¸ûjÓ´¬KNPú¦È¬êmœµâU§ßÛRG÷0zຠæCDªªå߀VQÕMs£FÆtDh=e÷<žêh©’”¥qÍòZ•Au‚Ó}tá_g$îê9ƒÓ)å¸AäŸoÆ‘Ìû¦ªË'Öú¼»Š’œÅJ„Òe ¿‰ædp¸úÕ=)fÍÜ–HÓ*–ž'H½Jj-5vmqu@Mè„RÂý¸54oÀ«¸ýb­7îTÍ[Ȇº9¯îJS¿2.WdcŠRá$ó—*#…6¼A ûáæÃ$ ’0»À ·êPÄ­¿ñ¦FÍxo—PzûùB`Щ§w _$èy="Ò{FÍ(`Í (Ú2 ÅÇÀUsÜÇÀsÌt°,$ "zN€—x%ÿ¤ øjîOJ2 wÔ6”ÃMp³µd ½y7³2¦n[ ‡§W€Ë˜n: ¥GarÊöÃ<ú¶6¨É@9máŸBÚ þDÌÀTs£Ûè×ßn`¾Í¼hÅô>WÀ\9µc¸µu…qßwXªTµ—kH—¿bÖ(L?biô[áJK£,Wñ(ÌÈêýNx—Åå·,é©©=•Y”wÃÌVyØš~ÜUX”@í(ÌÌ‚¼×>®€%J©Åå'‰ggÁÞç6G{¿ 6N¯9(`}À k®ˆõA'¬¹"Ö‡`a¬y$}0‹õa'®ù"×GàîÂ;ÎwÂÙSù¨ÖëcNX Ь{œ°Î±>î„u¦ˆõ '«.­úI'«.­ú)'¬³D¬O;q-¹8í¸HÜñ SÜT‰q3â7UEBÜ|ÆI®ê1¹>ë$Wµ(×çœäªåú¼-×L k²Å5Ž_ì“dµ¢Å¾à’µþ:A´{ÀêE°/:Õû°ÃNžØ(zâ'Ol#䨓`M¢`÷9Ù¿I´ÿýNXg‹XÇœ°Î±2NX‹E¬Q'¬Å"Öq'¬sD¬l¬× ‹‹±:°ö xùÙJˆð Ó1,á„Ó1,—lsÊÇÒ,Ê—máfÓ,£”#¡,=ÿy‡ù++ÕC…‘–e‘¾b#‰…hYvùÃN1´\Œ¡¯:ÅÐò)ó.´c¨ˆ´ùЉ“ø°þ ¸ŽÔÖÕg ÔsÄâ{µøæÒÈÍÂ×Öe 9äÂ€ë ¸ë\‡-ÞÇàq›×m`ï X±eÎ(¬ÌÀù"îð¤Å[O#½9¸s\Çá‚C!ú"Æ2˜ÔdðÒ§ài{›âì6söSg´jÜþÕâ6ÏÀ³o•µÍìÛ´„ÜwZMãÿÂj¶5è!E¼Dy iEÈÍ®&aÝ8Ÿm𶇡(ä Wg`M½«ùµ@f"u:õ0{OÕñh&ñRBc×8|8KÃÅ!<¡ Ñß~.A’êÒ€‡…ë¹GÀp…ܧn×ÖÚmÕ è¤‰u!OÀÃèÇ`=!¹éX/ë åCl G€úÊ.*àÉmΞ§¿o·,›Nµ<Þ[ãߘîÖù^€-†ÇÀcøÌƒÂ¾Uùûn²ºB Ãæ-4½%[ý—S˜_±–“·LÏõÝ… C~|á­ /³”›73ä2±% Æ0Î0r8;Ê“C÷§ˆº®]Ba8À“Ñ’Ç„‚IÜU0Þ& ]ÛAÐv´AÛ7ôiÜcè(ea,Lô¬Lº«N®,¹e*ÅB ,#” bÛbѰGMSø~™ÊðQ,ˤa®÷ªâ¹Š†öŠšñ—-m—MŒ*œ¡§¼¦‹O½]•åõ6šËyTaÚáÂ,»˜BN&<ï_ uè­âˆjy?EêΦý"£–!7Q£9t¥¦Ô¾m+«†íïÂÞ§Ÿ1Ôïzm¾àzaK3tý'ðÈ€œÔ:âei`´†“Å¢Î{-&=7_Ö¸m©=9.Šè–èG Í;†4üªˆÒ  µ¸F¢Œ¨Ô³öáGýÓ¤Š#†Z¢…Þ-Té’*%cTëq¦Æ?¡á;¤§Éø&ø?Õx5[uÎT¾GÈ“µ(ÑJ»ºhWG»c´û€N•o¢^O¨‰ô•PuY•U©€¤Zó¥I—ŽÀ"N±¿Á;Ç[ZCòïÑñ! ùÏhŽøíôWS$à/PK½\C7‘ì> m2com/microsoft/sqlserver/jdbc/SQLServerDriver.class•W |Õÿ?ö˜—Í@Â@ «`Æ !ÅÒDDˆ‘$K€¯Éîl2°;³ÎÌ"±­ö°­­¥÷emmk+ô -jI¢)j/iµ÷e/{ÚÚÚËÞ·ø½ÙÙÍfØðÃü~ùfæ½ïÿ½ïû¿ï}ïÛÇž{ð!lI u8(á1ÌÀA!ÞT‹7ã-B¼UÂÛbx;Þ!†ß)Ä»$¼›ãŽêñžjq§„÷JxŸx½K ¾_(} †>XCânñù!ñùa ÷ÄЈƒ5$‰·ÃÆ?ÃÇðqŽ#>ƒŠO ñ)9Êq¯„û8îçøt ‹p¬†Ä(ǘxŽs<Àñ ÇÇg8Žs<Äñ0Ç#ŸåøÇç9¾ÀñEŽG9Np|‰ãËq<Îñޝr|ãëßàø&Ç·8¾ÍñŽïr|ã Žïsü€ã‡?âø1Ç“?áø)ÇÏ8~Îñ‹$ü’ã)Ž_qüšãiŽßpü–ãŽßqüžãþIˆgETw ñg ‘àrü•ãoçø‡ êŸþ%‚>(èø·„ÿÄÇ%ü¡>mûu{‹måuÛ5t‡aΞ޽Ú~­=«™Cí ×6Ì¡.†Æ bbÄ´Ì‘æî©Šˆ^b˜†{)C¨yé†ðz+­3ÔeŒ…|åzË›‹è‚kdÛ''º–VfˆuHéy×°LB/Ìéö>°­÷r3(äóYCOWZß0õ¸¦”²LSO¹ k›O ö´Æœ²íë‹hr™lÍÏk¶£“¿}ÂõJg/{¡¶«£¥91ÂÐPÅÞÒÝ´ Cºë£FzÌŒÅp噯¼g2¬ •9áYê*ïÓöZöÝv(b/züq쟹7=˜ZoåhÓ4ÓõôÈ9~I*ëeŽŒq€Ò«š2þç$œ”p»Ì›A¹Œ@b!™…YDfQ!$Ɖ|OÉÕ¸í}ºãhCú–ÓhõyÛ®3ÌýZÖHçý€vhÙ‚.³ãF›²ÂæÁ½^:´§¬\{ÎHÙ–ce\ÁŠ£ÛDJ»ˆ­=±µ7á}–SVfµLæfÊl¹Ž›ð\™Õ±z¯À+:ÎÌèdVÉl6SdÜÂæ“Û®3 Ùlåä\Ö ±y2›Ûä¬5d˜Ûœn(€Ù“1õ˜®>¤Û»F™ÅÙY2^†›©"”™™4ÊpöiÒ€Ž{\¦ÍÆÎ–Ù¶¡f€ÆTSË©ç0…¶:¯9Ζ¦×-åW9­¹Ú æèý¤Iû²ÁÿT]Kõ!½RªIñµ¶ëê°å¸§hå-Ûí/ä…;á]x!$”‰FµÈ£*T¨”8:Õ/s¶h6Yu)Q/wL#å•®°kèÑ’ 55oëtŒõ´êx5_F¨š£–1uš(I)MPVttQ_i_+=XÙѱJ½júõj‘L†Å  ?+,xÜ©‹<¶­ŒAÇdˆ–ÈjŽ;'ÒôõVAœ£MݦS°‰¯aÍU-3;âÙjjÁÓ#‚HQÍØVNÕÌÒ ™5LâÔU Gµu·`›:mÇü´áhƒY=á’RN7Ý-–U\9¾¡8CøSĤ?§"™lO'ôTÁ6܆HF£L&þ{Ê“ªSž­ÍZ©}弜Ѷ‚Î~‰1¥º¥9ÖAµmrŠÒY-ãdŠÁÕÌ”Ÿ=eµX-Ž× l5½˜¨ð6—´hKÊGµ–ȧ]›·t÷«9oGeGÏRnõéî°EìDÓ†í‚x·éqQÜPÇHËÛ±l2?ÛÖ<]WúºB&£ÛAá R†&:R®meoùÁÒ¼:¨kû ‹a&Š}Âr©gÂ+E–{™`eæoÑÜaÁ²Ðö&ˆxoF™T›¬s·Oª¨“õ£Aœ}W9Å™ÆI¶(K*¼Ù¹¸MfçQ•c狺Ø4Y‹å¢x1”ÓjT©0Ñ«(oE£ÅiGE‘QÀ~†egVÁ‹‡]f°EB¹ Vf¡Ì‹[°.Pmi¹}úåV¼¹²è6 Ôi~§ÑPu‚Œ kNñ×õN-Y©5éFô?‰ã’ÍŠ«ŽÌ{Ú hÊ S°–¥Ä)Ý‚%Zaqµ^¤ZßX[ќЗSùµzÚ6e:³eçe2ÛmÛE•iZ#jS£¿˜â¯o¥ª¿]UÏÄËžÝb=Épºsy[(/Ê×êÓ[«âH9ÂZÇ¿ž½ÞO©æ«>]7|fé**¿^ÑLÛâr¯Å°)!Z¦ß÷S»×y,ïÓLêÐìbóØ;¥o 7÷þ¸k•¶tjÖ–c^rf9#lÙú *çTN5¢µiÝIÙ†ø¥ý¢Üœ©ÓSu!97¥ë•sSš]N¢×P2̲õ!ÃqKÇ_xì©=êòd™êãí¶–Ò±‚~ÄÕÁ¦Ÿ¾¢i¤ŸÙ¢àг–Æ©_&9B_³éIÝ"-c`÷BüqÑjPLßL¿09=í ÌHŽ!ÔÛ2Špß²a¸×ÐK”áHýmãàaßsò©–¶QÔtFX>Ú¤"cæfuFÃÇQ— µ%:¥ Ô'Y<—F1›…BcPn=êùòRú“ƒõ䵘¾W[B”žÝ¬õy~´usîð^Æ1·/téÂûÐðÐÝXB…+;ÃËâáI‡ä–¢CóvÞb‡O>Ñ\ˆá¼Ü_è"Z(BÏfÖßÒºl ó;Ãñð þè‰x[ë1œÕ³Qœ½³-hKmzÙiɳÕÝzs½ˆ•DE)Þq,ìoóL㜋à á»0¯Miš€šláÜQœ'œn[6ŽóûOYˆáU¸Õ_h)}…éÙZ#¬> )|áÐý ŽÐä Ê …@S ¼¯)ˆl$Ocôìb‘ÐÅQ?r‰Å¥C%Ï/˜ô\p}‹:y\R žkX¼æ$eIgÍ%•Åñš14wFâ‘ð1,G”–chó†è­QÚ‘„§³LY2U§mŠ™^^Íôò²éPÖ„uTƒua+‚°•,^s‚Pú¨•AÔEAÔª ÔÅ>jUõ¢ juêÅ>juÕDuUY«+ˆº$ˆZSµ&ˆº4ˆZ[ºÌG­ ¢.¢ÖU Öû¨uAÔ† ª©Õí£š‚¨+‚¨Õ¶ycveÖS%°ž êª jSª×Gm ¢ú‚¨þ ÔfÕDm ¢¶V Jqm ¢¶Q‰jt$‚°íAØ@y±ÚÙM—c‡"w‘»ª¹+ˆJQ»« vQ{‚¨««wuvMvm5صAØuAØõÕ`×aÚT?µ>¿·ùWn½å†Ç1xÄÓcx]yv ]93è9GTþq¤Æî¥ûM?Ò:âÁêÈ@ƽ·û Y¾Éá#þþ†Ò ÏÂTÍÅܳõÇ!%CÊòD2¬,N$#ʲD2ªt$’TïI®¬I$ë£ÊZ’txIreÉ¥‹dLYM²VÙDRVšHÎT6’œ¥l%Y§ô¬W$g+$¥ŸäeɹÊn’ ÊÕ$ç)×’œ¯\Ÿ¸ Òq %C‘¢[íåd!ìE?ÉQ`¯è ¨?°O ¬L©ìrt›ã°ƒo¢.å†{)ê'ñ4žA^PòŒGÇ´ÁÈ{Þp,2šðû;_\óÔݹN#1òçRC{½4<á ý‰1œËÍ [êäñx¨ÆÜ°½N<ŽG£‘…Ç 0<ÄÕ¬ Ò… !¥¡3”OSÁÚfÕŸT“ÓÉ¢bÜã캈ͺ#™;ZëÝäì ’¨Ø@dv»&¨¨“)e^Íäs NgM—E¦*)uàê¾›Ò,iBò§b¸Ãyµ^W£–µÈä2ê ÃÀºæºúKP›>}ƒÖë‡V›ææ¹ä1e¸Ÿ«!ë|7„âKË3G‘¶7®„­Z¡"ƒ½Q}ÛœúÅt}€mæásªR(,Ì«5­hØ ë ¹ê†úGšKÎóô'óó ¹Ý8«ä”BRUâ*½ôÞ¹(‚Á†ÝÚJ]®©“vF]¤í@*k40­® ‡0"ᆠ`Y ~*!ˆû<'áyüLÀÏ%\Æ ÍZÿff”‚*%âr¹:iªj®ý^Ä/hî”ð~ÉÕ–ð+üZÀ†>ʰ¯ša_5Ã>ža_5ØRÌ/RŠ€—%ü¿eغº ‡2Eµ¢pp!—Î*^AšÏô; IL ø½„?à!Ú.F‹³< W ‚žÎá‘%þ5.#^Ÿø×9ßÔÓ)àþ„?KÈ#Íà¾Î2óf,ž}Ï^‘ðWüMÂßñ†„@•0ã\gVBsÅ»=žýDã»<ûw†»4×èï*õêÔ«SÇCÔëÕõ½»u>îÑyN5=7Ç5±{}Ø×¤óOü‹V®†cì¦ñÎêX6UÜÐÃpó*¹1}‰Ðkåè-A0ŸƒÙ4H9Òñ4×÷ñ…BÏkô Òó:=€í4Ñ}ÔUoõòÿÝDï’ûJüç)É»J²·$ï.iN†·¥]¢‰ÿ‹ôÝ¡SjÐ>_ÉQÃ÷!`û|~yOI¾«$ï-Éw—ä}|\iªýÔ)ÔKÔ-zn@¡ºÈo5 ¢:Ð&p––ªÍyÓyc‰¡ºvM“°‘ûW0ð ,zÏáPK½\C7ò[ÿ¨ X=com/microsoft/sqlserver/jdbc/SQLServerParameterMetaData.class¥X |“ÕÿßæKò5ý(m …”¢Ú4µ¼‘Ð¥¶ii Xœ«!ýZiR’Ámê6qÓ9ÝpÎÁÔvN×M» Φ êÜK6·¹÷Ë=tÓÍMÝœ{¿´;ç~_ÓWàWý}÷ÜǹçüïÿœûO¿ùè–Š­v|BŽ|’‹û¸¸ßÍø*>­â3*Pñ`&öcPÅgíøœÙxˆ‹ã*N°|XÅçyÂ#RâZ’Õ‡UœäÆ).UqZÅc*g¥'T|AÅ“\ý¢Š/±ß/«ø ·¿ªâ)gT|MÅ×ÙúÓlë\|SÅ·¸ÏpñmßQñ]ßs eb ¾ÏÅø!~dÇÙØOTüTųêÿ[ø¹¿p ’áÿÏÙñ¼¹±¿²ã×*^p /Úñ;~˨_äöKlñw<ý÷*^VñŠŠW³ðü1 ¯áOÜÿºv ³Ù¿¨ø«s`žVñw6þ,üÿâÚ¿Uü‡•þëÀx“»G¨)À…PEK u … «*lÜc熪ŠL–Ud±ÔT1ƒe6™3¹È¶‹»È%kñDw¢)Ó# eõÁhwyw(‹Æ£‰òøþp\Ðcå{;vË[¶Õ·ÈfK"лiÊ:K0X>Í™ÕÑHD&BÑMÍbßÍzWo8˜]¿7p À3ËÇÛÏèî(kÖã½áD‹žhК@"@:*ª„Ã3cñ¦X4¨wôÆtÖ˜þ¢R†×1+<·5°;¬ 8 çá@¤‹ÅB‘.‰5êBz¸#. õbq½:îíŽPsIñÔ)S{Jv(ÕÑr¡ué éÍè¦æìâ’t>Ò‹/Bð)_Yz<èÑ›xH ÊôÜ›…͉­Ñ}z$tK!›lé&¼4ËaðŽÚƒA½‡ƒ· §À,9±uOLg8 ^ \œnv:¿¶ŠP$”X/PW|Þy˜àÒ u"0%¡Çš¢ñÃ%Þ‹}rÁ=zpŸ§eRRªÕá@œñ# 2ÂìpòHë¡öä.Ã+§DSL†â°JÍ–`€óÑŠû{Ãa#9ÕP¼%ÔÑ; »\gM¢¸¨rCÅún³41[äi"‡51GÌÕ„KÐv QÈ”phÙ¶D¢ î‰h¸× ÐÑ›?™‡M½zŒ ÎÓD¡˜Oúž"M\€Ã‚*R÷áýšX€;5\Ëv”¢â&²ç‹p+M)ò¶íM5U­µä¶¥¶UûñÒôù[ÉP±†¹mݹ¥¶¹–¼qÃæó·Ô6“êM²ÕR[_[ÝJsꚨ]Cm6'.aý#zq@C´$­¹=åýÛAç‡&.Æ­šX$Óò6öŒíû{áPgHUÒÖ7½:btæŽëŒPЊ*5±„œˆb\g%šp‹RòóÌe dNòõƒz°(ÞÓg'íAc¿ц/ÚØX³©z‡«\¡ (ÓðN¼K ôœ~ø¤ääª …)ÍìDŠ(K<眕J@cS}3m+™ ý`¢¼AÇ]z]4Ö bç5·‘„¯ƒÖAOi)ž) 49g,ƒw糧`B—‘TšX&–3}+4\ƒD¥DQ]Ck£¿¾­¨Ñ_dĺˆš£M•œ¢ *uuv±R«Äj»X£‰KÅZ ‡p mæ±Kf[}êüÒ„ý~·y«ÔÆbÑ-+µ3)Üc0}‘„ÞÅ}s›ÛC‘”()Eo÷n¦êv±‹uš¨À>Œ#™”ßUí­mMµš¨ëíbƒ&6Ò¨¨¢­!6ñn¬ÆáêÆúí ~S³FPQ‡£šØŒ;È÷¶û«¨w %.îÂQêmj®­öµøýîækKuU=í”{¸¡ú·××Wmâvú5áãÎ5ÓË˱sÌdF  ÅašÁi¦{ŠzâiÝ–»ø¼ž±'oˆÆty¤ÅåqK'^f„RQvQè¼oã¾®©UâúY®/šf î ĪÆÁY-‘ [ §GÐqê™Ö½eœüID2a`˜äÙÈvÃsXt%ögšÑÍH¢‘ ï>ô)óF ÍêìÓëbÑîšXˆ9ãœO÷z÷ØšŠcÚœ;‚)3€Ô‰gÜRKÏ ½Ð‚1ŽºqžÑvòëo6Ÿ‚½ }[¯;Ä». Ð+¯6mlÎÿ7ÍdMM¡\‹ë ã0¤Ùžsû4i†º|Ø:̓rqºÌH÷ÈÈ/> 3Ω½”?ãéJ¿³JÒ<¥'˜·Ø¬®±g¶ÀÅéæŽ†vÇiÅ }ü1E‘|‘Yƒšq¯,ùÀÙí½ÙB¤Më†ã}µË›g+Ý–ÆS+{̱ñ\SH„ú›£WßYŸ¼ô~›‘²`XÌÐ6V’É+1wðìŽÑ{w,£ŸwuôšŠAE?Iè7v¿O¤¤OJº¯¤|‡Ù¦[^JzCIy½”³è£·Y{/=ÐÁŠ,’®Óm¥Î e¿….A¯Z–„rTd°z3]™ž$lG‘©¬¶Œ¼”g?ÛÀÈs®LKöœÊ>Ô»2*©Ã&³³¢kÌêú>xh(…÷"È-¥Ïã,;‰K„å$Ê »@î1 }[é[.íªÎ¥”¬;]ªLZ’2­Y.3û•IýË Y6±›Òýø‚nÇL‚ÖÂÆi#滇±Â]:»ô¬B© ¹ê~ìfع–Ws-¯%±úI¬ñ³Âª$.õ*î2sƒ9×òîb@N¯±Å’X7„ š[‘CtW’Òú$6ȶz©]Eíq{†±ÉÈ»•§QÝæ¬!v†QëWG]›å46·‘Æ–òfòWÆŽ|’@ã$PN¸y,‰­C¸lQ=áp›BƒQŸÃu¿ÏOíËÊN¡1dÙ¥œB“À¶ ÏŸr”D‹ts‚ÈÊÅc‚ÿoòqa—r<¡üÆÌý"ÔFòvK%¯vžrU­•hòËÕm7VçUF—·£mÞ0v¶x­£^͸¼!Ói’ÃX äFæ3Ùº|[£æÒ±u‚Àf`r¦À¿=1e'xÍÝv&]ÒNÞnÁæì+h6§± ôÌr˜6¶4ïveà8·¯à1çÛ’¸²²ð$Þ~¼aÔ…g”nq\BÈG)Cû®t`âNÓeؼÅp™oà¶Z¹r í\«H⪆ (óî"Šyƒõ£¾KG}[åfb%ùÌKʬr"†á¨‰áZsÙ͇\¶28¶ÚÝI+ „yjd˜;¾À¬*ƒöAËàT& Ÿ£3°ž¼gc­”^¬“²•RNDu,…êrUEš`td`pr0Òû7"Q,#±Dʉþ>ž þÓŸ7?}Bð;“è:WÜKo‹¤œèí®i­nτՅ$ùomuwOËßÞ þöýþîIùë5ýùÒø Oð×-ý)ý°*ƒt.Pê[ÏžJùX%{¤,£Ë†%§÷ª)`úÐo‚¹ŠÀðìš4`"iRé$¢ëçŸDϹHX*q”K9ávúPK½\C7þû¸ï¿<com/microsoft/sqlserver/jdbc/SQLServerPooledConnection.class­W‹_WþvX†„lIh&µI–]ÈÆ¤©Ò¤”Š] †H­¶Ãì]XºÌÐÙáUÑÖZ_µÕ´>[ë«JðQ+IÃ’MjP£õ­Õúø_Ôsfga_‚òûqÏÌ{¾sîw÷î›ÿ~ý €ø—mHøp7†+h0¼0}ð Á/#x?%y°yåa¬ã˜ðazña6¤¦øé#2>Êò1þü8OŒUžñq~yRÆ'øó'}„ý)Ÿöâ32žòá³xÚ‡z<ãÃçðyÎáYϱæ|â‹2¾ÄrJÆ—Y~Å‹¯²|^Æ 2¾&ãEý:»þ ¾éÅ·¼ø¶‡ð’ŒïTâ ¾+cšåyþ>#ã{léû<ü€g~ÈÃËlðG2^áé)/~ìŬ$T$âI[ÂJJðG†´1-&¡/pó\:_8ÓÐ+ÁÓfF)š¾ö ]Œ°eÊJÛ$·Ó‹$l 4eb@اµñHzŸìoi ¶²Y·„f‹.1ž˜Û dQ®"#Ù0µ_H;œ³²Ò0íxl²}L6›[£µ¥m;dl×¢Y1p°"niHØpLOäÙÎYå ”é 3)>è­ÞÃæ˜Xv+m±»HUÔbÂ.–/Þ¤mü$ÕNŠ(8ƒ˜‚8Pð>ôH¨Î/bí8éÅE¯â>Ý<܃÷(èD—‚Sèòâ’‚9¤¼˜Wp¯‘ùA¿{4„Ô‡û¼Ž¢Dí±5ËVÓ!W 1®êK¾ª1ÓR9¯÷+ø «üW|RÐ÷JØ£¶ÑUTUC¸Ÿ’P-¤¢™½¸ªà üŒv¬ŽR€›QÓFvÃ~bv)S(ÜK–°óôƒ…m¨#ÙÆQ‹zqMÁ"~Δ^ñâ ~‰ë^üJÁ¯#RÔL¬²Üe/ïEDÁ›ø •í·UB“Oª”–ª“Qµ_ж„Jñ¶‰MÕYDÒoÙÀ‘u70öøw”jÆ~Û·„=j"J|TªK$8Ôý^Á8cþˆ?IؽjnK¨[q Ûþ³„[Ô¬*l^Þ\šZbé/x‹_|U»e™Ö)]µ,gñ_ñ–‚¿ámÆe&m¤8ûçô<üƒ‡âm§¹¶¨90F‰ w¬åüœË–S§ú‡h–šÆ2+…ëÜl㦪Ž&3Jm‘óDŒ‰µí“]í‘b'¯ Ž¸m¥Ãˆº}Ü1¡õ'ÈÞÎÀŠ TyåÚȈ0è k 9A ¦ÒM‚Ì˶™9A<±¸A†¶ ¹#Ðqœ­9G@‡a ËЈsEЊ̬/Ð-ë:­Â7yæHPhs”ö¢ö®‰â–5§Uv&úÉT âŠÛ“š¡9‰Ð¶Žc9„¼9þ?Bú ÐvPîÄÝn좔„Uq7îmé£õðZÏ÷ìöæåpº€o”ÞdüQ²V!b˜zU«ÍIœ“¬.u”ìÛAA:EŠEŽKÕùm’ÚÝ nŽNí M“è¢L^¥e¶I4n8!lMú¯$ßvÌæ¹!áA<”V’:h®”dÓjtì\¦£/rÔ\Gõêûü·\Æ®y¨Wy.…Ý)ܺQïÈ'J¢E·M£3[ñÏ¥°ç„‹@ìM³E öñk`Ù;g²ÂìcæAa¿míÀ¹ÀM9À¡ÅÙÎÐbãU"o¿´O q)Ä2/ÎúÓA“î¥9/É]Ù.„ŠÞOC(E>åšÆž`_ç5—¡™íI´©ÆÅÈ]‹ML}9-*=VÏO)x ÓüTŸÂ;ßÀÁfOç:ÊgðÔõC󸽹L Ç]«Eêp~¤ê¢ÖŸIä™5uò@®ó sÇ—«¦ôÞ×K¶©h‰d!÷|½–…íÆz 7DTÕ€èmR'èð3aAÖ%;”JÖÁ¶š5Àõô‚á%¨_V½—½U‚Úi¼Jë×h6Ièy¡øX!;°ƒÄ¯1.ƒ×q†öj ƒ1ªuÚ]Œ' Àv1ø3†"¹ºýÏB²‹T½8ÐEº¨vÀø ©Lrƒ™eLt1´×±‡à«ûv0L¶Ô*±‹‘•Bj£»Èj¿Ä4Þ ¦Y)œÅÔ>íJL0ïaì/ŒdOìâäê}Œm#I–.ÆïB×¶¡%îCÛ ‡¡J½AãóÈü PK½\C7,þPfVRcom/microsoft/sqlserver/jdbc/SQLServerPreparedStatement$PrepStmtBatchExecCmd.classT[OAþ¦TJËjå⽨(½é‚Šˆ $THú ,1QŸ–Ý–tw–YÿÉ(‰&þ”ñÌy€&h7™93g¾sæ\¾_¿¿ÿ0å,ò˜ÈàQ)<Îá &õêéži9•%M9‡!T4°ª5=Õ3xžÁ4CZ*_1Ì7᛾çDBŠmeÊý–äÑÌ=wË1­õ¦•l?F<´#îZÊVÜçZ`Ú²•³»zèðPy"`˜ùGg&äĈC—\6D(ÉúºÆÐ¯v=9IAf­£@írå9¤\ôO-1ÄåžcîÙ°ò‰*Ö.§˜\±zÈXѺ¯\ù»ÈGf0Ã0FÂáRnp’ŽpµkBÞü`mpÛå]d`†±=ûÀ6[v°cZ*ò‚•x{›GÆñ2ƒW^cÖÀÌ1ä'x' ÝoõÉ<Þiì‚a ,â½%”z­Á¤ÖXDš•N×¹Óð]†‘îjc-xÔhÙRrjëÔué7„ïÛšÿI¡¤ Ô¹ÓbT¢)v:E¦|Ê•æåÒMûí0ä:¾zùêñU‹N³Èn@‰¿žý˜GG›žÏEL×2"úXgk:›ÒÉ®œÔ™a½ç¿ k#†ž÷üjâoÜR’^›<=$@EM&èï&­õw #45gAù$º>ã¸Mû;´š¥½ÖTªµS°ê¤>Ÿ¡¯ÞFºÅ~šÚÈÔN0p†lµ~ŠÜq⤀»¸G/™v1F’‘ÌUOh´1˜þ–`î'A1< ôC”ÎÑ£$S$³„fµ6ŒãK`"™vF2O/â ÿPK½\C7ƒhÈŽ{)Dp?…<л‡ <Ò4›$Éã&ðD5›Ó¨¼þâ(ƱÄ“ÊS «5Gx¦ç:¡¢©L¹ß–<<à¡¹×øæ˜ÖçšÕc?…<°CÞ°”­¸Ç}UfQ»®Ì.3$­#_írå:$\w}Wm0ä†6=´b5¿C™UDƒSP ±yÈŽ¢}4—ÿÊÚj.S°y?Q^.±(°Œ} ¢±ÓLWPï#ûh ûû¸Â>Á>)±+8X?É>E½OËì*ú½ššÏÎ54v­Ä®#ªÏÊl/¯WØ ìs \Án”ØMÄùfš>·PïóÔÛG_ ¬/’`·Òçm2ÛO¼o'È—òeÂÿŠÄîÙWh`_S •Ý)±»$v·ìúþ:ÜK˜“2KKì€]ì>šäÄã~jÒçÔ{š‡h†‡©÷Mê}‹zß&²Gï;Ô|—>¿G½G©ù¾Ì~ ³Çh–Ró85?’Ùé÷ ™ýDf?%.?£æç û7öïÔü5ORó âòŸÔü—Ìþ[f¿$ħ$ö+̔ٯiè7Ôü–šßQó45ÏPó¬—’öždÏIì÷ôñ<éHKxIb/Ëì™ý6ô¤’?ÉìÏû áÝ)³WeöW™½F£æu‰ý]+Ù?hoPó¦Äþ©ÀÕì_{KkØ!‰ƒ×q&q®À^_x’ób…K\F2^B=…šy2W>Ÿ/À¥ñR™—âB4r^.ñ ng÷ÐÈ"™Wúâ¢CîŸÄ—(p'_JøUÔ,£f95+$^­À$™O?{üXjj¨9NâÇKü™×*ð?Qâ')ð0?¹›*€×Q¤ÏzbÕ ów íñø³,ÉW¸‘šU_­Àã¼Iækd~ ž*óµ2?Mæ§“Ðgȼ™VÒ"ñu_Ï`Q_BŸ°ãv›fGÆ;vé‘P<Ê@ ›¦žÅ´dRO2(õ°25m­ƒ¡MíƒÝ=ƒÃí]áîð`Gÿð`ûÀði«°0ƒù!ËLÚšiŸ«ÅRºƒÆe‡§m"¼C –šB¨[³õ¸nÚíz̈¶ž` $/Š…¬x\3Q–ò®íÚN­1¦™cvÂ0ÇZ,™@‘µ„Ü=¡·ë£†iØ Ã`ž72pNôëv*a v›¶¶ Eߊ ¬”ݧ%´xØŒê»Z£ÛSI›¤`P6Bb‰1A…<+R¶klM$´Ý]FÒF)L¸ŠÛ„’ÆtÔ·¾kBØ}9àõRumÄŠ×ÆHÂJZ£v-®1©'vê‰ÚíÑ‘H-Š; >û<ù=Å0X˜¥±k8w ­f\·ƒŠZÚÉ„Ð@»‘ÔFb:*n‘3+‘ÖVm¿®EI¹UÓÁas"e£^u-Ž Óí¾lý- ÔåS¿?dEq]ÅëHï„]¸¸ÆÌâ3‹k¤Å5f‡c¢‚PЖ™|Ãáºsqó;vEô w7+"1+©{"yúô±HŒ! !ö‹¶*0“/!—Fbº–X:Úb.I±è”¶ Á ms¯%ã¥í¨ÊáB°¦¸þXåÓ²ª£?¦lýœ”žØÍ`±·È¥±_O¦bö€Nf¸(/l"?S‹¡wºàÍQ´$¡5ôYÉ…Šo\À²¨Õá@ò^W¡û:ƒ¶6'¦ˆM¨ˆ ^Rq`½®ÿ1¨?Ì$5Û /MꦣïdÛîþ¾ƒÁÃÓoIP`i)|;PØcÅκf›J$-±Hݳµw'‹ÏØ[6å3fÉ-£Ù%jy,þoVŽ*ž‡Q [·µvÍÖ“×ì¼ñÏ‘\#š¢[Ômä¸QŸÚçp]¡b ‘q=²£K7Çìq 8ˆgk2b^ÀZ;ÂVcV$kØòXfîùHØfŒµë#N¾‘¡‹köxãÔˆ+²©%v{Ó(±, !&Æ@x+¡IÜMž„61¡ Á}*„· X ÂÚ­ÔHÌÁk÷ð:c–f P'Š6@ØãÞe™cr–éIÅbÏÞ‘íH)*„³b‡«X’o@°^šwD óe(¼Œ¹MË·ŽÔÞjø•+YV,ViЈëîÞœìᑼ%ë¸ i1ôwÍ™Pr Ñ™fÐÐøBws’ø„˽!S Î:…šÍ"KUÓ©=L´ô¼« øœ«h¹b —áøfÓˆàëÙŸ¬E£"[BS™ûáî§?P· Cü±³‡tñœ·׳3J!v9ŠGeDÐ=Á+³üÓ âaÏÜûõQ¤ÊVB2j‹Y#9"Pf<4s<ä“aŠ<˜,óœcã\ä ŠC³DÁã-Ί6÷we­ÈÔíF„®yÓ’ð,p Á|ðü§¿¢E":&t«V­b°î¨7VˆSìä† Nœ}þiYèÔäM”ïõäaš]^‰‰„R…—á)‰oPù™ ݤ&gÞËî´Rf4“(âöL¡ôX 31)‘°*¼oªü¼U…çàüäm*ñv‰w¨¼“)*üžRáx^åñ“oÄ< Ï08uÎ5ÕÞBïŽ9w‹Á„f&cš3òM<¬ò³à5•Ÿ3ò.šä÷Ä¿›ø¼¥ò¦`Žu´ž¸zzZr²áŠáN)¼…OL`â®GC–‰ëI¢ u&¬ø %ño¨ü~~P…¿À]ö+ k¥“¼©,ÊÐãàx Y;§nr2Álý¼JŒ+<ÆYJTùƒ<=m¥âvAkºAeëÙ•µ²6•u°N•?D§JEžºœÊæßTù·(r›–þÿ$߀QCS'%¹NœÉN6ú‡½ê!å"}z"nàò¢†SÑ$y¿û6Îõ|6ñüžÊåßWùèd}ŒVöCþ¸ÊÄ.d°¼Ø9™òÉÃLQö :ÙÖ0LO+P²Ü,—„ø Þtú‡#šiZö ¶CÇ-M‘ÔIo½ J‡4qß-V ÔƒŸâ%ÑêÐÀ²kWP¼«¡ÿL…Ä]™weFÜ•$îÊÙ©òŸÑqRèjgV¿–M%ü3Ks’R<`G­DF·ÓÊbCZŠò±†ìLzpjÂhñ²‡<Œ©Žž¤®ãº+³2%BÛB\ïx-Ö&&tWì¨s›@a–SEpÖQÙ¶¼ ü£†‰BI[Zû{Â=øP$¡Ù…œ)G~7Äý¨/ì`ØŒ“$©‰Á-P:㨔Êó”!nÓ1·z©æT¹Û)lzà¼KˆCP.R饴XîS†WØ£§+´Ê˜ѧⳖØ!ž4úò¨¿àsok^×[2ÒòèItã¢/élš#•› HšÏ÷ºv^oÏBZ¥¹wæ¶?EN;¹D &3N À¦SÉ´¦0Ń$¢7§´”¹÷ñ‹bŒ-æKóZDÂÿ(‚Ó”IçÍujæx™ Ç'b¦(Yš‰Y&ULÝg¬`à”}x±Äu'E÷Ñ)“#˜«Eâ[ÈYÞ&‚Cêÿá.?âÔ2e‰BÏÌ I‹c,4`‹ ™›Þ`f+îjjÖŠVÈémQ¦£/& Ï¥´}âÅCsoƒª[‹s·§³PÍdi$ï›\K[/h‡„ï-ŽêIÕ—©–:gOÂåÀàP Ëà—ðö~ß¿Éúþ-”Ñûè? ψßgÝßçÄo=íý½ ð€^WÄøË.Ý+b\¦’òý“ÀYJÝÌ—L%·¬¯W³¾6á …×ðûoøµþïé.pþ^‡¿ã44œ?ãïh°¾ºÒä ╤AÙ % áÐ~(^—M¼ o5j°> ó'aA°aJBÙÐXØ\TUÔ†òî`UQ*&a‘èTNÂbB[BL—¤aéÝböà?? Õ€2¼oº’Ô .Ô j/øï„eCÁ°< +ri½L¹´·!ŒãïUH[}=ÌÏfqŽ ²I8Ö‡@v3\LCÍ=p\Žß 'ÓÇA8×P‹ÝÓpRùÉØji¨KC9Ôï‡3ºÂwÂz÷#‡vå4ZTTãÝ(ç œÛPâléËèUÏÝ¢^„áoÈ·žo(;³~Uß«†6 ƒÕû dgû½\ñ 4MÂßZ¥Å>Tê½°¦ÒšP‚SöøéGI¸qÕ¬Á_R -õT"y•â[·œºíƒrú]Þ”†µ{2x)WËåôಊ ”ô2·ëÀiÝ IO¿Êè7 gì…"ߴݧ ¢-¯Çfqš'AÂ^Ë^¨zCk$­ÃU…þ;rƒÞÖÜ©Ÿ ü}Ä%ï®hC™ò@Q³ß·¶¨²¨zì¯,º ”†24Ãõ[hþ-•EU~ß}°am±o­T)U†*¥t ¡ì‘p¹/7”ÕÐG}eQ“+ó™ixg³Äª¤Û`íAh*o»B ½Yö?C¾ƒÐ9TYä¿ðlh.DUrZÛ&†“…ªhY‚aÎÚ‹•ŸM€=E8Ý WwW®3?+r—yú"ùÀ±Y¡k(D§ìNCÎÔ›KZÆŠç$•g'eLbò¤EÒ¾Ü}a¬„).iƒKZ“EZì’yôÞŠûºü¾\elS]û\³ºyœCaªÿf¨rwc ƒnwsΣ·`Â@´¥¾8 çuÉüÖ€!´Jd°5 Û&áLì½ ÿ¿ÅïPT inƒJÁ¬üÜSæÇíÚÇ»<—¹ò–;ÄAšëÀæ³®äÊM’Ÿ4êõÂü)Bº.ÙÝ€þ{aZ ƒgC½? #‡‹>‘Üè3Ã-€^Þ\‚óãï1¾ Õ®CW6T7‘Û•T§!Š‘dÿ¡çgúôBVîrx ‹Âà ق­É#˜>%Xù¨Ó—ߥ駃›±`™4 ãõ< F½L/ Û†‘ë tTÅq¤8PŸ ªwBÉjôdê¡åà|±zg®˜Ë! qŸ‹w Re@Æ//òðËœ𦘩ŒŠŒ2Èÿ§Sk n¢ŠÂç6›MÚ‚$iC i,– ˜li­RÆ€EiѾ¤(.ÅǨÅ (¾ ‚/m[*DK¡M5…AP|kQgüë‘Ñg¥õœ{o¶Í¶þô¦›ó¾÷žó“Í'qÄ`<0z0l Õˆ…kl:ÁÑ}³å¹†ågð’å§F³üÁ-·Ûè4,w 1¼VF ‡×ÒÈŽÃC(üáÄwÌ1Ø8÷ý¼O^ÃÛmrŸ6æí#£{Ë÷Iا1â®ÙØñ,O»SÝÑûƒZ @¶”&cE  ¨\.n¿*r_¶ÌYÙTfWE¡„ÖÇ¢˜.¬ÉbRÄuu0„5fM`xÒpÓOîÒ ¸’AhfØfSÚ;Á\]'¬EÀW£ÈgøX âŸ'zàÉZV¼œÖÕhm‚ [0­kcm¨E…\Ès2è ¤©jHWr­í„§v³¤§šÕ„ºàéjßžégk“Ëóî[ˆö´1¹ëk¢PYkC‹6ð„Ž¤EÖìçeÍV’5{£Nd1ØÔ¶‹š­@­âE@#ëóaTiô˾´~ÚNQ«¢¨ù•]0F@¨ÝPÊU¾ TÖ  ?A„Z®MCíUž©žp¼¥Ü]6¼ gЫRW…ÔUæÏh….þ¥Qŧ¬VnVÀ&I©Ó±O ©…¼Vbðrqõ+Z6ëj`} ^ßb>ΗqXˆƒ¤ÌodýþÉ(ì‚2«(¨”:¦(¸Y!›,5ùñU×qÜLUÆm5»Xd¸X"]œ<ÔE×ÜGe$ÝìR6ÅD‘ä îâ𚞃×--˜Ê¦IÖBÉ:ž³:ã°8·[r^Æ‚’3_ºëJû¬ý 1mrS EuoèÓbð¦%k1›žÚGGšô¢D,YKXiJ´Ëèc¥%çå¬,µ½ÿÆa‡>)oY²^a(õJ¥™AzÛ&;ÍÄW²’8OgýšÛö«yù ÙŠ­¬ˆgJâ^êÖÜDÌ»Dè•)˜<ôj`b9x03qupÇÃv ¼·ËU´-ЪW­`Ú^(Žj \L©©¹‚¾lFW®FÁ«è´ŽE¾–&P]}^?ïŠÀL~ñZeÆsØùÍóª]ðNžxZÂN‘ò>g2åµÃî“0γ§ öêa7f}|‚•#ŠßgàuÙ§gÄà]yY¢Pßû‰ã=Á±ŸsìSÇfµ½ß$ ›š  \¶(¸ˆÆ§X^¾«XØê}H§«ÍòˆÌb³S& Åêyèõ c3ÅλÅ\¦[Z8‡]#™&H=cx–ñkxb˜•\Ëæ¦V²|%×±y’)W*q íf׳ù©,AA%«J­à ™v‘WiˆD ìèñ!3á Æ´¡^6$óä´¡à$\„ma–ðÎ(àµb¶ÿ0”Õ òñón…ž°YŽ5ðnåwâÂsյجçFCÏx\©ïÌâzh¼c1D’ú¦º²QN]¦°ÌaëÎj£‚Nø¨÷`?î8¨a?U¨D'Ÿ‡nÝs˜÷…¯# nî/|l’ˆCB§AQO5ÇjYèÝEÄB{ˆå±Ãå8É µ†Û¯µ…þÁ§$ÐìØ;ÑäÐÌWá| º˜Ô²:™Z¶¢kY¸® bçµ0„"ŽJ‡®åwguÀqô$¿ê ¸Î×q»ÏÙ*l劜Ë}Ú”l{O$c¾S¸Oa; «4ob4—+ˆà„çúG|ö#ÍÈØVîô:ñi+äøìôÉë,khtÒdÉ«Z1 zÍÞ‚Ð: YÔÁŸ «hPЧúìØÄGÀÈoéß’ìå?Ã^ž3n'úórg²µ€rÀ¢g 1šé_<^gVUÁÕ—™ºÎw@=ߥ½òebÐ(<^¥Qa4ôh§«/ÊÇVõu¨îT´ ùÜ÷7šÓÜw.éðÜ…ßàO6÷å/–Åס‡¶žÝ4hXB—c’€íÓÙÖ|ð²†A7Ñf}±›œ ®·È nG¯5ž¸…-¶`:mÍt+ÓÓ3©ÒHSdrHæÍâ”YgŽ‘œSЛò,¥Ì¹Öô¦´Ib‰Dg–-èó;á 3ùR¶lPp’ÇáKßž|e±ËÙméÇÁn—„³$®pÿëa8z£îù†º—Ú8hzïc«ümÂ$2“­HWäwiŠTØéŠü>-‘ KF_º"HK¤“ÝÉîôäoL´Âò‡z'YM‘ƒqO° 2Úªã à…¶cöVœY‘8$Éy»Wræ€s"˜[Ò1\Á}X£ÄX¿”µC/A§Ó:õrèÔÛ g"rpVŠ“Áà'ü;Å'à,üìHÏÂϸNÄ/Áõ?PK½\C7˜”Òåœ434com/microsoft/sqlserver/jdbc/SQLServerResource.class½šw|E–Çû‘üȶÁØCã%ØÙ&c¢$ËX [B3¶1É´fZRã™îqwä!lÎ9çœs€Ýe—]ØœsÎ9ç»Ý»Ý‹{÷~U¯ÃŒG°|îó9ÿ!Ï|«^ÅW/TÍgÿ~ïýŽã¬£?âüÅù¯ƒ?;ÿ½Èùû"ç˜&bÚi¦˜d:ˆi3ÌtÓ¡L‡1ÎtÓ‘L‹™–0-e:Šéh¦eLÇ0-gZÁt,ÓqLÇ3À´’éD¦“˜\¦“™V1=Œé¦S™Nc:i5Ó¦3˜Îd:‹él¦¦µLë˜Ö3Ãt.ÓyLç3]Àt!ÓEL3m`º„éR¦Ë˜.gº‚éJ¦A¦!¦a¦L#L›˜®bÚÌ4Êt5Ó5LcL[˜¶23M0]Ë4ÉTaª2mcÚδƒé:¦L×3ÝÀt#ÓML73íbº…Écšbª1Õ™|¦i¦¦Y¦€éV¦ÝL ¦&SÈ1µ˜ö0ÅL SÊÔfšcšgÚËÔaºév¦;˜îdz8Ó#˜Éô(¦G3=†é±Lcz<Ó˜žÈô$¦'3=…é©LOcz:Ó3˜žÉô,¦g3=‡é¹LÏcz>Ó ˜^Èô"¦3½„é¥L/cz9Ó+˜^Éô*¦W3½†éµL¯cz=Ó˜ÞÈô&¦73½…é­Locz;Ó;˜ÞÉô.¦»˜îfz7Ó{˜ÞËtÓû˜ÞÏt/Ó˜>ÈtÓýLbú0ÓG˜>Êô1¦3}‚é“LŸbú4Óg˜>Ëô9¦Ï3}é‹L_bú2ÓW˜¾Êô5¦¯3}ƒé›Lßbú6Ów˜¾Ëô=¦ï3ý€é‡L?bú1ÓO˜~Êô3¦Ÿ3ý‚é—L¿bú5Óo˜~Ëô;¦ß/¢?,¢?Š.×¢0õÃ4!çèn»Õ›óÖ6¼pfíøÔ­~-½„œƒ.  ½œœýW¯ÙNÎÃQÝ'çÐ?ÎEY½¦¿0_ZkñÜ¿:;Ìùç_É9ªoÕŽLšÜ„s^#¨ODIQ8Öý½äœRõÝ–27to_w§$n¥® çÈ\~ÌgÒYrN€`Ã|é'pÔä®v¸;ŒæÃ­^ÌùÕNKæz„BÜTH&©UEnäb¿Í„Ám~}8j´›¡> Â5º„Ñm!!m¬Ä`kQ³ÕðSÒOZQ˜ø£IåÚ±sÖ­[GÎh¨º±â¶b¿Í¡ˆÛJh®pQ1õbÙ!7ñã9?v›í$u§|Ws+¡Q7ŠÝ†—ú±t¦´[­(Nýº­´ÝY`r., ÎYXžG.æNuÜtVh=–ÅB³K'w…‘•ÌæDÎH©¹zP×µHÛqèzù¬ìlÛ2>=„^ܱƒ!çúA7/výPf9mZ›2µ²¢£é¨-Å^jOäéwáQm°}ŸÔÛ÷ð¬Ë8ý8ëþ¦º¯eÿ#8Šïï• ¢E£ã#{k~ Z0G5?I‚pfÒ÷ê~LΆmy=·TQ†—ÕÜwPVVº9!­d'…—ì@ÔòcÏZ±ž³duCí—¨\«NHãMÑ\˹˜UaøtM"SÍmeõzí›Ì5ênik”Nú3A"ýú¦(¶ɉ¯ök]a™íÍÄdÕc­+}œ,;Zj}£?„¦i³ uÙEi}¢o“u[×´—¤šneBª«GOî*êh2l¨X‚ž,óÎÏî²|‡¢¨á{ávœ%rjÆ‰ÄØ´cÆQ|;8E/€52rî”´§pÀ³Þæ»þXΦŒyÚkˆ5–à [ÛN2³žõ±ÅÛ4ÛM(Ž_O èâ:/Ç(Ðy>ß–›šVÄ ÛÍ)Y,ÙfY†BËë³r'§[MEÙë!ã4íãíç’0kƪ­4¾C¾Évö9ºð¨Qmw.fzkdßšÓ«íöÓŠø=s dœ9è'¸ •U¨FÑP0#ÚT©Œ‘ó|ù+6¡wìI”¥‡¤®¾;ÈI÷ÜÐOç£x·vã&è§ÿË{Ö“MuR?pÝ Ùgìá¬_Ûív¢v\Ö*Ý¢@¶Ü3Sò0Ri:˜iÛ£,c^.ž©Ö Zùð&/0ž`½qãÃkG'ÊM§‘ÙïÙ(±‹Ÿ2mD¬ŸË6*öÂÄ3"cþœß#mv¬Àbà„/°w²>éh8íö'£FcJÖƒœ-ÃvÑÃဵ¨d›ægÅb|ƒí4ŽšÍ u›¢‹D–TF¿ ‡`•õøè¦"ûåÍù­(EAµTöÜ$+xH K4˜ìiØß5êÞTÐÒ9Ai#Ô|&²’y øƒ´Û>ØEŠä¸Ûd¿»‹¤ëR«×¸b«f£º “t+l7Ç^'sØç•b=Ý[àŽÊ¸ÔÿdÙúbc&ý4d\›E·r4.Ð5‹•[1…ÆB¦Æ|ùblEÕ“T‚ ¦DãV]Œaë+»Ë[øsª™ÙÊŽ,sÞ\n– «a·Ôêb¡Îä\ÙcrUƒCPÊ€$ÆéÕew$Ž£xCxȆõìøõj4—š££>H#Ø’>×òúè³a$ìQ·ÇJu0Yæ#ŽWý¯KÁt§êM5ü-~êÕ½Ô“…Ù É@k˜ù¤†¢ûl‘š*3`šÄ·òÍL¬{­ÏÌëº>Šû¬s¶>Q­ÖŽã¯_xiµê§Uؤ޳~V¶˜Ü2‘‹uÇËã_2¹K‚àv#%èr¥–Ý(»Ò£z´« D­¿ª=¶¿ß€–—z½ÜÖ¦™èî‚í¬†¦ uijŒOOJ†(b'v@¥ÄŒQnÇšÛéC…Êívf”ÖzÄB¦¯@65èžÖ0¶Pr4OΪži͚ǭÙ*bdçía†üqÉlEÓ­¨Én¥bå\d­d`*©ð1VXæÖ#¡íZÒ¡ê>!¦ihGÄ쎿ÑG–T7Mºƒœ™¯¨Yö³¦ªªœê†‘°j$uû(ÃáÐÎÉlÝÈ9Ã&:jÁú¦„ºŒ6 Ê—ü*?ÄÜLxi-gd°¼ì-g²ZæüÙ«‚d}‘äŠî±”µIy†5É4R=‘Y”+î7çÂq\›%’¢ÎŠ®)ÒÃ,ø²6ºÿIÒ†6ù’4n âÌ"ŸŠV¦e •ökaiw 6[U›©ØâП1w"yªÑá#{[âˆrûTªþ^›Tˆ©"gB]—oªõ˜<±°ž›Jý‚I’Öiù6]›è1o𦭀ÎX«“×ÐÕ»tk”™Ÿ¢ Íça÷ŠìOú¶ûoÆd•þx£Ã[¼VKr8Q% Æv%‰–4.…²Ç¦Ô(TÞ^yÜV@G{lI·¶˜>²×¯µMâ7Ô­aY$àkù,j*XØQEN²”"šBVbt‡_â$ä“ ˆíØP½¬Jç±Tyû—!<ˆϘÅRBj”p•­rÛ27V}2ÓÂÀ÷eñÏJ|y€ë5Q]ã‹0B’|YTÙž`"1<ËÃ$Üv§¼º$]²2/Œ—‰t“ípÊÉõPG"B µ ë·Ð…U=Zëb†XdÿÃæºh¯9µäœ?ª/Ï<¶Ä°Ú”/l0i¤ì¡îºŠŸž6FÏ\EFæËÉYØn4Ê×ñ=‹´mrÌHIµß\ÈœØ_FkÚ+{¤«Þn0žiC)“ +Çãa¯Ñ°ŽúÚª ~$6V ‘zÈ2A¸ÏÍÄ+¹–Ë‚e-UJ¡êÊ®[G¸Þ.nŠ£f5"g@‡Ÿ]:N 7ËAF&lnaËŠ¹¼|›c.”²{¤5²sEQv“¤×4=!âSPø…e¥Ë¸²S(Ü^ucEm°½¥ÒH¬RI¦'©µ¶ý¡Îde°"çÌROæ²ÐÔ€¦–üšg*KC'ö64<86VI›iÖÜ9 6·Ï†­ŠMLÄß×`"&üXÒ2Y³ Â5¥¬ÊÈØÈpµÛUb†­¬ºk.P¦ bc}›T£aKê_7XÖÓ m~Œ}­™bsŠ®4&@2Òrv–'&9AÌ"Vn›ñ»íÙx©h ~€«jß½Ú›“è<œ â(T¥<2¨HÕQiêâ®T_Ví J÷ øáykcãeX;$j擇Üì4.~*&€œ“õÂæm‚9µ®êLøAÜ*Ù(Ú˪äi‡:I»nîBÍÁˆOy¸C_ó` Öµªõx~(!ÐlÏŽ8Hå³90šZØßzÎÛÚ¸°–_³Iœ¤©öô4B„®]_b®ÕÔ⚉›ËVØöÓ'¿Z…RƒãñVYgÆC™þ¼ËŽ^ûuZ·ïZ?‘—ëœì•³]5ù, Bï)2L\¦æ©ñ5~G¢€çB[¼^Þ›/íˆîóÖQDo“#Õm“[w]5²udr°:²q×5#;+öb<¯³u¼·¼ûu¤÷Pìïh˜ú3f„&-È=`Ÿë?èwWÇôfqsWËná³1G$Ò’3¦2ñb %»Þ8DΓðv÷¹ìïô{T@‚î5’È&Zë¹2gˆ‹£~ eoüÙÕ:.¿³¹Zrªöa/Ìo@×÷»ÅäÍÆLFcÝ»vU’®(oBŒIºÌ⥠ß?Ïi6BÜb2½@(£~ÂÅ/:²UÑ#ÞÎfn-£Dæý¶b_õl4ô"<šÉ­^©…,É–v+`X#[Üéd¹æLYF³À]Ž=×;<œÛ-^¼["o“¶g x‘VX݃Ó4Õºjö „!â˜M¹Dï »ù?¶fs°ˆƒ øÇΠGr¶ä˛ۿÜrâÄf^¨'Â3‹hbFùZÜÖ˜X4ÒWä¤oаŽo«šÖG·âS._˜¯…s…$iLJpĸ۰‘·šGr>i&cB-j7ìm¡ÄA2ò Á‹_â×ðdÜý:QŠá%¶nK]±+^wÌëHéêJelMéYÑþ„ÀÕŠ5-¥¸«ôø8ÕÖ_fØ>ú¾V¨½v¥»[¥yuìèÈÙQjöSSN ë²ËŸã!3…}J`JÒ㡦Çì-òŽÿ÷…ìŠá%¶ª‰"Ã^f#zY‘•ÎA]SsïcT‚Á4öCfÐŽdø Z íÝæûÙÕdéG2YåòŸÊ Hк¶Ôâ(‰¦ÓµÉž†mfí­õ©ÚZY˜ügH&bU6¿jkKl²o[YÁPÏxÎzçÏÎ_Ç‘`?“OûËç¿:“¿ÿ&ß–Èÿ$ÿxÆ=½ËÁ¿œwþC‹kñw9û½Ó”²óŸ™07Ey‹çïsöß¹ÿ÷9ìÜé•,=¨",`*8à)8à0‹p„Vp$Àb‹3™% KA2¡£@Žɤ–r°’å +@Qr,Èq ‡*9äÔ¬9äp%'¸ G(9dÈ‘Jr Èb%§‚œ²DÉé «A–*YrÈQJÎ9 äh%gƒ €,S²dÈ1JÖƒœ²\ɹ ç¬Pr>È Ç*¹ä"ã”\ ²äx%—€\ r‚’Ë@.Y©ä +ANT22r’’a ®’M '+¹ d3È*%£ Wƒ÷ƒÜ ä^€Ü¨äƒ ÷ܤä~ܬäà Ù¥ä£ ¹EÉÇA>â)ù$ȧ@¦”|ä3 5%ŸùH]ÉçA¾â+ù"È—@¦•|ä+ 3J¾ ò5Y%_ùH ä› ß¹UÉ·A¾²[ÉwA¾ÒPò}€4•üäG ¡’ƒü$RòSŸ´”üä {”üäW ±’_ƒü$Qò[ߤJ~ò¶’?‚ü dNÉ?üs¥r·³Ÿ LœÿPK½\C7ƒß."97com/microsoft/sqlserver/jdbc/SQLServerResource_de.classÄZwxÇußgRâ“DIìÔòTHH‹,ª"@w )Qq˜ÅíÜa…½ÝÓ€€âÄIœ¢t§'vâ¦Ç‰í$²ãPNAªÓ{⦅ةvÞ›™Ý=h:ú#üƒ¸{7óæÍ›W~ïÍ|ðcïÿ€eYÇá_n¶>lý÷MÖ‡¬ÿÙ`}lƒõq ^‡°a= 7"l@@„›nF¸a#­·!ÜŽ° a3„­Û¶#ì@؉° a7„½ûö#@¸ÁF8ˆPA¸á.„»îA8„paá^„ûŽ #E8†páÂý¯Gxá$ƒ!<Œð£!<Žð“O!¼¡Š0‚PCE¨#Œ!œB80Žð4„ „³“SÓÏ 4š3çÎ#\@xá9„‹Ï#| Â>á§!8³-A ´:s ó>B!@z/"D1B‚", ,"\FXBXFx áÓÞ„ðŸ‰ðf„ÏBøl„ÏAx Âç"|Âç#|ÂË_ˆðE_Œð%_Šðe_ŽðV„¯@øJ„¯Bøj„¯AøZ„¯Cøz„o@xÂÛ¾á›ÞðÍß‚ð­߆páÛ¾á;¾ Ỿá{¾áßðïBx7Â{~á‡~á„÷"¼áGÞð£W^EøÂ!ü8ÂO ü$ ÂO!ü4ÂÏ ü,ÂÏ!ü<Â~á~ á—~áW~ á×~á7~ á·~áw~á÷þáþáþáOþ áÏþá/þ á¯þáoþáïþá7À?m€&[n…A"‚$kÛóÏO¼à,8Ç|'蛚}A´’ÇÀºñq/ð’'ÁZwxèuÇá¡Á“ññ–/§o´>b}t£õ¯Ö¿µuàÐMý4bÛ¸ä Žï¹Óaì%^Œ®¸ –}.è¬\õ¯#";û-öøÇGí—Ž¿é(X·çs'DÐIæÀÚYL²'V®‘ÝÚ¸”óA¸L:‰· f–z´Å;ϳbÞ h“‘/Å‰è šÐ7ÍÝÅs#Ñ ;·,ÜZè§Ý@18Œ–…Ç®Ûô» ãmÒéÊ•H†¼DžÝ}òK¶ïñ"Ð õK8+èÌ;jîè—¡6çDN‹Œ1ãùb\¼§×¾þ!v&q¹G¡N¸ãSõË-Ñã86Mç&bŠf†pÈÁªŸ£ CêM(8ØÆH^¼ËÖæDô‰tÒ'm"¶+ŠK…V¼]+ifþK"Œ²CF6í³ã°µ±©Ï+wåá” ¶—&Ó¤ª.‰CÒ—›ÖѨ¦qÇ™½lH¬C’޾jëa™Íd˜4D‡Æ‰H¸ca¤V¡ ÂöÙÏ0‹¤ÒÔ•¸ÒiØðôX;’Ü"Ž^´àA:kc©QÑ&Ÿæu¤²]²°NM÷ñ—<éè{R¡¤1›F/óhp¢O—YêÕ¶5.QZ è`9eÅ5ò|ÖöÁëˆ Ûs=„¡Oqý¼ã§$Ü›y.I5\çD3œ6¦ ™[¹âëpØYz#ÃàÉ1›}e²ë±=¿òJÀ£‚Tiê‚ÜÒ¡Cd“âÐ!:—¾´Êôbß"›tbSHp¥hûÙ_ÂÍZ:ë\öºi— Q¸1û €g‰˜Ç/¶OPº<Ùñ)rú+WÈÎe0]væ|™"H±™«Ìœ#€(™L»³lq{LÎô ívE”eäMùŽª2¾î7ñ‚k³)Û °¶æóiCæ´ yl®øÅ Š!2IÖ¼Hš„(°¯Á¡—©@¢ Î„áˆ×!ûl6'Àzk–> Ÿ—ºôW®’µølBŒdbˆìI‘,Ó¾æ{ñéD+¯¬¼CH­Êcà…ì‘¥„\TÙìªC¶WÞNãz”ÑÚd(MZÕ-™,ÃrQŸ×¦l2< È—Ãg íuÒÈaÓ§]í¤<Ûêy½ZîcŽ'³Ö›dÈèJgó™Úô±ñéaÃAº^"QËé O^HîÂv¹»8ïÈ bG®2!„VŰõ뼄Š2,§ßr‚dœ2ü¼hP–Ÿ¥sË» ލ’°vIœá³¡›ÆUØo(H<á‹N¢üùHîgjW¿ ±* Ðd²†”5œïa‹¡I§ï,ˆ^èd~½ÿ«l¼: .>¸ÜÄ>g܇ÌÀVÈAˆ;~ÑWgy:ô]gÖó½d‰¨‰ÌÔ ÏßYr~Ž4,©i@¬ø£L‘–WY0Æ"18>+’9B¦ €ê³V@»EÎR†eF‹ÃŽ3ÜíðB,$¶o Oä¥ tr¢0‡†àì± N;ë“+×Õ‡b(9‹ŒkÁ…K—T6­<ŒqXßQ“¹.pL§4DÇÍ)¨H¥‚åTÜ¥¼üà•µ¥cŽFø¥ßÅVùVDÁ#%N@Ø…ð~°¬Wàjö˜˜óeœÍ0¡‰švxá΄œ¿éï`Õ´µ¬‘«e¤YtZs™0ÊýY^ÉO§Ò-f*Íé^í°$Tâµ—fœY_8®“8`=Eß›YœÏK`Ï4HD]ÆÖfD!þ¤z‡`¦S¢0*ÒRÕGËò™©¥K°©@::‰Ùf+v˜6²†‹Uè8¹ÈÕ‡Y,N–8çJöÍK‘ˆS?!/ÊôE€9¶u îØÚçX“$O_ÞÔÐ/™€;ÅÈžÏõXÐYö–áò’2$i—˜ORZ'öJg3¯O0’RêT»ÁÅX³×šà’jÑ—¿”ÕhÃþ¬D›èaolÍÅj;y¨#Áx7¤‡dA~˜hZ©v ( f×ÉÉ´ú‚SY_µ4¢j&i„‹`Ý_Ö9YTGã'}à¬9iØ„|¡vIU|2"¦r^Ò§d%e#ÞqÈÞÝöd‚IV½1O唺ðbY3Û¡˜‘¶úøM2?>Õb ÇÉÊyªÄNÃì° ¢Îõ%v_i-bTpËÕ+¬ó6)¦­¼B¶™è~bãÙ˜¯d³Ãð,É!3×[ÙŸr%ƒõ9”:"™- õ‡:ïæQ½¯Ì—h8?ÊSÜâN µ+°ª9ï2kŽÈZ«ÅVØ„´NeƒI?¶b*¤E—¬¤(#lÕ Ê$äÍ›M…´Â”ÑÄÔ`(zmDÎJ* ìÑf5”©³HÆÏdí r_]°Ü;x9ݦH7âˆæ4&’Öܨe)ì>ã,l¼e͉«ÖZÆgK™Âà㬯S »Y»ƒtÚÆiÜl׉ÚÚàÑá–`Ö»[š.¥½úåEÜ¥ ŸkLÈ#Ÿ<71чŒŠY•µfõµ¹T´˜¡z¼uR6ðx:âN–p§¢šãû .9YïD—:*çU²¡ÍÌ;*êt*ÙLã¥mFÒÙJŒ ³:KiÞhÞÓfT~, »3!y1ËpF’•”äªóõ‚¬çµ¦1ï4û™²¡šõQ+FÿÒh¤m\²äx³aVjNLuEîŸmö5\Œ©$?_—Õ%á<•ä*zªÕr#KfµÅ6ɪ´°›Fä1ÓNäµÛ²°-ÒzY¨ý¬kÕ‰‰fÒM²&¯s=Ì·cóý+R€Ž Iµ8$Më’Æõ‚îùS]Ù¬OÔk3Ãy%Ó•„ÎE][ÔçšÃU䩺r&¬Ñ†ñlÕtƒú³Õáf"RaŠò²”ñ®YKJ¿dHH–=M.]Ž©Oðuc/6úâ »ÁÓ΂3|®KÁš—h”·çW{Mâ8îj8`t¬˜®Í[LŸÔ]Õ­9÷‰Úø(XcÌû© \Œ_c2 Öœ5eYU] `#ã ¯RîɺÊK2áf'YVˆF¥W­2]KÌ:1¶×bÌ hÖá믯ɚñ¢4ÜY'˜/ó¦4.:FŠé²l¾y }–~Ù sÔH·mø¦ì S®Õ5ÄE3cÉBEûmÚn‹¨ßj6ËŽ´N#rI"ÏÅZÙø cöS6EwªgÚT@* EöqqÍrGž T7¶n,®\‰ª@ °s¹BC󀯙ðÍ,‹4°†ô5ŒúÎàaí(»o‡©žP W°N]‡ôÒcµµn|Êé¢%ËÕåèΗ®B{RYê{DI®!úÁ¢Wƒ2ëÙ¾»Å3a—BŠÜœtžBhn>—®d£ëd³ Ïú‚MÛÍS&î˜ `’åÛ¾2¶Ø’qe»šmmìz­ýZ¬7e¬ÉfǃÓüâ$7 è“ãŠe.ÞËà»áD}˜¤Yꑽ£:|¡°ÚøzsK±×r UäëQ><9€¯žJW]eã³§ÃÐ7²E9—í+¡âfHYQ4D›Ë“I|GëÃzIJòsn0œâ'*.eMÄ0Çl6<^%h¯Î¡è8fËA@YºhãîÍ×P¿k,VÌZ5¹Ù¸È‹1µ +ØJ¿|ðÕ´­VbkO%k÷ð~-yëOµhLtŠÀÒjH¦#ŸðFy<è¥IËÆ?©kåyûžß*œ*ú2]¿Ã®®œÉÏfït” úÚÃÒŸ'ä1W%ºrh‹E÷oGò̱Døêmƒ»FƒÖ韤/âìÉÒõh%^Gõ™sÉK§ê“õFu¦>zéLý¹fEÊmŒšœZ5B"­>PUêœSî§Íu¤, ¡p:È»°Ñ9÷äP­Å4™“MpoYC¾þù…ßBr6Ú|Bû½àQ…‘&£#`½u´ÿv¯¸»©ôM«è6g¾¾kÃ#ô—í˜U•¾òª5ùºhp±Y)B½ ÙK¨¬cÎ ×ÌE ¢"–£Ÿ7åW\©ô©ÍuøRÈ£Õ|å\9u#`jÍÎ…p½¸¿9pÉZûä7»kLȯy‹ ~…×UÁ·f¿¬bŽªpY3ÉnäuÜy¹Ô‚ÈW–kœG9?ØUî/wxÙÕ† Ûæý‘¼„fMv¹¯c:¤º‡e½²¢ ™¤&8k±4iU~Ú“•N ghž (†3‚[ŸÜv—?—zõ]U¼^5ÒºF$v”‡öÏ*úZªaÔ> ÷Ã\õIwI•sì³­ª~”'•¯…[N;B¦‡üì!¶'œ% ­~ä0ÇaŸ/>¨llYÕVüš>­£Ï±>Jÿÿ;}ÛLþÞpï{-x·ÅÿÖ[ÿaý§þy“þyý{¬×½KþŠÖe“±km$gÓâ«ÖºçÖÝðªµþ¹u[nh>·~ËMú_60‰pƒ&ÜÄ„›‰p£&Ü„DØ  ·2á6" &Ü΄MDØ”ÍÙÌ”-LÉ&meÊ6¦d³¶3eSnÒ”LÙÅ”›5e7Sö0åMÙË”}LÙ¨)û™r€)·jÊL±™r›¦dJ…)·kÊL¹‹)›4ån¦ÜÔ͚rˆ)‡™²ES†˜r/S¶jÊ}L9”mš2Ì”£LÙ®)ǘrœ);4åSîgÊNMy=S`Ê.M9É”™²[SbÊÃLÙ£)0åQ¦ìՔǘò8SöiÊLy’)û5å)¦¼)4¥Ê”¦Ü¡)5¦Œ2ÅÖ”:SƘrPSN1å4S*š2Δ§™r§¦œaÊSîÒ”³¹ïÖ”I¦L1åM™þßëq; ÀðN7“kÙ¶Û¾Ù¶•mÛZµ°–—mÛ-ÛØtÞÓû÷¹‚ A*¡Hi¤„!áHc%‰Dš(QH4ÒT‰Ab‘fJ4WD¤…’„$#-•$ VÒt¤•’d"­•,$i£ä ¹H[%ÉGÚ)H!Ò^)BŠ‘J RŠtTÊr¤“RŒB:+£‘1He,2验G& Ý”‰È$¤»2™‚ôP¦"ÓžÊtdÒK™‰ÌBz+³‘9He.2é«ÌG ý”…È"¤¿²Y‚ P–"ËÊrd2HY‰¬B+«‘5Èe-²ª¬G6 ÔÈ&d¸R‰lFF([­ÈH¥ Ù†„(Û‘H¨²©FÊ.¤ Sv#{pe/²‰Pö#Hå R‹D)‡ÃH´r9ŠÄ(ÇãH¬r9‰Ä)§ÓH¼r9‹$(çóH¢r¹ˆ$)—ËH²r¹Š¤(×ëHªr¹‰¤)·ÛHºr¹‹d(÷ûH¦òyˆd)ÇH¶òyŠä(ÏçH®R‡¼@ò”—È+$_y¼A ”·È;¤Py|@Š”È'¤XùŒ|AJ”¯È7¤TùŽü@Ê”ŸÈ/¤\ùüA*”¿H} PÔàL‚þPK½\C7Ô*Y¦*¸77com/microsoft/sqlserver/jdbc/SQLServerResource_es.class¬Zw˜ÕuŸc t’¨ ÄHÄ®$Š@Øò$V»Ë{+ íå¾™»oGš7ó4eµ+ pÁ½¥:Ué$!1Ä NÙT;½÷Þë÷Ù‰êäœ{ï´·oÆá´ï7sÏ=÷ôsî|ú‹¯|ʲ¬Ýð/—ZŸ³þûë³Öÿ¬°¾¸Âú_ Þ„° a9ÂE#¬@@„K.E¸ a%ÂåW \‰° a5„«Ö"\p Â:„õ6"\‹° á:„Í×#Ø[¶"Ü€p#ÂM7#lCØŽ°a'Â-»nEèCèGذa/Âm·#Üp'Â>„»îFØpá Â!„{îE¸aaaa¡†páÂý# <ˆ0Špa aaá!„:BaáÂq„#œDxáQ„7#¼á­S!„&‚ƒà"H„i„ ‚‡p á4‚ÐFB„„!FHR„Y„³sóçGxÂO"<…ðv„§žAxáïDx»žCxÂ{Þ‡ð~„ |áCFøÂG>†ð_‰ðU_ð5_‹ðq„¯Cøz„o@øF„oBøf„óß‚ð­߆ðíßðß…ð<Âw#|Â÷"¼€ð}ßð „^Bxá~á‡>‰ðÃ?‚ð Â"ü«ŸBøq„Ÿ@øI„ŸBX@øi„ŸAøY„ŸCøy„_@ø4Âg~á—~áW~á×~á7~á·~áw~á÷~áþáþáOþáÏþá/þá¯þáoþáïþáþqüÓ øg²e' $1Xk}tô”˜ý¾ZýãÍSÒI€uñA/ð’{ÀZ¶}Çq°–…®ë²–L†ò¥×lßÑ{1t|µ|¥õyë +­µþ ¬«z¾ºª#²õ)/˜¾çN„±—xa0¸r¬5ß^x!p=GÚ®´;ôÔñ^ìÇw?a¡-c{vá<­ ûÀº2§2*ƒV2ÖæQaûaÐò’Ô]´DÐ’«êSip:Ïc"ñfåä|‡Î¼•vM¼Nh †j%-seLB ½Ûz^I'lÞ9é…~Úôú›ÇB;–6?¤×¥- 9:£^L’h\Ç;a»ãËDÖeÜ ƒXŽÄ‡F÷îÞ½¬'‰ÿˆàTƉàå$bÇS„b+At"9«‘Éáq™,œ·sš¢Ï¦£Ä2š%ž#~‰Îx¿ßd‘M{Ù zþä=í…œÈÈ #bp#2N;0J¤«ß;.£˜4Ö0q7Ë?2…ý9-k愤Øôùì3¨þH¢Ð®ÚcM}*õšL` V ¹r6ôgi#; J"é£Wìa;2Šˆší ¦-ç˜#¢¼¡>•Diàˆœ÷bƒÃ¥ – ^‘#mÄ»Ð;]›ÕIe4?éµ¥;ž’5ïUoÄ©O4ˆ;’ŸTì);mm ´ ¡D`•!0$Gú¾tÁÚT¦ë#ª§"3½¶·EâÌÐÁ’HŠvfñÏ’¾É´²cé¤2p<Á"$C‰É‰óŸû3áxÓž#ÈìÑ%žØÄ(+x—ÝöˆD$b›8®"|V÷ã{Ø®7Õ§h;b0d-pǧ½@DóšU°B­5b %“ö4½âÛÙ2%"_”Ž IÐ"£‰ ûÙ.Èö~ÍÐõÝ ÍˆH8dçOÑá)§òÙÚÆî%çèYèÈxmΑŽ~…8ö‚V] WF`ÕJOÉ.µñ-Å¿,¢*kk s¤M†v¼‚-id Ö–[zÈätdív[mo&°’}wÒd‚·)b_w–´ĈÎÓs-°˜×‰EÁšŽV‰…I]¶<>Ò=Fz/°Õ– ™ôD4Ùmy­Ò½-ÌK´ÓÒ}iaIZU()»d`=PÝ£JÙå^FW‰»žr†TÐŽ xc­Õµõ)2¢€”ʉ,òØ%}íh)p˜H­syu.ãÁ0ô¥Ž ?%ÎbZEûu<éŠ<‡±Òæ’mT{{S/ s Û…—}•†(˜¹džiâùÞ96“0Ö‹ }Ä6ÅII±Zø±Ô‰‰7•Q2TÌyí´ÍÖ'ݘ-žê€C‹¸ÒAŽ¥,¼Ò–$ÄöÂyZ©Fr)Y£Î»yÂ’±´ÝdcÚV+V»Šñ( {¦úUùz»*êÞ\[]{®][” ¡s:_¿³9ýâIO%þ…sZ& *À²•e¿{.\ÏÆ˜½1†ƒ^‹,±Ñëãc…º m‘@)p(³¦·T%¥wàDÕDä,Zø”±m}âæ|BR¶í!rbÒk“£V\èK•2%Sœ7)mÚk¥Y¨¤râ{¥R§ãu†rÃ>,<•«n©˜õäÐDÿȇ¥*#7UɬLêÚP(.A,©Q9+}¢Äê§"ÌçÝýxéj½LÉH0ž–õÐ÷›$W°¼²i«ìŽÄ‰½ä”ÜòÚÅIE Ós;¤Ò$$ѵ½Äx©Š¾äÂýVv–­ºra¤M1+;¡¹e²•”!Xk)Ç ‚³a"Hì}é{SÉŸñµ~î}W4É`’y°ž+6‹ë/Ö´ ôØo'ᩜ 1t&ËõP”:ö1¶I]ζžO˜Ý"ÎõÅ2)ñ±}‡®²uu<@Án>«T’ÝPZ¼s¥º8îªÐíFZ$ѼfÝS¨¿NñÚ#MÞOôɇËÒ§\E%åEÁD§`ãã\àQÆH‘Qšç¯¢1™é,Ç_ʤ]ÎEÊ»/:EpÏœ§”$ʬ’Y´áL+÷)܉JÞŠ#‰Œ?¡Ò9ë.ÛÍHvû”]‹¢0Ú_T^”߇ ?Ò G9£Êyu.ÍÛ"ËõÒ6n,P­Ý8j–öª\ÎþPÏ ־ѮHÛÕÐ/!q]†æŠ:B²¸“§( “‡€–z¤#ÀÚSQ ?Q&6Ç„(µIÿE¡¾¹›ßîZ}uYN˜¦üŒÌ¯¼ôíå‹ER|(3™jÿ@¹]TÍêt¬§K¸¹!}X&Ḭ̂e¹eÉ埥òGçÆÞ–б¾LM—¸{¹Êm±ðb¸˜ O”ép’dKMψÒMÊ)/Õæ:”§óp;NÊ9ÝRä«Y)Ô»^Ô»….Ëí`BD(NzPwÞc½Bw–!׳uê0š3b¤?¡÷ŸA¹aón©š J1·j]Qæ‹:…‘/L µód»<"ÔÛçÕJ¾¹C@oq±*b¯Õ*‘(ŸPÈÆJf|T£Ú)Fõ÷µncVU”<ÅÏ©•#7§ð¬Ž6ö#®†ý3©GåþcBTèJžøÔEP¨:ΦÖ5SºrRØ U+Üm›WsEyBÅýÒüaW­Žê„½Õ¼·µ×(¢È„\dµä¶ò¬%'Ô˨ÉETP^ * ƒX÷pùEÍQù™)Äʽ¶É¶Æ"¨|õíé0jçIº£‡X­¯”Š×»“T‘±'‡šýòtP™LR ÕÍA·6ÖgûéÝçë‡í¬ ©¸2ï°9ò{¡ÚcÉ̾¹›üÐÀèh#i'Ù&^ï&=•Ia7¦RÇá`3!#ò9R‚ òȬ;ºcb£6Zš,JµŽZb +ÒŽ&R7Wºm› ‡ˆ÷D> fç›+®qyØÙu Ó›”ê?)9:Âï52¬_ž“ëÈ—AüµáÙØP&áþ³¡Z–Y•ÊVØ5øv=¾ðQÛêSt]ÁÙKíÂù¥)b3Sxûðâ<é,Í· d†-¥ü™XÐRÞùð…zÙlþ§nXœÈkz‘šg™l¥6Í…W¦I)D­Ë¶V«Q®É(ê X}ÚΤ’"'‘­\ˆŸá[1ŠÄ²Ž$«³""»zì5š•’ È¢P»{ß9ÇOcoV°+› § f^³ûÚ"H« ¬J5D¹ëªäM=ÖŽ3»ÅøåurŸ_dV7Í.…ËIÄQÍ¥3¯s`ìµù˜Tã·0Yžz°v²A¬÷w=&Ñ”&F( ·3KÖ =GÑ*IfÈ­©•ñž$ŠÀ²«gHžÊÓ»Ð_AùKJ¾‡}O†[z\€.Š¿Mr€Xj/RûéÑ@eà—õ¥äöÄUÞi.5éÓ=Î ÁᨈNS§#)%I=A­ôz¤(j^©Â¯¸{d>XL§)Ø+ ,mÒæ#¬E‹uw¤.æ€Oì¹óºçb¯|¤¡Â:f –¾•Ñf9Ï2ËnȃRÙW’š®°ÃR0Ò}h¾÷ˆ{öeûºâ¤žÛ±=~lÒ–öȘú×T`EgÇ~JT/âá”nQLë3z¬_5Ô «×³ecˆ%û—*ôJO›xåqYùR^5 e–qÈû±^Lüno4Fw¨ï€DÇÏC—),Íä[SÙŧº€Î=¾˜U¿ÐÊ+vp^sG —N¹øÁjÓÆU¼GUC×yõ:ù¦æš—¼ìÂ'ë2ÅIö%À3ÿ?R6mìëp¥Ý¡Ò6RC_/e…ˆå’¨H™_•¤®Û}&Í~]â0HÌm1ɶ¸?¸gê³Ëâj® ëÏ誻—·Ë?¡ÛC5gÛsˆZ8ôÇgüX‰§ÿ”ÛtúI\ùªæ›’TlR_Ö²þúùÖ7{6˜òݸµÇú¬õ9˲¨KáÏsé¯eô÷ç­/Ðÿÿ~­¦þ½hç'-xÑâÿ–[ÿaý§y¼Ê<^þ’õ¦O¨§hýW¶ÛÖ ‰Ug_µ–\vÑ«Öò“ËÖ\Ô8¹|ÍÅ ú¿V0€\d€K¸”€‹ p+ Xa€Ë¸‚4À• ¬"`U¶f5#kÉ]ÅÈZF²UW3r #—d#ë¹Ô ÙÈÈe¹–‘MŒ¬4ÈuŒlfärƒ\ψÍÈÙÂÈVF®4È ŒÜÈÈ*ƒÜÄÈÍŒ¬6È6F¶3²Æ ;ÙÉÈU¹…‘]Œ¬5È­Œô1rµAúÙÍÈ5ÙÃÈ^FÖä6Fngd½Aî`äNF6d#w1²Ñ w3²Ÿ‘k r€‘ƒŒl2È!Fîaä:ƒÜËÈ}Œl6È#ƒŒ\o!F†± Rcä0#[ r„‘ûÙjF`äƒ<ÈÈ(#7äh.Û 2ÆÈ8#7d‚‘‡Ùf:# F¶d’‘cŒì0ÈqFN0²Ó 3r’‘[ ò#2²Ë ofä-ŒÜj·22ÅHŸAcD0Òo&##» â2"ÙciFZŒì5È ##·ä#§¹Ý >#mFî0HÀHÈÈé0r†‘}‰‰¹Ë #)#wd–‘³Œì7È#óŒ0È9Fgä AÞÆÈŒ2È“Œ<ÅÈ=y;#O3r¯AžaäYFî3È;y'#y#ïfdÐ Ï1òF† ò^FÞÇȰAÞÏÈ©䃌|ˆ‘Ãù0#aäˆA>ú-ÖeRBFQÆÕ¡`ñìÄîŽXØbwawwwcw±çŽßß³‚ƒ” fI)R†xKÊ‘ ÄGâ@*‹¤ ©F¬’¤ñ•Ô!õˆŸ¤q"þ’F¤ 4#-H ¤iCl’v¤1$H$éFz`I/Ò‡„Hú‘$T2ˆ¸0É2Œ„KFQ$B2†Œ#‘’ d‰’L!ÓH´d™Eb$sÈ<+Y@»d YFâ$+È*/YC֑ɲ‰$J¶m$I²ƒì"É’=dI‘ ‡Hªä9FÒ$'È)’.9CΑ Ér‰dJ®k$Krƒ¸‘lÉ-r‡äHî‘$Wòˆ;±ÓœÌìîÝí=<@V>ùû,>üw;;;3;óïì}ì3þ¨eY‡á_/¶>iýÏEÖ'¬Ïl±þw X€ð&„M›.@¸a "\„p1Â%[.E¸ ár„mÛv ìDØ…p•W!ìF؃°áj„}× ìG8€`#\‹pá:„ën@¸aaaá&„›!Ü‚0Œ0‚pá­·!ÜŽpÂw!Üðf„{îE¸á~„Dxaa ¡†0Ž0páÂÓ <ŠPG8Ž0…00ƒðB¡‰0‹pá$Â)„ÇN#¼á „'žBxaá­Â<‚‹à!„BaÁG8ƒp!@è „BáBŒ ¤Â"Ây„%„e„gžEø„ç>ámŸ‡ðùoGø„/DxÂ!|1— ¼áK¾ áËÞ…ð_‰ðU_ð<Â× |-Â×!|=Â7 |#Â7!|3· |+·!|;Âw ¼€ðß…ðÝ߃ð½߇ðý/"¬ ¼á=ïEø„÷!ü Âû>€ðÂ!¼ŒðÃ?‚ðA„!ü(‡>‚ðc¯ |áÇ~á'^EXEø)„ŸFø„ŸEø9„ŸGøÂ/ ü"Â/!ü2¯ ü*¯!ü:Âo ü&Âo!ü6Âï ü.Âï!ü> ü!Â!ü1Ÿ ü)Ÿ!ü9Â_ ü%Â_!ü5Âß ü-ÂÇþáïþáþi üóøŠh7 S¦ X»žx¢~ÆYtF'lLÏŸnz/XÞç‡~úX›‡N‚µ¹y¬KÚ"­C¯ê?ïs9|«õ)ëÓ[­³þ¬}_ÝÖ‹‘ØÆœ.:ïÍD‰ŸúQ8zb ¬›ë>ÿ´=awõ3ûÙÃÏÙáÀ€HR»ë$¶(†Áº¼Sa;]ë`ݱƒ(lg"‹×¶³1—…gÃè|8å¤þ¢˜]îÒÂ÷×…Ò/;$°%óH?$C† ÛÍÃbáFíÐFxµ(È:¡{S>–´v#R ½³ó@%çÖÚ:Ý@¤¢!’n&b2i>V¿õðáÃ`´†xuEÂÒ ôKl‹Ùñf¡‰X}1Ã6MŸˆx‘íúó ‹üÔ^}w ›äÚM~Û,ߎ2;ɺ«+±O¯“:{yY„t£8žz󤈚 ¬Ñ‹ ì]X7ö[„¶»àÄmÒÖ!è?ˆR6öŽÆ\) ùZÁj 3„´r‘FY®®ØNæfdÇÜ´JÇ.íàØ«+)½Õqgu…gÚÓ˜Kã,tbå„§ûOhNgÎÕcÝç¥(<—‰xyÖïo:K9ŠÉ«+ãÛ~‡ ’úöê vÀ³ËÈ+‚¤ˆ¥®OÓÑømz|Í ]£©WÞU3:>š’B±ã''uh­äe§“ÓPŠt^¨—Ù­ “[É#ýihÂŽs¤Ûc£$®ßòY¸]ïÿ€•p(¨Èû‡*ƒE«E{š¶‘ Ëg‡r ÓÁ ä=û*O”~¤ö|úÉRf뜌ԞÖ1_¨œÉµBײ:^­÷§G³û­åYö÷q‘:ž“:dÀŠw|õ–/d•–±!Ô†LdØ99{RÒÉÎ8 #DqÕ=G™R e²fep?ÂØÇ_ÊO»º“]èÕ×óoßtµ•=S®ÿd@¯-ÛNÎz¸½1G7 RÚ\¹Дg„Ü3\è!ñÇ’“Tê˜ÚvS¤3Xƒu5œ“ 5¯2¦¥À?Ñeuçy?ÝÚoòµEŒùì™Hs·³>Ä6©öN·NØ–G~“‚² Ì™Ÿ2ž\:-"É*éÀk𘹊õ2è`ñú‘DÔ>Q4£”§„ÝiÛHZ®a!«jŸZF1F©':¯˜ËZû ü6Y‹ŠZÆÇMµÌN–¤cb:œ¤Óo¬ÄÜÁTŸJ+Çâ­TöåþP¢`V>:Š…Ç|o¶} á¼—e4ˆqÁ-O ¿7šÁ͌ؗ™©oT#,¶a*¥¨çÓ®–—òîiä†ë¶z%oçf&g,FËd¨`­/7.œwL„"æ¦eµ.°î>®uaž.Ú«+´7‹üس"ŽYz[FPyzØ[U³z|Øn’-³‡ûëý¸´MÂDE½7´®Ê²ûXÞ¡­§Ï%÷MŠ ·V§h}l´ð£"uÆ©œêÊ5"ëJ¨â|@ÛÙÛŽª,Å·ï,ù¶dÈYR!³î€´d|Rå›XêRx¹z6š%òOJÛ`]CΈ|FÄU÷¬ÌæÄ˜˜°U±)‰"N½Ǽ«0etÊwób¼›ƒVåáB#íŠ'«üÁë=0—”È)ÊžOþ)Š•S‰@íB(ª:Òv™©'þë‡| a­•*`Õää`Ý®CœÞSÇf5QÙ ©®µ¦UÊW·Çˆøã2M, 7“íŠz5î ê&–Hz&‹®³èpþ• ZŒˆ"GóÄT|^KRî¿Dç6¢œÜ |áQŽ;É‘ÃgÍ™së¬åò˜¾èľ#‹‰ÑS¹Ëhäà ~õ`Oƒ¥Ò_)«,óœÕ›=¹šzl¹Ñu9zÁï'³zé ÷@À¾Z}QöoûŒý½3ÔFëõfÚIóy&^ï<”ßû9›|B4Ìå”6CÃ|²¶ç‡c|7AGßjúmNÔ'j³†Eœ,bÙ1´=‡ª6]ñçáC꩎§³Q–“ŠÇGÍM1Q=¨’LQnµkÒxõerÊã£æiUž®˜VÒ6˜¡\MÍœÿdm’¼µ9´_~bâ.ú1O/7Ê#TaT ÑM?é)/¸w0Äë¯ôwEÂÓÚWKþñú3PðK3³¾¥ø\‚þ¦‚¯•CcûV#µì„ð}JÑíyT, {oÙ Y{ îô¾ßç€Ñäg‰Ù©¹cSÑÙ‰ñ¹G'N7y9å+SÓ½7¸ÓííêSµ™ SÑ–í¨åôÁÈh½ý|b”Yº ºì®£½K1ÓÖ·{勈ÍP¸ÓòOùtHÉÒñ1°ÞÕsi\9õ Ûàb“<Æ¥Z]ßÈÊ› úŠnÝ9K§1A…Qr(óV5wvœ˜;H•ÔëOÙÆ²UéÆ'6Ú ž(㥇Œê¦–·~Kˆ<Í¡>òÞ²:5òN„zQÈp§ÇVuD~°·dœ›S›oªÙ±äêIµüª3³ÿ¨Î ‘þÐ'é{Â|ˆ³u9$±§OÌòä“Süܼ8k&æYS%µ$ ĨÉJÞ”þZQW°>^7’šòS7“ŸÃÍ~\5{Â=E} å#Ö~r(•÷”ë{¿Äl —X3â¯7»î,‹xhØ®óçAž-iª¶àoñ²Ð”pˆÇO̤²~–·ñ±É›izåuÃcËJiªÊ:e,Gê"3¦Ñ”:± HŒ±ÑúÀºDΛÏñ¼iñ7Èä¯Û抿ú‚Áz]JSœ÷s=_ªtäÖÑ•,¿åÌÕÉ#ŽE¨ºg(ùKjß‘{JÚw£P=¢_}A~w)?ËÔÏä)Tséwd·üLF:¾GIÔJG’sœñæÝ2[ñí¬$²s-rÿ>ù 7{r„oñógc¾`±>a}Ò²,:bñwàôkýþ”õiúïÐ_Ûé_ /¸éƒ|Àâÿm¶þÓú/ýx›~¼ù%ëMï—OÑúï|0v¬-r¶ÅÚtzÓ¯X›OoÚqAóôæ6é¿ØÂp.bàb.ÔÀ% l%`‹.eà2P—3°€mù˜íŒì`$´“‘]Œä£®`äJF.ÒÈUŒìfäbìad/#—häjFö1²U#×0²Ÿ‘K5r€›‘Ë4r-#¹\#×1r=#Û4r#72²]#Œ 2²C#CŒÜÄÈNÜÌÈ!FviäF†¹B##ŒfäJaäVF®ÒÈmŒÜÎÈnÜÁÈŒìÑÈ]ŒÜÍÈ^¼™‘{¹Z#÷2r#û4r?#0rFdä!Fökd”‘1Fh¤ÆÈ8#¶F&9Êȵ9ÆÈÃŒÔÈ$#0rFe¤ÎÈõ9ÎÈ#7hdš‘FnÔÈcŒ4ЇìŽYF5r‚‘“Œ iä#3r“FN3òFnÖÈŒ<ÉÈ!<ÅÈӌܢ‘9FÞÊȰFFæшˈÇÈaFZŒÑHûÿZ¬Ï­Ã—dÏ2²WúÌìí=¬†YfÉ^QŠˆ’²edËž)\Aç=½Ÿ+x(¤«Ä Ý”X$é®Ä# H%IBz*ÉH ÒKIEÒÞJ:’ôQ2‘ÅH_e ²é§,C–#ý•,$ ä ¹H°²Y‰„(«ÕÈ@e ²¤ä!ùÈ`e²¢l@6"¡Ê&d32T)@ ‘aÊd+2\Ù†lGF(EÈd¤RŒìDF)»ÝÈhe²£ìCö#c•ÈAdœr9ŒŒWJ#H˜r)E&(eÈ1$\)G*€r9LT*‘“È$åR…LVN#g)J5RƒLUÎ"µÈ4år‰P. ‘éÊ%ä22C¹‚Ô!3•«È5d–r©Gf+7›Èår™«ÜAî"ó”{È}d¾Ò€<@(‘GH¤òiD*O§È"åò‰R^ /‘håò‰Qš7H¬òy‡Ä)ï‘H¼òù„$(Ÿ‘/H¢òù†$)ß‘f$YùüDR”ä’ªüFZ‘4åÒ†¤+íÈ_$Cù‡üªƒºtÆ$¨PK½\C7ÓøÕ 77com/microsoft/sqlserver/jdbc/SQLServerResource_it.class¼Zwœ÷uŸgx’ H ¨'!j€„îöX±Üv’íóÜîo÷~bvf™rp¨¸ÈEî]n)NœâtY)NœÈ)Juzwzïíó±;ÕÉ{¿23»·wØq>Ñbï;óÞïýÞïõß|æKŸú´ã8»áŸ.w>ïüçeÎçœÿZå|i•óß ¼ aÂJ„K.EX…€—!\ŽpÂj„+®B¸a ÂZ„u× ¬G¸á:„ 6!\°a  7"lEp¶!lG¸ áf„[nEBØ0ŒpÂí;î@Ø…0‚°aÂ^„;ö!Ü…p7Â=÷"܇°áÂA„û@8„ð Â(ÂB aaá0„£e„‡Ž!TŽ#L"L!L#<ŒPE¨!ÔN œD8…ðÂi„GCx9Â+^‰0ƒð*a¡ÐD-„6‚Dxá ‚ÐAB„.ÂY„!FHR„y„sç. <ð$ÂSO#¼á5¯ExÂ3¯GxÂÞ„ð,›Þ‚ðV„·!¼áïDx»Þƒð^„÷!¼á9„ |áCFøÂ× |-Â×!|=ÂG¾á>†ðMߌð-ߊðq„oCøv„ï@øN„ïBøn„ïAxá/ |/Â÷!|? |á~áS?Œð#/"|áG~ áÇ~á%„ŸDø)„ŸFø„ŸEø9„Ï ü<Â/ ü"Â/!ü2¯ ü*¯!ü:Âo ü&Âo!ü6Âg~áw~á÷þáþáþáOþ áÏþá/þ á¯þáoþáïWÁ?¬‚$[n„A"‚$gýcU÷æ½ß Ú#S³‹FrœKÊ@&€³bÇðIpV–¦状HJéu;†ãÁ†¯ÈW;_p¾¸Úùgç_À¹fà«kú1b[‘Á¼çËætËD†A9hŠóà W††dД á6¥Û¥‡è¡pŸØý”„ûÒÇ]EîçêŒIEídœ­ÏõÓ ='.\ðÑxDsMu& Îá¹`ÒK伨/tiÏÛ˾›Ènè †Š’¨bRa7dšðr™4°È ¢Y ý´húÛ-=ÉÜý0zVd£XîFØéú"Uwà å¸öpeïîÝ»ÁY ]D’à8ñ”"á5"ŽC·>^c†¹·Ë¥¥cÍ‹ˆ_mŠ8‘§uÖóÂ%2 —˜»5ý/â†.ýŒÕkqª˜ËyÖÏõ¼É8ívÃ(MMqR¿ Î].yaŸ†ÎKHžï6#RpDL×Ug‚PÓÙí‚óÐ$-š…­F,|’JÞµWx—K ! ,%/ÉKÑ*ÎÉ4f±7Ug’( ^&t¾Ðñª] WÛW³™ÝÙTD uÙÍ©”¬y=ÿ Ó„4îûž«žÒ‹kÌ‹%/hÐÑgKÅ<ÎùzAUâiëȸã%9ÚGBçÞ±¦}ŽÎ™¬8Œø\}·å§lFñzÝÜòã®hÈ–l0W·²ÄWDÊJwº=´^’¤ž¯6þÄž§H¨-Õ²@*ÄDМj‘…E Z¥½°ðž+;$à¼T~FY×¾7F™Ï[3&®b_JjÖCÁ¹ùáT0ð+,“~w4¦e‚%™l7M¦‰u‡â »/¹ìÌ,BW?”¡"X~Ia/«É0©Š6m"Nópé•ÀÙ[.r´ƒÍ/R¯G| $>)cH³$öÛèÔ ŒÇE‹˜¹*m“úȵX’q“_—–-hBžÓ$û0´Æ¶×Wg”³7T ŠK~³N7-™û_›)r, }á'=?%YÎ ±ïFR$/}4†³°Ä# ¬ÿÎjºÐªÒ}éYÎt±œ•äwi"}I6H/Æ”J4ÛmJÁÜmy~,táÅD”,÷ÎËNÚa+͘}ƒòöÁÅÒ9°f¤ïiG¾:­ÙQGLÚÈM§É,?GÉdÚ™eC¹¥œÑªäL¶501¯É¨90ªyƒÊ:J"YŸçò°q&#ÛFd~ $-Èê5Έ¤FÙ™dÎwßÍðŒAVld3³ëa8&ÛdcµZœçËÇBæÔˆd’„íÈkIʵ 3é¤#6i|¨Aa½ ²":!U’55J…UI?æê¨£Ò=gœºÛÙq¶ë"„—¯ÑI{ó¢Ê€ì«Y\ÜЩµÝnè“‹=Ÿ†:¹ÿõÚTîÆg}}JGC¿éÑz2YçÉBEeÃ5³O”+R½G‹P$H¼@¥­¢Ê ºË=‘[(ù8…ÄDÍ£Û®X$…µw ëjÏœ®®fG£È[°Ça²J¦‘©Åm]Û[Q÷¦Mª8‡LÁIaYºž»'?ø*iI–s”t蓇è9xÑPá‰`hN½a2ç‡T%OŽöÖ0ç9ðRj #å´'´ýy­d¤µÇ¢óì cÅü¡í¤¥|&÷!pŽöy®ˆc v„T}x‰7Љ܉("Qöçå%ð’qbѬ‡Θò[ÖJVϘe>Ÿ'Jº?Q'lœÙy&¶Íf›ã‘œ‰l-Ô½Y_§"¸IƒsO èwL4";ôfUbQ”æØ®˜“ñå¿Æ‰Úbï!¬Ie'&º‘¤)§æHU°9{ ýǰ±Õm`ÒÐpyÉó[tV³¶óÍnž¤ç15clK1ﵸ¡µÕBS?!W±Ê»QG¢b¸äg,³­zÓö¡I’Ƥʰ#–è3ù6–$S>Ñe9gÙ=v ZØë<°+ -·äö™2äT«J}6‘ßÝ[Ô1!y_@Å „®}I¥$‡¯LHé"1û‰m€$‰x;¤†Û¸Ò³Äø€Éÿ9‹‹Ð›V»‡¾W)¥4ŠHºjxœ;–RÊœçê^²ÍŽª„ÞL'“11”i‘æÂ‰«‘Fq!@Ä܃irâ-ù]ÎæJœë4RFŸC•bŠR¹K•â=!òb¬Ù5Õ±‹qÁ¦b=2©yä®iÏ\¥'ÃOøRméÆƒë+æAS+Ù+ªVÅàÜY)†Y£Ï¬EVžÛ¯u]ƒfÇt„J܈»o z7†©®ÕA·­Ÿddâ™ÝžÕ ›!=üw^˜oè´X–¯-n¿¦œÝo¥sŽÌ_Yµ;È ó<ø°íìÉ—La¿»Ðyˬˆ¥Ÿº‘_« ¿Ã‚zùqÙDr{…­ YUcßb¹<΋|te»O±0¥¦î3&Ì ›¾ô‚û¢Í-æu‹25J=ç»”_³¨Zëâ¼îá(À‚óX1ˆ˜ßº¤È#­§*¤b˜±P'S—ÝP·Ó“:@g/™z#[ž”™FÏe=*èºgEóÖ\§Â‚_7Ó©‰ |ºtÜëv©-'£äA^—b£Y©£Ÿºôb‘mq%½ª‘~SÁ(«¸2qžT¯úðÓ$LÈU««'WP>¦Õ„’N;•ªÊÉ Ùʰ)¸¯÷¥hR¬9ÉÇÎM•b±Ù¢Êþ£›Òyâï©] gƒIe»ygûâ]O"ãŒn«Àí•Bu'5ŸEMÙ»ÊìyÉT£Z/hƒ3^áÞ›{}kOg¬ReXè‘uëLq<±²§c T7ƒ³—r\!šDö÷TÔR²æC›’ žW®O¥ÞruË’C;ösõ„1¶“B;siµT Ý«ßK5Î< ,VžC•¡ÕÊ€^"´Õ‘ô"9ý­KÑçèøP÷ΈѨ²‘ÇÓªäÍ©¨D¥‚®L-gí…Ý„Š9<¤NTÿäEí°£ª+ê‚H}–KÍ:>kË2ƒõñд3h>…zÎ.]‰gãç¦Îpža |m(íÔøÐN ÷šü¤Ã\%ºŠàI[«ÄåS;SÛ(ú<)­/g3»ba˜'äúxMߨÉO¢0 )¦ùz¨ßí2z‘±…jmTéÁy°g9`õ¢Ü6RÊöi/ ¼Åõq¿±Ÿ{i´R©%Ä®1ú®1è$)ÇTÑ48$Mó|–bcSc<ÝV¾[È䵉ÊD©^èvt=Ê'Æ2Ë4ºwÒ½Y=,‘ø‰xd´h뇊©«A/Dv`RhÜT܉”â-4gªëàzŒÂð´×½”çi¶¢7dC.n¸¸ö:³\l ÷!oÞDsíT£÷ÊMî(¹ém‡¾i‚Vry¬&°²x_Ø–%[Eô^¯\™1¯”ÊãàL,Ïúµá¹øâ|ÉJs^TSÉè<)žø0‡yGï1yÔXX>­nòK ÏÁ ` M±v—bÍ©gÖãk›}_.sªLš†J§hð mu´§"™Ðoå‚íå[R¦b<ó”»Ô¤/TöâØ`“5QîlÚj‘Ļߎ֪ñ¬É/ê•ô˯ޓQ4—í\`Ÿåñ>ànÑ §ÒÕ9/"C:¶|R0Í8•‹«ï–æsGø ö~4¿ªIÒÝlv¿Ùß8Jˆ-¨§X8íŸã_¶¨<ÔPû×µ±ÅÑPbƒ’÷6txag}±°HÈÑ —ϨâÓ™ÍïRe¿ #[g­ ²æRÈØÀèò6@ýŸµ5kg*œè’a6 ÒÙ´…a\Zžq/ÍzeM¶VŽò…ü…ÎÓTL&Ãéð:"öšT:wøÎ0K_yHÒä7Yâx8øÊØÜ4Î-Ä$¡Êóì!®°ÏêÛ®bL'yºaè÷‡ú–dN=Mâ–ž·¦QCTù0:P•-Ûœ»ùy­j§ä–ý%ÁaPu/\Û÷»Š™(k Í7¸‰ßœ1×Mt³°8Q‘+g_Õ™Ñ1 ^ó)AÂû¸S33k«o›Ê=ux©Z…DÞ1L%YC]TÓ_zñX͈w^ôÒ³tÓÄUÿ7ŸöÒ¸ÀØ\›EDÓHØ›¤Ç)ñm^P×0ÂmûÒ-ŽòoJìä¨7ÊžiÏö³ÉÆ1±@•Ñs'õ .¾)õú_.ÚMß_œ]ïI{Á——NÕ‰ú‰êäÌ‘‰É‰êh}b|æØÄéí%crªï逹2%ˆ2©¹­Ä¡¦l3ûÒ3eÚ«¨aNDró]W^!ÑSßžÐ.OÉd.L“ñ1pžî¹(‹MÙU¼Éêíüú8QRâªz[¶ç 1§g\Ks° Ÿ§‹ö‹;,f–¥lo*ñL—óÁÜ…æSö=KNÙùEr å!v¡Îp³%©é)}§)©ÞwOÑTTÝ2è½Þè’ß.ëÚù¸ -Óñ ®3‹O÷âù§Uö‚ØDgê&©^7„}Wă»DkÂõ4I.~GÙóìQfeó¦žôÌélÉŸmQÅlZÆ%tºa9å±Ï÷¢3Ô¶2¡Ç|½ßØ(§z:’£mæÊ¹cGæë 1UÁe“Š‹ªcÝ I [ɨOÒ6t?ÅþwbÔvKæô$ˆ§Mã6å•­žŠf¹N—Ρ-‰²˜£‹ôÐ|‚l´ö˜9…˜©u #åIþ×|› û,¹¸ÏŠc¿Jµ'9dsÒ|»e"-8Ÿ-ú;IÈ›±tQYÜâò@À-N`ÜÉf«ëE×è;j¢Á_gÔB¾’ÝŠ· ¢aýQVñ]ýQ)UËåñàÌD®nG}çç Ô`ï6a_y-¯¯°ó±-4¥Þ ·»jLïÚη·QÓ5+"]H–M°Ü¦Á¹B coðŸú×zoOCÅaƒÂ ‡\+ÒÇzîPû–¹€Ö·_";maÌÁV¨y!0$ÊÉžRIVo/'Ù$3׌•xàž¬°€½qÝC•üHG6¢0[ÉH|Ö×”#7g#¤¤ì‹AUîÍHÔ©oVù˜FøzÖ>KùfÚÙã|Îù¼ã8Ô‹ð‡¯ôkýþ‚óEúÿ¿Ò_ké_ /¹í“|ÂáÿV:ÿæü»y¼Æ<^ù‚ó²çÕStþÃcÇY¥ o͹§W\ò¢³òôŠu—ÔN¯\wiþo€U —à2.'àR\ÁÀjVàJ®" p5kXciÖ2²ŽKt #ë±T×2r#—d#¹Ü ›¹ž‘+ ²™‘-Œ¬6È ŒÜÈÈ•ÙʈËÈUÙÆÈvF®6ÈMŒÜÌȃÜÂÈ­Œ¬5È#;YgaFncäƒÜÎÈNFÖäFv1r­AFÙÍÈuÙÃÈ^F6äNFö1²Ñ w1r7#› r#÷2r½Aîcd?#› r€‘ƒŒl1ÈýŒ<ÀÈ 9ÄȃŒÜhQFÆÙj#㌸™`ä0#Û r„‘£Œl7H™‘‡¹É Ç©0r³AŽg:¼Å “ŒL1r«A¦y˜‘!ƒT©1²Ã uFN02l“Œœbä6ƒ<ÂÈiFn7È£Œ<ÆÈNƒ¼œ‘W0r‡A^ÉÈ #» ò*FÀÈCù #bä˜A>ÌÈGùŸë*+  è×£tJwÊj(鮡CI•¤»;vÀy‡÷{WpÔj¤ Wj‘:ä£R|C"”¤‰Tšf$JiAZ‘h¥ iG‚JÒ‰|Rºnä³Òƒô"1JÒÄ*H‰S‘!$^FFeC•qdIR&‘)$YùŽü@R”idIUf‘9$M™Gtå'ò ù¢üF‘ e YF2•dÉRþ kH¶òù‡ä(ëÈ’«l"ÿ‘D8pá#„S#œFèFèA8ƒp¡á;çúúÎ#\@¸ˆp á„ËŸ"\Aø á*ÂÂ5„ë7n" "ü,ÂÏ!ü<Â/ ü"Â/!ü2¯ ü*¯!|á×~á7~ á·~áw~á÷þáþáþáOþ áÏþá/þ á¯þáoþAGBH $†FFþáþq üÓøgòeŸŠ(¡H¤Yo½Uò¶\/çåPM^ÙÆ·_ä%n}9 DV€4iÑâu M.Tý HwÔ(‘BûÕ{-Îþ2¾ì Š×§J?~8UúWéß@š™õÑié4bë­ „êå`À_®†‘€*ù•­ å Ýh¾Ñ§ÇOé—ôÆ]zc£ï×ãW=ï.}Ï£Çú‡·ŸH쾪ǺõØ!}[¤»mV%J¨&² ¤£®è±9ߘ魊†6‡Ô-¡R9¨W*êhÝKôÆ6!v§ÿHoìÔc}‰c-&“Ö¡ÏÚ’ßw0™ËL4ŧքßRü…j0Z28å%šº\o÷œm9wtÒã­zì´Û®Çnê±#z|Ÿ`¶€×àSkë‚JDñ*á:5VŠÃo”<µtéRÞ­\YáÑÏéñó†eÍm‰Á£Ãçöª%úZ;zlíý7G.œÐã—õÆëzcÿõ{ˆ›§BÑêÍÃ\=C×>=Ô&^Šëñ–ÄàŽ‘Ó1â'¾î KÇK GëêT-¢ø ë-L»’ì`kÊŠ¦7v“’ÖêõmÄvYDolÖψt¹ýBÇ„šM¹Í3Ã[R –q@ªp ޵šæˆï$£t¥°úzœ8%ßÿxøÓÃôðhg³;¨Ç›…À›ö Ýë­ŠhÑO¶Wš’¸Î-Ña÷³Ù¤O\(¹ð;QEk¨ Ô*þ²(ÅÇÂé{ôƳ¼!ñAa³õøI=~Z˜ªËÍašÉ¡Pù”`Pñƒô˜“E¢½“ö4ù©mdçËäʵp­ñm¢EG4E®µB‰D^eyÄ„÷èCvëm§è¯bz¬'Ùº+ÑwØb{Ü¢“u¶ìúDHIßЯô›þbí-|[,Ñw|ôð‡@zj™ù”áó½UušBÚG5¥(ä/«.„d­ÁXHíìkl½Ý´Oær†/“·· ‡ohbÅâMü5OvÑcí#§[ô-¹Å Ón™)j9/ ×ú–³ÞBáÒ.Ü$k²/¢h–ÎMÉÎ]‰s]? Ê>Ʊ¯l­£¬­ø‹Ëжú”:N×åšêSÂá@¨Æ«È~EÉ—Uiñ³‡g×éáŽCŸÓc½´³¤òèq¡!yèvƒ9G×ð¡áýÇ3ý.N‘ +ô´‘Z’ûÚ†npF™k ·ºh¤œv –r/­#?±k ±ûˆÞ¸‡sUã ‘Ñ9{M¼&‘ÕT7ßR5âUjaú¨øW©š!¤•Y¥YUÇü1Ö;|èÚhëÅÜëy|Ê!j¥R 9bŸüäi }-‡sÇ(·46S ïu投È?²â¼døæ™Ü*ÌòVâ‘£p5Õ0ïÏÃVþëwç?›a±Ùö†¨jP‘Cëä`””Þf*Īsa¶”Nm&?Ë•š7»Wä%QSRõËTnèÆàð~£<¶q¥ã'¹*Q¦W<âÁãœXªå`˜¿S¤íqlæŽWµNÑ" kä­Úh-;ªâsÜDZ/Tr«éHXœÅ’G·%Nu’´¦¹†™Øâ{=ËØ †qrw¦y•ˆ ¯\-‡üAÊ¥ÉÎDü <„ÿï4WÌ%ê’X:…_»øÜÌæ!ÿhïLÜìʶõ\3¨ü‘SpésÔô´ÒçJœFåhÍâéW-â5¿ •%:Ú¨ºvP”h!”dÅKBö0fXÖ#Ôºž\óÀ!Õ*ÛþJµ„QCH¤¾êìê –™/ÈBz5 s^2—Òbl'«a䩱–˜r0«€ßgæ?é¨n¨”7•5JDöˤÂë*²p’¹vv¡8:w0Ñôq¶m#ö´IòJâV¤iªæÞ¸ÕÙ1K_šTmÈÜÈq®£$YHɬ¨KÆrÌÌ8•·(e‚‡3LК A@šî­Ò”p4¡Àµl»È+(䯞ñÒÌ´ˆ-¥%6¡%Ì©ê‡P Œµu¬òFŽ¿g¢)ù$Ùy~yn:«áW¶Rñ/«öÊ¡19ÉŒû·'Ž\Lœêtc;Ç’N¼2Å3޼K!)Š»ެ=6±õ™ædfpz!ÅÉ ?Rd<†ÙÌUÕ4rz¯º¤';Õ;Ü~3q”LÔ'jUÖí¦UÖFÑ¥,T xlžÓã½ÂKnˆlßšlLìøXpéå±7nY×yÁŽì•ƱˆÒnòBÜΣv%u°îwŽWÀ8Ì…‡(+Dù…€—Í»G²0¯Ãa¦Ú~+¸Í£×szëX^k8mg/ ý—óŽ1ñèÝÞÒW•¢ñd‡’Œ±Pòk%½‰~#]œvr§t²ÿ¸#i:3 ;r„˜Ô’“¤ž¥¹”¦æ}h`§{"r(T–|j”¡ÌÍü(¦è¨Nå4]ª ¿aM’(DÍ&êÇ(¨/³‹ï›ï*%âÛ´2 Y¥’&™¤[àëØy5ѱ''£nFFCPâäááÒFšÅ¦]´fMìÉ»&Â>Lå³hkÁ ;ÏWª•ÊV£§”/šJwsÏU“Àý9„gôþ½É–‰ë—Ý*´fª8ÖbÍU²–”T™ŸË®ndr[Ms·ÞÈa„ØÈ ÈÜŒ ðâžâd¦ûDd•®‘ëê!î¨xTmÈé5ú…}LìÃ~]ÎËÔ±VÒ*µ²{Q±FdÀ¢­Š/*†5¾áËÉcG8ÎX]¯b†ZD’îÍBîî 7âä\©úŠŸræ:ö;Ov9Z„L‡ÍxR È¢H9N¯,4ÉÔNX%Ÿl1áÑSª3æ±0÷C6/‚×cE£Â )A+U‡j@ZŸ¸q2q½ãðÜG"Ç´s5«ð™CÓ]5ÆãSÁíåg²çÄ­ V¹ÚšncÿŒÚc£Ò ™c¹¤Ô@±Pœƒly ¤‚‘S»FìáÅ8’˜k–8>öK•UW‹Òò¨?+’Ï5c0Ö%  a>ÏZo OéÚ’OÖáÇoe›É«RÞ¬äk5Q p¹¦ÔÉÔ”i…r0h@7Ÿ³ÓsôÖ³Vø9f[ÖÛÎߺ×ð4JD£UÝœã8õ¡•ÔG>«4µ¶R¥1`i6G„ŸñÆœjN¶™ðîÏqŽ—Å0Üš%m>œu.êi®Mgh(˜¥jó\ÆÝ)ðR¹²¤gc8cDùèw8,3·v®¥‰¡GAƒ·"ßÇÞNЉdN ¿ÆÙ­Én±JrŸ$ÝŸ.©0¿¤¤"R±äUfq„/@.Õ—0aFçÊrE« Dh?¡>SÉ[QTRTXéÉ•ÖÍ1Ènkl1n±Ÿoõã•j!­8¢¼™ï ·ò7ó=b‡„ kàd6â<9*P]ÎÁš³5_úž ‘©®”Ë5Š»$¼!]7æç‡É¹—ž×äzÙ3¼÷|âdãsæy·}H]ARŠIÊ7)wxGw¢£iôÉö/ì˜õN[dIañJÞZO­žº%üÿ#\Õ·IÖ*Dcš_O[Én¹Š‹›JVPe²ŽMgœ|kp~ÍšäfmÁ<¹$páÝ(ó‘îêT×θë">Ÿ4Â=Jˆüƒ*˜d¬×ú,GÜH†—“ANÉÒQ€û’GˆÒ6r“ªØ }F&œð’å]»ÄÅgãÏ;²¸ïtqŽaY¡"x£ÚO[Ç+9RêBn¦Þ‰*arû²:g”…È®[dü´*{G*\† õ Ö˜³ÏÕiMÜufºKST óZ LtuØ}Ã=}£'ŽM˜õü,¬Ëê¸kYå›c¬mLñ_ÜÜôºëca¡§­ÉCq OáƒY–”rsþzµ{Ü©æóAäÇÛYÄDu˜.ê’yZlú^¹ÓýGΞcÆâš‚Ó¹³Ã´îþ9ÃÃÁ§d“ã ³Ï/gš%‡B 8´š/.-wHINz–=çÝvÑçÙ'™×¸Aô¼(î;DöߺM á€Ov@Öz] qôb7AÆù¹uÜ•h90|xûÄmç»Z™ 5ªù¯R­°SÑ*JQ=‰ö8U‘làh¡1xz•oqâ]0ƒLçª(ËJ@OcBàî&s¶çö0›„ó¿C&HÍQA$‰|œbcgŸ¸TCTã°ø±5±‡üæRb×€©K¾É2©2[wSY£ÃrìqáÍ’q/^‡ê¢ .«c]sñ8ýÂnbð5óîžâ7-ã†E¥Æ]>£é¶lÒã$Z»:AçN ¹øœÏžæ½®4²í•Ói™sœ¾Ô¨+ÝEcÜ›vS@*Îí6Z~Ò[T¹Ö[ZõjQi‘7¿²heÕëE¨¶Çz<©gJË2·öR¡ã:æ¡êYŠ(5By>æÉ‚­X‘áË(ûò}žë<úä8hržñÐcãóÌ3³J@²\Ö"d±õÈ&5YYÒA¿ Žxšn?§·&Û;†nq‹ÓÇ)ošŒ¼R•ã†Äç ³´ÌgçV÷ÙØ2ó¤(à9læzãq³(pôˆIØç4³ÇV×»Z®rU Š©ÍS9~ñŒ5’M]•1Z®5 mùÌCί9ßNݼµ.µ˜ÉïP޽îsN¹rOZ ab쪰Iæõ‰>sXÆAÅ%Ô3¨©¹5á£/1½È¡‘ðr£^/s^Z#k›©!VªU¾ õtfs+æŸ|Id"ùG3/…D«©Ü‰½\‘AËîñ9¦}åØË’Òþ£aç\u,ºªˆûLB\52¶B”³~eN³s^{qœÜ/.±‰ét8k[¿¡l-õô±Ý"(.yŠKÅ÷tiFœ™ ~bçô\H´ajÊápÐKÍF@ã®Ñ÷šÅ`ž;3¶zøjТ …­â©PùþPØS"7(Úbç!1܈·x\ÃK1¶êk6.òÚ‚á“ý-cNŠ=+.]·¯Öpv´%Rê0†®ô}rÝÎ6À£W!œðé½kãf»lWÐ`¬¤Í®«Ú©Ëäöü} #¦åi{…öíf+xmw¾Cha]qÚ÷“°a-1áx¥@.u–¢Ç2Ö„•H7=Q!N|Ÿú áÛ}Î}Mt´qZÿ@ú!ýýwú6þôÿ[¿"Á‰ÿ›,ý‡ôŸæÏÓÌŸ'_”¾t^üŠÒY/c­4Eäi[nH“6Lºå†4yä·Tl˜<ãÖ úk¦0‰p‹I¸ ·áV“p¦aŠI¸“ wMÂÝL˜F„iÖ;Ó™2ƒ)ÖK3™2‹)Ö[³™rSn3)s˜2—)·›”{™2)w˜”û˜2Ÿ)SMʦÜÏ”;MÊLñ0å.“ò S2ån“òSfÊ4“òSeÊt“òS1e†IY̔Ǚ2Ó¤|™)K˜2ˤ<Á”'™2Û¤ä1e)Sî1)˘òS昔§™ò Sæš”g™òSî5)Ï3å¦Ì3)/2e9Sî3)/1åe¦Ì7)¯0eÅÿõXOÝA…;ýlÛª µšª¡­Ö”mÛ¶¹lÛ¶íþAçžîéõ{¼O)§ Hy% F*(ŽHE¥‚TRB‘0¤²ŽD U”H$ ©ªDÿoXM‰Ab‘êJg$©¡Ä# HM%é‚ÔRº"IHm¥Ò©£$#)H]%ICê)éH¤¾Òé…4P2L¤¡’…d#”ÞHÒXÉEú M”¾HÒTé‡ôGš)Hs%„´P B¤¥R„#­”d0ÒZ‚ EÚ(ÃáH[e2i§ŒBF#í•1ÈX$@‡ŒG• ÈD$H™„LF‚•)ÈT¤ƒ2 ™ŽtTf 3‘NÊ,d6¢ÌAæ"¡Ê¦,@"áÊ"d1¡,A–"‘Ê2d9¥¬@V"ÑÊ*d5£¬AÖ"±Ê:d=ÒYÙ€lDâ”MÈf$^Ù‚lE”mÈv$QÙìDº(»ÝHWe²IRö!¥H7e?ré®D!ÉÊaä’¢EŽ!©Êqä’¦œDN!éÊiä ÒC9‹œCz*ç‘ H/å"r ÉP.#WLå*r ÉR®#7lå&r é­ÜFî 9Ê]ä’«ÜG }”‡È#¤¯òy‚ä)O‘gH?å9ò鯼D^!”×Èd òy‡ä+ï‘È å#ò )P>#_Bå+ò )R¾#?bå'ò )Q~#JË”ý7&eþPK½\C7òVZÕš:7com/microsoft/sqlserver/jdbc/SQLServerResource_ko.classÄZ xU–®3¨•‡ÈCÔ_‰" è £Œš $vGÑY¶è®„–NW[ÝÉÌ:¡a#1j v2a'8¸BÐ8†™Ý}ξßï÷;U½»ßÌîÌ>g÷œ[·ª«:¿oö[?¿ÐýWßsï=÷<þsn}ëû_ûº¢(ÕðO×(ßQþëjåÛÊÏW¾?_ù>0á „+®B˜€W#\ƒp-„ë®G¸a!Â"„ÅKnDXŠpÂ2„å+V"ÜŒ° á„[nCPV#¬A¸á„;îB¸¡¡á„{Ö"܇°¡ ¡a=„û@ø$ÂF„BøÂà lBø4£!<ŽPƒP‹P‡PЀ°á „'žBx¡ a ÂV„f„„gBa„V„g¶!lGxaÂgžGxá³?„°á‡4„]„(‚ŽÐ†Ðް!†ð"„8BBÁ@H"¼„`"¤Ò„N„—ö"t!|áó?‚ð Â~¡áU„}û²"üBÂk‡z#Aø"Âë}o ¼‰ðB?ÂÂQ„c9„ã'ÞFÈ# " !| aá$Â#|aáÂ;§Î œExá+çÞCø „¯"Œ"œGC¸€0Žpá}„&>DøÂG“—¾Žð „ŸDø)„ŸFø&ÂÏ ü,ÂÏ!ü<Â/ ü"·~ á—~áW~ á×~á7~ á·~áw~á÷þáþáþáOþ áÏþá/þ á¯þáoþáïþa ÁB°çCa>ü#ÙrÄH¤õD:ÊÏ?ßô¢Ö©UŵD{Uó®õHúP®ÚKÄÒ‚2¯¢r(WÔQ”kÛõt7ô¦ŠÊòƒqS$.†/P¾«|oò/Ê¿‚²¤ìO–b$6´3–èÔâ±h‹‘Š¥cF¢1Õ÷‚Rmç³ö‡9ÕÞÿš=8¡~¾ú{p¼bj´»Rµ‡rÖ»Y}9ûX}è¢ÕÛcõެåOV“žhOï¥rjb‚†Íiô’ÐÎLbOÂx9±UKÇ:õÖ®$)¡jjbÔº0¡rvï #([aš$A‡U»‡Vxì _Îr–cê£=ûœ­3♎„#lƒ}l\µóÃ$,(ip‚„†ËÉ»…w1:’q=­‡ôTÒH¤ôÆTø™¦ ÕÕÕ dZëê½ïœ=œU­“ù©&X_öàVïEÞ»}x›&EŒæ Çs>aô©¸oûØèÔØ¨XbïW ¹~ÿT+B;Óf&ѼMgÜ6mFëýW¿e¦?Ú3ÇIÉr_ÊèfWk¬C6gÈ/î¶¿1i½sNµ{óS£YqŽã=S&§ÛíB9¶NKDôx\‚¢:ƒÉÜUûƒ3öÁÃÓG‘•vÄRZ:²›ö™6u­Ãuš¤}h¤phÂzgR}ÓìG3<`õåUÇŸ„à¬Õ{ÜÛ\É/ø¸§³ÎŽ®¥]ŒØÃgë_±‡x«YÚ™4uZMÆÔÑæ¶ÚXB3»œuòÅNb9OksU?Úϲ=BMî’íAr \y­tò´~ëÕA¡÷ÑüÔØ¹R]”_{p}·•®¯n·fj‘´nºKÜ[v‰ç&졾ÿëÅÝÍŽ¨ïMR<Õ£Í {#z’i‹iDôT*–héZT7AÙUº ÕyBþ§Úc9R$y Ï`½~Ü虾VŸt¹f{ÿ`ÀÌA¹ž}5v(Âz‡Þ°péí>Þèt?_îEpr‚d&ÝBZî °Gk¯·ßÏ[çTëôÈÔ(©öB7ÅJ¡PWésŠò¤,#(z«‘éí±}Ô£› Ó™”'ËMœCü€Îš"Ýyëä oOþpÊj2ßtõz[,!æG%£%4Ë<ÃÝöÐ)µÐŸ¥øN¾  ‰É6H3N|ch'%ÿY'ÖT]ÜHñ‰¬œ--õΠÖ0⺖ئÅ3´ÀŒ}ðˆ=/VÆ3Ks ì¶OL8±b\-¼NFt†Wt”OÝoËWuÕÊõ±…µiñ”Îc¬Ó‡Eö:qÖËC=%ù/iIÝLwmÑöÆ:2lƒz4Å>HÄä1áybmÂÐ.æ)­y®Çª\ïK2"ˆ–Xì1Ó[3»Øàªy'‡&(Uõrs# =AÈE¯v8TžSÄ\¤ÜX¤1Fd'i]¼øm®„ÆÝ–Ù£§ÃDG@¹/é}™“”ål»îˆV赓á†ÃM |ÙÊr±ß>\xõœZ8|¦°ï•>RÌà AÒͱæÂ8‰£‡£êÔØ%ûĨJÈ`ûIµ…ãý"ÀO‚dî”§Laçu?—˜ºxNœ}V-'o˜à¬ßûûIŽ7°Œz$KÖyްY‹‰4¹‰&wB¡kÔd9|J­u-U-nÆfcïáíÍfEñ´M-‘Ò„ì&½Sƒ²‘÷<”·‡Þ³äxCöH÷\?¢%Ò‰Nc2âñ]¤|P^¨É¤:££#–V­wϳb ¯aZCAHɈ›&õZ'G¬Ñó^Ø%ÝÐ^ßÏÏÀ1;³†é”µN=iÄdpÏ}Ü98e÷ñ|ÎÓæ#ÖŸz)îœß“F<ªíŠÅcé.PöÏ•£„{îBNRñ"?ÌñŽ©ù¡Sb2É]vª£Þº”žöMQQ©ZgûY‘SŸÕLf¥w²{¯1M­Ë¥GõLâ­Q²‹q'±•;HQZ_ž>˃éi3F6ó¤–ˆÆÉ=7ÒF­³"®R£üV˜°Þá]N]m•’5vr ¦üBÇȹ¥˜;æ_D#Û–qÛ=Í2 YH›p›¢Òl½{€ÿïË‹†\);î&â¢7ÍêFÄ1F¬S¹‡9J;DÈÍÑk§´m5š83'„ƒòŒC¾žä8«0H2“Þaž–,ƒ™Ìë”0e|˜mgEkq3äÍÒ £4u¬­«UÛ×·èi-ª¥5Pž&*ìï¶Žp -dG}›-8Ì,m¢?XÛôZ²3œÍEç¤Õ“èÓ4ÌàÙ5NçÅÙJÖ!•ÉVW–š-÷e—ŽÈl÷àŒ&r¹ˆµ€¬¨›Ò5‰Z!¸áE¡¦žÊÄÓäš®ÂW“‰Pf&O~ƒ¼¤<3YRâ–[i ”ÐDQM:';§õ.óÍNÎòl’×½‹}oCÉ(®; 7rhb†Ó[Ä‹Šê{)+7·…´D; º¿<'µÆúí|–£Ž5vŒB‚E±'¸½”}ia¼;RÌ=¾¨JJ‘7ƒ-/ô‹pƯõÆ×â šM;uÓ$/“  vÈ ¹¬=D‰ÿèk"€õB»éȤҵzs¢‘ŠgÓr§ýÑù°0Š}—¨Š£94LK<šÔP"à1ûD¿=öž92·E‰F@îQëÔx™ã&ǵŹëõ:wU¢Bô{ß{DÓX´ØR÷\Žg“BÆj&£®Bf0ÀëØaB®’Ayˆ½³îi8kCpcﴞкÉ] ŠÎæ@yÔ¿_ܘæl+dŒœÆ!SiÕAVP¬–‰ÔTÎEùÕ12Ì#6HJnJdN^ZLÁϸò0YŠ<hŽHRωl®@ŠÞ¬§#»ëc¦›ÏªIÝlHÖèÙÂÑSs¶8(ÌáØk¥‡ "3xX”«“ålèNa‘”÷ö&‰x±¹ÕhÕ÷:…*…iP:1šãHáÀI`ƒ(2:UžN;Í̇iëÔrqÿa'/gCuB­·&yÛ…—Èí–È™Ó c–í ÙјÁ¤oÞÑR·EK&c ®5¸wꬂ˜ =a±…7.++°MZŽÜÕ ŸIoªa¯ɈVE°j6nr½3“\h3g9J¤K8Çoo<ú‘Øÿôz•C—Õ¹éQ aÛØW£ÚáMœñîn(+œ>ÌÕ8É#µÏPÉV¿"i&¥­]FðFûR?;Lá‹l’,Éï:Oiåî·T.Ánðî,Ã$½‘¤ïð_²ëBJ’Ãç•^Ðf+ w7[S]c=(Û¶Såc¼œúODöÙ­™aQ ÕtÒ1±ùlæ„ãЀ‡˜]¸èÒæ1N‘¶Lñ©Î$›Óâ.¯ùê¼ýXcÃ|FÒN?ÞDÄ3ô™¥QÖo7ciú,œú³ÅüH6ÅNŠ)™Ó¼5êO-É^úÏΞdJŒo‘è™Ë¤&fç:Y¸†üe°,ºÖpmñRFO‘Õ6'ý6Üœ u½¬™QÎ÷Óʱnaƒ¶‡³¤2µ´r¼œY/ †úŒ™â ÜëÔŽß™=œ¯*#£9É’ðïÍeÎ2“\~­ËKÓRDÔÌâwóöæÝ‹‰Y„¬.³ØšDPÚ¦Àʪ<Ùª}rÔ­âf™b‘ˆÙò2PšD­GC–NCå’ ó³Ù¨€Álàú$¿5:GÉ ]Éd|‰'ù­}Ž3î•ùêúöé,»¥Ï8üÔþà弋±É‰´¾×:Üxå*‘½pFq|c½»+‹h>ZVLò Jûf·uúUab^ Tàãî…øl÷p«„=ld̈ÒÛt6;)Þ\ñ¹jN9ø™à§Ýñ¿ËÃÁSpÌ™ü­ÁÖ‡lF01Ï F6¯+Þȳ¬Þ˜ÄŸZ43M*ÚKï62éúZPÚ£’#po5x)i½ž•'M³DJðײ.sé]ìÔóxW2}eÜ‹¾ÛÎ©Ó K ¤•yl}uÂúÒ9 OO=ª·®h,àô-†-€Ggx2çþ\ñ‡ýoÑé訫ü_ç$©ør¡û LÝÁ e!+W¦¥2ãõžÓðv‚wÎiç {gÛ­:í¢˜2÷ÅN©[aƒRéÔÁsm:5ØvãÈÍÜC•˜ÞfðË$÷ê¯ÂüÖÈŒ·b¨0å›nµ™6Ê3â4k§ajÝ]þDÙsjâ´Þh—S$²óš4/+HùIn‘aZ½úL˜s€Ðþ¸›(‚¯MgêÁ”u«xH44Se Ë-ÍÏ¶Š°Õ¸U| tVE/÷cWš©TÚïÃÿPÐâdã.+`œ‰ ­¨„¯8y0+ša2qȬ‘æ‡ 'ΰGókûœ^gONô¾såû~IbÉkUß\|A({ºùâD ~}Äè¨êˆEL#e´¥«R/ÅSâЫ^ŒîŠT‘ö¼o«Ý¹Ç /ïŽgÒ±x¿à>«Íð{ÊzåÛÊwE¡zŒ_@§Oóèów•ïÑߣo‹è_ ¯¼çÎ+üßÊ¿+ÿ!/”¯S>1*ž¢òŸî`ìPæ H[øò%eÞŽyW^R®Ø1oñ•áW,¾*L%0Ÿ$àJ \ÍÀ5\%kX@À| \ÇÀõ n``! Ý1‹Ÿ;h #72âŽZÊÈMŒ\-‘eŒ,g䉬`d%#×JäfFV1²@"·0r+#×Iä6FTF®—ÈjFÖ0rƒDngäFJäNFîbd‘Dîf¤‚‘Å©däF–Hä^FÖ2r£Dîcd#K%RÅH5#7Id=#Y&‘ûy€‘åù$#Y!‘yˆ‘•ù#3r³Dad#«$òiFeä‰<ÆÈãŒÜ*‘Fj¹M"uŒÔ3¢J¤‘ÍŒ¬–ÈŒ<Éȉ42ò#·KäiFš¹C"[<Þ)‘­Œ43r—DZy†‘»%b$ÌH…DZy–‘J‰lcd;#÷Hä9Fv0r¯D>ÃÈóŒ¬•È ÿÛb}nåî¸D¶ì=ÃYí½wÙ2³÷Ê ’‘ÈÞ{FöŽÜóïßç $i«D!ÑH;%‰EÚ+qH<¬$ ‰H% IF:*)H*¢¤!éH'%ÉD:+YH6ÒEÉAr‘®J’tS B¤»R„#=”iÈt¤§2™‰„*³ÙH/e2é­” ó>Ê|dÒWYˆ,Bú)‹‘R¤¿²YŠ P–!Ë‘Ê d%2HY…¬F+kµÈe²ªl@6"ÔMÈfd¸²)CF([‘mÈHe;²¥ìDv!£•ÝÈ$LÙ‹ìCÆ(åÈ~d¬R@Æ)‘CH@©D#áJr¯EŽ!”jä8¡œ@j‰ÊIä2I9Ô"“•3H2E9‹œC¦*ç‘ H¤R\D¢”ä­\F‘å r‰U®!ב8år‰Wn!·‘årITî!÷‘$åòIV!‘å òIUž!Ï‘4åòIW^!¯‘ ¥ yƒd*o‘f$Ky‡¼G²•ÈG$Gù„|Fr•/ÈW$Où†|Gò•ÈO¤@ù…´ …ÊoäR¤´"š 6ÿcôPK½\C7ùpI9ÝÜ47com/microsoft/sqlserver/jdbc/SQLServerResource_sv.class¼Zy˜×qï2 JH qK $f—KBZÐîì"V,»«™„±µî™~3ÛLO÷ÐÝ3ì ã[¾ÄÎéD¹En'¶“àĉœcs:÷}ß÷ý}vbçtRõÞëcfg°>ûû¢?Ðö¯ûÕ«WwÕ›O~îãŸ0 ãüËmƧÿ¾Õø”ñ?«Ï­6þÁ@„W!¬@X‰° á„Õˆp+Âm·#¬AX‹pÂCëÖ#Ü…°a#ÂÝ›6#lAØŠ° a;„{îE0v"ìB¸á~„Ý ìAØ‹°áA„‡ö#ä†F D8„páÂà Exá1„Q„cÇGxá“cãy„ „I„“O!œB˜Bxá4Â4„„Y„9„g E„ÂY„sçžE¸€ðj„‹¯Ax-Âsó¯C°ÊA Tj Â%„:‚‹Ð@ð|„&Âe„!DˆZm„+‹„«Ï#¼áÂÞˆð&„7#¼á­oCxáíï@x'»Þð„÷"¼áK¾áËÞð„/Gø „¯Dø*„¯Fø„"|-Â×!¼ˆðõ߀ðß„ðÍß‚ð­/!\Gø6„oGø„ïDø.„ïFø„!|/Â÷!|á#Eø~„@øA„Cø!„Fø8 ü(ÂËŸ@ø1„Gø „ŸDXBø)„ŸFø„ŸEø9„ŸGø$Â/ ü"Â/!ü2¯ ü*¯!ü:Âo ü&Âo!ü6Âï ü.Âï!ü> ü!Â!ü1Ÿ ü)Ÿ!ü9Â_ ü%Â_!ü5Âß ü-Âß!ü=Â? üãjø§ÕðÏdËß‹„…`l¸xqú’Õ¶F\˫̖/‰Jt Œ[Ž;ž=ÆŠ½ûα2ïÛŒÛk"Ê'KïÞ»¯ÿb<^qåò5ÆgŒÏ®1þÕø70îêûéP/Fd óŽ×¶\ÇžóC'r|oʳÅ"ÄϡÀˆÌç\3—^ L‡X2kŽ9µhŒ; Ó«E `ì˜^zÉ«ÙÂë·„VÜU˜oyuÏ¿âÍX‘Ó¥N“Ž{ÏÙ l-¯Fôœ®õëDͦe›yY *~Ís® ;ï»­†§Öî<-Ò…¼Æ Õ¾NMx´|óYñMWD¢ Â&ML…Åg¦8pŒJi¢˜«.ÝÏõk´q¶­€N.Ù¨¶\7Œ˜>·yf麊 -Ïl,]i#úØ2‰žY”¸ÉtMáºôg(<¢D\låC„­fÓ"a«ω $Aƒq,³¸­@yÚö†­OcµM–ìódN;hEŽ'¸¾0ïùju|<0ò’t”Và‰À²I(Y—Éç6ǼÐmE|`&lfÝo6]+ Íj°tIo)ÌG¤šŠ•ðœî07`E=B{ÅÛ‘I]n‰ Sržm‘™n;I¯j–gF~Íd%™.}Z3#‡-cHŸ·¼ ËÛc]¼Àj—ƒ¥Q¨ ¨á„ +ª,Ð1¢@XØdz\ºÑh“Tm­p)m5¹‹Óö,ÚQYõ°9Ñ•kHYû嚪Uœ°Þûúà5bc{a¾b£ˆIÏž­Ž;dÅÏM’àäépRj$-³¹tÝ,;Q %§ –E$éÐl;¶)½t”À‰~TíoïþyR‚U‰DðùYˆD¥.¼/š…=ìb±I!HØS³“‹ÑäX3øRÄ©‘ Àx|–tâEVdf>3YËxQK̲°‚²\ÑNw°SDÅØáÀ¬IïYºÕ¤¾½¬ƒ);Ñl¯ÙŠæH< ÄÎá©L0”jE¶YÍø¯_ˆ¤ãúÝ”fü¨ jE@Ø'ý@mÆ‘³½äx£@~H¿Òa ³7m°“Tš!=!ª˜®¨MŠcl®›¨Í9Ëh²8\«&]¸¯ö´én(ÌS2óHmœ(¼ë‡,Ó].-ý½ÆÂߘrÜ÷]ayç,·E¬8“ôyG­"¹@ñ”#¥ LZvf™×…õÈTž9l’ÁZaüHÆEaIè[µ( ›uöy†>TaŸŽÑAÔ9c-:VƒÍHØ![=åÕC=¼,ÝàÈ[¶¥†µh‘ñ¹¬ðƒ×´Å© –dÍ ši5Êl&?x­F08Y% 9¶Éж›ÿ"óÈÅÁgÀÒ ižõ+õdùN7}´4îE'ˆŠ”?)4“‡‰z3›UüMÉ÷ÇÙT±8 Æ'XKK×õ‹F,u“>ÈÕƒN“L´)ã9lDr­‡M«Îy‡ü-m©„^îã™§©Ø |Ö¥EÄb‹ E¬ €ôíW(_xU§Ö ,¶B4íLÖ%¶7Q¶ª4f>1Õ“–#³Â¡R~ndj.geí5r\76(É %‰ÐíTê:„lIuÐBKRœmá’g+¨. %ÏiSR Kv²¥)¯í×ENY&É‚q±ŸÉ^-3Ðßäâ8¥¢ÞX+òó~£áD9 ¬µ$Y±×¹®ŠÒ»Ø+v©’€7-’­¶hú´O÷Û²F^¤ŸEÞ¤ú,ºÙ~ÉT?†—]%úS¾k[eÇu¢‹™²€“¼PŽ+#­Š4Ò㥆K7.¹NmA(ö3º—"å’Aš–IáËg-¥Ah8Qfß½ûT¥¦jı °:q¦?ªJEJŠeázØLŠ×lUw0Õ`AÐJÒþ)˳]®°–‹“ÒK#" Š*…wwÑ¡UeÕ2}ò“Vv/edm޽I[¹Ó¤sè\oY"S«¦f¦É" =JõUiõ©€1)yu*õ¬êYØ–ò>¶g5tâf£²$û2§ŸîhZÂPVÍk?vÉŸæ\æI·£¤]Ô…q—+ÄnË)GqÎû»0¤½¨Ð3•sj³M¸Ž“Ì6í@ÄcäT;%«ìŠ3œç)‚ñØò“9êKNqfd•9IxiÞnè¥Ã’2?MÐÓdøAô¹Š¿® ·Wè’$[8ÕdÝ×£¨«„HS¾Î»ç–ë«_Ð^Ã2N¸™H[v55+ËÿºÂ| –‘/ÄÒº¯ *òˆ+ ¾q°ãT‚¶»ƒò”b Œ]ÊEس·)³)íÙ&3Sf‡8¼Ü!ˆ zÍŠú²¥!ëGJc³Õ$ÕTOëI†êIñ3å€w…Îoa߈>‰`G‚¥ükã–;eW©%ÛÓ%ñ–ÙÝgη(…Q<ð¯€ñh—v8'Õ£Yœ™ØúÀƒóV‹Yj½©£T÷±‚:­SõT,KŽŽŽWõUwÊ5š§b0S “÷9εnYÈìaeëÝ}¦Ë'U+&÷Ͷ¤›»™†yKªƒ"‹Å@¤”)k3“Ë·¬Áõlö…XÊ`<GÉeý«×W¨ªæKôô”à‘¬†ÕIØ¥û/5¹Ìõ°*¯õ™Q62ú^P«¥¥ïú”½´î]—=oÅoqÖ>“Ö’Ê ô«A–f±gâ^˜|CWÐ9ÝÞ†·³ÕãM¼U;)¨ýp‚8%ì;ÅÉJéÝ©Ça¢¿nÖwSQeäC)0òWÔe¾‹C¦OOÔxÒC$vK›¢ä1¹Ø¤šÄÂ’_‹ª?¢@ F1Ó­pI/i ¹†ÔªtÅÅ­Jbñ°Yê4Uš ² ÷›Ù¸T¨K>Пâ¨Z—ï‚qUØk\rJ/‘ŸƒU$' Û¤ñÎåÏXÍ&}F&Çó)µ!5wSR¶ô>× ¤Åe×§Ü«¬™Þ’1¼32RL.ŠJKv³GRóÓå  ‹£GRãLlèRŒ¤—PG *¤¸-vaSä8ÇZã~öìLã^ËV©9mäj%p,n»škJj ·K°«§¹NSWe;ùÁ½ùØlXpzN šbÄÊc:í?Cž¼$åœí*YÉu«¨…‹Êè\¾S¯Yõª ‹Ù™Áx‡JYr”¥’øÙg(×ÕìЬ¦óŒ¼<.JWã 9`¡ZBÖ ¾m¶¼ÌèÂÓÆ;ÕySQA¯ªœ¾kè:[­Ê8yÿIR|X¿Ôº¹ SÒóZ®›- we»÷Ð<[˜ÎY6YM¨ò}ÝS)¤KïÍ>G Gunñ“ýöÄþ^¢Æo,¨µØŠÃ¹@ {6ÈSWeCéŒ.îåü6vyªL-½Jy!k2^^ŒÝB«5&–àJ™+1¯«'¿Qò).Ÿ–òkvõ îádˆá¶¿Û€7egWr~Íö°Výx^¥SrrÆNN«É0«UKB¹(“HŠÉ +M$iâ,M¹Ûœ(æšù§ÜtòÕ·sW(òãBq¬Â¦ÈCæž8ßÑÉýWdoÔ¥qxëŸZïé%œ›ž.F(&ÿð`òËÔ“‹7T¡3¤£ÂeNÔo’xoœ§µ`mñ\$[AÈ\oÑ=ˆJèÝQp{Ÿ³M¡fr”à^ ‹œ~ËkdöŠ/û²a»"»­ %ÏýYc 2™‘nä}®Ë¤tÄÚÙ‡Ó1¯›äÑÓ~£ìxñ@1åedÅ9¬“ñP_Xhm?ÂÚÖ6C5M¸Ì®ø²¤šM×£ÉÌFcëšÚÑ 5žK·_1¹¡˜ÙÑ”wŠou“òH'%uQÏÛÄ"JÅiXn¦ JʺnÝ&CYzÛºÌ4š ЩX™2#MtlUzÏ×c]ƒØäþADÓ÷»ÂpÏèb{WYô[AEÔÀ­Â7³ºµ‡pÊiÓo•³qû_³sD’×Ù^÷ØÀñËM’ªhèÓùnK¶P½§Ù w9mJ‡ é0iGm‹8bRD¬@zË/‰Ã½ûtñS‘—Ÿ„¨Bz¡š ž&Ëîdÿç½u›òš­(.gN ¾zc%©ÛHËLËÌêž[8¾rÔ?'¶æ¯;}ŽÆ?7PÎôZtúkɪÕcqi«ÌÓê¤ã?-:T¼8×ÝÍeîî¬Þ¯—÷:Ë.œÒÚ²0Y:[˜™jrf²0Všœ˜?=y¡(yM¿™™í}ß{?Õ;J¥(?E Ô$O`<9‘fä›R¹F>Ó©xðƃ‹­ªò©¬ QDtÜóN´à·¢‰q0®ö¼Êõ»xÉ´à ë&tvK~¥ʹ}MÈ|Ù‡FwFæq[ü“ŒxJÊ»ç³7;`LÅ€ 3<¥ŠrÁuùMÄ¡7 ›‚*)3ÙËv®*tŽl#GÏõÈ€O´Äš¾*c©›YðI;³š²ôG8ñU¥WÓ~Zl_å$¿”‰¯0ƨ€5Ók³žÀÚT9Ë Uj#ÕTwM±â¾¬5þ33”õ»fVª;8o±sý@=‚ DB‡Ù‘vIîáLËîvyq \2.Ë+©›ã˰–Ú_¤6‰1—˜³;ªWa÷:ÏŽ:¤da“¡³ '$²•¦Õ#ɤU8½Pµ³¯/üþ-Í—‹ï5gÏ–ä¾S3ü×Í››0t T$:OnT¿ #)ÊÆ‹: zpÉ'ç³Tü‘Ô3† ’cæÆŽK³žkܽEA“0‹>÷_¡9muD°o˜šqŸ‚©5Š >rÈt™lµÓʨ-´`‰¼RLæ8ãµ?óœëÄ2•Û|E£[Ê´frgJW™–*ý]—¬0o—;Ç7ÃWÿßå–i¨P«×sTŒùyqy“*]ƒ'ìZœêzÆ‘u/wªN’µ%1ü«@'îú±QÌÓ¿a6gbâ)áøµœI¬ø‘†S üЯF#áeý[¸‘Kv¹2BI~%&‹­ù°M–+}H"vGø¶0~7Þâ{Tã ñ)ãÓ†aPéÏ?a¤¿VÐߟ1>Kÿþ;=­£ÿýÕƒ3à#ÿ·Òøã?õë!ýzåGW}X¾Eã¿âÅØ0VKȺò²±âŠU/+/¬X¿ªxaåú[Šô¯V3€¬ÒÀ­ ÜFÀ-¸5¬ÖÀZî 5p'C ÅkÖ1²ž‘xÑ]Œl`$^µ‘‘»¹U#›ÙÌÈmÙÂÈVFn×È6F¶3²F#;¹‡‘µ¹—“‘;4²“‘]ŒÜ©‘û¹Ÿ‘!ìfäFÖid#{Y¯‘}Œ<ÈÈ]yˆ‘ýŒlÐHŽ‘aF6jd„‘ŒÜ­‘ƒŒbd“F3r„‘Íy˜‘GÙ¢‘£Œ<ÊÈV<ÆÈ(#Û4rŒ‘ãŒl×ÈãŒ<ÁÈœ`äIFîÑÈ#ãŒÜ«‘<#Œ˜™dä$#;5ò#§Ù¥‘)Fžfä>œfdš‘û5r&‘ánÌ02ËÈ™cäFöh¤ÀH‘‘½)1r–‘}9ÇÈyFÔȳŒ\`ä!¼š‘‹Œì×Èky-#9<ÇÈ<#Ãy###)3Raä€FlF#5Re¤ÆÈ!,0â0rX#—©3rD#.# FֈLjÏÈ#i2r™‘£  yT##-FÓH›‘+ŒŒjd‘‘#Ç4r•‘ç9®‘×3r‘Ç5òFÞÈÈy#ofä„FÞÂÈ[yR#ocäFÆ4òvFÞÁȸFÞÉÈ»ÉkäÝŒ¼‡‘ ¼—‘÷ý_‹õ˜a€atN{Ëî˶­edM¶=Ù¶mÛí óœÞ¿w±–ä ¹ˆ$ÉGl%H!b')BŠ{I RŠ8HÊ3â()G*'I%R…8Kª‘ÄER‹Ô!®’z¤q“4"Mˆ»¤iA<$­HbHÚ‘ÄSÒ‰t!^’n¤ñ–ô"}ˆ¤± ¾’dñ“ !È¿dE$cÈ8(™@&‘ É2KfY$D2‡Ì#¡’d “,!ËH¸dYE"$kÈ:)Ù@6‘(ɲDKv]$F²‡ì#±’䉓!ÇH¼ä9E$gÈ9’(¹@.‘$Ér$Kn[$Er‡Ü#©’äI“‘,ÉòdK~_ð˜¬þcbúPK½\C7‚×,WÂl.:com/microsoft/sqlserver/jdbc/SQLServerResource_zh_CN.classµšyxU¶Àë¸qÜÙA@mEG@%ྚ„Ñ@bwQg2Ew%´tºšêî@tœa HH%@Â*K²€!!0û¾ïû¢©êάïͼ7óÖy·ª«›èÌûãùùAò«ºçÞ{î¹g+¾ò·Þ Š¢Ì€?^£üYù¯«•?)ÿ=LùÛ0å@¸ ár„+®D¸ a"\p µ×!\pÂÃF ŒD…0a ÂX„qãnB˜€0aÂÍ· ÜŠàC¸ áv„Éw ܉ð!„»¦ LE˜†p7Â=÷"LGÈC˜0á>„û@xá!„‡Axá1„Çž@ø0“O!B)BÂs~„B9„…‹žGXŒð‹/!|á£CP– BB%BÂR„0ÂËË"ÕQ!†°Á@ˆ#$’5+V"Ô"¼‚ð*ÂÇ^CøÂ'V!¬FXƒ°aBÂz„ õ6!lFh@hD؂ЄЌ°áu„mÛv ìDhAØ…°aB+BÂ^„}û D8„ðÂa„#GŽ!´#¼‰ðÂq„]Ý'N!¼pá„3gzÎ!ô"ô!œGèG¸€páSŸFø Âg>‡ðy„/ |áK_Fø ÂW¾†ðu„o |á[ßFøÂw¾‡ð}„ üáG?Fø ÂO~†ðs„_ üáW¿Fxá=„ÁBH!¤~ƒð[„ß ƒßƒ?-õhB‹&â Œ~ñÅ’—Õ5/¢F«òJ—¼¬ƒrÕáh8ñ$(—O™º”+ õʵUZ¢Ð:vÊÔ¡ãÁˆ=ü:å/Ê_¯SþEùWPF ùêð\Fbýáh ‡Êôx8Ö£ÅѶ” ý©þÎÔéCæù¾Wg¼æ³ZX;êß[µ”ÝQ%Z´*±”v6¸ã¢Ù{4÷ÅQþŠdtYT_¯&Â5ZymŒv6Ùj;aµõ¦Nö™û6‹!»º¬¶·RûfÏc -¨WEïh¡B=’¬Ž “xŠ·w¤»Ö›õÇÍú–Œ${äͼ¼ ^‹h ͯÅcz4®ÇÏ•Ü7cÆ P^(Ÿð Z—ÚÝgöï0·5š½ÛzÍÎkÇi’jí´l°ÚÍMÍÝíæÅºÁƒ}´DIð4£F3|,ÉgÕï´ZOß•ÚXO{²'ŸÀËŽ'c1ÝHh!ñöB͈“jA™žî:2øæIsS{ª}³ÙÛD³ZÛ»¬†Õ^ѬhK鯈ê‚;%Ïó2©-}q»ÙºOlƒ¥/î³¶1Ïž2ëÞlé°ÅÜä¯HÉhPu—”‘öˆGš•Ú³îR¥ %–ì`yR3jËÃÕZ¨4Iöt£µÿHºëPúLÕrÆ~g¸|§PµHD ѦäK‡Ž›M;­3õÎqW‡ãÕj"¸”Ö˜04µÚ1®g¬wV›«Î³²ÈN6˜{h‰Ââh¬ âמ^ÖßÏ7˜ûw×yèLa“ü1C£y’†V •V„£ªQ+fåY³­ÝcôæáufÓÖÔ–n:¸Þ†ôÅV³þ -Çjj676¦ú¶Y{÷_º„ÇœÉnͬp©j¨Á„f8óÍ}ÿùÌŽ–Ô‰£ÿødw±åi+ct±µPqiÑÊ ã]fèA-G«üšÒ P¥iRÍëÝ Ò]}tdêthæ†^šÞZ×dÞIZöyÙ³ÜÀ™8Ê׈­ŽÃÖ¶Æþ6ç@¥“ ˈ%e´ójº4ÿäô…m4Ù´ÆÚÑM“ íeh?zöÈùz¯U…ãô£š­B0(S¬S­¶¤ !Øz»Ý\ßàÄõ ·Ñ‰xÄÍÒ*ÃQ[–­¥(÷ºâÌŽ]æšöôÅ t]Ù‚|¤øssdŽöW’ÞÙÆ #zÜV áP·fŒ«˜]hjt¡IÒ´sÌ“û¬UÇ„ÚÞ2êÌæã´Ò‡Ù³ÖìÞNw€ ôÕ™M]ýSÛÛ‰øèbkì‰|•j$®90fè1ÍHÔÎSW†«“Õ|†Z(ÎæGÁäÛÔìÙø® 3ØÑM·–•×¶Ê<|Œ%;†5Ê$ŒÄüdõ>Äq©ã]fÓfÓÙ܃î¾ÏŽÁö £…GÈ}st&èÁeîÛ7E2¿ RœÅ¨ÁeZ"@ÁŒ-æþ’;`<Ÿ¸ó°\× ÂUtÜ@ (IúÓgn:`v­'#N¯í'•ônáíw7ÑŠéàÅ­ìhIoZÆڿ5Õ×Fª²;é|Ø-vµÞXEÍZÓN/Èó¶Uk¾ÞàuëƒuPí%#wŒ…c…®ÕÌVökœbÖwôôQta€.`yaY^q™OJ>|2}úˆãÓ-j4®ÚrJ´-ÂÑ»w3¯Tï1 C(=¨FÅÑ}™æ×#‘%¤PŠò“ ½P¯®'|VûAó|Sºó­˜®Á»«ÚØÊÞ]µ—Î|« ¿ÝkÙ[÷Y}{<÷~¤ …«5ZLGéD þÏÂÅã‹{é ¦Öœ³%S²_ꜫGBê’p$œ¨Eõ¨™®‡ðFBaB¤GÅpm¿¹©Uœ›¸B¾ÌÕ×¹S¦ú¬çh-N\—ê™H¾a¨µN„šJI»²¾u®žÍº3ÂE‹ôCÐL¯úýZÂÓiÍU£¡Yð4±o2&ò†äI)?Î&ÝÕa6á{ÚtÄÚ¿Î9ûväÁHÏì½<Î5ã½l7å\P¡QáCìSª´m.cƒ <@Ö'¢ EÏ ›̱½Áí»Ó]]yC*…T®"*×KØGGm'©n&%,Ñ^ž¸ ´Hy ÒÊS­[Íæ®¹ks|êDi»!’®¬-W—D´yZB © ”Û³òºµâ¢ò¶»ÞšD¦ÔY4¢È0t#G{ßîãH¼}¿+Gl;'¶eb“ã³µî¹w×±š2‹)኷ßá¯0´x2’ StãGþ}mƒ­ë³ãȨ‹œO !ó"S4›s'çLV³ Æ‹X†7ÞÏé^Se´ÖÎng5a.È —Vú©n ×'x‚µ醵fëigIqçÒÓ,¼"ÚÀX—Ùqmk?­Ï ™×Å»2ïÚG@;μŸ½‰Â¤aøõt¨î&¤Vû·QÊ”>Øà,«:Oh¥TÞÄ),Úcn±zz8Ï×¥¿‘<¿ÕôºYwÄ6V £äŒ¼ƒ½þIÂï™]çÜ‘ÆjëZ›¥q5’3‹»nkš·X`p÷aÛNS‘Gk¿?‚xî^ÏÖäw´A‰ g¶«’©¼£'/põ7G‹j×dÿb…´/Z Y¼Uß,¡X ǽ,1|Ê PMÚÏIwìd›éï^‚z’ÃÁÍ"Éð’än.ãlŸsê ²A™'Ýì­1ì<åS—ƒgkTMÌ Ž›À™4•;Ï™Í[s‡Ì&òЉb„ÈDŽÀYæéýö;í&ßW´2FnÜõåz¹¶R¤­ä(³çmv¯ç´^ø‡“;Ìó«HÓÖNª4Oȵ§]Ê>&œ•ëJÜ<Ÿº¸îîlR-2k•õ‘çüÈx8z[âd˜hPYá<5£Ú€Ì€‹k!”™^i>zjôf÷ºK–Xßâ.î&]̳ï[ÑJ-˜´«„i²ŠÞxŒ–“1Õ¬Ñô–³æ…acîÅÓC‘°¢ ¸Ï…¶OÇ1p¡•/žDxŽo ‡D#¬ÚŽÇSžÜé–'”hÈ78ס!ÓnÈxSŽ N`Ÿ ]ÿÝ 24#H&„RUGªå!1íÌz ç”ÈåùšSǺ)[§Sà]8O»ð–QÙÕUA-e6t·½ù[mÙ®ÇÛô°“©ö íÈJûQ5%k¾ÃÖÞ5âYmû[N‹(çYC¦»SZYiû–qæê¦Ô±¾Á MC¤úÑd$âM"ÆŠ½ûøK|œõðóKâUæõў׳‹?qµÊÕeZ¾Q•d£Š—UoZ¨Ô(T#¿ž#ïK¶îsž´‹"ç=—r†iguöVÄ•6{ŽrÌpî ­LO‡–[#:8³ ½º\÷Õ@ߨê»í‘xÿ «ñc!™’Ün8uÿD™\œ_cöô°%¼³:ÕWour£ýbÆ½Ž¤KÃ},ßš‰å³¤znl™”[wrÛ «ò„´‚Z ?ÈfbÇ2)7}è¸ëçÓ[:=3Ý’+¡0¿¤$¨N8r¦{å\ªvß%ÉÿÄ)&ù¾–iU¤£p´€;@T¢ZÏ ‹èéàĤnuº³G&‹¢’¢ÂrŸð!N *ÒÙr½V™ÐžÏ÷Ù½Ò×·š}½¾çó}Ö* ÎÓóf´ò2qä&T¦ViÙÞäŽgÔÕ—ÚÒeZë±7RV|Ç£Û÷ ÐÀbø0§ô¯ógmy¥‘³ÞíʺޕURX<‹Óé÷“´ˆ’5}E|h1t€Aªþvú—_CÊâó™ÍÞKxüÉäÊ= :e‚¤j·=àÄ~ßû‰a¯¹Då†â]l ¢DîÝöÂ(`hQR49+;_d„ô³m˳)ZfüçúÝ”]ùؼSç·™ëÉ¡öº½ªÔù¬~Çåžå»"}¢= M,oŸm`b€ûþíœ$-OjTÁ„JcÞã/Ò>W¨†ΚÞJ_lõ¦Î²êÌÎ 3]ðŒ7Iq^ÃĬ¾™ŠzÂѤ!Æ”Æ8c³ zZΘœ|®7 Ú™s¢ÂHw yî )Åé‘]2w~4{à”÷[}žD¥°Ù\ï@ÜŽ‹Ü~”—QdÛ“NÄ9qÑ’ôD¥‘Ž6í# Ç#f¸#†¶8:—?uÜïöZi(ÂɈÆ›lãj³®Cv~íxs-å7‰Ì=>"û›·—ÖÆÃAÕ,3Þݾ3'Èž%Üß$˪{8)+O èI#¨ùµJÏE“¥…½n_æ¹ 6Ú’cÞ\”ÌáK|ñíì‘ãš·@¹MøK nnuÂiåiM;=ù£$ʇGGå¶vÑ ò%íÇ$—*’ƒö—ú]Œ‹8·™Ê5OóÇŽgOÉ ©¾Åžñž¿Ûà.ŽÆ’ 'Ä>-㇧mïó¼àûšÝÜ¿—ßÅ´\nN@È\ Î=üÍŒnžXôë Bq9 7ÂÜÚëY­–Bç«j.ó¹©zvÂÅ^‡*·÷ë†×éþ¢òþùsŠæùóË‹fU<[´˜rnAºïÌ/Íy>d÷†|\q4¡UÙ‹e†ÛNâ⺾9Ý{| ¯ð-JâW‹&Ž79›å`¬SH£"%AûZN,Õ“‰Y ¨æÑ5ä39¤7ÓqŸ½/$÷|Þ.*Ê©ß-íQ„ÿáY¯g>:í~ÅÙôžO{:R39 ÜÄÇæ„,§ﶨÜ'ƒ;Ú̵MN”S„Âñ¬L§L×#v0õ}žø†¨Y3ßDN4O#…Ùíϯ¹ƒ2on¿¼|šW#NÏ[ñ¸BdØqØõ<ÖÆU°EÛi]Ré$Jªœ˜«îíRÁ–©n±?LÙõw|ÈäõþJ^K”Û÷²x¾ýSF,]Äx<â§Ü#lpÑ+’Bék@Ùí½gÞû`vn4ëÚÍ#-¢â4O®™”Lu¾klñf˜”þ¦Žo#Üì×ìÝÎÙ™-8}t5åb,«¢½{W²®„Ì]%Žr=K§ªÕž ”bÏÔâk»ÿ 'oMÁF,Á]#(×Ús8Jªþß´‘›?RƤ»ÅŽÉ™|3·÷›§~¯yl³Ù°S|4¤ó®’þ8G F_1÷_ØÝ·¯žÃ3ß²½ƒ=ÏdÛå ^Wz\¯LäÅ—Gâööò^- ò¿p¿øÛÉ@Å+K+ 瓹Ùÿ$™Gò¸]ï<.Hò÷e¦ò'åÏŠ¢PöÈÿ¤„~ºœ~þ‹òWúóßè·ô7ÐßWN;«ÀI…ÿ»Bùwå?äãáòñ§”Ëºí§¨ü§3«•a6R‡¯èW._|ù•ýÊ‹/ye`ñ#¯ П c€®”àj׸J‚k\G`˜×3¸Jp#ƒá†;cF0ÉÄ4ŠÉh&Ψ1LÆ2¹Z’qLÆ3¹F’›˜L`r­$™Lbr$73¹…Éõ’ÜÊÄÇäIncr;“%™Ìä&Ã%¹“ɇ˜Œä.&S˜Œ”d*“iLFIr7“{˜Œ–ä^&Ó™Œ‘$É &c%™Éä>&ã$¹ŸÉLÆKò “‡˜Ü$ÉÃLa2A’G™<Æd¢$3y‚É$I>ÌäI&7Kò“§™Ü"I>“&·JRÈdŸ$ELf3¹M’9Læ2¹]’b&Ï0™,ɳLJ˜Ü!É“°$?`òC&/Kò#&?f²L’Ÿ0ù)“ˆ$?còs&Õ’ü‚É/™D%ù“_3Ñ%y—É{Lb’ 01™,—Äb’bbH’f2È$.Éo˜ü–IB’ß1ù=“¤$`òG&5’ü“ÞV.‰‰ò¿PK½\C7…ŸþŒ X/:com/microsoft/sqlserver/jdbc/SQLServerResource_zh_TW.classµšyxU¶ÀëŒ GEe´E@uÐQ“$HLÍ4Ý•ÐÒéjª»qÃ’@bPI  K †„5!$qö}ß÷5UÝ=›ïͼ7óÖy·ª«›8Î÷¾ïù&¿ª{î½çžõV¾ü·aEQÀ;×*VþëåOÊQþ6FùÞ‡p•W!\0®A¸á:„±×#Ü€p#Â8„ñ&"LB˜Œ0a*Â4„›¦#ÜŒ0a&Â-·"xnC˜…p;Âl„;Þp'„¹óîB¸á„{æ#,@XˆpÂý |áA„‡Fø Â"„GEøÂc#<ƒ‹‡°!a “K žBx¡aÂr„"„b„gJ¼¥+V"¬Bxa5ÂsÏ#|á„Ê>‚àCXƒàG ¨åk‚/!¬C!T"„4„Âz!ŠCˆ#T!l@؈Pð2ÂG>†ðq„O ¼‚Pƒ° a3„­µÛêê¶#ì@hDhBx¡a'Âk¯#¼° ¡¡a7„6„½ûÚö#@è@8ˆpá0›GŽ"C8ŽÐ‰pá$BÂ[ݧzzN#œA8‹pá<„>„~„‹—††ÞFø$§>ð„Ï"|áó_@ø"—¾Œð„¯"| áëß@ø&·¾ð„ï"|áû?@ø!Â~Œð„Ÿ"ü áç¿@ø%¯~ð„ÁDH $R¿EøÂïÇÀÆÀÉ–ýZ8¦†cQP&=ÿ|áK¾*ßü/\1¿hÍKª?ö(W? crÅœ¹+A¹2O ¨ \W¡Æòœ¡SæÌ}0>êYÃÇ*Qþ:Vùå_A™8ê«ã²‰-) †«|¡` X‹cA-\¨A™>2Ô”:•8wØlñ|tÁÇ=‰­‡Ì–úßÔlåFgT¡®ˆ­¥¥ZúŒcÙ/N,)‹‡×…µ áå¾X°J-­ŽÐÎf˜í'G{·¯v$vu¤0ìà±Ö iÛ’îLvï¡ñɳufk[òPc–ˆ™¼@¿V ©1µDF´pT-ˆzŸ)¼oÁ‚ ç-„9»™PRÖÄ#{/ Ìw½Oú46Ÿ¥mˆÐ £ïLjw{ªµ!Uó¦ùêQKÌM%e1=öûœU¥¥=ì’&Dñé\¦—ÑÄ’1¬«zui°R Åɨn4;Ž&ONÕ ›m›­wÆÉwò|a¿ ©Ú”x‰$Í­æ…zûè+ƒÑJ_Ì¿–ÖÓU_¥ma+ÅY›ç75ƒ¬µ==fcqj/-TIÈ"|b¤Äwžc©½û2,ÚQRÑUš3®«ùá@Qyn0ìÓ«Åì í  ënL4 4¦jÎ8«JmzÕÜ}"q~§¹¿cÔ•,rf¼5{Ƽµ>Ý空=é²Q'5ºwµ[þ/3ÞÉ&©nŒÏ«‚¢ü~5ÂÎ^¬k~5 †+JT_@ÕAÉM¶µ$vnËš*yª†N‰<”×B>»ÿ@êàN³½ƒ&ô¸$ZÓÝÀóÚ.ÊdÇÌÉüG†ÚÍ£ÝöyË@B†‰ÇŠI•ä²´Û“ƒýF݀ѼÅlé§IFD´1-sär-V¢V£ô£X¢éB0(sÌ3¯›í ‰ÍB0yªq«{Çßn£óq‰[¬–Ö,K]:5PîqÄ‘ FäÍͬpŸÂð‰,™“JÊ(„é8ÆFóBZÔòáHŽ_YïNv´’«i!Õ^é ÅiÎRãô[fÍqK앵ÆÎ.Z)ƒ½µ‹y`79ûióÉä–¡‘¡·»:=¥z\å@åYâ EUOª¦Í¨=aÔì¯ZÁ2¢kUU/óm VÆ+ù4Õ@”Í’RÏ<žOL¼PKê»$–‘ÐÔ#ýÛSm;íˆï$=¶<^¹†s¦ÜfÇÁd[Gâð`ö1ŽsFq±‚È$>²ßœ”N=šóöM¡ôo£$!{I>ÿ:5楬B¦q~É0Ïß~Xªi¹Á :|¯·”Mô¯ÇØ~ÐèÙ&SQ}qä¸ÑÛLª!‡g3ÔÄz9¿•Íö™d_Ñ»‰Nk¤¿&y¾Oœ M”ìÚaž$´¹T |k‚¡`¬”Ý©oK-E^û$xË"j¼½?ÑÒF#ŽM:VÚ¡ïª1—Ð9s=fëEZˆ]HõŠR&G×}ÕvZ»;]´½iÔïv´+¢¸¨V@ýÉTÛÇÀííŒuìÀ5Õyš}ô׳ –Øz#]9qHhIö¶íÄÑô“jXÕ¹I!÷«e}ï:L¾ã ¢Iõ7íÔe=l 1z»’)]aMvfÏ4ëñîíøµ8'˜™f{ es.IöÎÒ‘ü»ã!S•ÕÙLw×C1rƒ—¨Ôß,êvÌœn6ïä&¨õ¢±óµìa2‡‰âå1BTdDTìqa{栛ﰛÂhþÆå'ˆ”j¥êFQ,S<¥@šRoˆ*Æé–Të³~§ÙZÇå9F[ýõ"éÜ(·§ñ¹‹áÌ'u³€üPô'é°!æ£^îÒQqˆ™æv³eEÅyË|‘õ'd | ăò #ÐCïxŒÞ&Ñ÷f®Ó™,½È›\F²ÌòÎüª?nu) X¥Ã»G.]j¦6rq_XYX¸–cNŽj•[PP ¯®ä£"eÐ sÇ)*׉NæÌ«}VÈr5I·§ïfÉfydf°¶•Ž9ÍØeÄtùÞ¨·0dy*§£tž¦>“tJ;–©¸›BÇÑOˆ$duƒˆîÔ=Ø–51³·Ë­¦ò‰üÓUD9ÛÁÇ})c-#ÝtæY74-g¢8$j”䑺ԾváLév3Ó—OEååV€™ÄwUÇ/ÒT„ã¡»:™"öëYQRèá¢j9=¿,É¥_Ÿä~=£éÎUê[§æèq6¦h±®RרŠô<_($r]‘(•YAÛc¿éµ ÑêÎìQiJá\”3”ÿ„ZJt].Ñb«ÄÍÒ]«,Õè íÃDÒj0›÷QAæøÀT÷m€uaß;̾¼¹w‘G­é0;-}=cµ®H›N¥‹½ Ìâ»·TÍÞdçv£i—x†ŒLÌ äçV—xsül5¤ýtBU™Uî:ó9¢,!·d ÉË),ôÆ*c¶¨—ëü½dRXŠRîô³ï«:µ"¤Ã`8—¯¬¨š7.šo¢z‹3{í¦dçiYzó óóJ=™Ñc†]A—jy´Î˜úlŽÛüî‘&si ѵÃólŽÇ|õ¸QÁ¹{s gé`œá)û*ÔÌÈ2û)_•Ï“x½×8¼%mÝ»)|§nrÆßèÜÖzi`A༭ä6¯>¤”ë)…y‹A¹÷]e¬¢bOÛÍ@Çæ_ëÓ½Vá˜SE â#ZÂñKÿ¹N\· \VÍ=¤gŽXÖ­„]XxÞMGÏ5>¾ûœ-Ï@×ß•D™C “~)nYÅý*=£Ÿ-›Îã*‚hOUdë~¹ïDòÐ~£©Æ‰b‰¾NV¹˲Ïo¼u#c£5Í*FŠÐ(8ïÏâ¢i}\¥æ(PqyQ˜v¸Á§Ó>˜>pêln£#]Eý½zqbf¤‰ëQ^Ïmî›.yEvàÛ¬ôsU‘‰Úã¶7pó$5ã8a•žœݽÎ<R‡ŒÚèˆÐ.unv$Š6$à Ê ‰}çøšãµA£¹Ë·Þ 9øî‡²¹ßúÒA¿‹¡QÂ\K7¾3Øh6pÁîdùÉõ5Ëšýî÷¼³/Gâ1;uˆqù‡ ë5Ï?vÏ(äç@5 7™Q\eÆ©½lQ¢ylÞ.tšÕ-ñ½ÓÕ=­VSê}Å—Íqý~ãø£±•2Kªõ sÛk4€¯Ÿ©~sþšÂºR ©²È"ù­Þ=Èy"[×üZåüÊ _×¢Zyl~t}(jmkþK5~þ“ç¬ú ìåµe¥«È䬿|‰Ç‚¡ùü-Á~œçÏ'ÊBåOÊŸE!å?Ÿ¡Ÿ® Ÿÿ¢ü•þý7úm<ýèÿWÍëSà´Âÿ]©ü»òòñ8ùøÊ3Êûz­§¨ü§=+•1òÛ0¤\±úŠ«†”+W_1á*ïê+'\í¥%à \%Á5 ®%pµ×1K`Œ×3¸Jp#ƒqÆÙcÆ3™ÀÄ4‘É$&ö¨ÉL¦0¹F’©L¦1¹V’›˜Lgr$73™Ád¬$3™ÜÂäzIneâarƒ$·1™ÅäFIng2›É8Iî`ò~&ã%¹“É&$™Ëd“‰’ÜÅän&“$¹‡É½L&K2ŸÉ&S$YÈä>&S%¹ŸÉL¦Iò&2¹I’‡˜<Ìdº$d²ˆÉÍ’<ÂäQ&3$ù“ǘ̔äq&O0¹E’&¹Ln•$Éb&Iò™,ar›$O2YÊd–$Lžbr»$O3)d2[’eŽïd9“"&ï—¤˜É3L„‰—ÉIJ™¬`2W’•LV1™'ɳLV3¹K’ç˜<ÏänI>Ìä&÷Hò"“2&÷Jò&>&ó%YÃÄÏd$&*“…’”3©`rŸ$k™™Ü/ÉKLÖ1y@’“J&$ÌDcò $&ë™<$‰Î$ÊäaIbLâL>(I“ LI²‘I5“G$y™ÉG™<*Éǘ|œÉ‡$ù“W˜<&I “ML—d3“-Lžd+“Z&9’lcRÇ$W’z& Lò$ÙÎd“Å’42ib’/É«Lš™,‘d'“ט<)ÉëLÞ`²T’]LZ˜HÒÊd7“§$ÙäÉÓ’ìe²I¡$íLö3Y&É&L–KrÉ!&E’fò&“bIŽ09ÊäIŽ19ΤD’N&'˜x%9ɤ‹I©$o1éf²B’SLz˜¬”¤—Éi&«$9Ãä,“g%9Çä<“Õ’\`ÒÇä9Iú™\dò¼$L.1ù°$ƒL†˜¼ É0“·™¼(É'™|ŠI™$Ÿfò&‘ä³L>ÇÄ'Éç™|ÉI¾ÈäKLü’|™ÉW˜$ù*“¯1Q%ù:“o0)—ä›L¾Å¤B’o3ù“µ’|—É÷˜%ù>“0yI’2ù“u’ü˜ÉO˜„$ù)“Ÿ1©”äçL~Á$,É/™üЉ&ɯ™ü†ID’&“õ’˜LLtI’LRL¢’ü–Éï˜Ä$ù=“?0‰KòG&ï0©’䟘ü³×{VyŸ(L”ÿPK½\C7øú-jNOcom/microsoft/sqlserver/jdbc/SQLServerResultSet$1CloseServerCursorCommand.classT[OAþ†¶,[)ˆâµâ¶ [)¥ iÒm½D_̲Ê’vwÙ™"þ'_L´Müþ(ã™E1„â&³ç2g¾ùæœ3óãç×ïrxÚ.'pEG®êd\Ó0ª£×¸¡äMiÜRÚ˜úÝÖa"£³ê7®cw4Lj˜bè’®Hç¦JŽß°®úÂ_—–ت nóÐÚ¬®9Våy©™e.šuYá2ÏÐ]ùàÉ .]‡€æ]Ï•‹ Óæ™‘2¯â¿Ê ²ê¯îp§)I™™· úêŽÃéúžÐp×@?Î3ô9u_ð}œB3~h`÷ Lã>ÃЦ½m[uÛ«Yº^m¹¹¾Î£†^¼s¢5Ȩ˜ÕðÐÀòʘ7°€E K)ÌÇX6PPž«xÂP<ã ÓS…Ã| ~£a{U†áOEÏ#gÝ‚ †™w}鹞äaØ ¤½Vç/V*8V{tÍ0h–ç0ª’!¤Ê2ßjr!ÆÍåÌÉÕ&¯C—xå£zD—\±š8n#®ýÒåÛ>ÄAΩslÇáB¤gs¹ÿkË"ÈYõÃŽlƒÃ3;ŠCg †…Srõw³ãº„Þ¨=M£»J·•äÔ×AcCd_ m˜lå1²ã_À²ý»ˆ}ŠâR4w‘æTÔbLfã-Ä¿¡óÍ.ºúµÙÏ`{ènAo¡§E0-$iœÛCoüc„s‰FœVÐÈ‘®“L‘´úPK½\C7ŽùZBŒ Icom/microsoft/sqlserver/jdbc/SQLServerResultSet$1CursorFetchCommand.classµVÝSUÿ]X²]ZÀR°¥jk„d£j)ÕÔ*j£Q)AZ?¶› ,MvÃî ¾úWðä£/}é _cgœñÕÿÿÇs–˜IÀ139÷œ³÷|Üsçìþþ×/¿Â1ô#ÝŽ¡†q+†÷p[ÇuŒ°ú“Q&w™¼¯ù@G÷˜|¨á¾Ž|ÄÂÇ:™±ù¸N$«c“L°Ñ'üô!“œ†Ouôás_àKÖLix¤¡ p1þšô³U?ðü\Q@äb‹RÙË3›)Ð(ËWÓÞº€æVËÄmjÙ âCÃyÛ+§ËŽí{·¨ÒÁjéÀaz¥øÔNå ¡8-ƒjI¤Ê÷¦«–¥rlrtÏqu_ànâÌžrôKÎ D³^‘½É iWñ‘DrA@ŸÜ°eE9žh˜¸Tñ=[¹¨Žö¥D™(LK«(ýLrÖÀ›ˆ t½ƒDp4|e`s¾60× `ÁÀk̽Áä“›L㉆o |‹ï |K kÅZ³Ò%Ë]Jç\%—¤ÏæO Ø(X4°Ä–ËXÑðÌ@ ¦2ž V ø ëÈž±tñá#Gxh¹Å’ôºOS9×%x”¬ §§4T ¬aÝÀ6Ïûka˜¬W.S$Š}šr°ÑÝÔw¦›K¢Ž‡¦-êiÌUVÍ#¾ ,%ËÒeÄ7¬nBe_­JsÆ)K¯Jâ•Dþ+å;îR&ľqÐ’¶Šñ<žlˆè9ßQ„hævR#­3SXö|®C¢À‘c¡n|“Û-Ja¹aNÂ'ÓSÙŸ$yJêùÀÏ,°¥nÙÜŸñ;C4ZnŸ}"pÓ_öÿ³žkW}_º6ÁÔX’ŠÇÔïU¨cºj£‚Eé+G’n2Ñ v'/*~ •uì?;è]·êcj¼º¸(¹n! ¯9'Œ-‚õÝDG ‡n¡1 j#î°þ#C·~<{ý›¦çI‰ ñøh>Ôy7ÛDMY~À]ÔZaF`¾é—NÃ}3Þ3éÖfuæhr¹žü78K_1ýôÉ´¢›ßwĵð+/\oÔÖ›áÚÍoN¼þEè?€A’ÄÜFkÒLí@˜Ý-©mD¶ÝC«Ù¿ƒ6óú4³'ºƒv³§u±¡“N$aRvñ¥ÐBëofÛ.ô|ªeRÓÖ]©ñóæ6Úöp‘—ê í¸¢ý¸"VS+L&ûèÜÂhWäOÂt»~Â`MØE÷.^ÙBïQùò´èψ’Ô³+s^z_¢ˆ=¼º«‘çáÑRôRuÞ¦C¾ƒwk‡Œ“ŽÙ—ú·s©}\{qÌV OüUªn­Ÿ‘¯~Z§i /EPK½\C7~=ÛkÙCcom/microsoft/sqlserver/jdbc/SQLServerResultSet$1DeleteRowRPC.class•RËNÂP=—W¡ET_+ãu,HX(5.L\Ôr…’ÒjïñŸÜ˜h4.ü?Ê8í]¸Édfîœ9“y|ÿ|~¨`?…8V“ȪH`MÅ:6äl1$dß… CµmyC}h[¾'¼;©‹GpÌ}}нµtã¢m„n‡‹‘# .k )ãÉ•}.m‹ˆNl×–g ÇÅ…™JW ±º×åDÙõšn$ÙÑbéšAmN,~/mÏ ò$´w¸äï±s^× b[Áކ]ì1œ.X¾PýOFÜ-×å~Ý1…à‚á`&Ýeè{áévôù OûaÈÛslêŽéötCú¶Û«µ‚iÌI5íÆdZ¢pT¡eÞ,¾ƒÙ mÒ²è¢âtHC6Xé‚!Q±D¾FVÑð']>|+g#ÑwD_B`i,S0€åH³ ±üJ¨ÄbÏ!f…$F‘ ÉfH̨,¨dæPK½\C7 J`iÙCcom/microsoft/sqlserver/jdbc/SQLServerResultSet$1InsertRowRPC.class•’MOÂ@†ß…B¡ET¿N$ ‰7ÔKå@ÂA©ñ`â¡–J Õî‚øŸ¼˜h4üþ(ã´ôD`“É~ÌÌ3™}çûçó @ûi$°šBNCkÖ±¡"¯b‹!){®(Vj-ÇC× |áßIC< Æ<0ú[ǰ.ZVtms1H‹Ë:CÚzòdK×!бë¹ò”ᨴ0©|Å ˜~‡²ã7&ÜI:ÇKåk­1qø½t}O¨(èP‘bЛ1eÛlŸ›:4l«ØÑ±‹=†“ËkÿaÛã9°…à‚á`&îòÌ2ýáÐö: Æ|…§ý0äK­¾=¶íu K®×­7Ãߘ5í¾Év.HÊ*‰y³¸³þÚ$±h¢4HC.”ƒö4Â#Ó°DwNÄ£—Låð ¬’‹Å߉³È`™œaXžv&V^)êŠòŬ)äÉ’mF`FeA%³¿PK½\C723½<»CHcom/microsoft/sqlserver/jdbc/SQLServerResultSet$1ServerCursorFixup.class•RKo1þÜÝt³Û’@¡< -ÈKÚVâVÄBE¥€D¶B¢·eפ.»ØNUþ 7.\8´•@âð£ã•%¶æ)ÏÌ73þñóëw+h‡q¥Š…®:ãZ€ë*¸áØ¢c7Ü °ÌPæç/Ø6ìݦ¹Â°ÚÏÕ(‰\+£ÞÚļ/ ×û\'»Å›ïut*½#T?"ð?ÁwÞçIÜ<‘OE.-‘‘ I. ö PK½\C7Æ6sxðIcom/microsoft/sqlserver/jdbc/SQLServerResultSet$1ServerFetchHandler.class•R[/AþFËêÚR—º_“>T+YoÄKKHê oc{´Ëî ;CøO^< !ñü(1»Ä‹=ɹ͜ë—óöþü ` 9Xîň^-ŒÚÈb,ã&,L1ôèv JË + _Fnø±TòT»ê2T_Sìž5O|×Ûkx©»Oê*Ôé5†œw+t›tà›BëôÃj¹ãJ‹‡ ÙšlC^Šš wIó:ל¡úGµƒº·O¼IñÚâ1ƒ½yãÓ…¤P¦ä`3 }¶Û"í··¹h†;p0ÃPù}PÌ4W‘PIƬƒ9Ì3Ô:ܯ´òsgGŠk!WŠÃÒ_kÈsßÙîÿføÆƒ¡Xnœñkî†\´’ÝÑJÏ”i+Ò[±ŒL£Ž@?4gf™ë Ð ÞF÷!¡.ÃòÆï7Ö¸ñÓ—Jõ¬2Ôõ„Ì=>ió—DM|Eå_=zBwõ=™»4hÐp6mÂ0i중eô PK½\C7è(yukÙCcom/microsoft/sqlserver/jdbc/SQLServerResultSet$1UpdateRowRPC.class•RËNÂP=—W¡ET_+…ÄêY°Pª.L\Ôö %ÐbïñŸÜ˜h4.ü?Ê8í]¸Édfîœ9“y|ÿ|~¨`?…8V“ȪH`MÅ:6äl1$d×… Cµey}àX¾'¼{©‹‡¾àþ˜ûzϾ³tã¢e„n›‹Q_\ÖRÆ“+»\:;®#OŽŠ 3•®buÏæDi{ ·F’ìh±tà6&JÇs…‚¼Iíjh›’·½Çöy]ƒŠm;v±Çp²`ùBõ?q7]—ûõ¾) 3é.ÏŒº7˜®Í ÏWxÚC®Øê™cSï›nG7¤ï¸Z3˜ÆœTÓhL¦eq! Õ -óvñÌNøk“–E§C²Á:H§¼‰Š%ò5²òˆ†?éòáX9‰¾#ú3Hc™‚,Gš‰åWB} {1+$1ŠdH6CbFeA%3¿PK½\C7T§Ô\Ycom/microsoft/sqlserver/jdbc/SQLServerResultSet$FetchBuffer$FetchBufferTokenHandler.class¥UKSÓPþn[š6¡EÅJ€ÒbS^¾åQ´.$ˆ»\ Ø&š”¿ÂÆ%7‚#3ºtÆÈñÞ N3“¹œï;ç|÷œ›o?>}C!ŽÚbh‘D‡ˆ:ùNZ@FD]"qS@VDœ/âPøN.ŽnôÄÐ+²±OD?n ¸-àA½¬¹.u<Ӷܼéj Ejy‚¸ºnyËÔ3u‚¨·lºr·€»ÕÔÓ—GW©C MYuÆŠœÅ%*èvI)™ºc»ö¢§¸¯ŠŒ}:ÊŠ± +êÓ‚ê/§©»ZôTêÉGؘ£AÓ2½ûÃ©Š˜:g "c¶A ªlkÚ~M9…q&¯NSÍà`–½8þF§/}YÜcÙVÞ¶]lP/ÄNuÎJhÀ%‚Æ#ÎgìÔšÔ,£H Í0(a÷%Ôã—Npr€“9N> —8¢­UðN/s´¤ü €Ú?¶ êš5‚.R=Í[u}áçÑÂîÅ$»4Châ}vÆàO’wl°Š°·—Ùú ›51ë¥tæ#H:ÚEø=ÊÏU\c߸•r`ÕšÀ÷Ì"o‘ØBÕª÷Û…ð%ý$²‡Øóð;Úâ;"¸ÎÆÌÆ0wº8ƒ‰OºYõV:Ž¡•aÊæüÇj¾¢6ynµsÛ¨ÙD”íì nBd‘ð6ªÊ \ô“±ÿA·Ÿh‚ÍÚŸPK½\C7Ó„.£ Acom/microsoft/sqlserver/jdbc/SQLServerResultSet$FetchBuffer.classµV[wUþNs™d2ÒÒV¬‚ :ÔtI(ÅÖJoZn‚&^֚ΜҔtg¦ˆ?ž+/¾¤°d-}t-~˽'é$•`ÓÅò!{ŸËÞßùÎwÎ>™ç/þø@ßg1Œsl>bó±Š7q^Á'*R˜ä‘)6Ÿ²™fó™‚ *r8¯b³læTÌc!‹‹ø<ƒK*ùË*¾À— \È]”¡½6»¹º*}í²ëJ®n Þê˜\öîH÷’å:ŭN°$-‡ÛùEÛÛ(mÔlß ¼Õ°üP¤Oú¥ugÅ.-Ï›ÍÈIJ B˯Xþ“=¦q4¥fV½M×Yò~U¤ã¹’‡»hÝüoLóÆ¢u—d°YMê;Ô_±[Z|HgEü°æ¹Á|-°Vêҡݘ?¹áš k¶@:\«zYàô~)|zªæÖÂi‰=´ì’=v‹Ä˜óã€]—–o¶%Näy6åË@†Å‹î=ŸW•³WÞ#Ù „WîÛòn¤„‚«Ô·l[~¦<.0³oþ¢Ó‚Õ6àf¦ìz¤†c8ªá]6:Nh…!`þÇÍÐ×4¼‡ãÞÆ;㈆÷qT`dݺg•ê–{»4³s|ßó\×PÀ K0,k¸‰[ ¾Òð5*%¢YŒicšE¦Y|™¦†*¾Qð­†ïP˜|] ´I_[Y—vØäÓ`|Ò^ï`ù"övëˆ]¯4z¢û¿]÷b~loÊž”®[~À”Rw¹!Pé¹vöŒÛõÂð&z<”X`³6?Ô:åéqžç霧wË;¸Ø¾Ñ[ÏOPKàD¾cÖ ýš{{r¬KBÿ¿†92¨ùÒ‰Kƒ^¢p3 J¦¿-@Aµú¸¦"Oõùc‘äª#?Âå€h” >îeè7Š©Ÿ§Ö9$)0ŒB ã ’Æ3¤*ÔH7 ¢ ›¬‘h ø=BÀŒÆ !òé(rg¾Ï_mÍÏ>„º…!a @Ù÷ÚóÍ"l)vx¿§?Žæž{î¹çž{¶{gøê¦Û4M[ /­ckø &nBóf<Ýp+Àm&¿ß¡ó;u~—©™ün€{@x¯Îï3µñünƒÿÿ÷ù<=`ð?¢ñ`ˆ?lòGø£ =2øãèyÂàÆÿ“ ÿO<ð,À_êøsü¯xú_€çuþ‚©Í¡¹©ñ"ÀßL"x àe¼¢ó¿›Ú®üU¿fjÍøÝÔò7Líþ¦©­âwƒì-€·ÞÑù»¦¶÷ÁñÈú!šâéfô~„§ûOŸâé3njaþÿ0ø?1Å—&ueðÑ¿ÐñÜ‚ ‰Æ€±†Ðñoè¢Î¦©u‹qºPº¨7µƒùh7ÄCL4Ä$šAL®SÄTSLÓ!å£xšA3I±$y gxk<ÍÝW¦ö¨Ø`[ClGz ß ½ŠíAµƒ!ñ¿#ÀCì„ÿ&€¹;ÌØ`W€ù˜±`š ¡¹žvØ`O€Å{ì °`)À>ûìgˆoâÿ[¦h­x ‘ÒEÍ6€v4÷GÇ~T1Ä2CˆÇèy9@§!º@¶à €(Ô3D7=+Áb•.Æ€Õ¦X#ÖšÚ•â Áa½h®‹¸©]#Ö“&‰'K}¦vèGcèÀh®×Eÿ€,ж.uq¤©Ý*r@æuQ0µ;D  8 Ou±ÉÔîG£qŒ.Ž5µûÅq¦8^œp¢)N'£ï 9O§éâtüŸp¦.¾ÿ³tñüŸ­‹stq.ÆžgjO‹ïù=€ó qx\¨‹‹tq±!.1µÄ¥¦ö¼ø¾.~ ‹ÿ0µ—?ý~ ðCüÿ—aøÏ ‚Ëuq…©½+®ÔÅÏMí}q–p5–÷ ,ø? ñ_ðßp.~ijŸ‹kÑøÀ¯®ÓÅõ¦öÙ<þ–ù˜ðo ñ;`n °#næ&CÜŒî[ÆüËû¡±IÜp;ÀwÜ€@!î¸à>€ßÜð€þð ÀC+Ç4Éf­\(Ïç­<Ó¶î^½¢­7ë G¢m¡îÞö®èª–h¸·«³c5ÓX„iõ!;›/ij…•ñtÑš¦?δíýa±¶èʶho¨'ëŠVŒåL›V¢ E»::zcÝ-Ý‘uŠ·†wض:ÖÖη™6}HgxugËrwè;L›êê¤YÑßµ¢;²<#¶½!§û=\îö†wt…Œ¡÷}¦Íª1xeK(> ¥å¬|1]ˆY…H˜iH]…h36m÷÷CŸ³:Žˆoˆ7 ©t3p©ls‡Ó·”i2_Ș¶°#agš3©DÎÎÛ}…æü‘鼕Û`åšH®K4Çêˆ9ÍX!^°2V¶@CõL|cÔ>жÈÈX…x8^ˆ3m¶;o.I³Üë¥1F*JÛy+I;·†iãÝIBÅ\ÞÎE9!áÎY»ù%¹£ÅÔ’ù¨O¼š6?¦;s)±mÙbÆqu+éθ¾ ãï;J#,Vc nû)9XD>œÊÆȤêb›²…«J0m¢J#MÓXš¦±4M#¦i> ©1`N`¢Ù¦º¼Ðј²}ulU‰Žd‹ߪ&d­•N*šæR“!;I†;®`“_ºFNü›æV5}ra×__$º~«Ð3܈39ØÔ|ÕNÙ´fîJwhx¸Ñ`Pt=¡] p=szSd¸€`;.¿>5òjLSÄ™ÌlÛ˜°Í!…&Z*|Ž$&²±û¤²©Â~L;dê“Fg¾‘ˆ#$Yab½Œ&È!:í‚ëµ0'´Û¹£â¹dW6½‰,)•oÊÆ3°¤­‰kªoSy3óÁ‘“|vŽî]ܬa#õñ|P׳‡Pµ»ŒŠäi2oÏ(i5Uߘéî0Š…©dEô“MŽN¶&"q­ˆ¥3…õdóÅÁA;ç™b× í³³¥´Ï}ò\î5$!‹ßïÛ’„êȸÚSé\¨™ ké’»Gìº7 Z‘lŸÍ´i5#%¡¬$ …²–" ÂŒå,5 #«xk}¥Ï˜i;^RÎxÒn$3˜vŒûVŸH[ñܪx.K£ÉKê26Í!@À¶Òq¸‹»[äÛ ½Ñvšž½z­ñÄz·)y(Ôåg@²íV«ÏÎYí©\žzÆ¥ò-}¤ÎŽ8Z:Y¾‹›Ê»¨që‚äöAL]¼<¼½vcú<GD÷Y¦.(—j,éÊ12#¾.O*Bps–ÑRjNä r 7‰LJ¦ò ZeEÞ îï±ÀUˆ>!б<ž[Ï´ùM#ŸÕ@ì`AÑ<ÚÄè°€åètökJ"¢%-¯Tç䶤9–1˜³6¤ì"éE%âÙ„•v½×EÆå…e§Ê»ŽS¶·~ÊAùFñÕë¡õM‚{©¹&õÇ)ŸÎ-ÅTES÷ÜÔ÷ÿ¬[Ò$(¶N DÁÙ«’w¦%ŸH¥üü0³äc)»9WI¼¹ÕÂL Z¸dkª?l%R™8y¬¦ˆÏ7/ 4—ûˆx^Ƶ©'8¬³ñÜ&_fÛ&Í× †k\µ´nò7±µ!á Ðͪs×¶" W!E˜†arIoØVàHÔjk,@5ÇOñÎá!O[Ùdé¼Q‰íSïóõd÷‡OD%žM%¨˜÷ý¿±bþåñÁêà¤>«bjÅ¢ åí_kÚ^7tÿ€óºCUºCn7Œ«%—‹SŒRÑï ‰`Í/º¦ÌÛo~\ÙG0.o #Py+iÜ<•¿§ärªRïíxŽø8+¸û2%˜KJçÓÍÌ$Ûª©v ع6‹áÄ&ji÷t†û*ã\ºJõü¤òÑ¿„›èÞ3¦é¢¼Ïm”’×éæÊ­NÝì"½àCذu.Ö  cšÜã’7Ü¥„\îÅd¶«\¬Ô ÚxHê­®š?Ü+ËOéolSdmk@.7ÓMñù•òK€Ä $Nàq*¯2‰}f¥s¼|rì°²ý…ÒMLE¥RZ×âÃÑäd_Á:aš‹f§Óœ<û‹”㧠ʣ¸ç¢ ›Q­Ãá0·ZOC»oõ{Ç«jEÆšZ­µ:bµ:"µ:–Õêh¯ÕáXZµ¢­¶íT“zèñyFJ× «Ž*–¸y²’5V«fkcíµV³½j5CUûª–bkÒú c]ª|‘0>i—®¢+BLÛeäãRÈÎdâÙäÒ@Œòyõø-‡×¤xÞ¿õò¯¡êÜÛQ@Øo9̜՗³òN¯JÚÑ@³Þ=F¹üˆÑD·õCwÞ; wÛÁ;g<’*§vó®ª`½Á³VàZÝ WnJ¯WNÙŽJd~ÈΩutœJd^ðõꈩAVnÚÑŽ›åU¦ó·õÎä +” ¨V §BÍÔíÖLY«ÐL¨Í'e¢ú¤íÞ :GT'©¸Énò`ÎNXù¼[Fx½óF}Ñ îg,ðzƒø»WÃÕ5¬±ü+f3ž€ ,`Ú¡£½-W–n‘Gù“-Äd~cQ°±Ç‚EL;åÿA _o£“à‹´'äÛ}ËE±»¼,â±ökðØrqcªQ_l öq¯¯«Ü"í“H;×ðŠÃz¿‚_©ØïØUŠ]Ä.Vü,~šâgœÊOÓåx%'ð«™Ö0Ä‚;íB»]Ì&Kÿt°.“tÚQØês‰r9;§Øõì:%'ÊIŠÉz)Jõÿ]Q}Ià†Hx‰’“åÅIVzšÊ4ÞФXu9MÉér†.g*v9»‚il®’[áA5”«ê%Šƒé&6T¾¡"ü%À› þë2œO³°sÙÑŠp»P—³”Üš§Ø€9Cf–%oñßJykü5­‘=ÈRr¶ÜFÉmÑ<…J1ºJâVìv¥¬Ê,¤í*éWÉíØJ6Èo(¶ ’œp;šiKÿ¯ÖhWäöŠ]ʾ¯ØOÙeŠm€žw€ìÐÅ hã±ò¹£~-Ší¾S±ÓØé0£½î í¼sœÍ[I%çðû –¿=z,Rác%»ñžÆÑ•õ܉d“Mð·3#À1ø*Fɹõ&¨ývÕPÂrÎV|¹Óíhº`m,4/'ÇŠ÷ã–=ƒɜ ”®b¡«/J[maE·“ ­ˆvXi­äÎrPTØ›L=Ú›)æ!i«UñÎev´·8ü…‹•‹;[Îr,¯Ë]”ÜUÎ×e³’ äB%±Ûaä°Ïò_)ö!žŽbÿ9ük7¹»’{ðqdEXÁ†òû ™»_î©Ør±’{Á¨É®%ŒöfjWì3âÄÏ¢ÇÂ;à+W’õ±¡×[žx ;ü4À3¯aöÆ}Ì>QügürÅ>…u½âWîxßà,àS€wÐñÀG¯bî1˜›¦~ƒÝ©KŠKÁú-,r€}Ù{xú@ÉýÀásྠ#QZøÐ+ìÉ•=¸¹Vò[0ñÈÞÊ.sÌ‘ªÀBéìí\§·çìŒw<‡ñ°Û°wТùÙ˜6$ç#ÀИűw IþÎ ÂXТÍzO 0ìï\˜·äúóJ¶Éýuy€’,òz¹LÉe‡b÷²û\¢¹œê¶jg %;¹®øX² [ZÇe…µz7J® æÜdO*®äAJFÑT¼ž‚íÚVÅ'ð‰ŠOæÓ0WŒâsÅé§Â#Ü‹%»eâ3øLªŸËÎ]‚’+å*Ågñ­ßFL€}â‡@‡ ×J®–kß–oÇ´Å[Ýü›\(k­.QòPìíaì2]ÒF.ãŠïÀŸ#×à;U,ÀÍDŠÏe(>Ï®§3ÅðÝȆÙûö¸¾¢ÂfÚΣ…½’ I¡Î’}ŠïÍ—(¾”ïÃ´í¢½ƒv>¶’Þ±$$•ìǼÓýœáÆu²Sÿ£…*‰Çï3zºÛw]¸gG”5¢sƒ? ð*¸-›°“¤˜@ºoÝÂÊ Œ¸¡xo‡E ØÍŽØ®·¹ë xï„׬—iDÝ_T®‰À,Sa\Î=ÐÎD6À À‘DUòz÷bGñò\™Û"—Œ•]’]φläœxŒöÜü»åÊËŸ3žåG*¹ARPù1û‘·Ðù){¾»GŠ_ůVr#EuöôOñûƒu„Ü×íBê@R $g(ö0Øë‘ÎX[´»Œª!ÜÖÞÒÓÑݰ²¥£§-¦ä™òÛJžÅ®Ðåw”<[ž£Ø]0Œ-WPå…‡ 6•<eË–ó¬¼QÁ¦â𠿘_¢äyHd㜗Õx›»õ1…7gƒ¨Q‡"Ú­žåw±ºÐK8x{GT §Ã‘Ðú÷”<ŸÝÉ´iåË”ƒ:!h¿†HÖ¦X×`ùȆ>ÊÔ¨,ä É"âyƒ+TƒûbC_jcqp mbëK<õ·ƒ åÓa8lÿJ^ˆâ|b*^ÈàNNJŒl¹Î†^8”47³v×ôçLÒ:?sÌ×-Ä}¬b?DtAPŸ_m~I´ùmþpÑ”¼Nx±¼dÔ !ðé]9‹†œ4Ééúü÷=u8¸†âE|‹´K𢥟.áPq×RÆR!´ –]F¸  žEiÜÖÕ¾þ)õŽrÍ»A3ag³~=ºh”'øPi ͹`KÇPž/Øþ»–Fñ ¾)rõ¯ý¼ð9ŠK\ï¦Ây}0Æù$ÅýJÂ;ZQ ÉÄ×»µt.…ÚöÉ´ôh/2jØìûš7ýŽd_çÞ„†É”ó­–™ |ô2!;ì#Z.-Ë×ö\ ÔQâä~!S~é¶§–>÷®ønflŸw­¸Ú÷/Ý«}0£ün·ô5¸µÁJ“ôí‘Î6*;jP,õo5ª|JN‹Nåñè~Ï8û߬< xTÕÕç¾yYHH˜LØÂd$,ð2MËb( ¸€ÕÁ-‘¤*P@Á¥®¨umµÕDADÓj\@ò†š_Ŷֶ¶¶þÕ.mkmíÞÚ½uå?çÞ3wÞÌ»ïM‚|ùfÞ»oÎ9÷l÷Üsï=/ DhëÍ^µf-Bã’¾ýÂyõæ.ªTŸ×NCzrËøj'¬åònÊ–ôI§ÌT¸OèŸ[£ÙÖwv^°|Ýk•ÙŠ6¨j0û"YXV"+€å±Â†\{G;:WµãçDeU@Ôï£\G ã-[N5ct à—¢-[ÙNÃjhƶ¹§ÇƒÏSkt|'se…§ª8Å\+ó‘x/ï‹}f,Ò@e\e«hŸ}4@/ÄQz!.ÿ³ø‹¬:”ÙáP|}¿"‰ŠÞKea®·ƒU0É „‡ZPŽƒ¡k5‘åëáŠÜôCw¡¬€¦—©‚F¤5 ÛÕÜÕÔ ¡Á©$rc>…B<‡€¨L¥aH,êB•³b.Tdžªûaû`¸ #°‰_.Ô<ÉtÒtf2):£nœèÔªûÝ¡îGã½&‹n&T…dˆPÕõðÏ__æŸcØIUìÄ{¡nÿþˆ}LýQ3ú˜ zxŒ¯Ы¾ˆ>6nw4'{aœ‹ÑÉ*ZŠÀ®ƒ"üؼÆoƒj®·wAyL@Ù'>'ŸÖDâÂà8zvwö7Ç…†ÈìD|´:N WØm½PŸ†I-vÐvmT:iˆtA‰Ý vĕ֨.4nˆîƒ/H†éÎFaßÂû=b/³v2F¬H+ù¬¤ËóÐÔQº;M.Lî†õxŠ~<Å…#»¡J²žeVôB²F/¢Ñ…faï‡ñ³ò%ò&ùÜd¢ŽƒÅp”¼’¯/†3äµ Úå5—Ù§Ä>V÷óøŒôØ‹ò~܉ôÂTúšF_Óé+N_uô5Æéƒ);ºZœý0³bNc/ s÷Ak/Ìr"‰P†Ù¨3äŒTÙBê$UnÓª<†àí…9tÛ ó´ðX'Ñ Âa¥£/UöÁq)Dž“†ã{a¾c ³w@é0¤Qý FG‰=<zµî'¢0ä|dô©]0DˆØ ûaˆÚp¹°0ßt1ª~`ôÑŒ^ÍcΉ-"lRº-­]>ÉC¯®ªäª—w@´ªäUnìdá{Ø÷kÌzƬ‰ ¨Ø±"…²8å+šÇ‘<¾³²ð²ÄÏÜÓ!2- –©O£M`ÎFUEÞV˜'í€rÉæNÙéÉùØU‡°\c{8!ÄwÀK]½BYTõÀ½Mb&Hø”m02Ã+^b§±kQÉh@Vj‘À².á!ÐŒ@<ÏøgC±§Èh1‹ÍQ¼Õ:·€Òxín˜ÑËS±ÓZ>±Ô~NOEúàŒT< ©e-¶§Ç&Š+bgFŒ~Õ õ>˜Ö•+õYÁFúZˆmÏBTÅh³uÖì…sö¹.´uAÞcdlwá<;ÛdTRóÎÊ.°÷P0›ÿäq>ÂutAq÷ÁQË…N|°J>x‡BÒjÇÆ8Â*,ÁßÎ÷3ó‚ø3s3Gò+pMdV­4À.©“±µÍû`ƽO¢Ÿ×Úm=[- ¾o]$uaޱƒ­¤\ÒÃaT¼¨gñÑpT¼,¾g¤¼Öù¿<ÎÏÆ+š9ÌÆT5ÉÚÆI–ÔïÆiTÞtDÒ°^ÒÎ'lQ…ËÞ<Ü;>• ß~úƬ Ÿèãm¯j œ”`˜Ø€Ÿ~ª¯‰2BŠ]â&Þs‚¥FKUl~Q’…í‹UrFcé_‚ŸÍøÙBÂ_JÁ-ßÑbTñÅÍfh’š©X¨U‰ïÄq¿ʉØeÝPJ×ËýñáÇšà_ð9ã›F‚òáø}žlCç+âmêæÓ´È,ìqDvÔÆá…žß}ðÑUL¯ $*^‹9T\±è§ËÓFÌq%Þ–†+zàQ§ˆ~ãÂUÝ]¢uqf¢Íîàç™Î·¡Z„—Ûsœzöká'-ˆbÖ»aZ¸× ŒüI 6ñÝ2a&®Æ ¡ûà_M °Œã”„˜Œ–aG×`B—'´…BíTa”0ˆG׈¥ž»aRAíDú©AU‚¬™òˆ)/ãór“so‘“úN(Šô¨¯6¢ä×’Úè§Òé9fRÜžu?¦Œûd†6‹@É¢H@Î Ç2ršAâÝ,¥çqi¦#è÷Y;dh<ÇÎtrJÖ£Õè´X"lú™ROűO¥?ͨéŠ4ƒ¤¢öÁt?ðëøiôM~|`úgaæ|ñQ9MÁy:‘‰²7€q4Aá§‘Eü\'¯2á@Ãq~Æwè¿¥øóÖ)(øöœq1ú~o —#ÑÏ´D],Ñm‡$¥€—dÓàJ^=HÎ3\KöjÙý†j eå*Ãþ¹fx33|Á€‡Å÷ë»LÜ UÃÐÕ­ÚAìüB³ó2Ï;_=<ì¨x—á‹’˜¸w©¬´·ƒ'̽;Çîq¥aæ]b{y×Õ7d–y­Ø¸ñô¸_Ê7ôt|+}æ!I¹…‚«?èÿR“Ÿ¢ÂŒc¿&JŸátµÃމP€ˆ£ã›‡‘Ë›ü9ɯ4ùÙÌe³žšpI—?mR8½×ûN´T1m™þµv ™éc™ékÍ©Ê[šñÌx«‡Çk(´Ú¦iM2ì(ç,~ˆbEøÍa᳿Õ"t²)¡Âq,ž£IÓbgg¯p%4XŒòý×5ä\ß•QÊ.TNðñ rjûãïuªÛÆ!gyxª{kTWÇÎxo3ÙÀ¢—<ɇ¥’cÌÔÃâzϰˆ?"';‡þõ'þõø‰ã§N†r`úºeÒÎ9™”è4³v0ÃU •xfé{2q¢!5¤_0»kÓÀYç‰kç‰Æ}ÎSåÄ·CI=_:‘Êâe62ÍßKvö½Ïе1Ûý£9—ñ"b­9J«§´š·6ôXŸ;ß×c \d÷´ ··VÁ+¨Åª*x/eUðHà|¥—JôÞŠr®S̽d7UI»U.w‘Ò䪸q«À%ýŸ¹È”º¯ïÀÔr½eýg½h¯ãl¨Š©¥ˆ”èáä9³jÿ‹fq!ïˆÌˆÒвŸÅG-.|Žø¯÷³ó¶ø+³ãpG’ ¾#³ÿ7ñw=ÿ(kÎ ±[T4ú¹²]¸“^[ÿÐÎÒÊaèH&\$3q–êóÛ0®`ø3æ¹^B’´ýqõŸZ—ç³¹Ï Ó29À´|´ê¿3Ù› ÕV´ÃÉ;‡4£ýà_âßÜÿ߸ÿ·Ò•àpœ›éš¶Ro–Ñ=0ï·mÇ ƒK¤'3[ýë\Þå,—±äA ¯‘Pqγeè‰?˜ñy ©³/ßbÃêÉ]¼|%»xé>øuCPÿ6n'7uhshD¯î¬ì²îZÖá4y¹yvý/zrø;|•š™«c¾9òyGƒNâ-3¹›÷l+­¸wI#Œ­mvá.¹Ÿ÷¶Bâ]ñ‹WÉ#Üù›JB¼¯·@®…b¹ º$#ZUäw2†E~/cXä(Ùxõð$Þ¿ßwg÷ï±±¦ÊíÄ/ªíÄ%y{¿Kì~U²É…ê¸Í7ÏŸ| S€üUâ<¿-?ÔbÌæýífFßÍÙ+¾GqÐL…ú© Ã2²0ÇÏÂÁ@æøX@#f€³ ×gÛüð" þ^_.@oò1|Û3$¼Ú£Ûìͧá>šîGu˜àÓô‹têÒ©Çù3•8Sa·Fü]>/¡Wý¸ïeP*½ä‚|pIÒ…ÝI»J+Æv¡›&"Ÿ†/ ¯¿|š–:M½tDÓÃ<öÂô&SWEzƒX‰Yæ8¢qáQ?t±UÂÐÍMŒMŒ«~{Àcµx}|iÁ~‹­R¦4‚VËU¿µ.<á¤5²œ5²@käÉdô}R‰}˜T2(X%{üÐe:WmaA&K΢ï°N–8"éé¶]dBœ<{]xÊï©eVyPÿûüЃ­ †¦3;ÒL kFõß;ÛA¹Øs„\ÔUÚ=ÄŠ2ôdu¬õCmþýyÒ&ý bUõù?t̪fèj†.qâÂ…§M C=.ee]*|˜gI.w¤”4g²æúÀÿvä˜5ÜìÈIc¯#¬‘fw) u—Ê'Ð]žqáÙ' k‚ôùœz”7÷_ÚùãØÿžÜ@±6¨ÿ¯ú¡:2»ë×ÂÜ5¡ç|]}Ý}„5Ú,ê{¡¢z E}Á…oHæïú¡'XCÍûr˜y'X A]}Ï=IŸ6±yÇÈ®lŒ¾_8M²œ ._ñC7ZIc0ú_hS`02‚O6£³²Áè…ƒQ£5%0z=Ò:Ê(Ï«&Ðæ@yŒà3ËsvVž× Ës¤õñ@y ½NÕYB Ÿ“Å8´~èÏò¨Ÿã¬iÈHätkF?imµhí(±”vTf¯œ÷G…w¦Õê9ú&%OåÁVUòš&ôã<5‹¦‡ ²I…‹Ÿ¸ðµÏ²f÷[;Çô[;Çö[;s‚ÆäOMJ˜ýºI²yýäâ8±›!Gqô®"ö³ÌŠÆ€q¼5Ÿ1îÄU•ŽdrÔŸ'-JQ‹BST•Ÿ’}¦6ɺ¼É}ð‹T¼‘jÂì5öË4¼™†_-í†á-¸x+%¨Pä7"b§á·Ïå¥0åIäëX8 ΀_û8=!Hg¿3¥ê ŒÖ“ôöÕbkaP—¿÷C/Ò{Ãy±VÆËä?øO¨¬½XCObèDš¶¶Éíu0E5[¾½úgBžÝi"°<øß´£6fŒæÝŸx‘Ú<Äe ç?A—1ú/Üïb^tëY‘2óõa…jNìzÑj*zôo%t͇ŠÛMù§°dC8™‚¬?ûÖôô/*táž*?% Fß都©Ú4ü% ûëTN(l™Nü©´Þ&俆!/³–!ÿÿ†|šõ #r í® r* ùtë -´Úåa¡ßëƒRuiøGvÊZaVö} 5> ÿ Ã>Ó:ËÜ7ŠýLª! ÿ Ã>Û:‡±Uœ“ØÅÉ0¬sÅcF,;«Íj×å‚ «Zqúa(ÚyÖJFÃ.:L¢-mR+·@Ä«3ñ¬PÄUÖê ijC-ú×3z‚V¶˜·vA³Ü´ûwM»ìŽŸ£5Ö'õÒFM5“e(H¤á?’5ªwá¿5¶•ìƒwRʼnëÓð®fõ=?Å 4Å™LqЉâû5vô}IÒ.HòBë"&9ƒ‹X“&’(&?LáóƒaôÖZë˜ÞPö—R'ži&Øõ gÍAXR2ö’2 Äèó0ÊK¨¼>Ç\2SÄ,?¾Rô›V”V´_ˆiÅ{…õ"D«Ñ^ÂN=%¬n GIWuA¢ÆV,E´rDì†s÷Šb‰V¢ÐŠ%Z±Bkf´wR™ž÷‹R.ý/*娿ª%xS˜OÒeÉ£x®”Q±(7„okƒÖ£šû‡d1j]1س7†¢T˜"õ¦P”JS|¾8eˆ)*_¢Qlö R犨)oîe¼+ªLñwKp/ ®ˆ™‚î¥Á½ /T"®uY(ÊPS¸½<e˜)Ô^Š2Üd?Š2Â^¯ EiŠW1J-+9êAI¸¢Æá àŒ2…°«ÃqüµG® Ç©5á\ª‚„å:}®y-¯O.àqZNÞXãI«Å:cÄfŸrÒGȘL‚¬TmO<éÉr½€ ÕžOÏjc±+Æ.IZ®—´é+âŠñêKP¨&pŒÖø ^=(Éi9®˜yP-&º¢ŸLê‚ ‘ÙêÄnÜA×Dsf’Få;ò=©71g¥Ãé™»º´xÑÅÝÕ¢IKß'&ËD¡ÒbŠ+Žì:µÏ9áN²Æ«ÅQòU6z3ªªZ4³ÚEC£+>†ŸïSý½At'§÷[Ñ i1MQÉlu’oÞ¦\óN'óÎ@óRáy7”-¦kãst°[·9i‡õ°¨6h‹¼æšûÆŒ¹a¿27ô&sGǰ7/»¤„Ùc|mýxõCì¥ÿ4Çç¿M\ã0&Òg’Tp>6Þ슣»¨þDV ü†ßÖMڄ׬‚ՇńÒJ-d¥™F+!+Ë`v¹Δ×\+ݬ­t5/*6.+-`¥P¯¿E«l/¦WRU@žÊª"â“àìËa6U]m¤cZ¦~«fã"Î-Ûkzi ”°Õ©‚«eÑ£ª ¨WÕ<ª‚dD·¬ñår¼A²PàuË”êE2o¨æØè6]y=¢–Á¹$[Ÿ ¬Û5« †ªÒûJþ—G¬Ïz $•š[¬æ?Hõ¡»MóÓÿœ¦?éO?$úü¤ï°î ¨ æß¿ø¼õ®c;•I|UÉk¡K¼Ï[w…NÀ­~”»­/tõjhWw[÷„v5ËÒemÓ+Á+9#Í6ÁÞÛoØíÖ}€½¿ß°;¬“Y ^ #XöéëþGéÿLsn1K-SÅ$ò3qŒô³>?«ÇrÁEµ˜ƒwµòn.Þ%²ETT&æñ‹„T±š÷ê  ¿Ç¥h§NÄkiq³[Gœƒ.Å9¡[ª­çT§dšBÏOQLª•£|iB›:lª6«td²%Mó‰~¡ŒôédÕÊ Å̹gÕDª]Œ8be±r 5ŲØIÛñ´Œ‘’é1nàm ZYã\-&íT¯°,¥ öfQ¡êûª|¥}%»o´Ÿîˆ”<‹çXÓóêÊW×7À‡2>böÇ8Í8Úíái/ƒ¦ñ‰Œý<Á6ŸòA–ÉϘü_DpVÆ—øJÆA¶ô5³¿Á9 ;–Xû½ÂVÒTË šç0µ8µþCqJýТq¾E·»MÓ}Cš“Á‡5ï[[5Ÿ yP5êÕÀ4¹÷<¿¦•Eå˜ØcÅ´©rL¦i˜´ÿÓˆƒö‚œ#ìö2~–ôœ3ú¨!¡…Ì‚æ/Ê’ÿë%HïŒM¤sni^ÄEÀr–óP;U]1§ÜV’U¸¸:øêz•É¡ì1j º6`ì#5®ÔŽÿ‘ÈŒÓkIÿ`z€|ÞKmDÐ¥lI^!-—ŠSj6.Z¸|n_lHÎ[+,4H:ÜЮ"êbªü0\üšd&3ÿG‚Ú]f„:­jO9¯†zmÃàtÇ@GgO÷ÑþîŽôÑÃý™n/þ‰20¬jŽøÊ9‚}Ùž!ש‹nHØ”Ì\©x. _±xÊZ— _Ú½%rº¾ìË`v¶ïp–b³ü®M­<=¶ÒïO è"B·túÁªà®N+ýŒ`­kh··Ð|+QMt¢µ¶å<¤–M?¡¢eóO}8PêÊ4³`UÓÚÖô1j›Z~DháOþþTŪf9êÞ𯨠ý‚èPÓy,ËeI®BÚ¼e²šÅrWím4Âdÿv»Ðêh µ‚Öê‚®ˆÕ~¥¯’'› о¨g?~Geèœçйèìö@ÑÊüé`@Ó êfPßÖB›X{|+O!^wCü4V'b g­LŒµŸÅtlÍïÇ¿q”Ó‡XN£ŽÆ³4šiØ4¶{ëNoÝå·ÒxŒF»G{´æ­E¯{ô o=ÉzUŸa]"|?9°6QÉK¬.’˜FMÝrÚWÕ­nOcîð“Úè%uÅ¥1¯¦¶sɈ.?¯Û¨€8¯æäuM[yU;WB<1‹µAwÓ¾ñÄcUéUÕãïø4beVã š¾‹'Ê ºÊDÐånßå„dý;WÛsEÐ5AÐK¨ê½ §~]‘Á>q­÷zW9ˆ¦Ö²S׶Ńní÷—‹åº ¨ÇµzÖn ÜŽû4âNË ÿXÜ‚n Ÿ uöú:“N§"¬£ó\_V{Ã4"á³σÏú—²Þ díŸÖŸº,¸ï²Æ›eü€oöÒLu» ?"DôÑ×yèÕAô,6‘ý>ò6Ïï-ó$í4~@Ë¢Éù•w³×›|wü|)¨Ms+ÿPK½\C7«ÓÔÄä5com/microsoft/sqlserver/jdbc/SQLServerSavepoint.class¥TkOÓ`~^:ÖQËÅP@Q¹è6¦¼‚ru: ºÄd|1e{··v¶•ðøâLd#ý(‰?ÊxÞvÜd1—ôœõ¼çò<Ï{Ò_¿¿ý0ŠU FlA7î sO=‚QCf\Æ}-HDð@ø‡Â<汌'ùf:ïÇ ²7ém˜âùžD ,y€¶ÄHM»¶I$wúñc¸…J%wü@_â+BÐÈ53-¼™I{TEÑ¿hž¥Ñ3LåÁDÚˆòÁ ¼w-ÙíR*…¤*Z«hÛ9nCôifPÜC^·ŠãŸCÛIŸëi1Äë—öYMiãûhÏj„°†ËéÐwhYiѬ8­¡3³ìSIVÑuH¡Þô˜þPK½\C7µotëAcom/microsoft/sqlserver/jdbc/SQLServerStatement$1NextResult.classVéwEÿuv“!Ã$&oEŽÝÍBâ•xAÌj  âd·IvgÂÌ,oÅûBñ ¨ÄðÀM4ÞÇó=¿û]ÿµªgX“'“·ÕÝÕU¿:ººz~ûë«o4â—J4aÃ,lÔÑŒ^^lbr;“ÍL¶0Ùª¹CÃ:tÜÅd[%¡OG5sª±IšI†‰díLú™ è°°ƒ7vò2˳›‰£aPÇÅ t7v1qy¹Mƒ§c³Àg’ç½ÝŒ°‡—Cöꈳ@œ]Šã÷â> ÷óø“utá!Ëð0ë=¢aŸŽ•¬²2yŒ÷çÙžÔðŒÀœ´“ÍçìNé›­¦onpvJ[ Ù‘vr 9+í:ž³Ýoðve=éî–nÃŽL_º¡Çw¥™kQš^³@u°Ù’w=ÇMeDJ`îDf·³§ÅÉÛ¾@•ççüVÇ–¡©x)¦XžìÌ‘C2÷e¦gW¶ÕreÚÏî%c[*üË[Ø(°ü,pë;zÔ²Ç7}™“¶O°•={m@úVš€®·lË¿Q`elÆHñ^h‹“‘¥cSzNgU þ,hZ{º¥™‘nsœ¢ÑÛ†ÒrзÛÓð¬@¹cSÉ9ÇæLÌ&†ôÙrÞ#qµê5³y©dRövÇ@ÖýÒï’C~·ôòYß@;ž3p=n0p#n2p3“UXm ­žÇ~DéGÏx/x4¼dàe´ ,)ñ8 ¼‚W ¼Æäu 8ȾÂÞÄ[á½·™¼Ã޽˳÷pÄÀQ S–`¨˜$Çð¾ð¡ÀâÿT\gºfNúÒ5ð8Ž |‚Ÿ²ŸáDi1‡ð9¾Ð0j`Œ=ž³ÃÜm²4Ï&Óµ-»ß@' œâ |‰¯8£ã¾Æ75J<ï[Ù†^*u‡<ú–žÃ÷~À~ÂÏÍ3,Ó…ËÏÕÎÄ…‘²mº±YÓó¤w¶ Sɪ+ÜnÚ™¬tJs¤XÛób*Ƭi÷sÚ(êÕPÕò½é3=Ùæº'c%5 %MW:cÝ“þ×É‘«3º‚½%S̪@å…<+#ƒ®G­ÅòVù¾½*½SùDw»zÀô6fH-lˆ«¹aï TRÔ<«ÂNGdÀ¡†Z5è:i™É»²‹ª“ŒMM…›vèüÒAnW”ؾZŠ:„Ð8Sò$ïÉÓó'ŤYÞË6³Ô©rŽ+ƒú¢ŠªÚczÝëZRöjÓOPz(vJUK.£§Sª&Î$(ÝL§¥G½½q…Àþ™7åRª¦Ø&šK*²3âÝ£ÇÇüoÆL Öx;­Á ÝŸîÿ•Ì Û²ä*ßÂeNÏ¿íås²ÊmmÞWÍî¥¤ó Šø4› UÐá¤øPfp—¨˜#9¯ŸÞ•™ÜßX©²AŨiW>×Ç}H'F'‰ÙOù˜K}cš«RuZI„@m¿¤ÎGSµÞðöROsÂJ¥¦5›¦ÑM夸Df“•ðmðŠ÷|Â#@hQϺ‡ü«”YUC«| ¯íÛAÂÁ—™zÿCDù¡'“_!Õò"f&ó¯žâÄ·Ð÷s}6ô£ïð}B¨ñæp¤ 5Ò·Ñ:þÀ-Š§Ñ¯)ZßJ³å(£`Q¢~ "QWv‘„C4Cy¢l ¼Ôx9ë‚¿ÛÐAJ¬~"J=.£ÐŽ åÍÖCaH|ÇÌAkG«œfÒ<\y=&ö—ú¶M0ÿco ¥ë •Í>Ò•W U¶^0Üé#õ”d–4f5[zQá|PK½\C7…ã>‚-Acom/microsoft/sqlserver/jdbc/SQLServerStatement$StmtExecCmd.class•TkOA=CKKË"¥ÐŠâ¥Ý|KQ‘RMcý %ý¶nXÒÝ)»SBÿ“_HhI4ñø£Œw–JH ›Ì=ó¸÷î™{Oæ÷Ÿ¿Ì¡CÓQ<ˆ£ã˜AFͲÐæb´“c³Êñ‘2†2sÊÌ+ÿÇÊ<‰âi/¾t$Ã|ÅŽáØ–'|±) ·îso{ÆNí›eT?WªÁ²*MÉîÊCˆœ’•sÏ4ꦻeT¥g»[t4Ä÷¹Õ”ü—Û¢ÆÀÊ #fSŠÜ奨}ä-Ÿ!"·mzŽ!Vm¹r›KÛ¢ÍEÛµå†V¦gV½œc_.gש.EQãÄ«&JÇW¡ûf²_â¥}‹7¤-\?Š— à OXÜ÷W¹ß =òË]B{m¥ºÊÍ÷ Ùu 70Ê>Ëb¹¹¹É= xÅ‚†5¼ep²[Û oÕþ®+Ïw’Õ0†”†´ÚWfE +˜b(ôXœé*iC]¿èPÿ[ie—:Y¬›¾Ï©‘3—ݸ(Çt)艓*u_¿rÜ y",EElדa,“½H©³ÑàŠW>sþø|Äq_(n@Š™µÝ&÷Zk¶ÃE“~›¾ Q ©ä‰–N‘\êYã§»RPyS]v““›uéÓ[‘ gè'$]Ð,¡¤ ©#Àñ“J„`¸ õ…hLà­oÓì=­#„ z® ¦ÿDß—#„ò„;èOFÈtÍbà1=ßF\ŸmcPO…ÛÐôTCAÖîà.=P*gšÆõC\ }|&i„éäyßÇT×;EØG#o–ë`øàŒ3Ãs•Œ0A/Û3$ÿPK½\C7µKêD5com/microsoft/sqlserver/jdbc/SQLServerStatement.class¼Z xÕ‘®÷f¤iZòh|Ȳ-3ÆÆ–F²$Œ Æ Æö`I–G’0‰hÏ´¥±çÝ=>B äXv³I–]r’Ø9ˆIBˆ hì@€Ü¹äbÉî†Üw®­z¯ç4’Æ]Ö{ý®zõªþªW]=÷½vç=ÐÆª€‡Ù©ø¦â#T|ÔÅÇ\ì°\ìjÜHÝw³O°OÒÓ7;Ê>EOŸ¦ÑϸázöY7»‰}ÎÅŽ¹ÁËnvÃCìóT|š_TØ-4ûKÔ¸Ua_¦õÇv‚Ú·ÑÈíDâfzºƒŠ1*2Tœ¤â_¡­î¤§»öU7awSqÂî¥Î¯Qñu"ü …}“¶þõ|›ŠïPñ]…}êïÓœûˆØöC7ûû1uÿ¤‚ý”ýŒš?WØý4Œ > °ö …ýRa¿"f­°ßÐú‡öŸ4÷a…ý–ÚÿE þ›èüÂ~GG\ì÷nØÆþ@?ÒÈŸˆ©G]ì17ô“„úÙãTË W³¸‡Š…{iÞl¢9ÇÅçºá]|Îáµ ŸO#u(&¾€ž*|‘ÂëiæbZ{†Â}t¤G\|‰ÂÏtÃu|©‹/£ú,…/'†VPÑ ðF…ûm¼ÉÍ›ùJo¡þV¢ÔFÅÙ.¾ uÏÏ¡Æj7ÜÊ× öø¹ ?ì8j†¯uñóÝpŒ¯wó |#=]àæò‹h]{6;\=É ¥+’J´&b#e¦öX­æq$±_7Z÷FwGˆ²®%ì%i·¨°¢È¡Õ  Ó/îïì“3q™;–Ü–¶z5CK0hÜ5ýB1M·äÂH ±b)ävÕ ÜnïêÍ@n RP¯ ‰õÇz*‚d!Õ‘´a 8©DBK" g<‰=•$ #D@‰ ‘øôî¸l¾be"Ez1Óq iVâIhýì釳KÚ¬à%ÁÀ@p¨g[ÿPŸ "²ÝÛ‚áAêd(ˆlç@og{z9ÂÈ£`eG{` u:ÌGn(ÔÓ ÷´wÑh.Ñå1»uk$…ò­LFQT:‰§òèfD%DtÓDèâ– í`8u¯âÓ¦˜öÅÞ†À““*Uª-‚ð÷h££¹C÷Å™UÆø¶7fÚÂGÓ ¤ 3…«EdÈf‘&ÁLôHcq'7éVdD2à‰ê{4¤[Ð5KŽwÆŒ,0+v‡Ì@ÀŽÛŠ©fG¡¯óȆóqü†)lŒÜë@á],CÓ´a˜CfSÉÁM%ëå b²§ƒnÜ7?AÒ'Fº ÞYB]xÁÈ.yÆtzÙöl ÍtB'VóÁäi0Ц[Cf1áò®žÜ§fçIä¨Ããšµ…Ò—ŽH7®hѨ-·8£ÝÈ:J»élhÜ•½ BÞqÐ×Î-ܪOoµäqòÌd_ÎÏHÐńߜ›)ŽËq’Ù’ŠGµÝ±8¾µ$'¯‘Jj‹ ì#ÅîŽ]Å]rqê¡)©‡J§’Z·‘/Á}ç˜â¼ãCì.ÚíÖ"dËÚÚV1¸î´å¿þô^Öfº$'¿ÛÑu6¢[±H!«m ´Ógõ´7W6Dâ"žQáxV…Gá1§â)xR…—á•íe´¿é8Oekù*[ÅÚTøüÝÅ •›l£ †¿¸¸…#<­²Ùð’Ê®f«U¾Ÿpñƒ*?ÄšiÅ#l¤‰øÛø•*;¿JåWów`hê\§²eH Û×0ྕKdX£ÊßÉšUv«xN¦Ò†UTÌ¢ÂCÅb8™` à1J. ¥ÑŽŽ¦ D¢´e•¿‹mQù»ù{ð~?ž÷L*«!r^âäŸhÿòˆ½øZþÏ*«£ÁZ*æÃK –Ù¦=9žÞâìýt‚÷1ÄK+j¥%§•–œVZH+-“µââÿ¢ò÷òUÙ™l©‹¿OåïçPù¿ñëð*ȫʷ'eøPZëÐ3ú¤cñYèVE»€lWú„‡6ÑC‹Vî•l ÿßÑ(}iS§ ¦àıÿ`46ùmÇ®§£U‡‡’)«/+••Ǻ0/À‹¨íƒHðå^–ZTÖOX]ÿ&<,¡ôC*k%”¾¯«üÃüJk¦¥xqgG  Åã2.í7´¤×,RóG#EuÁÓhNücX°ÍØÇÙN•í ¢›m·5Ÿ4qAÙg¢D|.>•]ÃÞ©òÃü¿Qåg•-"P}IóO d…zú‚á~•!z~¤BA§¯/°­78ê öô‡ú}í}¾ÍÁž`¸½?Ø9´58ØÇàŒ‚ÍPæYäæ>•åŸRá9x^e!”?K‘îªH?vAÁO}xÈȶr^ca©vä—Õ«l9[¡²¹ˆaþiþ2ÙÏ"ç’U•ßDœ×å`iè"e†èÂW$‚ýZþ9F‰•šI²Ê‘yß,ì¼Ç:UÖK4kò΃^p†¥ßØ©òÏó/ÆuÃHùàßñEë 2‰Îµå/ªü¶I¯Àk(‰±°Ê¶³01ô%á!ò¯ìùœ„Ø×Â`ªµ)kÃ:Ê#¡Q Š%÷kñX´KO[#ÄbÞ“gtÛî½B(·ò/ãrÓ1bŽ©¬šœô_Éo,ÈæÂb ÔDvI†‡D&. Bä8Òqqñ*¿ßŽœ‰U6€ºt'ƒj-Í rïà*¿ƒœg’\@zŒù\ç ’ } ±á$EC¾ˆmÂ*Ïð“oÀpÏ.ŒTÝù©å”‹Eåwò»TþU~·‹ß£ò{É\¾Æ¿®òoðo–|¬\dåâßRù·ùwTþ]2¾ï‘ç^Ë¿¯òûø\ü‡*&€ÔæÔ11¼õŽ¡¨Veg04ï%¤G‡o= âGd\õ9­ˆ8UÚPxLù Éx-ÿ©ÊÞήÂ[È6c]xoÛs GÇË|xtϳ|2bµÃC¼$ßA7íÏøÏU~?@åò_¨ü—è^ø¯è(ydµOΡåå+m»ah‡²p²w«,À®Eƒ.0î´iuè6›èj7¸æ…‡©¨Nž>Ó£=)‚n G¬ÑÅ!w!DóBÀ£ÿMqx-Åp?›ØÊóeLŽ=㈒QP*ðæÊwêÿðÀ²Hx‡±þŠÓbèX£º¥ÑKNÛéæ©N/ý†¹BïOô5ʸ̡è¤ôø„..zÏoÑ•”ß %£úÁm{dˆÁ…™ÞmÚš‹]ÅråÚ(Â;*¸-!«‘KÊ.,F/7ªX©,4DºÓ0²ÍÙ mŸ¾ÉH%:¹;rf âo Ø5ÑÑy±›Ü“KˆÈŒR6Í_®_‘Öâæ„´…M—´3ª¼"Š©eŸ[fHHMÊIÖÓ÷S"ƹ)ÔDÛ/¶šfˆoS&ÒvÇuJ~N9“°°áÒiæ`’_ˆ%eú-{ú0Ð"¯Ã"ùåŠeá]aÙá¡._p{Ç1tàù|¥ø AÉ–Ž™?•í4bòÛÝòÒf¢Ý ‡,¸X'Dú{­Êh¦üdŒ˜”þ£,™Eµ“MM¤•’¿E–GF4£Ý’ ÜA¨¸U{$œC"FlK•N‘¡ÑLJp‰¨‘>ëQþÞþêê¥dáÚ"FRÄl&w ÓÀ°<.î¾â)Ž)Œ¹|./fºÅ¤S£½‘¦ü’gâwúL*¿ '¸ÍÜ1èóC“_€\;ÛÃ=¡žÍ(&´?©-rÚÓõ©dÔB«ß@ cG î¥L:·L¤Ô –œŽœqžË¼Øâv–•¬´S³´ÝEÛå7ÏøÝK$ZÄlxC©sí,¹|W@æî›ñÛ¿çÿêÆ)ùL¼³#"îÃkH#m+k.…Šýeã/}6‚4’}Z>ÃäJ½Ë^™[EEî0߯Sö}qÙé#µ4äPEß~;SIÝ–RIø¡ùëgŠøòS16ˆ™¡¤È?hvW)¿| ¦sñLÖæý%9ªÐ.ùýFÞ#)Cøð>ê«}‡,ñ™§ƒºä¥î „HªÓï`¿K8UgWfo$úX1.™» >º¬ŸÞŸO},Ü–ÀÃp=0ø-´À|ø<‚Ï¿§ŸcÀ°ýÇ‚öŸðïQxL˦³œ­Àª<¬5c~lÕàÉýÆð[„=ðxÑa‡ÖÄš‹ ;ËÕl%k)2\–nemx^ e¨E€ZÊýwkÐï? ÊÎoÊ@Å ±ÙÙôK¤rÚ(n/Ý… ˰¾!i÷Mà¦*•ŽôÐão]*Ò©Ú¸è0ÔùWbÏ1¨YçÄ–"ZuÎ{O ™…° ÚèG´°JÔ…[zØ9lu‘ÃTÛ’bkrÃs‘ WàafÕ<óúÕYi›“V}ÞœâÉ@M×]à< ³›œMž– ̹<s30Ï[‹n2?uÞòYÍÀBZ„Eê¥,ý”s·iÏ”QÛ·Ábç僷ÃâìþkÙùRh|î_Žu¥|†ß1œ ‡Ÿ‘°ðÉGÅ?ƒ3éi)ËüÎ18Ë –Á|«J½+jO,:ÇSXm¨q<‰Õš×ýXµÔ¸À §<•ON©“S¼t¿·á42ç)ð×8ž©§ŽgëÅŠçêÅ jáŠçës+š²+üõcÐì_4+‰…£°ŽH…FTt˺2?«+» ªêʼ­h»*¥cPŽAõ1XíÏ>ù‰Ÿ£PEµè¨#>eÇS¢C¡MªqÁý¤ï#P…Kéé(u ŠG¡^¸f Vù±kÕœ#Ï·¼€ˆãIIÄ>×êܹ¨ç—ó8QÆküRïçfà<ïÚSpþí°î6ú¿>Ã5ølãÇ»‘@’ !Rq‘DÍÊUÓ3ÁÇÛ.;š©£C>¯¢ç€|^‘No0»MÔÜ,›kðÑ—-mÓÃÖ±õ6=¶¡8‘ìÑo`mË]„ ¤Q@ˆà@L¤È(j¯‡X"ön@% Î.> Îxì­Ñ„â®ùœ‘—OV4ÝÒxŠ°ÏØ…ì"{³³@¶T‡ËzÐ+mC¯Ôä,; ½ØŽ;‡O:{;ë˜n±2ÍbƬsºÅeùÅgÞ2iqm²·Ø‹Ï,\\n/&/¾É†ÖD*œ>±ØºkENrÍMž+3Ðw#,¼ úQ†ÝÍha;züˆšcpÉÊãMÇmÿB5Éŵ¶ ¬$…øH!ì„­ÿ‹ÙVÉ'@ý—Ѳœ®6JoÝt ’û!…âó¥'aWùi'9Ü%è`¸Ì~\–·8åhe9ÕGáB‚éaXëGì¿õ0´¡·_: CX¬Ì¡Áß´ò$\~ 493 ­sÖ9ql·™ˆ g)¿AŽE3 {÷d`ø0Ý"Þœ]|ŸØ„}è’ÍÀÞ1؇3âø—Øù¿­[YpÕí뙑d‰4”„¤"¡K†xþЋÍÖÂv¨„Tk!ì!ÂÀìÂŽlƒÍbO) ³†íñØyìðþÞ£Ø>ø€§çöLŒF*BU>FWnõíîÛ·»ïé+ÙÝšaJ™Zü:-{uÁ¡Ý=šC*Çùõ'Ê_úIPì+;2Å=aëÅË]âyøe)WôeA1]~lµ‘û›yT)Äâ`aWÆ(ÒòŽTt9ìJEç e2F4T¤öEZŒ±n5K¤ý‚ýoÂø]™.Ì¥í‹Jtq—Ña´™öª¬U¦KàÀK³!£-ŒX»,OOc¸<‰Gì+Š´ºŽHõÒL³#ÙHW¶567öR\¼·àêxDû;k57æ+£ñP™®Ê5‡{ªDWó‡=óœÊº”9H‡Ôž·Dp¾r¥ÑQ5ßâùl§SYX[tW*ïmÑ5Þ&ÆCÕißÄß´IÚc™vc†Ñî:¢Å¾"a \;#Ñ0@=†r*?´ØÉ¤KlOºD“‰©f,Ä2 ‚Í"ü›ˆ ±¼iG-ÞA± ‹ޏÎÇÕ¹Ž>Êxk€²g¸Ô§ÌùØêë5ÌG;•Í-#¢bŽ_-Öi@Aý-ö ×ó2z }ãFº©3=» ºY¢›;Ív{¶siš·9ÆS¦åiªÀiÂ$V×ì•ZÕîTÞBjí7E0GˆÏïîó;•¡±dÓ'¯iõÊÔ±~R´È 4‰O³nñòI.kªó!¦æl5ÖS>Öëæ:Tî1þ®Z˜‡‹x²Ìœè§}ËtkÎ^ u%º­ËÜD·ç ¤‚hN·kL«¸C XДãêš2%hJÎ7å1åÐ?™rç¶™<§AL„š4êxu‚èa0ÊgQ“k¸ï rŸXw w—pÒ_xóžm÷æÝASNöCc©—î ,­Åxì{¡¡HùàäSÔüZ“1iékd©~ƒbÙûõU˜Zàkž “µË¸*UªN«é`ŸýÁò½°f—Ö¯ó!¦NW‹êø?€QbüEmæ&‰ª3ÕY¼«˜9ŽMô޼Pµ©Ä¿˜’qqÃNìüs€X0á¾à„sü [×V¤ûƒN8×gü§Ø²'OÎ#ùùðu*?wZ(Hƒƒr*ÿs› ô(Ú£ž‚€0íHã]}c}qšc¯ÕÆNt}áæõp–Í_ðË–œ[s¤Ìà¶uv‘th bªBkž!]Ü`õ0ÇÉl÷0gs#0Öfs±îó}#,ƒ5õ¹–NÏ(ð"Ù½|t—Éɰ®“yÐk=¢ þÑ!Ú•È}_¤Çx@,8Ô®€Æ+Ó9Fk¯§'1ŒàyªDOÃ,³ÀLÏ èóX¤õ0Ó,hè¡õâ/mK`—¨¥bþ8PØü†WL-ó«Â2© ‹x'О%ðqÌø?†&´i‰Aš¤‰3k´sº‚løë bH™ÌÌåuóczÐì¾Ùÿ ½¥˜ÉQTô"¦ó=Æþˆ'hÞ/¨ù‚ºš÷ j^Y—9d¾°.sk°¹È/M§HdÏñJhi!ÀÑlo,ѳ¨d€øÜ [WKˆ© ó÷(.y ¥ ZÚÍæµäÀnÎß@Ï»¶‹ýôNH.Ž÷êg‰c«Æ”UêéD¸Ý ã“_½)¦Û{@ÛóMF{’ß=HãÒÉèo³z€¶~RÀ©)M^«aÂóm¦‘¤¤4\¼ ˜–¶Ë¡˜‡ó{Q`èÉöæ1^ƒü‰éTWÓw»wwÈŠþ>Ë¡©YKzÝ^²›Í¼îš¡ââÖhÜêr±áb•¢]Ê´)ô¶Ï(žÒ%zq4=Æ­#ÙÐÖ¿â¡Q8¥ƒÎ >8ælº×Múо…S¾¥ïÜQ;/ïÐ&Dť겿£^ 6Ë—ûwV‹ÑVp¨œÊn馰Á(QšÁ‰ù˜{NQ§;“ ¾!=ã÷gbüãDá1f1ãGï&ŠT ¯.$,<&žhdµ‡Ž£üóÑ}ˆÄtÏ{Tëš¹?âáÛçÉx¦âÙ‹åÇ&«Bl¾‰§OÄ“góÏ ÅoÃ\^sqP°!|™_^˜m¿ªïmÆóíËÁúý¼—nMô²4:ªÝ­h_kµøPâuý¢¸H(R@»o´BÞ›šÄA5˜ê¶ü‰àMªÙKÌU~!ØEœ¶£lð[ÁÂq˜ºZøÏF†qgs2ó'ÍjKZ4Ý-¸ÿÒ·{kÁMrÁÍšnµ2†—’;ö>#¹ ÷lAX0 úù¿=§²”ÌjÌl6ýKÅ·ýXåÆÿßµä\³]äÌT׊œ⑹ÛË#V²þõ+¾îï/àZr®ß.rnðAg—}{ÇÄ’aÚŸ1ƒ£0O;ȽˆH~×—Ìd¾ÂHh±$VÏS7Š’E¨ïìíÙ¬ÄÂYÊpò=@`b(á[ý¾ Ñ]àø  Û-ó,}¨Ÿ&dÍ2 äûÿce yþ3š*@×”¥vú¨JûMþIx–€’“Ü[û“"­äîÞ»#·QìKÛŸ ÕÜJÕ€ä³*@òyõü‹ ¦ëÍÀýÚ€Œ¤ëdIWCŸ y ÙŸŽØŸŒÈsµ #êµFdì,5:Ü’>~)Íz«[þ"j­º-Ã×W3ÝîƒÞ¸Ëpï]gÏÐ$}C¨èâ~Á Yô%} Æø_Šb¨!KÑ?PK½\C7›Ä8Î8com/microsoft/sqlserver/jdbc/SQLServerXAConnection.class•TkSÓ@=K )!ÈCÊ˪¼mÓb•‡Jyhµ PEÊ·P† 6)âOñøigdF™Ñ”ãÝhâ”v²»÷œ{v÷Þýó÷ë7}XÑŠ`%Bè­D oîBi¡_À€ˆ Üqƒ|4äÁÞ?äË< 0Â-£:&à1·<ðTDÆùdœ&Ì…L˜0Å ./h–™N%4†hÂÜT6õDÊ´Ì5[±Þ––ÚÖRÊÆêJB‰ÍGcÎ4aðì¨Qs}]K1´F7ÔmUIÛº¡dÓ“ëJnü*Fõ¤n?fˆûK 3©Új,&Gl¨D³SÄ[ÄXdpO˜«´qj'¡mÙº™´L3TÙ&éÈù14øÑ Õëš]xÇn;ŠR“–šà|ÊŽªœÙ~yÂ0-òvù‹ÚÐ.à™„[¸-ไ^x)!ІÆóAÃéµ5-ÅQ²€Y Ýè‘ð stXmi:’a óÜ´€CmÛÒø„™LjŽŽÈ$-¾ÆîOq}¸ÉÐwÕÛ“ðK%ãòÁ¹â¸„dÊ™Rƒæá C¥æLÓÐV ¹ !€r–Ñëœ-·úôö¯ /Ÿl MEÒXÛÖ Ê¯éÈ,UMK±Dç”Í—Õ¥¥nñ¡ºbPŸÿR’ÀrÉ—R(»BÝÚÒ’« !‘ê¸`Êe¯`Û<) ÷šž$&o1*¯*‘õC4§62é¤}„á†?ò~/¡æÞ}´ô„jÞYÓIòkË/b°Ô'¢XD?½u­ 9(£?Õ=®e¼©wÓGÕIóEhÎ-cr0Ô›“÷Qv—ü®}¸3(ÿ„.>9DE< !˜'ƒÊz‘š}Te íÿ:r†.ê©€iÔጸ å˜¡¾š`r×2¨!t4¸ë€ÛqþcMq‡˜¡Àµ¿á•Q'Hý\Ϣᵅòº ä‘“—Ó.ƒÆS}|¾{N#ãU{0L½‹ú9ýÉ¡&ÇÑ$3 <ú ÏLð(ô]΢y¼ÝtÀ>BøèH}çwÿPK½\C7i“ 8com/microsoft/sqlserver/jdbc/SQLServerXADataSource.class•UërÛTþNâD²#hãæÒ´¥—RÙI­¦P.I¸I Ò˜–„»"»ê(Rä4< ?yfJ;£0t†á7Ű+;ލOkϹíÙË·{vWÿüûç_®ÃÉAÇ‚‚9 á­,fñv7ñNïâ=ïç `!GäEÞ-©XfÆäð󬍸))(«¸•Ã8U¬²Ä3­«¸Í‡yú„§ŠŠOyýLE•5|®`CÁ 6ÔC«ê7›2¸P}`Xf+r\Ó%šã5ÍöÝ’Àè²ã9ÑŠÀ°Q¸'YõëRàLSFÛåUßó¤9¾'°b´µ¸I×¢€”,õR éÐ rÍ´<Ê­ÚrŸ¡‚;c‘O ÚrF¡WA7hÔä–lÈ@z¶LózÖûؽ#^uÙvG5¼+7lÏÜsìÀýFÄÚCÈÀ|PßµÍÚj-9¦-²ä–†×𺂚†/qWÁ= _a[`êYì·Z 2®aóvð5Zo‘‰E ß0é[|'0«×"+ˆtòCß¿ÿsèØ–«Û]ƒ% ßãëχ5ýZ—õu¯~šÞy]ା]^³"«æ·[VÖ×°ê._&PºlX-7*›A×yº £¾RR© ©ÄJ©ðØÐ Ñ ŸJn—54qÿÞçÄåè‹jÓ÷Ý´‚©t®¥/&“÷e:ié&²ÀŽQ}>›'ÊúTMŸ:¢RœîSµò@ºT¤·+ë3ýêš9(ßÏŸVòTˆNÈ[k×%Ç.§*)pÒZûûÒ« Ì÷)ÿÞŠmg=—[äWv¦áxÁ~ ÈËIJÒÍNަ3xú¸!pÐÿWöÜ›¶¬‡Õ6ØÊZÒº*ÊD IÝ Ùÿ1¶h…áC? Ç&ÒM¤âE2ð,w¿}ÛK–´Ç·tz¨úµ`,P×!ð* •Û }MFiO}Šæ7é4N« u¤xñ;ø'¸écÁ׿a„þÀ¯O1´Sœ›?ÂðÆcdc$Æè/(Òþ)”#¨ÅÙ¹üMs4®ÅÐh‰ñRŒ—S"³½"gº|$töoŒ/fRW{ò4Ídbœ;|”@/ÐÈEZ©=v|¼BÎ Ñ:ÓQ“Ÿ 9Ò5cŠÄ«sº~_ëø]Æp–›ƒ‘Ow‰tžÆLŒ Ïb¡wƒÙÁrŽ °b¥˜¿ãR›U¥OüñƒL&×@6ÿʸü™ö£à?PK½\C7Q/@ËüŸ,6com/microsoft/sqlserver/jdbc/SQLServerXAResource.class´: xTÕÑ3ÙÇ=»¹ ËÂK@W ›˜(J¨ ¢K`1̆GÄ —Ý›du³w7| V¬Ö¾´µµâ QŒµZ#%Å*Uû´j­¿­õч>¬m­¶jgî½»¹I–€Ÿþùrî¹3眙9sfæÌÜä©|NÄèÆ N”Ðã NâÇd §8ÁŽ“z¹Ÿê€û±Œß¦ñcº6á$Æ%áÑÜûœô8ÆÇâq jèÄ™g1p¼Àr'Dp¶@¿À •Œ=AÂ*'¥Óªx¢“–œ$pŽÀ“ž"p®Àó~Nà©Å0ç3¯žæÀ…xºÏÀ c ¬eáêSÏ„æ \̘%Ø p©ÅG[fLHà2gZÀÇøËÀ}£Eh}“µ¾ÙbÕúå–"­?ËDHÀ«NlÁ°€‡<*à1 8(àIO le©V\É2­¸šû6g;¡×°lçãçñ\~¬¸NBÅ ëXí\/aD`”_Uí;$ìäLâGLàyÜÓFÏg}ÅùÑ%0ÁJIò£[ ¸Oñ#í„Ëx£=NHã /Øë„wp£.bø" /æ¡KxêF^*p |SØÌË™Ë^!p‹À+~QàU¯ø%¾Fà—~…×|Uà×xò×YÈk^'ð¿ÉÐõ¿%ðÛÚè ¿#ðF~ÝÊ«nx³„·°dVÛY¬[°'Ix›·áí¬·íŒ¹ƒwòcãH wIØÇ¢ß-ð»Ìù~|Oà½Lø>6ìïKx¿q‰„ý–H20§!’ìªîŠERÉt²=S¾ žVSÔTõyÑõ‘êðY a ¬M&j$K&æ#”fb]j²'V‰F4€!±:¸6ÜliE(¡Ù錒ȬTâ=* ‚Æë›êB'AË[ê—[êS„à Lmscc¨•duÅ„hinhX¬=“QV}Îâæ–%õÚ›N¦¥¾¶ye} cìÄ{ˆðÚúÕŒ”H`)+ä<5ç@jÒep"Œ§ fRÉøÐö‰g¯JÄ2uÉ„J;?;hHFÎG˜Ðpž²A©Ž+‰ŽêP"£v¨)Ò˜;Ý¢¦“=©ˆÚ¨$Â…¢„4M gR±DÍœ¢&â±tF¶¦”DZÑxÖ&{Òp¯Òì ÅSõ¥=™X¼:N8Z[­ññ¬WÒjŽ_¨ŽL™:¼ŽÎL|#펫,F8ÜÚl ·†–,mmh«]Þ@³ä^%œQ2j—šÈÐO_£3$ó¨®Uâqe}\ÍË 3”4Ù ›®‹¥y˜(;™N5‹ ÔDâ4eYÛŒ¼µÍÈ[Û ¶¶yk[̉OG`ÒR-Ó vÅ™$íV×ÂÄòÙ…4i­MFi½}AŒg!ÂÜòOnë³W"LëP3«ƒ£v½TIDãDÿèòÐ챕ã¬ï¨Ýšn$|€*žL««ƒf[Ê™•M!í·Ç•Vdw\Ùˆàɳ¾Ã’H2y~LÍÏ›T¾fQÁ‰Å™ÝCÓ\u­µkÙÎÉ­LO*¡y;q³‘ï§È^*‹&m×¢&ÈJ¤î”Ú­¤HŠéc,˜M!ÆNbtÅCùl¦,ÈgãëvÈ1‰ÒT{{2E'Lr¤(œm`ï:Šô½æÐ«ˆ|,VºÔ–F„‡"Ÿ7áù³)FxÒjÆäÑ­z%#%V<ÜQx˜Ì‚ö]šP{3f‡¶ë΄0³|ôqÏ.à0bA$®¹„;eüº|#f5%3‹)ÎDóÆJzšÒ”Ô&Õ©íú¤T*™’ámxWÆ]8@¦7RŒE=íí¬ËRß&Bu³8(Ãï`¿í–q¼)Ã+°bÚ¡H†×àuK±DÂeø üV†a¯Œ{ñ!JOdxþüL7Ê&:÷áëȗ¢JFáˆÈxšÔLešzºÖ«$ÿïáWq‡D悘±¿ç`/¼‹#$¯K¡¨œªªêí^K2²á¯íUÖj¦^~z¥oäïìKeÜ Tµœ |Ä2„ÇZa8Kùð%sÆZ¢{Íh>'µ(ç@#¹Ý“Ê?Án —±dî(`­ÚkÞ‘¶nÌ“ÊmhÄÂ#à¨o«À:þA‡wé²¢¼Iø¨Œð1 (ããø„ oÀ›eµåÉE|jn¢/Ö‘H¦ÔhÀÇ^qPÆá“t}¶665/n. “§áSd»­”Aµ„kƒM2>%dà—P0hm\ 5h/ËšCMÚ¼æ¦úåKƒázrýÖÆ–úðŠFz•[µ M£ Ñ¯¨­­‡÷ðr"/áeü ü›⊦3›šW¯Ÿâc |ì—,÷ê ¯½'¡E*)ÇÇ·K@†÷á_´È§Ý]þ“A›¯7%¯ÿþ\Æ_à“>#ã/ñYŸÃgi¶q!øüŠ‘ñy$¿8”-O%»ÙqUNUÒäTz Z®¤ÈçéDÓÁôŠD,Bù€Œ/à¯Ii5NW|£šéLÒTQ›R• oM¡³àk1¡Ä}Fîǽ‘ðnÉ¢?i!ã‹Hñi–ÆE† +µ*Ãóð+^’÷ø±ì“{y.漄¿‘ñ·ø2Ý)ùxJ"åmRÆßá+2¾Ê‡sÜh:¾v%ïI©•>Šl™žt€¥éJwØÉ&'kD3tU7ªé4¥²‹“©.…®ªi-ky-%®I}Ÿ”3™4ðÇcד4¯?††¡ôC“ñuºð÷ø²hÍ\‰÷_à¯2þÿ$ã´?xˆï ++‰'ŒlŸ^%½~ 7G.Ûg¬žãóT£T`dXßžŒoâ[dÛMIŸé÷鉕/¥§²^ß"•²lŸž“˜•Æî=v—/—¸Ó¥ë„‰/¹·ñϤ5_}"Z`-å‚‹5ù2Ic˜pǼz'è¸ÊQ´ñ/sŽÖÈzE¥!ò= ƒŒÅ¿‘Ÿ ÑqE}F(Þè[ªãc¾¼ŠÞ¡ÀðJ$‡bVÀH! d>¦Â5ä¤+é¼Ù}fŒíé±h¨«;.áße|ÿÁf÷Oÿ…ïÉøo,‘ñ}ü€ƒL/],åúâP"ãð= ¾ÑéÙ˼Ó?ŸtÂUyÂUyÂUL¸ª áqè’ñ¿ìzãGÕ€tX‡Ién=²½˜´;nDGš¡È¡':vçZ¥‡ë‰JsšØÚ™J^ÈéÕ°LqKn§twk©yåaÒKsªGëÊ Õ)ùQ‘Iæ*¶9Gzju”»… õLe­mP‡‚Š9êOj(tpéCW· ÒgÖmˆ—i_yd ‡^v¨¢or]Ý 1iU°¥)Ô´„‚J¡*ž'ÍÏe¥ |ºÞci~eŽvËI„ ‹a'¨ÇܱNPºPI%´#òÚòJ½`áª)®&:2¬Æ<Ê$Îúµ5¹Tí5jМX‡šêùJ,š¯N«Æª× Öùí1þ3åP«ˆ?ÙÀ’xr½79=±–Ï^³ÁMã‹h$ÒyVµÇXË\‹3Ýá_ ’RjÅË&U@Ãù’qÅ#¨å…­õ¿O,O&)p›¿R˜LÑünbŠîΚ{2ù\ˆvVÒÎPR{ÕHOFÕÊL²;©!”0ŠR*;çNJ¦w*Šr “@ãþ×+h-8œ*òG&¨^D6AŽk/­Y¤YTÚà.:òƒ6.Äé€&,k Ök·—ùCœ­\_é¡ÑÆí6l|=‡„"&!%ôëlxƱ‘´ÓE;UR)ec$ÙMöç/°‰P”¦BÁÒëRX”ht„ÛäT@ºµ¦cqP¦´“D03ê«Îe©rL‹ªéUùªTßœ÷Ã&@ØS¡ˆë`þ€Ê9õSàaêök¸G~Ô ø1üC‚7ÁO|Ðÿˆà'MðS?m‚LðOLðO þ™ þ9Á¿0ÁÏüKü,µç4ùœìj=å»Ú•ôZÿ’¶¯".úµñ—5ØÍŸ4ü+Zï…WMt—Q{ ^×ôA5>áÿÀ¡AðÝž‡&Q£‚Œà·èm&­á?mx÷‚½m$·È‚ÿ œY(΂ÜPÑúÏÛðgcÉ`þP|ƒJü–(õ»œû`\›ÃmVj6jvj5AÍÅ€‹!—:0<.ÿn?NÿNpÀÅL¬ØžÆÊƒ ûÝ“`rÔø ±*ÝS²à%ÑÜSéQé.MÓ!’—V= ‰{,'Ï´3Ç“¸$0ÚvÂô­à)» e.ÇP¼Ž"âGï×ðËhÛ®‡oB##Êæì !µ—~l,»‡hï2Tâ 6—Ú"jÍÔΡ£¶ÚÔ®¥v µ{h¹Ï}LŽmìƒ 8N:5`†¬Ñ€™:Ф³t ¨ÇëÀ)P®ÇkÀl˜ª~(Ñ€ 4é+ÃÆ&4ÑÿÆY ó|‡TD…¼®(šØª, tel‡™y%xô—=PIÑ‚_1¼±ïãF1 .þ>`P<Û ¸˜lå„>˜Ó@+'ì„ê,œx#Ì`À8`’ú$>Ð9ô ¡O¦³ÌÂ)Ìܧëß—…¹j\$¨Ʊˆ«nÝ:qªqØ¥–²m`w×ô3Wtæ5ZÜŸ+Ût8+ݧ—Uw€Á)•Y˜+c0¶Ò}š>¸°ààéúàƒúࢂƒµú`]ÁÁz}pqÁÁ%úàÒ‚ƒ!}pYÁÁ3µŽt©Ÿzm†§žOÆV±rÃïçÔŠVhp†aóvjl"ÔN¢v µyšéœænìw7õ»›ûÝËûÝgõ»[úÝáþ\`i%YÊô¨¢³ssq¥Û‰ôöP•n+4û°•žÊa«˜>m œÍ¡`7¬ÑAÎÁ€¶Ê'`Båøƒ ^>‚ÛîkH|ûg'¾Ïýåa⋼øÒ§ ç;Ý_ÆÍ‘ç&>n­#¸Õ¹¿JÊr¡¶ Ûî­ÞbÃ)ÞbÃ)eôÊ;`¾WÖ½qŽÉuãþ{£#ïrÞö>˜(5G ŒÀ¹Ù$x™uÜdft|Fß)$lnÔE޵…­…„+1 w W2B8—}Ìõ:½Å’vpó¨u·X×ÅZT,Ö‚$¡¼ö'€ûÍ‚Î, è­9»ÐÅô:=ޏÍëì‡bŒc/„4nÄ+ñjê—âø6…Ï·ñîá:ü?¤ä뚢SŠ((šW´€{ÛÝöSí mØŸ·ÿÒJ¥Òxšw±t²TC½9qCø/|h¤ŠÂñ?[5û§¹—mâªÂR1m¶Ñõ´°É¼‘Biãíô8!—6Òõº½ ;áÎýzÎè‚ ÃXo§öQžõ:ªh˜uƒßZ1¨—nþ¬ø–ç‘|?F0ø¶±œæ·U0câÛtÂ.¸í´OÇ|Ú½Zv禜jwú)2¸ÇŒ]¯ðÛ+¦ÝÂ}FX-Ÿéö'Q…:R Z Î%’ËüRnó̵ñH¸VãZ9Œk1”Žâj+ÀUü¿sµ£dԠײeêt`YNÉ–…{aq¹‹rÕÊ]pó] ,û ¯:T~Ým­±Yjì–É#IÛ¡ŠÑÓ=Òº“ÇÃÇ›j„GxlÔÙ=b]ÝcÐYcÛ"QYöÌ‹U›½Å‚úli8(<ÒC"àðz:µ!¯Ãâ‘vÃÝÌ`¡ŽqZ¤y3%ã¦eÌàý ¢ø@ÄAn›Á¬ØÛ‘á–9 WEÌËqcòæ#[ñ1>‘•Ñ×pü”7‹|xMÄu¸ÁÓ¼¹)£9qIÂ-™Þ·9¯;">‘g5«T)›ÃèrV³Ê©²¡Ù–cÝ”s·äèö=ÝN­V´TƦz¢ªC×°LgÎpÔ•’^``Ÿ3s[¦»¦»†Æ0®•¥ÑfÈh3d”‡Œæ\[WË™]Ùuõžš*©æj*ýi±À”aî ƒ/¿Í d¬‚Î ;º;o[她ÃXìd⺩«ÝNóòÕï4}Ó#/‚8<.ÄZ–'f†¹šŽ¿„‘4¥•"Ö08)ðhHá@ C-±Z}¹×óÄO誣=ñGÄ*ÎE„^ÍmûÈ–ldç-/‹ oSféViä‰2†~@wâ)ØÙ:|Äš/ìæeX€ß³œÉDó Æ½y úÿ£³ûµ§8Ÿ‚á]h¦Š‘ûÊ…ï ¤ýóùPK½\C7 yc ø-com/microsoft/sqlserver/jdbc/StreamDone.classí˜y|ÇÇg°±lYøÀœ‰Û€m÷-Kk[  ielz! [`KF’!4 I“ôNï+&iÓ4iiRÚî†64%„ÜIϤG®iÓ&é}7¤¿YÍì>sÓOúG?ŸúóYi¿ïš7oÞάüðé{îeŒ5ò Ïà3m¼ÆÆkí,׉Yv6w|6ŸSÄÆózñÑ`ãvfωç É<ñq¹Àùân¸[hç‹øbKìøX*î–òåVˆ¡VÚø*_ÍYA&Íög8ãaÎ Ó©®T2 ôpæPØšèêæÌîò¹7†5¯æÒ9åJ%ášÌ¶E{úãy˜Ä}ÒÂãk!]HNH‰>º&$÷KI$èvæ$'9+­]sEr¢ç9+"—?¬ot…4iYürÑü‚8+18†]­šÏ)¤û¤´9âwY¾ûeH!uka=0Bó€ØöY¶‡8³ÃûÜKÝÙdÙ< G„;%M=~·eú 4…˜>„êÉ“ Hw7ù(gEBØrú¢>&KÒÚk ¿Çåmm½í 9e!%ñž4ÖÚuÍoLñ))szu¬œ³IÈžV3 yZ¬ ÏHi0 Õ}V%¤d¨ç¤X„ ⬩»T‘_ä¬<·¶ÍΈW·B¿$ EÐv¦ôeYHIäW8« QˆæUÎÊŒîÕzØ’£ÍsáÑDZ¢êö%²R5™Ž ’—©2AlæÇË9k´7$j¢¹#!¢­à¬RjE?ꞀßRŽV™j¡6K3Ç#+ä · «RNZ*Hnc¥Æðë!§Ëª*ÏÙhª!Nä8r|˧JF“ â2Q–f]D‹‡Ir&†˜˜O–%3äæü¦p6ÆxBõvŠÖn=ùØ®réZ:Óm¦ÌÊR‰í@hjd•ƒ!ýì*×ʈD©üê,•±«Í’µ1UÊg¶\o‘…Ë©;½’~£Ì„jÍ Ì%óVJvžL¥ÝçÍmpVÌrÞ¦Ê ¸P&ijT´EÒ}0àñ“vX,]”ÆŒµD.¡R¨PKåFÐ V˜erÿR3Ärù, ¡r_¡êy¨ù*é.¤¦ûjé.„ÊÝ)Óuƒƒ#4Ét¥Â â’ *å*Ž[ŠQré MfgˆÍÍ2;Cª"´¨‡¥ÃðwXgo•¡¥BÙ{d‚9CóÐâkT‚b4K¼VO-Ö̽jËj!›*÷É6ž"¶Ûº.~©#ÍnN+ ›ÂliS”•ÇlMÙ:µïpT[¬7×bÓ¸]NÖ’T7pVe4U›æ×ýÝÓìAãz<¯àlü9MT!£VûO½åºI.Iä?©Ûf™ŽT˜ivÉPRNí–rg5=’rº.–Vü>Y/!Uin“ (d¦{ÚÜaÅai£üjÕ49… ²Ë< ±ç™x ©9^«uX®“#(ér½ ¥jˆäþe:#zk äÙ`\hoT½Â2úuÓk u“:IL9Ø€:~L•n·tò9ð”úÍê˜S*ås‹:æ”Âç6µ„;|ƒbÝ®žªœBEºCí9±çN¼ ÇúÓ®ÞN¤WÍdâél/¹îD&º©'©hÝ¢ðÎd¶;žMÄ8›ëYu,Õ[Ý›ˆ¥S™Ôæluf[<·ÇÓÕ[:7ŪÃÙt<ÚëN%ãHÓ»%º=ÚÐMv5¸„+vÌ‚å‰d"»’³¼šÚ6Îò]©NXÚ3ñls:Õ«»ñV>«Æ‹!Ì!Ì!Ä 0 Å£ñô2Á®]‹÷™ÛÄVYÔϺä´0âÙ™æD2Úcðƒµt:…¾,ìŽfäûQ"ãÌf“ÎØVôðŽh&ty’MÑl OE BFú:£Ù¸4Flm%ð$.ÈÕ‡³é5dæ¨H"Ùµ¬öÅ(\ë1ÊaãMlÛpz†•?•mFôNs–œM¶Lü)ÃÈßœ3Óràu¬ÂÝ^³ñföìiÞÊ&;¸ƒâlœåìTK.Ý<|¼ƒU±‰^,>ÖÀ‘MŽk¹×Æ}l¬U6EH&ᯈxœ‰¥ª7—ªÞ\ªz±TõV78øe¼Úý·*çsþå¥T; Ë`4¶5Žê7 m»Î6²ôŒZ£56§Òþho\ôÖÅíÏà~6]N½¿Å2hE-)g3†×½x,‘~g$™It%ãM;³âAè3f£ïì9}¸;•ÆìlâÞ#ºl”hðT2åf1¿¦vèçÅœºå…,/Ö ŸÈtôoM%i/šÛÏ$ÒñN³“ÂÆk6•gð3ä*6B4îFˆN2¾§ßã`3¿F¦²KÁ—®O'<<“p ¸–pxáÙà9„ëÁ „Ás Ï_Nx>xá…àE„ƒ—^ ^Fx9xá•àU„Wƒ„›À.Ân°F¸ÜB¸ì!¼¼–°ì#ìÁë‡ÀaÂ:8B¸ ¼žp;¸ƒðð›¿üÂoo$|8Jx8F¸'¼ÜE¸œ ¼¼•p¸—pœ"ÜÞF8 Î΂û oï |%x'á·¯"üvðÕ„w¯!|-ø„¯_Oøð; ¿ ünÂï¿—ðûÀï'|#ø„?þáƒ?Bø£àþ8ø„? þá›À„wƒo&| øÓ„?¾•ðgÁ·þøvÂw€?Oø à=„¿¾“ð]à/Þ þ2ᯀ¿JxønÂûÁ"||„ðQð×ß>Føëào¾|œð7Á÷þøáûÁ' ?>EøAðC„?BøQðc„?AøIð· ü]ÂߟðÀO~üCÂ?ÿ˜ðOÀÏ~üáçÁ/þ)øg„þáÁ¿$ü+ðK„ þ á—Á¯~ü[¿ÿžðÀ$ü'ðŸ ÿüWÂÿð?Àÿ$ü/ðk„Oƒ_·˜ãüãœðpá|ðHÂ`áBpa;®bãœ'Þòç%LüŠw4“Æê*À£AåÆYw„ÜmˆÿºU"”PoEÚ#ð½±nÖaf;Ä ÷³¢Ý¬¶œ½VwÞʦ”³Ó¹»Êrözî®ø³waÅÇ…ã%¿KÄwé!V†¯òìb€KÉhc`>ùÈëVÆÇññgex•ì5,ãx•TW!?¡.…zTþ®ÝÌ–¿‡åç)Éç6¹kà ÃI¦áDiX& ËÊβœ|Ë©gYN1-'IËraYή=Ët*Ÿ&MWÊùÎó½+·"³qÀuÒT^u‡Ù˜f‡Y"ØkƺT [0&« ÐŠU –³^üðýäÿ_ÿ×s­ù>×ýÅÆ:ß5”þBñ†ç|õaCÜÿ§ó{#×f¨Z™ßpl.v-†ªÇpsŽÝp¯ ­ÿ…l†3¯¡úþbÖñB5{#ûe8µºÐsËòÕ Q(þ #øò€¯¨;Êø>ï1–‡£;ÇòÈãÆ)”ÏF ½ù&1Ý|sh4ü«ÞÏ*O±ÒбGÙ%XåV Þ•ÕQ|€É‹PK½\C7üÌßZõ.com/microsoft/sqlserver/jdbc/StreamError.class•U[sÛTþNãX¶¢\ì^L'µ°-…’PhRÜôâ´%¥\éÄVbK‰$òøô…ÇÌ0<”¶I;í }d†Ű+)Š 2ãÝsv¿Ýs¾=»ÊŸ=ýÀ:*>ÅTUôa–Å\9̳øŒÅç,T¼ŽK)|¡¢†ËlYTpEŇäp•Í×X\gQgÀ‹¼½©â¾äÕ2Ûn³ø*…;ù5ßàß*øN@“®ë¸—¥çé )­­éwõJK·•ºïZvcZ` À,vÚ+Ò j`©ûºO1ƒáFÞ•®åo‘Ó“.­õ69S®c„KµeÙ2ÎrIàh^÷ë[ŽíÍZž¾Ò’&yn ¤ë[¶ß”¾e”Áò†Óη-ÃuCƒx¸BíGQš©ÿCCmyËuǾâÖhzá¦ïÌp7µ€ÙéËt”žåJ3nNúŽGßï}•4ý¨ÙÁÔïÎGz<Ò‘ÿT¤©QIŽò€ž1°¥¸sã]#¨ÐïÒ.Cš&ý¥GHÞ#x§{¸•_#÷™žîÔžûýžîtèräÑÀ=TÊà—ÇPKÙ$‹pâùW"}„tŽ`“»Ð~Fæïaà†–cøy‰¬#aÜGôKPÖiÒ3q†&ýûã w˜¹ÅðìÖÚR‘N—&Ù½‹£t‹`­ëc]ëãŒ=±‹—~‚J«Ñm¤8æÇ¼|ðüÏtþDÄ [zq¿ö }tïEö?*@àß{¯OâMvz÷ûÃÙWžàÕå‡ÛF’,»xí”Ä6}1UîoPK½\C7ÄAÖ¯-com/microsoft/sqlserver/jdbc/StreamInfo.classS]SÓ@=K iC´´UÄ/>4@[ Åï" -Ì0ÓaÔ¢3ð’m ¶‰&å¯ðâ#¾((02#Îø£ï¦%EÆA2“ìÝÝsï=Ùsö×ïï?ŒcVƆ%¤$¤e„Ÿ0*aL†„LIdeä0.¢[nËPP±r7‚{2÷E©JxĪ»U†LI·ë¹º©;¶kW¼œû®ærg;¹UcYÏ•=‡kõDZâ‹;ˆm¡ƒVv‘Ø„ÞB8´ƒÎ&ù?PK½\C7Á¤Šqm1com/microsoft/sqlserver/jdbc/StreamLoginAck.classT]sÓV=—Ø–,Ô:6I å«&u°B”’šÏ6Ť€CÚP¾éÚØR*)ÞúÖÐ7^úÀCž˜)0†ÌÀ#3ü¨NwåD ®ÛÁ3Þ»Ú=Wgïî¹z÷÷«×†±¬á¾TpRÁ) ]8ÍfDÃgøJÃ|Æ~œU0ª!͹3csŽÃãìWð† ç2˜P1É딊i3ìÎ2ò[6ß©˜Óhýž/((+¸( *—Ëéß“þ¢ôÇsrå;æ=Ó¨›nͨ„¾ãÖF´Ðb„˜Ø“7ƒ@ú!‚i'0—ëÒ¦Ì5tå®ÈбNXu‚å-¯‘o8–ï^5̿ԃˆ2Ç^¶òÄ!ÍFÙ«9î„u—jÚÁ?ÅÛ‰>5æ¸N8.ÐU\HLy¶¤¢Îú^caº"0T(Ó1Á4®HÓ–þ(¿A›¹oÉÕ¨zóDÐ*TàháßÇìP‘:fÕ£šü ã Cm¨y/œõÖ\;¦8° ™÷"䬶@¾ïù:¾@AÇe\a¯¢`AÇU,ê8‚Ïú·7Olõ~sÛ ú‰Í!Ö±šC_û9&תUIàŸq&Ubç9ÃÐq·tÀAG1@ݤ^–â^–â^–¸—¥÷G¦£CÇm˜­}ÿ=ƒöQ~ú’iÝ•¡€ñÿØ-ïhv¦mJÕóçÍI'ͳ›2×òíùŠïýÊj~oêÛQ_aŽ4ðajè¦SØWÝÀ©¹Òž|ÊHÅt…²;•Ï7Ásn8éÔf\Û1ÝæX¤ùÖ z©†N×4e®®J—.â¾N€–FÛNÜAämp5ô¶ˆ{ yûl8¾´c]VB3\ ¢“^£ïÜ~ú¢ ú“ÄÀ?Ò)Ù~V6òQLeíÅOŒ¦ë@σäõ`y„)fñøROÐú1DFüA;TZ'ÀPÊŸÈ>…ú»7^zí wŸãÌx‘¬þ ñSŸM°3’ŒlŠm·zŸ—ßF”â2´½»7ÙD6—kbOoª;ýj®gÉ\oˆSô¶l}ÏñI«ÀcÑAŽSitK6K u­¹âKˆ¿Êè"®!ù&:dÉ(¿Õ–ḠÃQœ2OÑÿ™ÜÞ—øtéúב¢HûBI¬#Ñõ êf‹þPK½\C7£ÅQ²/com/microsoft/sqlserver/jdbc/StreamPacket.class}P»NÃ0=NBCC€–GÆ4 f±ð*U⑊ÝML•´‰CbUðO,H $>€B\\ˆ˜jɾ:ûðýüzÿpˆ^6ºl¹Øv±Ãà•"žJ=z,%0øBj*‹e}"S•h§EªO {Kl0ø ^-õE¥òÑYÄp c•ó<+U«;ÍëûY-«¹¬x–ŒcN¦)Y™Ôó‡X–:UEíb×Ç Z><¬1ô—V‰t%E~eFgèdb.øL~9ÎdL_ž~=Œ lÚ;û´‡–ÄèÒô:èÀÅ*1mB]ŠF _Àž°84é¯Üƒed/|ƒÚ¯`ÏÇÿç±ÏÞŸ‡º®cƒ<›Ðw€oPK½\C7ʈð?¢Ì2com/microsoft/sqlserver/jdbc/StreamRetStatus.classS]SÓP=—–¦ AZPDQD Ø–Ú"~[ü€Vf˜é0JÑx É¥ÛD“€ö¯ðâ#/>((02#Îø£÷¦%­ø1d¦½ÙݳgÏÝÝüøùõ€qeŒâš„¤„”ŒÒâo,†22zq]F9aŽK¸!C€,&„çf·d:o Š;îJ¸Çq=Í[wØ,CŸª¹.w<Ó¶Ü¢éjËUnPd‰!V®[Þ*÷LaB¯LÕíšZ3uÇvíOußT)sƒ;êš±¬«eÏáZmž{å&}¢´¦mh¹ªfUr‘Ÿ'ÒJ+J¦H@¸`œDMš–é=ò½/d—{3Ž][(–Æ’%ªœ *ç‚Ê9Q9G y®ÜÉû©Oßéüµ! ÷‰¹¡a$Ù&ˆÔšV%Ÿú‹Æè¤^õÅHx  J>†š³½{Ý2‚R C-Ȝ탊|¥rÛQpC &ñPAN “ø+x‚AgÐÏ0Ðb˜:šI3wJ€pŽ!CÈÈÈŠNdÍ@ÁU¨ ¦Qh$þ»… /uø3MÅ=†Üÿ±ÏKeßlkVϱ~2H+¶3§Õhb¢÷mÝ¥÷LûÈVû­XÐߦÖòÒ.%gÅŒžl[ât ã…åš‹Óu*JÂ5kÑ­ú îš7‚Y´íí}— úø@Ÿb‡˜'½ ˆ)‚á,Äã ¬NÄqƒd_ +A'ÞôgD> ñÐz4Ã}D)ÂR:^߃ô© ¸„a @†Î:‡ãõ±]Dß#±Ø&º /î¡ë0M^å "ÌËô áÒDëÐämrô¦÷Á>–¢Ô0%vúÅäYÄn3È÷ý€ºîïèé=µžÅto!Bž]Ä7!…·í ÖÔþ PK½\C7Úû|ü1com/microsoft/sqlserver/jdbc/StreamRetValue.classT[SÓ@þ––¦ Qh¹ˆ¨Z°-Ø‚‚7åªh¥È ¼…d)Á6Á$ ü^|ä…¹ŒÌÈ£3þ(dzi Ñ!3ÙÍ9û³ßžóeþúö@&etâ¶„´„ŒŒºÄÐAîȨÇ]=èæ= ÷eÈЃbx(ÜÄÐ'†þ0Ë4ˆŒO$<•0ÈYVmµ8¡9C,»¤®ª™‚jæ39×6Ì|Cµe놩&í,7óî"g9®ê®8 µqÕq¸í–錎:_à:Aæ(snÍt¹kh ÝZ`qÍ*Æ‹†f[޵àÆ÷Š\åv|IŸ×â´#W‹SÜQ +Ä&zŒÍ°'2±ÙI¤¼ÂD)îß=ÝÒä9ЯUíw2ÿÇ¾Éæ<óXåªO—AZ°ì’´#¢ÃêŠCßÇû7½h[„jO´ðÈKÂJŒ 9´ŸO: 5t ý­éy“ëCk®òqWnѲ]ßgh$Û’ˆêi«³þÁ;†Íu¿¹òßG"Ÿ£K¢Žn ¢­ôU!¤áÍMÞÜ(„†kOX´Ü·*Qƒ´’}ƒ¬(ÍLxS_ÚDé!Å•—ë(¥X§¢ØÜƒô¥ŒhC;­Ä ]O4÷ cáOˆn!²Žªȳ{¨:L‘WÙA(Õ!–wqa…/¼ƒêRº[ôi›1%¥•‹ DâXjìsöJ¤ÀÊCRÐ;?ü3vø¤»†ÞS¨iÇŸtÖm#LÅÐSƒL;¨h.UA®ë¸® [Â(ÆøŠB?‘ðã:q‘¡«æ<~Âû±[žƒÎã‚„Š.á2à ё éȆtd9Ùãn OÂ&«>ÿ¦°^¥Ô3šþÚô”ÿcŸ—Ô`[ÇSë)*„%ÇÖ*¤zœÓ^ÐÖ=ZÕ«5»â:oyþ!XÍJ}“œâ✭QÚèÆKÛ³–mÓÈoúfЀ¼GëÔÇ¥[ƹƒxµÉ…üT«Ó0=Ë5P1Õ×üu/4O/5Aoô8Áå£×$6øˆq)Ã]”>jÚ_ ð ´"Lº?÷ÑôÕуktÂ9òà‘dö ¼Gûb[h>D|nâ›ÇÒÝ_cŸ!eÒŸ Eº÷p®¨7HÈpŠ 99@s͉ô؇Ò!"(Jq‚b¢h ÎOÊ—ÃrG; ï å;Z­h›ÛEË6šÈ²‡ö-ÑmD#»ˆ_å7PK½\C7 Mÿ©†ó&com/microsoft/sqlserver/jdbc/TDS.class}—û{UÇßiÚfš¦i:éˆ/hhŠ€AìììÙdÈìÌvf6ið2¦é¶¦MwK²-­7¨(¢(Š¢(жbo:xi+(Þo(J½_ðŠþÈŸ@ë÷Ù={’‡}ž“ÌçûÎ9ï{Þóž³gŸ<ÿØD´‰þ§ÓwuzB§ïéô}~ Óuú‘N?Öé':ýT§Ÿéôs~¡Ó“:ý²“~ÕE½ô”N¿æÿ¿é¢§é\ý–~§ÓïYùƒNÔéO:ýY§¿èô×.z)=ÕIë¤g4Z1.üh²<æ¹i¶F«¬Zu¾>U­OÍî¯tÌ­ %uñKÁ¨íx£ûz‰4ZÉJÙs½ ·ACêóAä‹0 B3díF«Y³<§(B3o†&ˇћåÐ̹fQ°t$•ð¦í<–Ž"4–ëR2Gòh›i…¼{‹QNðæmp㢇7ÿÍœ“½Ü£å‹v˜ ½|ÏqrØù©Ô )0dz.+Jca´µ,üI üŒ¨SUá@íágËt-á@Úš¾†À‘{~ÂÑâ¹›7á„`ÊNŒ5ðÄŒÌ$gk×ñXã€,HŠ_4ÔAª ¯È[·%˜a(Ü$‡˜B{{#.ô–†D"«–çâ8ï³]T‘éD%tåsÙ¾‰‹¦—׆»äÊ…NñQaæùx‡§B®q¶v8雿.^h®åO&‹vņñˆU[h G}8¶óf¡±húÁ¢qÀ¾P<¡ð‹¶k†žßq¬Paä ¨ß&¡ûê \¹)—¤—“enÚm_'¨<Ã"*Ö‘#Ü‘0Ùý(·ÀâjC0ј˜ÄJð¦oJùI|ßÙ(›õ-­àù¦ŸG@\jR^Oõ]lݬfß2àðÂ)æŽ%Ä‘“3¨i6Ë¡e‡÷-´e§óØV[–—dÀÌ‚2J£Orlaiú"§½hˆ4²8ØEÔq.ñt N'¢¼í Þzé8a9ÇQÉ1-Tà|+óäca,Kˆ¼ÀŒ×µ[à!°Ýì³]•zXÛS©ºS{+xmÐrvO˜žªîês3Õ]×i´Ôªí€ÙÀÛ¢:=wh_}¦Vu**³-¿~¦:S¿A£ŽÁ!œ•}òUf`pÓÁÍ×avÊe† ×\1ćYë:âyU&¦šD¼z(½£$WšDâQ{ÒKM"˜™€kM"ä lP/6‰Å‚emÛÕ&‘óÙH ùf€éõ†EqåPz7ãã*Qò™Â×V ¬ôÉ—œDP×µ_s½À R³žÛ¿sge®›§ï`'ì¯î©Ön©Ôy­¸S7ýþÑIÿì¦ÑÙNúw7ý‡o^ÚP7ý—:’M»„7ë*lÒlÒ’ç‡\ :¶huÄ!·Ò\ÕY^Vv¡ÑÀtmïðÞ™é¹Ú|mg}xþæÙùÊÜÊÜðîÛ§‡1¬J+noûîÊt1µo_¥ºC£ËÖÒÂòjLE¶¦e±«õʮʎ•zm´r°ñb›³L e¸›³¦æQ k-_½^k<ãÂKpƒ'ªÐFlç—aÓ¾œ/Œô ð+%¾ü*‰_ ”x|©Ä—/—ø5à×J< Þ$ñà×I|%ø*‰¯¿^âÍàk$¾ü‰¯_/ñÁ7Hü&ð‰MpNb œ—X€ 4ÒäQ°-ñà1‰pQbìI\o•؇à²Äãà ‰·'%¾ üf‰ß~«ÄoG¿<%ñvð´Ä;Àe¾;•ùîRæ÷%Þ‰wƒ÷H< Þ+q\“òÍþöIÌþn–˜ýÍIÌþæ%fu‰Ùß~‰€o‘ø øÄï¿‹ÞÝæÿ=R¼\ÿïUòs«²¾·)ë{XYß÷)ùº]Yß÷KþyüHÌõu‡ÄœJÌþ×÷.‰9?wKü!ð=ü‰y¾÷*ñ|TÉÏÇ”øî“˜ç÷q)¿Ÿß¯¬ß'ŸRü= øû´âï3J>”˜×ã³üâïóŠ¿/(þVü}QïKUêùËJ=?¢ÔóW”|Sêù¸’¿ŸŸ’ø«à¯)þcÅÿ£Šÿ¯+þ¿¡ŒÿMeüo)ãŸn¿Ê: åÛPžI~Æ=Ý‚øóïc´Ch·£F»íÚ]hGÑîA;†v/Úq´ûи÷ýh'Ñ@;…ö Ú9´‡ÐžE{í¹t¬çÑA;ŸŽqûZl,‰ŽØXËbcyltƆ+b£+6VÆFwl¬ŠžØX?N½“ghaœ¦¾þ³´ö4­Ã“±NÓ†8™ÍFz¬9Ó‰t¦cýÇÛeÔøðµž¿i9?—  cã¢Øè5\üN–ðÕ'u²&ùÁL´ìÒ3ôâGþPK½\C7)»l¤Š Ncom/microsoft/sqlserver/jdbc/TDSChannel$HostNameOverrideX509TrustManager.class­Wù_Ûdÿ†–¶”¨Xw¸‰3nlëÅsŠC8˜Zœâ%oif›Ô$æ}ß÷}ç1oçAQ÷Q÷/ñðgõy’ÂÊ~”~ò¾Ïûæ¹Ïðû_?ÿ  ?´a®‰c#®ã:ø8Åõq´ú7{º!†yç×7ñrs›p C·Æpnçå^T^öò¢µA‡ˆ£ˆ‰J¼1ì‹Õü¦C…/Í(¬ªqÜ;Ž p¢p£¨1'ùj*ŽÍpøf:†ý1ÜÃ=1ÜÃ}í¸÷ÇðïÆðPã‘ã1<΢žà7OFñTÏJˆ”­‰ aKX?¼OTs5×(çøÎ0'rÃÞ»K$Äé&o™®˜v%$|̲J×&DÂ8MEµVvÇìšãލ¦ê1U<Ôéœ)Üœã”s7^Ð{q3ÆJ–㎪Aº¸%Ãéê•Ö¬J®bh¶åXE"½«ì{Rع}ú^-7¶³/©¦)ÊDßVØoº%á1Øn˜†{©„'’+æ°rÄeL9Þ+©=ÂyK'ÓN©ª¶#òV¥b™¾±[’Až=kR-ºêŠ‚§S™ya»FÑÐèZÂê V$;>0­‰ªkX¦CQÓJB»3_6„éIèú’7û¤ŽÐj¶áîÏiÄØ³­I¦ù}­8&&„»Cc±Brœš°IöÖdjErd\Ž2òx.Šçe¼€e\Œ> kŽUàŠZ±(l/áe¯àU ]JrW#“v“B¶¡‹cC”ê“ñ\‚í2úq©Œ×ùx¶Kif¿Œ7𦌷ð¶Œwð®Œ÷ð>D1#ãŒâCác Ê?,¤ŒBù§øY£˜$ŸÄ|‚!Æ£;G½KÅ0í¨­„3ˆ+eÂA ·(ƒªQºâZŠ—(>ÇÚÞ}Bs}ê¢mU¼Û&Še/:."0ETªîþŸ²2k=rçF„ã?-»¢R=w\w;saÏùjDñ™ŒÏY»4L#°M[K Á'ûÖqz3AWÁ:Z2G±3sX?"e?Á„Ox†G¨vÎyÆgýeg¶þ‚ã¡#Ø4ÎjÌ¡«0æS†Á>7w³¿·Ìaëo¡¬¯krfyy©'/$Ï—– ”ãÙ´\ Öv’söì—o¿“=góûÏ÷_oEL'a)/££ýÊ»ªášŽX*b+o ‰ëÊÞPÓ7[q ·uÜÁ`w•JbXȆ{jxĠ˂Ȗœ à>ƒ•sÃ%{És£P„Ei‹¾àÑ ìżkÏçkІ?\XàCGnÑYqì²ô|[ż`ÁÎÅs„Ò)’ ÉW%CªŠôBäeD@Å#Kžè`hͯ²Ä¥çRðžxòÃ+³aI ­× ‰lXà¤È-q÷CÖ÷x 碲¼À0l¾¯ Ü-Gž\³]IûÍí¡,9^ÑsÉGö&£ˆõ‰U—/K/ „†ÑÍò±’­R \Žº Ç SB”y$zM«¡u t¢Ý@Æ œF»†¬qL8ƒ³ §w«+‹<20‰Çž`Š¡+mÎòhÉÂ[áŠ=ÖõÜ Ú3kØÀSíÀ9 Ï äð\ôÌ2¤Ó1–hÓnüÒÒî¶²´Ùmx— Û¸ê&ìÄ1\üwš c îgÏþÉPq4iLÑóQÖw„à´Ç·_ÝÌü"w©b»ThÕ8­/|{/EoLvd±U M¦*Þ“¢v ÉÕZ¬Ó´j²Ã2$¿ºÝ '7Á»úÌY^æ_¿Y§r÷„ªeCÏ%e¸ÉÜ^G_Qb“SÓ gë©Tâ9³_Ô3žP®3ïs•ë¾$Ö;Z©è„:U/‰×tV¶Ñ)IÓH ¥ºƒÎÏ”jŒØRIÇ–ú‡0ç¡~ ººpÆiòþÀõLß:Xf‡2ýëhÊôWXGsæZÞn@£a²‚Ö”N· ¯Ãø“1tã"ÅTƒ5ª¾Ì74Å‘ Ž~BZ j$äŠäX•¤‚ãU’K±*†º.ÿ?݉è® ·–è ²ŒlsÓO¤>×Ä? »N¶¾&÷‘ú PK½\C7ËúrÇ”à >com/microsoft/sqlserver/jdbc/TDSChannel$ProxyInputStream.classVkSg~VrYÂj1Љ5ZªI€†V«ÈÅ ÚP@k(­ØÛ’¼ a7înzÓÚë_è/ð‹íŒ­®vFgú¥3ýQž³ ™„$ - {Þ=—çœçì9»üõ÷oÏŒàûNÄp5€8¦ù4Àx³)Ìðæü˜ÀiV/ð隌ë,ß–qƒešÝ9þK,ß•ñ[nÊX–q‹UïËø€å‡~|ÄØÐ•#WddØ’å‹‘ãȼŒU¾×d¬±\—Q`¹á‡îÇm rZÁ¦È¦mS¨zæÖÔM5¡‰”^,Ùeõ¸Ÿ½ªY#bsc#±¡eLÃ2rvº]°„¹)ÌÄZv%“X¼šN®ªº. Ô™ÞÖíUak˜Ðt;(áJtÏMk‰-Ið$¬pÐöÌ.½ÑÖQÖºV$ÍJLoeDÑÖ Ý¢J)D+¨+BíˆÆRäEaY Þè­)¾õ“L¥ø´C5×Ó¥bÑ0m‘uݗɵŒâL^SPi®ï2à †ñŠBƒ2¥`C~˜ ,Ø~”lâŽ[ ¶ñ‰„#nýUÏ'¨xMÏO•r9AÞŸâ3Ÿã ª=’&*E²EXs—ÚYÙ¶…¥à;}‰û ^Ç9"VöYrÅ ’ñ•„îrD¤†y0rƒH3ª.¶l×®`Œ£:«VУ=Tmòµj|; ¾á ¾Å}.Š£Ü “ §ßO*»dê U×È1·®ïh$#󤯡à.KQµÔf½mDЦØÔŒ’åb(¸‚) r$I}&I¾Ý㘠\7­íša¡Þ4ª”ùšÉ‚jYªå_ëtz)é ª™Œ°h£Fh§ÂÑXyhK¶VHŒ|žX$æH “z}´‰Ml2Šo&µ0^”Ð×,ž}(¼·4U¡Y|,?ýp´%Ox—moy"%Þ)¹fNù5¡Ò¬é´CÑFscDy²).D;ÙÚ*ÛÆN^_NÓ…E«ÕÓ,Á#¥þÉà #ÞyaÏSûÕ<ñö0$.· ¤­ÑkØG¿´¼t ò:CBüÓå~^¥û×è"¯’/ÄŸ@Š?žøÐtÙùH_G›ÁŽW`ÿ XÉŸ:&k€‡š÷Òeð×\ßÒA}“0ºà"„\„XKÒÃÂ;ádžŸ·mÔ‹t ×' ?$çq™Þjý Ì&*Ìþ$ä/m30¯cMh…IyüœçÆÇ¼5Ôâ-©õyk¹õyŸ·m)“ëñÔçîñ0½³MéÑ£²(Ó•‰»P~ȑډ;Õ4׉òĬ6‰?&ÈTr²mÇ^ÚÞúŽ‘j`geéôŸ'÷å]“{êQÃä&ÿìé]°ÑFØ"$cô¿¨à?PK½\C7 ‚cµ?com/microsoft/sqlserver/jdbc/TDSChannel$ProxyOutputStream.classTëRÓPþŽ…¦Ô¨Xo(¨UQÓ‹ïwÄVÐ*ŠZ¼ÿ åâ„“S”Gñ1t´::ãøPŽßi‹"¤#c;'»çÛÝo÷ìÙäÇϯߌàep"½8©5;MìTNãLgqÎÀù4 œÔð­]Lá’–—µùŠŽ»šÂ5-GS¸®-c)ÜH“ª¤ÁR e-o7p[`kÝõ” ålU…ÒYØ=ùÊYrl7°§j±¡Úø¤šw£áÜd-X°ÜZDA]ÙÑk/’á’ íW³35{úfµ<ïø¾ôÔW]öÕ¼TnW]ßU£%kà ñÅäžô”ƒY)°=’jbÍöZÝÃzk^1.aé]zümM.*7ð#Zë^#š§|ºŠ^½ÖË’ö3(+•VZ‹ÂÄö›8ˆ£&öaÐÀw1iàž‰û˜2ðÀÄC«c_°£Ù™e%#9vþ6k:O¶ŒÚV¸´Á†?ƒ·Ë«»ÆÇ`f…ÞaÙs¢HFL×o+peêw£Žo°^S«ÉˆC7±²ríkm(׳½`nާ´')eÈIÛc“Kš%9Q¹?^æ\ÄÅk†t£fn¤UgÆ“ºŠ®$9ÞÈfз}×lËJÉ«&@¿IÎâ¢ôgŠÖzóúˆöÌ0.¥‚ædÝõe¤vÅQp¬9§Ý˜øíà7ØÄ?ç—ZFO4@ÿ ®ƒÈrˆÚ ½”Ûò…OùÏØ”/~Bâ}˵‡q¤ã˜iIíØ± =ËDµý:iå™/èù€Þ&’ïp˜ú7Ï?#•ÿÑD_éÌf>š0›ØB0ÑÄÖ6Ù1®Rç²þƒvÛÚþõ´9ä;´wˆéÓŒ®¢-ÆÒnç£ð½‰LfÇŸ…„†vÆe(t2Ü%Ö£°*C¡k†ýkð…!‚»âR;)ÆØ}ˆ³ÿìÍ›Ø³ž÷õ4å'hý¿PK½\C7=LâÄ ö9com/microsoft/sqlserver/jdbc/TDSChannel$ProxySocket.classµW‰{Õÿ­-[yÇŽ碈Æmäƒ(@[À >pqã9´v/Ö«•½‰¼k´+“p¶´Ð»h ô¾KÛ´M(¶)n¡@O ÷}sõnÿ…~ÙCÙÕJ[YßWûÛyïÍ›÷›yoÞÌ<=ñŸ‡°ÿ^‡!¼'aÜν÷&pîäÞ]q¼/fÜΜ÷sï"îæöž¾7Ž&ЊÇñ‘Úð±8>ž@;>Á“ŸŒãS tâÓ<ø ÷>ËsŸ[‡ûðù¾€/Š8Éí—D|™ñ¿ÂœbršÉýL¾Êä&KL–™¬0yÉט<Äd•É×™|ƒÉÃLî‰ã‘Ò¼§ûðM²²ÇD<ÎöKÄ·E|GÄwE|OÄ÷EGR5uÍ‚=W ˆY•ŽÝT]Kè°v§œs׌´ÿ JÌ€á ²~Vµ§ß•ê©AŠWÔK3tRÔFë‚G¸Å·°ì|%ª5”ÍTÓôÉ3í›!Y‰d¯PÕ…¡¼¶H»kLõLÇñ3GḡÈùˆäqË–°Écf å˜Oã6¿ÆÀœ«sbbxLÏk:éŒÓÐÁì¤Þ•ª¢’)ÃÅ\N-d´ëH`³Íž7,µLK›=Q4Õ§8UÏú—·0ϧ˜à˜’ìѤ6¯ERÙJÃIeá1ªæåädAÎå4Å 2O3‡¢ž jæHÞ0Uê¶P× «¡XmºèÞØ9kfEG ³ªnÊ–ì¨ð]o–nž„Õp%n’0‚Ñ8~.áø¥„8H—®ÜAÎF%ü ‹~ßÉ”žœcìPä¹Ëp¹€KkMp™Ìøå²ž5çäcjY„W›b›3ö×£"˜|ªÌ°‚ß ¸¸î$Í¿“ð L¸¨Þz ¿—0†q À™ü)ާ%<ƒgãxNÂóø3e äeªe‘’/MšîÚ¿à¯äÄÒ¤a[Wšýþ.áµx„×ã dîÍ@‘Ý‹ófy8ÇDcÞQæãažÉ<y¨úl,åð‰RÚ–ð<Ë·dlV7ø%íð’ðO6­û »Rœ%M"|Ñþ%àœ€l0êA[ËðüQ¸)¸¾ˆ›Ëø¥Pì Løƒ2¨&žþUÁ@ÝžñBÖ?U¼Aó|aœð•’ Ötל¸¥ìµ•%U2±ŒSò°€]5*¤·Š])wÝ/W~ÙµXõ½bÑ,/,¨\úS᢮#ÎÍ ”»ÿï šŸmÕR—]†×`YÕ—ÔP þ–WÃjyK-¨Ù3着â[SÕÍéªàOu‘ß|pìÐÌ$-¯äs–ô®X…ë@u\3¹+ÏäÕ35¿HÏ4éÊQ˜te7Uº+ü(…RB÷y{èù¼·ö# ½æø¹Â£&g‡ÞvzT»ŒHÒ/¹aúÅØŒ.µÔëà*k·T.í–ò¼ÝRѰ[*ÎðJð_/}Tóh±¦èŠNƱ„Ö/ãÚÍdÒÃîJPR†!¬ö¼fÛ–Ð6ªÉö^$òÑ‘T’3¼ÙÓÃLOïÐvjÉ¢£ç“LÓždÚÝ#®0QÚMû ‘2g^#ÒCŒÄ!›†hÛã uÛÚ$Lˆ²“–£›†½L·µíy‘“ m%Ð2{ §W8z–Œ;½ºm•Ð|«¡°Ç‹tCw‘pptÌ«Rÿ;ãÈ6o’ào7s„Ä8aØEKëZmOÞÔ_Œ÷û³¢à‚CÌvŸ^ !¶²y% ¤¤Ì—’PÛÖÆ£Lc*ųà¢lÞ _Ár<ª`Ò –¢MÆ» ÞÃû îÇ Ä"àCƒš<4amÅîna)ø|ŒO$4ª±ÚR†Qó™o1–ÈøTÁ!¬“qXÁgø\ÆGqLÂjµÓT{«âª%ìE'Ôít&l•Ìëy> uy¾h÷’ *™«0] UÛ5™Pp'|´„äMS’Y—θKR QµÃȱ Ê—Ú/l[ëªÓk‰]ª¨rQP_rP_áVÝL¦Öxj[ÚJª\·¬¬[·lG-hÙ>á¨f÷ÿ«+øßÈPð-N*øßÓéötx°TÔ uŠŽ†š¡ãP`fÎÌ)*˜2†‰¡²ŠÓÝ‰Ó ~àÙZd´cuk^Z-¼Ë2-–¯Zg…?*ø gœÅ9 ³ Ú„mƒ6ÁÐ&®vç1(£¤àNJXüoФæDI˜2âεTÔR—üײ,Çz+*°áTÛz<6zkò; ¦+ít Þ¤¡ŽqLš—‹QÂÄ*óõ=5   n0'vãöå¢&¹ cV5Ϻ5çÉw¯D);Ã8.v24å©ÎŽÌ Ó† ŽyVÏâ0qÓéÖmž–Í̈¨¤™.Š@·n›î›IÃEÏ]”°Y]®nZöÞÂÏ¢n#ÝZ†È–û¼ђé5“kROë?•‘0V·»Š}¦±ÆJkNýœB ss_ë–>7üÓ©ïœJf¢P D¥£L¢,-+X,u±âëØö.Ò27ËO‡(…õ‰záD9œhm!Œ¯1à¾:øL–uH¸{”3YhB¢Û('lÝ9¯QQ\NцJO°ùôD“á[Œf¾ÈÜ‘®1w¤;ÈéÊ£q*7?Hèà—QéJôV2ýV Eë•4KÃ?Kâ-ƒâP÷ÿ„/>§ÿ êãsà…<ˆ`üB]¦å˜”Èmô)aì ÎT,Q#Fk–¤¹ŽhøâçQ_¸ãøfÁ³_BäT^TôÑ´õM(ë+a"Q%LÀ¼ô0|SèÓRÂÔ*û´K˜ÞÅ„ h¼2š‘µFêËÎÍ,áöCŽ‹ À/—дyÃêÍ Ÿ¡xçS^Óãù0q‘F`5ýü„ötúubMì%ã¾£ÖÛæa,ÞAŸ¦îŒÜå¹Ý:põ¡ÓM=p2 K(s³8”¦ý%ÌÀÄι%ÄØ¹¹çšN“ýUØ€Í7xµë*^­B½›³Å¾8)óqæ|—KhîZt«žEü0&ùa\}Æ\B ù:犿ñ8Wâ>°î”{®7±¾bbÑØD(ÞâkaÝÃ1g*Ì:ÑøßÉÆÑP¢(Êa¢¥*"-3h#9€È?ã1Í_dæ)2õ̲!€ ¤t¥Ôì%Ùçþ’LbK…d>¥¡–jAÊ:^ÁN»0¨ã¼¨ÀÕáÁבFFÇvìÐQǬŽ,rëíñP}jJ’Çy\Ðq ô©b±pдË^Õ<+Ôý™ºOÆÒœîß­ã#6Àó >Öq —\Ññ >Øfä+¶ãʲa®è1‚±c#[ž gÌÒYég³Y_â+ ƒG•-¸À¯Y1Iãäß0Hî‰çX΀‚Ó$­:˜)I&˜'IHâT’˜° ð2h‰sÃB¿]x•ö»iU@„þ€ýéÌDú:ÒÑ?Õ9DÒۈΡ3™CŒ7ÊÔô]Ä'î@£íŠôÄSôh`åºnØ{0HÙ1òNÂ$3éß ÞªVÿƒ7-Zv1H¢ ÒÀš&Èkô‹’ë’{C¸“-¸Â-¬½Ž9Ç®cÅ]tÔºûKÅXÆ Mg‚²æÇ3è·û[ñºI×A2žÎD2÷Øøhrl| eü+é:I^m¦5¸T:›æ¥³Š:Ðs"åF?äØ¿€c/=67°9ñô<„L/)Ÿ¹Äîè]l™ØmàÙ;xîþÍ e—è‹g<–ûP+÷¾V¡=‰ô¬Æ¿—¯§ƒ ?*]Å0Ks€g y ɿЕØú;¶MÜFòb¤i ï:”è D#·±¶=$3ôÔH¦è¿:ÿPK½\C7p‘—÷Ëm@-com/microsoft/sqlserver/jdbc/TDSChannel.class´: xTåµçü™Ì½¹¹@Ö‹ÈIX ¸„,Hfpfn’‘ÉÜ83bkmµ­Õ¶ÚZ­bµ‚U«PHhiÕ×·ôÕ÷úß¾Ö..u·¶Ö­Ë9ÿ½3sg23 ~ï}Àÿßûß³ŸóŸÿœxúß{Ä•Eð ÖðP«á \©`‚õb«\­Š *®áy-Cž§áù¸NÅõ¼r¯4*¸Aƒ™¸QÁ 5˜…yñ"/ÖPÇKxh*ÂMجa ¶jô°Û{3¯lÑ`-¶+¸UÅmØÁ‹*vñúvw0µK5Ø üÔ̓‡vò°‹‡Ý<\ÆC/{˜å^/Wð ¦t% ^¥Á:~Y‡W+è× ‘U]‹ûX®vüäÁ䡇~ iЂ×h¸à ªÑ`3v(hi°•¨à†U¼VŨ·aLÅ8£ÒÒ°Š<¨â! zpDÁëxþÛñ£*^_DóÇT¼AÃã'T¼QÅ›XOò÷O)øi ö1õóñf>£â- Þªàg5ÀÏ©øyoSñv¿ áñ¿¤âXdH¢r_Vñn ïÁà q¯Š_aV_Uñk*~]Ãûð~Pñ*>ÈßTñÏGUð˜7âC¬Ë·4|QñQ¿­ácø¸ŠÇU<ÁßQñ¤‚§Xs’iŒ—Æ5<ßUñ{*žQðûÜ…?`§<¡â“ìã§Tü3¨âŸ«ø*þ¥Š¥âük `+ýXŧ5x;Tü ÿ–móÿŽmó÷<ü{âU|†-ÿO*þ3Ïÿ¢â¿²Êÿ¦â¿«øÌç?Uü/ÿ[ÅÿQñ™ÐOÙÏrþŒµú9kuŠ¿à—_ªøœŠÏóǘɋ*þŠé½Äûãe&÷ŠŠ¯ªø|]Å7x~SÅ_«ø–Š¿Qñ· ¾`l±bñ.ÿ ¹ý€†‚æeç5\ÐŽÅ;ý¿EÐÛ#3ÚöÇbf aÞ3:ŠÅB²ÀïˆZ‡F|V`¿Wðw3åÂöáøÐpÜšþAßA(‘Ëí×ê»å>_Ç$ðï7ÓqÞC˜ëþêBEð†­~É~^Ç5þþúáx(\Ïk¡H}‡ü¶¡ `EVw¬ÁúÁP jŬ¾x}ìÚpÌŒ’òõ×÷ê}—vøäk³EZâ!+B¨Eñ`lw4gUù ô´ølH‰²mA†°E‹˜ñz{‰¾{cÎÇâ¡”ÙΛ”C󀟤 Wº¬MäÔP¬9lÅÌ îA˜NÜÓÌ4Ç!dÕ»– oº­P–„t¯hqÈMP·Ò°ô!?KÒá8£$ë°}°C®SìG†;cý1Ÿ!=±=µÒ8@bùZw4u7õlïF(µeûɇÄȰE·6íjºjËöÎVBÝêóµ675·v÷ø”äÓʇj%Ù°2iÃʤ +Ù†•)&=#É(g>¾‘H|ÀŒ‡³*9ò£ ±–PÌ¿/Ì.êOiº ª:_àyš­ IòÆ-Z²UA˜ÀÉPÈ&"­†@¦k„ØmúƒSE´aÙ¥3°?8UÕ»´ÖCsHj¬àûd¢˜'Ÿ7 ÷õ™Q_è:RÇSÕΠü©Û p""Þ¡H(~Åó$[&ÛžcÒkȤ;·j¢¡Ú%o-h»ƒ%ø@Ô:H)*mþôÕœ,¿ÈŒ$Ñ˲qa éaË”Yη¢¤]u6j9¶–‡f@©Ú»‰D¦x/<ÈK®ý¾ðpl€æ»€„¢ø±7 B…„Ê.¼×s„¥¹åI‹i͘„ÑÐÐzYÅ/'ÏiÎnINKcêÆ@XºZ‡çày~ Ï*øŽ¿Ç¥tÀdÒeÅÛ¬áH0a‹R ]–j1ûl hÔŠê85ÿ€$/ejj‡åž”ŒF•.@ ?ƒŸ+BèX€J6Õº ~¿DX6µ}E¬…g ÐöfÒá%x™vv÷Ud¶;)Y…« E¨Š(Ò…&Š¡ëbš˜Nú>3'eŒžæ†¯µ«ÅØ'Õ2b´Y›º(Á¹:NC‚/ÏpË”+öþEiÐ0ÙtF,aC3É"¢çf ÑÝÚ¼+CˆYÌ:ý 8†oÁË:¼¿Òá×ð¬¿ßêð6/p ¼¯êð¼®Ãüô&=‰Ù¢˜¶|£±ö~‚²}LÖÕÕÑY•¡;GüÉåvìOMÁ`”B\s°aabgdÄ:áÂ'i9]” 2ï œ®‹rQ¡‹y<Ì t±P,¢,gØ™Ÿ%¢t!EYØò›FâfS4êw×39‹aè¸5:C’éa»Ë[禓3p‘i4’»ù¤•Fb BevBn8¦´Âè6†xÛ²à0bòSÌè#$RË1´Ä7uqŽ8—$7šj)„%Ùˆm{æ6Mb“'æ\©GÜ<¯ï$¿PÁØfEý\þt_‹…ílÍ¥p,Imôíû®¡½¤‹J±TËÄrúh´FÒœ¡‹*QMI-žLÓŠ¨ÑE­ðR‘ZÜA©å åaÀ){Û#Í|´÷…þ¸©Ã)^Å ±2±É¤M‰ãßNG¢N¬ÔE=UµTq Q”Cá°!ùþȈH‘vBôŒ@R¶>½nÞ4åŠ/gñÍG¹¼>›HüáP¤0lªé‚Õ;¥ób#±¸9hÍ>ÿp8î¨c»‘2Ac(i¼F[(d”ý戊PºìóøôߺͧˆUºX-Ö$"_ÚÑù•†´¥Ñïä,„(}`ç¼y8Ÿ¼htÐ1œªˆµº8Oœ¯‹ub=Ù×!΄ã‚+“*RˆXc>ûhÁ´s™œ¨’_±™-¹…³Vz¬äAfCVÿ\Fr}e[R ¶$›-3ˆ¬ùüF3M<=Yêb«Ø¦ˆ]tŠ.Þ<6÷ÀDHf<×ðÅýÑä‡ä>vÒgÊàÉT«‹íT‰òÜÌØü}2¥²û/夺O¹™HøTÇE¸˜ºC6©UƒËé†l*R«sxµ¼1y–‡2RܹFöݨ Ÿè!禨¸ÛI¦2™ô‹‚¹)åÝ¢\{i§Ø¥‹Ýâ2.¨Vë-TÚSuºG\FdU1Mã‚y¯Àï)äi#×%7r]r#×ñF®Kmd+‘ʋ˱D'WPÒŸ ±®¥©‡Rêô>2q]ÌòGýä8~ïPÇž¯°©¦x— ¡}Ô)ÅÌÀ0ùk„jžk¨ªøù$ŽQ;˜|Z>Å̃pÁYå¨ô]¸þ¬pÓ6Ô%SEÍu™G§Ù‡!‘&DýÔ.\û|FFJ6§ª—Ï8òÍþan¿W¸»é¾Rà,”ÖP§V© ÷Ñ&fàeéÂÝí*á5œíOÜJ\]9õ†ýÃ]½è”ž)O'ø-›’r¤Ö¬AòT¥¾–hˆíÏ{!ü!.€:2€ ùM\ÙÃÂÏÍrgà-ãmkïjõqËv_Ç0•–«É{›eDÍA‹c{²8p–¨HÍÝ«·Ùm2©×bnMá~j+ã±ërª™—_ó!Äi#—QX•bêF§ZL†ÈÀ(ßüÿàù Ž™í_–Ô,ïÒeH$ó’+a$®î+±a2Öi™H4û#V„Â:œhSµº»;jNô“uSpI ž8ï®Ê4(ù ¡X^[g¸ÎÇf7U0Ö`Ò}vfN†Ñ9UYdIƒÙ0¡Ù΄ $.ÛI3ш®ŸpdqHûžl—ùÓcÜnIµ‚Êî¦î®ö®ÍôtÐÈ­èÞòÖˆ \‹>4ç>óß®B‹—ñóXC#ü[ÖÄ ÚžeIqÞ°éÈTÙnP|uNFžXÙaEÉN‹ªö6·ç;¦Ë‚f,DÝHò ºóøp,_PeýàØ s`ÿ>BO¥üûÍ‚‘ósð¼œ_3ð½¹| ^–ó+ðªœ_ƒ×åü†óþ¦|×øŠ]Ò}KÂß¶Ëùm9ÏãÎDÎï:ó{Îü¾œUn˜á§œ¯B“os¡„º+þ+è­„Ö‘fÏ Ëï%ü‹óµ–$⯋πÚ;E¥Úל} ¦ÑSétÆ`F±½b5JÄ…HÐ%GaV͘Ù[èãPz Jx9¦ ê U€G¢M;³гm°R,B „3ê³ bÎa˜XZvæbÁi(?ÎÀXÌ*QÈOÃéù!( ?—“²' b æ†séÙÑ®f æ³V h ‡…¤Ù,"Ho‹GayçDØ%4¬ƒslCŒÁ¹Ç¥dkaIÉÊÍ8[î•Ù¸/ÍÎ}Ù$Üá-,q¸Ït]H—?"M Ôw—:Ÿw’h<·×ŒCU ž‚êšPc‹y –ל‚ZVÔÔžŸæ0ò°’‡:êyhàaÕqǹ³p¶ãµ‚—ü0&õ_-õ_WÀ âF2ôU€>šORn}ž O©  ç:AÕ@†'ÓCåèé-ÝIY`vuz~»{ j}]œBÔ$àecЛ™˱¦£< E0æUùEÜã6‡~ö–^>Wt%^®¤—FOâí*~+<Wß K ì¬é¿Ê<ÉG Ò}D=ð¤„YáÀïƒ%žäc™7ù˜ÇFoŠ^y‚Þý°Õ~2Ã%ùÕèKªA–êï-8”nÇ!äkôŽæG¾&‰Ìÿ såQXKì(Ô¥°ð¦‰Xû“X£Ì¤ád–ž†H£2 5ª.¡–OÄ¢¡BƒkS’¯ã•ƉÊÑ”k($bÍœrÄ“rT(ªTRÁQP9Å Ác°}îi,Ê/ÙA–¬(]²"[²c0}v7jÇÀ[¡=ÙXì £C»±B=ëY Ê+õüNq9E}¨'Óíº¤n§á#§á£*yU®Ï­JÂÈêQwTç“àc)ëªÊÜ0>ž[6Ô'½XQx„¶Õ7RTWx V?7UŽÃ'9¼aY–¯v®ÿÔ|Ú†¢ÈÎ/ýÍ©ýÌi¸eJ1zëÙÅh~>ë N¬ð’ôŸ›‚ŸÏ-©·É$p;%ðü¼¿:EØs_”gÉ‚‚1¸CÏ“Jñ¥|†Èåw¦FOÁ]cðå¿»sñ»'“ßát~9½7í¸¤ ôoUâÐ̉ö•š}j6ÑY8»|u»ädøµL†›èÐïXGÜç:ª§£‰wâÝ`á«¢V¬’sˆR7³JXrŽŠƒr¾]Ü)î†ÍâÇâ]ñXÛ ®+¸,O‘g½gÍ·zÎxž«Ð[ØTØBó …Ç O‚å]æíõ^NóÝÞ§½?+£¾Ÿ‡ó:ì-§ûvbíˆä/´ï§¡6i¸3ð@oí8|£soér)¿l"â7íšçˆëDÛ…¥GOÃhoǤ\åâ:묹³.VK'b Q>ÁÏ G ?šúŽ;6ȦÁ-®Ý¼¬ÎÀ:ic‘ˆ§d{ɼVMÊkÌÍk•lœ¦Àk<×*æ… ^9³ái·1Q6ISàõÝt^X㡦š;ŸÐ mäcðEýfœóq‘ì|àO›gxU†ï’d7ÉF8¬®ºJôÒZzï%,u顇ÞQì¢ØÅ†±D Bï½÷¢bï½+øÍù’üçÃÃûn&3ÜdÎ÷n&x*x*r K1'¼cIX,R‰‘ÚáH¬Ô Gâ¤n8â•záˆOÒ‘x©ŽˆWÒAŸ4ã¥!˜ ÀDi ú¥˜$­Ák¤ XZÚ‚e¤]8#®¬Ç莻€ã.ภ8€£ 8º€£ 8º€£ 8º€£ 8º€£ 8º€KQ–U”×*¯S•×+oPÞ¨ )oRÞ¬,§LVÞ¢¼UiÅ‚å¥`XÂ`_é fJ&ØOúøö—þà”à –ÁàF% •¡à0—áàŽ”‘à(Ž–Ñ`–dcd 8VÆ‚ãd8^ƃd8Q&‚“d˜-Ùàd™ N‘)àT™ N“iàt™ÎàL™ Î’Yàl™ Α9à\™ Γyà|™.àmî”ËšÛ©;¨…ÔÔ"j1uu7uu/uu?õõ µ„zˆz˜ZJ=B=J=F=N=A=I=E=M-£ž¡ž¥ž£ž§^ –S/R9ÔKÔËÔ+Ô«T.õõ:µ‚ZI­¢Þ Þ¤Þ¢VSoSyT>õõ.U@­¡ ©÷¨µÔ:ªˆZOm 6R›¨ÍÔj+µÚNí vR»¨ÝÔj/µÚO R‡¨ÃÔê(uŒ:N NR§¨ÓÔê,uŽ:O] Þ§> >¤.RQSŸPŸRŸQŸS_P_R_Q_SßPßRßQßS?P?R?Q?S¿P¿R¿Q¿SPRQSÿP—¨ËP†WZi¬ÛëöǺý±n¬Û«ý±Ú«ý±Ú«ý±Ú«ý±Ú«ý±Ú«ý±Ú«ý±Ú«ý±Ú«ý±Ú«ý±Ú«ý±Ú«ý±Ú«ý±Ú{U¬öÇj¬öÇj¬öÇj¬öÇj¬öÇj¬öÇj¬öÇj¬öÇj¬öÇÑþ8ÚGûãhí£ýq´?ŽöÇÑþ8ÚGûãhí£ýq´?˜…/äÛP—òÅ„âcðA¡YënkÜ=ë:_rVÔ›,2>š•Ñ5¦(#!”P²íÑ­Ñú³ÁÝül,ÐI8²©À$6o…ý-%{)fLzbLº?èÉ1݃‰É9¦cõrÁÄh=ìH¢ø›žŠ÷ýY¡¸`VM óÃØ(d»¤nÐ yƒIiáE~÷ÿ7ç^^ô§'¹'ä˜d÷Ф,Ü:¾ˆâå¢$œt1”€ïP¯.0[3±ürãÍ5¥C ú%fæ^•gô§Oî“O;âÝ_<,Þ™§`“ì:ZhbVwYgâpÜ}¶o#¸á ƒûƒëKÅW¦x<ÅWŠ~þêGr%çTñT->çê§9žÿžT­d§n õ 0fUžÙ¶Ó” l/4;"ùf[®ñâHÙ¹ÌøbsMlL¾‰ºŸÜ•oJv«S{ðv6ßì ìSï/bžÙ¯ïñöº£:pååÁ+/q€ùfÅÿ¿æpÉ5+y#=æ˜îBsÄ5“‡—À'ð}„OáV†ÏàøYøŽŸ‡/˜RÿPK½\C74Åe®ABcom/microsoft/sqlserver/jdbc/TDSCommand$1AttentionAckHandler.class•RÝN1þº;2Ì8‚‚ â(ë²ÉÀ5Ä„,IÖ ]B‚wãLe 3-´Íª¯â3xã…`ÂðP„Ó1áŠÀÚäü¦ß×sNÏÅåÙ9€´˜ÇlˆO|Ì…ððÔ©y§ž…xŽ>^úXd³aj+ Í^ªŠ¸©VF}µ±9Î ×C®ãƒìKïlö»ª(™­1ýÒ¸)¬ )ì[†Ncd†æ.ƒ×U'¸’›J’Ó¾þ‰'×kÍÏ áÖ÷”Y¡¤ññ*Â}D ÓÖré’éá{z(ç:Â^3,ßÊÝ·š'…«Ã]_ŠPÛu,ûhDhb‰a}ÄÞj«7ÁmKÉu7OŒá†fuÛŽ:äòß^ýÇ^¿ ¯gÂ0Óè$Ã$ιïÚr¿œzµáth¸}§UAý×à C ºÞJ2úŠúhh†I;ÐêÛ¶&¹È(EÚÓV–aÊ} Ùp§B2IŠ’7G±ËD­ö°ÖTåÕßøw²RÞª“­’ÿ oï÷>tÚ'ëœÀÿ ŸÜqïW‰˜&ñˆù1Éù!Ù€ì,pPK½\C7 YÔÈ ±-com/microsoft/sqlserver/jdbc/TDSCommand.class•X |[UÿŸ5ÛôníRºukaw[×¥iš²¹ +Òµºtk:J‡€ir»fk“’ÜŽá Ä ¨ø·ñØPg§¶K+SªLDñýDQQ|àû¢ˆÈ÷Ý{óhšÐ®¿_î¹çœï}þßw¾Û'_~äQçŠsø(>fÇQ;>î@ ’üx oÀƒv<ä€I Ÿàñ˜A|ÒOáÓÆ%Lðâq¦<á ÇÃN:Â$“%K1…Ïðô&8eÇg¨Æçxò(?¦ùñy Q q š„}öKø‚„ÇXØi _dîÇ™ìKüx‚—¿,á+4áIž|ÕŽ¯ñäë|ß”ð-¾ïHø.o~y¾oÇØÈ<Å‹?äÇìxÚ~êÀ3ø¯üœßž•ð ¿d¿’ðk ϱìß°ìßJø„ßKøƒ„?²Ób¡–ðÞý«„¿±”¿KøÏŸ—ðO ÿbw_ðo ÿ‘ð"Ïþ˲_’ð?6íe ÿ'. ¿äªX`%va° ÇvïVãË»ö÷›Ç´Èp3¯E¢»›»ô½ ˆ/’à÷àÀ°* vÑ‘´Å¢šº_p¬ÃAb hqâ$Y‹Œ¨±1­—ߨŠ4DBñX"6¨5'®N¨ñ}j¼yOx ÔÜ›CLÌ¥Z8ÑhÌ隃³=`Pšl=j0…¯è9L­Þ «ƒ‘¨æc娛‰\Ïq\K•4qõ3NYƒî¡2B¦§1¬$òÈ|”d÷â°ž‚[©D%†òe4ptWäȨ̂ãS©Ì1{¯¸Îìfæ*_¡œÈ3,žG‘‘)³‘«ž‡“i£O™QôçYpn¤¥pz3 ÷f@îe{³ —q÷Ë¢ wÈÂ+š Æùd‡@E6k»ö¨!ºÓÊóÊ>UÁÁXÜQõ+2¢µÇøöòäÞ,½ì÷X3.—ì*ÝHÁÑQ•Uz渑r/¾˜†‚‰!£}Zœ%â~@ïÊ©¥ºDÝŸnt$-–~­.Ö­ ,-Òp‘‘[;ý”rËŠ6eµÅ;6nYš\sÞÓfü~ŽS‡› ucÛ¨wsL“öx„«;×#õók5¸Ó PgjÜ<Óùvª·ª¦ŸÔ™82§’íÁx‚•XGùE ÞýÛœt½±½jÔ,äº1-ó—]¸Ñã@d[µ%#Á½jgO“Ž‚h>óÏ•Eq*òjΑm˜ÃRØîšB­~&™f´µFÂç´µð9=™‰Uߣ'A…Ž.]þ:º·Q\Âj"WÙ+Ÿ¿ƨf”Fz¾y‹g|¡¯i‹B_äAú,,§ÏtjõèÍÉíœ>R©Ô¨ñG%w[úH ËEŒ¾DGõµkiÏ™'h®åÌÇh¾/g~Í÷ç̯Çîõwji¬æ^‡ößʼ¸LgfNTp—@ó·Ól1‚F«ûaØÆu‚ nYÍíóH$o7ž‚½’³4‡;…²)Èôæ\ÈSâä÷EôH¡<-„Z]Sˆðçóªã¨H "‹™ÉIÁ˜B匿›q‹É»Vw“{g¹IÀqT¥°ä$–ºOÂæ®½å§PÝ_KûË’ô…~ËÝ%'Qã¦·Ú Ócj~3ò¨gy5é{ëMú­¦_=ýèç¡_³óìqç9ãÎãNeܹrܹjÜ”G ^øÕ3·©)6··›®·óv =–Äò"/ «9Œµ“¨ãÉžÔ=,õîr¨ö˜i'µë$ýýú„Ê8ÀÉ)Ò'†H›•ÆvŽÎZ·ç$\¤£á î~ÿc‚ ¨=І ³ípÇY›BcV9ͧÝöIxúšN'áðYšN/³L'1é×W7Y,M)xਥÊrWgóA0t¬˜­ãÜŒd:÷u}EéÖg- Â×$Ñqa©­Êr‹íü,;…IJiº¨óf išÖeÔØ-çF¥Ý3rôùØ-„¤’cË*ôaEx®ÖGþ/eXynüéëˆ?AȢËЙÂkÙAB¼¯Ÿä^0…ÍsYïʰî$u •ÖF2¾e &qþ6+Yí= «Çt±~¶‹¯32({`: %”åÙY〩ìFRÅv†ÍH¬2âbÆ£²$/.E|Q.N\)´HIBî2Þ§'HÓ¥ØaÆñJ}œ„ƒ8dâ÷vZ³0ŽÝýÛÒpµyNO°=”°¢>']WÒï2úÝB¿Çè÷’n¤X3ÛÈ-ôÈÆ')MÙ6ƒÒÝ8…v*#D¾ÖH‹Ž$/ʼµ(3¥…ä¶¢œÏÁ¹Ãà¼t6ç%3]ÃZý WòÁ¥Kv''5Å/…K‰j—M{(%¿çtM År‘àkL\ãª>Ÿ‰»q‰»ƒëøŒô2[]YŸ, ö¨&…mžÓãþ¢€öÓ£iF2ŠÏ´ÏâáÊCê×Ç2Ë‚ÍúØB÷åè,“ïÅ}¦ÉNó³¹KRè/@yØ \°ž¤K„çØ9=–•–¼d(êíöÜ\ “ۑĦânösÓmåÑcÔZÝcN„åGÑTTs Wóòz‹RîÌË×u}5‡ôšÏ¹ûZ“ж5ùòüRc˜ì™öY€m™uÚg›ÓÔ¾…J¥ ]M“±MlMBÑßâÎÁ"ˆø~”8úÜsÎ<Î=Üùùýü°‹í ,¬”QΆ5 ë6,lZØ"GRø2!×GëN<ŽcáªsÕ•Ñ0¨C`‘|È­®OÜIà%qßdnz?Ne2•‰úϽ<¹8Þ­ÌöU÷ƒ ²CemuÚ}EDZ/ … =íÌVûÊF %”mT4,À¶QÅ"aç9'SáŽE4t{ƒPzYÞº¯> ¨æ ”£3 —ŠÉY%)4TÕÔ-aI)®öú¤É?@Ü)}•f0xC“Éͧ o¹ßAËs_¦R@ñwl==Ãb/`ækþPK½\C7©5#ýÉ ,com/microsoft/sqlserver/jdbc/TDSParser.class•UKpU=L2 ‘ðލ8IpA“!É #! L¢vfÞL&™t==ùøÇ?þÅ_Qn\H¥üU)ZC ,]¸±,7.ܸpãÂV¹qáÂà¹=C¤Ì„OWÝóNß¾ïÞ×çÝ×ýýìÙ¯lÄ»l@›íTa[-èðîöc;vЉ®ºõbg~´ÉÍ=Âvùósʽ>ìö¡'€=èŸÌé—d{ö Äö 8(pŸÀ À!Ã÷ x@Vó IJC* $’ʇ”‡\>~à6ñ·%WÁC,n>‡ªÁ–3¨ž§¶™æáÜ;Ü [J´ új8ŽžFÍiÔáÝæéh<©i.·ųö$:øäüƒg oQzýbBË—¸FøBUƒç}øêë¦ákðÌ`)]EÔqmƒçcæö±rÝy^giS´hÇh?—ù_´S´ßiÒ~¤}Dû†ÆøŽö íÓ²(ÇüZ¶÷hÐŽÓþ¡˵d”ºÅ.~YÇôùõBH…,'Y&dÉ"!+Iª„¬ê˜žý[Èj’?…¬!ùMÈZ’_„4’ü$ä:’„\Oò­ ÉY!7T“}Ö,zÍ`Ýôì©ùÛ±unÿ¶£ÚÝ¿Í ˆ.äF‚ìÎEBßÄû›çç½w•󮣯šãr®?H¸¥}ÍW¾=ͪך?³u®áÜvüõM3hþ5¥`ü PK½\C7Qˆs+,com/microsoft/sqlserver/jdbc/TDSReader.classµ:{|SåÙÏC.ç4œBZÒBDÔ4-m­Ú"Zи¶ -h”œ¶4©Éi¡Î¡Ntn:çeSa^ÐΉ[EšvAÅÍ˼m:o»_Üœ»èî·ï“ïyÞsN’6)Å?¾þ~œ÷öÜßçöF_üø‰ÃPÿtÀàüI‚`øóg þâ;|$Ã_yü›;àðOþUwÁ¿ðø¯ ÿÃÇÿËÇñöÇp Áˆ“h‰ ­˜6^Øù#ñGæOü™Ì…b¡§àTú¯ŒN"EL«˜Ï¦1¡é ê* ¨ü™)á,øYè»Ð-ãl†ö𢤀 Ky6‡gsyæ•ñ$çžÌ›ó™Û),ñ©2ž&£±Ëdô;`Ëe¬`¶ d¬”±Šª™È4O—q!£.ràx&Sª‘ñ,Ï–ñÞ¯•°Î͸XÆsY‡%2~ª€ÖçñGf"K¸ ëyÖÀ³å<[Á³óyvÏü¹—Ÿ¶ÑEÁ1úã­F ›° › p%®âÏE¼\-c‹[qŒk%¼XÂK°Ûx)®sÀf\χ˜Àe|p¹7b÷61‹èò²— ×Y€ÜìÀ-åObü‰KØÍãØŽ “¸–GÍ×ñØC#»ÄõØ+áV܈ۘ^ŸŒW:ð3x›ÄV@;ŸåÙv ¯vÀ­x ßìµ2~Ž¸Žœw°Í¯—ð ?`Æ;:ÔÂìÆÍÁÞ`U‰Vñ^$ÖQÕ(ÎêÈó"Iž7EUÒZ8YߌÅÔ(BYc(ÞUÕ %âÉx»V•¼"šT½j¢jsxS¨ªµ¡Å%J–P<†°ðø-5¶ˆe}œÐBZ$#ÔÂPO"¡Æ´UÁÐUCðMÈV‡dù£Ád¯°;ØÃ+ÛÛ“¼ÆBA·8lîéB˜I¶h 5ØE& ÔÞ`´G]Ö§©I„Ië–!(=‘p«ÚÕ jdŽbÝpÑ Œð‰e%É“Z0¦­el„ióƒIŽ5I6D’lÈ0qmé‹iª !T„HÆä|Ri~Z¥ùi•æ³JóI¥Õj0Ì×U”ŵž1‰éd-N·¤Ë€0ÝW–O2k}ek¦j‰øÖ@Œ®ƒ¬ßÐB®äã}Çòm!µ[VÂÉ 5ÙM uùÊ&CÞªÐm†Wû¤»Kö$ÔUº‰˜º-í†5V_€ñ­]ÁÄ„ʉl”¾Ÿ&‚'ëØH&S5±q²ðX+{Rx ¹Ý`$ª)`÷UÕ-­ñ-j¬µ¯›v,ðšX2ÒSÃì§„Ä[-ñ„&ÈVEÙ@Ɖ± ‘C˜Nã"…óy̰t A°Aâ@L3øÓlY¤cy, ’3MÍæ&€éBƒJcœ ¨’|ë–¬¶ uq"ØÝ­š‡6’ˆ£®×ߊXw¦Gîùª¦©‰¥‰ŽäDÞ&æ ­kÎuÙª¯Ü´™¼¯N8T0Ü †"]AÊuK|HÁ—ˆµÇë¼ä„âMñ˜Ú‡0“tÊ%ëË òTÍpäJ;­‘.ºçr&“µëƒQ5&Æã,<{Y$Lô Î_h ïNn‰të¾Îž§ç!„S|¹ŽP–'ëÈ‹CQ‘$ü‚‚_„¼c šãÚŠxO,œU„9æ¸jPÛu D"žP ßVð&¼aÆX1–õ´·st¤ãæ<¿„·(øexAÂ[¼ ^£díõ)p?ì–ðvƒ”é˼(°vIø¿ŠwJx—_ûé÷ œzb5…å{_`{ù³Tà!þôÃ= |Và^¸OÁ,Ò.¿ï#T{;âš·‡òM7݉öŠââļDÙkf.oPóÆEqªe½îQð^¼Oa¶Èýð¤ ÜMÌðxaVÆ@KÍ*cXñVñix†<0ÖÓÕ”ìH®õ†kNò&;ã=Ѱw“êªÉ¤W£$ï5`Z¨X×’¥}ˆ ‚ýøuÆ;ÉÌÞU,„FiØ»|e [À¥Ò›®ÅÄ ÈÛ)nXd¾l2É7ð>*»«/Åõð53»‚à~÷ê˵DO,Da ð(~“¼k27ÐER;T¯FqKü昗¡³­ó¦€‚ßbæY ^êh42'Dôêd(@‰uhDtJ¹•Œ\ÉDàI Sð>®àAx˜õL¨!5ÒKTt#´ÉÞöD¼ËÛ²*Ð@+I¿#ráAL!øO¼¢ð !ÌÏvjNÈOØ4/W7/v¸aйZïj®]D‹gN¿Ížp„ÅB—pDwáG ¼‚‡xÞQàU$} ^VàuÞ{ƒ?¯Ã ¼…‡©„?G( «Yyœ%?"áS >ÍÞþ ûýQ|–’ΚÖ N¯i\.áwü.>G"{æÀª´õ§‹ð g묢•Î䣷©J©Ôë2Ãç%|AÁYæ~OÁ—ðe_ÁW| ¿/á|ßPð‡ø&)oJø–‚oã; ¾‹l ÂÃãO$ü©‚?ßKø ‰¿Rð×øž‚¿á þ-R.(üÉUœÐü¼É ?È>ÑÓ|ñ¨5Ý\W·)~$näDý¶™À}ùFºÃZobŒß+øü#9H³ñ· ÏÇü“ðO ~ÈJ~„foù B‰) GéÒD"Ø7æÿªÀ·`@Ï®•iÁ*Ó‚U²`•i§Uàwð‚ãÔówüÇ de³-vŽ­{Ô|˜1²jÓÔ1å‹b¯=žhò]p©«öpY‘]![¹=å>mT‘ÌìReå¶&ƒ—§²fW9.°Ád§Þµe€ ‡]ÿê6³«þ¤Í5Ñ×â&öÌÎÕw"œt\&kÈO ˜Åä÷“>¡+š¥_V>»ë0ô̹ùDŸ{uÿÿ/2ÐÂO΃zkýª?1‘äÒp²c/-drKãmfõ‰§™÷¸ è¹è¢&‰v4ÝX­q39׿qêÜq4v_`Ý2Öð”z‘颷„‚ü–žm0Sÿu—rÒfÚ…ŒÄc €ñd,Úšˆhêèç±ÄrëÁ!Z••í–å—hT=2ÞS"LPK¶Æ ~¼­ ¦À\ìfdžé[1ŽxY‘Þï¿28£ô@׉›[V®!s‰úv6ù†qÈOÚ‹ßFéßbèïÌԄƸ~1“Ö´¤SË:¨3Û QO]JÉt¥ñS[ˆ}¾\IJ|OdvpU£„©Üê»TdýPT?qˆ_ml>=ƒMåÚDW Ö‰F#IÝtpÖqžï§,Ýa¢•oÍ.Ü3EöÈ—Wœc÷øW[£ÔÈê6þYFü6YÏe¯þ8¹ÏæÓÙÏ«ÉHB §_‹-=ňF©jVìÊñëM¾‰¡î‚» fóûšfÅü¤#½„ÅH¯q'ñ»YŒ{‘^Ïb|Èû ÝÐK&Xw NÝ/`«ápšáÕÃä8m {æŸ>”íƒÉ#à'!Ê» š\;an®t tÓ¦ ’vªv‚½ÿØ¿' 9Vðb~wb-5.öLÖ˜ízªwƒBö?}Ø,ûiwÖáºÖý9„ŸJ~ŽF+{…iÈèe©IËFq4ƒ‰—åû³NÛšžAÚ[ø”éøålØ3ådä Y*Žîg;\\q´ä抣 Žütì <-›ˆFÉNËq²ÌDjXàlØ[HÜ tŠq ÄÄ8úŸN«WlØÍî—R°h¬!òrÒ­`§Ð‚I;„` £oéXÄšQu†îz @ÞW|fzY¦;ãÔá@Ð=r.…C“eI©SÞW1\ÅA8‹V¥áœ]cuYï "†Î¡Ú U¹ÎT«3ð0³:š—š>¿˜9Ø-|¶œ–ÒÝ0¹øÜaXBF.þ)8¯Ôeݸ¤ÿØfjYä¹ÎÌ¥¿”>ú9sXF+É¡ž`*Ä-:Yö6ÒÙºq| o_TǶóÌ&fNyÛ5¬ç0¥ÔÐ}Ôäò[nèP¼"æŽfHDƒPͤå4)ͤƊµœ›æ¤àüà*=$×Ú„n›Å)Ö»ËN;Õ{DȰÉú†Ë.Ì.¹¤{„F…vÓR.»KÚXCú¼Ÿ´ô°–vç à Ýi†k™ñrÊL‘Øñ ±.£ç…Y÷öiš»¬ôì7ˆ¼HDô?Õ`2›RáJ…“öëLMøK®1¿—Æ®›À>YÇfUL|òÙ—²ŒGæ%x9uÛ‰ìlÛhè³—ª[F–aX»Xд1IÏ~¿-[h7—ð+iùNŒð%y _’KøUxÍ <ö8íϰy:Ï-9$7ûXJRÐFßa¸t óûðƒtFEãVS°îö\¯ç^Oøõºð’!¼¤ ¿>—ðŸð†¼„7äþ!¼iž!ö¤Ûe×O‡Ë¯~4ú­44GŒÅˆ˜ÙN9#ÇÜQrÏr 2÷Q¿SÖ% æÒ~Þ1hw“cÚi [¸@”î YJ)=\csÙ²ãf5bYË[– å%T\6ÊS.«Ë¶±Æ*r é?¶7·az~dÈá1²ÍTnæJ-”É8ç”æ:È«ðce9 .ÑxÎljó{¸­CªµÙ„ðn(¤A¥vÈmp“£¶×ÚÝv‹‡|®¸£„!†¡3—øOà§ñ{õ* ·qf.=¼NËÍS‘œú•Þ"f‹vƒ4‰­µÆæ±†©xØ­\ÜöÃ{Áí&‰»¤0Cº¤E­;$ì?öÞl¦ò¿¥ÍesÛ‡ JÙºkbµ’[¢Û†x®Ð?ƒŸBï3„¾Û󈀺@•p=€8ó°ËÑ­ñ×îü¸d7”8e’L"†yK·Ëî–$ÝÒ€Ëv½ÓÛç² ½v®¨¥ªQ)\—B¦B刡m— ~ 4à+ã¶J¤@Ii^Ù‘–}¹¸Hµz~$zÃ`Ìd.æ/Ó˜')f¦SÎBÕ†¡‡Q{sQ¿ÖQ±‰ö4.5 vK–ÁZó¬Ô4˜L“ ƒÉÂ`ò€ËîttZ7Ú£5R¿ðˆ­q«X*éxwÄm.;M(Z¶é˜‹;‹,ïw2¦a½ŠZÝ25­ o®¬•Ý2Õõϸ)®¯r®#zói£HЦà³nÙiç£éloc«‡àšçzsÓé—$ή5Ï>79 ò:rGms‘±» l.+õ#p}››Ú‰†àób’kä÷Òqzµ§ÉÑqjå(¤ß®ÇkV –è—q>SãÿŒÆú‡Æ¨è£ôå#pcr¤|aÀm§ðþbVx»í¹býÆt¼óq(Ö%ÿPK½\C7Pç3ßB0com/microsoft/sqlserver/jdbc/TDSReaderMark.classÁNÂ@†ÿ¡•B-RáÕd½k¸à…DQÂ}ÙnIKaqÛøX‰À‡2Ly™dæÿÿ|™ùýûþð€®+´špqS¶‡ÐÃ-¡¾“j­KÂàE™Ø¤ÊšÂ$¥(>òBÛ½¶"‹—JÌŸßgçä#¡µ“Ÿ¹‘ñ4IŠj•&ÌyJ·i9"Ü_ š wlbÀG'@^€š„è?Ä›–±¶¯Ò® a&÷Rär»Óe¦_ä † ~Ú埠Í.¬è¬Äíãš5`×ã„ÃÚŽŽ èî€ZÔ?Àù¹NPK½\C7ó\'h4³2com/microsoft/sqlserver/jdbc/TDSTokenHandler.class•VÛRA=C€•e£AEÅ ÞrQƒxAEQL‚ A‰TéÛ !ÌàîrùE}ñAª-©òü(ËžM Š[$Ij3Ó³çœîééžÊÏ_ßB® ½¸i¢ÃzvËÄmÜ1q#&îá¾& ëŸQM˜Ú0µñÈDPAŒjÖ˜IüÇÚ|bbãžH0˜eUL(éŠM—¡'½Ì×y¼Ìe1žuí’,Ž2 Üå Ü)ÛV6C4W•x¥”·•£ݸó¶ì{]ØñåÂB^ó¯xX"‡ŠÂMþË¿Ž´¢ÐžPÁÐù°$KîC_øÿ #óP2›ÍL1ÄÂËç’Ù9Á ¼¡ý§6óbÕ-)éH’­dZKr<¿ÂЭdJ®'–È•ð¬9áf]î®9¬y^^žó¤’41ˆQÝ&-MÉEå-ÍØäŽ2©dB•§…ËuJ:HBm0tyëU4Ís|á%¯ï}jf¢¥Í[8‰~ HY8Ž&,<ä) ÏñÂ@ÚÂ4†èš8ƒúv-¼Ôœ«Mpªy7{Âf0dáN[È`Ö²‚£ýæÔŠ“\Ê:±¡½Š˜YXy*åøÁ̦³žY?}†@X—Ñ•Fž3Üv´ÏwÉV¯¤Ø\%‡¢àEô—Ü£¦Í¿žReSUQ‹QKŠÂs|»aýÙü‹úl¨U¥}ÕVyá8õˆéwÂVŠ¡¿T”Êi!‹îRÆ‹¥ÍZžHQO—kV/…ìsóôUøŠÐjûnw Rë·ÁôþñI{ó×Ò›È<ÎÓ…ÚG·tBºÓ¼õ!úRAƒá YGid4vD¿€}Fõ3€³µ×ljÖF£ýжhl­æ¹hû#À7´>yˆ ô´“Î [B_òAï ƒžÎöÿÑ—ëèþ:¸ ãõW"B—áJKÁ\õ“7I¾›ä-ùp0‚€Gˆ1Ýèî"HÌÃÛðVHàÈG®-jËG.R—ë¡-×û†2Ú42ÖR®µ„¾Þt7šFÆéßFA‡‡`Ñ}º0¼ùzô@QÛÚ/ðPK½\C7~Þ‘^5,com/microsoft/sqlserver/jdbc/TDSWriter.class¬: t[Õ•÷~-_’Ù±;¶±€$Èrb'pVo!Ž"'!`~¬o[ KF’CekéÌt:ÃÀÌ4´…@i=´%i¬¤BZvhK[ZÊÒ–––}ßJ‰{ï{_›%g9grŽßrßÝÞ½÷½wïW=|ï!X ´»ð$Øq®ë¸÷»à|¬wá<œïÀ'܉.\€ x*/ŸÆEŒ3—G§;± »ð <“§ÍÜ,áf)7˸YÎÍ nVrÓâÂVlã©Ó«\x®æQ'ÃÖ¸¨9›G],u-O»¹YÇÓõÜœÃÈœÀmdäMÜlfÎç2l 7½L¶•›ó¸¡ œÏz^À“>^è‚çPgºm<êW1è‚ed"5¸àf±‡xráEx1ÂÜ ó4£¨ ä¿ Æqà%l§˜㼚pá(nçæRîÀ*^æ‚êŒ{¹?Dz¯°M˜ÿT¼ÒW¹ ¯Vñ?ï‚ ð <¿Ö…×áõü'&ü"Sý3þ…›uà—œ´÷sà—yþïÜüÛê6É:ðF†ÜäÀÿb•þ››ÿᕯðh—ovàWyþ5Fû:7·ps+7»]xÞîÂoà<ý¦ ¿…cÿ˺ýÃîtá]x77ßváwð»ÜÜãÂ=¸—uøž ÷áxj‹‡™ ÉÍ~ËU4wáü>Ûò^'Äû¸¹ß4híJ1 ¬ÏxˆIH&L”é»Å`¡¤¼ 0âRà 7ìå:ðG¼ôc>r$üDÅŸ"ØÃÑÁA#†0«ë"}»Þ8š…Š 6v‰µ%®PœÇú¶°€½HãmCz$b„êºú£ÃáþX4H4Æ/ ÇØv#ÖxQp[cO{ÀD%N–þháÔ#SÎé ˆi[”Èú¡h„H‹ƒzBïÌR¤˜”XkÄãú Ñ³s„5kE¨$q}k;–³:ú=-=}Ýë6¬méB˜Füâ =’ؤ‡G  ¡¼AǺµ¼ŠÕV[zz:º{:×u3Ž‚PSgCG £§¯m]·@r ØôqE˜®'F„·´AÅ`ÄÐãlž…ÇhžŽýƈi’þÑXŒØ¬×û/6ÐelNs{ë[ÚÎ&uVw´´wlè tövÁHXï7†¢á [mèAe+Yе­Óº3aÄœ#‚_÷è0™lÇqÑ::0ÀØ2‘P´‘±%˜TÑâQ¦I¡9)œRã³õ8m…uŽ·‡âìG²€3°3’2¡~„yýaB™M˜6Àì´f³fÓ–6ÇB fX"uë®mLIò‹Q ’@"Fº"”ùê²p$”¬mÑ ™hzÜH´S\e¢Êêë­ÛDci(J,G¸ÀwÌá}üQÍ’¦ÄŒ=fHÏÑñ1Ô•vn\ŇJ/å›ážò—F‰%L B½¯õègQZ޵ ¦I‹c-©HDXt”mBVÛ)Ôäp`K¶2H žPdgg$ÁÐ@‘,cP›Ø²†¢1Bsˆ‰IÑ™¡èвS­¾5 3Tm¾­BžJ}ggf™eвݷµM@KtsL1‚&­ix±Hê`ÆŽÇ—:9X†Nçb–‰Eç 322šð%kz3¨L‡y2¨dbÙŒX,Ka§"aZœ\”劌ޔþ'¶ðh|ˆÎ—”¶¾­[6è–“÷âÌÛèÍÚ.á·†H^]¼,Hk46ôÈ’ÞŒW™RøzîQH IÒMKÑ™~>åÈ„kIoŽ®"(Ž¢+áüvåê*ƒç(º2Ò$:òUø¨ª® GuSÕâa{tT\*¾#“J4I[šqÉ`»ÑfÑó§¤ÖCÔ%‚ÉtÁdÓZ}G*Bì¾5½¹º¥‚ü(–̉—’l¯·ÄbúNzq Ðom„ß6è²AðO)O$mz˜¢^7]7#ãôôÉB蛒Ť3xä;, 3`Ð1‹µÄã“<˜:¹S{0û,‹MÛå†0§ÐõQàÁr,í‹×FŇ5|½ÞIXÝÑĪèh$˜¾mNÈ tGR»1 ‘ø2ÑàxVÃGñ1J&«‘z]éa¥†ã>‰O©ø3 Ž¿ |ÀëÓ`ìUñi ~OSJQ§á/f߃ïhpÜ­â¯4ü5>£âo4ø6þ–^y€›póCø‘?†5xÒà}îQ‘”ûÖà xLÅç4|_PñE Ððø’?e‚7á- öÁ¸†bìWá5 ^—5ü3¾ áËø”†Á¿ªøŠ†¯âk¾Žohð8<¦Á£Ôà›„o1ÖÛøŽ¿%›Àóð,ÙÄ»Šl"kxÉ Þaùjø.|¨Áßá5ºØ½œ£1B:EóÆDŽÖ¬á{l…'i‡ø>>…P‘1qK*Å‘~ÀXú‡ø«ð”ïÁû~ŒŸ¨ø7Ú ~ªáßñ3 ã_iw8¡)”Sò¶ß¦'ÏËÎaÈ; ¥švï6~°ˆbQ«¦Øˆ£bWTUqhŠSqщIŸƒué`ÑàSør« }£cÇ%F0ky},ÚO»'9Y'BSŠÞÁ.aìH4šÉªhŒ.Úñ†¾áPœ†ýCFPÒt‘ÁÄGIsg,²nÛE$“NUî-ˈohÊ4¥XU¦³únºdª£Öà ðþüœÞ[º„Ò—pCúnàK¸!}iX‹^Mi¡S®´*m’îRY„ÆãÌTIçI×+Ùy 㤉_ÅmúhœÆó²oðŽ.r.ñ ”Ž'甑à$º7ö-ÌÀ’ åxTµ•äe2¢¬YmìȤ¦ëšÇ[ƒôD4ÅufÆv.òí«:»;=ôÜúPÀ8KR—`oTHû¦¤ã¤ö”c¬±èZ‘ß"ˆ\¦ÀñÔ•—[‡rÅ-󫯎ËZwF¼H\ˆÎ: ‡eò/*[?å·\¥¦JFÁ2å¤âP|ËèÅÑȺX—.®bÐHôÄôH\†l7âý±ÐH‚óx7/µ²‹q‡GûuN–+Ҿ˫KsÀëb"÷˜ÖÕÙÓÓÕÑ×ÑÝÞÙÒM·\W>ÑÚ¢½ÞWh}*‰%T(h%@êj ‡†¹ pŒDã!$e¹:§¨í¡%v”IÐŽÓÕd)MÚc!>süÊÈvÆŒaÎÇ™…ž¶CëTZ©„ ‹Ã *§@:ñˆA³‘\ÍÕ`À,íü´É¢£‚jÐ)xÚ Kª¯Ó$d]dåPAeçtU…ÎcÖª¨I§ uO¦ãïrâ.åd’¬ÐbVÁmÙÏ{vBl¥.˜.}éÑÈdû»B%OÁëÃ>`¾î9òý.LQœ› %Ú¤åÃúÅ\Â˧6ëúí(¨Îñô*ŠŒ¯Æ)~IåjÚs·1M„è”;"ý±ѼÁèfå¯[AùÙ)èâÒ¥sʤµ)ƒÄ&ª¾@¡ù…+U³W þlu«›µ49j›‰O’9’,¬üü›‹Y¯–È®8÷æ2m0@aФ¤Wd0³¸&‡ƒ(W‰Ã÷¤U¤¦õD7è—’óZC|ÅZ}«Ø£Y‘š*m‹‚báÐNhÖåc“bÐÎ xèäövŠðŠþh„ ‰LQÛ5?ÓTù¦(zÅ _6(¿åmÓãF[4Öe°Í÷=´ÒèäܺcFN•‰Y€ú£-4?Àq@9Ãá½ðœ¸xôZC=¶sM{k›ü¨Ã÷AoJƒ¬òzEöC›.¦G«S¿h¦Âp G£KýʃF<3‚éj(УüI™Ü”Ê ¦¾— ý àN8f‚‹‹O•r½)z**EOõ*—ç UôT;R? ’Ô#ì°4ÿ~Öü^šÌšßGóû³æ‡èïÁ¯•«Z£ÂVôTÛ þ?¡>ƒ?‹«W1~Øìx —¥¢ÜìŸ}×’Dÿ”øÇÁ™sz6Ü\}Óü—4k&ªN á Ø·ìµÔ‘§? ®PD£R§û`ZŠy:š$¸ï1 úüÚäSJ|êíþªq(Ùc®?¿1××øÇ‹6ÿ~(õï…{¡, žq(÷[‰Ào‡™ÜTøq*y4Ë_‚pŸcªxVí¯‡ÿ¼q˜–bNÕ7‰ÌÙi:sX÷P_“„vÏ}P›¯ûð8QŽOÚLâONÂlÉçwôg%êç¨>Íñ“c‡•ˆæÜ eîb9(²s¿[ˆ"£Ìݳýîò$œâw—rkK‚Ï/×êH†ßJÀ|ATØ™‚¾bÚåKl·9 n{Õ­0-×ÕÒJ‚¯õ³ªo…fõ¨ß ó’0œ4Êž5æÌjÙ ÕIXà¯fÃîê7$aaNÝLÃFa–$œF‹ü÷LÒ×ÍåpÚÔiê´ wA-Íð!úÓ9Nšdœ$a±ßºΘl7WÙfdœG9rÖgqœ›ÏñLjê“Мf¼–Ü 3¬[Jn9Ë{ù&•l¬ŠT˜P‘kê¾Í”´Iîx…õ6`S6V%aåætÈ4Ó¨dLçh+cäÖ}„=-Ö Ùfc0ƒæU–ªvvy¹5ßËT:›’/!K62’Ï’K`âÊrÄ·KñeB|zy æСBê °Ž¤•ø¦"†i‚-¦"¶Œ Ú2:,Ë5A‰òg‰·™âË«n  ¥y`+(ü•´‚¦ðsó…wd„/ÍÞA‚ê ÷TƒìWáµ)d«Ù«¦”½j’lu²ì³„lµ ì×á Sö‹`güiS¶Ûq,ç1ñ\žÌ.VÆàYÂÝSú—…ðZËåeÐyÕÉñì÷Z·#{n«u»³çöZwEö\­u{³çŽZ·/{î&‚9¢8# GÁm¿ o™Ûö˜Aïô×[ê%áìBÈo›È‡f§~¯¥Éšuøò/‚.jÈ`kK»ÓWAÇÜÒd»¶[Lï‡ßBÇfîÍ5 P}µÇz¡‡¢f]Æ Ò6xÖú˜„˜nðÈôXiÐd›¸>WïÀ»æ®úÌ]JjWÞç覽YšlkõípºÇ6ÿÐíÐ0ßc»Ö†õë"Ëeòg n‡ ºÖŠcùç[X¡³‰þ¶‰{óžï§AùQ‘[^^s‹ ¸zKMÎŽëäŽKÄŽåÚ˜¼zÌÝÖˆÍ S úšêš`‡zÉa†àZ-Ä#_ßàCSß+¦ò5iYF×ùúåÕ5·Ã ­¦:8Ôdõð \uèp‰^Zlx;,®¯¾VÁ$œÓÄor•0›Çž2c(mDZ‰‡EèJ;ŽMÜœ¯ÔGð±©Ô+¤’Æ9Žs±M¸¯Yµ49,MNÅã¸6zœ•*9pm}¥*†'m}C“c Š›]þJWz’°‘pwƒ} æz_…bC"r0–n:›“ÌÇ㸰É96q—Ǻ‹ÎŠÇÉiD¥jáÁÙå6ó:}±ùL\ïq~}âš28×{Ó.XYnãî̃л¥t+ñÚç5»l÷Ãù[,á‚-ÞýÐØbåa¹ÇÍE¤U%%uäŽ{h»'@,„À$|“ W^àuùÒzIðM_˼´l–é»ï³ƒYôã0˶Bf)ò“†¤aØ.ý9v¹Žírõÿ›]A;œ5É.nþÍà ŒJ3Õæ¯?´;ƒn¦É‘TÊ?ú˜O›oÏC2=ål¢¼`Ö4˜¾Ñö¸í2ß<‡ºŠ]°†/6JùÜ|ð¶ìƒ!ë…ã0$Õå3 ɬ½2;_âùþªýpa],U)3‡–n·ÌokøØUïE&áÝâÒ¡ÎOæ>ƒÃæVÍôp«E’Û,wO¹ÛHF5·= Q²â”¸#i\ëÝy–ž KË\òS‚ñKû–¼øZ–ùicÕ¼±j†°Rs’p‰Hy­U7¤†¶êÔ‘‚Ø«-¹Õ’„˜ ÏTSm2’^tóê%™K‘÷Q›-¬6#¬6OXídaµiaµùÂjMaVkÕ•üÊQª;ÓLuùW&ÓÏÒ³Ã!÷$ëä¹¾Wv-²[‘„¸¿PÐÂÙÉ.wñ]ÙÀ¥Dýx 1‘©R›]nŠà2Ëb²›ä½QŽRÐÚÒí)g^*JŽc×prä)ü“•¹ãÕÔóÿT\J,ÖŠø%±Òí÷XÉv;<Ö[ Øï^™„~ZºÌ_½ TëX-¼ê¯á6ï9@ ZMþËÆoêB}{h?\Υݜ÷-ºœÈ!;Ƹì`NTq}.›u>SÚM¦§›Lë˜éÜBLKÒL¯¸1 Wæ3SÑa2[d2ó¥™Ù&1s 3»ŠÊÔ|^NtMÉKÍ㥚¼®.Tâbj&¯&“—?Í‹SÇI» ævM>ŸÏm›Ü–šÜ0·aâÆ|Le$³ 9I©÷…pmA §£Ûä9L‘SD½žâév¤ã&[Í6F\¯;×/¶Q>¼˜ž?§¥ÉåùG§VÓÛ4DÇ$¶×iœ´p!­L«¹©„„T$zàÈ$®ù8ª^PÅKòýÑ"h ”Šá†Š"@âÒßÀ…êàðfwí¤Iz(§µ×»³3ïÍì>;Éùb¨d—ÜÒ»¾Àç=Qr}1wÌÏAÂýît¢`GV ýü+ §Çàñ’åÝ>nG ì®bšY5¦N¢ka:ÚžùÍë]|w§¼Œ£ §%€ŽiÃKUÕsWõˆh¸+2=K0ΛK.²&2~oîwm•Ìè?í¡ýUÙ4UÁ’‰É³å™KSŽt ±Þ&ÏÝ(ù¸âK#ËI=M )–±eL” ´ÅI禴Q!¤]¥9épK‡…B…k´ÇtŽ”š“°`á¬Ý¸§ø°®Žå"ö¯GÓÏîƒÕEuëiûé¬*^¥3ø}Ö~£¡†tðV±Kðvåû.? ‡e¶A  ´“S 8…A=©š ’WmŒHæÙüèN怆š„û#)Zfµü¢ÖùõÍ ¬Á–RÈêR(ûW»îyÝU‰ô¸ÓÔë !à'D,PW"¶4ù…ž´éØf²xüôMrë¤dÜc(oaO‡¸Ìk3‹K¯iF_>Ãå%9ŸÉéfSÉÉC”Ò¯ÐJ“«\:íÈóP€ÔÂbTá>¤ø‹˜þª öf€{½Ö8¸wZ{³¼koxrÕJ3“ý̦öTr"øæ>NrB³ägRÄÙ9?ó _Å» S¤WߨDU0 äNfË()Íì ˜Í¡½¨_OÂimÕ5éViC؃/Ôy´+h'·&š€… -/ Dà¥ÜÙf/Qƪä¡ÅÖ9@«áåLVÑ¢Y‹iS'¯\·†u×w·.Ñn§ ö…÷°±Ålð~Æ÷ÛØx×¶½¹M"Æyp!Rž&úÌ¢"kí<þw)Ö1ó:TD)ZŸN}¥ ¢ãϲöõ*5§…ù- !NµZ?¡úQîŸic“öß7(>[S倞:}HÊ FÓüðcú}ñMÔhÄ(ÞPK½\C7ÆNþч/com/microsoft/sqlserver/jdbc/TimeoutTimer.classU[SSWþ¶ œ$#åRÔÆ1DL(½X…jåÖbTBµÐ‹=œì„Ðäœp.½_ì¨3¾–ׂ%2e¦>v¦¿¤ÓQ»Ö AKf²×Þë¬õío¯ËÞýûûúñS70¬`DÁh>Œñ0B/Æ‚ˆáÞU0B°¢¹ÉÃ{ R!4c’S<›æá}nñ0Óïçû›Wi³|B7n‡p*˜ b)ø8„Ó à–Ÿ²Å]ž}Æf£/ ‡Hf˜¨TUS°(pÜÉ¥é:i©›FÆŠn‹š‘èMÑ4YÌë–i›Y'i/li­H+¹”YГ³£é‘Šé @CY³‹–ÔÈ3œZÒV´dA3rÉŠŽLºfè² é»˜8Õl‚sò¦aæmmÁûL¯΢tòº@R/I”HDk$¢5Q&­œ€…%p¢nßv¦m‡òFÞ¹&p)6qäõÞð˜)Ð`;šåøbžÒvÌ-,× è Aó±ºÓŽ•7rƒ½‡p 邼Š%\ˆ°š2qÓ52c«º,qpÎì™L™žÑ¨ÌVŒ,Ë´T\Æ ŠÏQPñ T¼ŠÎ=§Õ8ïš_DŸŠKH´LcU$ѯ€©â*C—xX¹Úpöñ™0iYnÉ‘õ„[fî.»ÒZã¬d¦]G…‹÷i•óú¼,¤o¥ÒÞ²¨`MÅøR ý`”‡Ýl–ÛM\D7ÝB&b˜NdAF¸&3*DdFj¶i\¨ø _«øߪøŽ‡ïñƒŠ×ñ•;ÑJÔh%j´L+Q_h*®áºŠq¿âõœ’ÚWžuáž^X’:Å2¼§šq ƒ»€âw &¨)³¦5¥é[ëgDsmš÷Åö÷™yý÷UÞžV £Þ¼º›WêA[:£š,ròü±yO•¯¦V Yw-KNµ½Ûb½‡5xƒ]²Ä7AÍI‡*®’(žÿé‘]•À…#6©À ‡AÒΞÖuò…dÁÌåHLÉY jãSc]©gXð}¡•J’ÑûŽD¸Rä¢ãNJÛÖrò`„jG 8f5>ÚW {&“ÃÖž‘vÞ’™ZO§Íqmïzš§Ç(FÏŽ@sŸÓûæV'yŒ»šä0_$;ùž Û×¼W&À=P[5Òÿ2Þ¤õš‘¯ä•øc4Æ}[P6x€–î‡hÚApî1BOµÓv’ŽëÇ”iû¥ãþÏt¦Í‡~ =çî•PAcŒÎïÞ{÷Þs~çJÿøäÏÐŽ¢†=˜ªÅ!¤X¤YX,¦Y̰˜e‘a1Çâ<‹,‹ [Có^ƒÃ£ —Å‚ŠE ¸ bIC.„pQC.…ðÆ×U|1„Ëvኊ7T|IÃ^|™ç_aÿ¯ú€ÕU_ÓЂ mõ¦†·ð¶ïÊêêªï9!¼£âëëlóM>ηX|›ÅwT¼« ´P°œÑ‹ó–%®@˲Ys*Ë ç¨nºà©5Ût3‹–7©Í™K Ëžqg4,šÙË›%3—X;ïX©L!“· )“ƒ¦³æL‚&IŸ) '†½HúBÚíK¾`™iËQЖHås±\&åä ùi7Vx-K\´œØ\z*ë-w‘óR.»uç—•ε©<ÝÔ§ÜÄ3ùR¢·dLžcÃ}=£='ý“#ý=}“Cƒ‰q­[=;íWY[|qpè젂ౌq»øZ÷ŸQàïͧ9Ã3§ÂË i¨u´4V®P=Í+ª Ó|`­QšžY_ ¶^+Gˆ¦I¯" <¬¸˜‚ƒ­û?UèŒç¼8•uÙBœuelÈzÍ‚•´ìB†o'cΧMלÊd3îEÁÌxÚ²]oR°ÜSN>GA¨v­ÞŒŒF¼8×ZÿRÊšç w*’Óc§EfD`òtŠÞYÓ!+*/]jÎ\4cYÓž‰%]'cÏÐÙCÇRYQL/ ®£OëxŠÅ³,ް8Ê¢“E‹^ôéèÆ3:žÃ Çp\GNªø®Žïáû*~ ã‡Óñ#$tüWu\CBÁþ-ç”ÏòÊf•í  idrÑt2¦íæÝäÂü|Þq­´ŽŸà§Ô¼íGÚÛ;tü ?W°]dÁµ–ÜØ€U(˜3Ö©¼“3)E#“ öy;Á^c)庂ðZꆦæ¬YGÖ–â¶kÍxÇ~OÇ2~¡ã—›ß¸’:^E\ůtü7ì™LQá’ߦgÑ̈'ÎI 9¢zl³ÈI1-“…ö¾ŽI|^G?ñ‹çñ´‚'Ì>ÊAÜžÎ+Ø·5–zmÞ›·mÊ’hËÃ[hKï¸k^ÄÌöOë£`[¦0¾p>o9 Ó壨‰ªC¯%’³Ä Ñ÷Ôwa^£–±­ôÉ‹®|lúÇkºqëÆŽ©ÚD9ó¼è»>'ÃYwœƒ³UÔu%ïÃeïÝð uØOzÝyª¿9C/o´äHz`ƒåxù>MTX¶¬†—‚—K&çÊÁöÈ`Ñp˜Âá á&ð …!Ûšé5¾[ð±¨aág`d¡²±Ð åêXÔm·±í6®A£Q¸• ÂQ<Ô}Ç}Ý<ŽrPâÍïå í¾—>Ñøáã„„-„ôÁ>‰í„>%ñ0a”|°Sb—Äc„|çã»%Næ SrŸYŽÎ€¬Äœ\·%æ%^’ñ¯Èx7Ÿ$, üƒœ çIü·Äÿž ü˜p‡(«EüÆP.W ¿ÀwýÝ< ñ¦ÿ8ëhô:T1rX§+ho»ƒ‡¸ ‘½'„ãÙ’ª‰UÍTœ"z¹Yc¿¼>>ØDÁF7³°1daØF#¶FÍj,ƒq3OؘĔ…i 3é@j—`$Wºro\ºÂgeÂ/æÏ Rû²Ê ²P<ŠuE`ÞVx]RÄf8˜s@1O0ú]±×ð<dÁÁ"–,c… H|! @;^*=Úн 9==(ÓŠ¬Õ\Q-ÒîÆRl;XÅ’…œƒ«•HÆÒS,¾cÝðˆ]U/+ìì«PûöÛ:‚Õ ?“ì_²|\*·ÂNWt~iæ‘éf:”¾Ï#‚É6ÐPAÈLN¬ÔÚ+$s†íVRgÚÕùüO§ºõ:7‡\ÿíþ~¤Ú÷¡ë2J~˜Çÿ:‰¶{à±JQ˜‡e¾„z@ЫWCú=™ŒUXK>€Üµ~ôi Ñ6Þù{$ž¼x@ªÐDWéAKÿÖôh"ÓDö£Hi÷ðPK½\C7ܼñ%Ø#'com/microsoft/sqlserver/jdbc/Util.class½8 xSçuç +Ý+q1×ز‰I±ecØ<"Û2d™ØÆ8 ëb dÉH2ØäQ’’mÝÖ%Y¶nI×à±$Þš4SÉfœ’Òníš&ë–.ë#[×t]Û5K×4[¶niÓ¸çÜ{%˶Ìh¿~ÃÜÿyÞÿ9ç?¿^zï“W ïs@|A‚%xI‚¿á‹°Â¸ù þÖgáež|I‚¿ãÉ+ü=Ï¿,ÁW$øª_“àU þA‚”àëü“ßà5 ¾)Á?Kð- þE‚oKð ¾+Á¿Jð= ^—àß$xC‚ïKðïø¼É”h§æ- Àýh|óœÅº¡oÆÿÿi‡·á¿pþ›G?b¸ÿ±ÃÿÂ;ø1üD‚w¹ÿ©ï9 ‘u™‘‘›%ÜX¸Hn´òÈ&¡H°(Ih—Ð!áR e —Ù±—3€"a±4T¹YAÒáJ ¼³JÂÕ®‘°DÂRº°LÄr ×: ˆ7ˆX!â:»ç7Jx“×ãÍÜ€·pSÉ"T‘èæQµ„5"ntÀV‰XËÌêÈ3¤@=SÙ$bƒ„›Eܳ­¢Õ(â­n“p»„ML¨Ù;p'7»¸Ù-âmzÈ"Ø"b+‚4¤µ…“)„%}4Wzº}mDÚs:…Å4Õ"|:\ ÇëºÓÉh|°aYk"žJ‡ãéƒáØ(9FÓј?18¨%J ^ª‹Ñ¡Ô{„YÓÂ#máñT‹v<‘Ôºo÷·„SZ[8MTЇ û½íÁ£-]žÖýÞ -µ’ÊÐG»|{öæ6xñÂʶÎP‹ß{tΪϡ£Ý¾ÀÚjé zú½=Á½Œ4cy»¶Ñx4½ ÁRYuAhMDH({R Gº‡É4ATöµøªºŠy1OEãÚÜMR¡tÁfKtÐDÃq²Ô™d4­™(be7ã³³ËyÀ"SòÅ R1Gy›’Ž¢ïŠ•>“Nqv1qý‰ø`VÆ}dæáð‰Dò –LEq]c¶ýp4ž·¸²²ªÐÙjéÉÄ`2<kG·"Åiä‰Gr¸ÎÊÑWðZ÷©Xp|D &Œe†ö„Vç:K¯&÷*u+隣Ã9âðÂîÊ<¿k Ç´x$œlö$†ë†£ÉD*q<]—:KiÉÓZ²îDäØ@]°­»‡É$›ÙxïØ€6’&(V‘)†Ã±èY”Ñ’éqÖ–66T.µ ôÒ–JÆÜ‹ãèâš,¢ZŠð–î ùÚ‚‰–ñ4³[Uµ¯au<‘î!—Ñ"-ãIݺfÞ‚Ü®iˆvά@4En¤{˜µÒç«:Lž6BÔÒ1ý„ 0!#ZuÒBK „G8À}‚ÒNvPLcÅüZ|0=dæÁìv[bôØÜm3΢ŠYgYÃ>¼ˆ¿è>Q¾€¬äC«Ž¯`b¯6ÖMÄÂãYœU„SƒÂ)% »Z©BÀE±DâäèÈÞD*;CÝ1ÓsŒ ‚ߢìÖ@ù%ïànîÈžO­VË õõ[+öµµ´V´%£:ܪùÌZF×’2¶¡—¨VÊp&xÖN³Zþ.Ò JÆ=<°´ø(IŠA_ × ‘ÔÝáñûõ¡H­w·‹2E‹o¾dm÷wz¨º¼?­™“@¡o—. ±ÍÛêëàM¡u¯‡pŃž.c´Ôߨ“› mž a A_uvžŽ:·€§«— 8;^f"gçB‹¿³…™] ä'–ÖÎà^–W ö:{"î•Ñ"Ãss|@Ä}2< Ï‹¸_F?vÈÀNàí2œƒ{Eì’±ƒ"†d<ˆ=tÆ¡øÉxâL¼bÄ |Á4åÃBñJ>ÊÔ”‹§¦º:±—™æcèƒIïÀ#| ï“ñ(ŸÃf·±ÃeÙ4SÑT1»Y¡_°Ms·9ä£ÃÇÈ7²ÛŽÙ5„µy°QýžÐæ“óWE<&ãFdÔð8¹s×Q-™L$é†kœ “qž‘q£2|ž¡M±ËÀ“zªK¥Î$’éö,sâcË2TºŽ¦t*T[øâ<"ÆdFÊ#«u«¦µ±t]‡–J…µvN¼”AVt]â8pè(”ÙèJ³Ei‘9˲넌0®ý?.óÞ÷Pg¡‡ÞÙvXÃÖÀÝp ¼ŸÆK`;”rÑEãR®ÍôýópnÿWhþ«yó_£ùu:¥ðëŸ]ÿ šÿfÞ|n¤žŠjZy€FÅÔSV÷eÀOÿ“àAxÈܾBXåvm.†™{Ü.¡_(ÒØ¹‡Ÿ6á6á×™ðÎBðYðßYœ r9ðß…›à•Î?N”U—YúK-gì¡`u™Ð_ªHæ,«Ãï-‚•ÔÑ,ó°~?'šplÔït»,†@;ó•ÙåvY͉2Ö(¸]6s¶f¬Ñê´:…såçÊr*<’#»ÛÔxsÃ26KŠŒ4ËDá‰%G6GìQøˆI¬ÍÔlÛ5ìQ]f¥™’›Ùh¶fžÖ°Å AR™CRÊ'9ߎ…ÇLŠÍ`¥?€:»G§ð”U¸]NSËûÞ E÷œf&g¾[aúÁýᛄè}f*Òý”|XÈ‚^kó½X]²ß1·ÿ(·½ÜDµ¨–ìæãðDîD–'¢ þÒGÁZ¹ÖÞË`«žQ•¨™û8Ô¥úPæÕeÔLAQ–Ø“0iÃ*"E¼°¼ô)ÞB‰šÕ333ïPÿYêLýç©ÿ õ/Sÿ.õïPÿSêDý{Ô¿Mý õßÓ©²p,ÿ·ôø:kBßkô ô}‘§ïEúØc_¡O¤ï+ºl¯Ò'Ó÷þ¾7軃¾ðoƒô½Ed(!Ñ¿Ls’IdÜuyFU2jqFU3ꊌº2£:3ꪌº:£®É¨%µ4£º2jYF-Ϩk3ê µ"£®Ë¨7fÔ›2êúŒzsÖ˜ê2Y)™1g6?–?\Ì¥®PàfNû†« Ǹ¶™Kõv‘>†S¤B-u½ öŸT¯] PK½\C7ˆ"”qd/com/microsoft/sqlserver/jdbc/XMLTDSHeader.class‘ÉNA†ÿd`EÜ÷•å0zF=¸$’ FG×f¦…!³èÌñi|bâÁð¡ŒÝC¢ ±“®þª—ú«ª?¿Þ?lcCF( 3™DSÂL wFЬ„9 óŠAÚ¤>;£6#È7:´KU‹:-U <ÓiÕø÷Ñá¤émfS‚B϶|èZÓÓu⻦cûÕRCwmÕ6uÏõÝ»@õ,Ÿy]æ©£©«WGÚ%£ój储¡kp]ù¸§³{É—°  ƒE K –±¢`k d¤(¬‹½4Rå‘B·§ ®ujd ;ovxÖêÈçÚEC ÝŸÔ¢%‘óæÿê㚇kÇ7[3žF¨ä¦Î‹´™ Xª—ÿê~n8ˆÖv½€q‚ÿ0EDô…SD´&\ÓáJøÌ`œûYN{áM`§ò­öyÆV¥* è+bC<r“¿ÞCsM‚—Cg ’ýƒîËšuE%«â…Á÷'ñͫͳ Déÿíöýë6øßjêhÏôÿ­@ü§ÂÞÚÔÙÑÅÑÂõÿ¢ÅþZ';sgwsçÿõßSGð‰²131ý/éüP>²a½¿éÅáúw¡Â@ ˜š†´=ÐŽ\ÕÜUÃØÎÍ\Èhjgìâ’¢ ã‹n‰ñõ}Õ”r@©? $*OIšx•œF¼C8_Êê—8Ø¢kýOr¸Ö‰Izä*É®ë éªYÚ˜¥üÃQÊTÌsíª%o]ñuïí'eÅ?Ö† ŠÕ°‹OÿŸ×ž#O[o[o=Lq¾;|M“š‘öµÏTS‚P/Çñ!øG ÆŸ^mšRÈNQbQš°ž)šQž1à-2ñNQË‘žY!Ëû¾ ^I!œû ¨[‘-·«ë`×°[»›žH_šýoÀŒÃVýÞ7q|”›o0šûÔÛ¤Ed¨;ˆþwo¥ðèNßù{‘V¨©Þ˜Ó7i­˜ _l¢Ý4Ы„ÚÔ íe¢¡ð ÝȇçÖ7`¢íWÈEçK¨Ö<·rô'‰Aíˆaœè?Y0(9{û`¤ÓžJƒ¢¨ãÀìA†ão9¦ÈOOCíaª´`¶EEâ öB–Z‹˜ Icž“³ò~½åœHär‹\¥¸z…ÝævF7j¨Ö*ÈVë%øjgh‘ZÛs-Š1ÚbÉr‹õj¦Q,VO“öáZ‹©¹,{eŸÕB[\šˆsÜÓ[]Q§ÑËÉy]•²£ê«%3Za‘¢9ã)\•*Ïhãé\ûîó²2 .yoA1R7^úÒ2†ƒ!½½GÜ{ÛØË{K”adì –©·™þ¾·»å—È¿lèíálï\%Ȫ81ËròN0ª½Ç8ãúÁy}/ªO†Èæ:+¸½ÖÅÆüƒJpŽ+Dp?¢¿ûÇ"ïL{vxÁ°Á8ü# ÇžÙ•è†ÿìm›`%ׯÇnðÞb¶ÇŸ ü™ö‘žÉ(ì¹y·ÆžÑ>éw˜Ÿ‘=ʈÓVª ñ&Ô,õEñúœÐÏÑßwpºW¦j[8q8O×LEmzÈf‹m‚—Áž§îaŸK¢¿ïn'÷nÔ²»®à®#á|õ}‡xW×KŒÈÒ:À—-á!fåh+)[ú¥Ÿe_XÔ ¹PeõHZÆc·^sΆ¸ 3&üéõr9‰ÿ:v¥„ᦫ$ äþNÒ‚Z‰'3Ħ~Æ×¤Yþ³D¬ÍêãWÒTE7RSa`ç à&<.knlNÒ|ª ¿L@‡%Bw÷ì¤oÚ~èË’Íòz¾ëÅ.Z[h÷À)®l¼˜ç6t¸× ÏJó¼v™·6>мq–ZUtH˜¨Zp ÔÕ´ž|_ëÏÏNtµ!Dõ4Ú=ÚÀðaî—½ôaBºØ®.wö¸MÞ±î{í¨HS"úX¿R®õý¡ºk—UNVN Åp›ìW$SqÞ ÞÀ!7µPÖR°6c’ ÃUކ¥!œêX~mü ü|ŸqsAÑR%™}*÷ RÂ1]¬\Êþ¨Y{2)^ L¾O­MÖï«GN¿Å}Ù¨%Þ³D¸NžÀ?ŽYµ„+‘¯C¾£/*X/jBcìMá…ÌÉ*Jˆ‰€²ssOë`£\¬´$ç³aA—Â>‹ÔBKîX+ÀQD– ú×܃XÜÎÇ!‚è†G4—x«ééwcõ<2i×o÷©IeíáÛ—†rÇ}ᥠäîCÌïýº¯­²Å#Rá[Õ±º»* Tž–€,i.A²iÛr%Óš*ås­îÊW€èM¡Ô¤ˆa˜.¥FõõO½!$N>qÞŒ¨á&üå…_«Vµx]ï¯N¤×¨í—ƒcnY,“óAãÄsý«™-DÞl“Ïô(ô)ˆyÓêï4þÚüªû*mŒ`%ªÜ%µäy;òÑÌ®•Âx¹Ê¿RDŒV CáñKsÓ„Š­Óa³ûh wí!$äò Þ°®Îòº—vàãOLšZÄÊå•V<%û;`·Þ`!çJv¸¼ÑïÉòv¢Ó%æj'êlþxñz'覦î‡ý\>Œ1 9Ó¨SÊ…;°¦ÅX¡”/ŒÆáÀ ô†÷JÂWÙª ÷À ô•ÀÏ ×£òBäìºä=Â%©7%«ñ Ð ƒîÊÍ#îUn0™íªÓ'éB‚jnc‚¨€‰»Ðu§eµÿQPì¼ËÔ˜£Q ¶I x¤.pH3Ì]a–ê)¿—Ò#¸hMDù383Tc0àéf囲;éw~·©ol¿ù ÄP7_óR®×ië: Ì¨Š¯{y•|zØ i0¡%‹Tý(¯P{…ç<…ºBˆõš÷0•Øÿyê"’©Vs(2]JÑžú¾à@²tñ+õ!Õ€j%lñ§ØíÓîz·IdPÖ¸"çW?ˆ-‹QÅÚüy¤±tp*“¡b?Ũó{8vv„Y(éÄ–Í•$AYò ³ ñ÷,”¤z›Í£ÙÔEÙ¯Õ… زàùÎå¹U12Kƒ žŽ©?3üR‚¼­ƒÀ_î6LÒLc©¼ÐB`ƒÆ(FŸd{-O¯)(Œgv½žFqžÇ˜ÎScW¦Æ†+=àEš<¸©ý[~+ó©˜u„:™Ât«nöOÈ:5i:Õ²­1…ÄçŸyëÔÓ¤W×N«ãV=‡TR[7Þm­þð­÷!¿(5c\m³º„3]ӈ砸˜‰.‰›ƒìÇfÍ/´ú§·r¯9/d¼·îÒŽÈ]w°ýÒ˜ˆa‡âÆ„3¨[X¾5¬÷ ¨Œô«M§@ŸA.£V4‹ý±Î‚™öVÐXúãiõ9ß^Á8åa §³ßš–5ó/Þlh…FH õñòNn«ÛÈÅ©E7'ŒZÂ5vònõC®»ár †±èÆ<úµ¡H=€7Š!¤\ÉQÁœ»%)âøÝ»[Ûúà2ÜÂDÑ÷ÉÒªm®y‚ÿºÙáC¥ïº âów…ÎûoYïbjm-amçjîln&ítsUuu67¶ÿç]]_MÛ?vµVZ N¸_3h—Y¶¼Ô!?`Rµ4lžÖÞ\š£¹ÞÉ#x ©‰õ3Ð`iÚÓ˜w?&«Ìª@•×{õçg´ÁcñWî£_8tÍd¶Ë#ÿŒ×VÜŸÎ ÁÏ—ˆ€–›¤ýôøÛìè'? Iß@!’1y'W\!‘Ñx¸µ/õ~’d戸A_úî ÙVöÈÀ‘KÎ 0"|‚oòv¸¤ó5Z3g¢uO”j!„e&x|ÉÒŒoÖ—Í’»VGàXܘТÎ_c®Ò\VVxPß^<ìJ–:Šé>„¥$¡b1˜!ælñžß›Ý¦èg¼X϶°Óé¦Ðò;439 ¢³ ÏËGºá¡Qˆ/‹L‹Ë¾2Ló¡ÑZKb QWÓÅÕYžu`âg¨«ç ÌùkHv»êÄo.Ìͽ±²—¡l4ezQoƒ–pˆX‰D1¼ŠùáòF–☘òT ‰íÊ6 3¶oÛÏÔጦڽYÓ8˜«ú ÝÚ8t! ÷ ò cÝÒ2?‚f]2qsL í6Ú”ýS¬È=›<ÔÙ5U†Dú˜í«¡úÊHQu2ö ·ÊOÍÛªà'üâ£ÑáïÁ¾®Hj·¤Î¢£b"+1Â0íZWR ã7FÿóÓ&ô“DUÇUaBãÿ.$PO˜0,:(¨‚Ù\ Öݼ’¦5ìÔ~}Á¢— + Ý7¢†:|˶X‡zÖ &ûzóRÃwŠÊa/5(˜«Ð(Þ/gpv«¯Váˆb0„qŸg˜kºð2¶—9ªh,Õg OÇÜ+‘~½…Î%<Ž]Jkš[ýMc¸÷j.ÆD®Ï^Û}yé*qS³$Üäk,µ=^.ÅÐÖÁ>ɲ}x­ñ²]Ú[{ SESú§AêpºŽ Q™úïÉDk=Ó”Å┯’©VnS'eVˆvZ_qÝ™¡‰"ÙÔ§]ÓÙÍŇ¥H”¨ªû Y ¬¤ÝN§n?ʼܢÒRÜáÅÝ)v‡mú5ØèfqO×W­’O5&,›Õ«ˆ–lrÖç88Ò‹èý$Nß´ãxº ´yhŠÊ·“«ÖÄ£üig©pãgû/…*5§*ý Åú¾j¸=ÈçY‚°\äýéÕ~µ_ýsûYbõC °Qfëzv‚if·ã=f5õ±¹SBFž‚íIò{à—òÏk+nÐ@Ó{%AžÎª{Ê/´gY«ÕH~a¤¦ª`%xÆ_]Ñ—4ÆÛм½¿·"t‰®z³ËM&Ç èVz•n|Ø ><À:Ï­àà—x =bûå5ŒÒãTÖïvWxx®ú‰"»ŸQbfæ¤N½Oq¯7%}ÿšˆÍàƒÝ£I‚4Ï›³%~$ÑØpn¶YAfýGä3FOX©'f½Çy\X©?ºY®PßNÚ ò|²7o;wçä ¿à¥xõç5c‡y\úÑÞa\‘¿•ØžC§Î~ŒF_¸w¼µlW‡ †">Æ‹.ÏÁ︴R£EŒŸúkÅ—Žwöä-º¡J¥ªõý˜8?y!gèš¹y-9ñ €¬O¾Ö“ª9¹{?òŠæÐ윈[š“+:={u?B,%ÿžqÛõmZ3óýÛ¿r“uM ”û/7»¡A@DþqSÝÁÚÔÑÌüà³HýRÏù‹Œ"-®1°ñ"5²Š$O/¥YCˆVZ88pM¢};ö ‘0¤ãÞyv 멇+ÖðUܲ’LrÄýêY²¬Cz„ûŒËâ(Û/{sûª¡cæêh¦çÓfàÞŸ>¨†}mÌ„çi8,Ž @1±ôò` Ñ.v¡ÿGKˆÚÁ¯Mý¹S†~Ƭ ×Eñ^ïÜ0¶ LS|nEï\® 5€q^¾”û.ņ£Ï*¹V?c-Ò½Oc«S\uwÌüõ×—ÔT22¥¿‰W`!ù6Àµ“Ín‹¥ƒÓ ÖTóÚ4KÃàéÓa[•[ò¶8²“1wæÚŸ°Ú™L—ò´W¥¥ÊX¥Ügj¯;ÃÆVÙf€òŽùέ©qÆäÛ/VÕ,©·wU­Ÿy[W•Z4¾ ‡Ž8Ävê|^QÍÑד6ÄEzO±Ð70îÓî$ãN7 )Öï› ÕÙ,JOå$©m3Ûˆ%þ!ûj„§n_µ–|,%ä‘"EÓök·@Ž-m3B~j‹ÚnÑ&õò¤ò°ïçÄ‘sL…]–3½¨jmX~t"(9Ä“1t¦C«æâd¤ŒðYó¸ù¦Füpz›uiÀÏø$¯jÑ0™'ÁAi«•ëYü©hóò© á¸D’‰Í€Á8…^ß– k÷£3Ö'6Hö¢,rvØ)4­¢ÓnlEã9oxЭ|ÃЭ D¸¦nõ8µ4¤ô¨øð…¥dvWr­]û­)¡ÖšÅÄko ZðUÄSfW®QÔÿñû,•a¤´|² ±â%,Úæ*:\n{©âþÈ¥mH;P€É^"þnu^Ïm‹CÖ‘Ù«…±¾Ô¥Y›´k,á}Ž'¿#H¹]:”û׺‡ ]ܽHl“£6íB:Ê­­¸aÓR¥Œdåuòú}Ç'BIýpÝæ9om‡ÖìfÔàŒÏĸ œd7ÈC~äL˜MzÈ!ÊXbÄ“[x»óÏÚ²:ü!DO›ùm‰ä#ÁÉè·pw–«4È¢bR\qh¬[J_©ùSH?±ÕÑwȸ¯'ì½):èB=pýÑ:dÆ~FÒ}ékáŒw¼<Å ¡ÈI¥óæIòq‹7U®„Dƒ÷¹™ë|^ Þøwo1] oK£Ï)ù°Ñ8,þð:˜×ÒsÝ.ˆ*\‹ n¬®×€íþu æDíÌ— ”Mg ®5wŽTÂ#Ö-Ívo\¼Ÿ"5ºÉóˆâî5˜æš€4Ø®ÚZŽÿé^#Ö³ œo’'`î<+&¢à$I/³ ó”//þ¦ÏÓèxÀ)ÎtûIô#ÄB0 Ö‡Ç~ Â:Û©ÕƒÔ'|3òñœ‘äÿŽÉ Lah‰<mŠ˜€ÓÆD§û½ù Ò¿‚Il#)è/˜àþ:¶ &7W+sWkScWkGé:9 ]Íu äÏh†‘>y«Öyéhù‹ÄbN¦ôøÁ>l\4T ®Öº-YÅ\($«Æ`¡—pŽ‘Œ]“M†E¨Vd^%N·C–‹œCÿB»Ð3Γˆÿ›ñ¤êà9Ö‡Ìé3¾¡¦wŒvä|yŸ?{ÖPrMZ»W»|NíÛGš§sh>­´yúf´Xv‚ùtU?ÅÛMD¶Y× ‘ÊK¿yG‚@ta‹„ľê¿ÚôùÜûŽ>½)‰'Ìéa¸I—ó)JBœJ—K+ªh'^Ü´³Ôc,Xçá±£»ÐÏû÷5Ç uL5Ïég.…c¥} /@ ÓœºbÏï•îwøÄÏ™Ü.%ŸŸ 9Nlo¬õñŠ–Y¤ê3õøÃñ¯{ÖÐN¬‹hº Qxö @Ÿ+ûØäT´†çZÜ:û¬àCÐðhýÅ™Ï0~áˆ!–êìwzÛ$exé¥ûàXŠgJkiBQD;<ýŽsÌ2_o'|‰06 <ÀÖ«ªÞv@]ë1Í;Yr+¾?/VZÍ-r"­ˆ¢Ê—O¢÷TÒBëáØzëþÛ•w¢÷†KŠu¡QÓ-™ (³ï'V6‰ØŸ%à“ÜÈõl™ùzöERë3«8 •Ôø%Óœ¨òÃ'ñ šk#ÙFKܧ~ý¦ô†Ê½jÈçç3[êÂÏ5ž p €Ç4c—ÿi®R4N=ÐÔÑ¿ä38N]uæA Ú„ÊN)òíH7ã¨g›œƒ.PÈIŒ-tœ¶Ÿü°°ô¾ñ‡#‘ð?®ˆo·~JãÊTP·7ž®ºßÇ·¿Þo©¦ž›`ì8õ4†óœ‹KõÔ¦óT—@20Xó ݺßgÜJ%>_Ò¡[{ÍŒ'–—¶Zª*´‡e¨ÁªG]‹üEëÞ?j‡ Q2‘ÈX0ᮊI Þ¼NœMþ#6&§'"«ÐPnãº:rç=ÎFOf:R©Ê-›îÒ=UX¢Zw»{>;ßof ÐÏi>þÔ¤9õEŠSü3„?bZ°2 ø¨Ã ÍT8ñÚL-çÅÄg¤9É/"VXÖ(˜—}¸CÀ±>j°ŸMÒU‡© íŠZl_Dåt7s;°¨Û‚¡}uèÊ]÷!—cä}.+Ó-Cæ…)va ·Ñ¥‘v8‡Q¤Sº҈¬Âd†Ò^'0ƒ0Üǃà]ÙT “ƒ¬Óî[© 6ÔM'ç:pÄÈò€u7n zöB4Öê{â¢Îã„(&x„AYêd@ì C؇‚Ü£‚¡ËÊ?ùûd,]³Y_aÑ8´ùÝì[B³£04éú®j!±6K¥»®š…PâÃÌ¡ApÏ¡˜g‚%æJ bòwMu¿· ×Ý­¼% K7+káE­´4¶j!¦)ú"!4Qß å‡ÖQ¸M&ÊèV‰¯XºÑÕ$$Yl¦²=võ鶘}Ì,TÎl o{d¨K aÎôÂîKŒˆ¸J8² èÛIeqw?nÌïA¥ÙÍõ™NæOc[ø'D!œS=0yeªZ)~Û7vbVLHb”#Wq‘tO'ñÄ×…ž"šŠn×'DÏ‘>nÄ‘ë°Ûæ)qKÊ5ÌŸd›# S¬íì zé9ø*zSù¿Và}é6N( o}ç9Ç=gᚣaü"9Ý6°ïáM•R )´{B=ͽӅÄãž‘ˆD¶‰A^V¸{Ob½#Èy'˜Gôz|¤ÂŒuk îhϾælÉsØwhÊ5ÄJªRî=/$*ŽÙU?|šÕꇗ+ü(Ø’<ÏÍ+©Éî81Ol}jž³ÕêHó;Ön,ÍÒ³ 5”¤x ¯P¶»Í_³.×nE•ÎÁ‚‘y2¿g‚§ ˆ°[ÃgåG(:>6üWŽ¿#ÜšQ‚€$€ðý;Ž‹Z;›þ]2ÿƒãªæ®¯…-]þAt¿DCE4aô¡™ÙþæõÅÔ|-µdˆõ ýw4CbÊB+‘3Q˜N{’KŽËêiåظî›rä@)Ò8Jêý¬æF©äM³£éɶã­Ë÷ר ¾e'"\B+ÏR² /öt•ô8²„(“!2öSê6,õ½Ä0s„8ʵ ÇQJ°u³tÀ%óˆw ‘ƒgž¾­Kš‚;ÎÞ¢b·ó)7¼­B†Y1šëdìñbø³yøí—8¸†Ã%ü†ÆÐK)Ær`‡êaâžÛ4e‹Îc¶}“}qJÊ­[ÝÑK¶ïò”#f³5-cÉ¥?EXè{yýýû°Í.‘Ë™ýúV3{2¼VºqzG~øÛìæ&Á§‚“¨y8ÿdÍ“¸x¿$wp¯ s¨.üÏÿ 5!îˆÆ@ë cOádQ™"’¢Ä|µW& 0íIlÏHK?8[+czsc}0v›ùª!‚±øÎ @á ¨|hw½@ºõÍø½Ã‰ÎmñáÍОø8wœb}Bï QDuë ‡•7˜ŽzéTW~ÕHxqqdø–¼ìtv=qïck¿¸|Ðá‹(ªt®æ85÷ VTË—™Äþ“þÁŸnF¢“R•ó˜PÖ§{4+iU¬bRú<ÃÏÜ8`ÊÑOÓL¸éâJÀ¢¤ôp©w1€}æÞð4 *T¹ï6çSž8r ¾ðùòÑ¿@ h¿U(,š;íÜìþ1Úº4a<Ж1>%p­ÍXX¸†SikG룥~‰ØšàÒï›dá”fQžj®ƒZ“Ke4[¯K·_3œJ`‰`Í‹àN8XÍûÉ>¹:~É*^gáŒ%ZÚ•(¸Åny_?uûlû]oz 2uà ~n†€BÕSœ{:eKÂêaë¡{]€bÅŸH[,‚=y Tž„;Ñ®÷êF‚<9 —|Z ºâtçÞ‰ìÙ&1%mÏBÈDƒáä¾\qà,Ñq(ý#ä¾|?w’ø^h_Øfü–?éÉüb£d7üÂts,'™jo°ÚžQÁ¾sÿ˜x–1…µ-«q¥MçhÄ÷P«$‰¹ói“bœ4»ÒUþHð”`ûf䩙κ_vó(±w›3ogÖ›4“ÓÙG8ÐÌP7䚣®ª¦ºÎàª(†w¾—žç ’àA‹¢ÃQÏP»ýB;B{à¢hô#.©y$d‰;Yµ%å|˜Á=(º {ª®Èé”÷†™ÒJÑé_K9S0Ì2IŒp«½$àרJ°1Õ“ÍÆ—ùµé©° •4 Ÿá¤YÊŠ4M qÞ‹^©H£#3¥öŠ~¹föu1úáô iÑc‡*¯Û›Æ¢ž›½ xZ™œ€¦pÞš®|Ã$V'Ú†²ù¸ˆ’Dž… |†¥‡,N­`Í«Wsl{qä¼|Tïkduáèôœ$F¶i}äÜfø"5ѳTûÌX0øiNLÕcž¬W©N¨d¨ÙI·¾š¨%ziN`3.Ç>¨ñ,á‰Ñ¬éÇKAÑ,¾9ºLãž œm`8H{Æ8LuóžýHæïЂ-Ñc˜÷Ü,%8s‚ÉSíÐéßÍ áQ:yé3 0ªTX D¿]Vç2£svJìvX¾MÉ’éõϘ½ã÷ÄßÊ2ú‡NxBô$ÜR6ÿiyΊÞÞGÄæƒR›Â.>C4Íßq¾'Üj¾Ë÷o›¿ƒ‘¹êUˆH„Aê¼ÑG}¡ÕÀÆWpJ¤R}¡áèzê‚9h™Zæß­AKq¼kTñw˜>pò˜C¸R –ªÊ°˜jA‚\)l"ü43ì§ñ˜lIt8<îøZ¶mÔéiÐÑG°„L®¤~ñµHu­E£Ù¨_ªë».¾:¶¹¬C‹ÎÚù{JŠÎ:°á¬5)dZùY!÷6>D¢žÁa~¡ýÒ®ºHÝì1gµ½\Ð&.Ô‹t? 5 rá2e´?,V߸SnÑó‰tUPîœõûƒcà̦iÏž ·£ˆoºû¤y;ÚÜG5¨–Êhç^ØúÆ?呸@i~v‘µÞÑm²Vogâh (BÁíß9Wê…°@þ É£ºô(‰k>(ìØ:.>ól›©pimº5q6[*ŠÛ:Õmä¼FüxÖZ8‘è®RDœ«JU®©(ÙSf0xj¯rhh€¢;Ö$~Žf²u¶´Øz ûo3°\” }^‚{r]秆«"”ër5~QwÎÜå¦ÐHrC/fYIàƒ!“½3J1KÅ €KŽÈO+ ›7"…Þ>f„Ù£òž#G$Ó ®Oø!R®ˆŸR3ø…xC¦Í{ˆ*÷J›gù'-ƒÜ/ C-+l bš"¹ôNLaÐa8,ଂ58ôd*a§ÝGí¶Í(ÒÑk¶Í}–ÕmŒ¨:ôb²Zß7ëŒPKʇ"=-qnš=‰ìósÎÖ½>3Ôúì8׆P9_Ám jrV¸–†UÜ4½eæZÞ`⹡XŒóÒ9Ыæ vÃ%®ëT‹\t á <ÃRg¤åÛ9Iz8ê+r£g¸¢FÚ#Á+Z|´Q%GÇ-±Ÿæ/ ÙÆôOäÃÍ}UžÈÒEzØTȘwÂñسª,rù¶~tÛnÐsMaGôgþwÕKÝbKÁ˜4òÚÇ¥ /ÄßÙ̲«?ƒº+ƒ~½‡" îãYá.é°´ÂÞ¥àíX¢5w¿ndbHžø°å¼C“²?k2ñBZ¥! &µjA(–tšä‘á9`qPòe°îΛ߹9gO’6o3LÎp¬]ŸÉÇXRxFzê–p3ÀÓ2s.\\ exL±"Üíöm3m$‘ <»{Ú²–ÆD±ùnŠìˆœe_Á£Gp©°LrºG§ëŒsk>·Ûô¼åß9Gp=ÝÆêÝ¥ ØŸý+¨i7ÇÞÔž:Apˆæ{²²Eš+Û8¼úÄâÞð9…]u‡IL3Q„wÔõcÅ,†õ¯ÛÔDô—dûÂúW‘vø·eÿ „éçþñZ矞4®Of@9ì«.bN§éÍÓviÂ[“¯‘–4pká’c5½Rœh"i6iG4" _ ¾•ùýíûÄÅä×KÓ0ð,SŒ+†™òÂðçü³m?1&H-Oº¡¼¾&D»s²ÁžÒ^C`¼Ã­:¥GN,%Œ“IFs«µ>‚y7n¯-½%1²1EŒœ F¤MSb±Ú É€C±yîAc°]™¢Çõ¦—Ü2ì­6ü å çòôpy1ÃÓ‡óÈôa4ø–ùËMÃæô…÷aŸ™ï>ülT9.Úûà™ó[÷Ûšqºë_ADùEBùï2&&&úD-r#xª.»¯$f¿{|õ¥^€ÅÒ_`'†±(n™êêV‚ÄqÍÞVŒ&&˜™ÜÁL!Áà XËHõZwxÊjW„(8;ÉtPÌéγË>-W¯·»I7\•è/W öñw½UR‘|™M-#Ÿü“:¯tåî®>£;ZÚÞšáŸzs\ž°Þ_ =¶®˜ÚÞ*ðó?—ù^=¶>Ã$·“ŒyßÐ>xn¯î_7p}õÂ}n"i•ß»"°¸×Çñ‡¾f üžº+yÄú^ï^;ÐÃòîaðÂ×MÕ§ˆý$hÖÑt«ŠókGðçÞ ù3̧n˜Æs<Þêûg-{I¬ˆ Š ­ÚTN½)}‚Š— ŠËÖ°©?å!ËRž ýA„в¢Ç—úí:ȵÆÆªÔدAsöݽ?~M¥–H.­,-Î^J‹b$Ésrºr²yé´{ À £üAà—··çK‹!Þ. ÊKØ ˆŒß®i™Ñĺ€:¿oóžg3m„é¦ɆÎÈïÜ:!²Óx{í©‹e;ˆºª–F³øŒwlôqIJŸl…ï`ÀV‡Zd6^_z þ<ñ±³|à—U-Í™{éó³á¢½áË“ïòù-`b_Öó©–ý[ó‡JàÊ ,"%'½SóL@Nߚ͑:Ù BBÍÖÜ%jLöÛ©ß:–¹©9ÎíÄ–nͶ¿#ó«íYÛŽpF0xeQž-–:§=¥Ãb†ØY/''ƒûÜÙ.8+~_²ŸG=¤ÍL ©9à\ª†øß9„kOà®·7긥?¸-% ­JF·±ÅEÀæÚG·„ÄÐÈÜ|^}ÞÎø¦ø7Ëkr2KìÝ›wn ÿT¿†q”Εâ:@#IœYn/Äd𯯅…=à@h±ñ K?ÃæW+mg·%?e УáˆR¥²?ltÄ÷ßɽ· W–%ïU}ì·ö>$d[Œ”b8ÞòÏ, ÓCÊÇwÓO×ù>IêìCe®ª%y¦X€.éF!zþª­%3#$­faZ]ü^—®Y^"¯ÒÐtC„ßK§oR£áW— ÓË{“€™ŒÚ¨’!ª:½qÄôö[°’^¯íèïÃJÔ¹¯Aµ©|‚m½Ê±–5T%£ä?‚ˆ†ð°ûä½hù×o|ýÆou’OÝ`ùÀ¨òÉËS™Ð>ÒAKvØâ–è<ɶ À8hWB¦ø–óè”n,ìTk³:bVòŒ¨ÜiZ#:¦ZÅû N„ã@{iZ1Zh<á¶Ê{-wä†*vܯÜwì7.®ö76«w·Î >/ö«sxÕû¿…&aw’ï:|Þ¨âÊr*îöàR–h» Ù4®tîô´t÷îÌoWJi}– [û¬2»Î©<8™IzÖÊŠ„O‡Äæ Áøº$­ÐŒÿ~ƒ˜é­Ÿ¼Ÿ~,¾u&Þs,‹Ü µ@†žøg‘_t‡µÑ¸ÀÇ67Tþ-h» bg¡ÉQ~©¹®†‘¢„ÇB\äîÈÁîÐA/¥oBØqŸ(ªË~úÇ»´4×ý >®pº“¢a+³ö»f«ócUô`Ð[Xø¢Ñ÷;q€OJQ¸ûU„œñ>»%€.,H½ЩÜx#Ä64QÎ…Æy1ØuUyþƒ0?÷`A¯Ì?}.\AQá"I6 ÞP¯øà&C™îëQ:,¹'ZÞ"Íó &%üØqüg`N4coù[ÿ6]Ì+X2‘÷jföìÔY)ÊsZükøçùTl¡®Òߥī_2ÁŠ¡KvnÆÐô…;Dšú¾ _‹á¬ ä]“ÇùàF[KÉÈ7z³§<éý·/2$™”PúÇÇÙïÈñÆÓçò²3bnUUjä›Ó&*ÄÓ©rχÎüüƒ¸ÆWRåªh»yƒûÍËù/nôÕ“¨t:-yØùäÊÒt!-ί=õ÷©HMƒUinª¥@¤ÑCóe›ÇK—ÌšX±«»[öeÑø¤ÇŠ=`ó.`%°xe5•{º‹[¢©³¨^.äÔj<6ÑŠ?»@„h*§Ê/P)$]õÇj*p凄ï­î@^ÞQm‘Ó.ðÇ(Ô§ÇØ°>¯Z\Ä~?£ð"  >hˆâÍwµ°ûÜÓ7’Wÿ•{¿ôn"?A™íûéÜ[«xÂpÙ—<ÑÚ€µ¿ˆtç/à ºùVA÷í9ño\å!uûÜijÂjÔÚš­ªªª Uºì%r“²Íˆ—AãŸb–ÕüPð«41¦.‚_!ôŽÖ õ¦IF·©?Aèbì¶.戵‡û³@",.¶æ¡ÐâEÉþòéjî¬g^Ëý.8}þœ‰ã©(ÌhL %1“QðPR<“œ ¼©È‰â É}‡ÑBÈg5òkôIó$ÈÊ5¦-&‚ƒ¸ŸŸ%= ë(© «ŸIï8d,ú9°pw¬†/˜²ªËò-4l#×D“¯ßdAGYņ !À¡,'0IäLÇøì0Vó"+öáÐ@öëUUIKÕà”*T¬—ŒË¥Çbœb—¦©f6šîwX ûóD}cGs%lº†9ΘmÔ­›|ic’¹=kÏÓKjY± ú~Ú8lØ >@U-DŠb–ÔŸôñø¸²ÌQ7È2.zc‚ùy•¿0§öJsÓÜZX[íïMa }Öy‹ýækÒ>mî¢~â쇡JÎ77,ŠâÕWx#%þ\U=,žŸ8—G†ÌÛhˆO IŸZŽÑ.©Çâ>›lGs±ÐÊs"»b QÐ~þ< d½¸&SA˜£qš_^² ®ó’7_Cmš‚Joy¼ïت$9¯쇥¯Ãæy†÷Õ8 U¾ã:}åA×’Ž`_5ÍÆ•m¶ÄGìØSº­ärá÷Ó»¥?h­ß¯µ#ó£÷ÐW Ð3‰-Zïß‘iiôÞjŽ*5«iZD_%¬%¹&õ^KÇdèˆFZ£3G3ž`AšyªI‰,L2ã Ô&×?÷ú…›ó:׸+ÕÃþÉò3æ;ß{ ðS>ÌÇ{‚i báY>©@xaïˆkàí³UôB?ÖØ_K£‰kQà”bÌ…kÈNÀ¯ÏÌŠ¸xÊ’ Ô³¢³ÕZÙnŠFc·c {fНªO×÷… …ãÒxô2è¡oWÚa‚öOØa‚ñÏÙ¡èoƒä’?íþÅ+Þ hå±õÛî·‚j¸Y§N)»°=TSŽRGÌÚÛo÷»M’{G4?*’:Ý ƒQ h5f­Bï"hõ\îzþË$»©RbGñ ˆÛeúì ¸¯þE*L«‚6ÝΨ¿+¨1F{LéŒ!VxÜé¹5z8ÌŒ}VHF'Åyn‚RF§T»Cl›ÆPÅQ³|?$SêÊÕbáÐêͦíJFW+OD’á7>¾>[R-?eÞæùø¶9ê,Š‹®+m*9 bVçE¤0¦Á„ ‡ÝÕ˜'²NÄÚµÕ/É!ŽýÈž_ò»øSu[=;å$Â혤o Z,G³vr§AèòÍï}Ô}Oä;è}”}¼¢âáóë/¨v¸`x î¬Ûªí®hµCö g¶ÞéµÖÆý˜ zÍ$ŠÞë,Q”yàÍ”¹T&1yWŽR!¡ý²ÂR½øë¡àXÿYðþ³`¹1Çœ®‘ðS庢6«àoJ81~¥‚oü©Yç™^xaëÚ¬ë¥ã•0 ™Þѵ ‹æuÈÈziáòô \ˆíæ÷rýë>UIVˆç}Öäzž¸¶T2 ÂíKGÕwìÆ-CßÙµlO¶·F"k³7‹þ‰fG¥Þ° $‡¶R\ŸøÛ!¢á)òhñÄ1±sÓ‘Ñ ט©¦¤ŠÞUs¤R'hR˜œ£ÎëG%«ªÓéÖQÂüe_  hf£f Rõ°‰sÚÞ 'Ϻзº³â©3mô-g.FM™staâ:CBý\Rz®'ê¡YfUZð}d Ò/œ˜Î¬ïs¨œ¦LæTÓŠ¼ìwØγúNÑÁ Ž·+tK ÓߎÊÀá=Úlêm§GŒk<ªÑé««ÆóÏqºCm„x¸UdaH—"ÒßÞî®É[«KÁ faæÐÙ×h.q˜8ZR¿UÁ¡}5ÔæÀxÏd‡vp}Ì]lZvù·Þ}Ѐ;ôà%ï¸ÿº£ 3ê› ¢ƒý¿øØCLMƒ\ÕÜÁLÄKEIô?ÿФé勯NðÕmÁ™”%wUx*"bÍ@²ÚH©ûËÄšÓ¸~¿,µ¦C™a 0÷ ºP˜+"ü¥ƒñ­ ÝžÿD‡¯¶‰Û ü¶ìV£ó¶Û±S¹¬g{ò¢ÆbŸè(Éëz*㉷»çüã±Îrš>Wß“%’‡ûx‘„Ò3ý¯Iãë O»FExjÓÄjÞÜÈÀ´ŒST˜Áïq'¤™­t•ÏÁé×-ôƒ•³ÕTmíµ‰)V±žxÌ”ÿhΣò¸èŒ¯épD‘“­Kg¿ËwËTœóò©ØÏ<ØöYr&<Â6®ååq‰±DzÉ™XÿWVÜ >—•=ð†¶¢192í÷¾B¾õí3Ey…¿»K´Œ¤‰Ý< _—á˜þ¤ÒËî\å·Š®‘°†R%4yIAè­ Ã\ wƆô‘ƒ?´Î·WªæÏ33ç§4ËÌ®Ƭ¹RÞ bÚ¢šJTfSPZ8Qš¢w?“x®q±h¦½Õ!4tÌÓ¤[:DäÉŒ²/MÚFR¯R’¡£²xga{qªŒïCÓÚ®º-0)'Îná5,t0Oª7ÂëëšÑ6†š¹ë°7¿‹fO3®I3y-ÊLÖ+Ìþ…µ%?WÔóF¸¸ÃFã•üèXμvœb䈆zcAH$%Wq±j]Ü´ùDk£ð•Ñ*c§æj×@êÛÍŒ²[³Ð½ÜNWŒm÷ QXÆ£‡P‚¶O•{¬ÓwÆ¿–õŒ”BáÒé§%"<מäÔÖ!îÖ軩Nå’ÝSB )ØÖØ0ãüla4”ž;–ÅŸlU)ÊÂð¬ ,Hs^žp:ZTŠÐá%‡ýc'âŒÆB'îl4/ˆ‡ÍÒ pZûlHNio‘$*_"ÂZ|âËòmÎ&j? ±Èºžiá(ÍL(*"6ªEܳ‰‘/JLÐ.µQátDUR[Ü«vÐn ç¶3!`ÙäÁ¼ôJÄ›§;øÚ“‹à(FÚªU)ò°ñ1Sö‚X-žÕÓ¢j ]ÀóN(Ú³‰Ö-B½Õ"~X1¦Ÿ]fR•ÿºïæƒÖ²Ñðl-qyYüùؘÁv¡ãà7›™Åº†ÆDî\÷7÷­–Ý0p=rÓþ=0*1yÒU´´|zy\K·ç‚e+ŠT÷Qg(Sš)V.ß9˜í~_ùP½Ý[-¶µgóÑ_*ßÂ>TaYkÝÖdÖcUÎB¼áTG_»ßsQpiÕáý°.ßÙ“;ãç¬h©:&^Îòâe÷¨ZQ˜®âT¯¶ææÙ©  ¾1ú5ÆoKTt P¦í~Ôª£öá1ÜÖæ‰%Ö» 0çÚ!8çú!Œ9ÝbRN`ÊùÙ ä-6|UXQ/Ð;T‡ïü­ÎNu1[T6YkBÕ äÁØšã…]D覣‚ó{صϦÊÁ4X7‹%sÊÔ^­D#Ó=#‹48’Í:ªÑ“ÝW’o„UoÕv–ªüÁ]qf«â:ëÆᯟXì:ØM)µ³Â¼ðq¨ﺴy² ý³÷$!']9]9ò¢ít;éé,Š<ˆÂËïÎÂ0:쑵‹Ö5ƒ/C^3»I—²dv:Ãiù3 £LÓVHÓhË2~öƒU EX/È<(sF¬Óc:Å:‹ ZÛÁBó¾èI2"äXùGY£UPÈšWvqQ“½±1¦Êð¶ÂüHç6OpY|ðXF«²)y¢÷ z|+jÌ·7T KäaýëUI3˜óWY).†m“³J"·¤Ð§,·#À ïŽxYˆpãùX”˜‘ЧÃ\(a¥€óí¤1½6,Zú,댸©¥’‹ÞÈÓQìé¼n¼³8«Zp›W´°›ÉˆÁúvÁüéWW+¡ºÎyvC´åGX˃%þže®X{ø ñyG 3™‚^TÔ$B·™üi•oŽýº­ê'Ã4Â=†µ,~‰²¶‹£àõ8R^~®6Ñ Û¾I Ǥ¼{²xKä$}[öE|Q ¥q.mª¼.Äã™Â×Ρ9!SÁt˜¿D"„ÄÔ=š$"ªarü8F÷q1¾GÅUAÑ´Å[ZLSïÓÆç—úZž¸UôŒûZ³F¯“'¦áQ‡‡.B^®X.-q'©9ò¥^WvF­¤ÝHÙ·@×lÙg]?vÛ–«${%— äòÚá Å{Nì;œõñön¢ÝÀÏ0<{ø§noÙ¿rÜw~áSl;øLÚF¢Eäú!åÖŒ‹=Xc7²Ÿÿ–i‹MîvöùÇì!üOòFZÿ“7Ò÷&XFûÌgô[\O#âÌå”±_Kû%rÀáðC)’Þ†~ÊNZ4-¦™õyÛ7=m!ÛšwIÍ:ìã\rš‘H᳨“ï¬ÿý¶ÜzjŒÍÃ[–¿îY~îOËížgK)Ÿ›N¿+è5ÂëÆq[PDX¼¯j¤þË-+³çÁ þ°KvØFïœî»‹¿Ø8³%­3¬°ë{G2Öõ‚s;à| Jùî 'XÙ'ßl¢œsóB’þÊÜYX]¸ø Ùèõ0üÎ`|³íýkÇ_v,S`DÓ_u`‡Ô7³KÀG¼pÃr ûS}¬ŸØüqtgå–°cñ.8º³z þþN1*¼rÛ6†÷r«ìñ®04‹÷tËìñ.7„ósÄÍP½çós„Â÷9¾«ŒôYsÀŒÿ9 rŠùª; ÁÿœÇä/ݦ„•ã t‰fm@ܦàƒb§Eb©1‚ï ­8bÅÃp¹$œ5ÇË# “I,ªÕ‘|º–®,}GKyêRÐ12l6e~èó £@8ï}Šbø@‹l³ÊÄ94% 5q-7Oró²çŒ³¹«ß:^gh Ø—VfëQåI™ÛÞÔ| ,°ÐÞ?l.Ùj½c€#úòí_¹> ³ÚξeC²=¥Ÿ%Ä#­]y(ÍÉqÜ03A/¡ý;rcÉC‡·A1/~è•à¥ç‰%ÈÙg®Û@úDÇØø ±N&ÎV²Ä(=ˆZ䙥õ#”±p¿iJ¹ÊÅ¢3w÷MlkºÒð±5ÓLoõ(mõ6àö®…[Í«Wé‚Ö‹+Ïl‰R)º%‡nIÚ™­‹Ì­ÜÊi†$÷¬,›ÅÚ (Ù%¢­Kóô¿ÿ©]@½€|†ô•æ{©!(RdàpffPñ¹oKÀ ¢ÛqV Ó¡ÄÞ`ÎÍ.Œ¤@j”`àd=Ô“-ӄѼOËÐ&2f@úé4ž–¡¡»”ºmzj¨3¯›³¦þZL•Ïsc/!Š3p³Ìä¼9ùA8—”ÓéÞè¬Ù¢lõa‚ã; EnäÑÀd¯ðVÿA³Äeqê*R×$»ˆÒèÊ…a¢™× O‡®Ù°ØLú˜TÆ3T#_16Ý-JÙ€5‰„Ãïø“ëÉé¿Ôu7žE™žbolJêB( ?“ Ã䱜NÛðƒ#ŽÍÏn&-ëVc޳GƆ&ÏÕSÀ²–ÍÙ‡Õjx2žÓÃ'½áj>ŒGŠ~ŽÓ0ößÒ¶ Œӣgvà±ã·HÖ#5Æï H“ß ŠP!dqCšrNrÚu—j:¤ÍMg4q ˆx­Ù…]Ì“:C©ßøÒ ¯ g‚º<´ùpiãœ|£“reÍj¼† ÞyO{öÐL™-«3ù%G”C9;8Ô´e'JϯF‚°œ£0ÈÊâ•+V.ðYì¶áN::j`˜{ ægh½:ãQxopêÓ5Êä^mpj†Ó5ÊäQ8epê {7/üJ% š~¨ ‚þ¡\ôŠ\!¬½+'GØ,*Îùƒ +°»`+¨kÀôt¹èØÑšÞIg~ߦ2ë—vâŽØ—À÷ÛÚÃhæØïq½°Ph× ƸmÙ`.s{–جöܹ†Œ`Ÿ>f~ÖM«…ͯPçÈä w˜ÚÂvâLó\ØmS-?„¬óRÛ×TçQðø«”^k f%yAOæmD5CÖsø×ÉŠ&O¦óî–Ù:¡ø“¤ }°±3®Uáí+óDÙäWw?â05•‹D¬V¡²¦Ì×Â?ÚB“i°•îÖOš 4µˆ ‡e½#ÈÍG½±zAÜ7ÝT}oMÙèÇ&ɨüñƒí­#ø¡¿`óÖ%÷Us\|I—G‚å÷äÏ£åsTM£Lñ È 'o¸è¶­È6†*Y1%œëòéë.èh‡Õâ«9õzënðÇ\Ãç8>Sù¦Ô¼ MƉérwj’uVw90—'2û SZmÇ 9¼—QÍ®iôJŒnY-æL¬|MXʇ¨&RåfP”¸ ÑN°ªþ g¨V’mûu„A@xZ%× ¦™+*·¸I-ƒœ!ºcÂZžjJ«Ô}V«¾ú¬&•z(o$´øi­œŒ![jâòˆj*—Vr.¶ÆÒ¨fíÜr"åíïôþ¼5¦zíEµ‰-œQ+“-þ³hõÛÏ5¯ y}i§õÀ¨p7±mÚW>Yã³æëJ£e Ý|¬Õ#TK¹ø¢*ª¿E¹åèG!5<ôá^UU.™IÉYu%r9Jú¸YS u£b*‹b·pÄ-3ûIߟl쯘ß'xÖZõ­Ž½.0·kÕ›½)çkE<ÙTVÍvíy)>÷G¹.vØo®<±‘åôû6IÞYosBY'9¢9«–¦Ç ±¼XVÙ‡öæ3BXËÈqç@†•ã†d,ãrL/¹‘ܸVníCœ;ß²²h|Ýúâ£ÇWqPƒ!C\pú§Z¬`L CàL›¥2ûòv­®pÄŸ¬,yEÑæð©PT \g8ËJÞÜ/úq®v` 6P–‹HŠ ‹Eó¤êíûüs\ß,÷p6b­MiŠºß¸iD:oM/e:/G áÛå§ó7:ˆ@(ÁÞ^óQÝ›Ø ^Gì¿g—‚ƒ%@ýebÿ¯’ÞæîÿŸ’il²¢ò îXþä&š$ÖÎM˜Ñ¹$Š™@ŒYÓði ޲&ÍšÖfÔ|üÑÄp0ÉŠÃÆ’ldÓwÝ7¿×Ÿ]'_-×$õN`Î`ݼ2¿Ó`6ðÿ’Žç±ÄGªCU¾n3¹'·ÓBÄ ©ùÑV¨q¿š„{ÚÃçûlŽX[\ý/ƒüÝc­"®…óŒìÈ׃U«';ùøM”¢'k'¯Àð\:qH"‹àx!ÌÆ §øä3Ào6 y.¬Bò¼ÁH@ÀÝ^5Cjf»uû' ôÊDÏ…Ww´s(2ļˆ$dÏ벵̳‹>?Äw¿dÉäBímqÇ\üÓÁ챃™Ú»ÂíJe_2ÑþC v"ïtGÐf8ÅÅæÃ„æ»6­KyíË©ôEYý'9S2!u˜Ë„BŠQƒ.ûÇJ"­´pŽï¨?Òä¼xE8ò`Á?Õ 3µx>„†Ïðã~¬¾rw©ý` 2¼t“ÌI;ÀOÄ+8ó‚ß5!n{F¡ @zÊúèPL̦ŠªPL¬¦š„$1-L5-I²j]õñ.±*óï\ÉP»ÿJÜýë30ïâZÿ§ûˆÿozhêSJƒ"˜‚&h;×Ïæ{›K?b#‹X9%Š9þ,³™5*\¸³¼ Òcàü¢ï÷ƃg•)@ÌæðºÊ\Üö›Ù|ùúÁ6DOªép6XšäšzÏâô­[É!Z„¹³Ö¸†Ù5×Y-þ3é= ¦\þÊa.ÞÅ@PD§ÿîBv½àýi•ý£• ä&6w¡EúùU°L]EæÉªÇm5ì³ñŒäļ +fÐiMÖNçt¼t-WÃo£ƒÉ=9R;Ö!ƒ¾›vÌÊçƒfKTëG¬0Õ×ó”É>Ë?x=ÅÕ&Éæ­qæùð„Íôž?“‹Ê\SJŠ‹´Õ_uÝ!™ªêl?ÁÖÝ&¶èÒµœòerSž*W:G(»,¸P„B´èõŸNè^þã,è;/ª?¿uR1ªÐ¦Œ%H…™ú%pu£Ís(zè›P\Ìà–·³H<·<ž–ž˜,sHJ±6ß#²Ú©|½'z eïI£Gï-Û+ dDtó¾H;CËèõ|v‰ç¿\ãÀêéÇò<éVѹà2—ü範ZL¼.I­6u&ÓRDJÞ5YÓ)=&ÉO~g÷ªó‘ :è²ËX½…WÍï*i¢”>´pm»Äÿ ·*ê‡ü?p¡ÿËúŸÂý—ê^Õÿw$§““Eá¿€«$geàšûCÉ àC ¡¥—ˆ)ÚÊIo˜ís¯Åþ÷Xþ:0§ÚFK­Ë™fºÍô²s{ åçÛ›QÁCwò¤íëP—d§6­ VzÙYù†ŠðÙe9 ì8¿Ç™¢(Zpà÷¢[~A̶«ÉW‘„ü•¸LÑëå'ãf=Ÿ–büÞz]µ’]Ú6è1×(8Õø¤Fã §ªø (¦öÀìëàÄ«Áz(ʃÑôUFZ \v ýÆôc¹»Qp±—Óð1 c)jà²Û®Ùv­ï ë3v…ÈãÉy7f¨Sm¼ª¬!ŠæÚ€°nˆA&4-€·ÏT'˳"Øwë!²²ÈSF—ík~‚óðf0¹sd™ qýüÜàM)¼ãÇm· Ç{¶èÇó: g¹·¼[Ÿ¤ ¢™U ‹€z1ñü·µ áÓÔôEL00)&00†ÿ”Ìÿüت ïŸ=’šoe˜ÄÇpÒôWD&æj ™Zä$GÞPŠ:þME;ÑB?2n8I<)-lû[/Ê©dâÖML¡ìºsÊ‚Xa÷b×”g·CûV™œ``Â߯ià·Ÿ®9¡—×íÂ/oÛï;ï'ÓÀln'©;u«¾§T3Îcò­-ƒâô‚î‘Ú<qÆÕ=äŠÄUÌØíjÁ¢Õ€®%ñX#U±tŸÐð\÷NQm\÷RQ;@×dA™YE6À–µb¹àŸ·F ì¶ì[ÈÁ|€s6ë\Ñ Àº‰Ê\ÁR×vc°/&—u±(7nËDQ09Ì#^ËZ k¢ €¦)Tº9•¿+sÑÀpƒÛ—ö Ý¢cºwJ4xŸ!Äi?7"º¡{µ«dLPú’º·ªp¹¿JÓßs¤‡×’}T s¹÷ÜÄþäsæñà°5ZÏÝàtÞá)¬îÄ\ƽÝó`é¾}ŽÅ­ž+êdþâÐl|}xîåsºÓ;FoæÛP/zÍ~úóc@œ„ãTÜÈu1¼×Œk¯0¾áÆNèuÿ¯nðÕÜ!ÌÀ ¢[Y”Q/&8±·ð®c¬Ì‹#s;%¨‹<í¼’me¨ÌŠ3í-iV¶R£Ò^cÒm(ŽÑœîçRӔ؇0ÍÚFë¬èD«y›ÖDᄤŒÅDY+·ywG7^ì1‘èáÁmÀžbbà´C6ùA7Œïº#þ韹¶Jœe7 ÞÖ6ÉÙþ9b=+7æY­™ÇôZ³•,ñ©¥ö|µ’úÍbË_+gƒ¿O@Þ¢ŠnkÍ€n ít›x‹ÈwŠ* 0¼q&Üœà‘„"N¾‰­†r‡Áˆ9$îZ"A”y×IdjzZù…kîñˆé<­ÇL¥äÑ$WšÌúð좤´jiKb—)åJÌ ½:u;»D¨.M:JÕ–×°Ï¢ üºJÚlÊ´¸œZ³žCÄ ?’:êE¨t)‘ìØb¤bYëa&¬FL§¤üX–Ú*ó5Ãe¼5 Œ$WZõn£šÌðàÕÕ5Ž+íî…}yuŠ¿‘W¨Õ]CjdõñÏ WJP3¡-,F‹BkóZ¬É†ÃKõ[¯}&ßè«î/k GkLײbõ‰Ã}·a-)qÏW?ïôzŸÌÒ¶ôtÅ…k[P6†Ó2ê&”»–ð˘ŽèIàó÷·æ¦ƒáÚh§6jŽÎ/R@¼ˆ;K¹ƒŒ%UÝô-BMí^úN×"ÒVæ^«Š>öúÐbô¥1îöHNjæ4“êkš?äÎ~¡¤¸®3+¡šOXsE¿–$O%9ÛouAw·Ö·Û-þÂw*º ÍpfJŒz>.ªÌ½I[o˜ á²urÄ|KuKmÑæ\6P¯µmPtø‹|üË`³›;— ò]gÆU_¼dð<î;L@6÷¢ÁÛ¶!¼}_ÆÌH"í 'ÆoïÙeòx±nklG­i‡Oà?MÆ>¿É°xŒqÔÐJŒ:–ªÚÀʽÕ!ÇRœa‹¾Bê>ÌQò•f+îÔµ\Í› €SÏL¶³[н]î9„Š]§PÁÑÐ’A0cÇ‘’)£,„-i D­d~XAk„^®Ø~udø`[4éµy&S’¸9ùÇWP¿~öÛeÓq+rîœèQ—²×€¼W»-—K«\Ž"*;%Õ-I¦ª»¸xãá¼3Á/|ﳨö’š¨dÖ”ßF Ié"7úZ”=º,NF[O“k>Ùi_ŽÞ¦äž®}Ù°±Ön¬MbOá~32B [A‚„áÎd9<>Ðwv"xŠ9òÆ®÷Ò9‹â› âÒ1 ¾ìÉ}ùvÀg‡Z¦;áÁ]ɘڟLCñ*ý¿µÉ@úÚ ì¾Fw³UV\åtqx#i’"?5YÞ7Ó³÷~ÿ¶L 97Å[ã}êØèÕL ï 'gˆe VP¬,Žz¬¬q sæ¾×>w†J@šÿyöþsMKæ!¦I”pA)Èœ,¿×,*9TNhKñ–pQùöÂ'à#Òøçñª1èQ;à#Öø'³ý&“ô ýT)[be{nq™·‹¯s…ÚX…,†ûx óâ?ñN–; —M”ñóý¸Ë æ5úõÓœ¶Ÿ˜´ ;°¤~aÕù}zsôÒ\\üï¡Ú6·üBæfÙ¶75Q9ìËc‚,Ê"õ\âåh+'ÅŽj³YÛnºaÐ )†ªùØR§ŒÆ‡8÷ã•tBÈ&Þp_qeìKÝt—ÿàì7Þ<ËÔšÝÎØiŸk½ZßÊøQ½è½­U¯/ÆBø½Õ…û· ä Û2ÿHŠõ&û*©(¡MqßU 6Us+²¤×x·É·{©£Þ_w$r6öª×(õ½¯F2êZSOò/ì…i"—÷µGµ× nJ%Íò½sIo}?Ñ!‚×°}[a;pïÔì7úö Ú§æ½vÈþ¡°Èòñ€óÅðw#‚’›7äIË øÏ?aÂ犯¸7¹\þ87c Œü–=eðŸëa×0B&CÏ`;vCùàŸ5¨Ï@<äÏí°~°wI‚Oô› Äg€&¯eïíW¹=(`ÖD? m¢¹a%ø¤»YµñÜs½£Þ q½Ãݬ:€Twþܘì´ì9 ;)ƒýܡ ˜ ë‡|WæzŸø2ÚþÌü$Ár½‹ï–;€ðvIÖnú!¾²×žR=Ý€/\°=èÛÀ—Í0ôg&à‹·]o¬¿åìKj¸~8RÀˆ©ïü+íg+ô«!øëðWqðWsp>Ý_yô"ås÷ЧÊЧ³Ð§ÌЧõЧNЧ×Ч¡Eͽ߫”»éªtÁÃ[ ZÄXWo1š—drЇûlèÓyiâƒný,9(¾oDyγ),þœc¡å;Æ1ñíW4gÏ„Xe÷‹ô²}8Cd–>TÕ˜ùÕG~¿,C²sè9H„Üès€ì YòzüDW^i>yÈܽMSï?}Båõ]ágM]ó·X¬Ê\ I—yðÜf™öÜ;ýý ƒÓ—Qs@N}.yvía÷fIëãBaêWüçdpÍL†J,C KlùrpV¸ SÚƒ‹,ÊnsC‘ŽÒp (Ͱž2oÉ“^ôaÁFžò:„KÚ^‘à.ž;3ÉE† û@ÝÈt’iV§OÛ¸Í@PúE L|Ogìkzë¨LÙb%ÄÙo.)Ò@7¦‰Sî°aÂø‘ä&$O,·3×Iµyhn&…žþRý£ ¢¼ÅF5LûR44Z>œl÷ Ïžìè®1ŽSvÄãöÂq‡ÌÊ·±QÔÏÊ/»0Ü+s­Sž|M-i¥4ãiïY£ Þg¤'õÈßTVg|“ÎŽ7­cZުɚ¤y ­j_xTŽMNËþiŒÌ͘@›cÉaB…€u97ÅóÐY;àöfHˆþáXãÛþG†ã^X’¿0߃OÄH)½ ¬þêèi<ÏèØoê™âÝëäÝßJEÙ¡ÇÖp1íkþ[í‘=°úy”¡Âõ²ÑÙö¢[@Jªá´úýOmüËêNr<_¼ʇðŽã…¬ó’™tVDÊû¬¤ÖiCd—=è+ö†H@I`ç$&âdÌ{Ó»/z,øD7“zFì“Þ9 noè7¯Ö;oØ=/·zVyþ¯Í¸4Yçì·ŒœÒPBIUB›ê­–Ù®ªá#âM7*_—‰Nй ¨Z–Z³-&þW7¹B‡ç|˜”ýk¡°}‡û!M½"å-%YŒ>”·ëôrHÿˆœè΃ï0ý-&ÍEU-$}ë ºŒv/jTÄ”®¢K›MaÆ‹‹“Þã ¼ñ¬@'‡™­÷Ô7n0óQ+~±j>Ý|p^¯ô~â §Êâdõ¥Vãý+¡¨G£Èa» ­iF&ºjWÒÌ2œ—Úù¸HåܼüYV‘J.{Þ'¾Ùp‡QN€¡ÑvÆeïŸòûc~Ó¼æe=b+¶¿ÌŒ#ÝH>+™ê^ÇÍÇ93ßÜî°ÛOÁÃ-Inh»¿.ÆŸ…šÏn™WV>ÚÁ¦š¯1ƒÕq©–"æÊ[ƒšÜV@U—ƒ®Ýb6ÒÐ㜌âvT½Ç@d¸ÅöÆó_ÎoéŠfóŽY9èêfShLª¡w..ì]#_Yf¤Î=OÄhqÑ:ý?o*"ô ßîO”²‰ßŽ„¸cºÀxœ÷kïŒ\Ð&5cã£]iÑ(â| 4é®Ò¼$y§ƒÖ .ìm[;EyÕ‹ emu¿ 8'_ZD²{•ÇFÿrb̮̈́=é‡rЈšrâôÐp¸ü–(LEÄÃ|r)Ä Åf*Qµ>B ­îL+LD¤ÀpLÒçNê”N5åñ’ÊÑ ¦¹7.kÿ.:J MÓ>M0ñBì’&ºz îIÛ»-6A5Iu…ÉåÈü–÷äéIÓÅ®T¬ ¾s^&X‹i‹×…@úð:‘Km$L'xW`4A» Ö#.ÿs @ç:›N`ç9„ûŽrè9NøýN ¯<‘¶‰”HøkÖ‡è0@f& –ìE:Ïe<`\<¡›E|ËØñ”k<9Á:š99hÆá.÷sA¶ßiáç|I¿å‚±ý[uÚÏôñ~¬»k±Jcª)ðJXÓß%ÿõÐlá:ÿÁ˜åÌXàÌXè̘÷¬>%çUöë¦äç÷…~ß…uúȳ^3Éí¢÷ÏÃ)×W£6ùØ4:¯q Zœ&þ?¡è$KÞSâzÄ+w!ißZC‡‘ ‡ Ðw’¬éîŠyˤ٠¥ï¡±( Yš¾AH‰Þã«~¡^kƒ“mWCˆùËA‡€Bànu±P÷ÿ9•°Àö‡|©½ª Ó{bŽo‹¶ª± z6¬N÷î¤!âÑïR•ÑÁ«4ž‡T'ÃÏd,°H”ªóP«ã£/?>‰Æ$î*d8ysQ"Ýûƒë÷R;BŸ¹:µÔB›=$¾û(ü}¸ƒ1è“£F}‚öŽz0ìP«W–œ¹~Ù €UE#/ŒjÕ "ÄðëÝ=XQËO˜Ü¶Ìc-coËO½¶Ùão,m‘¸sFU½ØËFçnJÀ÷CA7ÑŽ-ßõË».gÖÝjã±Ìu óqUSî³f/ƒ=Gœë®µmþ*éY¯x«In™ÓƒI=¡|¦‘m :N8eO|cR¥µG’/iÕSç8[’ï’?­:Uô«rXïJ_V}CÓÒ|úp:Æ îGÁvà„n|®^DMŽ'zbª4KæYö‘`éj5"ÛEß0®©l-J9Z‡»åj†å9Ê,ZÓ8õêVz¤W­;µ¦¨³[íç›4§ª[7Ë.GZç]»ÓdÕõÊZÖÊkõG¢µ$«w iá­…G²Œù‹I7tFÐ$ÒË3‰Äé+S[qˆNë¢]Ò*cŠã¾ä(ë&®C.z#œÉÓ—"w}?ĉg¿œ¹™úÈeñP"íû‡¼çÖ®%^s½ þ™ÐâdœúÙ–8ˆ¿Ù@;ä´á{‰øÅžä¸O˜Å {)ÄlͶ3Àï Q{Vï@ýëâè lø¾4˜ Òk”2µ±wúÇ’u´túUq­ ·ÿ¾Ü¢þ¾èŽF£¢‰~”Z’R  XWšj¢jK±qHm/빸¥ÈØGBÓG‚rÆ“¶|§ŒSÄÃû8üö…ù7êæ‰ñŠ ¹æ7Ûûœ³ÃûÜãøÙù1f Ö¶÷†J~Z#M€|;7"î§¼ç,¨Æƒ>¸xª:G †šÛ³5¶4OúÌ3zèB “q™‰ªd’nåãÍA†k9|’ÉW¹Ššå¾ˆ0C3„ _y†:ÈSJ:Ô|˜[dwá’6òˆ (î7% Á!UÐÒÔ`¡n`¨>óq3ÐûÈ:Â]@·þ‹·<Ú*aÄî >¶kÀïf¿&˜®Ž„UvôŠ@q%%gâƒÅbñ'β„ê¬Á¢ëûÙÌ‹Ñôœ+лà›6:´ Cf[¦ú“Îv6<•;ÅÙð@c¸×š ~˜— 0Œ4ÂÏCÜ‹ YúD¿ÇúýiïOÁ¯þE`Â゙LŒ?x†ÁK ´XêR+”ÏîŠ%‰ñöÐî·œ^›ŒµAŽîs>Ze³ð1[ám{z-ªÐî¡ÞhÕ>|Q²_b.ê8aÙðVã£ÛMú.̃é<‡´±àSmX±âÍ»!¤%áŒ4XïŒÔnٌЬ³¢R¦åäGª½G.¼ƒ›˜Õze‡Ùi’0u¸{uØØŠ6‹Jq8.ü)ñL׸5{Fhœ‚‚¼4z¢£é¶‡Þè„Â!ªŒ&æ…jI5ýCâ5ÿšT ÿ.‡ /ÈãÅ»]DG¬:dÎË•{®¹jƒŽ7#¹GÖœC’OSÛm.ájô¸G[{òÎúÕ鄯¨èòmþSZ`ïÊcïÙ~|5ÛþùtÒø;Ì„å7_·¯·hñbâM™Rª—¼Á…ï,! s b~^Kû6WÄ^ô¼_Žáï »Àu´+‘£~M; ï™B½0g£vp>#ý˜Jzö[÷!<ƶçLóìaPÿLéѾe)Éݱ€åyËR`B¾m¯Ž”Õv'ÛcôWS…/Ð Ûb¦Š¯q¦oë|A7"JÚ\?½T ŽÓ]¾˜=‡YëêÂ~ß­Ù¬“ƒº[çµÚJ˜?(<•’R"œF×à!xô´®»á’T¯ÌzÖc/-ámÒÎ.hH¢p¦×3q«-/,s˜¢¹[Ɖ¾×7™ün‡‡¹·§K„¦ÛóÔÕzìËÆ>ô‰Ól[ ·”õf,lž òTòÔ·ÜK(uãÕI“•Mé/2ÞØ*Pä¼J߇䜞5„Y6|:…éõoÄgª\7EoLJk?9ÔYfzØl™f7?}UÅå“z•içzi[a!”Q± OWï«£Þ®È.d…0qüû)×é7¥w) Š[c¨úÉTÂ\ñ6|\Ò.aàѪ–’}òŸgÏ÷±Ó˜ëâM nò]s°]94ÑÉÜ÷ )[p2ÄÖë¸fÆtÄõû8½L°á?G %>„×ï§g¾rïè÷—'ã˜~e"øãÑ'ò0û›­ÔÆVë½[Ôĵƒ¾Í/MJ÷-âô‡¶Ñ¶¤ÜØÍÌPÒ"¢p ¹c (›²í~a$’oˆ¨Ù`1b—ÆH‡\S÷Æ©!‡4DÝ+›Qrm“Æ ƃàíζßNï•`GÌ…ój¼P!LâI;c…)pr©Ë¦þüE1¦ðOÛ«A˜E~X\åÕ×å[™‘ üFh“'|Æ`Àøï¶ôuÄ/lÎq]ΰPÉ‚²tœ:ÅÀíþ¢]YÒþüWÏÏÿ ‰ÆýŸznESguG+{ w§ÿ%=¨µõßÜ0Ë’{c$í¦3Â#{!žãy¹Ú«i° Lt-¨Q‘ë2í;7e¶Ø ]ÜÌÍ~ðA°Si1sšg‹ç(ßÍnÌÏ”ÞlÕò`0óó¦ÛUçÉûLçIÞÖ)³{Iߦ-zâÁ;ÑXè¿bŽêŸ`Ê0$Î1›‹Œ’*‡CXe³…a±ZÎÐó„´gÄÒ㊒ÿBÄÕtFsbÏNq‰ÌôÒ±S´€~»e²‹Ÿúï]zè{„¦„MüHä@Ta!²ð´& hݘÑ(ÏTáÒ¯RÉ‘¢àhÖ“¸Z+™œˆRF&Vþ£œäT«“Ra±ûð~ÐJeMRÒ\]xé5£”F覰§!ì³e•ËÖÃV¦)ýèìºâŠí™íþ¨'p‰­@LðnärF›¼(ë·å¡YÃyÄÀƒ^s[høþÐ1êð³p›tŒ–¨R¾¼¨Äv–è“ ÷ê'º Т[ç±mqαòÀù“D©G$Úþ׆̚ԃ«ìkßo¾a9ÙJè'uþª-ÝÚ€kÓ×~6ûE°PƧúM‰OÝâFjÈRÂAäÓ™µ~‘c)뛨\Þd”*âùkŽÛšŠÐkœví¬Š>pÅ#5䀑٤V¸‹©ñ@Zd†°áÇ5È£=ù]A­‘E<ý¡·—®Ž¼ºq bŒæ›àr΃†ÛÂïY¥šFOXE²{Õxàs¦ßª‰cœð‡•pÚb²# uÕ5h‚W<Ú¿Œ&/°ÒarëbóØï|+ǵ§;+êÌIªAPùîö/ þa>XÌX¯ëQV2åwmJ—…ÚÊÚW$G‚sÕñ:9BÇÔBÚ·Ð}.Pd]gÊÈJ·µ®mŸKÅL 3*àˆmZ7œXs=…2P%1ê2¸¼ç”àLÅÆ¥ÝmÈÌŠ89£ßWük0WK5ú¥„œÖÏo\—Gzûlž¹M&ÚŽÒI5û&L×3>[Îb»§‹Û.ç;KK+/ìœØPÈ5/÷qßäÕ\qië“vz=V€ºÉQsܘòs^bÕíÙœÖ÷}ÓH‹ÓíQG=¬aбÎ5Šuâ]vðw Ùýl Œ¥E˜<ÝzLÉcwÆh‰|<·H‚‹nR[Ú»DVúîÆƒO¥•¶aùà£Ô¹Ë8Q1ó(2ü¶¿>y1û"9Ô;æQS; EI‘ÞÿŒ ÆƒŠ‡/Ié"¸<·Ã¿òÊ œµ«òÉ,HæèF¯Å•BøÓÑ:º® ¨5¼‰¯îFM’¥»z]ð΃¬äWÔE“#z#.ñ‚6!9â™Mß A²lÄ‚ŒExü! ;Å¡uW7Pű‡®'䞌æÏ(ÖVeae~ã†ÎÌ= À¡'ÞÛ8œÛ:É’GÄéŸáZ%o=ÇVÕª‘RŠzTøT¶y¨¡ˆè¹cŒñlWÞ©fV›ýE‰®þíðŽ/…§ĸñr¦5ØW|ÎÆnØö¥dÀd^°Ÿ`Gsœ;lS^†É|^ÜM£òYï§LYEàEz&Ä¢K7GŒž ÐJñ€¬ï”uL˜Nt¦„Ô]±Ö ÷àÃbþШIi|í^„ÕŒâ:Ê‚v=ŠÚº€ ;täºÝ99ò¶ôºÞ$tðÏ †ãìäE,ÀÁÀâ ÀÀDþS—ªþß÷Tœ\ÝUìMÍ-dœì¿ÿ¯’UEåAÌFh(ú R k ñ¹n,E¤*:9¬c)CIIË:Ó;JÖŸ ïXPqLw+€²TvÇ/ÓÇÉ2éãåãÆ9.Y Éú0AT=RU¯¨¥™¸QÀÃʰa¨Voå ,$= °dlqåTn[å)0óvÜØ˜%#ÁZ­šûÿEOÙ­;`b¥=žteðT,ðLªrDW‡5¸%ºßxMiÚø“”-ÀpL±—u^±YÓ43hKä¡:_¿¢Ëžûyg#r‚…éRc‚È à‰yØX[ð‹ðwèÙÌc§…oݵRÆUÿ¡GP¯A¼‚ ÖExFÄV3 y»óIÇ:]ëŒXšÝ¶iÎqÀ˜nˆ! ^]Hvíï¦ðßPTåûþt¸I¾£‘¬õožØ" ëàjzô¿j8ÁμÞbig³]KÐØÈôJ¹-ØóÝgî צ?!¥÷ÿmV4å‹çõú¡Ä°üÿ¦ã/ýoúϹª†òª¨‚«œ«öêÍÌœ—Ýs?Ö"NKáIC ÂÅÆÛ=z™è/ê.J?5IdTæPN¥%Ý´ Ê»PÜÂ2Ù­f,„„ŒwÀÿšZáÓi©ÉR67!U³ÕL4Ô™QDNc–êÓµá©Âu¬u÷]»Áh•aäµM÷9‡5Í}Ïp¬Ž8ðæj5Ü©{ÉÛõ "óšç /ÛËÊs@ ‡“vºãu±1 G‚ÅIÛa÷Ãî Iy_„ àÞ œ¶é§©>¿B²¦ ŸˆÝˆ(%ʬïÿ-Ÿ1-}.õžvZTF‹;‰Àó/ݶÿ|2t`¡ŒgôT£[ #<æd(®0…É Ó-áüþ}Ü,Îôë:—úiÍ 6½–©*W©´\½Dé‚fj2Í’ZÆþ~·Pl ûw¦‡l®Ñ;ü_ðéjê-Ãa<šsæˆ3z _›#bS9æai) YL•`JB„íwwTÑasF û-ô¿Â|/õQødäÿÌóöHÚQ^TÁëOwpO™4!-‚C:s&è@~S€³† ±ˆA8•vÛ¶y¶yÑ|…+{a Æÿ—–÷§êyçÖŸ“ä<·ëο™³òçÕëka°Ã½Ð¸’ YèxÍ„$êÚ"’J¦áÄÈw!„2ŠØÓå’ )ÓŠC·&`L.´2ž†±÷fãßUH}ÓÓçr¹]‹ÓUÅ“¼Ã1ã¶n僈îMÓs©;^‘ˆfÍt)eúŽšõëi'¯Wus(XjW.ÊÌ8ž ?F*—%…NSOÄœæé_‘~ØY¸ÍrЕ©s¤}OõÉ2ùíiF–¤§«èÄ’¾ ¡¸ºf=” `¨®ª¸A;SîD‹iØ@7­V¨á«þ›0Ë:“БØ}åå¸EÛóñý6ë]'lÞs²‹€’ñ~K*é¤3/ MÁÚ;0?Ì9ß´"·ß;´&“÷W7>Œ‹ò 1½Ü>Z½m„–ž×Â騄,Ðàæ½œ@ÀØ9ŸD æøëæä×õÌoáöƒ4YwQ›­I¾EUɘ鑿²¸jê”"ð\Üýuã(ƒ¸Ù.hd-:ލ¾ô±‹b¿H·è=xšªCJB.î)c5LŠZ¡×ÚK[ú[k)CDÌ)¼‡›Å€Œø ºB¬Ð·:í"å‹LQ*9Ÿè7ÞŠK“æSîˆ åñ¾uy¢Êª—G¨AòêQòôã¢Qgź‰ÎÅÏÝc4zÿ%ìÕ;åM1È)º“¡îͱ¦H¿ÿ[gTƒý§w~@ÿj²ŽîÿQÏX)5 QLA€,uLq„¤Èoi0@Ö 48 *L¥Î nOf$;€J¿ú,šîóWì·¬œÜT«ð.,‡ix#™¦^&s)wãÇëCçóÌå™S¿Ðð9DCIöúˆŠ ±ò(ŒˆIUÑô¨ ±S­¹â")%[gÑß’SÒõAò¦Z.0ÚKûUAvtuaQÙT‰B+õ&"¿Âæ~Ùdï#‹{ppM¡âºóŸ…•gyÌ#“ Mè$‘Yº® ˆ[q´Z3¸L5°ßNœD 0¾&7~àV"õ+Ýç°m¨;K#FaJͻ’­M+v¶ÓZ gµ‡ 7çÂÔ“\ó =³‹ú ÈLÕx›å„üª“­Ž°ºeø+,AªaŸE»õ’þ9~y‰{qÙœPâÍTú“G2ù³(¼Ol^‚“~ÃMìqa°2“`æÝ)ç7*âÅ£œ &C”Ä6ƒâÊë£Í–ëV¢Ã½Úic†IqÌ ©Ð(¼+j+ĬŒ¿ Ãþ>lm‚ ~Е¾-ö™Àe·epÖP]=óéž_ØWõ$3å°Ä«Û")òúf¸ëð”f–ü=÷Ï.°èÀõÜn‘¡*•{£ +©!‡ÕÊf amN: †Ÿ[!Z0föGzÒÜèd`‹#Õö7y^#1¦ÌÊ” vÖëH˜¯xOMÈv”Ù^ð-±Ðg½ö§ÍŸ5Ëfû®ô ï~z¿ý?”½cp®ïò%œìð‰mÛöŽmÛ¶ìhǶmÛ¶mÛ¶9¿óΦêœùrÞª«êÆÇ®Z}­®^Ý+޼nÿ·öTl¦·¥¾y‘‡(ïª ÐÅ Hìì¹=Ö•s€ø:<è¼—÷MD¥ÍIMÜš±IóÀò³»…ÜÄæ“ïê:Yùq{{O>UÌ9÷/0Pv6Äû ÿ+]¿Ø÷Þ`ÅôߨÆJ X[+yØ:¸+;Ø:Y8Ûý¾¦T®‘U0|dy[¤2Výió ®mç 5ïš+mBÕ­¥C͑̒Y$Ì:ØÅpŽ€é×hþïÛU@ô´;ðö_öƒ×ìPÿ@L³óÓúž›mvò™ï·;_ T1ÆàƒÑh,κIjwµÑCõÞÆÌÃ7†ðC !Õ¾ÁlµÚR}‰¾úYºP¥>r" ‘>K”7 :¦È–-Õ¤.ºFWN!Cï‘v£#뉲“ðî çó%؉Žá¯è‹ÍÚK8zŸ‹×eYTøò«òï¢ôÂGQ]>&ù£ö:ö¤Ílñ°ÄªSYXBÇ|wf1f ïUÙApÔ³¶ëƒ}Nô5ŒûI5+ž¿@A¡èBSidã§oÛ³ˆ¾¢¿dæ„~¯ÓÍÃR'â.§…³/''93÷òmî¸WÔšoé ’ÂÈ—’×ÿ°Ô¡*•ø€ÚCú/TöòÒòÿSW“ÚÛÿç´1Œ¥AÎÆÉÌH¼JL‹0LFïÇŸŒkMÀë;|¯/q0 ] ±’Lp.–úÛìבºL“¼ÅŸ÷gÝYjá¨äð…-xƒK›œ2àè™ïô¸ÝùûÅ{ÇûeëÏNÆ Ÿç ›ìk :±ûØØ4­hŰ¼n?£íp«GšIÎó>ª×°ûƒÓžJr÷ñjçu^ÉŒãCÛåGŒû£‡íöî1ÇE÷˜œÞí>h÷è@‹¶û4ßöݾ‚W©žk¼Žû”è”ÔÎÞ‹Þ‘…žÑsMÇ-,=^ÈQ¿½åÚ®Ú­ŒÏ-z÷•ˆ·æ=®­lÝ+KAöÞžžOJȉ»ûvô+|ÏÌ|kÛ(UJkÛå0‡”Ï(Ü{4Úî5œ >Ô l(d(÷|1¹Œ”„æGâk)U®±»[«•ï+BEW?ÉÙéåõUÃH•w.Ï/(¸ÆùADšjê¹ØôH !P4”]âèj<ˆß²üÆ‹ ‹…Kl,é8Ûd(´”¹,y–ÎÕ4Õpš:b*F1’~š‚  âžŠ6¸ ‹6Áy‘uͪÔbKu¬´ê´ñ½V,ÒyàììºBÖBMMáÞañÌÅrbÏ|®<˜­Eˆ*ˇ!Ž)’Çsâ¹8ËzÆTÌ&O!$a<®|¬I¦åÕá… 0òDƒ&5™Hã¤íR¢¹\##ÄúhnT×u‡%ËËŽV݈íͺtä`†ÕM÷Šr½”õBA£Äv´¢Ëà3ìêreÖ¼õI×Ó½¹[irÖFdªGçÏÎ|4_kŸ*:z³¹Ä”§*ÿvã!íº˜¶R•õ1‡¥%¥Û&Éž{ .ª•%瀰“:öÞ\µ¦¤2ùÀ¤Õ`UHó`’JÁ?Ûî”Qgλ<98‹Õ‚±ï—:;6ЯòuÓÒøÍ'U‡ãÒï3k¶Õym ”]WCºó[b&gØÁ·ááí˜(²ë\gôó‘b/&ÎVdŠz”¶½"¾ì3ÐO)òÊrBrPÛïo@¯¡S@ £‰‚ç‡(ál´èrÙÁJ©aû¼mê{59¢c^·iéW¡ÈµíâAxçNhè3‡‘Öƒ5:²Ó:a¤V2¹Á^Ò‘ ‹wLÄ~P’å †–ÀZéw x®º[¼Î³îa_Éb¿qûùƒŸeòаëwí¥Ž¾Ík9W[Qäšíx¸·a‡Dìl:†àhYg=”Bo>ëõ:òÅ€Û¶ ‹u ð¨<öàÔrÔš|^‡&‡;$‚åñI dö÷’¤=ýÂTx¯`×Ý`2Úò©îÍä–;ÝÓdfS«LÔr¶–nHªªe$T>4]:Î$5©õ³ïÝ+x‡äªÎƒ³"8ãz£³­~Ϳɥ„Àl Ä£ÊïŒ;G7‡sŸ¥æ†¸PVڕ鉄3œkR‘ Nb¥š *„•„Ú°²­}i/›G»ÓÆi\¤6ñ“52…ˆGž(Xóñi„wÔÈ¢Ðøßˆ¡î©" -½Z‚÷Ð&¢w™Âm÷ïº-7ëR0Z³tåý²Cò(ÏëQ~×%û¡ ›æÂÇF¾˜à˜ÿ`&*g Äõ8ØMXIЕPR3G~K’y‰;:$;‚°œy$‚yÕMʇgZâ¿è÷Ï‘˜²Y%dngôÆÃ­JËxÑO×Ã> dmV+‚WaŒè戃£F+Ÿ!ÈÈæ0w•à]§gvV"?r*™ã”žøíÃÕꃟó'P¼ÄÕÏ`š vŒxísÖbbËÀºÈO(öçÔKÎ(RÝÊeŽj vâ ò–™8¶†-O#AOú–PO w-’—ÌWè ñW뇣dKªþ­ÙÁì±itøëÂ6lªÆ $Ci͛ݿ€GEtàö#Uìmh+°Çsâ·¬8ÃÏ«è̘ž–ø”4*gW]™vÁ\A‘`F ­ÈòÛ\LÊü[~òP ¹ùB˜³Ãç{leöOr¼yrw­ûÂSŒPBñõТU¸<<ú¢ÔiÓQOÌcîó?˜T˜ÖÄ/ mðÿÂÈù&¥.#ýÿ©%e+%$ 8º]ÍÂä\×:j5Æ*SÕ˜b0#F èÐ_Rľ¥Ý}¶û¥ð§bœ]fàØb#iÝ/]™']ÙfÓ7YÞ@FîÇC2›ñÐ×îı‘µ‘¡)—¥öà֋ÐzèèÇ©¯[O†8/Æ›f§ë)ñN 0ÑC$%šå¦4&Áêš wŽ ÌÎJzÍûÇ%ñcQ.¶ƒjRš^¼<9åÊVªÈÙú§”VŸÖï >äîŽþ—ÒǸj›â™‘¥÷éZhìÙØ`‰©‘U3ÆèŠG–”ˆ\.H–§ óÐ<3˜ôì,ºMážC‰w~}EIÎ ŸÓúæ]ÙU*Qª,‚ïù°žj²ŠÕ–\Xu«Å"ñ€ÙyéW­VblJ,ÓÚ*^ôŶŽw³{ÏiÎY%{O\SV³Óäù‹¹O28«›t›VÓ”­kб‚ ¤ÊÛwA‘ ü9³jaYÑ…8]{¦®×U ñ À@:Nô§n-ßÅ5æV`ˆ*ÁÍ"µš˜ØÜ}‹Æ¹KÀ¼eÛ"ˈc¦É¹Ö½}›5ÿ3æ?ä¿UÇ*²þµBe|¶Ò7ThÿAœã-¯Hä^l«™™¼¯+TeåÙ4`+²î×V¤R­¶ÈHW.Ÿ*=ƒx:„…²HT¥û·†n) &ö ŠÎ9^,CßNý’YÛÚ =Z{rÉÏIJ|‡Ð¦ï ¬Zb…îP›-ËÞÎ|’Ç…h[.ÇøOê®uG¨"à'Ð zÛdkÇ®3”´8žì…<în å LN` ‚Ÿ ®±$­1d}ãçµ ŒØ±ÅRnÖX6¾ŽìR›«ÞŽøe³$K¡¤¶Ùw?Š–èñô8îøIMËÅsK°CË9›T»CÀ° QðÕ1pŽÕL–W=ç˜[ìpëÀù)òæ‚üSfTT>¹ÌúÈøÍìv½ÙæV½íñ… Äu›"é,¿gkÜöÉÎNÆŽÆž@4b¬DT,ÂMµLÄ;)tkáE:"X:`–öÀiË‹?ˆ.X*¦:³@ïø@ЍgúÞZx«â%3¸‚ßʇ¸£?D.ì¥4Øâþ*¸ƒæ 0¨¼Ú³>AÔM¼ßA·é%>ø"ØX"t¸÷Rq “ »ß†àº‡€7/ØyRa´ÆW9¨«;£Û‰0hMú|0DpìÿdaO¶è-g}:Éègÿ£qÔ‰$C™fÌb‹©IæÁÏïÒ’ÍHKjEQ&¡ÂŸTÒðÁ ü·ooy`PÇ”¢1ô9.t'®”LWmGßú´˜˜Ö êv0úiŠ*8mv=gva®1™ÁY ¿%ÿ˜˜R‰uºBôñrÕœÈ3²HYŠuTHOprÕÃ)èõî»Ö‚“ÕÀÂ3XÄTPb.?×q´FEâ¥"­U ò.œ•;—êr ©í‚±ÙJzùíKéÁeî0â}Ës°|–"r ÊŽvÛ^‹dñw’|C¥ ø]¼ŸK5Á•ìYA´²w·çJc×e°—«Þ°bB#Æc¹ì4ÚªêúÁì½8Ã.¼!*-;ß>¯Äá3ë¶ñ–Cú{I5šsž÷CóqQ7‚*uä9:Úµ²ÆÆx*Ä oÆÙ ²0¹Ó`¢`ölŤHfÅ9Ïö‰ëÉ”ríêb¥Ó†ÕMÙ]ǯ“øçØòȪôÀlè ¥DÛqãqªÐù¹¹†Ä<JÈIŒa9R}ù~œûÌ?ÞÜöøï”´´ÌU&•ºÉ·ÌŸÚ~æŠJƒù¶-¨šó× Ãf$þj¯A+öIñ=?$“Ää{Xh$Ñ8oj©¯: åèk© 6UÏMRî +mo¤:6HÛƒ°ŽúÊÄ3>¤{´4³ý3ÔÃ¥É ‘gËLK¢pqŽŠI·VŸ¢üWó§ÝÑÑpXh#¾´ã"€“¯s˜02”•”ä 6>‘‰Ê»A×ß®Ÿp=žq6ðûnH>3ÐÞ@äþ¯ |Šñ‚)Ánõ¤Q|`wpvÂt¡| °ž ]ÓR%­–s`¨Ìñd3ö‘÷ÇÅé[‡¹ñQŠëÎÒ-¸”óѦg‰‡’ÞΔX[”C,*Jü–›…ô¢®]Š¢÷ˆæ”v¨ÎmTa–Фg«”úµŸõ Î*-IT+ËnÎòEçôžç:½ÉKÆ„ åM}^7M¨z Î0,7<sFÁÎóù0 ˜%§8ñ„ûƒYïÚyÆ –¦ÒüÂâUp N¸3J«¸©4Û("LGBªúœ•Y9%… ô(WíÖã¦áëˆI?-˜(¡àîI¦R=|E¥VMzªåCSñY–&$[qÍ<÷+¥¨O‚³¯Yd­fÇN©l“=½Qnœî Â9K.ÏÕËíÿL‚Eg_d=Ê—Œ0°íð‚‡@V 0ï©ã%ÜŽö®;ì¡÷²¹½ ö¶¹q½8àÙyãC숽äð¶ýÔèÏCÚüÖè©lÙŠÞMØàœÞˆ»Z§*Jì0^ñòtQx_Ãl“ˆ­Ô‰?Ž÷¨OöNtùmsÄ‚¼>¸ýkÖÏ­^“ݽA c¹¼êdèïbíàY/Îj†ø€ ‚O{ õÈßíò}ÉßñîrHÞñók½wŠðc×tHˆxÌf€;GÀuÆáº¥ðà=2º¡Þ¿ôf‹ò¥HÕz¢OÈ=Óí¡ç tÞc…|MøB»'ÆÕÑÐåßz7ÓÅlù×ÁUàÜWÁãAöÙJ]{ ~u·'£ËS®4ÉŸ‚âióOѬoêÂ5ÙåÙò›ç y¢ÙÎ\¡*Is.“$ ½"ayÌ \T犺vTº,ætkõ_8™ë÷áð"móá°­GCÚ­ëÚ8öRg/E-BϺ\šùˆo…ylI/{^¿ÁLÁKÚ¢Gë1Sy†WÇBÌè9¦h‘a{Åœ ýZ8Uê­c—bfA<{´º;p¯lb¥sàZ¸òœ­ mY×›!Qf–ÇišÖ<ŸS¸+wÌAÔ®$zpìôïO6º¾•®¹>ŸÌ»^iÒRNäsZèþ4_EÃVÍ6_ ÝÙG˜Õ°ãܽ»Ñ®Ù¶ØìÔmºBoDs°•Û0œ˜“;„Çç̘0“ò•ü€sò‡È‡N Æs ›½j³é …8®óâþ2ã ä;¤Ú‘!š‘Î(Ù¤Óû»]ð͹ÕÅy‰ä½z…Uà/À.ò•DÏòî°bžJñG¹nÿÑl<Ù‹CnÞNŠ­Š ,‘–S³Ù8ßšodºmI¦|íæXV€QLK\ƒBnùLZyH*€/ofN¬°0c“šì†DB<¯ª~ ÆQ0bIrq‰Ǭr†¿L¨55¨ QnËoŸÒæ²–‰½4e»dKg«)i£æ•E%Žþ9Pm§«÷è0ËiH_µ½iFF´ÉôÖo¿“H)™mâ±+š¥dYƒE¼Éi˜N' :è§É.…GJÞ¢3Ù¶XƦˆÃk¨ÙâÅDß(~A± s(»µê)…H؆ڔ›ÎùLÕiÂC’ó1ôÓX-oÎÂ/íâÑ›1E7cåwpÆa!µŒlŒ•#pJz7-EóÖçÔ—*ÃL ͇¦Z¶’ÕÌåÃÆ–+)¤©]j9HgX¤v"£eYIŠœxíe±Èr2Atý¾˜´du­^_š^ˆòðA–%È3¢ýërØ)@x[‘体³`FĺæþªíàÈé4Rpv{ƒÌá5XRðËcàe–Æ NM3¢u‹¼‹ÙrÒ.§¨5®ZW"ú9Öß‘©maQNdV›·AZ©…,-d³5ÅQ|LL«”@ž2’JsšUÊrø Qàh}^õQ²ß(™…©Eö›–‘©¸+›pìmeNóóhIgY‡n¿)+E‚2µ1ÃQC€à²øhí7w‰Yh‚È´ Õw0jö±ƒ¬„¯ŽëoâqR;Ñuø@µ(a–kK« м¿æ6‚•ëO1€Üùr©©±S:[c“Ä)¥¦’B‘ý5J`—â*'õéØÖj±>û3E+2!ØoSáÿ«Õ¼Üç=-(˜Ë¸Új¨kÃE¼Ëx{£7þéêxS òÊ]:ÇH®þ›ÏTI@]ù¼ ;òÁA"Þúí&ñ8˜Aõ¿Öëç|~<²h§Ú~ò÷Á߃ñ Ë¡|¢ð)1ø+€ñ0Cùüý‚ò Ó£|eõ9¶Cý„ûSv2ꮎ @Ã=ÌÔ3¼ˆfÊ› eØy±]:î¿‚¶Ä®5£!“$„mÐs3 †üJ OŽ"mXƒ=CõŠü]¹Kr}´Gu= ‡šÙ¿ƒÂí×óðu2«»¹Ävdá©qŇò‰ü“÷3 º#k· µ …ÅÎä¿Oø©%XÛz)Ãî³Y…º&á(ƒ>ÑY*:MýþK³¸¢p^"*5A4yJ$9´Ý+òŠT¥Å²Ìšå‰Ð¥q©B3ß3´„¦´Ž#§¿¾€¹^ENE7lñ©uâê¸{áÊôÒr;(ˆ %Ï.ÏÕFxIäa´Ø8›£Â…–—îte©½‘“¤]øÜiÿ]—«Î·ó6r¿|ÿÄYNNM)k׊v1Ï´>b}JºH …¼„8‡Zé¡ `—žw!~¥\WÝu4<Ôb¶˜·$_¦€Ì8¡±ª|Ê{ÿâ„g÷ÕÃ58”œÚeüÓDg¼i¢ûgvö Ö‰OÏ9ÀUæõ8bÝñ*MBëgE¶0t'Œ³¹èöž$y«DÓ#;Lž‚ÅYgè1ï,иBÿ¾w’½•¹Ò9¨$l¾Œ”gÊj ïLq—ÿóš3î—‚ á]SèiîèÛ"ñ½ˆ2ñ5%™÷7ØÚM¶ÿS¦¯ äw‘pÚΑ/ŽIÊà³ëåTÃU7EsY !mçIcU¬ùŽ\’t!É8}¯LN=ñÑ{B˜]ì)ä©h<-¡æQJIhGœtÓÝP!É ¸ÚxpJ¡ƒ%¨,¦P(²ê\ØW€a/jÀ‚¼§æk©…‘¦ œ¡ä´3©’q1¿a»1”Tªªl^|™^ñ¡zÙQü¬ Fùíˆ(—åà£àžûÍM¥°1}ð‹V‚æÈDu§ž),}BͽK QV³Ì­ ´ÖZÍoð¢:‘bïYMü±7ˆ)ßmÒðM_æ FUz`…®#[X¨câDÓüz:öh“%8«Múaž_=Þ«~&iPR"»¯\»"º¸ª½»ÒŽXÎÈ¥Zb±ú™n/Zëm”¹Õ`bœÙüð†Ä6³Ïiš£[ÜP‰ÝFÃ#aÈTFé€eùXI§7Þ¥-GJ«>z9µ+o‘ñèXŒ9‘õDÍÕ ØäÂ)ièXåxFy9^“œG®õ"&戻¨>ÇòPþN˜%úíµ³„9‚„æ™Û/ýú]‰£´¸ãÛ¥{¨4rJSæ«x¶vu¶‚0â®KnU¥B y­° ¸[[‰³ ÖiAÁ]gùIÇPИ*ñk Pˆ13E‚0Ø!Ù]<` ±0dÚvðÂe¶c#^ÂԀœ†c²¼d%K˜Æwãåc'ÚÓƒ1ç,mZ/5#ü¨8’ì?u,*µºéÇ2;!».ó CnHôÈÅog8—éKoÚBŸÜÏ£ôGê.Hô3ü±è‚Óö5üæ! ~Z÷„µ1—áÜWP÷]ëÅÚƒö=ü›¿ÌlúÒ«ÚnF(;÷©ütc¡t=Pùé'Á<jø!NUNÔÏ òSðže˜Œ$Oòn±ÐèÎæi¸À¿¾“-¬mÝš+›²…¼­²&ñ/µó¥¶„ —·û唫Ùñû¾ çCŒët\:ÊÓ3F)_X›dºLiº}вe*÷’åö¿ ÞÆ½l«¿‹”¿”,>FÕ‡&L,Ó–99p6`ÿMî-'±íaÂçv­As]‚Êiÿ¢R*#îÆãq§Õ%_e²ÊJœzôì$„WB‹¬bñ s•Ws(ÿù-ŸþC¹è; @@°ÿM+ûÿP@g ëÿQ5F)iÙa« |GwuwØ4ËfùÓó ­¿" J†‰gbIK‰Kªä—¯­^+ýY©dWyÏæ›#)l½ 8̃<Ý$ÑõóáàÓOkhVRÄNL2É´›ždg6›®ñõýaö göU‰:dÿн2’Ebü ‰Àöíâø¶¾§Ã[ "½Ä1ôÅEhÿɲ²³·™a÷N5¼5eÑi¨‡¹VÿD'4KTÿAu1J]pÞS7j«(¤ïŽÓm––ÙI®™f …þ-Òdj¬û²‡4Ào«Ä¨s_ÈP§YŽŽêíQVkžº9jÏ–|•s‚I"SSQÜÔh£n™µ'È·¬:ϼ¤ùÏM};µžÉÞ¼B]Hìí.ÕoÒIk€… þv°á2rUnpä2®Ô3-1º @&íŒÐg¨e8*<ž`ž4O˜,%2Ä€"ÜåúQÛžyGxõÅÑ¢,ÛËQe l«œ¿ ’\ÔX´Šž ߉‡”ËË‹ÒWh«MÆgöõ´v#ЄÞ}Aä™S²® b@-È%Z4ž`­ÚT,¯»_9¬2Gx=™¯TKd6¥Ëþ®:Áåã¸.s,åÅÃÅèªa¨Ñ)rÓ³.ã9HétÜz‹Î7COD9÷whéh3Œø%8Þ麊nÕI1y̺EªJOH¯u¢ÅÞY8@ž®ž’Êr÷LÒ¤~û»À ƒâxO2ËŽÖÔ°:«'`»–öÒf]ç˜Èþ¸39káq;ÛAÑ a .£ÍæX¶î?‡ +úc@ÿ ¬ð‘Š•¤íŒ ¬Md ì%œMþ§F3%9 4Óh±0ظœóNßÏF·нŠFqmkW}”LÒ"CçM.`¿ò*¿OÂÁp’aÊ99s³Âî§•ùn_w’ó% ‡Åim¼¿?:ÄØ7V( @AŸ/Þ¹QºnœDÕR©z&(j''.Íáb­2M]‡ª@nòX¯NiØ:£éCõݽ€#ïÈüä\.9®>röÓ9M.±r2ÎôËÉ»ë ë.ž§°fÚï/žz7v¼þ‡‚3Ë~¶ˆ뿘+WR²³¶6øWËä4)ÂKi oä§¥Ífþqþœb6™² @Ñ\ÄÂ97ižÈ£ty6‰FB¦_Ùᦫ…(?7ŸhÖ¨õ%[nG`ãß¶of†.!>~MŽ\wÏÃO–Ó ïÉv÷GºH¯øë2ìÖ8û&$»I¿që0çH´Â9Ú½mÑ¢íàUbû˜[ü¶Hk†=üÑÖEà‡¶}¶ã0ûao€¬û(¾#‚{?°É˜G2íBû6{yà€Î½€­];&×¾K‰Î}(c‹!Ž‹ 9ƒMÊ}â?eKáw’U;«e€—°.Óªÿû,ZºÔO rµ½týìo–¬ûXÔ1„y{B¬ @·Ÿ¢°Í‚ÃY8=ï·A ²î2Ó°òÎãñûy;l#l»ŠX;N¶¹Ú"?|ºˆüº–`V«&QU_Ú_¶ÉÑP‘ü;®Çö™ê;V5öå¹,•ÕYí£ §]å«X#Ô]œÐaØÎ'©_ &WíµÒèñ`ƒ6È aiã·Â>’]œõ»*WtxqØúT€ÐF8X´Ó‹³NTkjß± ÌÆ;ŽX´"¯Óþ}Þä'F[lNN¦…m&®Íw׸ôVghçÆ Õšo¯-šT³KªŠ€H1<Ò­ _È+âmbf" êÏ{-ÃJDùvwi 0©ê;Ìok]1Om]o¢ÖòǽC¸«ìsû4=×PWK´,\£ÎÏs¯åšßÆË‘+ÿòx m¼)n®dóD)¶ÎW“f³´¶¬$Eégpj¥3˜ó‚½¯ú´ø«þÈôÖ<7hðѼmÛÚ\-A{eù>›jÕkÙº ¨Á¸¥Ò¶âG•fÌM¿Å jJlVdeƒgÌ.+0îÅ”7ãå‚iʯü+eÊ]înoÒi-Ê€V-œ/Âq¸©1µl¹.W\3€½ÅÎzë,#qÐOÚ‡æ5~YÞ§¯Å i²3Ÿ{9â6¯ñÄ —PaÓ»Q’í !×wÉ¥w¶z'ë¾â÷²ë™ÌÙP’¥¥÷ ;Ú®.ßÊZO¤¾áaRu[«<#áG¿+¢ Œ——©15ÑBLÝLí`϶Õî–‚qËʪqï›É‘žmÇBñ®§dµ¡ÂSùw×9ä–IW}5ºÄút WZ;œ‚ÌÞÄa›2hÑB«Bu¨ „ÝنŒv`¶yFzÜh‘YE ý×­q1¢Ö=êx´”ÎÞ ˜[¾{ÎúÅ”¹DWÜxü ¿*…éö¢Kv¼H~11†H°àœE˜ÑãÛ“’ö±ø¶jw’¶>‡|‹q¥“bKC% š²MgMŠ>«ô1 é®Úp2bj²öT0~ܰÅúžT]rüô[Š©Ïó"CšÉMìÒ I|¸¾îr\ðÓÂM^ìà 6GçŒÙØ ¶CÌŒ¼h3ý«ffFÜ#h3CîÙ´¼ØF=´Ù1w¿´6ï8›_µ#3lî<0 ¬ï#µ¬¨‡´:!Ø´:1biuýïÞš[qŠš9"u¯R]®¦ÐŽFuM#RŒ"ÙS´†fÚn[°è;#–²Ú¿ýÈ#ZTµãýeíQÐí@BÔôgÆ&úy†“n.‚¦u+[è10­ÞÕ.8²\”ÈÞý4«¼ZwhgjŠkبJò\zìÄ6zôW#cÝ´bŽçàZÑ›@œž•ɫݬ¼ÿkŸÙÓ½’f!9½ÙÑ'«)äY)§Ó¼—‰™…íH>\ˆ´ˆ¿vé9ýn!z\¹ííòÐþïàùBËî–¸Ñøå?ÖÏÇv®×þ¿z6VNVº¾¼¾í|sø~÷ªÅÑôGï@¾6 ä%<~ÉŽIõî‚ÂìAy–Œ¯Mlàeï㦗Ëÿ žÚª¼ãW¢Öüa޾ÐT‡ˆ"ŒÙSl•¦Ý °¿u”2/C’>gÙ[Mß@’÷úÄÖ†S+ådR`}×-[­$;‘lýnõv…¨±w) 4” âíºg¢EY’ÈùïºE‰×jžügE!‰xªžÂg ŠÞ FÈê_µžkyžk–Gm^d…n2åOdKž –]MÛ…švŠUìeËÊÿü.6¾°xì*"ûÁt1Ås™-äûŪåWâ;XØøÙd)/×T”UÖâüMÆ+WÔjnXæ,–h€hÕ'?V/ÓIÚ}R.öké©)Éïž³A× WB99,=>)ùJßö§´³sº‚õí¬´³q:ÃðäåSR†oñØ!=R)ÚC>àL"ŸY¼æì™(½P‡8dÃ5:ÉôB\†/|fz"_/óÅ }¦î¿ÏøT¥e¡?lËí©•—Q∮<‹¢ò*£3пø4çŽ7Ôçk‰<.âYš ãPÛò‘t€2Ä£-•9YÍ„÷”ºaZvRoì9[«‘f87J3A«êªV­ax´ŠÇ2Èä°LS‘¡®›É51ŽVQRUSç¹A£îmF3B=£:N­Ú=uN§úwêœP•OgâœRÕW[xbÕ*¶jH×¶yiI«’°Õ‚¦"F]ÈF5[}ÀZµ[}¨••¦‚¿’ÉZAMU¯Ž 7y.Ý66jÙèk(¼Jd•éÒŠ'–æ#ƒ94«®¹/³šcÃÖÔŒ›.Eå Á•Êæ ÆÄÌ¿Jl`5mµ)Œ'¨¹*–N5Άdœêº\‚“T‡•Ò¬õ*¢b1dƒpØ^“Ë$)Ì%} ‹R•µª­^4LňZe»‰"Y…pùÓøOÁ$Y#Só^sùÈxüêO4ûØqd .|s³`Yð–Š…»Ò=®/æ«ÓþL’(;Ê_"ø4PvÂ}„vÄz'(|‰;` ÀÉh Ô Üä ääÍó›M™•«ü&‡Aâ1f@ÅÄÄ¥H¼h/T/6n/…¤ÒÅÀ µåÔÛÊ†Š›#2Lˆ?¡! •FI#aÒ8T.ÿaéGéWDÍK—*%•&Τ‹Ê$T$w,uŽó¤b˜å7'™ŸDæÔ¤gÒ3þ+ž0ÊItΑIŽ„ A1/ÈcA ˆ€´ úüõ(œšI?OWŸ8@ éü¤C ¤ —UU—UP§|«VÐçD—x7”¬!ÔögØSô)K·O›ŸHÒíkScª1Ôê ö í i•={’´ÛÝÄNcg´3ÝîïLÒ[#Û,~t-r³¿ÎšìHuc¾1؞Ѓ&Û,yô)‚§ð–?’ÄW}o’Ä?Z_fÄ7ª6ãöòoûÛ÷Fò@y¼0)3i–:ÔcdkÊ;³Ù¿9¾9|iL–ºá±“^+t-©§Üž Õ5¸9´9å•öå‹“v[>¿òú0¸’ÔÝ—£HÖYöHûδgSôgÑé¦ôþ¦Üñ¦ìóåMk<>ѧô‘ØöËè˜|RNÅ—Oé½mž>ѧ쑺HúKô¬E{B.u‡±Çì;ñùx&­GÿÚäÚèÚ OÏÏÏÏÏä;þú¸&­Çà;ùí÷ñMš¯þwÜùqNš¯ÁwÒûñNÚþwÂýqOÚžÔ€ÜÒ›àú߉·Ì»úö?_ÿU-¥ -ùÏSÕÄÑéÿR™hÙ”ÀVØ39¨/-{P´c P™à¦rÅg[ÃØ‚A´æ±.uº] œòý4 æO;¹> ëÚl‚>¢¦ðØæúæhþ˜Àµa,üB@5¯r¿E8°MeÌËÇUò ydæyãÊò`O¸½kM|àáyûîé°*Õ'dK‘H…”Y—7l»n›,§‚Úˆb'÷M¶:ôÑ>Kÿ?u%J‹Ý¾}¥ fë#ÃBŠ—Òmý*æCéˆÑ±DLɤGŒÙ%uÝô­ú”çØûàÏÛTI§ôþå`@@¥ÿTJ ÿE°þ÷®Ak;Ãÿ™RW±QBVCñ¡[›êFØNT!–Ú±/ðÏóo‚²ÄÏŸ·Œk®'‘‚ Öi×À½k˜¼ùœÏ^º1µ×ˆ0)Öû¨ãËý"o:¹¦c$;ƒacÛúóÌ}’ýÀ}²ùy7S“ô\P*8„V³Ïóí¤ÜÿAŠ“`¯=œ¬ ê Ø/(QfÙéþ‰íÅH¾ W,åˆbŽ 5Tö:ö}½®”˜‘à¨1„&ñª4¤ç݆f¢“|Uîo ”‚Ù_lÍab‘cþÒ˜0æàˆo2Ujª´Iª´ Wy¯Wgº¼ÎJ“1Q2:Þ¼Š5I]¦T?ºï£áÃ|7¤‡ÏÁ¸lï%€Ñà È#µãSj9ÁÙ˜5Ãti5}¼ð,×/b:Þdù#PRNngʼnW@bà/p¼ê1B¡ X·'NO¥Î2ÙéTá›0‘©Be:0ŠžÌ$ ‹VUö×à!R¦¾ÞH¹¡]ˆPgm UÆÕÄÐEqÂæ9U&-K§B&Äj::ŒÏ„ùM«­Å”MØr«i·;… ;pÒá-Âç‚:§ýE£¦[ý+=ä'h\•-?yjë9×Èu¬”7‹ï%½ø£Ú¯Ï³þkb”Ý‹ãs¥‚–Q#c€ânYçym UËMç9í¬Ñ ¸ÿÁï‘ؕ¼Gè~;ùlsœ˜jb–eúx#hhXi÷ÈãQ\üÅ( ܘʂ*<²r¬" B,Ù ö6¹¹!mÍÙÀ’ú(aôC~âÑhû¬ò³ø»ŠèÙñ1Ë ")»_5‹~Ï Úx§Dˆ¤ó\½H/s•$Ù+Ñ…®5ƒÈåfê^þ:¿¸VjÿéÝRk­V iäÉ“ Ž5C\¡$Ö,à>Æ|¤YSUMd_ul.ayˆŽ‹Hš›³Ê:Ì,ƘIÙâÉÚšñ½K†w¯Y)SÐX}{i!æÃ‹Íç_ì‰cuÒ.%Ì%gØ5uƒ¥ &f¾—krÍýÚj¥n¸MaxNŸ¤Ú$e†Ó:.Ñg/ЋÚCÜìsëI§•ÝâFŒâ‘ÏØ÷•Þ`à‘ÄãIܸ5ð«Pžg_æ} :(€yÅÎÁŸ£G(­G,£Üð·i_Äb+;ùâqþBÜ™3ÅnjPßûÁý!`V¡j|®#Q#‘G`É »>wKGQ¾LÎkoXDYò6ž¢X"Õe–0ðˆ“Q÷/ŒMÝÌ^/­.;ÈØ›•ék "«ù0IèÌ}ô‹«îýô>¤EZîûWƒy<µÏHõ‚Ýä-¡’Óxœ“°Òˆ ³ÆQ£&‹—›4ÆÍak¬T†--þú¸µëË(Äë)’^¾:h‰G:+n?Ó@¾^>QÛÌïèüÍ2÷mÞoÌŽZél'zz~š[E6¯ŠüÛq[ÚÙYl[¹3ò–þßó>2‡Pø1ßüoyÿÿÑà')ïüë ø¶uM™ªÆç—ÀÚ¯!Ã6_÷ÏOÒ„É?(•)a Ðég« ´nï`º’Úá:Àï•ò•.‘{ýŸ…xÙ×ý!Vv²Y™së—°ætÝöâµÃù’éôð>åÛÄ; ƒ òºÉÏ×­Ï8mè?$‚œÂPvPMMæìeAV!!]w—$·¢î5e˜>äžè4"Ñdø$PD%óÜM¥¨°ËUñò%Ï? 8­­%ª"ŽP©Ñ°k-Ê!V#¨“G:M»O×u–ÉMýˆ¥x»]Äô 3WtQ;ÖpÈx2×à;¢,åüPš²ÉÞ9lm2iifZ¸r“àBÐ|è_û£bÁCRm?d7>Ÿj¿ŒS³Gæí¡[ ÒŽ(д)&“åÜFÿêCÃl^už :OW´ÄAvÖ »5ÚÏ0­Ž!¼Þð²6€¡ÁaÄm@³%RáІåJAÆp—CãéQï^Yk²‡náÄ"]}™*på7èB;¶é·0¦1æÌià0#ŒùÞ;4Ð’·iÍVßõ;îZçãÖš&ª5„ìé±;X6+œ=uBÄmÀb9BXšYØ(yújçO=0 Öÿ9º7(`n_êxüªx¾á¼D ¬TܾÁ¿Ã\´Xcc^Ñâ«ñË\³Š{¾ø‡ \ zýn"ÏÙ ™y±C&FÉ ÅîÔ]ÄÚ•Xý`ØGÆîŸÑžÚÔ\ÜZl ž˜¸’#¼Y9þ$$¹ª`op•µÍ$ŽhÆó?£ÖݤÂvÃê?Èéu"1>èeñq:?:Xƒ¤Šš¦õÖ­¾¹]é‹—4*&âõ'cÓÆÆÍÏC_ mרëJâ1›ÙõcwÅQ0#Äaÿ¼§Å d_÷ˆw ¹k¸¦y®ˆ¤®6J)ÎáÞ‹÷zòȳ I[†cö¯è!îÖwÄ'ÙG½òk ™©(‚tö¹ ÕBfO!¤¸ÎäåÞ¨ä Éå®vOIUT©«¾ÇŸ$+><ÄÑfŒ¹²ij ]ƒåv•Òýš¥è-²ý„¥…³Ú°ˆ¦ÌŠiàc·5µ·ÿä„–0vQ抾]íâþ;°/K[ÿa¾Ìÿ€›ûÿ°å\œÿÙŠ2v üÞÈ¿]ö±Þ“@%5±ÆSŒÄåx€öcÃ…ò•ÁÀTÊ9ÚÎÚ$/õí µ[ï@^‘í£‹‘rŸ§c~™ª!á‡ì'™¹æ˜nOvgÙíðåüR°3ÂZ‰¨­+„ÍYFJ¦Ýl¬54‚bÅF³ÕPo²ÏÐéW¬çwDÉÒc‚”¦iÜ+‚¯UÍ ÅüéèÊý¨\XCýŠ•Ÿ4¦êß[ !–Ï`x¢'~K­=þ†Wèè–a`çí‘%.ëüÈ/ÓÿËÈÆ£k Ò¯(*Ðq…3uù@ Wm8Ü÷‹ íš«5ä#ðÞÇ£¼¿| Ú@à@©±™N‚î<|š¸R¯û¡ „“+V‡öWÞcī۪½ÊÀö‘ HzôX‹òu¬¥êfÓò]Ð6œú£Rn¬Ê͹Kã¤uÈÛ'®þƒ]sç¸OÞ øÐ½NÛs$¼Žý-gò¡³¢oV|ì7°Çÿ"íƒ3 ×u‰mÛ¶3±m'_lÛ6¾Ø¶3ã‹mk2±mÌÄ™3kŸ³÷©µêüØkŸªþÑÕ?ººª¯o÷ýÞ{\Þ ƒ:$[䫎p¯¾¤6÷X`ä{"ëXÓs%Æöiõ Ï]úCRAŸÀ[?¿é:îçâ=ä‹ÇÒÆžøš?‰k¹rVq`Hk³µ’ ¯èý4å.áÞ£pu}¾z=»eC}–B.Ré×(’!'|©#Å=šæ‡Êì3¬ç/?ÿ(Jÿm~þá~abjo¡înâná`áèNÉö™ NŽ2&Žæöÿù 0_mM SSkiÞ}éÛ$9s4"«þâ³â0 "¥ùÒ0äNlA¨ÍeÝbúú;Œ¡‚» ëÄ;íÁw…êCÇt?¥­òÀ÷îWdc"bK)Ö‹¡±<  òµN«ñŠÉ“óÎ ^¤"ËBºG$Í•Ž…IÆpÇâùÏðWƒÉ@êûÛ?̨…@~úAleõÀ´Øqg v²ê0œ€´ tŒ=-rŒ‡4“Ú¯¬fWXaKj¢îrŽ ²JÐaWUÞÚ‡¹­«ˆŸ³>ŒÛ9²W¦tý´à‘1ùnhúmÌ]ÕãqhCë;Sœ»Ù’kG`Xß uFr€¶Áøxž0—Í÷ω¡¸¡‚ttGz3óÝÕG¿¤ÆíÜŸ"s‘&ëBGV ß©ï˲;l[ë#| jãˆ_ë¡PÝ/!Vó3¿ ¾Äå‚´Qõ¸¡ó0‘¤ ræoÔKÏRýÛ¿DÚté5™5TJ°'ÀÅÒLäVþ܆ü5ªÝðê~†~4÷P«Kß„o>eŽÓ7À×=<´,Mܳ$¹¦ üraVæ¿ÀlЧD^ء֥ܡ¹HÎ9ü—‚¼Jxlû/(#ÿ¿ üÍ;ÿ!.ùPäÿ‘z>©•öGA”HL{ºÄHI¼¤™f+±ò_°èÐU´“wÛâÛ¿{ ý0‚öÕbTàÊ>Á1M :Ã]ÿÎÍÎ9ní üÃû¥!Ö‰k“}õŠ‘ßÙylÔk“côMJ¯q¡í.Éøh-ë¶LXC8&R7§Òo}Nx¤cz”ýeh«˜äT!Ö\ÿ<$ZÚ5÷²œ«-[ö±@eFuÛêÛŒ±ï ¼‡úpãÏx‹¢ˆŒ]»œr”²„H€våTËÑ gÚt/ZµŒ0…½;³Â*}öt9󸮛گv*1'è‡ÙcýXË‹ æ“‘“â÷ªR#n⎬1 NØ_«ÓòU¬Ù@I÷¬OÂ.2&œÌÝÎÓA {ƒ†“ßKA±d ú4Ó9ÃŽi¸D«_Ý©IçŒëúÄf#ÅuÎQFtžUÞ*fd®pr½QXš9÷0Or>‚ÿxÅq›H «MÄ6Úpƒ ‚OÓ5 ÌqbýÀÆiÜ€9Ó^|ô‰8“‹cªç°Ó£õVõñŠ;‡ü­º·Ý¯ÙRñEÑ“Ç_s.'8¡"|Õ9ÿêøƒº”ì››Pב›aöÇ·¥ižØûè|XO\»¸)ë÷QÈ»4ƒéB©ÿÿ¤aíjañ—%w% ·¿'nÿ…“ºò?<®–PôÎÉ¡D{ß¡[·BÈéCstÐÃB—ÓDö7ZˆÖG®˜§•ÐvÞ¿½AD×çèP =Ÿ† Oz[mÀOB8¸ÞäwxÍnº_×ïìe (á‚RDpêÎOs¸K×㨜‰xÐA1i†æÔI n ¶ÍX“Øb;y_IÕÙä5¶Gf‡{"G¾M&}*‡v±ù³—{L\ª:ï·™WfÍdòh£Ûc\Û¼zºÆ2Z ÃX:ú"U²fãG£läZy‰vk§ªoo{1cÐÆ]Ä&Úâ:#V¬Ö瑚ŽeÇÁm(Å},ƒ*VÝbÏáNg yše¿ÏFë EäËr5Ú’bò7í’íT‹b×±£Sùò 8S•£Ébê­/õÔ8v&f{ 7°îÞ}ÑêTù!Çc>*ä°Ë؉DÙz&ê…¸}mL‰áå2'Â2‹J\Ã%ÆÍê‰"ÅËP¦ü¹|¾ ýèÖé#{¹áDdVûºùÕ(KìªKgK¾€RÙòƒ¦íÁ~OVË«d'õ¦NîúY›x%5oùÒ4F¯™ÇžlÕAÓ‡¾g{‹û¶ðÅ4zÁC¿M…oAišCë¨Fga¹"±`Z 4 ¼Êq–̼wp 2µß挒N0DZë.Íc4ü´l8õã>•‡.=C+¢-«$½ ¹Yq"ñÆÇf̓ õßD\ô&ÖˆJÏ(M¿G&MœÃÚa,PÛ€5~Ý7šF2+óE ,%k‡ ó,á¬WP|i;³¦È¦8V“*í N]î­ s¼ˆw¤÷) ¥Ÿ\Ži~ÌÜÁBý£$¶'Æ´%†Ö×DãøIZÈjrî÷gÑ^K¥äF†pµ)œ`O™rœ ÄyBøŸCDóÁ  ¬D Lð"ÿÇ2_ÁsKèÄ2u‚A– ŸÒNTCÜš2T¶r‹»+µ¡a ‰Ÿ€XK¿\Hoc=ÖéYŒ¾EÿATëMÅNß¡6`-*À¦ÖájJÈÓwvúòúrö’’Ö¿ƒÃíæå†ïdÛmNðd;àúÙL¬ü®F3N–—rÏåp™ÙÓw—j3…e à dÔŒ8‘dÜR8v¯CtÝᣌƒô弿ÃÀß}uì+`pr>ËÚ?@ìZ+ìWvݨ¤ìž€XŠA ıÊ6FiHv:žÓÏúsÒq­õùŽã×ñsŒ²ÝeèêÝ3*ÜË·ÿæ÷î—÷’ð'ï¢ ¡*P&Є'p"Ìh´þpiL[ÐöÆìôcs "Nørfë9‰€Äó€àGIrÀ»?Pú\žè³+@œˆã’¶Ó{<:öò‰£Ì>Ãæè ¬wsÚÙmwr½cúô×´z>Ð…ë» áz& ò—¼ñ-Âè#™ãXCxÿÔ?GâzG®ÝG¹—HùÞÃÄÖ°+jæ ³«ð >JSØ–±hU:"T˹w¡ß@?ýµj³,§ƒ®¾v’ÕÎ`ÐXµO@šÑiOfêsT¼Á™ U¬~Tí[ÐaE×Ê «©çVh€!ë³ÓæmÓú€z§ŒÑ“ÍcHý#ÛÍb5ÂÁ`Ý*•s?°Ó´7‹½(ܬ,:ÆÃK2ï!zhà§kø6 9B¸(Y[ôÖíe’jħÕö¶YƒÄ]ÛXHLük,þÉ¢ ÌÁåªEåæ" ŠÙ¡°$ýrqê'†ÆÇ Íïnʦi+Y,øËÅ*q # —Ê{cÎAާÀžTØÑÊl}`v:Þ-”Ͷl°˜‡3kXÆðÕ^¼Œ}íïÍi¦©T ðïÈUôz>Ä€2<<#ÕtEBe÷Wš¥yR*ÔãŸ&W°4jVñŸ–#$„·¨Þá½?;5ôQ:fâ,Ë;¯&ËÈÜExäû6JüB_ºŽ¥ûjb†-VãEþª3·%¢9âY¶ÙŸÏýRwrÍ—8%æ¦Ä)h¸Õè)n‡jÅ£#?—p‡: HRhZøØ%€ªÚ}|À×™ÎW¦â蹆” Æ4¦Î{´64j@~„së¬'¶›Ükaã4ìø½‡C‚ÒKgSÃÕâ‘>aƒòj¼ ôÊÏT3ÔÞÄ ¶¤&2š—ÄQ«yk$ ®¶a¸EŸt~ўlj‚`y~Û1Ú2¾â­ΪOcÖÆù̸åÖH˜(S_“ËÕ 1}½ô-, «›19]7Y#wm1±þpòžì¶A³XÑ£r¥îÔÚ_©«Š#ßü*÷¬s%‹…1UÓ#[:]hST°['¤–+\blU4+Ö¤»œæó¯ìqu]ºÜéʬr¢5$ã+ùä«0îØWÁi`]›µtoxõ,Ù•I®Ê“ççE²ÚO[ÒÛk=ϰ»0­ƒÒ—ÃÃø¬¦ ùÚQO”8• ¾cÔÛšùx2s-åµð’)¾œ,5‡NsLÓò;™—/ãþdr%PDTçX­0P0¾ {,’žqZË®œc»Š£7ƒ¥^ªÈØ´eO¡mµ·V˜î#Îü)‰ó"nf6H‡˜WU1f°Ŷ$JíMMÍ?ƒßJ¤Äޝ‘š¶‘^ÈÁý"˜Ð@¡›olnÿêÉi p ª8PD¤©šÝ«½¶æÔ#‚ãѶƯÝCýmø ¿K‹«Yíx†ÆÙIk÷—mpÆVf_ãI 0|½sÀ[ž˜wKøKßà±`í¤Þ¹ÞuÇåŽ×›Õ{‹Ž?÷Æ´¨ï[Ömöþabþ¤ºÙ}‚N@Ó(.B7ÃMÏ9‚³#ïsë¾'µŽÜ,ÅÆ4­ÏÓ‚áøÓô»òóÐäUÃ×pbšÕg\´SdÊŸðÝ@RmkDå’öÕzápŸ3±Av$è´-HÔNp´…kÎèV‹˜1já©_§Z^Hã)¬ƒîóýo&HFÕÝ×­ ½l:¬ÈmZø‰ Øw7jZ$( fHßøÇPÅH.éûy dåááKck 8òcK`PËBJÁZæ^\á/×ù†ÖLŒÔS³ô#™yÇúmŠr¡ÍcR×Ñ*ˆÎR¸’ú4³²UÕ Ú[„s æTƒ+úæìH§€PËÃל£*uv×rÄLGa ’3 —uTf¢§8‹:²ð| 7Õ{à5i©{¢~7ÛÙÉ6zŠå•ð‰è´¹Þ=¶Œ­ÐT.™œŽ¢uÁ.tC ‡ŽüR©vŠå65)ûâ9ªÂ£ÈŽ@Øj9ÕH ÿtç ûfOæ ¹õVSqc„ˆéNœÜ"•ÌöN%eý²¾B‹BU®U÷WÌ’õ"l*W»ò9y'õ6†4«.==~-0‹(ËØW SË%¶.¡t£€uÑḚoù·á:áֳ޶é߇&é÷D"¥g}CÊÇBš»`äÛ:Í’!pœ~¯»Lñ"¥UF&òÇôV¾:–]AÁ¦ŸbÐ=g‡/<ÈF/G;` ¤8ˆ‰ÈK#úŒÓçú¤»`§ÔØ’ c–Rh6çs ÕÆ„\ë)‹¡ÅB>„Ž^ c:¨d»y£ç';ñFÔ«¬á H Ö”Ì +ú‰÷óŒ[½¬H+'~pûmépØå.ü$~ ,ÒÍÊÁztû‘"ÑzDÉçÒ‘â²m[”†Ùh³ù\óƒL¬ª=y´Y÷‚g§c} ®ºØ¨÷Õ7 f³Ø@ò©³UÓ °žZ¯”²z3{LþbvcQÜÂa¯-ž3tìÐTMk™€¬UÈĨîIô|0ç.†‰7ä¯Ô¬¸òµ›Iû¾§¾D¢Ù7+‡©}沃¯¤÷8þªú«¦ZªÈm/ }kdÌf•½¾Á#ö`ãõ¬\Þä»ZL@S†€™ÎÚÊyFý¬yxYŒH²‡<’á@m_aˆ™É”v”¯æÐve tÒÞÖì©5þ1óǧ3e çËOËîžudIÄqaû»«Ãü¢_æuJs”$$åPJª¡ì¶ šKÿÇ óûlË.E—F@žB3 T€¬Õ¹Iµ¢¡ï¡fë9A‡æ÷x-,…rºø­ˆâÜx+àÀA u)Ð Ü^È›™Ö6)¥ýðŒ™¥… k6gJä $zË}ÛW88×r2µ®~;Ñúûê]ÍïÞ°ø„SˆŸúÒ‰K§²i¢ÞðÕËb]x~Ã~¼üXùʃí$@‘¤ïIɼ¹²{(\ò)Ä|nÊóу섻›Kª qS—V9íÁ3n±’ØNsQJêåGC!KÁÚ1ô‹Óý$NÌÄk Ö»+m+çáPÍ€¬Þ#É']œõ•6Û³â*¢;ô` ”Ê®ml2&®Ò‰ßðÛ0‹~©Kºèrbwú'Ìö:ž mýu $å*u ºK¡7¾š§rÏ—ÔTutƒ¥‡å0•¬ç8ñÃ$ £¨3ªBÃëzíYØiB¡»vs}hš]uO_3%`4Êbs§/¤Ò’”2‰´x¥m‚è¹å4îÎM° r!w›9î׬©E[R“² uÜÏn j?ª»ìüjß/$¿ ò{,«>]kJùÕˆÊ%rŒñϽ/‚IÍ…sÎB}‡;P­&óQv ‘,²Ëóß²$—Ï•ú°]ž‡ðMØ4;uCýO[j 81ÞoÀðö ‚×6QúØ7è›2:&àÏ7~@í¸â®šZßEœ;â×ø8lÎt—ª˜I~@|V—:•y$q^¤]f·íuŒXšLÏÁ×=¤wM' Þ ð§_¢¤&Èç7cQà–Wü­?æÐJ ÝÃòæMv›õr5cï5E7%W#ÎÝa[© ÍYÎMþÁú¨¨Í¹Šá)ÅbUÜjt±í«Î˲«g°P¤‰ªkÉ}ëY7@ §íjEÅßÔï3D³½+ÇÃÂôÔÊœ3èÊÏs›Á6KÅ9ËìÛ$ë[3%s!éyø‡}Ü ïŠî~xŸ>qÈôbó¿#͈:jhþd)oÜápvAºNphÍÝZ|T\půŽÍt4…FÓã4ÅEÄò¨\̓eÅ¥§½@E*³Û|¿á‘L;êÈoþÔ s¶”L¨Ð`þÔ¡¤„yÆEF[C‘P+EßX8íL-©Þ1~êl‚P…òö›)Þþ¼ï8ôcÛ—GÜOJ$ A'H­±=p†}"ïU‘i* äfù&—3ÿõu»‚€À qý»k/Ä _ãeù'ÌÒ0aØÑ#å”@Ø›Gö›ÿ#„eMås2™uÈ­bÚ—j.RŽTD„mî¿‹áè´Ë8ñL‹¢*Œ½²“¯ ä0fÓ»’žEî‹ïÑiˆÃ6Ð%¼å[w‡Þ†öD™îüwñãÒ‰6ÀåÐ1^÷deÖ™t™ÂZ{T¾3 À: ½¬eM¥´vÉ ‘û§(e{¾¾cª³«ç”s.“Ù"„9^æè^ŒýW:güÑ©ïÑb–V¹V–ü{¦]lȹ×ígæ±ú…XlXÀ¦æ€Õiî?B¦0¸ó1ù‘tШxgD¾‘CÂåSí7l ÓŽ |ŽÞèÎÝXêéxÊtöé=¡0•o›ƒXôËë(Xk—-ò‡Ñ=R¬›±Øˆ¦Fu²E/¾æ&päý´o$Ÿ¼KûVkQ«Yã*°âÒúSŒ¾©>C^½–Ê&ÿ ¤gÊln:ç0–6<«Jd2÷ô `–?Ãh ›uY‹Ü8Ó±¡GâÈMÊ+¯ª„&lÈÇ_lšî`:¼ðèJIa@–9W”úŽðUç?ÂaËg•ë_JD²‡ËñõkÝD•‡äÁõ ÞFÒLo4´iEmÓ†æUp«Ò·6ýˆÜÂå€ôâ75à5¿-ü¶Ù‘ÁøËËìäMˬ93«dùŒ#|yfÊùMSXÁÞð%|­7„‹`õÜ'£­êq®ÐÖ¹™’žº¯?ˆÃ›í&f®"^J-žh+ò·°þæu׸‘ûTæb]]ɇ‰¦ÈG’«B²”Q²R \ßÝγà M /„‰Ñ Rkó¼À@ëMøçxÜ‘½N“ªÅÚ·Ô•P .|kY:• 8¿®’ƒxNT"ÙØ ÔV¸çUy$».’ GËÒº›S˜|Ë õ­ÍÜt±À†Í­°c~$ˆ7›êbʿΦ"(-ïŒ`£ñ˜T¡f!µTyx/•Ë3?ÿ`øSÝÓo¦zPžkº@ûIÑZºcx$`¾z¬¼b6BüähZövNmê®Ûåwáœ×ù[s6ì€0úIûø!¯Ë'Ò[•sŠÐk!?4O{â Sž\Poi½Sü/ßý5QH€<@æeŦ¸{ù¨'ßµ (o(îó¹Ù¥Q߬VßL/q¤šþ­*ºéJÅ|CŠ…x'äN(ëͯwk8j·Où)K™~§ñàê¾¤ÕæQ¶ûb^—G°úCþN;‚7û)¿x(—8˜ eýSñ]ް×÷î6F;r`£®2Á¤<µèö,c7·´^ÑDƒüÄ2¥ËŒÝáš‘9Ç[DT}Y<üôe²!ã0ã¸SÎíÀ™å†©=Šö“Îè?òÝÎ#H³ã÷PÇÁ}” ÆÈíæOd¨&œMIæÕ qÉ:qÎôr >gÚ!_üƉ†<1?ñ‰K¹Y¨`x¿Ó„²b£ÍdûnŒ e‚I…Ëni>}¿Åh˜âl( Ã,CËð3þX%Ùd2+ó¶&”X‡Ý.!ûy¸qËÙKý¹úçv«DŒ:“²»b×Å?!@|K d•ª»Ø˜Çð}'åÎΉ^Æ¥ ³wˆ¤îÙË‚ñá—üö üŸ_má7òÏ!á$ìÑ¿M¶ðJÌN~}Û¾i[6§&hÖL#³…Ã[FìM4†òeæ3`1.q[å}û°]ãþŒL4Êc6§1ÂÏuo§°,7ÅÌKÑ%ÓL/“švÕ=ñ‹|g;,#R©IË Cœ£!Ùò¬¥ Á Gk¶fm™ÃŸ%ëR¡_`/4óf\;¡K›¶¯cïÛõf‰w5o4žv“‘[HÄýj?ds8Ñð´wÉݳOYbp˜çx5Ö`‹X‚„˜@à»Ðàý,ãêj²î\L×s0©²×°ÌwK«1ß¡ pZ§Jh/¦Ò(­%7ñ rNBù¦|§½FXkĦ‡Ú*Æ…›PUjÛr„׌›½P ÁÎ5–¼›ëÄÇRÒ¥ó`<i‹tº"ò‡º¾§‹ìJ’çMçãÓ oßyRøWîƒ~ÛðÖª4EG,Ù¯|ƳØq“¤áwüÙ&dGÈõoË$šD¸K¥çøDqŠ-VC)M2Üg™ýD)‹>0Ažð1?·›ºbN}ÍþDÚnÑϧ ¯kXq¤ë¹<Öho1LŸÑÜ >… oúöòÚùÙm¬Ü ÀläãyMí¨Ä+ñ*µ3^RîµÂÍÌÒ"C?¿h±˜ørÔf¦Î¬í§;´_²ªse«bÍÈÓöó†i±HëÜÐcÝìEÆ>ÝéGK#*˜ýrâÁûí@4È ‰EãܴГG¯¯ä¶‡Ä2=íü¢š!ê?ú}oþ§X–ž«oè†ê]t„ÄE{„þs8iý+FŸû¹âä¼Á:=Zíêãû/sO»¬_»j+•ëCtñp÷NSf@½Q'ø ¤wK3Ne¬Çp“-Q¿q?¤3“L(Âê=Álâ¢Å¸¬Žï#tàí±AsŸ­qÉ”öOv”SÊáÅ„—…›?¶[ü¬%)O‰?•Û{À°aVÛ…;ŽÀ‹±ot^4Teè7—1Ù»k7JˉÃ[=„ƒ¯ïݪÅlykj½=Ȯ͟l*XH,|‘D Í7Ó·a_ô›ˆÂ³¢u_ÕòŒJÚª2ýÉ€µ¾‡§ó]/éÙËÊ?ªðë§Ê«° rO0ÏQ̾mwµá?s an¡þ&-–ü¨g[$ÆôOT‡êé(Ø€]zv´¹d0œiqw¨1ÝsTÇ=¼^ 2C)_¢=N¤d¶;'•ûâÓ¶‰nTMš1Ñ7ÿðð`ÍK="L”šç–)á¦sËzÙ×xÁëu{ÇMž§X§ëŸuãåvhŽÞú´WÔ£üÖ™Ò‘žg±j#VÐáÜŠEnŠ:†+&ôý#8l{œU¨ ™n”M] |(-,‰Êz½iÙC{¥–Wá§µ)ÝXq=Zª_Ä5xAy½c·)NÝc7ÔDʇêOk~L‹clkô=éÛKôà,o‹~´YàN?æÄÞŒÊ!n)R½n)bMt}9§ôø-4B%vÑõ5xÄâv”DÝIØ,[̯òŒ¾…½V0?ˆyŸñ™”3Dí—N>r¨·É¹¯¡¸;ê¸k£ÝU¯ËŸ± Ù® ¾<Âp:©˜·ËžÿvŒ4S3Õ‰}ŒLh(Ms­ý#‰8­åÖÃ}¤læR+™+õu‚ºýœ¤ÌT ë#홟÷ª­Aed[´:aL²Ó_‡š‡lR1š-{ÊÍ|MüÇðñôÖGSá³W•¥ÞŽyö†€vöKê¨.eÁh Èn‹'&¬Äè‘ÿƒðuˆ*ç»)IO\Œa웋)áâ ãõAkú(FÆ’ÂÕצ6âïágC€áÇAéBòƵ'šá“ydTÇ‚./<…b§bkú9 ïp¾3 ̈Ѿ3Gùüo×ä0°Qèÿ†ô?ÕsQ73›ÿ‡È[ÞiIóÓÑ~µñBĈ.Üæ+¥Röm 6-]„,M´´£åærY… ¡}˜ñr É< ™Vƒ Nº5?>êå‰4›Ûl²ùÔp„¡BóŽºÐí|o©)2qT9LS¸¼©uø¢¸ñ½«)?Ù+gÖ‡I­ƒî7kÞXªsA?Ë„¦ä¬ÞµáÿÖx“€D9b¿Ÿ—þCã ½j;-öÕYœ§‰5œ„ ‘ÔÁå·î03B—®9[‰Ùâ Wœ ÛjœR+ø íAÉ Î;vÝUE£ßõû±Ÿýªƒ |ŸÎsÈ_p\„<#=øI»p,ƒÉÌÃäÌÒ*ú…Uš¦ÏÛB”’²Ý{‘Åê•Èȇ÷X1[Î9¿È¿,±/ô–»å:ù b(A‹¾IíÎk9êïQ¹ý6?{;/CPIÞY xHñõúf]¦þ(€úS¹R•öqõMGtPK˜F»è'”ƒŠ®õTðpÑuêá8Ä0•ÌÓÉ„’B}q-I=pÑKÇR|Cö³…ÅECèX^]ÃëUí#®+B3Ëîô“þ‹Çë~*˜õ=[?ì—†Õ"ãð§Ó½g¡ –2\cˆÖ~QÂXŠ?8&}jMü죃Ö£èù^½q(T]·røjçÅfÔS‘]·ØWKx3³jÚЭToÌkxQqÓ‹ÔÛCã#Ý'§Jdá>fBÉ/£ñˆÉ"Ó•Œ–”ÀxAÌåŽ?_æ&é–.|¡Æv€×ÀôÀ4›œç?A‘™¨Åèy~ZÓòöŒã!<@b- íÎÄÃJÄ\§¯C‹/Þ=|)}å$b>’4ÙùÔ|,вh_‘ª5ï`'°…Õ¥@÷n‰Îfó NgïYßy•X•«B“ G • íö"YRSFŒþ™ÈítgCã¿4†ý-:Âÿ‘âÖ&®&fî®j&ÿ5¼:]Ã@à 3pû’9×€3„“ZX‡»MŸ)Bm^Ü–5Äå«YõjRr’¢W»ÂÇ—ÙGç¥Ä3ïrç½8ãJÇm’#ïÙ\ª°ƒ]ÉÙ7‚«‡ã« z0ÿ êWçY–Ùæ—”ÊÜz½±Õ¯– §Ï£øÍ6Ów{¡²Ä8kþS–3^ˆ:óªË.²ýö>Å;qÀøÝÞþ5W.·ÕóÖèÐB3ž×r´—½N’N”Œí­Éï®’Äk~ZýÑûóO?¡“ƒuÐçW»5 4~Y~ßÃÑîV!õ¨§çÒvúq¯û`S¥îÅQ4±8·O d·\òØÝÅ›*«»Ýµ×ìÄ^ˆªÞÕÖâ¾L-†à¶ø¶x—’+ £µè9-˜²°é”ã¯'P¹¶Ü`ù¬Ø0¥" Sò0'ˆRQOßVßÛÕb…³E-Ô*ûJÚ›àša¿&·²†+3!îfEˆ.5Zï±».G ý*RÏÙpÚr»Ñï\èhu†ÒæÃ§Zw{k#.¯2莠4;ò!øÌžP*éâF U0²ºy㎠¹~m,#R^m+Z> ò à͈Q$ÏQÊÖ¿©®Ty}ü–Ð]äî¶œù>Lª¨ûc;h ]'Üqèw|öì*Ú(ok{Ôüµ( U%Ó¨Õ"ߨæJ¤ •’øñ#’ ¦©à•‹èr•DéºÉ œ•Bs+×¹f4X¶Â™¿ýLÌÝa¤+5tu´†Ë-V>º¡ÔJ…¶ZšÐ«‡Ÿ^wº÷ŠÐûj+³ˆpþŸ_@x‰_ô^fÒ&6ùÑC+Wýhñ*â+‚9‡Î Á¶ÿE…­á‰Ÿ[ý·œèCqÿ[Á«íjãþcÖNyI7pv]õ‡føô¸ëÈ¢"°¤ Q4Ø>Ä›Ì6šDÎs,ÖAòOpP?IH¡¬1‡éc—ðäs'ã8éÓ•ß܃¡×ï·¹§B0êFÒR‚6Jçô> 8 v kv<ݺ#§â¨Ç):5ÕfÙAEoÅóS Ñûõn]¸º%î¡ÃPkM`ñþ7öClE+ù&ÅÕ»<£§mm©­F@€›ÃÊrf! 3 µô žiÁÞèŽ13cªÈ6Ý.Û77ÄÔó?ôŠÝ¦¨³9#¨§ëB™ç¹à^S… víùôGI㺌ÐÖ\¨=çûf§X¥z?2Vë2ÈH}&ឤWHº‘ E‘›÷½Ó˜uŽ»Ày~`>’•ÁÈBÑ=²» £…ÁC³N¶š@i'%'i³ßÒø‚Õ‡º§,!n…ìx>î/Uhû Æ>‚¡øLsRùßqÚ/ ȧÜʈ~I´i8!¹°’É,> ½IçBì5B鲓 fÊÈ‹éƒ?Z{°Æ‘–X¼0€™ ¼Y ‡ Ÿ¢ JÉx6_2 ^¡î˵%X#9yG'ÓÞsoÅ—0ɤ(Öˆ ã]$MHV&ÍF’ÈtìÏÌüÂãå9ùwa®&%«¤jtµ.äÑ‚âú5»‹=eß*,ç=v8Î;úY®O'Lm,ÂÈS¦Lï•‚/°-°Š-ºNJZ—L_\ Gß¿T„¬È(Å>ig eè®Nɧ‚{"Ï“p{±J˜‚Z¤÷ÔTÚV,y ètü´Øÿ—Í,MG$w_ÀÀè ÁÀdÿûð;9:Z˜ýÃ3Ž’íÿž‹;98˜8šÿgO%¯Ž!ŠúÉø­KSBEÕfÓ¾ ÙПÀ§“ÖZÞná…(OÕebz'ìÓ(Wr4@²›ØtƒM(ƒÆûø¸Úóñ\ÓõôTXØöÍt+$ì‚°Éj½]~RÔ×a=mó¹€~Ü×UliË¢¹Å뛉(ED'ßIÙ§ô•ñ* +lk/fÊN!ó“#è…΃ÕÒ’¢Ä ßÎÑ%rg¬­#% €V’JkJ|«~bVpš¾GÙ·Û]ÞÕKËJ~çüˆZ:e¡¯#RF”‚Š ÃaVÁ‡„»"“…YriÜ!£‹B˜›@¨Uéì2Ä!ƒ·=Å.ç,WämI¸ /ã×|^eEŒCgããTVD¸u`â§Sˆkšbæú£< ýïé7Y·™‰*¯_ã¾ïÒ[Ò J0§X–ØMý‰\KýS§ühêET?–a„ï–ºOj_'ûKïûg®^«TÏþ&U¿\‰ý¸’Ðÿ 6Ôþ%(ÎýmMU*´Ä[|xF 2‚P¥ ' ñPd¿LÿÐb?Ú ÑDàI#Ó;4cô-Åú¥æY5Cp@¬¶ d¯éUXpvÆ·±õð°šhÖ¬£@„æ¥Æì,[¶[Æ‚ÐvQ¬–=2Ô¶ìGR¸U™ÊH›63˜ê^x@BÔ²žµ¯ÂoA©ô ³2®~xÛf˜ôžG8t]ù©âFÝ”9µ™¢9ÄŒo[ói{h:GÜtÅ…L Äed/Ë3$]xœl9„éõ¼ð©‘ëÑØrntA+n$'“pâ Ô㵸þ$=®–51u×Qæ±"8áÅ¥;(»/ïéH' º–‚F’`ÇlÌù,õ£fªÃÝ@C.8O¼ØÎFc QÞà îjuênS­®|öí[Á±Öï·ðP’Gcä–:¼œ¿jûQÊ¢K¥;í˜Tõ=?ü;h1úÙíãüâ͸%SwôE| Ù yÁãeØÉÐ-C?è•÷‹µ„ŸsI•çæ{º¯š&¹Íy[¶‡(¥Íâ6U¦믵ƒˆ§æ9bZCÔb±ÖiÈž–ÆŒ?ãMG¾®©ïÝ¡=¼f‰rUìÉ-MA¢W/P¤©/ñ4p¦ó"üBJŽ#WþÄ-–½O5û¶œÅU0”ÄÕÎÕ q5µ+}â\°¯ñîÖD?¤ÎÀ¿(ݤ×ÒK~Wœh"%òíÎ&:Ks¸ÙVë ]…²u~€)û7|¯Hïxc¤$˜“0a Ì—Ì̓þÅ &*i ó/§Ê/IýXUp²rrTqu2³psûÏéçåZꚘÌpöM[äµßŸÕ°ì`‹¿Ø^ @É/.:}‡í¯™:æf¤ìjxŠ U&ê{r„³gÜÁ<—έ‘³ZŒRf)\ ž\ Îùôм­î½Ã£vÉ>îZ‚·+tG±d½,k?çT£:>°ÛOK ïܺÒÈNb࡯sNÍ]h€ü.,²ûp×!0ԑƹÞÑNÙù ¦ðKÔ–¬vûhLj˜Hþ4ÆÞ½Äõg\!²5^*Æ ýÒ ÓalðLf?Ùõ‰ý:å„Ôp÷AAjÒ¥ïâ­9ù½PÛ%ZUü¯à}:yå< üAí¼4ù)ˆÒ¯t]Ož€Ž ïI°âì?Nzè-ºÉzø:˜ §¢»8¡¶+wòÃ뇞:U¼r²T Û¾ žÊ/Ãëv…û9"~+Lew=Ow!!TS:·duzϰ$úÏ=à…\ yü‘¯ƒfïÖ{4®Ûf(˜Ú´E윉P` ÔÄFÓ·æ†$,ͤ¡/ÜHöº°ªÜEŒÖˈöúÞ±D!üLV.´rö¸ µjRÌSƒ$‡´õÓEô”Ds\'ƒ.'°qŸõ‹9å:þ ¥ºýg‹ÙÊ“ÌÒíÞíõT™­Lßɵ=Û…hι„Ö9§1¬UjóLXjŠ´­glôñZTC SG§Døetê‚cö:K«†ºBsq§ZcÑìÉâÕÍt8§ä ÕÙìβ<“B v^Fç ÂäŸdyše7×ZêôcµÃ7|l3¶GN,ñ]=7š‰ÕJ…C/®DZŠž”ö«*„1ÐÀˆ·*þ›žŽÛ©»EÙÂ3Ÿ\}à÷¯å“¶³[Ì\h‡µÛeÖÖŸi–D^âçU3™¹óùb#W¹ °Œ\Xøü‚ Uo§TeQÛ‚ÁžeÞ éûpDWœe$9KhÊaDi2Ø•FøÃVÑøÒ¦-;Ó«dìÕm8ÑMÃ’¿ñ:9ÖF ZH¨ÏOŸ‘bâŠ1„9/X³”Þ´ Íá"÷ìÝ% ¥ŒÈ;Á5Ú‚Hpö£îÊuì¿6ÃPHÉç©ZE£® ê´xݦ~ t Þ Š2 1¬»AŽop¯Gq°,Èbo“òȰˆZvâ& º¯&ÝÛè×Z©tц’Ϫbó!`$r´ŒŽ‘[Õÿ‰eø0Øz Oü¾ó¼ä"ÙÍ/$džƒò¶ÆÒGìÁn ))jÄzVŽØ4PîN_ÿå;Vmu„ãßÞ  Lü’wþ#íüS‘ÌWãWbEý¬GF‚•‹ø ªL&ÁÃaË‹L†‚#Úp9Ô,37Ꙋ‚‡à>y§¦§ÂEY<»¾¼Ú¹8x¸"  ÂdåHˆ'·t˜6Ù[D_h¡èY3þy×qÞ¹M#WKpp¾¡4'Eo_ê>vt>†É¾ £ƒâINyC,ß5ÌicE£©“‘:Ž6içþºòƒJ|[]Q4OÑÕÆ{'IPk£Ó´AùtZÎë`²á)öMOîkC£©ÉÊþîÀƒbòpF-¾3ŽEe¶—l„Ö—y_Õ×úµtCW4M_¼T#²éz¶$êzã{z꾑C¯šÇ ¨<³ñÖOá3xâ"ë]5ýóÜbq ðʸ“TÿÕõöx{ø‰ùû°êŸÐ† £Å @¬ño§¬w¢Ô qqG±Ã´TæÅ²Ä;e…ψ‰>6¶n`Çç3Áwâ ê,fyfÝ l™Ê®L™™ÆOKb „{÷x5„Ç÷jÌ…G¼Ã® ³ûTÌ…ñ[ç ÀÜ ߇P&Aƒ)T‰Óá½$`ähEoïŸòPÉh÷1 à¸ïÊÞb¼8yÄ­4}äÖ±9{„ÌìåÚ\Êìð'FçÀHmNm ÇŽ@þd™,jG@ƒCnÁ„Ÿa´™<Î8Í€—WJZUWavŠcnô“{*Àöe Ì¡(3 (Ï}Bü¾\Æ>•3“@||ÍìttÏýmcöh pèòÁüâú¯Ù‹Ž Ýhñô9Q¨q´ÑñNÇ„?¶6qdè ›òr}a¦|s„âŒ+úææÃ“ùäüB¬¹}A.œz3r(¤¹=vôfpýˆíúü…Yxühn Åäm¨æ]Ç*¸øØ ðÙ-(ˆ©O|pðžú‘eÎÆ×¤Ê2etx/ ˜ i<ÉùÃòùeM)»¼L>á3 ïµ;Þ3 îÿÞ?³oöÈÉù%ð‰Ù7stãüÒ,˜Ú9`‡Aý/NÎ!HØ®cÛ¶m›ßضmÛ¶mÛ¶mÛ¶=“?Uo“ì’m¯oW÷YÜóxOL7ôù<Å/*û “ô_â9ឈÈúì'ú’õ„4uGÕÔ¿[¨þFE«´iÓüÆNÖÚ¿½èþ¦êœ>â´‘Óþ¦OØë¿²Ò»C 7>êÒ½°“ú ݤNü?ôÚ“ÿN¹µ;c§î?øµ}ã¦Ä9ˆ³p>Ñ©’8’8…KÌ"'qè:¥{Ó˜QÝ8ÒloÖÑ©3J Ñu&$•U/ «2´LðÐu‚ôìŸ(¸žº(ÒñSR:̱ÕEË)ÇŒ©ÌË –*ö­¹Ì˜µ­É²B$’8‘Ôá\‘ÌšT\£^ë9×P¤© éÌg+9ªN«GGN>²i÷­ h•ƒ5«—´Y&Rí]¹Ts4Ò›J´,LÍUÜ“ò-8VLþ-ýöAÀª¡b<ã(Ööu¨Õð IiUƒF¬$2+eר(ݱLÄæ‘M l´¹“j\FgýÅ SW¼´^ÿ£š“kï—®ók\3ôý7!:HAúÃkÃÙU§Õ!ä&XmO(µüµ‘Ou‰;ñòºÖˆÁµ Rõ¶°ÿ‰Jªóxü½+9õFJvJŸ)z„6}«²Ñ&Ûæ ÆZó À,M˜vœ¬Yos==d°¡Š£ «ÿøëÛ¢b#€E.^glãÅÜÍÁ5hÒVyC†ê‹TSÉшi!'šì3C‚İ"4Àœ WJ‰©¤©§¶¤¨¶€yq³±·¨¤¶ÆÈÅŠœ”EHÂA˜)aV9ã©xˆQ€½ ¸œyq{}secacLŸš2#!–ô“‹©ÂÝÐH‹7ÚİÂY§“ñNæuÀ—´„A»Ôªœ>3‚•$ “€x!ùzg?š4¬!=vØ“y¦aº”ᦓ¤“”Ë sCO¼'IŽ*(Ñðeè燱ºØØ’Êõž&'â…•ÌSi+ŒéÁ¸²•” àhUéðòL(k­Î®¸˜& K֌˰‚–áO ù.î H0©!fBšGbªÙÜŽ¬´¬öÅÐG‹Š38'ÁÄ+c(ã½ÿ[›7^  Kàz¾T9Z÷uô¹=w|˜­Ô~pËÄˆÞæ’(æÏ¢‡YþÌIÿ÷IÛˆ·‘ù@UrðÏBìC`!Ë)5–Úê+ËKí½ŽB#-!Θœ+n¢+,A&ÓØÅ” ©6Q/ö1¦Nówš˜–µN€J%2€+¶·ómùtQÈz@ô•F»¤óê ºñ–䩪 Vqz‰SYLIÒ¶’4¼7 ‚ëf3 òym·_O½åNªÅÆÞ’Ú‡ŸÍЗÜr>µ¢S=®z¶LÉ~ Ú+òÔžþÔáÿLk6¸Ž¦*k­žÂš†šÞZK] äbm§J¡(ÐÉTKøwƒ XUžÕ¼Ú´:࣠nÍMŽL ¬‹LLêzeÿãI[­u¥)ÙÁøÕöæ²r˜.¨ÖJ7á¸[So/¢z€ ÎôRzkèêéixþ ä#ki.ÂðÂúõäPWa“‘”R±°3-ÖXàæ:Áf3Oóhçâîîfì̈ÇÓµåÅ¥¹vƒï¡5ÕDZCkK[›+ÔmÊ)# v–ZK]Vƒ¾Kœ™ÑT¤Ø€|{£¶–1 ªcAM…ÂØõLYyQƒO±‰ 5ÛEÂa£@ùÆùºEÀꃳó@eu“‘QejÄ›¢âVT¯Ûø“µT®™Ö#ö‰‡+ ˜E#§ "¿¿òdŠÓ@OØ[÷Ð…ú’º¸^'¢3Ï\‡\E¶Öx`ÿë^¯²Üñ±÷½þ`©‰!¾.–œø£Žú¾´Sî˜aJBÇY€¨ùö*6² ¼Wòíx|7ê‘†Ì #̬º˜y?؆ þ4`aM¢{§—»ÓB¦e „ÿƒk6¦Ü0ó”(·<ˆ¡*ÞÃõØjW ÉÔrÉÒ„î@.ÛN!mÝ7½4–!mhÆúHѶ¶ªsð3 Ã^Ð×#;æ¯egDaý˜‚eœ­Í⢌$©Oeÿ`ª1 6H˜? ååÊÕÎ6C¼´ÑDàŽÇrô~kÐBо ™!„;£~¨^©ñLñ'Z¿ê¿Ï)@ œ08uø¦Hì„#‰`T…ÿDu“ƒñçŸQ^äšj3€ mì9k&ѤÄÚ‰†“òäôu¢ˆßãÅư³¶‘¬h"”BIX³ý ™ä-\™¶Ûl(ròõ“¬í¤?Å›FA îBãH«Gxãú—ëý±l-ýæ á ¸8††‚DpM”)ÛXÿ‘¨ 80 /†\ø˜†IñýgÊp« rXêR¸Ie\AQ«>ùÁ„¨?ZdE{T?,ð¥ˆ)œrÁ%`“þðBgqÈ£w¿¢ ŽvZðjyè**šƒW\Šƒ^F4Þ=‡@C—¢y…—#@}~¼ÛFÓåB9L‰¡0ÂÜ–>:J£_Ç®gw*°”°³þ~:n%nò*ÊkX>WòtF»yäVJ«K©h‹šÜNzÐk vUv”»xà¤Ò¾›¿R@| ú î9ô­oðÕ6Ps Mô[ÐÎÙC³B€Ÿ-6óÐìvF! ס¹ž•!À|û¡…!¹„üº9ur44b³uv9èÄ$è‡-èºu3º×@f™c¼µ "4ôTa ¥Ì‡i™Ð£õù6ˆ©7NÝŒp̼ãqèÁÄ“;4‡?8[ò2~_X® ÿbÑCllkxo¿5}yØŸº›s7A`–>ÓèÃHfj¸ÈgêuLÉRLmû×&’ª‹õS0P/6¢;̘Ã,—Š]9½5Ì×U'RȵÜÓ þ2{l•Š¾í ¨i¢,.´Õ‚=J—ÖÒÑ[¸~™î¤jÒìó²ßÔóÛˆbÙñM%pJdÉÇ2döüÂÈÇzÔÄÓ PÏnØ¡¶}µ,ln¯[|lÀÎàS*! °áQ¡FÉ9•g/¶óÉ‚Ž\GÓôºç©¶6$…÷îfáÑ ¿P@Œˆ—ÑꇅK g*PÖªj<µ8*#ôÄâ m»;C§¾ÄÛ'Õ¹¾0HPNcð=¢Q¿$šœ*eõNÞ\5ÀÝB—… g8Ç ŸavP+©’;{Ç~ëLc4ðk'°¢vJK=üµ· —OÊ`Js𺭦UØ´pÜn¯k&Ëk¾Ö8$N ¸CDo¦vPÄý RE„Õ'ß ÌÀ÷×áÑ1'g-o{wQ&2¸µ…2Ÿ\òÝöeKÌ2êšu y ø‚ã+ŒÙlЈ;pL<épbH=OÐg´«ë€lPVê{êè×ó[•N1‹ ‹û‚ówç÷d§Ñeñ‚-ú›É-ú~L¨ÚK±Xï Ú^âz<¤ªÛ€pä°š3½ãb‚Ãf²æuâ ¶jÍô\Á]r’¥ñ tS_ÏAúÔòBv4šªm‚‘„ìAS«.ÿŒÀ¦½UûØ¢vƽ¾xåà†U¹ÉÃÉàb;€³ÊðW.$Õ ¡UaÿNWý.Ú»7’°~ÐÚF{IZýÝ– r<ô }ž(*(`6Qä¬sË„Ãmf‡ Ȩ†KöükŒÃJàÍŸÓ̇}ýÁªÌû}AùF Ó=˜á:óËX^M^QLlO†3ã*˜áÆT—«®-b|Rx‹$²ŠÛÉ^¤êã‹ñTm5Üäñ¦»2›˜¨1äÀ™'Œí 2717P¶¡ÌCÆ cjp¢m¡Kñô¸äÉ’^bÜ›—Š%()cØÚÐ¥_Áa½*Ì6œ¨¾2G{ér$&¶%ð…|‡!ˆ2'Aèiº1qE\A .ÅxçQY0°¯ÜðDŒÒ€N Ó캌öÀâFz9?‘.}Eë§É3/ð(D@p3°DvF´-æ£õ´¢[¿së“X$îOÛšI ì-°–‹ƒ“‹B—±¾è¿yHIMçëõ= а…L°¢£¬¶íåML÷ÌøÇ£ø‡•†„ÝÙ™ ž…èhHQ‘@,çñ÷8²#/‰ãídaÄxú)"ÖWó)8ª#ȳ­æ½÷óÓ¤»âJ ’ò„GUBB@ÓŽÆ®Éõ½h÷` <¦ \µ¤2ð¯ޥj*Sô!N“%FÝ)ÄøWÖçÖ¡û Ý}‹WFÓ__2v Þåg‹ó1 ¿þ:FuEð… xL. Ñh–‹ £}r‹7üPk¬ŰBA!±ÜtÆÁ³ 1û…Õ ô}+ÒÖ§°¾P©âÈÍñ8Ác¤\b~2ÄŒêêÕX_µŠ¯Ý®YR: ×Ñ2Õ¬Xâ›ÿ]Ë1-ÛªùÅŠd P ·2NO~Qu¢"ôÚ"¸Õù PŒûÖ÷4ÔThõ¥m²^(6§«$Ýl­C-þ‚¿rMÊ‘,ï^>Ÿ| #a3gLBnRÌÆ( ÀT;"ðH;R÷kœ ¨æÄdŸ¦ßÆ}1"•»Ö·ôá–ȱ­‘Dë)>lU£¯LäbEGTŒ2Ãσ*¿Ú€Ïïb¸ßð‘Xį|d£ÖjByÎÃ'0ò™WƒÂ« -¯A¯»BÎw‰ŠƒíÈ „· ¹îÃ-¿–b¸Aÿ1f×oŽñ°fšÊŽ0 U€<ãsK l‹^ 3g«\ruØãE~¨+ÊËYÛZgçÊ3õøøpñúw¯ñÐJà!ÞGõO®j÷騉a#KDgö«Æ¤(JaÍR \éóäŒæ‚EÉËžÁ+-:2ÒïÂA)V5ð áÀ¾^Èa}55K&å&ä®Çý³¡ò6²+äêù-lèklc}eu“ÄŠÝ:¦±Æð=ÆT ùvÁá œüŒ6°}ñ:Ï¿Y@ÞæèXË ÇÁ—´ç(Ø“5Žìx‘ôJ¯ 5<§3ô¤Ã`u&µ$,‡)E^(x.%àp dE†Œ‚?ìêr7í‰d Æÿ|wòi?­i‡Ý0Á(ûj;P“t3_\YÌÉtŽqN#Ó F³V56¹¿nzØ)îÖÅÓFXÖ«i@š€9då[0Ö£1çQ„ eÔÿ þ<—Z°™ááªíÉ0Ó}Ý¿eÉAÒêÏnÑBçjŸcc˃պǦ&FØñ}`sõðÍù™§­M ìi­m…må^H[Z’^Ãþ¢ˆùÍùÞË—–´ÛºÀ– Çü ‰T$J©„üt[ï*¥Ÿë#ÎtŽ6¹ñ”¿ÿžH”ÐMŠãõ½½“éüj?ruò¢cÛ®*º™Y LÁ]@!Ê©@/¼žáî5âññTN¢›1®ðµAf©Óa ¢¨øÇÖW1oX^ó^kÖÉAË(<¤ŽòŽxõQYÉ £€Œ¬ryhL_dfabÿdÞù¶]:8ûÇ€×óÝÎ+h …8s90»]¡SBIûZåyÊb6œ\Vð§â©—Šý“ÃC·ÞQÔlHûy»US…rE†R Øhƒdxý Ü#&v;”qª#ž‚T’’Ô ¯¯¡EÏ¥Ã4=êlm};Àn¸_ö2yËY4 //x|Ë](ÞÌÎ+ibÆy &Ç23NäBWæ!@T©`…ŸN>c¹J"/…¯L"/L„R­´RR@©4`H*ù"“I8£‚²©8Œ•”BžóøicŒß q»õÂ-ÔÝH'Q/€‡CPIÖØ®jR"“I‹SC锢Ìh͚ϻU'Ñ|Ñè©.•¯œ2Å]$ûOz¹DqáÆ¥ŒÒ)¡pGÚõxgQz•(7~–Jr×H+-À•#Fã×!êñûƒ°¾øŽGŒ§„Rå N²þ•ý` ;—Ô’î™Ry ¬ÎÍ…©ÉµÖÖŠGôNe")Y¼Š&S™’Z.S:­tj5 úJ+'¥§’"šéH5jxÂ’mVSI³¼Dx)?oË$ÇŒŒ€[ôê‚ý¯ ÝraQ™´šR*…q‹IF£6»„Ò쨳…Ê%S±.Û$÷Æ@ 7£!¡É¦ŸJ o‹¤™a½¥Ö _ ,æm˼UØÄ–w„ wp\–§wÄ*<ì+tþŒ Vßy=¯Ó=·´º¿Ããeù‹]óNíA»ÍÍœ2—m÷Ñ…,k~˜d Q?YLJJŠõbkÑÅ„Ôv2ÒÞ÷©uɇâ%S©ðt¬JÜuÌ´.ÇÐV‡Ûziýñ )¹¼>ŽQVâA·ˆ+»Ýò U•œOuð×£M½CS_G¹Û{ÉnpŠóçñSEY,vq’Yâédw9B÷p£>ÑÔwwxÝ—Ñ}PácÔ§?ŸþRº6ÖF QV¤-K$å +Pˆ=+~9]2Þ¯[~DjÕÐŒôÖ”ÓÝ×èì%W¾×ñ¬}>¸ì ~\QMüW˱ǠâÁÚ‘ZŒ€Ɖjl%» øUj!à9=¬¬ä`fÁnÛušD¡ävT:*±/ÒS{NUL‹°”®y¢A™GltÍEßó$8þ1_œäðh¯›ù2>~¼È »\Ç⃞ª–9'Hä…:IBÆ~Š- kîy”ÕÍÚ‘ø½Æä}h3iTP%É.¶@òhÒ¤üÑ×õ/‡ìFM]ÞúáèsË™ÃÑ™NþtxXLæ?Îx£lû@Ť…Ná›:GÅ“v¸7À 1ž‘Ýtõh’®$ßÇÞŬCÏHÎ7÷ò·§l°ÝK n'ãÏËáÀ+V¼ù•=^žoi?ì8§$þ’»„ä xw…4v/Å„¤úàý׬cÈóRCŠ‘*ºbøcËÓ¼J5gdÕ½-ÎÛ»NÙde³ŽðÇã±D MQŽ4fŸJÿÙ7§WÚæ*ú¶ ž¢Ùõ§—>AÓ¸örg/ãßQžÍÁ™m‰ðQòþÀŸ¤=àKYOžæ|éÈÌt_3Ï\´¯HÏÏëš;½JX[þ¬ºÐu!w&$Þš€Þ»CÂ:”²üË‘ïf䀥¦66¨w±› qàØöäª2q®atù>†lPŠi§1&¬ùG[æêR}uB¬ôð'[€üÚ;Ùç¡Bz 07A7î û‘wŽ—4Ç–DO„žÙ/‡q6ÎÛÈö*×ç06=¯¬V”šÝcÜÏ©X˜N¥Ûr^„lmÑC1ÊÝý xI²3Îa%ãv1~uàÚõ/¿¢ÀÎ6ª{¶YFW¡z';WpÜäƒLmó’l8SÝßx ³¬kM¼ÑÄ—‡=)ë#F{lÇ ³çÅèatiió•+6Øáá[¤7ð’*ðUlþTÝšüçK›y9°Y[ü¡¨¹lÉe[Q»û¨&©.ÏœQ#P¸Kšfû°ÝÎ lòÕå 2ÝÖardsøè¼mWû”µñBætÞµ“%#Ë«ö“oª{!øZì®Ì‚²Ž<¿AŸ6S¼´-žfŽ´Y4¬1ÉN:ƒ¯ü¹©/VXÜÔx"öó®î·ËDdj,/Ųž»%‘«-ëÃŒûÃz¨Qm£…C{}+Q¯kduïbµ¢ý:iåtJíõø fUpøpRô6Ñ+¿_Æ{ŒqÃÞ“åK:³íPŒ”_Ft†‘VE¶ 7™6ùnl-XŸ>ÏÆÙi #iÚ÷^oÔ\[÷ vµžwæjþ]6Æ¥lÇφ²$t.,Î]“‰¤ê\tÞ>^®¶»¾·kú–;AÂèÛAÏHtÒ6ã9ɨ8lÈ«)¢Ì‘~-ß1ߺ1,¹/Ì2W6æà™ø,EfÙîñü+c_3Žd±@ Þª²î¼ÿžÄîE´ŸŽn1?7zŸâ¢™±ù ÊU9¤È¶>Å’g¿|ßÎûÄæ0¹Ñ'íˆG4å6…éàâaü†_7eª Ï—œæ\ës9ŒŸ§¡¶g'iÖýóÐãkåÔ¡q BêËÈ¢;£MÏÛuá gŸpf¸H^É\‚ ‰@Ÿ`ŸÅOê{Ã_ÛË'î§N“ô«ðÎÓ³WáÍ×è8@Üþ"~Ä]\ÌܹÜ7lž`ä#4Ø÷œ(ïx^á·TÑéÑW£?±» Uo[oãgŸ¡·ko_IòÞZ´oûåÁy¦¤^ÛÌYÜýX[¯Ý<ûHÜïÓ¤ãù{•‚oÖ¯Œ÷ŸìaïËåŸèmïݼÛHûãåó'þÂXÚ?[ïˆA~‰°¡µÑÃ)QoÜDªÞír7,½4e’{s6ž‘øä%ãz6UoVÔ_ù<#ª¯ÂÓªtaÊZœ'­Ž Ée[“Ìù~/;$åÿ“æ²§÷†±q¸“Iºåš€4mv-{ —Ï–ÞéŒY¹N¡SÑxìè R²KMÆú‰jøü3|ÕÓØ¨‚y·¢ñ8 ÓÏöF5~Rftж"ÈgüO^bŠÐ•A¸„ài€¢T¼+ Æ•&ãj˪ú®Kõ9ï*¬Ñ¨g*MÒÓ`÷ƺm6KkÖ¨0ÄȾaÉÛèˆh-­ ©±=s3»Ù„¸¥Ô7©BZßð–_žà¸8¬¤ŒPgçé`w‡Aú¢?wY[Y¨ÔSgû Ý*®¼³8)úÂ#£ :,ÇkBU×®Lk@¢¿D€9ñð¡Ð°ÿþ3âaÊK#õqÇex¹Cˆ¨³c§ùºLêÑq‚—ÀƒÛJÂÌÐÓ÷ÎÙ¾÷Ä"РwÔmýóh€bõ;É/’óRÛ)É7AGÍV œ#.•í\¢á©>àtÞ¬‹_ ò- -2àm30Ш2à® ¢àtŽÀôO?̉Ø?ÌòµÕžxx†òÝærÉ,Qy—´òΩêNì"&™eH—9!³Ó‘@@ò¦A@û†òuà]F0÷0:8À+·;r/É~9h PëûÒüvñqë ósdy7u€S©ì/ÇÃë×®;¼>lŸÄ©»ZZÖ”gZ¼¬ðWHÄ—@yw Ý.宸:èÉ#ÞB:‚g%U]Ï Ñó]¡/'_ˆ˜;ƈî¶þp¯8Ùãâ®ùz­´x]óð^Ò®Tñ¦Lñ ƒ7ˆŒZ·ur.ÿ˜‡Ý¸bäq–ýÞ¼duƒ9 LÃÀ¹ŸbÅæu}¿ˆ¾æi/ÃZN6à Û¦ÁP¯Áâñ;Tþ@ß3æÁ;^A&!œÜ& ÚÑ&ò²mq$PåCB9!ŸõG©Ý¹B$¹ 5ÃÁ9Lšç-˜]ƒûI![ñ~| `<Ó‰3…²KòÅ!qG¨/‘¸¯ i\cdl}ð ÂF …”I¢F ÊÝÂ]°=5wZþ k,dÿ7)ì—wyßÄrc,ï·ö/KG›†Ÿî‘Ó†B:°Ÿo‘~3µ×¹ ½Í½£¬3È |MÈ9»º|­q 5rb ?‘ǧû§å85d÷áó\ÂàâÑ_‘©”g`ÏÍWœ9¥|ùˆ Õ(¦@ÍÔaË?g+Õ0êô0F¥VˆAî6cÆr¦è‡fý— [ÝlR»AX©ð„šCuJ }è‹T9a“ÂðèîêD®ÓIûTŸãÅ—,Æ÷jêjêL'ìÖø ª$éˆÕâÑÇpÈa3μ'¯ô5#¾½6“ºµ\½¸»0¯®Ugmü4ÍÚ 0áþ¶á¤ëÑDÉÉèÜ‹EÓW¶áþETuL•ØÂÛN{Ö/R ¢H§'(ÆN(KË£HqgñØ>’ØÍÖÊ"QÕ{÷-‰¢O÷[¹^ 5¿qOXÀw\ΧËú1ê±6ÇyÖñ«àkÒ­+}[êvÂXU^™!´ÿu¬~àzý'Éÿ«¾‚8Øe?€ÌåvûÂu;{1réfÜNs«®]rod Üc o£!jh(KýHÑû™ž¹ã\¬S*»E{žŠïKßù…bµk²dÜÞ{ܯLQx|; \]Äd»4SÆï £¡šÿÁ/MüF†ý"T’x´JIxËMµÂ=D꟱Réã:Ê Tþ¦Îƒêë.)[uœ˜{C çÙª«äw± ¨ý»9ööKÍzówP!5bÌn½8@˜Q¯¡ÓªÚ»p{™nËÖÐov“^ºõY‹Îêþct'îŸÃª¢.ÕÛàxrÒvTùÊ)»Eoù™9âþ¢XY1n=§×øY`û`G­ hóÌ6.:+…èéXï_onhœç€)üÔKZáÛM"ÝáC½Ïà«<†¦™õ$ä´${7ö‰Wý½£ ûÕ1Ä’~Q¨}1cÆç’ÝÎVý,wò›rØ_ä5.Èÿ*—bGˆðx£ÿÜ}Þá×WJØey¼jUØû±-PháÉèó>ÞW¨ŽŒ–Z¼¦ÍZ{דª©Ê­ØÏ¨‡®àÓ,DfÅã#-}‡h‡é>Àրϲ‰Wzø…ª#¾ÝuŸ¡piÃ!™s«´2võ÷¤é§j\Ɔª§y it–ôÇÅc@ø gàG®€8öÉ£y™â8Ĥu7rKa(n–þK6»X6Yr\\Ø‚ ,… 4&B5ƃ^eàTò¾)òzëÇ,’ £¡)b™Ç­¬ä(»Øu¾.™V½ ¼e9 ´­u³A–wŽsÆÏ0¡ù—¢¥c}»Æà&Ü6ÓYŸm¯Ì+%Y5ü?–1Ë~ÇÖ6dÎbÓÛ÷°pÁ±æŒ‰²s?Jk‰ôŒ´¶€öÝ…óW½Ïßv’À.ŒžZŠøøÐý™¡úÓÚý©¡ê#§ë3_©—£æ¨Ò'ÀÎK~YZÆiæagî¡)DÀvÊ&{¦¤kî‘ñРÖl½‰—<˜DÐÿº°AfEßö®bWߊ¦:&†q8aêúÁ©ú Éä–œ›Ø¢WzZó…ªà†Ø¬ˆŸ.©&©† œ†©‚ò8^çuÌÞè|«nâ·jEYøË#­’q_ðp¿ö?çEy“PǪ߫@¬ïivñ(~Mb ;hP¼ÕsØôÑÞ NUàXµŒžüýœ'(IƒkOÝø$Çtí-­ÌǹàAÌðV]¥hv1Ì¢ 6UN´SßžÎ!•íì§D(÷¤S¡³¢ŸÕ+¥C¿æ@bÔ1»Ü‹å¸(Ê%ûpúAyÇÚ%ÇN;-/ùêNpmä´ƒüXîia3Мϰ@ÃL~>0õ®Ð‡£;fŽåð)QûúŽüe=á0£ª>ê0×nšß2¦}ãh'=Ï &ºÕû–.ðÌ Ý'#·º•ÓÈ@›(Rõ[Ý™¶å‹ÿ N£ “AÄM᥋L]ˆÊG»sä\žò²_ò*ºÔŒ܉÷_Ú@iÝžÜÜpåCâ¤T#o(źI›f²ìdp# Á[ý6×ñÅ(p¾eê\"g©÷×¹FûN‰Y’nØuS´'^¯œæé¤]ô5‹±ÅïûǶm_eð@ÆD\¤#ê{"ص†Tù¨ø´ävYñ)$˜ƒoi^ª+V?96»>Cßgá¼8±ÙEd™ù‘»¤›F¢ª©³kĬ3¿ †ÜZÊ".˜3(Eò{ªÐy³‰[¹á'`geüG÷Òi{ªmÏ”åýÎ’N~‚Ùsí Ï*†Ï,æÞ™­EÛ¹qø¼´QO™²OÛ ÉˆŠ^þL2DVB íy›xçÓv"¢C„BV'üüj±çCÝ-Ö=v´¿9©h—džà&Xά Ú„Ľó»9yõ °6á@*x¸¢Ç´ó¹¢fOÜý%ͦT¾qÜà9žú”$!ßÊa–ߣ{^óÔÈžWm‘ʲž@#k¯RÁ™ »`Iåe¼JáÅ¡P©>­X]ìv(¤ôć>ú‹QôÃè…¯Å0ÇÛu†ŽeåäâmK|µØ(­z°ãLó ¡gL‡.š‹Kë÷˽½ÿ¿ßˆØ¯†95¼ a%M¼6a^08Ô²¶²9ºYÍ!¾ŽFbgqâŽ*/übîm%0Kg^6‡PÝXVe=¶ë"|{5H²0Û}¥?‘°Lêë •““Ãô~QÃ=æ+ÔÏáÍFæ=ÁD¡aço'ΡìCï‚zæô¨¶Üã•Ñæ£ '~aܾò±>á×´A\ìA"#'LOÒP½Lè%N(rµÉôbâa *¸x¸¶JRIDå…œ£×=&üÈ,x›ÛD:7 ýï¦ð¥™ÿrÊ}¿%ÙÀ£òN¾pÈ+€ísªO’Äœ=¯€ÒáÃÑ;¼¼Ö‚ʯå áÃwTÙyv©áž3Çp¥7KPú|î×9C'¼*@E°ßʨ€'ã²Añžî ŽÂ ùq{†:›ÎÆ3‰£l{ò…×Ä!U_b‰–¼ ïñxJÛr%«okBߦ…1Ž­o†ùåvÁ|ñ^%¦U!É73—˜¹ p:ECŸ¿.‚Ùü¥Ãa(?F$m®ËU­ Öv‰ZåÖwdX·G‰çÆJ<%©< &þN$+ÄQÑV-•m… €Ì$Ùê‘›³!z’®IÒ60p ±øíêp%^+ðÐSHZA]dÑ*¼ÙÄ'ZBÆ]NƸmµû+‘.â¹]ôp€›zGj»>ý"`ÀÅÎ.Ð4ŒÓkq•VªÖì+I´Ùz öFíeKÑscÎqµ¿Òè5¸&!3¼—ò~åÑS*MÈCŠj¿Šÿ8Ë´¹:`P¦–0«Zp”þV´-Š<Ü<õÐHÀ¡Y³¼÷¿í¶”` 8kÚ•€ÿH½¸-@á#™:íª>×]`ÙYn3þ„môµÏÿHöÇ1&nÏô®WÞSN,ýÉòç7Q`¡ ×ìOò û×îåý‡—£!WS/e+§D-d ÈÄW/U·¿§ÝØTÓCûÒ—SŠ?gK”¥ª‡®üá$š·Åóã§Íô‚5  å±ð°P?Æ*‘‚až¿D< –7ý¨KYSøÜ›aD‰†ÁR &Šñ›5D‘(,¢?»Ìy›ôŸÛ•r ã‚{%gn¦ðÉ‚h·Æ'a¦.w "RãÁýëÔn4AĨá9$k[,&›1 üõÌl‰'¾:Þ}æ)h¤¾·ÂzÒA—Ì2hä8M?Eò¥‹íÏÑÄU‹Òþicì¯fÏœ §Ž„aÎÕÒ@û\¿_iì"6°RPMÅYÂÚöÈX5¦]Øüâ'Õº­ÙëA„.³Êg;*ÞdÇ=HÀÁ B¨l}”ßà93ò%ƒúS$Ÿohνoù½®ï_ƒ'êz™­IŒ®ì§i¸nz¨ZÛ²ô˜Nç/Q’¯sö†8 ˆ”¾¼ˆ|Då@­2>æ3c’ g·5‘sÑŸ”³^|¯yþfBëe>~I[4/óó¡³€VôïRÕpzÃÏ?»ñ_€žÎ6ö¯âöŒÒ¶­V³< ?MÞÜ|z¢dLr‰O<0ßN„ç‚AîÜÀyv­$£ðsÇàÖ9ÆÎ(Wïcµ”Ö¼oÐ7ϰšžÜŸw£‰wŸ]¥ÔVmcœ¿l«Üš&|üž"Ì9?*ë1v>Ï2>Ï'ˆŒL5¿4üÊ×…®˜ Ò£9ù>ŸŒçzß)¼±ù‚Ïø­ŒŸr3¥¹$Iõ+\Ǫ5ÇŽÕ ¾ªIø[w¹è^_5€О±»û®oK=¹à®/÷‘ÌüÔ»}± ]óá°íË–½Ž! t“‹î8>#r‡Ïœë^bøA¦ÀÃþ¢g>^à±Xïå; z£'8pð.±Øoîfмn»oÊ“¥Eµ˜þs1£0ÑçŽ1WµçÕ#Û«ÌS×Ò•¥¼·@ Þ¼sGž™¶4ÅT¹¬W›M)Ùå-Óz>óšÌ[ lÕrø»xÂÓ† „mC™%7uZV¦OŒk8o†=£ßâcÌ  ê««ÕònOjÑÂøÝ\}ÍO¿—e=ÍÊü:Nï €ªdµM@úpÀ`…gÕ{€´ ¾îŒ¤Ë;Ϩ<¶åP^ìj¼:6ÏtD¤óº@‡j†Ï¿™Ï.Fag ·ý±Ñ¿á­á^{ O]– rÈR¶³w&[ÌH\H§ûx˳AÏ€ë üëŽñ¾¥Ø”¾å–É|Ça ×ÕMÏM¬x-4?Ùú€®ç?Ý ÏãÁ:z.s8›Âª[mø x¯ŸçFía*që?¼µøW<É%rïç¾VFÂ!ù˜b×U.û]Ää×ÜÍ#wýâ$µCÄâ›ûÀ ÓL­v#¯ˆLÅÁââ3{ „×Pí£<þ™–Äeésý+€ŒD¿«Rš/㈠r+ ^ƒX©Ê4 ÍCB¦ÀîçÜ}áÙÏ AŸÆ5JÜoñ\´zLæàÏ+Ÿt[ÄÇ"}J7. í^{)%a–Q@8Éõÿ¾Åˆòy…8L)'æÅ%8=‚º…u‡éuÀ™îálèuÄéQN¼«îa¯ÒPG?Œ-Ê¿ ã_®Ñ³¶BJü”>Ušv¶^rÆøeÌÕÓ8CO^CÅ"ÿ- >ŽæpÀGÙžûàúÏœ¸•œE𼦂÷C.YøÉ}öò¯¼ƒ&£U!2 ˆä–¯ÁãkÖÊò‹( £^Í×4A¾_ŒJsøÀŸ“§J–›"/það~ãP¾Ða•ȹðËÂÇ!Ô›‡5=O ^;Rêa–Èe±ð}ªô€8þplÙK­§ØbNë²;µ¹ºPßÖÖÚ†u5]9tjõå>_ÅçB÷ åèëB• ù†´[ ‘é@ï]ío‰lÿÁÿŸ½Yƒ³t] c0‘ÿÞ¬¼µˆ³’‹£‘ÉÿÈB’¯—PÆþ¨C’‘Doõ¡ˆ^Å‚Ðå)µQk œÁúBœ· ‘3‹Çß|_h“áMÄL½ð'¬5…K* Í<]›ÌæìænçþûUo¸ý1¯ÅÂ'\aö]¹KíÉ1‘› ™„†$¤Bi7›í© ÝÅÒ»·¡|1àI¦ÅæC:ð"Ù0G‰|h t…Ä„·m/o‰„¥h~S ›-O8…庶RMî¿+M2µ\¦Œ1bFšÀ/<«9î`O ù‡4øWÝ%¼9rª‡»?" 2EIÏ6;5¦Yb¿©”躺ûml-“7ãó‚+ðÛ¿˜˜Bí•F‰RIxR¢Q!«˜Vëgçý6R­÷3¢ÏÖÏ£SqmçÆ»óSaÙéŽBî{DTG©¶LAŽœ-W*`ˆ²«6m“£S»·‹2ó¼3 d›àR„ušhÇ¨Ú £P܆mNúê(;r¬g¿ºÛm’Ö`†\˜ñ§eE1Ñ s_,ðsÑî›áùÇ"MV•Õf4L´Ž˜Z”J´‰FLQB3¦/…Éfíº9Ûæº˜Ã0z1=È­P£¶É•W”]]„Í¥Ï .‰`@ÞßÙÿ`giG` .‚³'MºØù¸ìå“„É>¸ÁàÖŠ:UE×X¼Á$e.+Fdy„* ô°ˆ)§H9¬}ÊÀ¡:+áh øOjÁö8ˆ<â6ªŒ}èo4ïëÒ|õ¥¡Ë÷X½®®Ý”^8n)ÇôÝ0æ2ÊέœWžÀ(Hʺ¦÷v–›,·’Éô }—ã0FRçzaÒæz½‚¨ÉÎ+ ž3–û…®ö(5“RÅSA¸µ%U( ІêÕìo¢Ã³«j1_ŒYíË=‡–ÿ¨ƒëZ‚¸%J|Þ‹ý¹ì¹…Ööˆ0¹DÞÖp+ýƒÏ¸€òü¿å!·¯råãM®ã \ØQôs¡òý¿üeÅá%LPà„(ÿOòÁÿcäíÜ=þG! á‡<†ú‹6õoܨ>fÀÕZ±…ÀXЂ.^$=_¿>ÆbQ€PCÊÈdÆSíšn”Ìb±¸ÃóôPÆSÉs>5ž€Âb‰íB"«éIoo©–tËCì÷#+'ãm¦Ûjw:åOǶìÛ ²uOÊOnÒ6ïx`îi £7}X•'·¸þa8-é*÷°® Ù,‚gêšgÎIÏäkh ³wÀ>ñeˆSWßݲ7ÄŽü×;­cOjÿkûp.Çôp3Ÿñ;ý€†ß„cêž94ù;ðgH æ S×Ô=äH8ã€hˆ4TIÛÔ=å@ ¦ÏÔ=æ€Ýá›-voäÁǎœ׶¢$‘ÆXf(ÞCœ4 ìñTÄThJ«Ô&–ó«ÜVÊJQ3ãaМ™‰‡Añb•C eXÜéU_I‡3?ßD¹ÅÝ-(Ô©Yk‚©¬Ô,® Ãq2ƒw9^S|°¡Z#*Ç©Ÿ&–#Õµ¹l6º*ÉRL-Æp·dÝnff£t?ty0EÏü&±Oî4ÎØe)5$ˆ%õ:or )jÝá[w ±›TE<–yÑ¥:{!ÔuByL"/5‘TªR…¾‹ðD­;–÷ ꥊţÊXE'Ï MQÜE£¯IØ¥YBBŒZY6ïfÊT‹« Ïiºš“± á°aðUÌÉá•á#¨‡ãÎ9µâªÈò7Þ½éz‡N¥ªL#sÊTÉd)@Š$øÉHwq¾¶¾ÜMݯ¥„`VÛ £ø3‹¢‹’J¡Ëhgex ]#ñtü°Kæ\⇆`©5Œ¡NÈܬø$Xšw´ćþ¢‹bªtL” xålóP ”RŽ>ÕçüZ»S”Âΰbä}yQf-§³yꦒ֓g‰?”± ¨ûÉ6¯7mÀÎz•¾ÇÝü6S¯Æ>ü{‘¿ëýZÈo47ˆë¡kÀÍ»Žb{`ÔväVyø]¹±—¨à¾Ý{r–»”>ü+ŒQ^?Ä+´7’ÔöH“Û‘¿ ·æ>BŽ©;öÝðCm¿×»ÎÂ;ù/iünr]+®µšœ] ª'èoLa¿_:d·@zj÷=†Üöئ:Ç Ùy:ƒv‰´jå°$.j½>4Ç(rC6yé»UæÈÐü>3ü!aè\ãî²Oºš/È”­Æy «q¦')X²v‹ùæÍdž_óN²S«:ì®dïʪ•tWNªßÉŸGã7B*›AP}PNß0ª~Ø”>àØ:iä}TÚq}_âÅ&Þ>Lí*¥ð‡F~ÑÝÛª¥;ané\°œ €=g[ÖÝš ÒôF:V\kM3òî;–¢L¦8 ±ÈXf½.–Ú¦ºÌŸtWPiì·@-W–urKenWGŽÍâ¯î¹¡è˜ì—úÍãu _ñ½¦DGn[ö :gˆ/…}cÍ`õ¸øBŸÅÆÖÿÓÙÀsClê—mþµ?öïÉzD”Ÿ« *KI}¡u›%*Àž“âà+þ‰cg¥ è-S•¼×ÒWЕ@bD—ßÈžÂÂ7D¾Bg(ȶobÿÞD!]f»Jdüî×YiMÔRãbZÙK0þRá!Žäš %‰'b¢ôçP˜ÜÈc œá&ÎÐ{z._ÍXXÚön,X7!ë›kþ’™;œíý^ÌÒ¹I¯(¬(v—æçðUüè}‡Û-„W¦º&å8`ÌÉíù÷¿hÁá,¨`è_©*òÿƒf•LŒ\-œ=d l Ìþ§k¨K–ìÿŸÐ_Ált!A¨ýx€ãulâi¯€v~ÆüIEÛª˜&X8^ÿ;~nD²çBø~!•iN P TW³µÏï&¦_ÞŸïoð~Ö Î‡ô)¢0š³òüJ#)êª7¡ÈP°šC°¿h0$Ucsç÷ùV›ŒŽA7j¡Ûôá$ðÆQ^>Oê§„˜äOKô‰a>}4„`­sñÛÀj¾Fäk¢I×kZ0ÛõB’C¨³ÇpÁD‹,.¥·:ìÊÎE¡,¡Þ@¶ö†ùáÀHèlô¡.ÀXëËw#ýdÒ È‡Luk\|z¸v R`¦ Fo7Á½ç]²È£ûtˆ,å»Êõ¿õWÆ\ÔÁ¶­!KqÚýÀ;*6(¿¯Ë7$+ªºÍ¬ÃyT~$õtFÞŽ­TGâ#šÛ˜2Ìܤ§§|ÜÆéc;žQ;Fñ£Û0Z—W‡0æ@C˜È ¬DIÌ_øÿˆüÌØ­‘zã*tcãü=¯¦—º×âæ&ôb&ÿF~ój뎚MKëKmÏ•^kJ/×;kWÀû7#ÓîçÎëïŽ×nWïqÅž7@æ+ñž ÷¸ÈÝ1ºÿíçÙ=ðÏGšï0]7õ@Üû7’ïW2^ÝÝÓéÀÜ>ïÉWdZ7å@Çî—jà®Ä×Ï0ßÏ8ôñ@žÇäÏämŸÄäÁŸÇäÏÌíñ[ÈoÊžb7퀤€à?u—*²|¸Â÷Ð45_E^HĉBxOÂbаúÞD‰2:w'æ ²NŒsÅ>óD{XMÃÊz–‹š¢ç+¾GÔf¢4™³R>7!Ω*'ñTp OðƒHˆ€¿)«åyòN‰¥Påê`ïöeŸ€òGíŠY9ËÊsúƒvB3ßžDÉkYKNÒB½léójS/BðFÆ v– öKû>Ÿ·¤¢C’a†V) eì†êË¤Ì Ü3p}<ñ4L22íª ®D„G~GŠ¥p³ LLb65µ²ÏeªêBÐ `†m“žÂÉ#à •Šajë`3úPê0¨¬çÈEó›ôýÄ(²AÏÀºq"ψ&.o‘&½cáK Ëï#׫>ìÏãnD-_¦’na´…åd‹wìÀ°ŽOÂU𺠗nÒ0ýìpÄ2C/š™á{äÕ¿ÌÑvÏjª(²CH’lÈLJ…ïé9v Mò¼9Ö£×ëp.H;âNIEv>]çˆUIí•Ä;0£«Ö†^RèÉö”ŽàfŒ4Ã7Ùò.gdà˜à†4’/çÚ$Š¡[l7ÑO¡X]´—ôEú<ÐbÏ hPRÝîø¬åÈÝ”$ú–ðÕ@ ÓåÁÚÙêO3›ìbÆ«¨”I²LíGb)^X4ù×½US–(y³‚9«OYa#íÿ–ÿ2^]Š÷ žÁY`ô³MÙ³\•äšv7›¾ÂÃDÞ`pÙÓðqšhƒ³M殼?3ê†bu¯“Š^¥îƒµ'$šÒˬ©ˆ,ó’à¬U™üq›¸Ãör â+…ÑÛsÀÈõ'3i«% iËŸ¼cyãlÙ ‚]Ä›‚¡µµÔDì.vq‘ªW‰BÛS¨ À¬ju¤.«ÿ0òPQ -Û³ØäÊÕâ2qË- ®0•:vÞ.@ýp.¸{R©3ÛïTED³Jg6§»ƒ…zŽàÄi@ö dˆ M^hþš<¼›À9-–ÕÑô¦(ˆM~Ž©C«mV ”t‹éâa´=I¢ÅÀ¥`„°M !¢6×.oP5ȽƒÝôÐ¥iWº‡:iûž;sz{{Àa´º†x5•!ª–°Ž´mË$&ÈÈv{¥h.B«K¾§T6¾ é21Eù4Ž>€Ã0jO²J©,% ™g«!2âÓ%0ÂïNgˆ2îÞ³LÉfF_U^¤O—w»…)Ë21þ Úe²?y\­¯E¨ˆÎi.ȶ>Ëê ,ô(‡ ïŸeI )—!‰ÖÓ–!±ªÍçä(/Ò_⣻ÞÕÕroN.=ݬ’é=¸Bx±K2šR,Œ7íUˆáŽá”âKÒ⢽î-1ê¬zÚåF/ßöjÅoî3$F±î41슯‚Øîv¢ÛÆëÁ_&Ý©vX÷Ñ‘¸Ìà•À©là°ØœL ¦(zX²,Ï1¸Ð'þ«­»amjßmŒF@RVßÉóóóªxLÌíÏh oÊ1PO\µØ‹DÕs+‚9ÔXÜZqñT1:ý‘-Y¢É,ä5Õn•ñš®uÙ×XA“ú³ö¥¤Y–µªèI–ô}>pE3`ùyMj²qþ—'dɮՆu^‰Ñ­)¡±¹ îuø%[ÚÌEEY94Ù]Sg-¬þ Öµ1u^Õ±î½#" ³ Ù¸éX÷ÊÆ‡;““ŸÂ'›rÕye$H;(E?ßß"Ê6f¶bT£êKO¡ýÓr©¹ZJGþ#¦t¼úÂ&»á@¥lw+GIì•Þs¯òYH¸¸õx×_UaEÆ ¾HtÔYØœÇä•;÷¼"1¹$ÇaæA3XÀ%ÐoÉÇy_ÏŒøæ‚#h‰â¸=Gà(Ïn4aú³£rŠlõ­» %2q0{D2xÑ¿/âÈØ¾ýc…‡Âaæoªøej. (™xޤ% ‹«ƒ ¿ÌY°âàw; ³]Uû·a Û †ò žÖxh'GݤR#­š±Q¤â>ñc%Qk·LÌç>âÉq>z"=DW?4bÛ€üpMß}©èŒ;<–^š¼çç» þ|h™4¾ñ™O êÂE/ÑrýHòMF¨‘±~'ì¿cýN Ó~΀õ¨ÔÄù„žà²þiî$¿Å0o–7àr`’Œøn˸¬¨ÉC2öM-ÆP=ðlM8Œ¥¶ZaejþSé¶œP%bŽ`“/CÜ­¬åü6ûy‚ð›øÀ?˜ÂÓýÊNE[gqk»¶ú½3ƒÝñæ#O¼jýÚñq1¸-Fí-.!»pnê•ʈ1-iVâhi}†«äÒ|†OpZû’REÔj÷äÓãß²îi#ÇmÔç<`)ÉnC9 Óª뙾ðUÔ“ù¯É§§»×xkýI$+FŽÉ"ÌÌvNAXÅ@¼ú`Yeë8Èõ}ú!­jßȪ;WÃôý ª=ˆ}裞 Èjß ×Äön¹fÝb16”ÞË‘V.dÕ¡#A«½²ëg‘xo‚]Jß!ɪh‘k>$þPU7 WËq9Ð vÀ±_·‹ÿ½ÏWú«áÀt€Ì¦""ø×{T¢ö‚¡€÷’X­…|í4û¨áø£›fMÚªq„e¤G/þ*>ɸ¥p¤w9±å‡S Ù+§ÿB¤žŽ3`å ¤~H6wÜóLΙè¨5&›[ øl‚ÉñAWÉÑuB~n|ÂKÚ¬vÿ׺ž‰?A )N°ï²ò3?o§ôQòNç³.L2ÅïÐ!|¼ddØåæ÷¿}·¥í]ý“ïô`ÿ›†»ÿV“3´ü§åE Œœí=þçÚKÅ%ù??p$<$ “#á„…úЛ;C" Qù0”9Ë|²âðè¤2øáihw°Ëàó}eôœE_/Þc2‘ÍÇŒ‚¦Ž/WÛv¯ÿŒž_ï7À|Ø'£¦ChQ@cåü„mÀ#cç<Ð (E1‡'âY Á¡!Pâøøü<í760#¦CÆ!Ô˜J¬ö‡­ý_ãpxX”húaÅó1˜#[YzfÚȽ¯Dú ‹1x˜±â&mKÓ u&æ-{Ô–B{zN5l"»…ýê´®ØQm²?—[‘›–ú›Éû}ÑZ0¥¯@ŒãH—¥êpÔk÷(åìóŠìd¨Ád…áÄK¬Þ‹‹®3©}†VbL\è0e'¹Z³™ZDô7•f‘80± Cè<Ûí5úÈn蘒&ÀqÝŒO¶¼ImÒsÏÛ!øB¾Þû5tMÉYlLGŒX $xP£ô³ôŽì\“IB¯eáxµ:‚èìØýI ‰cÁUèQvHat¶æ]ÿ4ÿØb{²øktFnb@-ýT%ÝY%[KÝaB9"IM”Œo¸e¸P/&£ôæ›1y§L:UlVûZyЉú™yŸFc“&M™]PÖ]%×£“rüÌš9å¡l°¹?HÝ•.(KÊ}«ë‚wVsnéÁ'r1[úMX”JÀ¦PÄá\RºÜkƒ‚FUz};¸ƒZ–ǰ|ëiÖ»çi ÅäüMv7Ìy`b¡ßš4R8ëECÊæ·ÚnSÁÃAy–z&=ÊÄüU¾“ßÓ.Z]¾Üø‚²/ö³TŒéGªY²C£|žHIbª|éP:ÊW°ÏU\6ñFú†È·âÈ¢ï2«Ü+6žÔJŽ· ÙÕi®&ÖeÔüé/›bW¨+W„ù„™"频¢Rá_¬ùX$‘ÛO(ÛÐ7À…=¦¥)„ùp»€|Oû>gûtý¤¦„J¼÷_7‡èê†é©’üK"kîÿU28™È˜8üÇÿ?Y4£é5²’‡1±8¬€¨Á‘£LÜêøG_–ÝØâb*±(RÙ‰*„h‚`ÿMRKSÓS¯y>uQBÌ\H_»'ŸÍ¦àÕ'ï©—®÷ÕT­*¡ kóÇ—ÄÜlwÚoÇëñd&Ëh,ïcm(Apu#µ¥ÉiC”ìÒ¡Qæzx”õð°ÛÕi‹;ä+>gw–VÍñÄŽŒ¨ /Àuî@h ‘—ìÒŽŒi•XPý˜ ËœŒ)é(8Ǻ>gÚÁ[8‡:¥­5Iuì@˜Kc6ñM|ßËLb}vƒÞ íðެ+¸I*áÞD<ÎÞµ#©dK­rsÄÕ1u€y*crƒvøZÔùýøÎÞÌ‹cÊh"= es¢C½) %Ǻ;ÇÚ0‹£+° ÑÌd–2[ƾ¾Aͱo 8[‡T¹§3Gg¨Ö¥ñwè©äšx¸vhl*ûê8»H¥ ¯N8¡îà lVwfʽ+¡iÍñ…sV7îïŽ/‘™ ìÎô†½OURÏŒ(9ú›ë¬íÁNvÒ=›“+téíÁÕvzoX“‡Y›Ã ïìÎÜÆu¶{WRSPööÈÆ6DwX“×ð†O¶ÏŸç_y.®é›¼ÉØú¢7wÿ&pެ£+ô¼Ó+‚YÜ“+³8ûrÖ†YÜÓ+ÈYÞhN_<¼‘Ür39ø@ðÆy?òˆUSIî›[X OiXJ’Šèa%ÿ®OÁ}â3ìpÑÀcrÌ‚á ¶ü©ìU6ù:¡]Óm>‰ˆ*I ýiVò þR¾›8b”’Ô¡OÁ„üF:z!¢ÖÒ~~ÐH‚áð~B¼?àÆÄ(pVÉHžöÄÖ%Ãétˆ1ÑÅ„5ä§,å\‰˜Ø"†GâÓx¯ð(œôT™’“K t¨j@D~ôÍ8̃0öÅÊì‰óî7å«AD ÿÔ¶œÖ4]÷$Ó4²½Rõ¬tƒ'ÓÈÅ 3(  È%EèaíÅfÖ9‹&›‰³^:ªy…¾2k~玬™6ÆÓx>‚M„? ˜…òò ɧ°¢?0z@V‚¡yK°ó¼4bÌAKNþ¢J÷þŒ†íe<ãVVîÂÒm²TóøwRÏ„·ÁÑé â#Éî3šÙºþÖÂ'õ¥¨e¾ææ4RA ÑC**#ÏB]¡•.?øé“ë­ ë$`ˆŠ*é…¥ û©P†TÏ-ïm[ÉOÈF¡mõhënT§0q$â*L¸¦ /¨ËS¥o§Ùüu Jè8±^ÁÁÍa×õA[€£áŸí èÑÑþ,1€VHÍó¡œ%…“kÃi–é7œÑ- ³vÅ¢Xƒ«;µ.Dzú¤òûÖiÖG©…6Z$n¥ m N£ïvYÙéÌj—#Q¯| ÖêH%û§Œ.–_xJD‰h0™’IVfP>óû,V2h9’ï–¦NÒïf8ävPë„Z – 9Ò«‰ŠjÔ°—à+‹®HÒ MœHãêOéê˜J×OECºbÈþXÓk‹ÝJ§.ò5%¹@ˆ' Æ!³û8ÔÆUfËŽ®RÊxê6Áz±ÈM s31T˜¼€ß 1PÚj† ]MüDqÐl;jSÉR‚5Ï©PÆC"5)‹µÈ–álè›7¤²œT5”—âAc²wɹ(R—©]IH¼¨#X0èD“–LdBSæ ôh«L/»÷7ѪýħΩœR¦ÍºIõþÂBåÎS6¥3ÒåÌ­‰†ã…"ç³Aç¸å7£:çÓœ $5kÄ£“à·Á%> kÐI rÐdÓÈccM©ô>·Ïß¹š”ã ì¿ojâJ߆å'Œë”„Be| «^Ï ¹ î+G3‹nT/k¥jPi˜Â¦Ê-•0³Ã×§”Âæé“­,¦ëv+9f”ä¶°ÂI§ä‚¸HŠêÓ+Ñ1¦œ(Nf<µcBú×…ØÛxZDn% ë+DiÍtL9¸¤i*BcÈÿ20ýbé0€#W #mDH‹0)™9ð²˜;ýqwÃlÇÅ¡D{´°ñ"/–I¸£jaNßQ¢ÆX)ùÒ˜Ì3=²¢l‡ÝôŸö§6ùuoPVhbgQDôMPåŽàIþNQÄTˆôŸì‡É—«bAÛàT¨.Ç$“©˜O¯N–ÊÝÔëæÒù;™Sï„oÿtU/ qÊ?äÌ[êª&Úbš|~ˆµ TcYÎ$FÇpÐe!À¡|F‡B6êo,Fû§ÆfTLJ£%ømTSÙæ$iÈFŒ¥‹3&ͪ›LòØPBU¥Ò£3$šžî°ÌÂÄsLß…>55 s1B²³0V`Míqöݘr9Mc:ñ!++‡²Ê…fÀ;=¨E´Ô®PÞæíéã8ÌJØr¦RÆ*3¬fÄ+ÚG“É¥[ÔÀÒ†9A\­zºÿ;ŸB,24‚;lÊ=¤êˆ7ÃaTÂUyHulª“KjîÇMÇöYÄsÆþA ýTšŽZ¨›zª } (ÂüÊ–<ùd+\áÞôu¨zÔ‡¨ÁåGÅýýêCŒ`Ò‡Ô$Ò!úÖä÷0Ì‚C;é“Ùó1>#ƒˆÔÈ=¥q`± ÖUÔ0K^&øÖZÚK‚ÈOá‡w:žR‡=²Bo³¦®y» l)tÇ}Ä…¶1bBa+÷P‹Ó¸ýgþŒ:ND½5u2kÅ!Ó$ôûc‡³F–´%(hú{ÿÒ¦j¨ ¡Š&…Áç§Ô9C8d½M”$e³Ö )©«®Âvc¶ Ü*äwˆuQÃEZÕ±gþf<ã4Úô5â%–¿Ú3 ¾K˜è 1œoØ¡j.ÉÉZ$¥³¢ªmé‚ïSÜÈÛ È6¥eútz*óÑS%xdˆ5ËÛ¬¹ Šs•BcµfpokWr¶U¾©‰H £úëÑ(é¨4ׂw> %+Î…ÊŸjdÇCu¦ñÒ:TVkÑÊOåå9ø Q˜ðØ*P ÚO‡&ÕÚwY«ˆp´Ç÷œóiÝ Øð ™ÜçèÔåC“'ÿ.E<Ïh‰'0^UjèWµ&û°HKÍdÌ0ØlÊÉ<æ™)¦RŽnj»Át±4Òö½EêŽÖiúÁýÏÈK¯èÒÕYÔʪLs"ç`{>h¯IíŽ!ãàF>µÚå‰d(¡Õè6Ùb–¶‘ç`„-Ø¢Ó,X†(yC= Ã#j$rZŽÊŠÀ3&7œë± ?VÛã¡iÎ]ðoÄ¥Sõïåã´’‰ItívɄѴxn&…Ám\Úô(5ÔfÛþçVm²u£Ö“p™ }”S^ /ÛF(¢íà8]ÃAI:†ý“ ú7UQ, §Pvö%ÌÒÔëاeÙeKØI!͘ˆ¶žsISe;`YíyФc´>™MË™LÒÖ–9_§c¥äN;/¦f–Úp6M¤ÉÏÝk+‰m0Ôµc4P/àgw¢68.5^ã-Åi³%®ç‰’„‹È…¨fïÓàú<õ\¹èK8-µ(¬›eÉ>MŸ¼9–“‰‹l5$ª8 ì° ô«1e&ëàuaÏȬ’ΰOv(…uek‚ù¶OPꩺ×!úÙ¯©cNö>ŒŒ¶Ö´jº{¿u«"‡Ìû…j U¯Pê|¬9ý#•Qß!ß(xÑ>±z[꣬‡ìpÌèêe /ZçG~f¨ ©gYd‹\g,s˜$^%¼€€abõÒ)ËûÖ“ßd5IT™8`h5qæÉàø¾8Sõ}/)4Ô–ê¸áÞœ{+ËÚt2Q˜Ê¯5{t¼\ÇÍëÞ ­QšÀª(= º3Å:¬ƒ¿þZÑb õ—»„ª[õƒÕ‚²úÌš4G0[’ºV’¨G—P-¶ëÚ’Žwùnw6õ Û÷lîDõ&íÞúƒFÕÄ FØlœ£ ¤Úq|…„c£s×7N˜Ôÿ>ùÞ*Ÿ¹g !.Œ…ètl×>Ôú»NhA££Ðf!Ì6<ùj_uYÿey`Ö•ûhóÔ㇠JðÅK-”Г?£’,³Ž{ïöÙ7g¾û¼w;áÜÕg>‹ ñn8‹G|ÝW³[ׄü8X@æF*ø ‡%nMâENŒ.#¤ÏF‘¬}Ÿ+¿3™«s™uÏ/ܽìãz±Qßdé·Ä»}z¨²ò‰‰ÚOp0béVÄ­.‚pµB¯ (8j1iè|ÔÖRŠÑD„ÊøëΩ§KDxuîõ¥'e­Ê%G%ò®­ÒçX?ØU¥Œm5âŸ8³CeRæ -2Ožö|2©ËU º™T!1Qªi47Ó̆ü@;š4âp@Ù<GúUóS¿^G0£m ]|Ä»Ça„`îL^ðþ¹t˜÷z¸ˆPB1ÝY’DImÈ@=ØQE ÐEñE¼Hâh´‚"x;©½"¼èOv}ãu4°»„è0ÏÓy4iX8¸C¦¥ƒû»VzvsòóKh÷àϯâvK¼7[Å\f]fHŸ½p÷¥‘6L¸Ð¢@=ˆab¡‰}„yA@¿šÅóu´‹GX)¼hhDеWpŸ„rsŒâÍ®BŸ·!+–^sé}¡f+¢À¿™ŠC2èäºmð¡> 6ôÁOU0½êè¡’Ô±¨C]´ôÅ‚ù ؘÀ£°‘£Ã(ôêzå|(j{<¨pFV‘ít`Œ(àŒœÈþéÃi?Êäá6ÐØ½Á~XÜ Ñ>4Æôœ ‡Ëí±'BîSiÑ£úë‘ X·àÎ.0Ÿ‰ v,ïÍQ‚4ú§Xa‰>ù—ó¨WîâTCáIÁ‚¼Ýø¡Û°ÜÞ;ú·‰õq¶/öŸ8tÁoÍÐòú6´0P0†F(~ŠÍð)Ã5pzÚÈ$ôgä[>è©ÄŠ=gTÆÇè•s(—ÃÒÊå7Øeï]¤‚>ŽÅX†è-a΢ŠP¶'ç#/ì­©º+ Ôwµ@ÃG§‡é߯ó[‹Y&b”±¯O‚ë æàg°¤‹|‚è±[Íë„"ó{`©ô;hödzäAÄâBåXqÒ†“Ö+ÎðCmq¢ßƒL_!GÇ‘Üà‰Ðe)ëE1&P\QzÐD Î^Nº›†¯;®  ÑØ*´[+XÓ–XgL²l³ö›;tZá>ÓfŒ²(X£ÜWIciTÖÅ"ubqÁªÁÇ bóp´[5Úq­×H¥®ïvSÖh˜* ÐØð6% §=î¶ŽgZgÒpµíû¿6¤Ûx¬ÖXGÃ=ëqh·´·¸Ój’Tó7YѶ—x´ü/»E¬ ¬#†3‹ oêªq”§ŽŸlU´’~ÙÓ ô8ó¦>¤ºÈì7tÚS3§9Òá~xO »N¥fç­/%t¢XšR…vY媲rå„“ï9¼^·ZQ™…Ç·Çþð¡‚.æé­=Î+µÆÙÒÄÍMP‹\•ÉiÿIµ9 P­¡&«ˆ°¥ÎámÃm¡g~½¼Wxo `Þc”}—çªW! ÷1È¢úZÑÿÏÄøŸF÷‘hÖ3:#n—N!yE…˜Sd£ÂÖ£éGTngBxezŠŠw%Ãþ+QÏ °,y}Y¶ÊVÁ$«•±Ç†Ì¿RéÅŒ˜'ëjŽí*E3C½çêÞfç5pp€ò‘ï"•4Ÿ·šF×Í;¹Õ©+${=Ç,)Y%ɰnÛ/h‹·áYúáa6ÃÈ%U³<¯%º ÜfͲ6pém0`ðÓzÁÙ‡¦+f,m5»õ"‡<ü>l°…œáøØÄÜ,lqÅr×5jaWQ;ýOWk‹McàáÆ] ¥g‰ùˆÙD}…}¥_?”ǹ˜œ'èör°&¼¤"xÏN‰=qæûÏ`ù5 ½~b„Á~j„íÀ?Ü{ Ïv¥žÈçýâÏ óÉ4ò‰æ¾Í"~ çýRÎú¿Ý"~Àç“Ïü¿½cJƒ§Ë”)ýþ˜“.ÌÙ$‰ù·J=où»ŠÃ^'ŸyùŸ ~Ì+\ò·I=!ä—I>ÏÓFü`Ï/,ñË¥Ñóò7kò:‡ ûa›Ç ó>IGø"ži ú@œm úÐÍ;@óÏ¥œÍóÈòA8— ó=yGüÏCdñÓ%Ÿ•è/ŒèR/ì‚zFûÁ›× ã0GüðÎK‘|(äÿg-ÀéB>è'Ljôy3ñ§°]‚¸')b?>¬3XD¸ùSÉ'Ñ|/bO¤ù,_x`Ÿ\á<€aÂÍ£‰?ÓlÒ-ü±3ç/$Ø‘)üô¿I{ÃñŒÞ…u/¼ú Œøù3Œø-’?„ø+O¤ø®_¤èsV£ø^æ»2Àž„|ÎY¸óõg~‹Äý,ŠÄ|>Mü©„_tˆhGèn·bjâÌBUN…g»¤¬ëÙYYÎɳSlÍŽnIr âgÌ!ÌX>lß&[pQÞ)ßfñ¥Öhxaåßa‡N¦¯r‰¡,‰õKÊ›±íð ›øË”1Hq.ù°8g36©¢(Ç? GŸh8(/á¹2 ȉ¬ØWÿ¶0¡öÆÈX3øeEv)ŸÉ;ixÛ¨/JšOõ¥y[;Ç&î•ýì‚k\¤&—Ç‹ó:,`¦1™z¬•X‡°­3w>¤éÉ&ì Ù3ØÝ–À¶óC–ñ$ƒÃ;zÚû¸ˆÇus)T?lC.žƒîìÔúôb̖̉çŽqËb®6Ø©Îm1hî·z‰Aâ„G€SAjÞÕ^ÌæýGɼìî@P6ÇuÙMÒ ë¢+ú ?-7-!Züò¹'R·æÒ î¨ ¡³«Ó§Š ý¹yƒ•ÝT¨Ï‹/ckÃ4ﺽ 7"ð'B.Þ‡‡+ôÏÙ*¼U¨³á“bQ~I`fšl¢pÀÖ]Ø[y„ÍHce°—L‚ Ý`‚&ýÜÊXöüw!íbš'>¨wkž… ®)Ú;ƒcq5Ú»ÃäˆŠš¨®¬n9á1B&Úÿ<üÉ}HÙû°Ù«;r'-½âÑ5S*« Î§ãÓ³® {ð\âºlÊójVlâ!·u–uëä-×fû`MÜÙÅköÌšKP›ˆ*k£7µWÖÌ yÝQžpk¥Ÿå h,ŸÂl8;Øc®7 6,Ð~àgcVKâr4¨ <`˜ø¦±tL!­ w¯|öYExC\[…f¨”½žâ²žÂ,“¹ç6ïLÆùa¾á¶LÇ-±µvh¼ º»õúÁÈø;ÿúKD¼;¯»Âj˜Ãªé3´-á{m«<—§Ô„®]m˜-:ц0Õd¿MHŽ.`W„ÐÞââäó/é„T¨7ôð’)ø„b ¯8§Ï”å1øò5¨0žw¯?¬ÍMú¶îü§™YÍÖ–åöpCV¿èº Ü)8§?0 ¸\Ù©uóv¨ì‚#ÜzíØÆùÙx‡þYLRqÙÒ¹k.~–ÿ&u¹)ÍŽøn±•CPíÈJyÈÖ†`åiw°Më7ë<’q^žª%]Ó–í(÷MÿÔa.4à«ûW¹ÝÚü³ÓøÇ}RÕ«é*Q±Å… ò‡<Ï^ȇYå©°Ú…3ç³l,Q°g`Î,‘0 ƒègfSþ£s9t:7þ÷Ì[ÛRÖt¡¼–²'8~‹Çz Ñ`+öQß¹NÁXy™¸ù{Ç:„9<”ù%“ÿ@~¹sSÁ•5ù€¤’páþ©ŒC¿(ùÏö7,½zaÖóÔmƒDãJ“2V]g+ü˜=6îÞ‰Ö£L=Ž’ÎªÿMu,SFàŽÈnMÕ&ô¬¿›Ð ÆUŽ«3gNÎÀMþýA’ó ~YO YwYqfA[«?iVÁ­ïæÝ>ÿsN9ï­/ ]ÑíGX-6­ðl`YJºMŸVÓV¥‘+„‰õX‡5åá÷ ­5cÂŽ-¾Ù¹xì8œ£Ó pjÇŽ”ömóôs~@õ%o[†gšI©[›üŠLfÃksÿ¦Lý+æúŸhi쬪*³Dmo¦{O×3«t®´þÅ×ñÓ€ŽsÆh¨|r¢¥ˆ´jÓ2€fÝ~‚)™îºÍÖˬ<îÜOyè«D«Ì†0¹€Ûo0W@ua1iºµè4\›ZÇáF†ØÜ@Bøæ~Ťß;ä7YL‡ñ*#³•÷С¦Çz²%îê8 ‹ÜäÙ~ÏRd aÔ xKLüX,ètÏ?Ó‚›%+•5æ-#VfY½®!—½Ûí¬ö{šØì.úª„DµfW·+{iðëz9ŠÖ³³-œpmÖ_™…äйÂ|´uÍ>Er{ |d/G=hëfœöƒŒc̪k‹óÓÆ=Dxê8³ŽùWîMÏŠhòÕ˜…ð¬iX„ðìiØ„òÌk˜…ø¬OM{¸ÖVnÕ59ÎA^.x—t¿ÃT Ÿk¡ïÕr‡»ñl ~LÏÆ`^xâäjX‘ÊOèáݺÊ?BX/ôéÉßâòÛ8½ ŽVÃÄx šëëÁ²úíä©C” [+Ç¢çxûêµÅêíõ,ß #H÷Ô ¢¸¶î šþËÊó E£S“Ĺì\÷Tl\õ¼TLà‰\”ë^욈|óÒíšØþ¼1/r¯lá[ö]ì¡#œ½A]‘Cÿž‹|Ê[wŠ|Ô»o;v1¤ÿXQe ‚P5–`K|Õ¬[Rc¶]t»IWe“-Z”Ëvpç*Yß$£X†ó"jfåEd¿ÃfðÔÓŽý³yt¶æüW蜌:¯É{ñ!c¼Œúñ«Ù$7¯!ú«Úäè”úòý?£¶è¯@“s½æhïÑÆ'3¢>c´`ˆñ®2åé;Ãøp™Zâ7Äø•š°ÛýÕjräFMÔç5~+!¾%¿Û6ýžšÀ×ý•pìûÛ`r$G-õ[a’Ë×4ýxššÐWýUbr䔪õD5ÅígƒñŽ55¾«)ú3Ëøðššà÷oºÈä(Zëgîߨú»î4Eu™ñQýZ`¼ÓMŸÖb4D§&L3.š¶ìfl3αN‰‡™/1&j‰Ê6D[›)¹¡âèØ‰ÿŒœXú4À½•„žWèÈu¤v"x¥~ÇGØè¤²d˜bpl3:†šàÙk‰º¢£J]ìÞ·…ãœÍdn°ÙZ»/åƒ/ê]œ;y~PѸð•ÍZZòÄ5ÔŽŸíB…Âhè@Ç%´Aø$vÇtvËtþÇþß΋N«]wLs>ÒSŒ©íjVGíê4ÜVÝŽTªóºoÃ^±nØ5‡8gsqÏÐûPŽÒœÆ/hnÓ/4÷éšûì7Ý]¶ÙvÑ£öf“С‡"mXZgZÒ›7ðÍÊ~ û…5mè>^âùs-±,‚ÀË…‚(.]æ—[ÒMß`é›l\+ŒÇŽKvó_ ð›x$l°[wR8å÷±ÂG ¥î§9˦|¢¶¾Ý9"¡œ\Î.…Ð7îGuû¯\îz„¿?< É4¼,Bt Ø'ÝWÌ8ð `Ö×Fm§¨MV(oaf`½û‡ÄjL¾Ò½‚ctåyÄ8›]v¤³µŸ'tµÖ Ûð1u”ðñ?öm^3ÿ¸ÜÚŽäz»5$éh•³å£¿®á¾Å…AC¤óÎÊ ç fÔa|È5Ïn=1äeŠlÂkáF¤ Qm> ôy=¤˜å¥W&q ý¯ò¾¹í•dË:¥S±Ä¯+F¬SÂMUaŽ+úF· –ýo©•+V*&Ï«üF˜ÃãmÍÁ®Y¤Þ6⯯ÒæToßêÃpÏ,ã ÑšVÂìlà®Tõñ_ìb‚Ù™Áà’KöüÐ^Më¾ÑðÄ&.öüiA·çq|ŽÕæ1(+éžØøµ\F.<6™ I1Üx±ÛŽ`öKа-—$·í—?³õ#¶4ÌIè·Y(N®âì\O„Á G2º+÷ëÀÒù»þ¹†î¾ú>}rÞÆ‹øVýŒ…å:\\Ñ‘o[YK0ù~yüü>w‡b®÷ØÞÆ Ü\E¿Çúõ7ÈœEnØ>ǶP.w\?HÓÐ#º8_Ùfî˜Â&ù5„$Wä".¿<”E’à&’<Ñ^níÊýêÄêùêúêûª»â²»äò[ðüm’`Ÿä7/ÍÓgôüm“`ß ÚÏLóŠÑÚÑD­²6Šö-‚vÞ¿E»¸Ýã 6Ê †¦úMâèUƒ¿âFó‚*üƒ²°×4¿7¶œHðBàKð‚-dÙ²bU1º"LD ±ÕW}ý#¸þ™hpµ¼œš÷*÷üN|G§Å+èè¶ðè¶àèz",ä?&›½ËÎv¡GýðÏj»Ü2Þ–ÛdÏéµ"Í»ßÿ{¿VÖ/(4€ :ãÿ÷ýZŽ®ÿsX1E Òyã—ï%=m†¿J’pdQX8 <[Ê´nâÆš±ž«ivš°¡æ¥¾¦¦äÕÄÆÆŠê)ŸÆR¢Â’΢åÕ„Îksssj§í­gccÆtýnèË÷Ýô¤çö·çö³ïÖçvk,×ëŽÇZÆ…|?†aº_€`G9ŠíF°[epËÐk‡ t—b¸‹¸;ë0ýâ>ÝÒ¡,øUÒ=ϽG ¦WÜ?›W]èÀöþàþÝòux><ˆ….¢ma”shìÎ!–‘!(Rêž"€cÒ¡.ø“ýæôÍ&ʾ:t˜|,Ý=Ö‰»ÿ dÌŒýŸ;|O?F„wü†=vÊÑÛ/+Æ!kïq8…çÀ={[çèsx‰½»÷F:ÖÆÞ;s{ëèw{ëôå†ÍwðÆ0–„Í·ÿF16Çî;{…Nü•xH«çð•yh»kÿ•zˆ»ëð•{í‡ ø#n&¢ìuoé—°çø•rh‡íwú–‘‡øCÈK~öÖü;?æGòWÀkƒõéâesì²Åâf0›»Ó³é[ÃS•!t ¹Æ:]@:šoh8Ü<€ xrS®k˜êE!TîqzçIUôl â}ì9•uhe¼EFÖ™ªŠgî‚'~î±V/-H7}þÏ[_óêÈ”C~ô¨!$§¦¹KóŒÖ^šÜ(­$×c•%ûÒ<šÕx}eî˜a=3gÕZ”Ôç3ø,iFçUÐZ_TÂÇ08/?²³¸Ý )ÔyY$ê9=bœQ×mÆX ›Â±¯qA‰y»ô¢ù·íJnHèùå0Tž×ÁÆ“®iwl¾Ä¼ôü4Îá+Ayiåà¿X•‰ÅøwJœŒaß5ž%ÐÍoH¢!lª@@<á-7±ß~íÓyh.ô’š³dþì±UË4ý­¹*~úíïj¾HÛ„ t(ŠšÕ8x2УËÙ\V­í5+¾‘jd¢=Y´%,Ù^ÃÓж¤jÚ"zb:iÚ›u‡ˆ§±Òà‰Q×O…Á9;}f¬:aͪdüwð$>éß*ÐÖÇGÚ«ø ŒYq[èGÕ,Æé[1Ù¶(äþI Ïéµ¼Å[ƒ]¢#Œº¡Y„ÉÌ“ö/‹þ±^Ú¥3£³©@­ñ¦þ£ÊJS§ô!­œu³1©9¥k4Çj5›ù'gßÅŸ¿Ê:RÏq=Š•h÷-­ð—õÇíeæÇ4[×tG`!\û(h:î ÄÉ¢-ãE”ÊåÉìœ+èœZÍY5\(èÜÀ¤‰ŽSjë­ÐÎñYXì.£Ÿ›/ÜXôDË3‹R\2É%(däUô,ô¨xÔ7${,‡:Ÿ-¤CG s€ðù¨¨ÝÿV`Dq·ÖD Œ‡§Ž[ÆrÅ“->=« dÉl—*ÕGǪ̂Ð0ql XZ,Š+̬«Ê®L/âg°H,«Àе¸´égqÚŒ}5ï›iðì'*ʲmÓ¤ªhsô° a¿) ó•¡fXcÊ‘=)°þE-’&ýñšLªTÊ­™Ñ¬ð9îÎ^h œõa(é,áXh±qŒ\Ô 94ŽX™NÎã1iÁõS§‰]ÃÍ·féI/¿cMk6—škAO/ÓÉjs~­â°3›S´}>¿©¹^ ½F to;wPø+?&Ž4ºÕ`ÍÈ·µšÃ­£öÑ)HZ´…+°ƒ£JÊ©Xkc‚c÷>°ØÍYoõ …h@šé3ˆâXa<H%’ê•¡o­Ø®ÏBdñX¾QKÁX±å'üæ eèAÓ"ç†4*㌛•.ù¹X×5˜®™­€“YØ%Ǧô"¾ƒÂfw?£eŽ‹>öL•P>‰‘PR¼Û,” ÇéXë.¾¢\"Z áB“Å{b·ð×` qþ…4ÜÝN4C9«ΩM®²<é¹H ÛA-Žc$cT¢•\в;~££]ÆôT!Åè4ªsY"ê¸Ð!y)ÀR¹‚~¡ŠÜN³hÂBL#A¡ß7ÔÄLu *LÇ­^Y°#_Õ´`5J«žVÞÆ¢ÃçâXµ»£íŒzùÏ¿BAÞ%0ÖJï~-çY–F£‚å\ô‰/â0q&²*v:Çk3ÌcJ©>µd˜bMé½Ås“Õ„³ÉäÔ„qËfK$ÅB“ÈR©£'ý Î®¤²OGynx*wÛg¾ÓÉA‹œnríbI«ê@œcPs¬/·gG®â¤ŠW‡ÍÛôœ’²OwDzëÀ±n§ž‚@³t÷U©kÍ#€úvIúbþÊðq«Ä’íâ§Ý*¥ÕÙr5ÕH×Ñ”ƒÈzã”òTùÿb휂saú-ŸÛæŽóÄöŽmÛ¶½cÛØqòĶmÛ;¶mÏûÍ™SSß©¹8S3U]]]}Ó7¿×ZÝÕ«å°Ù€M–›’k¡~/EŸ@¼,”²eWb.Ž¢ógå ]9,àŠódý#ñ€£ôˆ¾áEÙ/¿³;“ô3"ŒýËæÔùº@ßÁ¥€¾âÜî eaîZ pg¶!u¸LŸ‚KH¿áTr‹„ÎØàYèÃqÎ UAf[¦‡‘ë×%̤D,ñâ:s¤Ãv=²a+ØÊ¬tò.ŠÄ§íþN¶!&Ò¶ó]Yj³â¢‹˜¯Ò™Öþ®‡ z]v˜<_ÀßB’8ã#l3W±Å4ø&rî"˜EJM^Ü41¦Ì!cB»_g¯wJoHIAMºÕµQ„’s6+‘=}]ѯnô†™Z\Nûßgof75„âBhx&öv%ÃRÂ÷n[¸Fÿ,5‡ª¾‹Ù¹¡B¢E%4c¶¼=ßnÏ3p{ûuŽçá§}Δµ„‰Ô ˜ÕÕ@g!bëµf9Ö°´éêÜž!" Ør¤½°¿—‰ÛÏŠ@Øí`¬‘µÌðϰŽÛÝP̢̲Óf½—× ßUm]Ò·ø„œ®!k‘VòÁ¼±wgqQ?ábgàÇB”:qk¸á6dòÆFÙ ³CŠüNCEÂä3 t|ð£¸=u”0ár¬5:ÉL%ͧÀ1ÉS†n3˜XÝÅön˜hcÄ“S-bîCOªÿ&—4Èh2«–ØF"¦ëéM=ÜÕŸ* ,»ª¹‚ÒÖ¦Òê9*`½•¦.Š .–Ã.ñY©"?Z¹Bœý3vE^ÂqUÕ¬  o' ×R†h¢og ×ÒhŸ¯BÒ#—Uó–ßK]C–—.]d–Ò–Æ,5{#»™"/+“׿ü<+ÿi¥ Q¾"n | ,ý‚]4#Z"±…6«åI9Ú"›!#¬\Èk/W<ëþ®É¦Å‡ÅáC“¸C&t”#·Ñ„KA*vTä¹A)þ,­¨€pwEv“Ev³e[m\u\}\2X2ü«‚ÍßÄ׃Ùòªn×åw:Âä1¸`ì¡ëé£ËÅrÂ%®òåX8Uô.Ë?ǽ×w6*0 ÖEØòž§Ù=†³Kú…ñ:0Ó¯25´Ñð3BL.<~'Â\I+GF:^/Â\îB–¨r*Y])Iv^0®•èâ!édŠ1†[e"£)[¯¶&¢¤–!1­Âž˜UdC®Yò_©ŽJfNF†Q”{€oŠ5Ö6n—ˆ0¾Dv XI̪ÑÉm%B˜w„'NjôWš_ a‹ò)úÔ`Ÿä”ò×ÊÃWÊÄ—]€;¹eî×"ÙéÿHg”·¬9‚z w¼ÿ.ªWëC*) A@þ¢€€°ý·Eµ¨‡±©Ã¿2AþCW7©¿ºã©c|å4MjðL³JUr[n„6ÖwJ(γÖi%7ÕJ5ï·*¨¦‹EÐrÍsš’kíéz e‰Á-@ÈmM„´` òè~|MûýØà`I$·ÌÎàÊh»žÖÝêÚ£ùö¼bAÚ²F¤½YA¹nÚ%Ã亗`Ù {^¿ùá­Ð[ÀþŽäüö')¼Ó‰ÅÈ|¶ì‘Ù¦cSüØ"c#ü¡³([º2eâDÈîS‹ç\è°ñH:—ÉÍ~0¸ ÿ·ÐæRB~üˆW´€1 FÌ›ûëwl;êrr.,*ô;Huª”\çS¥o&þ‚ö¨‘Ñ"!@k\q‰2oc$ý%5¥ðëšfÈ…Ýܾ¾‹¦{j·"¨®˜ÞgÝŽÈÏTèA£ |( ;ÿü9Ft‚ÇÏh¾hñ‘Fì¾ÑßÙ[´Ì7ïÐ<ú:÷‹ƒµmr¤ØLwÇJh¿»Xywá >#˜ü²&¦àµÏn=J‡7úk»äx cãÄ °CFàñy—*áñæCà‰‹òY’å•ûþša,åª$-Œ@6ö/Ú Ã§ÚIÓy´Î7.`KWLÜ ;(J±JÑ’¦zSÎðræ²i¢ÅqÔ׳îÌyZK¡»?£ÖÏ&=õ‚Ô&ÂÑ泟½íGíoÒ ™|>AËçaj™GGmL¦­ñ¹?â‰Ï½ñ8‚÷p¥'XÄPšÁ80«1ƒ«´òI‚ºp}Ö³Þü†\|ümv!œË•¨h'+ت0,VžÃµ…¾‰gHOß?PÞßömrV$ )©îQw=l¶ý  ì Ýü+¥[]–ä&¦[Hp)@mÍÊXU ÆH² ŠýÓ@³Ö—š8üœ—r×óC¦w†\g|Jë ËÌ,9‚š|ϩ۲ܪúUoÁÂï*ùÕwl‰0õ†æC«#”o¼¶&ÃPŸm€/ç_ý¥It¥Hÿ4òÈÓÕöv„0fÑ& ƒqÚ45ªž`ÆÌŒ¤ ÜKW0ÿñ_z±¨†lÞÕ–ctÝM3_iNê˜Ïí9!o¹£bË…=Bئ|È£š6ñ„V2m{?·zÀ¼škò¬]!hÕ{– ‹p]’<´×‹YÎÿ â;AF·ÌwJ¸]%·™$‰(†µÃü¹ºJ èÖZø,œäi]ydþ´¦i; ¤£«ØÞç3¾(¾>Ó`WݘÍp¸§ncB󉘵><¡dÌ Zc• àš¿e]y¾ š±~€Ÿ¿çþæÉ:糨júx÷½)rø.õq ëªo!»¦·”Ûó‡üÙR¤ ŒøŽz@ÛÌW¶BŸåû§?¦8ðLlðŽçíë)/Ù]AvM7æžvàã­cYþ¹X”&X¤ó²Èoµgû 䞥pHM%D)Ÿò\ð4Ž@ÏÇmw“MªMxWg¼§õšÙý/§ywÚ(ߥð x ¿þÛÂCÁÐÉÐÖÔÅÔéߟ_iÀy'-a|oIß±}RÙæ…$! þ²6u&Ì‚!A7[ZÂidUjZ*%¢÷Ùž±;.pm:L÷-ºÉ­ÈvÀLÿ<Ûfoi{žøå²0%»™õ»§‘çØWA}GÿÓçyc¤íøãú;ëZ¾çõ $5²ÊÍ[h¨ Ú;1ê½µu;`ê Œš¯j…šPáÖ€âÉXaÈüò% lÍ#-”IET5©[Ta 2eOGeimŽÂï%·¾qHaLû,Ü=Ý©°£† ²#î^¾tâfó¸AMh7/µŒšI“ÄÏvXŽsÿfÄEÑà›J_š“A¢šƒ–2ÚžòR·çDFû£ÛÃáð³—ebd}æä ™ Ïzy¿kW$*Çb- C€D€›¯1x”Åø¶XƒµÔýaØeùÏP)t…‰†·…­–§ŽáxW 0*~H(>"›íLÈ«•”>ïÜȱ‹÷ê2VÁYòv ü[Ê šjiÑ)ßõætŠè¤øèb/Ñ…/{>ŠAè  ¯éÅ‹}2—é!‘7þ°‘ 2Q5çãEæC( EœisJÐÉ:axû7H°+,§®¤—–«ÎU^ÆœFî‡N–wOs¤Y²ƒ‚º÷–çÂüyWBFpòü‘ à-òùV”Dß//‡\üS%d¥ò¥]^;Ò8—…Ý©ì<¢KÓrÚ!r¾€¬[Ræþ ‡;‰ó|Bħúše¤Ð=ÔZ©©Tÿû9”È÷߆¤\K ä‹s<ðXà:æ² ÀÖR'á¡7\;´V&íK¢06&ñÉ¥`iôY78ÅÑd ¢µf ÌU„E+á Ìì\&z˜lWv¶W4Âô‚Hþù·YÿÐ@j,¥€çÝÏ 6 ·dàjfýq”,à¹ùR–Mµªé ¹¨Yu ã–pþáUoL¡.¯Ív³­¨¹-µÓqàè¾e‘=éL¶~II[_{SÊù,¯TWØ–’Þð“×ËQ@¿‘¬ªíêáçºàqýpU†æÂûS4!áåûo°]s‰8 Õùe<ä.n#—£Øóh…ÙHj¶ºà¬p#s,ò ‡(¥€»ûIS"¹»Ç ¯Zª­BsÊKA㬹P†¿« e^a„:ù0qT 7rÒyY¾/…åp!€© ‘H*,iÞã¬)c\e[štp˜O`§`ܘ®—.ë2ÁO£c¶(°„àš eA|ØÅ³pèÐQšRÏ,XIÑM‘ð¤Ó~¿»ºLjïM³š!à î f°u¸O“.&N;¯Deó-v0gS—áP44‘¬'ÏÞø<,x•c 3„—”褗ëe‡ >GëÃÌFB}mÜËäóÇ>¡Yf7¦q„g!¿Yë×C™º¢Þ’F”‚“ )cZÃIVØ•²ÌÕßıG*É̈SÚ&tÒFï¹u‚é¾sP†.qlsþØßFà´QÕI|hIù9Åe‡¸Í9NõùÔÜ/wç4×FQy£E^à¡Æl弦M=YjÄlÅ‚"2ÛËbV‚Dß 5/î³ôeí¨”Ïß­Z0&G Âw~‘ºG'±n˜H –fVNb­Öh`²^H…TÆùðà( ï2É&ôK—ljPqŠí?#Âö,š¬H–´VØŸg6¢Ð?Ý9Jñ¡bRÁ’RM2†(ä•+ò;xý¡¡ûãžšþ°õô»X…ªšüú‚ß,Ø(> ª/‹jŸñ®Û³ïÒŒHMk ù(Þ'ö‡Š’wZ§çJéøƒŒþgâ¯i8e]QIZlÿ +8Ë؉)\ªqÖM#¬Ùa•†PGE0Á¼—$40Œ9׺ÆÉ'züa óW œéoÇò.‘æ(ÊF„o¢tªg’¸Qº¢™}ZžéàC²q„ŽWLp>Ú§Úô—åÓEÉ•<ºå2Z‰ÌUšô,ï)’Ÿšìu™óŸ/èva2ËýÖ¤GauýºÜàq(•øBe?ÛÎ|/ÌVÛRÕéjÈëÞ$+oúËÉ詯˜ƒ¸Väjê†58‚a3´„]ÔçßÈØG›½pñÊtE/à;þ­íH)QÜ<ª$v UËZ»7ªvÁÑ|k`¯™¤SqoÏ/?&S0JS›nºór[v D}G4ì%uð8“NhØ›Y¯ÑÝLw8[jv˜Ž×[ëëoȶ|; CÌ“íu„FÅ?²…ß«]P âöäLWÁ;‡Òíwšµ Ûœ`/Au*$öʳCá©0î¯Hb"=ƒ º¥Å}´!AÍŒÈ_'¤ÇA+ãHBãvK#vµœ×¦ !Ãtš™9›ÿnJ‚ÓÀ{Z™üáéî­Ä¢zœØQ¡€FÈ-`©Íé47®JÖ«LªMQ’q¥ 9sBSÍ0p11ppbœç Q¤%­øâËýB\Èåˆá÷ºáI:áVßÀ’¶*Ì:¹¬¶¬²› ^ !{µ·uu—ŸØÞ‚ùzú$úº’|=gû|“¿Y¡û|ÖR¹Ð+œiÏäH½jgÿ.¤-˜%/y.¼ÍÚ¶EöÞ\d°X*’ÏsEfÚ$4¨“¥¹vÝÞˆþÝ}½·"^C€ô ýßÐüë·S“ÿËü¨J=J_ã ÓM#4ØZÒ‚¢I2Uwt¸° r¾09>R!T¢ªyàBW£}rvmWunYK¿i©‘Oû¼BêF‘Fr SÖJ¡à±jéíEÑÙÌÜP<ðîÝqf2ûw·ó•;áóUæ·ï'¬?ØK’­Ä‹G(c'£ÏÍÏ>R pL~rÏZOìCÃJÐý?7†¨q^·†Dì…(Å/§¤Ì|ãwL_œò~Ѫ9ñ·Ž¾žJÔ/÷”>ÁŸœÜ§=朻Ý¿a^¼ûÇ7žDÓ»š83uGXÞÐ{QÌ݃NRÃiš¾CQ5õÞzÃpÌÝû¢ŸÜ_„ݧC-/ÍHa7‰Ñ×*{?»iŒ3=¿øH÷Ûœ¾ó~ø›ûŽLØÜˆ3ëíž|/†*±°ÈTÈö$µ±û¥¤nÄC™èx­FÐvõò׋—H •eöKÆÐ2ªÿ¤Ò“áGŸ9xpVk›ÍG¯íFÖcF>ïæ¼“üš>¯Güñ*I™ä¨+ݘ*x⸠Á3_Hl+g!Ù±ÎLIѯe‡[¾ÎІo¨Ö¾Î+Ì--CÆjüsÃXÛÑØ?ÕÆ%ÍÅzì ÕR”|”ÔkÛ æRsƒÜ"V¥ÿÔ¾Ps¡†BmÎôœ€’L‚`R:éP|_lƒ"ŸÁá^‹[Ÿsa–¦oÁL Ñý£]k: µNÖ²EfÊnj$°ZÒt+á•{ao™Ð\¯ÙlEÏ”CðgÆ„@±š„t± G_‚'«¡~žñÒæÞG›=S» ©È–ÇÄf¨ÉäPKbg)±Šç #°6­y˜—| ÃÀç;©ÚB8ú£âFc[×!¡ºˆmÔOŸÊ°Uˆ‰fûAF´„&IÅô'“Pá†ïA¢tšÁâ’ótH¢fb“w#è™êD$-Pùän/1«°óºNMØ«`ÏoVL´àŰwŒÎX ÈeÛ„Ú±:Sõ™tw9Ó‚WÍ3Í Lź:º72‘ÒlÀ³ÔjA3Þœª ž*„pkn¢]!0½«µ|á#Ú­2VÉ?LeA ÍmÀ×È  Lµ!Z{ÿb[Jº6¬åå(ÛGâ;¬w»‡ëq®÷!ÕWƒBª´(SY¿aÊp-*Ò—ù‚r Ý‚¦*”„+_žœZž„¤Ø¤?Û,uÛ!»Dˆ®‰-2o¿Ö›àÊÁøôâžLh5싱ÞüË ‡DÊ[¥\šŒsñS¯ˆÓø+œ_rµËÊNºTÛaý«!X{±’ÚFoK'CËè”Á# Lß[µÃ4} KÔDk~«›سk;l Na[Èùîwü€Åûæ·g QÒ†Ü\Ê…ƒÆ(† ã^sø‘5žªŒ^òf‘š1ÌLrŽ´a³_\KÁ%e›p/Þt™D {‰ž`D‰X“Ûj[4Þî³Á”ÿH9º5ÝùAÅóðïh8ãIž5<:— lñ¼làäDs:— o]«`h3&Xbé¬#XV—¸@˜!ÜÄlx€³èläd%Ã,Ý9wU?‡ç‘„‚…sòð©:b/•­DÕâmL%.o/r=);#Ÿ+b¶9Ö˜ )¸“ë‹_é-o–È KájpÓêÈqe{Zðx£5ó|ÿttèÐîoŸBß·vµÉÀfèVˆž9øžñºšÖìÆ¢NîL/ýãPu^7É=êU2^åÞ¯­éíu*iz¼,¸Å†¦"¼S#ƒ‹èm¬"Úµ,¡¤ß’òHÏÔ‚®0?­ÙmhˆÅBÑ+Ò†Ÿ“š§:˜~‰Ð7¢šÐ<–«­üÔÙ|ób{´z·£¯•ÂØ‡œ=†Œ×·.ÎV)ZJFà/g ¿¦ïW)Û /ðd¿VÇïW@…F€²è`±ø}dÅr»LâG˜½ßIÍÆóðJa€ -¶S5ôý”«c[9,ðä(Î+ÏU|ÊôS[aéM'¬.¦Q³°–{ªçm¶Ì£J6À¾!ìb½è y« Ұ߉ðï°Q()ûGL(ý÷…„“©ƒ¡“©‰²‹¡‹©­© ÓNIڙؘ ÛØ;ÿg¼¿ª­:ž(ºo(íš Y0f­ÕRûP§E¢ZžèßÅÒdÛ¨ózžÐKI·…lÙ\#þ×ߺªã™¹¸œ¢¥ýìP+ÒCƒéôž™ Ï«¤ßæD¿¾>‘@0Z-ev¦Ð )Ô£H¶æo›Ȥ 5Ç!ÌyëMmÍÝVÿˆ}^Ü ’§Y|/ï°Ø›¤:±u¶ºN @ºMˆàÆÄ–Ñ–BÓÛ™€ÿ{.»Ë\ËÚØt(ŽGr‡jÒ¸+ÙÐïPw^å4áÜ/É/bêÙ!Yr^ë=¡ë>¾ÜÔŽÁ&4×,¼«•@‘zS€ãÄ|þªçaÈînÃðš ¯Åæqë4$»ëB’AéäidCkÇ $'³³>×õÊÆ¦ÝŠ^°‚rZ»Þ픲†Gðö’cå9«ó†='ºÓ2›·©ô}I挰!óAåu†J¸Ïðswc"aV°Åb—>$XE¢õj²÷!Ça»4†2bk8»‡9ð·÷xB-Q‹ÑþÕ ÿÙ†Z¨ð·–ë¦wwà›Øf>•“Ê#άÙ¶± ›ÊÅ™u8¦ñºÅ¥‚ KÊ>Ú» TƒÔ¢6˜’ãÄšŸG˜³&—Л³÷xŽj2D,6RxëŽÁ…Õ*_úvJó8k†´vîÁd+CÞ_~dÃR' Ü*?•Å…Q÷‰–ÿB µ OhRUR>‡kæÐ”g+@‚ËŒô¾Ò©’â:*.%U”Rmiê•/'ƒ¿ò—s%ÒÙ\ïªïáGÒ*Šp·V¤›Ë,"LˆŸ½»RC.‡½8DTp—üOl•Ð)OnX ñ—Éy’¥–ûš3xùKÁ?•§] ‘Ž.^Sîkƒñ}ÆmuŒÎn7îÇšõ¿ž¹ïÐZi Å9õX\MÅç9ŒùØzA@wÉKõÕºÒºTÿZvJ¯X°KžüÀõÌÁÓ æ© ¬a¢Zq }B·‚ b*wEú«M ‹ÔëÆôÂJHÒÖö9#T¥ÒÅ9+Ú^êFÔûS&ã„”Žb*ãÂÔ¸R¶SñNèÆ(ÓŒµH]•"„…cUÐ1jÕ3Ⱥ•WŒ¢‰ÈZä»”’b¼6¼`ˆ6‘¿Ø;8ó‰¶%•L¥¾ZiÎ'¿^‡ Ë—êܹý@ø÷ЧýBW0Qƒø«øÍ(»Øºº[ˆz˜ Ûšü¯_ÔT´åÑÑ¿ŠU¤&0­÷ºJ©ºN#Ã’©J¼ý¤eRÌMÝü‘êâžš­ ú=†…JAñâ—|;‰ééOaÁ‘ÎÅbÞí|¤Ó­ßÓó ÎsH{÷gtGÀ;½ Cñxv ’cÉ•B.ËF¬ÂZ[þƒí׋GN«°µ>Ó$Ánf÷±ˆP¤­éøgêÁܸÉ_îLUÅ)6üb¼¤WZãjÇZØëS:¼NnÜýVÙwžÆŒ¢®e•ò&åÚ3¤B¾Üüš-±ö¼!ߌ¿£‹rŒ¡6M¾‘Ž{…þ­â énLb‰ “ªòL¾R ®(™x>'OÏ)“5›5±GïK¤»‰1Ë3ìÁ¡ƒü;ÕA£¼ ÿPý "ûÿêÿ3ÐUýN‚ŠQêÁ$HjF‹"šBåöçnZÿh@À÷L²šŸ?ÿ¸G± !Lqæd×?@ó³ô|¼@ààIFóÅþˆ8ð‡@ðÎv„Áðγf’í£S܈€a±e.”v~aìQ × "'+ÃW°‰{sçÇËdÚ¶SyywòÛV^Žþ,g,ó‡ðÖ oÕ&WµŽø¨ša+vTOÒ³U‘êÿÃ+7™Ž»º-#þA(û¯F#¶átU‘ e„:ÏÑìX kÚ÷xü_^<Ý N™ÐˆŸèˆiNQþ&Á4zh÷O¿­£ÖSïy çÿýYk@²i°}§[PÊ?oÙrÍ%Ä5àŠ5‡ÌÙ Hóblï+_9‡Ô³~…ݲ8(”ÁÑX°Á9‡Ü2ŠÝˆwµŠý\‚(õ@r0RñÉ Ki¦#OƒZ9ÔEÉ1/´øÒWÀjºRÍý[Ïl¬ÂAntÕÓ •¡×ïÐqþí†ì@ àðà-uÜ"Ÿ—¦º©¯ÛÞÝk>wœ#n©”Úìê×°~«ú]ªþYÓ€µà& Ú”_Ó(—Út}úµñD0ÿâöWj~‚Q.ð¼ð‘u޾Jž#¿‡ª ¾8"7÷– (²ÐØ¥$ÑŸF¦sE9ßó öÕŒ¢”È"Ö¤Ê&QÍà:qœ™'³Ûes3 g–õÃTÑGŸ<!VagO¢¾Ñ½XQ€’B FXÆ#i½ðòMLÀý­”ø/¸G CÉ#Ä^ôÿê:û¿¢û¨qÃy¨ -™›qü¶O…[ãÅ„&Fe²ª×„•ed?øQá™Δ7lꌦÆÞaè”·¤¥ö^oµYñSÕ¨ªÊßL!P­¢ª© Iû½^~ݪ©ªª‰Aûe&ǽaM\ãö»‡;­íy:k%‹ëx’‹åý#aéG¯Ò×§ŽGúëål³¤á„µ¾ñÀÅ` “UÄ•†©Ìæè¨ùuh6í“{)¯u©)ö]S((CîÕ¥EïøöšüëÓKáEó‘£`Ï®~>£0ˆ ȳ¶„a>©,;`KfÙµqÛÅþšÛ“ä dÓ(,)üaâbáÁ­bÜ®àørÑ;Ôà*¯Žà ËÐGÍ´`±m`úÊ,·a@ö‚0dS:Ùýoþp^CÔÖUAË&ëg`{.øo¾çR›h ~‰_úy9aÐ_Q°¿5Lõëƒ2}Ö.PB.UWùxk?>©bxÅâ÷©£6ýˆU L¯°sY’o¼öò ÎáœøÅ-”§—¯wêü_²3 ÷loÞ©[9GçÔï¡ã9”ôÛ…GVÝEõö ÷¢)>â¦ÛäÔÛGïnO¨ï?Øø L­|ET|e¦äUž”S>£AôWg.‘ÍS>C}%§jJ_ÙØzòT­|­Ã¬%~34l.žnqO¯\Ï^ÁdwBºÊêùË/äóü(R:‹ê{¨.jÀŸÃÇ·ÔÖ¶Už‰?²3ü¨.rÝZC>£(nì­¶TWý.xÞkúcWwÝTv Â:8•9[¨Z¨6¬Â:<ΙÙ4:¢¬9ÒönVfe: ÷kÞˆr1Çe‚þ¯»!nñ—% $)<0ÞvÓŠ¯%7žnÁ3”/FV˜ ÊBSB!i ³&KBsýí½QØL³Jo†`ù%Ý8GåÕ^nœ“òSCÅ ½4eŽsæ N¬àyl|Ñ4$Þ0®êÊ *»%ë»zw¦ÔüAÈ3*¯N)¹Ew ’'Î*zÒ,eÊ/°!¹y¥,•Hîâa@š.ÅíᣪöÇÒÜ€#ÈGã^¼ˆHO ü¼L‰üþY÷UNhÎQóÑSNwñ‘š|fII[EMIYÇuå#RÐZL¾Ù‚ä˜ dÌylŒ¶°ƒ8Î$l~{ÁV)_!T¬W/ÿAÜ™!äÓè‘€±…Å(žˆ&¬VÍÝ­Tg_ßÙ•Å*~¥1£=¶èSèãWŽí€WßÒ[/zh­sá{¿šÈÖl‘¸x¿ ±Ás³Áb†¨~¸霜ý*ÏÌÓ¹6Þ[ v„ˆ$,d,Y*6š†Ä‚e8#ê#T9^¿áu³šY¤Ò$Nj¤vL"¤ËbK·«Æ³(ORûÌcBù„O~þq~d0$ðs$œp 6Qs²½C#îØ1d^è)Æ|…¡F®ít¶dÇ{,ÝÉ«ÍRc¦e=ˆóàwQÑIèKQ˜øÌ¿£ß\—§ËÙº„AŒQ¬iw‡¦d-çA{TWQL—û\VàŸžh|ЛéUž‹Lªˆ•¯ææk³ÊÐqõv²`TA†ÕJ“ZÙ/ë„Æêñ¬'J­Ð< &i$–ÉKCü8 gùI<è5§¤Z8O¾Ã«/ð ‘Ë/Š'öð°E£rë YžáMãŒi—j,0 ‚},ú³×v ÂMgÍý¶/¡Òã ‚do̸¢W¨´Y$.:g—=YK…2&â%hÒ¥ìVƒs%.ª%œ«jRó2 C{‚Ć÷˾†mÝU¶N>`„ëSš–@œýÆ]øÍTÊ ‰z r,ú—=:n«›ïÓÃ.PDÿ~(`ˆ‘’bƃOs© „’&h9Çs“_KìÚÂ¥MêK.ŠÅ~v‹têd+Ƕ;Ú[ÚCoØaû9»Ý),Jd)Ú™õèÆÉ2±ÐPr§Žì‹¦mA…)ψµ•dC<ÎpFQ $À);Xlì[úÙÕ–m}ù&Ðå"cd|ÿð4ª©T ÷P9K¤ùcu·æüQ„­ƒS¸Ž)…'â®´²ôñ›"?ÿ9Ú*Bú©„­¥¬ÎO ˜ %CPT÷îdríœÃ§@÷Ä%g„θÄÂkš@"D ã Æ=²™ Øt«`X`Ïæ¬.PTŠÉsà?±iæK¶?/õråG‚íNç‹àÕðŸûamÄìFw&?JLó•'­©¶¹ìŽ÷ª«o D„Êú2o"ûÏÙ| …9Ò{ë„‘ÍÁbŸ·"(iæ°…¿ÈüÑXüûw4‚üz;p¿AìgwÜo¨}ïRpídaí—=à¬o¬=Dƒøû­qõCr½1ºûìwT!ͧ9Kî3ÕØîPÑ”b [TNmâûÇ<¸= \wjFw¿Ûb X±ÙkL#Üzò¼>^Z&!–^–ݸ×XVQOD‹?¶f=8®_pcôW¨?Œbž»ÛƬ{œL F¸ªJNuú†:[š£%ö5Ö\B›À҇ߡœ²È?ð¶L²7i÷¥Ëô'òê›eh 4Cü±…(RL»el8rûßÙªïÄ 1§ôÖLñp·G±¬7ä)œ Ø£Y¢ {ŠT×Áp‰ö¨ä õ.ëhPÒ´çv'6W÷¬†>ç§§U¥´Ö'ôÚK[!¢öÊÛS]›…¡†1öG|ý¸D»ÚŒWÐSbUsgìx×y[¨°HŠ$ K-!㲬vÖ²È×R¬ä;¤­döÓ­§E6ÓÐr³/jݲûê·l_‚õ,E•ƲòÇ„_iN^ÌÖ¬¾téKa/®¸ßŒoÈ=9‹/(^ërSdã1OŠ^¼;f_L1S¦÷¬_ŽwMò7òVÊÁnp0Ü ØÌ$øÃ*Eº>†÷Ö)„‹TrüÔ£¥Ö¬_–¾Ãöû-Ö,ˆ†é¥½ZhmIÛ!8‚¶éH¿RAH|ø\”‰å[Ú2#‹¸ã”ƒ'ðKçÜsC+Æ\ï¸[8ÆlO¸[ycµÝûÈ,½Øz,hL tRÇÐ:ÉË,ï0˜Ý—,wôU¾…Ä,æˆÑ‘@F[ÒæbXTÆgXe-0… cÖfU~²u£XÚðÑ,¿¿~âúù“lò¥²¥G&9]×ä[Pa¯ªa¦歗¸"À[L-¾`í°~Ñ/Ú…7ÿÌj\ $åò‚aäϾ7˜[cš !MŽføe}:ïO“þúc$l\dQZLg¢ÀRð!ÞRêŠÛ„âÔÃ?Ø#15°ð¡œŠ|À¡ßoDayÖežñ ¶&ð©/ÆTò&z*°'C*´úxµ´Šsar½ðâûU:LDÚ€Ì#ÖŸ-V KD8<¨{máȇҘŸê`QJYxScñáÈWÖ§¿;“øêg‘ÐiY™›?Bp L›«È!™nôÝ¢è¡Ø'·ú€!ÌdWVÔͺZ^m«Ô3F°)ÎÐŒFš«Vús¤#·öš„ëIò¬ny&oî@:Ö*† kš•|€ëHÁ´vrÆ"À:]öÍÒëÙæœ#óìyâ{ztÁaŸóVÛŸ¹­±þÀklà“gy§ðÜß6Jc¡:=cq+v¹»±WNöIpk6…Ol¨O¦åš 'îJ‘SÏÁƒþÚ’å¦?…–$`:žC)v¥9Ûì´¤TÀHÙéÐ ¿Š”b­l 9«Í,B øŽ ÔEÅr—ÔÙ '»JœŒ\|y¶àsk.+ч+FýZìë,,DçX PhÝ”^²¤7­‹ÙBÙˆHw™v8‘šŸj4ñ*Ç*ú›¤âiwõl°ãu­‚MëSÃÙêý%q=Z¬PKºq†!þ\äÂk¼Y6°^i®È¦˜N²ÿ¡bÞƒÊGt¤1ìö#«Ä£ÎùÅûÙaQÀ‘xTªßÇ•d³D„ÒæðýN“HŸÁ¼ö‚ò¾:‪¶slw3( À.¼G•ìbcå”àÖ±XÎ ©…¨]aèç‰YNç:x`ò‰Š%^û»gi? OEÀ.¸˜¾&ŒÛïK˜¯>àŠ¥fBF ]@ÌÖ¢žéî¡‘–1j$cÈGë‹.°b5a®E| ¢J®oίØ\èŽ €5šý£9ªÂ5ßA\-®ê†7€k‚šO*ïkAüÇžP\&ƲšY„ ¾$ÍÍÏá¬us•¡·5 93Qgpž#ÎlLç¨PW7_²“χšï÷@æ`Š˜9î£y×u•ô¹×=»K>¯xK’Ç•O@wŒ\5 ®¹Fçšp+ô^¨5FÎcŒMÛÜW¸'VÊã±â `Á^<îø/`½#´‘ƒ™ Ü,ݱƒ(~hpšJM ¤gª%kÈŸÒ!6Œëá·bž¸MÁð{°-TˆU¼‘R;–½;®û YÕP| !s,eó†D§&Ô—á(K[ÂEräçÝy¬,ßo± 0RÌh´Jw›šçdÐ3ÉÛ]>Z ‘tmÓ6=Vh¤-èîiïWž"ÕÏnæ Óº©I×; ñ*ÃÄî§£—µÎ9­ØÝhÝtÚžÍ\gu!–§ºQcµ”H®c€I²»hƒÖ´äI=³,«¼3é"ÓÈ «p’³BÜpv9<8whvÌ3{$ßPi T´5;wJ*Ot]]å£8'íBñëE#Ï)Ë|6‹ÍãZÎË=a¯p’s%í¨ž~ST5#ç¹s§pjÉ2‚ `=Ľ?g«Ö:›¹æ]ºD`0¢Í † àP¦´äÛ¼ÌiíúEƒm Ç´ukå›­†ëÁ,cMêOu)uä!o«¤#ArÁ"%½–P9ÒÁë¨-“v´¼@êË ÌŽè7Øêœ½Ç ¥93ë °ŠN.Ýà /'sÈ–Z±÷K‡J»¶vÐS\¼~ž>‰ìÏ"ÉÜ”Ãc%VŸáÁ·!}O'Q8‘´I‡ù°â¼q~@)Õ¨‰WPzUéRc0FUüÂ&PJ[_Ÿ÷xî.©¦’Í“2­„\{ŠÌ‚ì2[GW{Æ*$øzêr…ÔWEÿ£qquGħ ’?W„?Hýæó¤wëås"øZ? è*lðýÍrûQåý%ÇKàÒöðÜîÖ®‹²o/ÕÉé˜Ë¥ jÆ—}2Ü£Âí$ýâųkÍæô‚×´í7RãíÍì}ÔJfÊ€í÷íïG‚‡‹„aó‚ï šÂ]…–׎LÏù¤8:V`l0v>l˜:ÁŒ;¥Š´¶Ï8rHÖ)éð 'àk+çË a[½—…+œàá; š).rÆÄY´£bÍ ‰ÁTP‰é㪂ܳ­“ò%Û¥OŠ,ß szêª%$—KÞlñrŠà®e€ÊIuöìÚï,¿ÄTóI}Z& Xp¾r›Žýêkº)Å 3M=T+qݵS93®´ÌÆMÞ‰¾ºT÷ÚT@¥×Ña›¸‘,Ï/Ë‘¤šÉW¢¥‘:yœµ£Ê3—”…Oµ7—؉1¡Ãš…ð';œB¥[몢9¨á /6„eæ0qš£;Ñ"-8åÒÙ„§vÂf¶1•@AlŸ‰å/šZÁW%°6ƒâ©`€jɱ#¶k'UêƒC\¼xk[T ÊÝW‘޵è&œ³¸Š: 'ÓV7YœWP¿›¦³Œ*AZ4Siä†,×B®Œ*”¹‚ši8796c™ßJŽ%Òg¢ú ¬0Ô*/“fgµkï@X唫¬|@3~Ó%ÍΟOÖéñý¨h·v†PªÓŠ^nÎ f‰ëøSL=¼ó¡˜\ºz¶štá¥Ø:Þ5æ6YI+.wOö zàiTG‘ß´r(Tb%Èãt&!æÊ¸]je¦2Œ^<íŸ&~)£‡5ì”® l'·Ò-Ÿ ¿?ñYq…¯L5ÁEd²L¶³Ts'‰ȸ^µán2$ÔX9$`o†‚Íý¥Ö†§·sNx¥Ëô×k”"«¥‡<Ùåõîÿfеfc” aýÝ ÇÐ µ¯lÕ1®Õ˜×ùyHÇøó :“uØÊ̹ðÀ79“¬ݱ‘ ÿ $•fã\ð­w\Žê[Ð5é 5%Òwzt„ËËäøÃ½W¾ðö)éSü=¥¯"n™ ‹äK¬+¨)zsᣉGßÞÜx &æ¡‹åaÔ :iB¯•Âç‡ý§ò&ò£†© ÁüR¤bÈ!Õ±HWˆQO¸K#e¤™¼èê+Æ¡ÉK (ð´ïàTp:A…àCiQí°ì”‚í¯èG±ÒŠ ÃÊ3jR0VÃ׋ÐÓ9Š™ÇVÁÃ0WBŒÝØÇÿ8¾•%b ‘¿K~}Ô‘å(:I{ã,µŒ³ö=(P=Íë2Z£öKð:yüuQråkrxõãóÚ8?ˆžyBl“ã ²nž3žQ«LrµÊnÜO·+¯u^ã\°Ã£Ó?ƒG_øk&f `ŸK‹4O4(±mÓâ4˜Í±w˜Â—Ÿzb‡FMh0Rí9gVÀ>ÿ©J ãÓm“ ¡„™JOÅ@ÊÁ€\A ª`Úµnç+2AÔÄ;â'òF­¶4/ùB]Ì¿ÒÜöŒ Ò_hý\ß5:)ÊȘÚ}€ ðH4C+£ ·ô¬R­0¾ÉïØ‰ª-«¹‚T[³Í· ñì´dâ¨õ‰;l–[ȶdÂy¯cWZµä‰pDúÇFéÛÌýT®ÖÔœgºËÒz)vŽ®þâÏ4+¶kÙ€Ú%ú{ä±qIdú|Æå´´eµhê¶ 2„6‘¤!&âph׋ëƒQ¥PþBpp8éëÞ8þ•é6½¬‘ÜŠçúL¸+Oë´’z±+Å<àw”¹³t¯ðnO‘,—®•ûY5¤§Ëý#×ÅPïp•¬íe[Ä!Ó[‚0´a5M9ü8‚©h¹6›ºakµËW:VAª*U†NwÐ0tA6Vþná>…fôw#Ô¡¥H®Ž—oÈŠk(©X~î–ˆIü\æÐvWQQ@ßã褤kˆ¡{èF@j‘îi:%i†ZjnTz¨!†N…RZôþ~ßÿo­»î½/7Ö}8çi¿íuögïsŽß´ W›Á.AFFÆ4¨ùŸ8A×­`QÔ¬cö7CcV}íÅnl£â÷²Ï.‘)°œi Í$F†®.:Û•ÔM)*y”ýqÚ¸DðÛãÕ"j5óÊÏÓ®½+;ÐQµÁY…Ô/3“nœL‘©Ó:ëÍò ò^{.È~Ø*ePíXpTn³þ*_óÕ¥ü%G 7e´‹ìzP ü}ñtÝ8¶³WŒò—ÅçLQµáØÔKOœÖ-¨æô܉9Œâó“õÔÀ}㩸ÛýSžÜÁfiÏëé~üÜÝjT'‘îǹö¶¼ {æ®M <]woyyöíFýfé´EYÏß‘;¤RÚRÛ^tçÙŒßCt7°~‡KšËÉ»±£yFké.n†g•­qðmõÎ*|_E;³GúêòôLÅö‡cŠˆen‡UÞŸ«áì±FŸC£}k£}µ… aÁ‹««j¿ªx\pð_X€dv¤ë%²ðå_.wHV$.¶P¹âÄ‹gáPÍÍÆî&»Ö‡ØAó>ëMq9Æ¡p@W$rì¾J^Ë›¬ŒnÏ¢è`b­œ‰†ùŸðbkˆ Ì´CñŽ\l›“tg¿ÍšêÉ5.°Rˆ és ƒ#ÚË ¨9t.Úíæý„ñ§†|7‡öš5Ž©ø´J¢ $¦ÃµT;^FT™òëù'»ýÐzÙ+Ó,‘3û_5›ß¹f@µÕ¯²½âì=Öøµ÷ï#é‡I»aQc¼((¸…±ýL<í%õè7¾Þ苵OCã¥ï5)æR¯íƒjô'ht‡·c¸T­îeüMþøùz@‚)Ho”ç³üå–‘µÌ±ÕÌQ—e&Óò)ã&©ã¨ßÁñoçÚtgÛîTB£ËÃܬ›··_uÏÅà¯4Híí2Žo»IªÇ¨iŒ­­Œ4vy¤ËüꨙÛÓ‡ARYq½"Ã/­«Òþ>ëÞi]´ÈµøÑ½¹òj¦õÖ¬M˜š/îȰpØÍÓ{ä§¥—~MY‘¹ǘÚèdÙn‘Šlµ¨Ãd©ÆþÌ‹›Y&YmŽê·ªÊVwøKÆcMZ»l%Õ\Ó®Öļk\ŽÇîNò•69{Òáÿ½±¢« ãa¥%—&A’žú1õG­ÙúÙ“£bñ?´E®Œ3#ƒñ_H-éo‘<0Ùò!å!AŒ2£¼'Ñ›µ»–†ô5ã®[^NE¤òчR¢œi 2²Ð­Kõ¦ri–;Ù¤¶K„ÅþûÛï¼}XïœÚ|­¶Ï‹¼Ú‹‡ÞS@ÒZŸn/Ô¼-tûmU/;H)/ßò¡!qüép* ÚÔ—-]ú9¡a&ê*vZƒ¦mûXÕœŠÌàÒÉGxoßÕµrþ­Oˆ|ƒ°Ì§Sz¼Ñj,Òæ¬ñãDÚä”Xe~däÌŽý–õëeÓ¯‚߯na<½ü²?¸ëõ°—'úÖ5n¿g«ï,Züb3:Éúv*~ÁŸóÅO*ÎQ°WÎ"sg&³2'¤ x×_¯!º)šæ¨}ñÇ,Ãp o_ûuOÈÁ`ÊSëì9ïLàÏ…mß×€'¿·—5›ËUl¯:™¨Æù`0×öÔ1j¶ö¢]^rùƒ¯6+R«°Ÿ} WìS­A‘¥,b€2ý/bYN¡.OÒ‡œ‡Eižnàjüî#VŒÇ®×°‰/ÝõÃ"õÂÿ?÷«aÙ ?Š^ŒÞ5Å+ÊþëGÜýa;xcä´_Ow}Ç‘:Ê$¸’S‚˜¦ýŸ¡ÊÀD˜þOQàäü\a'™$Ì[¸x\XÀÅ|Пå mÏĨ³`–ð¬|cùÌ ¸A¾®ƒL±«8Š‚!e’1p,xø¶ *öD…€@V_ýYQj`§mÏ{ÌøLÐ¥'£W†³Âíà©`vp!¬Ñ~}ZlÒ_%v[À:ESA:ÂVSb†vµ¢žëÈöXŒ ¼¼ÚúêÏŽÒK‚Nì{â& ìkE–òÃá®p:¸< c ß“À9 /D:`7£`ƒÉE燗õ©E»žTL \vê*…b‡1O\qÃÕAòñ˜pºC¨ŠV‚¸â€säã05`=‡PV2qÅwÉÀtƒgBPD0kÄœÔÿSr•FñÁ¬'®xá& þxL¸É!TÅÛF\qÂ%Aýq˜°·C¨,J¶=q%ï…:‡J¢Â`ÛSþd¨?°íY!>LáÏ‚z³Øß £Ôa “W"ðtPD & \j/†r)L]IÃgAјd°ý½(Ê60y%oEÄb Á;ö÷¨ ØÀÔ•<ü ô…ùV´¿AéÁ"'¯@ðRÐc &üÅþ^å ‹œº’…ï•+ò—+& ®” _‹±üdð¢í]*¼\–èóq>ù½Ø)Ðÿ¾(VdÐ_TôhÒ´¦‹ÄÖßâ:˜£SdBª¥›õÿÛ˜»Óž}‘y';}Gs`3!]ë½4Ú.(Þ¤zïgÍþIOUЧ/E¿üØ.zS|½•+*ùÄßÛ&¨šÃ‹¶ª‘œp€°Œœ&sY0ƒèFÙ‡c¸|ÑŸeSö‡¬é§ï–tµ÷C)Þ¿ÄÙ4Ôà¬1RóÂEÛ¡žy?è!åÖ^XF¥@2$ŽÓó~Þ“•Õ³~ÄÖ]¿mé—Á»=s}Øï Íë-~Ë êÈÔ·ŸzZv;í¿Ï<-KØÐzÛøœÉG_äÚ~Uò|OZ1°ð„# :܄޺L_2i+>ï¾Åÿ#ÚnÑÀ­ûØÓо•Nif ä'@š™–¨ îëlú¿•Ï}٦͗‘3½¯ŠÔ¨é}½Ò¡±áû3ô®þXNU^e×_ê(НèïžÊ-¢xŒnóú .Äâ;?.^¥à±!*'Ä/°¨‚ÑsÕÛH—]úˆYß(/ä8ÀjJÊ¿¦®×Z×ç|èoÞ—¤,.ú¡vRcÂô‹¡býí|Y;îΓ‡*Ü"Ïè×oÚ®u-"`¤•uÈ@ŠþÅ+Nـ܌s7× wGµ…Õ“£³lÖ"ánm­ø¹´ÇŒfùï­7[bYî•%…_;K{šŠv´b•W`> ŒZ»é¡ñ0Aßõ=›#J7nÕÓLI=Jý…ãö49QýKg—bJ:;Ë!,W«Øcs$2&WWÔŒñq^¸=Œ#ã=Cä» õãó–6ƒ^÷Hcã³68rÅ1Òå+-^8Ìš·”´9¨œä}²¬+ÖÕØÓ™·¤›ê†Ùýö×a3˜ñtº=)œ?ôruÏÖ½)³±<Þù;™&›nÜI­ìòO¢gF—ø"ŠøeÍÝ"þ+¾‡»¶} XSs(÷Î °XiÏ«$/ðrzY[§®wÊKzøVÔƒô“iL %ÿ%rö´5œêCù§ïaß‹€·±Ä‘Õèv‡1ýôpÙçRjBQâ¢ÓlªöjŸ¯Ld LmÛû½ŒM‘ð”u÷ñÜa‹ ]Ѷ’ë–Ñ ± î4½?we„ƹçB(vr I ŒGH6fxÌø×œÍâ_NQµA¸èª-tÔÖpX÷Ä(OöN¨2…ÝÇjÄT&o(¥{~}Ò÷ tuስSŠª;¹A%ý–÷#t,’þÉõ›0ÇèÓ«ù×Âìë†5)—áw|eÔAÇšÙU*dYš·›szÁ]{œ?«±þÑNч-gé¼Q¤óÙ"Xs9þ^o³qXh¹Ì»U®Ô¹I 2¸~ã*sݨàw°,©Y&4îþÅ)$\bÛï»7Lé®Î5©S±v¶ÆÝ’Œ_*ê©Z_:%Á{34bsø[´e÷ ¬ÿjÿí½PsP«æ­ÍÉ WÅ+­åØ"áÀyìáïQŸ ÷]FéìÃcOÄèÓ f…øåɪ¹†¯¾~°Í¹þýÎöçÇÌ]÷35e¼JÛM¾` m1رë*î£øá¶áܳRieWöÅpÎÖÌ’ß±í «jIhF²ÏŽ_z“ñ+ÞÕ­|¶¯s®è!Éòçó€JÒŽ[sù­äØË“ánY|K›ü¼øÏ‘|íÞÞóQŒÔѲP­‹"&8'žœc+7ö>~gï¡¶”eó®ºgl•bGqÄ×ûdÊâwª_mþÚ$S¿ß¶¥W.Q]×â¡}m¹æ1ŠU!‹~ý|2Šc ³äÄ‘V¬BŒx}üûÚM /¢ ¢BAƒ}5Saåâþg›DZ~׸V€0‹Ù>{šÉc“6þ õ¡Žøƒ@äáRÿbVÜ5öÇ %wØ]e|ùŒ^mÁHWêÅ ¸>¬a–aú¨G!éO½_§‚~ÃrÚs“M°kÇaµÍjåv[$­q'lS4#9`|jÏF´[;æ[ ;ð'¤*—~‹»w¡"´ý]±j×ZùÎ/;Q¹y¡ý›ËCÏàôùø?OÉbNêã™à#m)zzZñÜö\øJϪFÎbSô½Æ 6è0ä*q´Å“'éÎÙË¡#/áMJâT?K–…;_“BÄôµ%®3´ã k¼öŽ'´vÏâ|'<ÔP Ÿ&¼ªì)~`Y:68ÚòÖü16Ý_fWvb¾ú´ìPžêJý–B}ä8í˼z®¡¤NO,EQ~Ó'³›6xmmÑa|F³GÀîáïsÈ -„ô0§ŒÛà=ü}OŠÄÇɼ^Å‘Mp°+¾€‹csßñ3—Vóý‡5òºÇê tÒiKvÇ;Íxñ ±7òfÙÔ|§’C¾–…ÀÌr$}R#ÏÂ0ÿïV‰žš ñw™b^Ä»Ól¥IÆp,'‚œw;× "‰çFÏ ŸÔ¬îΕŠ±°…ÔΓ}g³ØM€ü1L­ýk]h˜PÃæòÒ*Ï»ö&×Ò\R¨õ£™¹ìz'aUøSĻޅ4­ËZ™[êõwÏÎ/-§!™9°»M:Ö»ïüã=æ˜ó7¸"•rØ¢ÏX"¥$ &æŠ ÆµŽÃ¹ ·­C6•ÔÃ<4»:a” ­+M:»’‹ vfßÜqïøÝx£MWõÕt[³Ù ^Ûû“°Ùå@g‘Ð%ÐFŸ¬¾î¯×zqÐbò'U.g6úæ¥[¶Ou$uCTÒ8B5DþõÖé|V+<$êH\ßj?Yøef¸™áÚP‰-›ˆÜÔ0Çf`u_‡U«è3¡”¼Dÿ¬ŸÉ‰ë×êl/I:ˆŽºæâŒÈåÍìãMÿ ï÷¼m’î@)ÒÖ ÍÊuŽ4S¬g ay»V—ö$1––H¼šµT{µ?…=a¶ê%6I¾r.ŸÜî ™ÖÐì`Þ±D­Ú¼r_çà «¬Ûöz'\âªÂ“EÊ7¾g×4ßœv¿^KÉñ\ǘ(#A/ªü™jvf„¯;w*ÆIÀH«ìp²ÑBîó¶ WR…³8›‹Ò‡R+]"Éâ)åWœ^vSIÝ}á…‚Ù­a•â­~júY•+bò¬´»O ^ÿŽsªšúÜjÀ½ià æÙÜ_•º QÿFÎUÓÛùX†ttjÆÃe;˜~£·ß:·Ï}(páÕVẑ““’0Ö,t]Þ”&’èšѤÙY±eã|0]5k0‰W1×O"V>Föñ õ=á{‡ˆBà ;:íCIÓe‘gdJDC¾½_R#ƒ§’è$0—‹œSZyšÍØk¨ð¼÷d 7¸æ-AdTÛNÿzaÖO¹"¢]nÃ*9Ñw¸Ÿ4–ô]w mŒO°H´nI~qw®`p2•åpKÝÏú° =ŒäåŒb.ʺÚ÷Œ‘îh<ÿVÞä]ã^ŸªE»~Ñìõ:}93˜ òYÅæÒ–d¹£ö:8’›oÎc6MJãG›ô JáóÕPäÆúg†æ\›6͢ʚ›+±—ï­lì—w ( ñ§ŒWoP\_Ìãž¼‰Ý;76sSÉÿÛG3•–.§AluLYŸ™#zKP¥Rà(¤ RŽÈY{öŽ•&ì%ËĹ-ÚòœŒl®rìUŽ–¼sº±Ó†»_–9×ìOÈ‚w8×-ÝŽíêrTþÒÒÂËÀ’£ä9uσµ=q¡õ—#ÒRiæÃjBhoHÍ=Šä®#®Äêª#±í‚ó£ßߨŽ)w•+G±Í”ññ%·×óñi½þFr|º,úIyÅhßR09ø†–b÷/Äcþ~3sîÌz*Þô÷)FÔæ#ÕývÄ‘HΙÀ¦ÍʔĢ˜ áw^}ÙÆ»¬"±5FºÃI}‹ŸÔU­?Í=ôÈߌÖý"&®³·÷ý|Y.ØÇí¯ÏÂÅÆâÂ~øC_ 3–=èM„ĵ$„KQÀ*ôH(?Of;ßÛ·>BMÖ±Ðá¶ “ %¶öàKú›Àëzüˆ'ô$'bÉìá¿L>FØŒk ü¬ÈS°þÀdÞuf®˜‘wTtœÓf%~ÇOðò,šGl ߯9T/:xiÑg½](tÂpz¹¬¯êžä™ed%Þài–iõ]g—å»±—kj èëêûPy‹÷úøì-ìäüžS!o[z¤ø3j2~åìëg2åõ=½MDc!=g²'önK©"™³~ÒÜvŸ]…*ÅœŠg"8Í™ŽºE]’+"Iœ¼Ö–˜e¿0@ÛºÍ!µ7vBÓÞJ+·½X£hì™'càW[½Fd™ÜÞ/S¢5{¦v±«ˆv_̺J¼Ü´ÅîW⮈’i5šgßF:{ T¨î?vÚÛ\3zˆ]±É½+˜h°®‰ãŸÈ 䣷5e·ØÄ8v§ïƒÍ^µ}µJ“_‘•+Ú°î³`óÎêt!Î06Ý"E‰-õºÝ½g¥Ü…ét«ž‘ôÞ)vÒ;û5'Ä’üG~¤W‡t¢§ 7¾lBvGœ­?q ’ßÚ¿º3ß\†™Š-˜ +½“š±˜Ò¼ë –Õ»v m`Mq~q®`-Ê‘ÏÍ]êWN‡Ô—n’Çže#Ê¢€Ád›Ý•_Ž›2úIß^ ÚV-T|äÖx”AÓG˜C-'ŒÙüß÷_‡s’Ī>×]ý–ZZ¶q^U¸0þÔX…ßkQBpü±¦OïvcÀb€¯ 8j*ÝcÅEh1Ûj-ì•ÁÇ.ÒþÝÆÿw”ÚD¶akgöP³ <ú$…²•ß™ƒ!nÌ ØŠó\‹ã³ß怓­}ª?kKŽuQ3–Ì¥“Äs=t‹»Ü‰pTÇDI¼§óIÃuͺ¹ìÁEƒÓžÂHâ‹›»¶G+µ·…Ùàk†Ù`dèÁ,Ò†q<ÖQ15KïÏÔÁU–Y_þqîä"þqüc “'íŸü‚Sô.è¯J2û9VôŸ~Tvëei¾°d±^HòÁ™ßÍN÷¿è[iüãÍw˜èœb|~ùOlï¨ø±m±ðy¥h¿=ÇÂç‘zñM+ù#©Ïû'Æ>_í±’Aù@€¶²hY…RÞDen4#¤9ó€O‰TÂð|à•fF?…g×?•&Gû¹¢?Ô¹¥é©ZÌxB„=°:¦¯Uu¨SÎå5Ãà!ôµO¥‰Ðo.±ÄQü­ÔŽL‘ÿ>ã´ZNt¢ë_C¸€qÞîçh6è^¶%q+:˜eI‰ÉœRÄ7«ABù”u EŸ‰>…dfÚAS™äP_7¡#Á ¬˜ÄÊ'Ä€jîµÌ¦ï5Z1)±EpGl´9•Ž1T2櫉ñÀ1«p”EBAÙ–ø­”h0p%vó $7“AÙ [ÚbbЫ„—½‰½]o$ŠûǬº’t7¶ÞD”D’–i}‚¶vÅãIëiâT@2Ÿs`w+i9’!â´ì¡OÑl@ ´=Ðp `È>ÆÅDY–£% Ê‚F|D1 'D Á®$hr¡U¶,CÏÒ±ºßL8(3ã‹~BŸôžÐ½¹P…rEó…ˆ" ”$xCx(¥WÙrLh:@a¶%Ú `Â"ðS’à D\*½Ê‘cAãLøBXÉJúöм¨žÄ”R'wˆ4‚O©“7ˆ¨SËé£G‹(µ¬‰.d î9}Ìh@–Öö³ NhR¦dlne-ºà³GŸÎž¬5¢‹gØkehAh¯r£Á…ô6êØð¦Ôhr¡½Ýüˆ¶†’Em~BÇn£7+Ñ‘P²èÍzô0€k­ ]`ÁéV›WVÀÚå¹ã@T+Á³ÃéÑ €8°÷ŽQÃjâ@yàÉ.ß"O žN‡æ€´/Ä¡f@ü;<èBÀv·ÑD—òN«ÅDòþÂë‹(K”XÎÃs´: ,“%öá)Ç› hit{ö#š–ý@6´dÚÄ>àqè_X@w¢+µ"É.𡙊1ŽºŠÑ~U®¶RpÑ?ÜÿÓíÒA/š'OؤŸ<‘ü¬6Žÿž£.¶ ã9ã·£j³ÚŒdǦïR™ú£-›Ú«óå„9´Ó*ø£±>s6jdèžéžõ«cú¥utBÏúoKzÑ‚ÝèGç¢â©(|òßv.û3Óî—Ί×y·;¾E:W²Šeþùe^â¼Ë“zg¶û3aÇa÷—C€¹DììáY0]g™8WT ¸Z¤Ùžâ*"üß3| \<åÏŒº×ÁŒÿã—YSþäÑ{xÈjÈŸ.vÏ_±šô§C…™á$`†| Oçž"ÌØDØÓ®'à ¯Ëo´ëÉÅÈÀò½l{20œð?"×¢×"× aQO§õ±öb׌3œ < –Í{•? ¡Ê×ï{óo„Oœzâ\YP‘p‹üÓYŒTX:áP`Ë 2‚½0È©›@ƒ¶b£†.n¸`Vƒ, À`äøˆª€ÛÀ~à aùÌ ˜Ì.”5 cF^=ƒ«‹Ê'aæÁév¡ü¨½ÿöÐÿOøI êÏÄ›œCIPîùÖãW¡pIáþ ŒØÛ9”e‘¿=vîσDú 1òà3§P9¼7{ö N&‘€_‚Yìî¹Qã0ä\O4" ƒ—ÚÝó£` ³W¸p!шDÌØÆîžµ@^‘À½E#’1à»{AÔ-l`ö Î"ú˜€+ÚÝó fa‘È+"¸ècfüÅìå«—_(­?(—ÇppL[x3 lÞH,÷ìôõß 4Òmd?9züªçÅqð¹ãèêþÎT]ôÆ@ó]/fÍ}E`Ö$´pY…,-R ø;sAšþšwÚ÷0ÿŠum:5ZÕ{¦%ä=|.}zúQâ]eÉoqªnŒwK:KSÀÙêÕ7tѶ—l}Œ¹¨&r²>CVîÔ§š«5P¾ù ásäSvë]½ºó58ø|wkð}Áv¾#z¬Í·œ^kïB‡Yc£$¶3ƒ÷CÇ×Rƒœ¿ÍÛnOá±8ok0K-Zm:]ÂӣͯBzœIþ· Sn¤ 3=Z†ú£:ùiôIÚ½ñB;í®”Òéô¿r68@vÙŸ­ëÑ~+ÕTK¾ýª¢,žÂËë†+¾’NÙEþpZ„ã‹ôŒÝHæ¬ý~zk$o<ßþlùíh Îgà%NwkW†¬ô»•ʇóX©óÛ hËù¥XÂK¼-¾føbê0  èÜîx‘ܾ 1H\lÑaæy÷ò•pÝÜvò'õLiþѤÝh€ØV%‘2RCwNSÈ·ZµÄCyß|þ!ãÂPgiñ=¡ÄgS~rÛ—/°‰DQ™U¾î¼‚zËÃRư‰îQœÄzã5÷Yv†ãÎÆÁ+Ób¾{½TÚæªò5ß/e¼úW¿i;3éêþj ot ÙõâóÙˆ€©ìŠšþ{N¾_h²úyÑ–s†%„qB)Ùt_är0ÌÏdzHö©˜hiVö½r{Aàï¯d¬,!KÈ`þdz̓¤L¼0-ÐA¯h–ÝSsîç=Ï þÛ 6¿wUÄšésÕ;+Þ°éó½‰Uvj_?À·swdw±×£áaÓ÷^ôRüHµ2CÝ gB. ,HŽìóæÎʦq¤ÚRe޳î+æt‚ǹeï’ûZ¹xLj’Zlìtÿ=üv·¾6°,®%N%eæ­ã|X…&.%MR†q¸øtI1™m«Å†QÄJ~ô´æ(uÔéAgiŽx ^½’ëź«#ÕÞcÑ:¢'åÜ™ÛÅ/u¬ŒCt7Š“†$,&`üF*#ä Œ¦ÅV¨…ïLá뙫ŒÕŽ£ˆ™Åa¤×«¡ÊOnEI†Nî´ùú#5Jн²`ùãöF zî’ˆåToò¾<âàŒã¯OXFT…cR¡-|åXh†£C›[‹E"^¾ýI”_°9óê&P ×j}ÉÏ m¦GŒ±9Ž>Úß™ž$ŸF{KÕõ##ìLi¾ Œ×u©~þPÖ ±JxÎ!ÐW+ä)Zv û ~q&E‰,~Ý"Êß\-.øÂ÷Õ@yª~ÑZ¾JÜ]•k©@¼U‘êîÍ5‡Bò<ô3B•÷z¾¼!¾ÿ½Ž«x/J-iNÂ]^;ÒÌ ‰(Àa¿ñNY1UÅõc‹ ͬY©"hc1¦HÒl…õ%µÄ’-eþRvJ;=åÜçK¿ F¹·âô¼Zì­ ÁF'6&—qEM:…Eù@"»Ú-«µíNoÁŶ„ÝŒl9‹|z5•kQR7j¡o;KyЉ)iìJm(ùsâ'B$®çÝÿ+0Ûú›„¬ïæŸ>ïfçÍÏ Ñ—ÇTSÏìˆÿ£¨21òÆÁƒüq¦ѯhS÷l•ý÷2¤‘‡¼7éM¦>o²˜¸=­åÖ'bfÄ®Ólšð§ûc´òµ“1™[ÙöÅ“ÌBÞF½¡áõÄóµœÔý½G†c¡¼…_”ÅdäRªÁ-/EhžAQS~mi}€›+îa7ó¥ ´ØèƒL•ÚI®_¯ÍMŒ£ÛC6¯Vv)40¾S‡lø»”㘌MwÙ¼€gµ•õ<Ä­¶Ñ-±åàÚSÔ¦õ§šÆ½ú“Íå?Þ'ÙØS¤C¾v{™ß8O×¥N"¬¶[œ cL,õ…ý›ÌË|Ûïmn³Ì4•ü¤õÄ~>ÎʯÙ=üƒŠ5)™þ&˜_Ч÷ãMÝÌ+Gk5™š`l·ÛuŽõ~}ô ¼{Z©sÍ· (,XI”š\öÀ[T{d®ûØÑNª÷S¤¡3L¹J.÷VÁqÆQ}Ô´Ý&¿P?²^gág{‹0ÚÎÊBàP†¤TÐN£“•›¨ÊÄ)¦£Æ×‹(®ïfŒ·Ömx’Xç"Ï‹Rv²“Í—9Za÷if¯ÆËôZµ°xP]A½»bá¾O¦Î•E¬Iιí¹ìܮ\5ûŽ1uˆ(ÕL½ô¸öº‡E ¥: nJÎ{^×¶·­j•˜L%tŽèÖ`!Õ}ó"°sówبġòIWBÚgš’Wú´^ 2mÄ…É€µnçŸiíÀÄ\#Kj·edƒÿÛÔ±ƒòRLw…C\¶ïáâRˆtìè¹gP~·Jn`ÿ|X3(Ô¤J6+ÜßæÕ鸧õÓÑ}çæ©CLObvÀy<ÿ ÎÏŒè^ñÍ.t^z!‘f¹§¬F+vz'jœô"Ümj2æû¹Ší¾]'K½iw2 ^Þ?$^ĽÖ|®n符ëÝ{†lL•¥ð<™cStº×—èËk"Câ [ãêCB"•'íˆÖF~ÕülAøc¬‡¾Z1¬5.WMåãîY¹J«L¯0› ZKYÀ5À¤%—ìÕ ¼DÍP¹sÏ,n\Uµ¥¨åo±u_ öqÄ5žó ^P–þèlm‡Â…ܶ­Õ B)ºPy)%Y} Û¡Â W9)`U¾ºTsÒãÒnb&T¢8Ë”]éÄök”8M«¡o³Gf‚KÿYô y^¾Œ r´¦®-€!Ë#ÈDù殄T Ûmr,P@Ç$ìç`hÔú)Ù’}ÆÁ䇿uÉÙ'ãänG Ü$,þ)11ˆšvWÚ/mùGM½©m6~Á.Š¡üÛëø¯j>D`’`ï œ|¯"Ú ÄÏ¿HCëè~Ô®ûvû ÅX{VÍÖZ>öGhüy‘X=v‹^ >ÖP¬=1ú“‘öòßÛŽÚ­{éÛF‰çí‡×á™}=îó¡4®sÓ™™O'SZãFÍrºSºhó.ƒ½ Ý•÷ZžåðÑ¥Þ÷‡nUj[›Ë¶¨3Q^b*ªeƒ]§6Éœ;24«ÙYAàY3ç~£aùÓí5óÞ©CcÁÜÆÄto‹`+%›X*Å›ÔrBœJjˆj]™: u6û„5Ý¢3­W—w1f꾡ƒ¯óFÿžG¿1®¢ÇßZQèNdlë>Ò5zwš ¨pµ¼ "±tU³ùcÑh2¾” :*~i5·ðîì—+æ û­O®D~—ƒÁ{Rl0‹w˜ºÆ®3Jvÿú2ÏÏÉÕ'¸ù]_õ‰ºšø•æÐXy|KûŸu]œiÖÙ"¾ñáÈü×å^˜™ÂÁoýòUª¤YLB²lÛ"³™ë‚IÎ鉚A÷‹ >[«#£¯òJ£é6uÂä{vëEÐ1Z!¡Üš8äIÿæžH[ÌßZ›Åøpþ­–¡ÆåÕ Õ×d© ­vÂÿøÔâû•bKôín&ég×Ñí}ð+‡¡:+Ѱ\Ø/6̪U½ÃÓd+6&Ìmîèds_®>ÛÚ6o‚=^¨ç‹ÒÆô™0vÅŒÙuÁäÖt TÃ>c¸¦I׋¾KK5᧦´Ë~óå Ü†CD’v™ªš‘¡£Þ$Ûy\1¦%â㸂ˆË1#n¼g°îé›ÒDè>:™dåVËÍû†µNêé]fl`ÔýÏ%ºÛ‡Úý› 5Ý£ü‹ðïå´ aÛè­¯Y¿’SÏ æŸØ^€|Õ¬r_ãeŒ §kðJ©ÛJì&G4lP—ïŽ3a$óܽÍÐÎAx'îÛÇ1;è£ý¯]oûë¡ïj¡Úyž\˜Ô¾kÙ ÀlÀ:ƒnnò±ºK¸O˜¾ rë{• ØçÁYúP̸5º'­×9µæe½YÖòd+›c(€J2ú®ëÃp!y™“ëoJ¡óÙŒ¡HîlýÀÅ ÅC† Cø¯ÀEÄÀÜRµŸz¿«¤rHÚn²Ië ®›âëoÛ=ˆ×ùâãÒ«Ý+ÙÕ4;„’+µÅÁXNrÊ^òž%V½3“¢4K³¢ÇDWa ûŒàÁXk!NX€HO˜åŸê2òðC¹óÄx £ˆïì6Œ+É™ÜÈ“Æ>Õsq4áH¯,úöÒýVxÑùQ±úê‹xƒ>»kkQ(Þ1îv|Xeºq6j?ý™ÇÈùýÆ÷œu|L¾{2ü¯@ÁâÿÎiàÐ0ÁÁƒJŽg±Ñ Ý2óÑ$by>_¯›$Uç}ï¬óýÔµ ×¾Œq¾·†SûÉ9C®BzÄd–$‚ëtŸJ«e¼ö=øw4æ_2Ía'0e?8^½Û/2õÞ¯7jcD)½qGfþ(Ûígä‹òÚ¿Ù•…ÌEº¦Â?vÙzT¢Ñ´fÖv^Ûʦùîj}‚šãJk|I…SvÃBêvŒÆY©çÊvÇ6ø(¤¶ž¬¼ øòÄ[­iáL¸‹âËyÐwŒw„@Ÿô7À¿ßæ}¥-¾«½½ó/ ÿ›uér÷O½¹Ó¾¸}¯½óc΂éAvûNïàËñìÔñìø—™î‹«¦ã‡ u’"µÏ $;~"{ú¾·xï–©k÷ýÂÀžI‘iæ?Sì¯ØºÍß8¢²p‹Þò<ÑÆåoùf…zÚŒ[ÃOÙÌïÙÆèˆ«±þ“ R^0v‰."dù”‘XÒk™~ÊHéÑÌKeãhþGq. Úš@)ÒD¿PÒíBÛCÃbùÛÐÐ?Qü]Ž$s(Un=N÷ 4±¶ Ž”0(![ÙœÐ65bˆ4BKû”‚‹ÎõÀê¦@[j7bwӣ崱º©ÑáÚ8ÝÌŽ9@ɨÍg­ë™…J§øh`? @c¾@&úd×\ôY+šM»3ÚŸÇTô)„Í=~B‡×Ý”ÝpN²*·-ŽÄŽ4zí$Ú‘›{Œgæ2Á íä™Cˆ Ð)þ52"Tû”  ‘${"ý¤u0?&À ÿ„'Ö£µ»\IÂâ nM´¥×GÄFÛ ?»{(SFÇ1ˆ¥ñ RÔÆLÌ(¢G&™QíJ-ŽôŽxhsmÒèéK— F`ÅâÅÝ´PQb&„TÉpB¤:¹rØè ÀmZއé@‹Òq1mh_@PÌ•ÅE0”+ŠØôY¾ù…#´:Ê£]ÐÃYsž@)—`µneºÄÈ9"2]båðÑÎÚ%DrP¦Üÿ`þpnßs´@V D¡­ôŠÿ?˜ÿJà?˜?Æ/M|¡µÊí#D/Ô´­q.Ì¡™À&œyÄg ÷“v„—ööÓ g¨|n.º&€ØPöjA3Ξ®¹LXý7ê{Oô*oã@ê€g¸!,ˆGilˆ$Â3· kFÇX°¥m'>(ï+3¿PWR Ü5»¦Ç‚M/ z1Ùw/Õʼ¹áxè6Àdælt8s¥ÛÒÀ³7mhm€ ^~;š`ƒ{.pGXQöêB3vžæ·¢-;x5Lг1þ;fÄ­2¶vä“ è\&Kôm¥ë„žR$!d.³4ú‘£Møò4QàŽ Ñ¤L¡‰saÍ~Á¹“G´ÿa_4U-l‡åŒÜ1ü ‘× nOýäÉgÉÿW„ïä÷?MÙ2.uŒ¼ßU骑 ¥ûšváµõ©J¹#l¯zMV{AGùff1•·º¡A2𨕙PøÕvØ™üð Ø´ß¹æèÜ!úþö7Žû;ÙÛMÐmIØúÖìßÇm2é´¶Œ¿þ•—4_Ò|þ?ÜRœiý³ƒÀ0¬àÂL“þ´¨ï`m ó ΞŸf/S€¡…;ä§9˜O¶§`‚á”0]G™DŒ#Ü– j°•ÉÁˆÁsÀÕ âAά)j/¼-i'“‡‘ƒ/ÝaË¢ 2¥®ò(\0,&!êi¿>íÏŠRÉ´ïa(àÚùÌcíqQøT~£íÿ¨~hþ=ì>¦¶Èï±Cø  À*àüøÿ(~£Ëûü,PøÄq}ÔågÈ÷²ÿŸ™c1¤?(k\lÐЩV„® ç»r–º’¡¬á2±<¶„ùà?068ŒÇÎMdFøÄ¥À©À¡'c W‘/Àˆ€»Däs1¾àt—Ple~ÉÈ•#¼ZX>ã Ös ÅCòKF¯<àÂòy˜ð¬KO1,äJŽJηºzÏé/ÂP›C©PuùÖÃþQÿ—‘å­Á+jx—h*FÞêŃƒD¶füÉP½°í™+fø­h:æ|+…‰ߊüïÿ‡î÷óÿÃ{»{Ô,òËû¿ÍïÿrwZ’Īâj‚‘‰’[bíã…硇ÖÂK Ñu£¬)„ôDñWß„´ãÌz1šqeù…´ºNM¥"CèEAÇþ奿ÈöK“ouÙ»|Ò\þþ®\”-?|a燑žb)#d±ƒáÎf&µ½—Axâ_j7 …žK¥_¸|¼·~¿•|fEÕ ºÄw´ü]´'ʣ ӂOH; üŽì„p5¬Ç°–K—ÉmÞà}ÿk»ªý@'.±’d lãŒùã|}žm'N5ÅoÚ€§Š>X6(ÖwÑGÓ½Ûöù969šwñ’CÅåýz)=ä9¨î‡±¥æùú:Õ£MâXS’±œ£Þ›Ÿ3ŠÆþf|ËM¢$vJ¬ ~Qg*¤ zŠO!1TrüU8q%ñù‚·%ÉYõàÙ„,GdÔ€â$ØÅF†(…¡HZ‰I¸z£Úc Π #Ð쉡>¿¬*2ê­d,&>á¡HªmyNÕØ·<-ˆìãÇ¿ì‰C=&(?Ff²— N+lÈ}RŒ›gý,BÕ‹!02R|³Y›Ä–±¿,0n›ÓàhâNçÒçûšzBйÏiªjÇäÄ6Í6ëf3îjª*ïùRæÆ.в­rŸøÙˆ†®¼¸¾táÐUö5‰hòkòæEŸ·1µµ+F©E9!-!j yÖÃé ÖoŠsi´Ù~ˆ¿I~sÜňնÖRÛiøúZž¿ŒV‹ÿÃjìßµü( £w M¡ÆÍ2µ_5}_¡]ß“ÉVóŸþŸz½·žöZ›1çaT+µ”=[gÉúÞ"?ié¾ Ô1Œeµu2–åI_Üò‡Y—÷ä…Ჿij£kÐ[qðÝÑE‡<6üôn=¹¯v5¤ÖàÊÖ²RN£Ãx/¸ÆìN—ßß§RÌÂH'øË¼Ææ+Æ?ƒ†f!âT“|®)ꎮ׿ši¨Œb›Z&':iED÷Z¤<4òóè"£˜ªÏ]äÜZÄoœ™êVƒÚrR’¾ÅóÏíÅJ*½¸(¿Ã¹è7k¦ÝëÃEš[Ëó2fµ\|7ôt§ÍïFt—·' ¦Ë¸¶Ÿ¦ ŒgUËÿNûçGx¥a{k¹æê,)“뻌jâ)¿ º'ƒgV>°f ¼ 6¢²µo«ãÊMÀ^3|Úúù ó˜)IuÛûüñ‡æýmœUÈ nÓ6ÅŒ=ðR<Â貕!g‚Êc±è†Ä=m¼Ú0½c°b§Qd¦3Ý–ó;à5L“¶Pùä1Áêu"XæVn鮣Çô‡yÎ{ß;Vä›Úçz™ÂìeužÕ…µ]”´mÿ…×¥ýµhÒâÍĆî¹ñi)1}fƒ)ˆPÇGüÍ6µ¯UENÅol,m ˜½öe\¯ÿÁäâ„*,‘ú¦z  1ÞÕ œaЛ¶N6n}0½ À¶æó:ËÓu‚À¥\TÖ+—´ú•X³“·«5¸$ß9¯ZÈÛŒ×^9Ë/+®ƒ¤»Ä\ß/¿ê«…åXñ­3Є(»ê«¸½ZR£è´Él–qÖ›^Iv “r²†ã¾[‘]˜™@x' ËV‹ù‰°Ã˜€)HžÛ8Øëý…·7†>Ò^¯æ' n„,-’ŠtŠ7«[).é.YQPÆ’À´tAXÉ|i»bþ‹&Æ ÏN^ãøßžŸö$ãY]ác7gýJÌ1­¨zŸ¢0îŽ&p’èÊ׫ƒó{ ˜äDÌ1uSV|øYÖ6‹³Øsz'Ci«³tãyGõxAgX{¡gëžµo Ÿ+Ò½šú~ ñ˜G3ÎD×cáÚû6·ÍËÍûÙC‡lHê±­UÚ7¥Èk ÖŠµf)›M‘­ýËfù=_öíõš°±+Û¦ÓþxMvãŽíÕdÑVÅÒ„”l߯PÃYD!êÆ üc>œ×ç®,\š!DøÚ×—þRãÛ¸vloŠ]&Ôôi=]]¬)vþ4(ÔJP“²–ãÝÿ*0-ÈÁ9á^¹¦Úu«“9Á,޹¹ŸçOšÙ¶qÍóÿÚ¤=èå˜ÿo@o÷´éÌaÁŸùålÃÄÄä@UaÒÆÇÌшÏCŽ»Ënrè÷YÖ55¦ÆëÓ(êÑÒz¦šê‡y¿×:l/Žüí$f·}T~ªTAJ0úã§·Z†œémÊo=gD‹Yÿ~*}ƒÆ€}ðã‹ÜŒ œ¸Ún¤,AUsƒ‰sã:ý…#»ªq¥ rI%®™êÃnTÌh^o;Ý£H·ÿÀM© õÕºròìø¹Qž¥Dó›¶¶‚“pGMóÌa‡P¦õ†1REÚÊ"Hwø« ÷‘ÏkaΣ¢sb]ýz”–7aù5ûïdp”Z ^XôqêBG´4'[ ëŸÝÅÙŸ‹] ›\›·UB{º5=³ÃþÎØÝk× %Ò¬™¡)®2¢V3Ê4Û /5o#Í€Ð¯é «­šÖ5ñéÝWã#c§¹.áÖš¾’ìS7ôÛVß_òü}‹R†’.fŸ–$VúuhYòÎHu]Nù ÚàO^Ìj#UYfïõ?œÝ€ï …ð)ÉÙ|}¦½ãá̧û=¨g݌ˮ›oá Vú í4h¢áºÜ¤2À_ò2U•Ëü{ai¢ŠÇ~gƒÉ«ög3Wf™:œã¬Ðjh}h‹"U{›yÆ;v€'{="ÿ<ð$E«­U¤g@(€¾ Y¾È.TUÄèç;{¿4”øôàÙšO„ÍTÞ—ÖK+CSƒŸŒ‹UIÏM:(áÊHi`aOùÀ³Ñ“÷=/NÛg² újÕ‘ÿš½Ò ¢ú'ºj-øÊ™2¨*»Ñ‡áM@ÊÅ™O?~2–qDÃݘ¼êÊ¡H¶Ü¦ÏöjVŒûV1qÅ+êʈœi͵{vT¦[“ßl³Ï}Jª¶£Pñ±çTÝãSi ê™ ™¥ütá­)yë2IQéš~Ñ­Aç­^ o¯áºrõ,W-aâaÚÅóWkuøs‹Ö«oÝCC^3‡‹Ú)!aFÞbK1Òã2|&ŸXštÍ'«qí$Ø >Ý›r¼‰.$üTÉ¥Ú)D•#ÒöÐmÜõVÑá~Ó¢¢Y„Z î¸-ÃGïιvîïW‘\U’yv‚)qXwÛÜtbשnisqßd±—X}í¦¸MW¹NæñÑ~q6¿c‚£,¸ùõ£ÿ騅¿ÈbDz{Á"Î*eñœŠFæ—Œ½„èš1ùÕ Hfôö–”Ä(óU¦.d §¸òÈ9i#¸T3´–R«,òˆa¹*sÒEª+´¼¡ç½Nï0è€3ÛSò­‡Â¸ ,ó[=ùi¶(T¼·'…xªª[xw^Å%c»ß¾ñÙbÝ0*T¸GÌt§…ÔþdÊø'~@¾[æ›Ù1¸¬&ll¸Œ¬:º`¿»0÷+ 5"/‹“•´ëI^¸®~:^kr¶ü¢µ–%+‘å…à²ñOù· ÀÐcK?gÌ}[¹vî6Yðñ…ño/Jù?eqPéwÞßN]kjš+έ.}¿WT‹á+¾¸‚D»Sïi6J†baø±m¶Žåb^4#ÄÕWûgI##1<2ÞR¦…7ÿ®H´Å/¸4nÛ<ÚEI ︜ TÍ?x  ,ô¯$ÑR«þÙí1ÏÌâTÃY¼FG(%/%d(æ'·l-u…gÕ¦ùQn\‡¾.'² ]öïÆ†õ;™t©¦§wèà·ž\ |ü$òÇó»ÚºŸP“@:Y쀓<üOfEbý/øµ‚‚u~œxc‘8MtÜ[‘Gå{fVþÇ$I1¡7ðïî«æO³È6p¯MØÇTûÁìv'mhß(AÀ,lJãC"_ä/ÛÝ+Å_¹pÊ )ÞÊ·<ì Œ…q {#›<%¨Ä¸íÂiI}rY×kY··Ë2ÐV—Õ‘WˆòkÉÆë®ÿÄ”ÓEÕZ1q'{î("SMÒYÉ®l _纳Ξ à³ã«­mÍ4 L–dýõôú³>ûyMê’&xøÏó7>cict†E³Ï×Ôþ!˜çÃÒòѤ™Õý!ñ­t‚R’ÒÝq-xÎ|Þ:™qƒ„ÃnšÙ>›-Ô-i#9¹ÛÌ-ùß8¹ë§(ÿÿ÷ ÒÒK,Ý) "¹„tƒÀÒ½”´”ˆ.µ°¤ ,ÒÝ¥Hì’ÊÒ)°Ò¹”„zÞ¾^ßó™óž9sÎÌç‡ë/¸æšë9·yÌ]%жivÐ5€U¸h|¬áH¦®omúóû)¯ïzŒÓ2¦ƵBF/Í*]fø4N«Ætr–•¿ @=Õ‘õó úÙ(é¾@U¾ƒ \a¢F3d‡¾QÙR€^œcÍòµWöƒµUê`ª¡­^Pz³>óHYëõSï²u£ŽjIÑ([÷u“5Q…)Ü®À îƒdµ¢©Á\ž@oõk³O¨­õÓýC{ÓJkNL2²Ò3´T‹ûGØŒÝú¬çigíýêÎÅ¿wLv"ç|%¯û¥Ÿœ9õõq~åq¤DIåɽ—‡ÿáñ–tª 4ôÂÀÙö´èó΃«¢ŒçÌz.¸~žª‡Y2Thó]Oñn|É\‚ ¥¡’™/å~ö·JE—zÂç{{¥C¯‚ÖÏó–5¬ Ch¿ý¦´»ðbEy[¾¸«{¿—RAËFºnÝióRø¤‚ã謟V8ÙL@BÖ×,œå$b圵åX d¼y€ýþ°5ü›]E`f<—³ÜÇ+idsÔ é°b£²Åž§^rÓótW»öÒ#!†æ÷‡ýŽ—³ê=‹ù~ü¾ÕnWk¹Äè{£Ë# Mù_rËdð“T…SIUÇÁóŒðx¥æ¾«×]³ÎÙ?µÑm-÷CÀÃ9UËŸ~ÕZ̲d™M/¹¡Ì5FT¹3VÕ—X^§"ûóøÙöZÁŸz{‘ûGamgÐ=ß…ëÉ@Q™| S(èjm›¥ñúå(€|%yšhü(ìnöº„cñÉŽׯôå¡Ç$ßÝpA‚ ¾[àz}öÿKØzÂx²l\¬÷I€Ý*ú²ýéÆ*°8w ÔXõm#Fšд†È!Ãîפj kLõ=Ù‰ô&Õ \Köã‚M`)$tSÈ’´‘s4AhI)Ò¿ô‘E¥³AS<ÖÄ` $̆û úfs"†$ ãvÐ`L@løI0^ ¸ hþÒ†Ò 4±!ƒ¼úG­]ÿZÝ[ À€K*µ¸–Î(²àj aE>üËà“³'6 Wª*M`Lt–©ÊðdÄ[ÀmœM/t©ÌZBð>Ð3¡J 7ô¦À‚¡Ð[`µ þP2Øòƒ˜s q\#ü7m²§1^`*0 ¸ ˆ(!`¸ ¤Øg =4EXå 4EÈ=ö¯c ˆ‹ c:ý~)>Vä¢rçÕ¦“cÄA>¸´ˆ ë }€ô˜[a- Ã16ΨMÕBH Ðà~(•VЀ ”D«h€ʤÕ4 %@¾NÞ¥ÓBý#Óà*à$~(RTH‘GJÁºq0 €8X7f0g…¥‚fÿuòQ;rq0J@ÅŽ¸q%Ý<¦› <Ÿ>÷’‡±Ó¨ÃclÁ\|q:VÓeb»‰K½PyªG8X:h[ìK¬4T^5Ø yyÐŒ)„Ä4b| á*>õ[À1Á‚7*\e•òxŒªŒÔƒ-“bq¡‰ÖXUè­ ›*QEéV ¤tkõ)ˆS@š€¯ï¿vEñ¨*á‹; ÊU•ðŒZ0M€"¼ Kl(Tä%/¨— „jƒz`i¡| vçî ^r,ÙõtߨRð;àÁ59ÒÔKŠU„vׯqµ¾¤?н#âªÇ ”q‰…®ù“*¹°†ç·‚×@d (Š Ë O_‹½#çjÀ\¢qÜ-±šPå˜1 ¬àMÅò¦Â÷ÄŸ{ÿÍÖêÜ %z.¹ÿ[»@þo¶&|Á2Ó2¼¿ÇàWÌ *ÊðZÐ+­³9=õ¹±v«?ï„Û•Sx°‹¢: PzÅ6%¿ûX1þ;~Üs…M¿JŸKù}µºP`[óÛ‹¹5ûÈnuœUôõ\á½ÝôB(³íÞ-\¯qæ+ËF[¯ßEâËêœã ÔrÈåÞìú!huÇþ lhŠÕ€ÿZ›‰Õ¸X}i†í>FlÂõŸË¥¹³¢µuy$ ú› wMè}W|âùâ§@n´¥®«„"´"ÅÓX-«»-îíöИÂXí‚ÒÝ+˜ ÄE'èÒ‹ÙŽ£ãàÂÎov!œZpgò®B … Bã h3„·îœ(™˜íh «1Ü]-Š&Bó¢/tt7u©uås‚Å;cÜeÐj9>àΤ]„uÎ¥¨b&Ê)\)j §AÓ %Ñ2&›³Ý2q"s äÐQÅZ.ްDàéèžé¶‰¯ ‹"–àÿ/ƒs¶ÉóûqŤ]”®C?S8qþá*®˜²Kþÿ78/Э{DWåØŸ3!æÄ{Þî #âtë\ÃðÐÌðÕsD›hOÖ®·nˆDOÁ.Û¿Ës[Ýc—0 t8|uø< Wút®Š ‹ÌÙUBà#Þ‰Ffî:é>r½¹æ+ ž»#&E#a»ºE®7÷ÐôðÞsgDhdÖ®§®½ë ZÞ;xî8ÌÞ ×]s½ÁESÀ£ÎE¢¿2w]u•]oðÑ"ð¨ÁsOÄšè/ØnˆÀΕÀ…ã·,^]Ón KÈfêžÕê9æëÇHŒ©¶çöÉ误u\ÛÐÔy”l3)­¬¦^Uó´[XÿÐÑDê5Vç}^]àï» ²³ã‰hhSëfUÕ"ü5ëÒfb“ÝwsÍ¿xYHª<ÞæŒÚÚ*Eušþ˜=”¸joër0ÏÖ1j;Öú| Cʶ²#ªûw_å“9O’•øÉ[vƒ›ZœÂýìX‰{¦‹L©Ï‚à?Ý °£døú»Cn»‰PîñÙbËjþo;k••e¼Hb÷pýU3 Û$0N±Ç1+Yj¾±ØžŽI!¿©…¦CÉ«ôÓýÑmïÕnx¾ÊÖC–i ‘¸»˜VrO11ÑU†ì×í¦ŠµE_ÐeÔþ̈‘L¹›¶}É$`ŽéÜ|ÁÐ=Ö€ç/âDêFýô‡šã§?<65=ÛÒ§å™b”5§µšdšWj;à©%YyCo0ê¦Èw·Ih˜õ˜TÀΉiœ<$ä¨~Þ¶¡®uƶ׾¡ÿj'´†û†pÜÍq“ (Õõ-«|cŸËý,¿|†ŽFZ‡cëÙiyQÈhÁ£ç ²Ü¢ANRRÀp«Ö4éÑ¥ÖeáMkåÖr6F{ºªÏõrâ3ljv ¾:új³a#-îûm_UË×õuä•a®9ˆ©6¨ û‘ð`;ø € ª‚uz÷0Ž?i0,Ëdðºí”âÝ(5Ý 6Ùú›8ÝQòLŸãÛù7ŽLS6¦‰Ûü•äô™4i³¸¢+"º+“QÒ… W~=&!RÆ%Å?G[œ#<6¾þ9­È±« ?¿Elv„?\æÛý”ú]UaÅy~ƒÄMÏ ÖÂf%­¡Ò,KÉmW„$3§Häà¬Ú„´[„÷<½93Õü#”BÓ¢ÃüvJLêklڦѰû&ÿwãžàìhí›Ù;ÑŠÇïA§„¢~gˆÀWózÅpt%áßt*’¥Ò$¦ Oi¦&|_×6âܹÝMD¥ý–çÙ}øå„¹Ë:õ'<-íì‚:h|Ö5‹­ß¼$™ôG籺¯‚<-C¸ÂÄâ¾n>yMâìQlifI³/Â]VƒT;iôŠ'Ð8‰>3ÚÐp´¦zÚÃÛUÛh©%ÞÀ úõÉà¹÷D±/mùÙRllæ9¢2÷ùš¶OCÍ—ïà,°.‡¹£à ·º ™wJâ쫘ä³A¼EZkk-žÀÇUzýŸ:Õy¸h4¹ó^£Æ±¦dÄ'‹IW’/L­>Ù†ºpK5Q~sU›@ ÔÈs#:0\E)æ åSþ(©‡† æËuO Cå‡A#„)ãk¹¯K¢¢­Æ‚"ºu'ºœÍ²£=ø¥ÙT‚O¦ÝÀÍ{ß.\LÕ55–dg¿e¸eq˜plQ-.9h¥=®“ÜõÙøœYç3siü¬E¬“H‘VPn°ÚW~·;&$a2Z­ŸùÓ®âöÂÈ)À+KÕÁó\PAûž¾QÜ7œ7õ’<ÕŠG¡ÉÏ 2{¬”¤£ÓIDWA¨¦ÚÅTE_dL£>¦‡)ßåëÝHØ}ö˜ùÐØÉð¡îÈF†„„IÆi±k‹lóº*#rA—Ï¡#xñAgÃCóÒGÁW®vƒÂµÍŽ.ÝM’=¤ü Øn‡îqy8íFÑXÿoínÕl×Å veó}#¬5¾ïÉ”ú¯—ROßü‚wöù‡Ç¥¼]¹]û`| Ž~ž¨GcÒ£-VX˜?LK-n Ê" -y—ü¤©>!XüTØòq/™äÐ?ÄíK¼zhíÁA w¥óTzU]¼÷ôuÍL jþvc>o²©lÚÞøѤB±”uð–^¼ð ¤ÇÏÏjö>]k™;‘™XU-%-Ach—Ø}©Ä—,û¦…ß|çsßžI¦Áª¸ei ýÅ sJZN¬ä—ÚHn½ÖΆK÷¬‚býIkU]Wß[­Û{@i“ .>ˆé‹Ü·ÖHO‚M¼öfø=gK–¦<%âÛêYIˆC—zGl_¶?R Ëj¤YËO[@Ïn1«MÄarœªÇw^$¯™î®å½ìm«š® «à!/)^ëþ!ÀZÖ⽃»˜ Û¼z .MáïÆ¥ä=¬Ù[HÎ4‚—¥Íx¹/ó9¼ùP”Ðåá”þêÍ/R¶ööÈ(‰Îÿã®Ó-}*ýUéóŒS8×wUþ<ûmtÙhÎ1ãý{¡¼×N<îIN.Kd£9¨‹Y³¦1Ù±1jÒ•äõãNíóÛA{þÕ¢]2SÃË3 ïÀyTᚈ¡n?«G×)|¼¢qù²'ƒ›»£\éËÅ# ¢‰üâæ-™„+ó/zº¾?Ss×0.¤ 6T‡La)¥Á-µ|ÔÌÔsÔ¬¢ðÑ‹]ÞÇ'åÎ-\ûäºÏ6ršs®Có£œ8·ž”’¤Ÿ2¶M!Oñ °fÄ·aÑ †¦í÷Ý (ª9ï•¢ÂZˆBh9‹Xûù½zW–Vßù8{“y¨ÇÍô‹|Òz6ö:ò.g•ÀŸ38ò îÁWž}æ“->ú¡!|›À³}IY›È¶Ìc}‚ŸäÙ|…m­x6Èkõz[ôŒc;uÝ‘vëÈ1lýýÁø«h¯cNNzÛh«Zþ¹PcQõ ètˆÕ‡­dä?[•vA6©LÉÍ¥³)ueÐõÙÞ6|–5Ev”,{\%Lë'ëÚúÎÆý™¡ÎMåRË 4>Ë.íøCµ¿Äõã©"׉©iIJ¾9ɤ´ë„¹«?yÅ»Ý&»ƒp¹~zú‘áTÌó¸È 5똲²Þ©7Heluk¹Åe>Œð8‹ŸÑ¼_n¾§aPÎ)Ý*‹•']¥A¦zžøšÍÙçó›\u ‰‘“—Ä¢£XE´Ý["Œ°aûCz¹ÌlSëÈŽ/*YÛžšMµ\Ȇ ÁÏ“(™5gt9"†I,«ðÄo:fG_¥UðÞLJÒÆ&Óz‘Í'„ÄáEÌíÚÊÔì'‘ùÑ:]±°SMž*7oa~ô’»;²R¤pB´,iÖèW)G•Ý uŸž€¬?È2¯æçåâ7Q\Zö:·zÑ;÷þÌÆ)•ƇL~¹õÜ“e†›#§KÉsEÜbØàµílâ{ÐlÉ6#µÜ¸Ô43—N—%CŠÿÍ%×ÛXl¥•‘3mZØc-}Zº)!)Æ?£KÈ㽯W‰$ÕpŹ·!°fT^Æöjò]ê•éó̃Àô…°Ý÷W*8¶BËeûm¬ToЋá¼Y£›îBã·Œw®·”Vµ6¾Ská÷sÿ05–=S{ã |ÄÙYÚ‹&+KêO~aÉ4Øé¸c¦˜´è¨Ê•tÌ•’çT*[¨ÿׯôÙðIþ<WY­"öÎ͇¦ÉsêÅ:›áYä ºRÉ–½&Ó[”Ÿ¹cFêËŸÝùR  ýíWýßÄIš÷‡wì|3=ý ôŽ"lÃêwÏfÜŠ©Þo¸Wú§£”CFƒÕ ’’ÏIÖð;º¸øÕ åÞF2;ª½¯´l*!àè'^3‡Ÿx×YŒ>Tþ˜ž±M’àT¸.<ƒß¿PšXÕ5%^ ø‰îpC¤Ã‘f±Õ¬TvœüË$jß;¿¹ðÛ!^…Ý=Á@3>%ûÜ| %vœOú_é¹WÒe„¥oí‚–Ô¹Û¬²‡½‘SNT”çÔÙ¹ú_ C¼?í:Ds¡~g'Ât Åëò)e°Ù§c =˱4ΑøŒèt|2ŽïZj|ìô“súFëü§» Š1–kªH-[¸á¦Ý?RI#%b˜««Áz“o®[É"×+ÆGÙ?¥Æèç> ÷·¤^¾!ÿpHjíL–G*Žb9ÿáÌYšÚ:ò†¿o³ê‚„_¸’9 Ÿ}—È«²–tîÔ*ç# ·ÎH‰ÙØî¶ÑO1\{WjÚÁÕÐ]|ÂÑÖPåÞÒ|¾Ð,M˜oÀFŒL,,­™d˜Ÿçúù6ÚÅ>¨ Qô3=R ¢y¶+c¸ œY«^˜©Ó4|Ƈ™Ûœ*)ÊÔzh+IG®Ÿº!"h}ôVN­ð5MñþÙLPk\Ô%§`ˆJ@ÞiUª3Þ8Ýû(°ÿìÐ &WÆi¬ý‘ǧ'íã÷{TA¦ ‡³BS¨²ž jèèÕâá0IûÑWY4â¶gŠdß2—"ó§ê¨…¹ˆœf`©ç D½ÒCs Û–M/ÇÐgçòF†Š¾T¿fòÝJVÐkÍ ämöįhêã¥Mù,Ü©‰ªñ'Ó²gtßÜhZo efæüy1én×¥ï'ß-Ö¾*Ü'yç$7nþJsñ‘H@ù’ÝL¶› ÂÃêݳ©·F…J4 VáŠöâ#‚b¦—É®-ÒÞ¾òúÒ|ö\–_?ætéFg‹$f ²îðl»{g ·ºŒÚx%=¬¿H•.îž^·;øàAMé{ö®Û¨ 'D+"Š"MASÖìL_3‡¬aíxîU¼íOµ =v.½äóОÕ,Û•øLسÞ)ŒI+KŠjÿ NØäñIhŸ~KOÏ-ÂÙzDlÁ¤Yîøµm¢³­¿L¼Ì dõ-Zú%…%•¶oQ5…ÂHÜ£J5Pš£×Ä¡pñ²‰‡Øï.­á§J²©|Äo.3ÔÛ¬"]ÇS U=üY~eÖ(ç¥ï|˜y± ±.®Ì½œ‚½Y,ѵjkI’“‚OfB<è(‚ãƒé“Pï§6s—(Ïç äçÓ·‘Ö¬6À«xjÖçò‰Z$_h$$*iSo̎͜s'É7:Ý+  ÛÔl8²”à+”J5¥?×÷°,Û«ÿeõMã>$ÊRø±Ô‡ò0„rbÞƒ»ö êišÃºGš‚¿1Ï\MØ|dæÚ¢“ümL¡1©š?Ã8ýGW»“»Â—Å•A|ùlõ"R²Ô‰óüîJwL`—Ÿo¤•„·Æ§z¾…9ðÝl¿ò·•'ìî4¸½³ä%Ûs ~úFŠ®eù)«s•=é¯é?øGôÛ ®õ渫 za6 ÷ùx{³»«ìæ}Û[Åàk!W¥üå @ÿ@ÏF •½ÑmáªqXd¶þ ÷M¯üEHöM“î­nÑÓb‘Û·µ0ß´ mßñºC*½²ÔoÒäð+3žF¯T_× Ž.Wé>»è~2½Ë :åèÙ¢õ3|×”3žíÉ·›HJÒµ˜Ñ:5Ì•}~ßHôãßVBÒïÂçe!;Þä¿C>žÙOD/ Wlª³˜ýÊ,øƒb·,NkÛûÔ3ÁÞE!{`·ýu%±ZÖ+âªØ“üQö«ú{/ñY\>Sâh’<^Žý€cFbáðùÎ0ÑsÒ·øÀ禫.½û›tSk6—‰òÄVãÉN¥ÿÃó#éÆ*³qÕÍ(Zåm+&ð!=†4³€ó×åcóñGÒ›TÙþ޾…¡©OÁ]YBp p;Öë/ÙÆœ¿dñÕAº@©îAØI°| .R$|¿ƒÃ&踃Ø@øþb=DªÅé Â˜ü;1—ݨܨ귕ÞÿŸùPkŒ ^ãçtv¨§êD3F*Ž´„y2È.¥SB ¡„VE$ƒV6PtAŠÀ,´€ÛH]º”n y™ï„ò&¾Ì÷D¥db¼1.Pk60Š š{n±£{ne„[ëÕú4F7ÆëßY¸(Úضn¤àÂéø”Î¤E)Rj±b8@—qzëô—¥€l‹ô˜±X…ùt<@ ÛJüïPݶL€…Ž u°bÖæX"¨f¬;êƒ $ ø7T9S Çœ"a ¸˜$À/˜1‚ ïaM ¸ Bl TTˆ‹Õ…ÖÀH1äPo˜3F0gµnÇ<°ÄF@é_Úx¢HUíîC €"¡ÄZ éÙ±ÝÀ]@Âjð|ºùËn*ðÀ¿@?>÷²›²#„Ð#s€„ªvâ>(f•U"qTžÊêƒÆ/ém/»iÁå@_¼fp6З°ƒCZÅÅêCW`ݤ˜EFpŒßñ-ý*¦û†t„ƒ‡E<ĨÚ,°Ð[•K‹F,%4Ñ k}óÁ‚¡dÀ"¨0ÆZ–ZùOæu#æ `oĤìïÁ[1£{\x¦ `w*t-‡”Q¹´ÂêA}cš0K€5\bÁka䕊,â†P T¾M©F½SºgÔ†)(ã-ø¢&U£p©¬± ¨} ìŽ #¨öá_³j¹ ŽUãˆ{¢©þöޏ;œÀÓuܸ{ôß$þyF„‡ê·$wüŸúu>Ë`Öð-ü½&L€{‰Òì^q<Ž5òwq·#ñ¦ô‡óvWÓÒ¹»lAî þØMb¸<ó×®k !—êk=ö¦A9+–¨ÞÉkЦ›à¹ª9Ó:»Êësûµ[Üaé©GoC~cî†ý'ü±Ù¸ J:³×%§[IÙåE|€¿uƒ¹SKüO¦` Pͧ ‚ÃÄ F™Ð>ñÜêssú®.¢)gÂÅj0Ý¡»-öŸG¢Æ¥óåîDJŽ°ËžÓ?†ÿw*>+f;Ô\莇Ö@èéæÁ…]ûñÑYºæb+y»JºÖðZ—Å¡@{„gN­sçÛŠ"÷—îP÷×î9îòè ]ùœ¿™˜Šþæ ÷L÷7îù»Ü~ãT÷Xwz´BñoñÚùŸø­ØJÑ.®n†.›ƒÈÙÓ%㔟ç:`á>N‹ÃÓŽ[0‰îÊÿ¶`øÐ‚h\Dœn€nbŽkØC4«.…KZ Î6tî‡ÐULß5Ô}çöíg>àULÛÕÖ5p #Aà ‡Î®¢Š»–º“.aäèxáðy‚^´º«®+âFŒÁí†Î!sÑÿÏL®¯sgÊ®·®¯k!Z¾:xíÉÞÔ=víÌÛÅÓ}¾yˆN„+õR 5áJCçþÑÈô]cÝ"—›hW¸Òðy(BD42m¤kïrC‚6‡÷!|E#3v­u×\nÈÑ!ðÞáóHÄ#Ñ_Ð]M]e—b´ÃðÀÚ]^tSd|(e⢞–@uî m ¸Ã²cK±TÓ11,}=£eÓUѺ9”ŠC™?íýþøôœÿéÈ>(–Ä£gd÷ÎÖWÃÌoM%«8ºŸùoZ6½Ê5­}`œQo·–¨s ’ ü1iÑGWnÕ®œr!Kúˆ±¼@ŸXé q í› ®­£Ô}^œŸ|òB¨uO“ã|zü0×a;=àËGÝ\‚2ƒÔ÷é7?=êJOÃÌéžš‰¾„åP£ï¹ÞI¾Zt5ãÉøÏÙbW(ömÂCZµÁ+zÒÆ1øÖ˜v\ï§÷ h07{sRTY’Yaש©ÔOÆO6r/}74þÒÂâ?o‰ÓòDÝÛÞŒ?œOPàqBȯ¯z%~tÁë-V ¸küìºj4bζDoªÛ)"Ô6ëå¾?yù”àgt6Gäc–½÷ ÔÌŒÌJæ¬?kOy§yxÝ̲æžQʆ¿ú¡ 7¶›¼X*ù^]7ĺ^1+ò5vÈ,ZXõ`þ\òõ¤-$_Œ±ya\ =ø¨‹¼ÛtÓ•‰-èç¾IÙiýùÈ0´àŸSüdX!µ™®˜­þÓ¯ø•/¥•¹ØÐ ¦¥/ȱ§[icŸî8~…Å“Q^8‹Ý¼Ñ¢Œî=Ó>æÂÈ^™ô,6F@šë,Müðêná _Ÿêë«|yÛÒÚÓ-WAn›øþE=íZ‚^.æîgQ¡F…¡5“þàÒªb§Ñ`èõO}L¦0{k@r«.U Ž*kµÖ¹*æ˜ü)²-¬w‘æ¢ÒÌ{óO,\Z5ˆ‹ÝϨà…/í²ž/¹3›!˜Ä&^ z“¶P|ù)$£µ¤3[uˆÊ÷îldJh€‹Â‡·yõ–ŒE3S4° rS¼/ŒÎ¾ù½YT/üÀYzšÞóJPÄ1Ôb-›BÞþU É×7móº^ TÒDÉþ‹Ó‹‚üí{ØøçÀ1ÁpÊWxQÆ^ÕfUЀm­®íÖײ3œÊÚý.½[*EZ¯¦jmk|Q†µÂâÎöS®o)´IŒ£±2yJÒÔÂɺã@uÓ.&-³zv=^‰.G¢9—yîÁ󠆔|Z*Â}Ö>‰æ‹àɹ4×Q…ŒB–5QqŸåïožE³ÀÀ†©%Só†rg3®·´&ò !Š!Æ §¦þS½ä–_`ù_«º¤ífZÂûÙwò¾ùο~ùÊÄ ýNì[ĸ%ÈRO°`ŸÀñÞ[¬ònâfûiëSÍ¢ü¦@w_Â8Ÿ<&¯Èþ0)æ÷ óà ¨»0Éú–ÃÐÙ3M_çQs¢…w? ‡ËûI!3àä6¨+a_Ç 2ì$džÍÅÓ±h))¿Ä¦ðMâ´|›»»¶È§í§&ɽ]YËù|µaUëàkÞ”>QåNVœ­ 69Ø÷êé›ßGzófg-Çܹ¢ñ´‰ç¤² ¯ÆÖ^eë q¥Ô°Zþ¡{\@ݰ88\¨È?éÄ7ô$ÖÛr§:Z™ñmÆ¡ ´î¸ˆâZL¼}APÐñ^þ.GB’qþcë ­CíZòT¦ãH—Ü×’a'½º¤C?jÍ{,ÎÎç—†J x–¼Z¡/uú{¢ÏôíoÉ2Q‘ÎÚêï`Òì=tI¿ @K(•4aëT`«G»˜y‰ç›ÑìD›Þ+R½á†h^ªÃÊu\ˆ°µ—¡‹ÂÜtº‹‰¢ ü{¹¿øû¡XÊë!¤–ê÷ÊrCÈC1Q ðí úo6U¯(9RÄ &Z² ¯§@å¶ÂX­É‹Ö*ö„W*j)«¢`M‰¥ÖÂj…lê¦Ìçðéã*ǵÝ|Yâò’\!1ÙlóŸÙZW;Žý ùè=ò\_ôEú†ÆÇÞAâœ:JÁÐÿN½³ærÀþdãä¨ ï;Úß¶\[4Bå?FGŠì)ŒŸ^¥8qÞÖ),‘¤<~al¶0jÙ˜ôkÈèÇá¶võ;ɵº~KV›­¶2FÓÐÑ|OàµIáÌü§¶g"“íg, >ß8¼*Ýù‡lˆîN…,*Åx”|À·¤w7Îø*QÏy*uUI½/çæñØ¿³lõ–¨k¤”&¡ü"ð•I-%µ]˜ûNßmd×póýY¶q̕Ź6Æv›ý¿&hîœ^H'€š´ÝÏ&A;ði˜0$¬àmæÇL·ixè Ì"|q«B@6Svú:æÑ¢ÜΔo±gTâÕíŸT «ÃZ2êÌ´`ÄAžÆêK\ÁŒ/ÄÔŠk}¯+Ù{]dZ òIù€¬z§‹Žt å°Š‡ ñ˜–P'ªÊêÖãj»ùú}ðëKºöN£‘£NWUJàe-gxšø ×i.æé³ðM__»þESÆýgŒ0°±\Ê#ñ•Ûw1²¨<Ô‚ X-æexÇvÛUóÜT'^žê ÂÇw½¥a‰£ÖtÞ‹`oå¹@†Íj㜠DyË[üÔ‹µÚ 7˜Äd¯ÎZ­G™¦/›œµ£¸%ß}÷üO¶C–ÍGQ[Ù!Š}aS¾\)FG¦Sù\<ÃZ‹å¸%: øZªø £>^_Ó$P ¾çk98Éé™xº5ïeP+dïÈ<¾ô¡^‘2½i¼zÛáÀ‘_nÍÐÃd/0¢'¿¢4Öù*Ï;B<Õ¡T# ÅñÕ=¶eQÃæ[KSG*›ýý²œ¡“µù t¸¡Ž]Žˆ'Ø:ñ sâ7ÐVˆ åh3tŽ6ÁVeKÔ ‚g»³vW÷¥TF‰W¦Í%Ü–áé0-ê(b7îW–Ž;Ï˯?_dÃK~·Ï•³™z|Ó´ÁÌ%úò¨U©«LËŽ¹ö…~f%kÆ;G×ç¼Æ N<Æyzñq%Q%>G"K7-?¾šfÓ—T;ñ/7¯%÷¯-ÛóOÎÄDè.Ÿ´Ï™¬¼¥ùÕ\Í.s×Ù÷±KrØRõ¸"ð »~h’q¥Áô‘×ð\ú Lˆ2v—÷iXµ|}Ôu/7RA7Ù1î,þtâd]ý8­ ðð‘e­…väPŠG§ønQVÂ0obžŒÿ9?³fMíÊͽ&ŠV\kþاÍ]9nñ…|sÒÖ¿ÍÖÓá’¼Ô%¦/YIrÃ<¯žFqDïsÎ+Dh'~OÈËž/“t/ý@¡F7VúR>µën¨žlûàܩ蹙ÅÅ÷kÝõ8™WcăkþöÛ*=á23Æàô)eê£Ai$>þø‚Þe ­1áìð5wôH“ôª*…Ëx|ë*܈¤¡rxGŒ×ubûëZ5.ÓÍ—/×g.ô ?ÎÑ:ÚÆ^]sËåœ<£@m9:ĤÿRmË*W4].»9£]ð+ …¹óxŠ$T“?Z%(ý=ê%Ô$q¨¯;R/åû ž(êíŒOÁfç—Í("æÎmååÍ5Cz= "¶™ÕE+Y>(O 59â òÙœ¥°O‰ÓcèÁ÷£çoGæW%'ÆK¢ùðù7ZõWyKµô‘ró¹Ç{å‘Z{üTæAeí-¢©{••˜£µ›®8¦Ñr+©sdãÅOQQŠQ@\™Uô`žØ_É®‘”X#ÿÍ áɉ„<ŽNÃܸü‚´ßÌÍ]SG:çJ@Ðï·x&­®5!t#Š=¡…ê&vMfF½aÑp”Ó §]Èh2í}·¥ÑE´ÿÜ–)ûþ’çó['Ê™z¦`Â]vâˆ`)Š]O†ÒÖ½Ö>B4}|(9Íö¯Ç{ïÛŠB¤}LÒÃÛ>'È”­ÞeK¿™¨»º;ˆ­Ó*¨üBÝUù!cŽâ¹ù-Ï«Dn_–Uë _¾UÖ¼«fM{Ë{¯Œ«8‰Ç´èèùFéŸ'íkFÈ/ÿ¾7çÝ,ó1À\ýDéæp«áaÚ÷K[Ýͯ¹«º°y<Ú±Tk½&U#‡ÎÛ鲡øôMöÓàqÇ×,c}z„…§išõ!ÅêÙ‘èÛ`›?OŠÝ¨ž7B_åð]k™ïÉ ÷jÍõæ JÎ`vÇAáÙÁ ˜ ù¬êF/{û]¹¦;°ƒÝ]3 uu“’Zúå.Ó*MüYíëpó$8±A©6#?ò*w0©‘죠On”Šy‘p•Øi“*ÇÕî7AóŸ3ÿºÀ®Ù`„ÈýA7¯îöJtvt7WÿÜm±â_Ïy»ÿ·àó‚dNááXÿ9±úôß0·¥‰ š‰µÚßÕVÌÏåTw¤Éœk?"½ôÌ%ßq‘7eò^ÉrkSˆn&Ìr/¹RÓK´z>YF"y{Fç=ߌv( ®©ÄBÌ.Û¬gÑégãØPz²âzoP6=)P˜éžOÞf«z›`—_j/±÷3HCh +âÀ¬[–¶FJy„¿Ï3ÊÄ­i uË·œl™ðÞ_“Pǹ ´n«3HÐõm­;ÿ áNÜC›ÙÕ™&xì’åRì"é!hóúIЙZãÆÜýÄ[7ˆþ×°ÌÏ»¾º°=N”ƒí2±bJ “äèk¾P8®·OŸI/éP?€}ôYÊÓ÷“\ÜáaÚØˆ[¿ÜÔ'í”Õ38R–î±CA`,ób”"ɦŸÜÂÃc_x³§îŒ ’ãGÃôîjé;‚ßãü­îxµ®M®x|>ˆ½‰Gʲo9[ˆ¢~òG³£ÿ,\§ÜýéCöÁPÑÚ¿ÃÇ€Çòß!Ígu} àÃÍÇ£ ò¨‘‰>׸ŽCÁoHë°ï>Û{4YÚÎW?è+"Z¯vŒßÕ þX×߉ÏâôÙg˜ôñl,5Ž>Mý@lŽ>Ý'ºü{õ&Ÿ¦¼ÆÄ¡Æªªå1‚„(rÒVcI éþ‡˜!±@׸ê{²ßÒT&ðeQég*6Ð !ÙG`©¿dŒaG„ïu0€áÀH€§Š~ X ”[Bør§ßl˜@ôK¯û²_ÒõyªfY$4 fƒ "á0|ˆ/´I°ƒimê`3#ùÿæNȲ0R+²v÷àe¾+ €|øÚ%Š þ;êf"=@*>Q˜Y•@oÕ(aÿ%EŸ¯c>Ýš§r#X;­2k!ŽÛH ®v©^¾´qDÂU…[0tPkÕYKˆ2ô6ÎÆ…§Â­:kUyHŽ‚ ©0I$7¡š È‚㞪 ·a¤¡‘kA÷˜fÕÚz.bÕÚæR¼ÆG~”³ ãð!#áø²83éq€€¹5„ü‰0äÐ[+ìshâK'”š*¤HAzS Âþµg&Œ¦@‡ñÄÁØ0Ä5˜%Fð¦Àˆá, ý&¯mÃì&qPª…øâލ&ÕBÀºi0Î'X7 †° ë¦Â˜d,±й—&B¡BÈ}Ø?erjX7%FÐ%*´V ¶†ð ­U/- ôÈ%ŸÖ åž(yÕU|H 𘠔Yë¦ÇDþM²ü„Ä-¯¥S¼ŒxˆÁ…Ea¾üåæû6(á´ñ¿ô¯A¿ú/ƒnýÇ Ý­°Îк—cXSh]ÌOX+†Ðfùÿ4hwK¬-ô8¦YèZ I¡rE„åü[3‰»»_ê„2P"h\K/Š»»ÇÕˆÉôÝKº–BúªP¢H±òÐéôµ¸;\ðlz4Îõ°Õ¡÷DÏ_ƒ–ùoƒ^þ]o9Eƒs®ø¿2h‡ z/ÖJ²÷F$p°$ѱ¥Ü±%ϱ¥¥Á-D0lörolΫA+äÏ Þ鸫SÚ¥ØÜË–&s‘,éëì†ÏkL’Ÿ¤ ŽtêîQ8°ýqQsJWÅÒbf¶Yî?ùzF:ÉGf¨ÄwÐÃÚ)­ög/Á‚–ÓZ¸^RA5™z_²¼njÿwýÖÈUh¿©]OYþ [ë‘¥<Í<‚·‡\pÇoC?ÁF%º†”ƒ$õ¶¤!Ä C~/Ÿ&©{°ÐÎUhœ•Ã׆;1p ×X¬Ç‚M¢Y¸ bí¤nw/ßjWÛŸù`ÛææNj‰|¶Ý·Ÿ’ðvv-¯-¼Iÿ¤.}”ÊS#5ñÄenóØ—¿ºü^Ë}j$Içýúʇá1KñåÀÜø•È/>~®_;&—Ì^ zXjЧÞ")p›ÜK_åÍÞúmxÖ°iÉMñå¢a‘Óñ¾PÉšû&ó“±Î´Ä„ÝÑÅn$C^ò—EÿRC}ÍÀ}=ëFÜ£ÄÞ£rU]ßÊŸ#Ÿ°õ-Jt Œ)³)ä"¹/!M= 4DᕲSàw £ðæ±Ûoº=ïºÖg„žoÕNÙßÝÆO… x¼ÃÆ> ÌïaLa{£N‘RáòvxãÅn!'õN3 ò®%éE€@û†m@zH¿yGœ©²#–€•ÄÍ#ËAgú‡åÑ;¦u©°Œ™°ö›ª< Á©4·ešãEoÉ®µï’òûÒ=œaŒï-íva7ŽÕôd¶\«-Ñ~Wl ÄóiÁëÌÚ‚ŒÃ¿_jL%âYÅÌ™¥m_VÆ0E²¼—lª==ðF¨ÎO%¢£s›{,y#œì XIéj6ë¾¹•j N)øµ³Ó³Ë0h°o ­¨oá‚™×¼`ÖDKÏbÎÌ?âÎ0NÝ{5”4«wêäýçAÿê—Öºš‹Œ¹Y› ¾gAnÑJû§íéXÕ¶¶©Ú a!œd‰_¥¹2 L ¾üb¾]•§K œI¿Kê¹Mˆ/-Þ÷† -tÞ„\œû®!væˆd¸Þ‰ëôÔöòÜëª`s.a”D.ß­?ã«Q¡½¶cÒô‰06ˆ8+´8¤»4m!Œ×Üw>–ÂæNö­ïºjIŒïëJh³ÂùÃ?øO¬HÛ½ß!ÖNh-Ýy%¥¥Ýr¨c½@¾' ¤ÞÑi–áÚÓzUó‹0œwF"Ö®éY« ñ;¯{etú}KE¾V(…¡'‡l+$?šG° ÷+šŠ)K#¦´†*–g=ª¦Í6¥¦žlÏØèã”û}njO,]ÁtU¿^TÓÃÇýFMzŠŸø¶øf¹\…*Œº[ª,@™É¯±‘¦¦G¥ Ïx9‚>xó[£Mè¢ÞoæK‰ ¸?„Ÿ¼Œ„*-¸¨÷#'L:wÌ’¯ð™,_¹Å°ö—$Ö¾E[*ò%[Õ\Gúˆìnå^ñåï ´é…Ý$]¾dر,~½o˜•s|Ö>ýÃç¼ ÞH+éîÑ~$ç7m–ågá1‹Ùûž‚UÖ¥ÙKIŽÞ­°ùÛ8+äÔ·æ]éàƒo¤OÚPƒ>R4ò„õų4ÖÚ1÷ W¤ÛÎr?ñ棟¹Ñ|pÖuòcÏ’9Ü‘³YÛç8à/üq¨VÇ``az2ÈG¬1mðë¯i?5]þÊO¾iQŸÔÅÛiv“ó$ÀÉòAv+,6Z;ÁöÂ,yDûr¬=<2bõ³xvzùÓy5E¸m¥Y4»¡ð×™©S{NÉ|SÌä:™ÛÞlvkû¾ÝòÔJÁÇSó” IqV”ퟆl–ÝcÈëøúлv(7{ç;êů­Ï¶‰cäí5}jyaVyOë\gf=ê†îÕ/M°ÐtzóÈëj‚·Ò•>„¶à˜#Q;x@o1)ÆãÙ•AÏ}Œ~ëqÛc½*MurCNÓR.Ùä˜×ôVO«“‡:Ø|êãYÈMþÈòÇgš[ÂdcËraƯôŒY\â†IacF${:k¸æŽî7­„Z!;kåŸÇ+Ar%‡k¯ëßÔ¸n Y7JK ·°Gª={*NåJ¹ôË žú(ÕÀíËdIœýÕ¤ßóW¦KNTï˜9¢fæjƒDˆLf¤ß:‰,݆p3‘LéÓ‹ÙÆÿç¬ùP›.VÊõåî©YÐJFžãÈŒU&ªŸWyC{+^°ÅA1T»f£´ëu¼sÖ–ˆÉ¯¨¶ì›ÊÙ[–7 =Õ_‚Ó:YúÀ` é&¨´¯†ä„~<ºê™|ÃjÿË"íƒ%OÔæù· =m]{ƒ8¿©¸oPTql¿ànÃ…m—¢¿V‡¼_–/w^à(8HÍ7 X®$2‚Å¢ˆÃxJ¬»°†M˜d"ôMþ-y“N]b“FjF)˜dï}õ¢5ñÈÔÏ„¸Ó³q¯ÄáU*%„e]cŒliçëå×,E÷|x”3dOëÍ–±nÿmoýô°û*" Ý = ÝHƒ4 - Ý-©H7ÌPCJww+9CJ7C—” ˆÜ÷ë{îY÷ýñžµÎ¿°×Úkíýyžõyžv§ºhtõ†œ4ÍhŒ‹CåÞæ„US„à§v‡*dcýrÞúj”c¤Æs1Óñö2¾¼¸P><½Ëzº¨ÿ6g6îé…N·eÒHÖµÖtÙTë’ÅàÓ~ƒîördzÃoqS„cdç§ž¡CGè(?­v½ðç[ý¬TÌKý$­õœ…Ü<¢wRÇüãSº«‚­è_÷…UéôÓ$Øš¿« J(6y}‰ ú¡ŸvkoyÈaY‘ÁÚÿë½%á<[Ö¯ø÷7lFcc…/\ç¾äÓë2LáS]¯z9²Ó¨ïÝϘPËj‚øl¼è>KU3 Þ0^ª”½‚/@ïf4…ӻȪIÏÜêSò§5ˆq¹‚íýv%§¬¶6£âfÂÆ|àºDsÙŸµBf•rNèµaºÉß§ºA8º“зƕÏ+טL´ÚD“¦Re$qcq/Çœ—×:¹ŸyÐL»¦òðRŸ°ÑÞ_¾•I+–ÎpzÕ6³ïéb¡È üì:Ø!Ñhõ1ÆsZ¨¹_'Gl«U˜T”D†+]<µYˆ‹žÌü¬6©Y¹k£Ob¨~œ”ª%ª ›Sgº¹lÚýéfŸÔ6GÐÛ!°1û‡HÒ¶gᤑ½Ï—»¤&ÏMãÇc™¨®þ>î«MbÚÙ5G5ƒ1ÿ—k×ÕPB%ÐŽ*¿…ß ÉWQÜýýx5×ažLS¢—ï3ª‚Š%_w8íc¬ù[bœ×‰Ž ób+ñë hÜ£šÜ_ê¬{˜h’yÊú¥§?YK[R(vØdVj°¸Š‡°oq(t‰ÄÄáää˜wn¤ÈÄzáSC#¢SCç‚VÄ,PÛºe—¶Ž>Fx°•Œß5ÊÚÛ%þæEXªZcB窣ڜò÷˜EãËi³4GñZ[²É#0¶›¨õùïÓ¯Þ¿û—SpHúúœ&ÂÐß&³`õ‰-êa¿æ+÷,ÀÞáIˆ1×aÁ£· k³{¡[+Ú²›Ñ½ž²Â2dæØw;m{fU,OáΣT_çj©|ü2m½Vß^úNÿlÜÁ$òá¥÷Àp™Íш£íy_¾€òk(FÄÆm‡CkIú°Øe¥õ«[Zêê¢xþêH4šžBŽå†p:úf±¯tà[™žú ñ„‡x9N,@@Tîî¶ÃcÂmiº/ðIèÂVæló²×ýKÅr nBZ¬²‡ le{B'–+ªØ:¤îõN|{òIÕLY€+H^ xTaÐõƒ·íÛ dKÌ¿æUÏÿ<õ¼˜þVlh<7w[—@ç!÷óïÞˆë½7AzIä±½ÈàU×õ’ú;B®WСnÏ_w¤jFð€¹Wƒ1ýCÔúà¦÷åYÞLžEIqìw{­Ñ&ÀFg`_}H“4Fo{É4eµÉVŒ·êÑ΋™£tµ•Èiw&™DŸ+~¶úîj;öko”r5n,Ÿƒ·~?bœç­v}¼U`ñ@zPi;ðÁo矃Lj¹4^S.`jDŠÚ“‹²øñç²7(¿~G*Cæ¿^~ÕvR×K%‰þ CDS)J÷q!µéaͯ+ÙåCŠÄp6áj¿@e3!f/½7.P·‹xkŒã™iÖ8ç7/å]XÚC³¸“i#HdîHçã¸IqxÛúÕõªãÍá\!v¢éÅ»yw·g0÷ú†Tý£%k;g¨ÝNæ$Ζ`³ð»c¶³ñt7@ÕÞ0¡×Òî-±¦¸1$†¹ÂŽt»2¥—œüf11pʺ‹FxÄh¼) £n»S£œÍ“i4~1ÄajÙð[¦Yt}õº×#,ï9wN´(‘Ð<š!L.)W„öìI†ûMp>︮´uQB–†—}ê´£HTÒ9Ñs%ÇÊL×`,í4–©Ú…njMçÑM\·mèçÇwZìêŸ ³²IŠÅSÚŸ¨zuB7AòA(¬~óQëÈ­!ú¨ÎÄê>Xö‹ÏÏztmwþ€å¹þ¨þ)ÚÆ³é¯Ì8ðbv0±:y‘u”Üß¾Ý|šoùu¦u0uDõܳ\SZ| XoÙ#×AвµÕ"&“|[ñí”÷¸sØ4k‰‡~eìkVéÁ·˜ÁÄÖæ„»ä}øâçÙÇ[¿ÏvâÁúâú®v_¨®õÃ=?UIË ‹s™åŠ ûïéû¦$dÔ½Aõö¢Öò^öZZýI§Ú»åÞMÍ'W*x`œ%¼ó¦þÛtIuwÏpíÂýÀpðh¸¨J†ûè×q™?ú•?‚Ìç{]´Ùþ›"íQÄb˜Ó&Uö(óUêXº¹ïÐóÝK›Œ„®þ†“KC‰ƒ:Ì¢Œ¡\Àöد󘵩›4XE8ñ°M¬EYœZ;þÈ//vr Ã4Sh,а©¨`G Jy'˜‚š‡­CIáNÀŽTÄŠèG€Õ6bügð—@G>*†æG Ð °­€ÿG&˜zI I£I@¢ê—ìð‘L íjB¬1£È yPAcXY渥 ¬ ª¡QÖžÙÀ[Èž`X÷ ”¾Êê‰ é±r@/¹á’@ã/ÅѨ\·ðþ^p,"•¿Ã¦ ŠË\c‰É C ƒG3¹mÍa¬tÁCØ~&·õ¥8ÏîN ëF¢YA¿À—‚pOÐ/õK\²4p"p !†OR´T‡á‚Ò ôÉÐçd¢plVc”¼à¯°º¬Z€d@IªÛvY¨"f&&B Žg¢v`o„Œ ­@'Ä¿¿<ŒHÈ? ‡…£œ y0tDfš<ÎT̔⧂yàDàÆ<¨æ mŒç} G´z#ü Þt°ÒeDC²ãðâ%hJµ1 %ºb]ž„bÃåÁ&ˆfX.ÄWÀ˜å Ì$7f h!”jI¨Ð¬…~' úÇ+€Q™ÝÐ`¢Y¨A}æ+@TAx rÀÑ;Dcn0ܤŸDcÂK`9PÏX”¬{- ·u¡ñáû¬þI(cŸêÌú%œŠU| Ïv ‹3Pc° O(6Dªú%(ßö2˜oyi ªæ[_úƒÆXo1à|‚j—¬ ·¶Û04¤wTŽv‚ôNËÃÜøoAp5pïzb zIún³Ž„ôNAK€¯ß]*€ª€·$p¡ ÕK2Ðk]VÔT柜CØ[þ[V²|`Ÿ©õvFq8å&…Ü!0Ôï‘@vTâO$Xö]ð–^ì³»ÄÍÃþàÁ?øˆir0|##Û}|ò?c¬Kª'O²þÏì1Nnÿïn)Þû7ó-§*‰ÒcGžSÜȶ€b1¿*)^Ɇ"žè¶Zîñ!¶‘BB¡Í- üßT?cj¼û¦Ya|W@À¤Z]pþëþ!¤/Û«ôÔåÜ弩Çé´ij\Ö¿Ü’ "V#%%á$æ$1`”Н'-Àý*T’0U+—Ë•+½Çÿµ©R®`VOiI׿8&ÙˆÿÙh1u?/ ßªÐôc…?‘'–S±—µW\Š&–_ ¯§fŠÿN,Íœ+µ#zæ­åÚ ùK×mýç… õyß‚¤(o*Ûކð¨x1Y · kNÙj6RéQñ9´VÁÆë÷?›º}µc{G}Kj¬k„÷×ý—+;ÊæW.âK÷dG×Ö+`Úóu´î0AÕ×›ˆðMÌ[]-DHì Œ¸ןæLÖ£g)?éN°dOÙŸYÞ HäÕ©àŒ˜ÔPIàN¥R÷Þ©Î…ÌM?aI·›Z—X’cðŒ)]—5EÍðZ^sô¹¿{DÊöeZÝc7jþÒ^¼?"S$ýæ7šÔî;½7æ’‚‡ÿá³ , ¶ë >RV7/-Q|®m2νïu[V„X8’Â\Xì"GVN…o;(q¶êé1•Z@^†5^#5æÃ2J+ä±¢1_”Mìú¿µ€F¬ÎzOΘ®†,}ŠÅ«ºô5Ü2–St\>~êÒµ½/XÛV~øÔ¶ê+q¥ød¢”?|ë:=k05¹æ¼÷ûÈ:R³ L`4šÕ¦ŒµWŽ“æÓÞ.Ç{Ê\î%*5ÊQˆÆy ÂTW–:Нa¾y{n2³<×ùÔÔbâ&Tûg¹ßyŠö {u„šeåEs8\¹Ä†à Z#7hW;•¹¶!ö¼£¯•Y£.O¥‡C›¢±®ßK‘;\šh‹Ê.óÈW>Üæ;ƒSÐRŸ:ΓççE|ky=']“až÷Žýç˜XÚ±á7?OÚϼã#-Œ^ççÆm¢1 …éÍkŠ–I{–=9I•{ ½)!º§ƒØ4ù‚Ä6Š]°±NÝÁüt¸–þÐa½É«“9cc{ÙóÛØÍ‹ä‡šÙ*æNžQ´Ú{°ÛöȪo´ò$éK…ŒÔì½8Ç.-‰•Ë“äC~¸€ë¶ú§4™ÎaÞüg_qܪ ņǦÅΑdC…N^Ú” ‘><xlŸÀN‹\>&ãñ*é¸{/–éè­‡>g­«({çØyô[w#7ô™‡øÕG¼²ßjŸœÊù}âó[‘÷ñ¦9aôƒ Íl‚â§‹i9Çò H9öÎIØ›L)v)­q+Ëø%-9Ç œT°x@a·oi–i\ƒvi“òRÍ—H§Òq¬”Íð#d g[–wû·¼äÇYe1%ˆòè«[AÍR¼™1çÑ©ñyB7O½±ÖOwkÎ’À`ÄDë±”UBz Êýᯣö†[©X¢ß JÆKwâL ‰Ë§®ƒÍú&§Ñ·Ô_Îàí1Tôõg%Rý”½Ûu*‚(ÑäK9ÿFaDtºJv–<Î|С˜¾Aõ–ÿ‰Î;»¶ÎÌ~1ŽiÏ^ŠLÓ£7ï ÌÕ¾†Ïn¸BÀn©èÎ!£ÅVš’@ ¹Iÿ¡ÆzÅcôètóâÄm„:©òïïôúž\E[Ÿ[™È YMd—S¾&’Nöâ=,ƒõã |#’¼~ a¨•é Íù 9SâE²Z¦ØXý+E¶±‚í9zxS[“ï…ã “8=z}w·Ÿpsü•˜šoʸ%JcvÓ2Ò–áH[Ç”w™k^8_)èÕwãÚi”ñÂàû Ú¥_”IYφÒÂ$wå}‰šgýuå‚imv³°ò)€r~Tµà‰PM.øv¹5áËâäwº'¼|gŠo³^Ô%’{EqUÂt‹¬ÇfטOö÷÷ó~M²²Ù3Ÿ¦²„I}¡ZWûÔ½ÂÄ2^ªg@Äú÷ÙTì“íy¼šRj­ÔÃW)œR´­É«Õ†÷Ȩç×Ze/.„£"p>åƒ^Å“þøìÓ>K#Æ*Ÿ8îf¡SH’,.‰ò÷®ÿB½#±Ú2Ô{L!á§ÿIþÚÊ鞃sÖ¨ÙH÷ÚúÁqßa/K=ò¤u!®†µ+Cxý³{äÅfx0¾í¾ï±¥t!íZËçß–|„©»gíÛÃ/슌˜¬Ñ™4‚yŒ:Ðç·WÜ)Y¸ÞmÓÀE’8°«ª ßDÙæHÎ0À?S*víÜ!Y˜G¶ }ö‘¼G^ SÄ Ÿ-ŸèÓÄ„x`kÄNÔT[¯ãïÎãÛ]j©g‡vþŠÞ9rg¢íÔ0îöŒºp>ólèà5)sk"ª$/•s¸´OdYÎ ´yzü cZì—VÁ˘õòâ¨q 5a?ãk_8‹¼‘œÛÛú½Ë­¿˜~*¨QU²=î鑆N9%§i,Hgï.j J£Œ‹`ZØÜ¨Æ«„ÐRfŸ®|3γ™ñFWÖú!®9I 8ÛC‹íõSq«lw@‹’2ãØ.µÆ„ÚÓ¬¸b«nŠëï7õþ6ìëšOž$HvW%Ò˜Ží11ûÛ¢ÇuVvG/NŽLx÷ã“Aº¡UˆFEÝWù×§6å-0­<3{±¡“uº}Múb¯XÝó‡7CÊ4rc±ë2!^19Nè£úøñ…?ç?¯#ÎÎÒuñrIÅÚc0ßMµ·D¯U/ùp{ ~Åäìó²|gç¢rùéÂŒþ¨ë'îtó’dcòwp#ÎXíŸE …0ÀíÕaŒ³ÝèʲÌr¯<š°Ký\\wÚ)¨p~òmWà§3]ŽÇo5Q ƒ”å‹rÍÕê š°oÚûš‚aN”S¼'ÏËV®Rí3îÝåçûe!#S9µIWг8³Ueá™0Ÿj—œ@âÅàgÅßŇ4ø½Išvm> Ç4šQowÔ7Órî+ ¼.˜N!ˆ!KæÉ$0ËGïß³qøg± âë8aßq;wÅÂ:¬ÿ&wÚÇøp¹ þzÞ"ù~ùÜŠ»‰¥æ¸…ÍB\ Ê÷Òðåw#7ç˜(Œ¬*î1¶Û(Eð½Y•ÿ µ¥Ue¹ØG" ªm²õ‰ ò“¿ö3€™9;¯opX×DZu& PÂ35÷¼õ³÷™ßw·69ÝÍ„:LÔ»kˆ–ã7û¥X97˜toÄzÔ9Ö]Å1ÍÃ>6¢‚¥šoÞ1r®§l¼Ýòý­´5bG×>·Å }|_šÌ#añÆYôD+¦«Y€àæ–ª«.v†SVîÄùçïÇ£»±Í‡¦Ú¡[ ŒÛH8}*×%%V’˜›TŒB;=Om÷IšÖ%Húûë-Ó3·žˆÑ&²{‘Ÿå21a1¿kËM7«ªMwLÍÝwÔÞ:˜Û(=¥?ü´1?­rRþðõøû´(Fj@%3N„.U?ÂBxôL‚+Öx4—Ï·«›÷ãTæó›aËÔ£2“ Õ䨅RÚ"”¢5{‚œ1‹»Û| ‡Ã™:*^*®ûk±¿‘×ý0÷|îê*z§&AÅÔ–k0BÉ—l°ét¥ °¨¥û>ÀåHÇë 7r;/«W„† ŽòË¥G/Âûï#Æ'󇺇göUêk4ÕtÿîÊï`PgšôPÊtʪ۬Kwm¹`Ÿ7¯ONœºT9¶)\Zá®=îJ–LâЦZÝ¿”ZƪÆ2-óxi\B},U¼µIJíׄ„8A×MeÞ¼¸Ôhk„>Û¥nȶ±Î4‘õ£ÚÐù™3Ã?!ºdÅ@ºìO0E`ÂË¥úaéJ”b™uZ×Éôúøíïg8{wfBÍ\DZíV²½ý0=·á|u™e•cËoôau¬Å™“ŒÃðŽ%Ãü SØ}èÏCVˆö_t¢…ÑíüRH.îkó•Û‰¸v“š–e­_¬öCl6ßãÜ&’~¼ÁVÊ¥3akÛÏ ìPl“ÄgÙÏÛñíØ¡W›Íùv"]@Ýé¶žg º åuß ¨Qa±áiUFÒKvýY­¾´4[og©ìQïxîÝ~\íL•«*±žø>"3þJÙô8Õu!]ãçPû—@ûÛ6tr'ãz—ŒG–5]04Æ1Qh}gNáP*ø[,P¸Ï¶~ý̧µDé\Ò¼ýûV:°Tê­OÂUxcY6êQµy“ê¿~ê¬IThIY/x¶Ú—®a_ BIg,ΆLuæÜaT1~#ðíöð·8î½\ê—d£Ì»S£oÉ• ®^ô}ÔÌç-œú ÿWùñ¯äëܿx×ßÕÏÄʾ8D<ú5\2Œ~­+CÕñÑk[,òõ*íöåD5€ÌÉ".Çþ»…7Tæžï”„x/êúÞ—„Ü~âÀOþÂJj6¼é‰‘¡æþ<¬³TÕ5¬ ðÓP(Sù]ÖÕ¸7H(SŒhêI@¶_á„0A ‚mhOp­ç38°#õ¤ÇÚƒš€Ô¦¢)Aœð* b J¯bõ—†›" p´Èí 9lA.€` À%3ÇSÑš +„ ÊBÉßa#á!ÌØPÌ 8Ä8 í úÅàAÑ"¸-={€¿;’P°î”.HTÍó5ܲ§zù¾ q…¡å@DÆ0] Ä5¥8üœL¦âÊOC[‚¸þÞcQ, >T¤±Æ‰ªÌ!tƒC_Ái@nÉÅé(kˆkÆàÈàT±*Lä”I®Þ˜Ž’ù©^ŠÁo g©è HÞ;Á·06„Ôš¼Ñ_œ‡ÂoŒ*Zë2£°@OAx¬8‚ÓnXq(˜>s†’Zy¶³3m=“€– È;8œŠ"[AZù; IÃÀ9¨`0ˆèÃlA¦î4(-œò?ÿ¿ŽÉ®óã÷ÏB=ƒuÃQ]™ÜÅi(!}*TN¡‡‡ lp]°¯€¿(\¼’)5Vl[‡¬ Þ¨6F¡,@i°î(” ˆ xø®15“Aûƒ¸X¡3CÅj°gBAE˜0\BŸ†æ‡Se¾Q‡YÎL@Ó€Ò1h °’È_‘‚†lLÀd@*)*’(pöÌAá€BÀV—OA>ÿM×iÀ2H´dAmf - ÷áó‹ =ÀXˆ›F X"ÇúÒ™ÙÝÆËŒ£õAZj‚ãh)xðOô2X_z€nþ½wëôn…É4`Sü·ÜpXP"j ü‡Þqþ½ª_R€ÞÚÌ0¢3ƒrÁEÀïï.5@´¬·”p7!ð?ôÞ† ÜÊÀ'`>¢ˆá¬ÿл Í 2ÿCïà7ÿÐ;<Øgué2ÞÀ¿ oéàß…bÔû¡°äA+˜ ,Mù‹,6†½¸¥ê{Œ¿”èâ×ùKõ?™û­;XœòÉ“5áÿ#æîåû¿õ0AkÃi#Û…û¼(F -,šýÆ#c·GÉ:Ó• Š¡v§ê §Ä«~rë½í]öË"ǵäWá›2ž_Sæžfë÷ø”K»ºl¿ns“cøøO'ª„î}=çaé6.…¯óì–ïêȪ_?ö Þ­’ÈäY<™€ŒþÓ‚l%BKᙚ¶ÿŒìé‚<Ö&“Þ³Ô;ÁÜ!o‘YÜÒ4È>•ÉDsä¡YéU¦si ä8sÒî bL¦šCÿéax­¬ìVÍ1B³”ÿßEÑZËÎt®YÈjf­]gè¡riv&V&"2ó?ƒ¢­BëãÍa©‡”¥¹kHW¦¯P‚ÿúè›wœ‚‚§–+cÍI‡"¥"hgî¡„ȶ3Ì!ö B8+¬S1ŽÔϬ„üך}ZJŸzc‡›)_Š5+WÍa«–™á)U€4A¼ ~‚Ò©‡–?éœCH4€|¶A?pmTÚõ¤…éŒ:d…ðÙPÏŽ!,¾^«• ¬ygÎCê,xf3-¦®±JE{b' n–\³«™“ׄ¥~‚=q‡€Ù.ÄÆÀµEé/žüÃgÿYM>T€0ØÞfU{ÿ—Õ0ˆ¶ðÿ 2všá† À2«…\û‚O>ÎzŠÜij¯‹Éáa]Lñù#Â÷F‹”°}ˆìÒI’§›7jVv¢´»E¯]ÇWÕzCo¨ŽëØL­¸ŒË~ýñv…»âéY|ó ª“"¶ØŽøj¯ík‡êdN”~"ÚÀÐyÈøwùªæ;EV—u ÷1éŠ- Ak¨³ûDËÓ×?’9xXVRÏ}ú¡]¿ îN—_LÞÍëb‹¥Õ*Ž‘²sȺ6H·åúÆí©nùêÇ™÷˜BÁ÷jìÎÓ•Ü#&§h¹ê‘›JWƉÅwy%õ?ÖyÚ=Ò÷‡‡LGZWšcªgÐî u‚€—¯«G_ÂÛw=_%¨ÍþÚÁôúÚyj~õ°”`âJ¾ts;Ѐdl½¶£¢h›®;½ëýCÝz lÃŽ‹ÎNP~Áêjü¡}1ÁŠDØxq—¦MøMUŠeRê„cN:jòæ.ÒIibo#ƒªô“v›f†Ê‚v­º±šî’#Ncš—öø¸ ûÓ’Ȉ_—¹‹R„¦>èËšõ:¾Ö²”t9 6›ç%Ò?ÈÌÒžam¾—Î)ŸûZJ;¡àÓ&µAþʼÅÜB?÷‹fe‚Fcðm³#½°uÅmG-ÙQmãð¬ìÝتFÖ‡¯Vì œž¢X«§¥¿¹e¹IWmq1ÓRz]˜„²°8ÖœµEjÏ+‹ ΗnÏ‘òÕúôme@¬},+I:lщ˜»£ŸÙFÊØèX˜ÅZs`Yªc®ã ­e=²1óãäÜ óá’«¿©ñ¡â ó,Ù´ÛüNþ¢ôßdçOzjkçZLê¯D¿ÖÚ²2 •\%¦B§«Œ¨Øª»>ëµeÆUwå¦/3q/Y®>±Ñú4>Y³A׿ã팑>•˜n®²eeÉÅ-R­øšRRZZm÷×]WÿžM9޹°/ L°dÚ®ˆ›M>4“ÉòŠT“Ÿ(>j²<v™m:,í´ºŠ7 ¤/hRL7è•k—f×é°bçÊR¹v°<­Çž8Ù¨{™uQ\àâ4sÓj,|Q´+³ BómÿÈ­ÜR^‘௠T¶Tûd̸)KBtk‰È[¶œݨ"þ‹p‘#Œ,8—øj1â6ú¦›äV³šåf!Ï[œå/yž®$ˆE2ætÛÄÊiì¤MÉ2W,˜|—´ MÃ`ê1È´új)èII QËj†ð;buw<àÆ–Înmß38Ïcî…x1e'u »ŽðQ¼ rþ½×?|XHÌÒiì2Îô\zȺ±¿x×ѼNÜ«ÑÑŠw‘Q®òö(ˆÒ!@™Òn@·f=¨&_šgAXÔ\Å ™œ5$–Á¾™gŽë³Á¡(ÜRì@_©,vH ÑB,Þ<ëµs–Ø6¿nÅê¥Ü[ž,§èJ”+gVv´™“Ç@ÓYtR —‚cÖTÌÖ²$ërŒüI Kn E×!–RãwKåm%í‹Ê d(eÿt³§Žaip«b•î€~‹¾O×NEy½§½ÕÎb>|qqðêáMÁœ3Puð¯Y…­rÔyŠÙá œ~d-ý8ÎÆé^Œîf ‡Y=3ñ`Æþ®“«œ8Œõø§…'y°Ï 2h6ãŽãô+ ,F¾pl1ÖزBhP/ñ}Ñ"€®Ú*W‡ß^Ç÷›CG‚ö0ãqº…‚ÁPló–š5+JX¤—»ùý¹N©åzl²y?õÒ¸©£ù‰ÜÆ|d•TÍOáÑíyÂÅý¤—?zŽâ«ÊòWYu‹ñÕZœ=Þ2ùrxÉ?4d£‡Íûäöl¼ň•&Íhë* ÃûqëÏÏ:¿»²ÕÝV»zµ†=74=;wÿÔ˜„ïT ÆÚ=G¶,ׯ|&ý…}¸å¨\‚ ŒÏw³'Ü+I«~¾Ï¾aê‹—'‰'aúÓ·Œ•³9kã„Û¨Ùç餽V{A[G¾™¬ø¦È¼¤ŒÝñó`R ¢ý<ë7eÙ_½OúÑ€…fc‘EkŽƒ%·¨£j°´Wi?+*‹´!< ÙYjíG wë Oºßâe ³=Õy(JÎÜxÙ*Á’¹Z%á~ןÔÊ«ôÐö¡?¿ÈlÌ£Dгµ±ôš2ßOW¦†î#†*j|¢Ìç&læÝ¾Oû¾PP£O#ó.Ñ_.G8†h~5þã¾I^Ì”&hœý«ØÂSîæš¼ròvåÞ»)Ž2f4òFíÝLOöŠªÐ™êY§&Ð:G*¤×¯dNµqÎÏ_¤‡ûÜ<ý­‡3óÑÏóQOp ñÞ¼VºRƒé¬‰‘óô[piwÂÛ~ÓH‘QÕ¡s×îy=U “å!&WϹYÏ/[;>‰„nácFÍ~¤ŸçFÉhA¿Ý¦Ç ‹¹Y¹·Ú§¤³†ý*•f$ü¬º6iP¦?®Ï¥z¨ÿ¶Ö‘e•úØ=­aÒìÑ'-¾øí¹ýja½ùÌìéîLmíChÊÁ&{·£F“_¦mÄúÑÇT=ãÏ?î1–F%©~Vö³öH»BO±ü™gj¢•P®óû£ËЙö {çŸ+O³Áuã¼»ʶëºzúM†Ð#» 1l vâŠ-|¾7«òrÆÒ{|p±6å}ž)åTU—ÚÂóú³-‹ ;:„DnŒ3ëåË]WÉX'Œ;r×ÜÛw憹/ƒ²mmœ.6–´½—”ÞO’fY}š`tâ®zmƒ½V…Ωãd¼÷Ô㤱–›a"¡;ìšËJã‡Ukk |°åc«¨~1úgÝåqyG»¶Ãغ4+׿"lÄØfºþ™Ð˜¡-®`Ôš-wvÀÌO™âh¿ŸÖ<[e_t.æMW÷&5¿û]—s™ä7©NõoxY½ùZ¸‹»U¿–6ô^{¾jHüpécXšüJší·ŒCûü`z½ôÆPE–Ú–(±~ö·í÷ÌžCÃk—ï…feð.ˆgݤ›ä4þT[Ëmbç˜ÑiT ‡&.áS&ÿéfâÖðûœF7Wþ5Y_M‹J··hgÕhµo¿«“¥qGC·¡6£ZŠ>$FI‹¹ÍF´´íÝÄÌ2SÀ46ZäqïÈÝÈÛ?¯U>Ô­UØ ¨?Tò%‰^ÒˆÐG+Ч ~[9‡¦arÂF@ßh†畘ÚŽq°HÑ‹& Gbºo’=›Gô<ôµ2pø¿¥Ñ?Vº\«¯ùÎ[Õ+W8Á?º¹ëðg4ÎTqb²òÏ‹¸v~fÊ~[Þ—¸k¦*ÆŽ]6á=hP'K}-LEiÛV×ïJ››’²ølØÎ]¸Yø‰H8Ã_9ÌÚ¨¼‰ô:\x8suXÉ=˜¶¯ÖÖ™Aµz˜‚£vWÈ+í–ïa§¤£f±~á…£³gpís̹;Ú¸ºð¼r:׃« 5ÊŠâÏ—#Í’|^¶ž3¤Ê ÷×øÑ™WŸ!Yâ,…8;žoô'ühçp™Usi^n[YÒþ¾ïäû¨Ãȇ\ì\ä èÆî@(ê²Hs~×?eò>5žLPLï«wÉò±á7V2÷ÕK¢æ ±|¶Ëc1Š¿èÆÒ›‡àN³ ]ÊSQ‰iÌ£l>üZp¶† ç.7üž§W–ðMD›ø­÷oNÿÉù“}ë9Us8EpýÉ«%½úiÔ_åÆ3ÎæNó‹sï} S‡]aSÖØúºøú[¾jJ31›K¨§–对 –.Ügp–=I•ŸTófMn¾I~}ç½ùG2j|¯9ÉÊ+ÅS|fÝ)S’|S*DŽŒ "¦ĤÛÅTÊ Š)˜cÓ»¦Ômûm¥TrÍëîÌ»Ñj?~ι€F5ty öêÑ{+C_¶•¼F©jî´ÿÚFUO ?ûæŠUöæP‹79ƒAé¥íçö-µÈÏÅïÚF8=T(%˜•ÓRLùr!™óyuI³ÿúÐpÍCØiÛEÛUuÒl=•„ۓÕy ¸«^^+}©à:~,`hK“SïÈÊÖ›­ðy’hh£ù¿«Ÿl{§;»3m‘±¦™ù¯2Ø?þÈ9bbÄpÛjP7[1óŒóÕo#ÿ´CµK ÝZyÞÅÙ;ºáŒÉ²b!Ìü59ù낉Ý+ç0ãÙ% íëJ2³ÞÀeMh öä¦÷ÙË,¼Çv;°WÄ…zJXàÄ…4Üqmzý÷ñÁÆËûç`Ò›h§^jµèîƒÁn'‘?Ó®Þ~ìOÌœWìç0ë³a ãÅWgw…\8p'*…¹· Ò{ãÓ‘!à 5à¬1r¶o˜ìã ü]‹´pÓÉÍúüjŽðá,ˆñŒKµ¢à<]c♂8ìM{³|Þù&ÒF#ÞCÝ{õhîÚ“#mIw[IäRRVŒ »÷»VÔÙI¥E}î0¼p$­¾Ñ!…¾}à0ß¶${;9î–ywºî°o&ðSÓ ÛñTº ø()Ÿôíòû‡†¿œ³¥xàð?íê.Ó«ÜüªoÎ>d.ªO[w•Þ¬9â1}Dˆìu¶(2ÙÜW[ÿdðZ ^h¸O21óxlKâíÃâ~úîéµ;Æ—ŒDÑMàGøsnMòzÏ럖=妨viÂ‡Š«®x' ÉÎü·ò…É.¬ú‰øtrãþÇ(’3yž‘¶ m–¬‡/N4ˆ%>ŸÜÂx,«)„JÆ“M§ñdB*1Žáw¼€J#=D>šaxv2e|2ÃòŒd f|`´£i$’!#±–1<[™2ÂÌž6ö'sÉÕb; ç?æX#[Må ¨=é"Éó‘fDžÏ4 ®˜8h3,Y,¹I!(úbPŠ •Dš(¸b-?mœLÖI6•…²!_ ŸGž8ŽýWð ‹3ƒ"1‘5ŒT´ºO8>U‹BI¡DH,…Ÿÿ<“We†™9"ŸÉ¹bwŒ'c‡J½(žJ–”-•½#ðD?kœNvH&E‚Fy‘¶ œŒúÉ<‘ãß3fÐz>)ÆòŒ`’Q¥C«)`$£9h±åjE€1rµÀ§ŸÌœTñÐÄH[¹=ÙZ!´frÔ'g!´%£_¨™r@Žþ©gS¦?92!òŸðE”úÒ(¹K ßÿ%rG‹ÀI&‰ïOŠ„ËEøã"õä”ñýi³r­´—øÉvŸÖœ‘M²yÉû¥¨ sÉû¡R hJ‹'—òɹ‘ÿ6B­#מ]’&›Gþó¾tø‹#¹d‡ üY‘U² ü*4?²&²›ýŠñ¹‚Þ¥Dr!S¶ÿ3d1“¦?’^aÿ’2¹'²›íÂxï/‰””uBç2žc,»!I’ý¤¾%ÿúØM…öUØÀ¾ IƦ¾|úŸUPg$¶œ ¦gÖ-™ÊÄðíÍÄðìV,ÚÉ&+ƒ#è‚,“•!ÐD 1æ?ç ½Ož k zŠŽc¤Pèż´I®dzûô–ÏôöÙ­D´RT¶ÇóK²[hm±-ÒO¶o›öR:ù¦ Ì­"€AA›$“D@#Ï*OѯÎß?#fÌt0é˜"ë_~•fï\ÄÌsÌÝŸ~pöX(üÆìgû×ÿᄌ<]@8à@K"Âä¬ü¯ þé[ø·øzŠ-ŸpÀ*‰/㉢½ÜRD=­%‘<—ánŒAd[¦€ïÊ¿ ûýHz£~‡30þ!ÞR¼VþÓ¯EùÃ+ü-ãÒ-C@Ÿò{ª-éð§˜d_åU™ŠI°HBÂ~˜†'ûNö:™ûÆ^>´ý9>äb–1OóНP¹êR-£»ú9YR˜ç<Ù–½Ø=C ÑIœÊ…{“Œ5Ú¢oRøNÂwt®{‡ìk´ô‰]¾Ñ·uz•n µ• n~˜)[=PlÙ'ÐàD^¿#Y(šNn%MÅyöPñwrîPaï–®×Ю{¯É„ÐHòè»i V*íº«I3gCª¯HûNár ð¯!¿±Poã7oIrë@ý¯Lü]â}E–%-[nJ5"îE☺:«[Ûtï“¶ItSÖ<å†JuöòÒ°êDܧð÷±m~Å] Ù7#wéñÀ@ôDw÷g º8{œ‰º!ëáZŠ‘gSik¢ÖÃøÚìù?èM2VÖí~žó·½ÊêYÅ ™˜Ärq€%;ž6:ׯÐLh`O¬Ÿî u~ nVdÿx.\¤,IJ›?o6Ñ"¢ÿž¶b¤ØÈ–ÿe,‘ÍZ`]Õžéâ§üD4ÜQ‘w&!ø{ì¥XÜ´¼ªØd²ÚU9o1]MLj¯N{X}ôI’ö)ëÔ•`O°G×r§–sV ßYSëK©<Áã zçÃú¡5tê ”½¶OFjÊÏh•,â´•¦3Ý|Öô“wþºBŽcó&åÂàŸÞE-ªÇÚwÜyÏá»ö 2í¬UE¼éR´zTb¶†dÐͤ‡aÔμ#s{êB&¿pËŠ@­]µŸAvÕdS#R“F$37Ð>¦Û¾šq{14Ïbá;Ôhfî=–ߢÿÄò%ü…€B‘?,Ò€œ Í€2¼¨R‡Ës׸©fÝúzoËÇvva.ÝU¢=t#òzÈ é/>ψ££ˆ¨Hé]«q௷á#9(׉Üj÷ Çò¯á¶bWÁ·ã‰és1E¿¡~ »\ÖÞ -ÚÓ£Ÿ)whÍmäxè‰TªþdÑÌàkÓ—8èN¯ã̘{“B¼í÷"-²6L¡ô`“Ÿþ˜ËMk_(1,ÂÑ‹Ñ5‰ ­Ã¡EöeKàŒcѬd6ÍWŽÉÂèëá¤åæá•i 8þ©ý뀟ÈÛ€þ:ýˆë"ʬZy~v½j=ìšÖ„b|¦¥€®u³ï›¹ƒ7mÓ1ï'f8tLÓkJˆsÉØun'šïeý¼"ð6_þTü;Ô‹Ö šøÓ09) ¶±üa%`Í?wK»Í6¾*Ã<ÉÞÑ»€<Óì5¿¯Ö §YÙ¤=ßÛi&œ‰ZnZ8ÙÐôûˆ‰=Ð0ö@¥·ºóûÀÊé$&(ÍX+NÈo{ 0¡:7©gYŸŠ4aŸÜSùЦ_;Yþ]‹'´4­Ñ–ž¶Ø:*Ï*ùj” ?øzC*3èQ±cn;Kk;»¼F{Ö;•øõ'^Q„ 2ØË”|ðÕælUTI°€D7g¨ü« ³ì×Ðxž½¿0ÉwRùíWõf‹xýúÞk¡²8ìà»Y;W‰w¾5l,šu§li„×®[§~¢Ó±‡›C5'ö`7“È•¾Wó‹Ê•4’‡AK<¾¹-FJ„&³š|È«V}§ÞMŸã0Ÿ—Ú§¬ ,~/ã#¬#jçÇ Zr¬üˆ®¯u¼É-?ò¾ó·4¶ð@h©É ßEïÌÒñÐ: ×®xª5ÓðôOwù =¯{s.€›¬À.]®L64MŒØ[dIa-¦×޽„ãôh×Õ²ÜË]éu^aÔdÖ~íªZYÝ0oɘLªÂï[wZÆ4ýe(õ+¤˜˜1¢ê• „HåPïïTÿÐN\à!néBN«^#é[z’£œ*ù#˜;0§ü¹ÒM9¢6ꇲ¼¥üóbÒ!w—¾Ž ýœìvùÞñù\úERú½Ò»êÜ}{M³Œ#J„j¯ey‹fx–ÐÕØëS›7Ñ)Ô¯wªð Rw÷`Ò˜u˜Ð/*ÿnp]F¢Á¯I&Aëó–"t[+Þƒ+}“â÷4¾4诪S'=R“¯vzœEwÍ´ t¶Nô*›]x­Ã>KÉ.°â)M…âeÓÑŽ7ô|=íš57OòWàŒÀ$}C]ËŒMù¨¾¤¢âBËVá båž¶Èk'hVõÇÕ«1Ø#«¥ëpò :Rtèb‚Ñ×Vóf(6û›ÈTàP¤®6]öw¶l^b¶vmd)&—Î "ù½YT©¿Ÿí¨v÷q©8K²µÚXÁw(›ZÎ:ü²ãè8È·bÛ¾SoÕñ7¿„1êyïTþ»„Õ7í Ë_Æåhá1]1ë gÓz±1ì“@ š‡ãŒú#E7(¦-ô¨lš&]í^Yòb# 2 î*\?/²½ÿÔxqÙb{ì`öØŸ™åîf^ùb”±ìáâôºf ‡±8ÔE&x¾¢"+9ÙýÿòVAq­ëÚ6ÁÝÝ¥iÜà.»»»; ®ÝH7îHðà$Á'@p @p ùæœkïú¿µOþúÖ®£ÞGïýظ멫¤/i Ò&“âþ†Ä¿ö XiøÔ¡3ž-µü³^œB‹Ø¹JsˆsÕγ94Tt†l©êS–ħÅën“ ! aC슴½ÔÞØ¾U\ôs˜ÅázmQɈë‰iA•!X ¥ÇÓ-¿Ã8ÊÚûÎfM“ŠZ/KÙí“tLðY´åÌ·½ 6Ù$'ªõøTàºÞ RïåWÔ%$û?¶oÛxL±Lz ¶8ËŒéGû8ùÂÇ1(µ5VgTƒ~¢Ø¡Ÿ[Æ„‚¿L1ÂQ€÷<¹wÝKüޱZda,?ßóý”Ø'ÔË‹urÓטĤJ*ø Ì¡~=›2óKH›¤^&'ÙÆ¡+¤698ú}›ùú ¸eÔÆ¯ä¹~ƒ²ÚõQ·òý)k+Ñ¡G`ãa›å}äõäU½Êü7Íw‚Zècí5ãRÀœµuê(‰’îγ3w].~·œ›¬Ãç±`ÑÐL3ü{d¨3•¶É¶„iÅê›É7)n TÙ0K©Ð4×k$Ç»nõ\ã­î3`†Ådë¹Ùœ´­>Î¥%y385·˜Ö0wÛzð–ÔÆîlx^ž’Œ"«‰´«3sæíG­Q>ﲞâ"…àt/즆ÕôQ½âõ£\–lç1Ñ%ü2†yϱ`½tlMëz‹?™8ü‚iL*À8]åwÈû |§“¡¥‡ÙcûÄùTz£Ýlf5zß-¨Eµz~!çê¬,Èr9ûwô=¤™y¬|]»n"ƒÔÝbžâŽ©=¡ê1»õ¦}ÛÚA5ñxB3ÓLa=4‘¯îÑ35qyÊõ98®^hîÿ‚£!_ù8gØÑ`Iî{"½W/¼ùu¥¾cpp3W¼Ôš"íÓ>¾è`Ú¯“c_‘œGAiàeZ»ÀªÏD@ð©˜é\ýã™_1 5Q[ ã¡džo¼‹SÀ­áPŽpXºï¤÷Yé{QB®“¸h+N_·ùå¢Ì)AíqÏ)bVQðŒú‹L;xÝA4à̼ÐÊîöº‰¹·U|ÑÈ+€Ú©â·íH_z¥ú`D&çV~Ñ~+be¨§;,-Û,Èw¾•ð2®-Æ4Š^zÌÑv”ŸM$âGçÉá|𙏤À˜£Œ÷S% ³VSÔ·:lßü]à3!üÏõ¡?×Õµ²Â»íÍkýrSªŒšG߇*=º[•)Ñåàòß’_ š˜ì_W|û2 a³Å3w”+}__-uäGôõ^E|#eÇšFŸ¿rl»ä÷Ù¢éWº¬lî¥;-P.æ­~u 5=iŽÑE3Ä£ ¥‰ªX»ÃžýlKyÏ[sÕxåäRD[•‘Õºy:Þ½™c k,‘2tiK E(†;óù¿‘}÷‚ø˜g%?¾s›ÚT~†ïKbˆ;ÄTºvH~ŠÜzJ²iìRØß±pÇ(W8Û¸`µvÖÑãxMbeGtÝê1ÑÊfêø|ø¸‘mñ°Ü«wØ;—Ýv÷½[x(jˆÞ/ÞGï¡`Œ(—ÄÑàô*ñ°¶}óôrZàÒrÕÿ§f·¹Ë“öUʨ6žf:SÍÊý¦zºåxr[ÀâWªˆ*¥åàPC?¬(9t`®’a${DÔ®'ÔtŠWþAkæ—Y> Tr†Í6|”eÁ)ö=ûÎ,¢_¡ªiÅüœZf==e=2-3FÇ~ ¢9$æ3¾V¨ÊJ'&<¥#aÂerìdŠÇý(*ž'°~~kê‚@Â:O¡*pßumý y\äǵ/’4)I,ÅøT€ÜQ”÷mdPv‘ˆS`s£_€o¬…yj 0Aý.L”C ã‡*SíC»ZÚŒ"¤êmŸ§ÕAW¦ð*ØnÓ<{r;C=üâôgÖn~‡L—ƽ:¦§gÀ€ Õ¾‹Ækɇ bÀxB¦2­òþÇÀ9úKæÓQ@;18ö6áÑ"5…ˆV´6.¤u5šNâ¤Ǭë.¾(þ´ö;}ŒÁ2$ŵ›Pãq~Õûý -cýSÞÖp[¦¹§¦Ì˜yé´äóTªg±ñõ Žœ ŽÈÀúê‰Éû\¹ÃzWî«®ºÐÀaËvüŽ»“ø¥£—òK”—¿ä²‡«‰G ³6¨ï+OÙîóIž©)û»øpsÁ2ƒ•”Wñkš;;Ýýbaá¥Q¿¸ÔvŒR€é"äbûÖ z*ŒÌ²O¦Äšœ‹$”ÒÚƒ9¡=±J‘yŸŠ>À ZÇ«ðMnö¨ñº-®S¸?ÔÛ&NRâ§‘Ã+E×ÅZaâºbëC£qœ5¯Î?Ö®³Ä¾^l×ФÎÖ‹¸hÕ€–˜ xo"ŠïãkM¶4µ˜Þ®œâÏ4vÅòÓyy~ê Ï7bÒ$š1»è”³/ZöY¾‘ø6b@ݤˆ¶æb¡{P£zW(!Ë®·úšBü®„§íg²å^FŠ~¿ì•¾…C–iÕ4ùt#Le›XþkÑcÆd—Pü³¹IfÀÈ©þ®XzöprƒzpJË¥ /&7,wˆZ\úÑôŒõeõ%IAë)ÏNu¿äÖáz6KƒVn‚ÂÇön^ðÔ,Õɲ×îZ‚ûë)qZ KìÔ¬3¹{Ïq€åŽÜdVNûœ6Ÿ¬=OV§˜¸Êwµ>ÀѳAýnîŽÐì—êt/R¦õŸK?7¦W`\¢þBûx¶œõåQ}aF-â&-˜Ó}%ÕkÞ-ãdÛÎ,ì¸õdþ‰ÆbñÒø¢ÄùÅ‚‰uiÕO”NíÝËV[V´î~eÏp:.€ÒqWPÙâÞºÒ¤.XyEöüB'ªŒ¡„fÅwgEº¼ÐÑX<(°ÕÒ+9c¿¶]jYdDƒKjÞÚÎSÞ¹½½´Äå¸üDâýé~ .3Ì¡ÎyéZùC €¡+_vZœKp«\Þ¡;T_²ìÏ$—kߎý©Œ‹ì.Œ|I¹4z¼ÚúÑAp-2»e¤ùºþ³êÛ?=rAûÒ{»Û—$5Ùݧ5µÏ5äõ96º ?Œ¸­Âr~“¤ðÐ…8X_05bΖbÛ½ùõñפߩãFa®l E^èŒFPófŠÝFŽm§ÄK¢L†;§kù@#ü]¦`Ј@—¸ ²ö} ‚l}‹"]oá7àõñ¡Ñ=TUO;ß×*fØä.p¹ O€¦fîqõ ©Ùöì’ª¯$ šš»g œ‡¥f2àØ@;f|O ¸ è*#FÔ/é! Ðu|DkÃ/ V†IŒØ—2Bbà€¿ZUÿ¦Cj`댪RD`‡šî˜=)Q @ä(Ð¥ðwY€m3¼0Nx+H ºÎ—0JRã/Qeƒà©êŽì‰ƒTwœ­ùÁ¾@,((Çž¢ªV½”€ ƒÎr÷P€<ü]Êàò²åÚ³@þÁ€¤À=3j- ªBÕUèO~-pèVÆDƒe«ù&©@ã±É=tÈ!@l|œèà´iO˜¹Ç…e«ûƨ¢APÀþüG¶-Ú`O Œ¼G é€IðÀ]€ç¼&œp  ¬—^â²Ì®ÌS¥ƒäÄf*KàÊ€®Ï{Œ µPº p'hx.|ð@ ™ÐùêÄþוÃTµÁ¼ìL€•Ýe0ÿ_ûÆ9àðxLÿ¿öõÿµoÜô/Ôú%PÚ±.á}`ƒ$¤í.ýþ†vÄÀy` Ì$+9æÈv’n‹Ç5£/1­¿ñfú N„dÉASyQlØã ð«™ÖSy‘l€\èŒÁøžòзޯÜã^ãofx³ücì^áÿ%<Œà€‰SÆ8Ñ›nà7:}8Â?hZ¥{úÆ8e|ZÅ{ü;ô &‰èÌØÌ”Ì„&r:Œº:&~±\0e¾ Å€ocœmœ¾~/zÕ?¾nƒ\0©Ð€ú S8ù6JÁ8¾TÌwyãØïÊèôµèûè$èn1è< òè úŒq‚qè¡È4 Éøò‰Lú î2ˉÚi¿øÿA‚ÿò‰Ó¢ïÑŽm° {ÞŽ¾†ŒL@‰ÿ‘é§Œ³‚³\0I… Ë€z#SotVJ‰Èmœp\úþ*Á-µÌÑDoômÞteütFjyÑôÙ$oÄm€Ù€úz ~(~(&S¡¬hŠ7î¶ÄJœT\d\ :z>*A<~<Á¦Ò=` _*íEÜ c8îöº•Ì=ã@~ê/’¸FÆpœíô-™{à@~Ú/š¸sÆp¼í'ti™{† üÈÔ_Dq%ŒÏØÛ‡èŸdî™ñ#Ó~QÅ #}QP¡èþïcô3ÝÈg:xîoSÑêx;m äŸðmõ~ö­çLs¾OÎSêï¤oÑY¤)±Ñì2¢}‡ »8d»øµ°jKÍÊF. Ëô&i"x¥ŽñLGÙ£t^Ä Èö­da¢Çõ»-I\lXñõáeÖ¥Æ)¨v²\æø¸µT²0)þ…lrñÑ er÷‹pÿ/£’Iï&s·ÜQ÷•œôË(?$¾¯*ª2}L¶[áÑädKIXzÛŽ³½ßoܤÆõ>}vÚzÊBD£LÖAÙ ¨Ä¥áÅýù½ù[©‹„ŠÑoSEÑûʱy¹‹ñ&ò´ ©50õ(ð¼ìÞàèfv©m—›ë•ùdHQÇ×®¦Ôæ­Ï•ZÂÖëõ%¥T¨{ùDµÍ‚ß5ƒGc¤ÉÑbP% âónÎ]L™ðIVäÁ‹ä™ûæÒkQ nìuvt‘‰œa´X¯¿1–pŒ¨ï:/\Y-p®YÛj–LŸdŒ0hdÔ½º¸U3ÈûÊš8Ò©Õ ¶ăÈc§ë»êGÝ¥I¹âÄz`Úº¤ß†˜ÂxJ'ƒú´…Kª<‹fé+ÎA®AaïÚ ®ªŽuÔ'5˜ø$ioŸ ªª$‚ GæÕysC`¾†ŒúЗ&]âax­§àët µæ"vGÁû xÐe¸Í'J̺W«ÙÁIÊ©÷oCŸ~pÄΩYM~ÊýF>o`UåaÃ1lRp(B!ÛÐ.)éhWäãÊÃ¥ON§:Æn[9„J•VlW×÷ÄOÇI¼Z¤£K:g/ð¡þa[F'Ä“÷ç|ýðÏRbªÓ¢,RŒO* ^¶`µëtf†h½šGèâz£OdM×'»…N_Ç^¡°‘Þv©ÃŒºnÉ£¡î ªv³M8°Î35s¦>:¦ü9-Rh`Ú²Á-Rˆ'žCMßJfQ®ñ±è9‘Ïò.^3I"7{INªçÌñwÍÖ¾Xàu'Àt~ã3*ÕÕ*7¸ýè$üY9~uªbã6dBF.ž(i4Y/g¯¥-s û[iãÍ\ï°ûQªR†B—ßž/—a¹!rÅu¥qù‘/«ß¤@cÁ)NÒ’oHÔ;Ÿú0ÂÑ-ÏŠ+Ÿ$³†\´Á\Nu‹WâBÚg>CY”ؘJ{SHS Þx%¿’8aµqV¼¸#Ñ¥+9Ó…KÄm•t+“sÍÀ6p½ Ã"™åÖ°Ë´îîµ™ã”:ÚÏœ´ö‘inSd¶Ø¾ö¨”k1´'—+ø^nYVYQ¸dU¨ù¾Ì¾É–¢Ö»ê©ZI›…Ÿø¦_øËÝ 2 x®<° G8e²§Àº3ÅZ ¢^mõcÂÀ«Ü¬Ù¦ßkz¯OÏÄ’%,»âñüª×G¿Ø›)ïü²¾åK÷Sò!nŽHµlfkJæG]Ýj”]{UÂT¥þˆ T5ÈU“ùDÂiyÓf¶"ß¹t}ÁoìÀÏÖ¸n]Žœý±ÔÓ‰(òÙëœ[½cH vX û”3u;³·Ê˜ëIÒt«ü é×*ÄÔÈþ¹jS,²™]_‡{rèÛ…ì}Õ© SRý´Ø°aÃåÅ>ì ‡ûýtIâq^@«L}ÜÌzQ?HÂmæóýÚ»ó€2L;ºLH¶É›^(l¸–ôå[ÿ–rDî¤\»Ž ¯÷ÐúU¼Ï£ÊÎú¦îà9Ö(æ€Áªx»ÖÛo™«2!Œ,´ó—mããÖ“v´åœy?µ.&ËŸ+¦/g›uUHò{T¨ »ãµ:‘VÔ¾×ë2™ò‚zôíËý²~,fYˆ[«Vª±tKÚºô±PÂÝbʬ(³É6ê¼Ô¹-ŸÁŒ®i½}Òs_•ИÒ5Ä WËÎÓÞñåÍŠùI:ž(š&Zà©Ü$ë•—"M{^[ ´õ¹,œ¶q”wÖJg`mPòèØ…fâ:×ñP£gññà? oýØåÝ¡vî¨Zn1 ùTB£¤»Ò…’$`zW:àz~XVGy»PF2¼®©­4‚#^á;ñëk¼ŠÓ9´TgÍé§;¿ø£³1§®Eû«K’5½4I8D™´‹ˆßД¶¡Ô˜ŠuS¬0«mŸáC`èIáÎ$˜ÝP=´Å®˜÷>kÛCPÏw>ÓNZ÷=¼µmAŸ³‘ûæ=FÝÄ”ç{ʃL—:¥þmÅË•¨ RQ^£‹•#ä°"å5WuÙC÷‡#˜i¿“8_pÃ,,—8+‡|>IcäëQ^‰ê*ÓhËÙ׉Ζì0“ö f‡nÊ´[ûŽŒ@?fŸRÉv/3Gá|¨Cÿ„‹ñMO•¼¦ñ´å˜þ¶½-co©{ý|aHåœéMk_}ñPʸz­VÙRMá'é¤â÷Ja¾µ4tΤ–”§öɃ ã÷í ¦åEŽ_S‚jj¶Ú¿RçTÝ ˆd‘-ðƒ =rÐ4~¾V䊛mÅiîëÌ­'ÕÑ#©ºþKk=Rƒ´€umR¯sÁ«¥! ÐÊBº±DñmóN$…¸2Û3Wˆ;$$T ÀH¼R“ Þ³(®ÛxšÕ:©àT ÍPæ7\`ôóéijÀÏÏ”B‹!ù×K­8¹Ë¡Lb>*Ϊ·dO)‡æ®!®Æ‹]ª wõçâ þ]ìrdÕ‘ÓIwl¾Ð0.›…F ãŒàÉÅÙé}»( æ†ãà—Á­z;ý5뙢g—A/gq´$ÏçKœ‘›W»°Å‰{8Yè)|¾¬½)o¾jÿiCÄŸ´³OÊ'§Ok¯ ÿÓÇ&ì ”¦à¼ ·`Àùeä¯yŒ%1ÛµêXI‡SOâU•L¾®WQ"ûÈQ®þ nkdÍŠéè~Š˜’ÙïFŠ£uVšŽš‹®òíI–€Ö7ÏÚ×,GM –g_u|a­ŠÃ!áYè7,öXá(ôC±—¥L³òçÁ©›À¹;Çó0ξ±s¥–ÉËéç´wÒžlXÆUƒ=ÊÜ”®Õ¾>hVøÆ&ƹvšé®¯rÌŠ´µq2?ìU0:Ìb¤aû²±“,%iLÖ£EŽù ©vÔœ#:ÂÉCì›>椋M-; ù?lÖvðÚ‡°×TøWKAüÕ^çÖuÈRÌi%ìi©‰bÏ$—s…øZ;&ÞW_&=Ï(ˆ­á`³ãbÚð?0¤âr*¸fïeu/ônƒŽŠ(çó´÷÷ ßÀ†‚ FyÒ¾êÇí–eöˆÃoOLttl—»ŠI~â„WY•ìEJVO›Õü ñ®vnþ »T‹š|-aÅ ðµÈbE*Ê1‘]³ûtÔŽ3w<ýSÇEmÛ<[ ûO•©š¿÷œmýÐÔWB‹zÎÅôÔ§Tƒh _©]y îtdî?ëßy¼ xe³õz²¿·+è ¡05Kù=Áïk®I»v²*šÔU)}¥“;=úS›ö‡.yD„Áñ©¤ Iú½Cü`¿gw¡ÊßþEr0ƒ3ñ+±rN†{,øçõ»ÝÇZ”¼“ç>{]ãdݳëÖsÒzñvÆÊAkѼƆÚ|*î|/šòаÓjûC“ÌÐ+¬«+5IØœ]¼…lžkHÛ4ôÑ=}íù, èçB?×>xåž>~Ó©õ¥+ÌÓéȺp›œä‰}arŒÿ‰Í*gÜ·$ÚËìA·ÑÃ^ƒëé;²õcý[¨‹µìwºÞ÷{ÂÑR•Ù'4loCPRd»î,ÊmµÖð§HeF¬Næû ·¡zŠ˜;L¦êȺ4Í;°Í I¦$+Ò¿½³0ÞÔ Wž’ê*ä"š‘YÚÊQ€Éã@"Ù$q‰»n¼>¿ì^Òk+_¸ŽÙß©á Ä’O'K‹W«õÅ8^çOá×E%ÓÆí,ï#ÞÕÕYcOP0ÊðyLtJ_25ŠÌ pðméçÞmÅp ‘N9Z åúc剋Ë*óHgùNƨnéUöÞré±îÕÇjD‡º0Ë/,ÝS!ÀIÃõ¶ê ½OÓù/ DU)ԘߖP§ì‚ûC 8ÊérXÎ¥|~GîÞãV4çð«¿»Áñ[s|ÓXRé÷’?Э[Z×2Æøð~Sr,„Ñl íÙtÿy¼Ôj©Ü4Ä=Ò?‚ÕÕÃíE=Z(ò‚~ˆGÕðXús¿Ý¡ª~l¯áSxÒhLÙÃ3×—ÈBªÃ–q¹}­ñE´}é’²’¥%ÊŸs^~‹@-Þ.E05° ä™È€ÛiU/ÿc´øMÆís( b[߀–›=¿Ø!÷<Ó^ Â<Ï«„Â@gÙ•qIypjU5Xƒ5¿8dÈc·‚ ºÔÁ‡P‰™=Ï¿ÝlàÊ%#„x§vI”^1› ÍØG^Ù!oÁÙuÖ¾%72l®úÆ"Ƈ¨é2“ v—¥à L4 ß³Qµ퀤XUI 8 RÕ–,U!ˆ2 W†I°ÃG¡á…ðÀ2Ä*TÅh€hóì \ âL{ˆ)P ìn§; 0‡q@—€€ÑÃÿ ¥Á<ðzP>Œ3Ëž²•`ƒŸ€6­[ôÁ S(±Ê×q{H `e°2 >þéÐ’¡Z8Ý ˜á¯€4 \ußL8ð¯Ût¼BlUÓyÅÆ÷(TÓùĦ+Àš@h0³¼òoÚ´ß‘c‹X mȮ̃»ëbƒ{œ'f±Ñ= È"ØÜúë螘ê#ÌÜþ²€âæ{hĂ⡽ôp^H¬—Î OV…J/)€tY{­ ©Ñ!ø!,<N©Ú?¶§z‡ÃàFPdÀ;¤‘O‡ùAâÅË–·Wêþ›,-ð€ i‡çÁï ÈÌR:ÞU0ÿ$ü …kAãl¾ºì½CPä'œöœœü8ZLD…Ü€¡ B¿*¤ *?çÂÏ¡C€Iˆ4o’ú¥2𜷼W}n] 3 )aeÿAùwƒùþËAAëÿÅ`p÷×sððÉ»{ù9üëT>À×ÏËWÞËÃÃÆÓþ_®s‘¾™‘,ñK<éGN36ôÄ”öôfÄldU¥._Ñ<ú¬&[hÆÁA+0Æ+P¾Æó«Ö]˜"ß«¸`ë!¿SÿÃA¡ÀÕîáÒ9‚oðj17‹·¢2݇c{óyÞwDKDe{4.뺫ÐÇo6Œˆ­Ç"ìƒA®PÛ`ª*‡äÕjé[M”ˆ¬òr—ßaÑz^Í®6|3Ü©#„9pç˜lóÏÌZ<|‡ãp[$¼9°˜ÉIÁž?€eñ7’ï |Çh9n<ó®aSÍ€Á:°Ó‘Ž‹g½—d¤§®Å¬~EÊ G:[ãßaƒv¥g«û<ÌÖêMH(º-=ººú§+2)â- zýÊ…Æj£Ñ ‹¿f?S_ŽCEšÞ(⨣ҲMŽ kk“ ÕhKìbÌë½ ÇŠ¬° 3ˆßŽÒ¢PœarÚ ÁЇEuïÙ,cWöò²£‰†ùãNñ:çâò¾3TÒŒóo¹ú2PŒLíO”òyÁû¡„ y4ÈæÍù¢žL~Ý_“’®ósÝ–«tòëúã6Á8˜h"­'÷øDÿêÊ™Z1µ=&¾øNí!6÷¹È‰@{mÞ`,¿æ°kòÔuˆÝd·eo Sêf0Ý=vPà5q²¼S)qü[=ß› ÖÝî¸ÍZbI „ŠµŽœ=„…%Y;|y{+z¨û>_Ë®Õç–ß4=‰É;º‚AYú Ô¶Äx Ç]®¡OeWSÜÝí¤„+3Öa?!’àñ]3m¤—‘ÇûpÄßy›¤6=âBt€A°ÞF¢eÔ;hxív:nøÐÀ¨8,£ù¡SPo‡Ñ6ͱ<_3@ ãµ®·ýh¬¾«¹W–Ñ{óe¾ä_·Hÿz6בÙC¶MÑ]™( a›¥e0šßì~s`81„ŒèẂ±#8²ÆQ3‘~ÝQûõ‹ëÑg›ÐªûM2Ú}¬2Q®XWU’ÊñÌ»êúÜ*_w_ÿš«ïž;“ž×êÓ˜ ­–Y„i$}p#’‹,_Y™’õ&E±b*g(A§þ…¤ê«®ÚÌôÛ*J…"+H½žõ7È÷Ûç‚D,â¾XZï4ÁpkR?Ê~aÞŒ%lë/ŸÝ&û¾ì¡B @´»Iñ^Øá)çØáxê¥næ­_™',ÔÍ™ó*g´p–Y)3›†r'Œç~MÊ`TGó‘GcâÜ—žŒ7û_l3);w ƒ¯Qºµô(Å–˜ƒ³è3_ÕÔêã4Øl|Fž!zBp³6që’#ò}›æ6‚ª ÔËÓª¹Ž]ˆ& §˜úK9™'¾: ‰P4xÊ9X½W‹òaSoTÛÉQxÁç@Ù}¦ ê÷™-DK¾(vOü!¶¥ç}¨Ëô^@Ïø6üƒ|ùç,»2ÏpÈ—šM‘&ÙË¼Þ u Díøèó gS•çÊzÉÅkyASÏ’Fïy«Û?­ÅnFVÝÂ_ŒÁÉ£ƒÙçµvÝ®1ŠGÊ`Oþ¹Ò@öÈœœ€ŸÒ¯ ~XtÛ¹övw²vy2`7Š±Ð¥’pÅÜPn((ãà% y–ñÑ»25½0Éw GJ„ý. ­>TM¢¿¸§Ît–ZAYS Ó0‰ül±`j£dÝ”§9!°)pôÍ1àÀ-Í·«ø9CDTÝŠï÷5±­¼`+h¨ý¹×·‚íÕ)/Mô^”ÅÒodÁDCi™ëJn_A§2Ð ®:…òõ+Ÿb…¯q[Yºc[kКÉÊ š]„À ´ªY¹/Ç5îëðwddºE”óß,ÈëЉ.i®„Wo½³ˆóŽ1O;Ëw2êás€€O?Öœö´Hü{"¬5–ï¸-WäÎu.IÛ~Ì$‚Z38üÐ,C­Ê3%{»3ê³·çt¯3t6«åûcƒÜR!éx+y~uæa>“†ôZÏï<éÞ—d5FšÖ¸•ò(¢E!ý{áA‰”\s{…€°òWO•ÿO ‚ƒ»ƒ¿ƒ®W®¶ü¿JNŽî„æ€6¾džQ©¢>±á+2”]Ü$NcV!nù‚ï[ðW×s”‹’u¨³ ÷3‚ô¸è)¢A'ÜÞñ¬P þ'<òU­µô[QCÈØ;kaqaâ=bw>€ýé[Lùvùg³~–Þ×u)hÊÞQ“³}íþ»åqž )YL8ÜnØl»ðœn”DM÷¥\'ìÑá·05#ìæî¥}…•›|"Ï4ÀÊœíQ¾¬‡&g$Ç æ%%1€¢ 5¨sæ¼ÙÏr©ÔÖìKz¼ÅO¾Bnã~íßZJë\Kû‘|o¿Çl[7kÃËŽ)®0µžlÆHÖüÜÓnýå?®Õ·Ç¸Lª FØ›’’•{ë—9lröÇ®`Dy|mùQ¾ã¯‚ /lŒvDCƠӬЯdH;÷‹ÅB*‰Ã‰i.HÁJÎÕ…S÷;J+}ó³Z-Þí ƒã[€R6ÜQe²–³Öþà¿pÔЬ]þ7Zªzþõ…ÿ¿i ÖÐÁßz+÷˜Ÿ4ˆ´˜I" êû2²uÖ;e¹$j¥‹g1÷%½‰IûÏ,Ô†v­` GNN À"Ÿ¯°dHž\Mùršò„n”ßšËmSØÂ>°R¸rÒQÊ/a„oo©ÊK`#ãHð>™6q›ú{øñQª¤LˆË¯†^Úg¨/1Ì6Ÿt]fo×¶ñÖ…—B#ˆZvE€ëªâ£êûn¨ïù|îûü#´jYhgÙÎÐò9¬E¹—ˆ º×/Ï5§HÆCP&ÈÜþجíF‹5ýKʳËIþßÛ³·âØ#áok~óî©¿ï—ü˜}ð×óaé½Èà”è/)ûáÔÜ*ãìI!­¨­D/«€fçrBÁ¿”äÎŽ½ ašoR*ÒDªÈíÿÂi§ oD%!¶ŽYà mŒ‹I†–lÇHÉ—Ôà ™l{p°‡’µ’ƒ,sëÿX£àè“èùKIy$•ÿDÉÿ{ÀUr ðþïÔT÷"âÃYßðo]CË”I`r!©¯îEË)V½Qø(WÞá°TÉMÕ³¬ið‚#Âm.Ú–#³ƒö«—8‰ùãṲ̂ˆÀËÅÕI‡sºOUò[t‚⻦oNØ;·—ËíDÖ1›&µIPQxÈ—…6ª»šVgY)’Ì9*6W‡zyp–žÌYz† $T­n瓾;š¯f¯ Åóþ¦?Åí`¬QÀ{K|K0ûm¶ÚHþ`à/ÆŒ¶^-Üj78+É´ô âÿ¹5æ¤]ø†PRr졘D-¡Ã®p0$þQµù¦YXÍ+1öÂ2•òl*?9û$¢_",>¼‹XÀw¶c™úäÌ'QÜ2wpleM¾£Á7pñö#et VïÛ½4¦€Ýâ÷þÐjÆÛô/nMݶVNîͰîy· 4îÛwn̺*¼­¦”~?(Ra_p- ÿ˜ù›@£ xð›ìÍÖ å±½ˆŠ`-ä¸èŒÁ¸†Ï»q—fàO Ä ïGtØj¬2™ñcüø‰Ý¤Ôy@¾?{“¾4ã/é/AÑ›‡ªëYZŠÜD\Y´Yتܥ·Xÿ #Â~„ÁÈ/Äÿp^ü×Á?ó¢Ê_⻃ïGˆÒ_?@JÇ«ºyÝV)}B¯!uu•ãh /»°¶‰3ì×ò÷Z–ô HϬ|=C)È’ð®©Â“¼«Û—gLk ,1cò³áÄ4Kb®ÔÕ1[N‚]R 'ˆïúG`©Ú6Ž•’'ñ}³þ¥~Ï1ÿ_ Bïg±VøÒš[p]Ö1ûí‘P|a‡ÿ÷¹“hôkÔA×®]µ”ì•|wByËä|ì Õ+ñ¥Â²GåöØî­^ՋվؾÝù·¸•Ú¤Õ4{ÖØ×O;:ºœã‰_{ój?DhÓeL ei«Ž4ÄŠM ,ˆ¯7¶]ú!¢:)£'»1%~µr£ó#ÜZ9ûãx?[fìYxávoÞÞ@œS‹žÉ&ráøjÖœ ªH—‘tr„ bÏbl*Ý1”qâ^Žœ‹|뼘ÏS»yÕÀ¿p7))å‚€r•§ ®¸o•)*tC ëtžõöàuùY™åpŽI÷ïòþ` ø_ueo{›ÿÿ®üvˆæÕ$³IûÝß]ù“yÖö?ëÊKwe‡¤ˆïÆuå°º”„þï/ЧЙþÖ¿º²CœgAŠŽ¥ù7rÝG¹8)ÍëLZéÉX9(lf\ÂÒ0:”À?›ýK…¤tj£~oczQQTQO] À}£·!±É(¯)›G½[¬än¤)|D,òžnúÙɰÑޏgR»EÈ¡¦JgŒ‚Wñä?,ÃìôÎ <•E*Ï;‹L #…úó´Î jÌEL®«À šIÍ{7H®"I<"yËq•ü^ô¤dæK¡–ËÄxé£Ëm*c1ª¤~¦GBD;XÌ+Nå|”¤}#¹zÒ0\>_²½Š°¼íßµ\àÔr}‚Š…¿t4GE@0ù´ü'Gå|ÿïw}/7ÏKÝ*u½ymâO³|aä2ÅWÃhjo¾ÚêYö#ìëà·q‘z2Íé—ùÈÙŸF˜©Db™ºýGŠ¢Æ.6‰‘015 ]…ç¯Ãï ¼¤¥"P3åÒ‘Wmɲ‰Å4Me”ˆ-)}ôd  yv´ï5¹Ó=¯‡f9Zšµ¤=1:¹¾ãÊö5tqHÌ\ï=rÅRtÅÏ ‰éìö ™Xˆ©ípïöíxÓƒ¼H´0Ÿ§lDFV'O¯aB0’\8ÌLÎþ#P• Öm×s[^ÓÙ˜œ‘&>žÜ\Êq<sÌSS×cz­ W^F…VÈÎó÷=!Ö%CÅ0í>Êb¼sw[ÔÈ{ëlÔÔ›únÛ'ú¢TÃa‚¼n½b¸ù‘ÜÂ]›‡vˆ\3`ZÍù3sÌÓ´ÓO²…üÎ Œ)r|^Vô;æ…] ÙùäÕlŠS¦ºJ‘.Òg¢½8ÕƒßØÄ¤G9‹és\¼¤ZëÇ£ì1§ÚÅÈØ,»¿™B]æuÌà`Ùf¢€TƒãF‘]Q&¢æ¢KO/¢Dèjé[dМ@Þ ¢¤ÀF®Å…Èù µv,¶­æ~ðò‘ÝÊ¿¡¶9•Gâ]"Kò¼º&&3OUGº^Íê“Q7?m8#$r’‰äf¯¤ò(4q½}ß@Ä4¥0òDËßGüÒäñ#h+ª|Æx³*ýû8W(†[WrÊ, bûpnàlÐ#(ï¼8ò] äÞ”ÜÔA‘·òˆY Äw‚OUåÀ¤"N±ªx/9>c`n·Õ™ãk½˜ÿùn—Ñ+kYnõÝAÑÚÛ_Ì¿_Z–¯~½¦[ÝyÍØ9=Bõ*mr„7¨;C46I«›Üäæ•¡xzZYŽÍxôÁ3ù(©k¹pˆ'^»ßZíŠBöéÏRO$9{¢¬_ÂïÆ1ðͯ!xÍd;Jœc¦V£Kþ=•æãˆ¸+þ‰ˆ1dÿw©ôßîˆY‘ñ‹¦ÌžÿëWÆzñDUV”áoj^覞E1@ËoùÓ…_³ýQª¥‡û9xúÑ+›ì¹"ü¹"‰'úXŽ9Öó× a%›[ÓAÓR°Cž—{"Š-'¾T?w)Û«ædË/,ìºÐ½,6á’˜ã,‹ÝW´ÑµÕý@ÒŽ!%å^"Výa‚½ÿs&)‰9Á˜EvYŸpOW7{īӖµ¨ž(ÑØÈ›ÇPóÛ3•;ð¾xîd¼f€+aíAqmÕcÁ} «w±‰øY¯2Jë±*Ài˜›k¦`jLU Kn¯Ñø…&"Yí#Xåhا±drIŒo]¹ÛFOèqÞxö]”SäÙ7™àiPÓ¼^°j63 WqR|n:èúÎÕdxüµl*ݵíöQFܼ%Ôäûu$~x軃o.ÑI’m?Á’)CÐ+jÂÝ7y¹^™5÷B„÷'d≇S2Ï$KŒrZIŒ6ñ˜V0ÒâŒÈÎÖ.=+ãbê:ÜÍP£#«%¸y[½^ŠÊçc…¿##9Vÿ ­L‹·}·m!,®éLþ–ÁúotjvI°7a—rsä5%înbü¾µýF·SÎqnX`«iøÖ‰ù’ögu^N·Î$3Ìþ¯¿„Ø™ËMR]Híò«MÂaÕñìý:¿ÞÇŸkBÃÓ,0±ÛT­ÌLò—÷摬ÿ"’Yž[?0¦Ýž$Z4’ †R”?}"°¸³tò/Îþ`ù9[7¨‹Aû¨+ð6uífà0T"ÛØ:ºUXzA|ÿȧ˜öð¨°&hâuçr?áœÙŒ–6‘úw…~»oØ¿óÃÂ|Ôåþ|ŠGÆã¯}øš¤kYî-PªFYý‰KF–ŽŒ¸ý±³šQë†úÁ.‹nï“ôÀ>j4ÞçlL©3‡"Éxu%5ßÄlT¼©rH»àJö‘Ròòh삆,çÒŒ´{I9ŠÏ䩤#ô è—G¬¾Nýø3VS3RqÝol$”ŒöŠŒBOo?ÚeÇ;SyõöÞªºÚ”0þD~Ø”fÂüTúglfŒâ­õµžDÂ*ïcÿ”oÁ?ø†H¯ÏˆÍì³k~°,Ý™ÅT[ñ5!•»¢ór4Œâœµ¶Ô„傲K‚¡Ë4¹¨Q¢CpžÓ^¾Äjñ‡ÄE£©Ì Ç,ÐÑ‘ۻä8ÓÀy#ê©KÊ¿¡ÿÂû÷ 0qmïáB@PO@@ú¯ÿ•õááú‹7¿úîúì²±R`«CbËXµI"ª<¢*’+9# àã8Pþ-ÂÅâ„»ó{Lµ¹ T[¥Ý°~ÑuÑÕ쩱}µ»ÑàuKìnóî@c³@Uî÷÷¼§Í¾»B¿±»u¿‹M‰°_Y£è ó‹_°œA7ò† ·FÜߺh‡÷øÈÖfpE—wqoãR:—!ÐgÔW%¾M[Ýc¼·•É´§¦_A÷· ÉØVMóá ÷-Úm9¤/N(Ê¿%¯ù€„%Œ¤$Ê·eé׃80jdú,”Ö÷å%ÞëO|‹æ§ ÛCþ€Ú»ø&ÊöR±w×úo–î­ZØ’âø¯‡âjøfPVÐ2w X2ÉšÎö’H÷z™…›?!"6“¹s8vBý¸õØt+}ËœñÖËjw-Šæ'Yí–íÁk–'Ú‚û/(‹hE?ñ%Hb0Pò1ýØ1éÙÙuyUØqÃÅiÔòõ|ºT à3mÁð6#K³Ÿôdv;L“ËT»e>›Ú!N¢.UŽÛj¨c®TÇ›·l‘Å‹éK3úÏ‘‰¸×?yØ ÔÛú#ÑÅÙˆ ‘XË t¡¹:â?B ¤hœ8œÔ†Ÿ„8 ͶÖM† º7cCŽ ’„ ¨$æVúˆ=ØÊ KƒSƒÒ¿Øs¯xapD©xŽÝEH¡:›û¯÷„Ùôm €‹PIZM™– v·ÂqÛ_ÆþoåÅyÖº‡úÇîlÀ ^™v!ñà$ç¨= ØøH[S.Î1¯EÍä”1ˆƒÅî‚ Ý›ÈµØÕîåöýÔBªnÚ\‰³Ž[µ¡ÈqÂÛJ›òZ¿‚ƒ[…TREný¡ÝM=~Ä}YK80Ð$ŸÔ9öªŠJ€ŠÀ–¨ß#ÕÌ|m{²ðH{Ú7Ë)»¤3»5ÇWl©ª°¦0#€Œ~üí}`–|yIžõ¥^Â¥@¸å±6÷àá>î>f‚/óŽå>c#‡ôè@=_×HyŠà?Ö¥×ÙT…ãiÜ—Õ¾”g‹•cíbÙ{R¶Ùfø/† ÏAû½.š’ úÇ¢Ú˜êq\²…®µ²õ]Æ6IÖí^«òÏwâ9Oø6,ŒëçÚ´ÞY^Ùh|WøÀÞ•SmÚÀ¬Xë+„N´áõ u{Ÿq Þzú%gÈPݵÍM£.<Ê8£_5òJýyÏTü™æí%¨x`¯*‘€>ãBœøBp![v—@ëK´šËrù¸âh³Öœ¡e [#kcw¶4[£Íå_±¯ôù“hÎ'ÛœÉg9§ªgš¬Mö?Þ¬^]?÷K ½§ú›>ìätÿŒìYä]_J1F~×–òŸ[YþF5>Š»ODV„EQ+ÛQž¾À­ìö2P÷^{üŸ³cÀuÐ>•=K©ÆÏí=D•Øð+Ðÿ‰XŽšG_VÙÍ|¡ÉVG^}ÿ2~ä1^Ô=.ü-8 ÕÞA>ÂÃCÝN/DOƒYŸÎ”CË|a½³ƒCºÜ^ÿÓø»ƒîKfÄ;5%£oK²õÆVŸÚêU5˜2=êöK}LË—¾/'¶—è𠿺L¾4»§Î&½|Ûóš1­_Eƒ„yPÖ" ÕOÕUÙ{C|ápyu¾—ªÏaƒ J™"÷édÜ5dCBmÁ»R@žÕþþËt‹f”+9îGåñš ¸ˆ²´~í7³ ʼEáKw»!ª‹€GD™ÿPdY2±×^9";U-AÔ{Tu{®ï¢¿·ÇÓ­——P%;’Á6åYãgÚ¢äß?·Ã{>ž^뀹Ѓ£OFTСhüƒ«sÖ܆谵Á#X”¿”â¥Íéj1ŽÐ›”Uïâ FÔ¼:?ôTÈ»Öó/Ïm`¼ñ蟲ö·,m›Cãºï-ºxÿ­Q'?Ú°·¶¦Â®Jz6Þ?m†Až)ÀA}ÊåZ÷ÁÅÙÝÕ¥Ö cC=Q×rùÀÄŒ[}îTæ»ñuó‡H‡"KÿLB²Z rþ!¿C@P»¬V›AþÄj8Mÿ‹Pœ+çfâ$?so– ì{õ¸uÂãæÜ8ɫߢ!¾Yq#2Ð6³Î/‡òWìjéóú‹¬ôÍkˆEáµO«qÛ•h/1²”e6ÆoŸ^íùaÎ9ÄÍ2¼ð®âCõMwseìûxv¼ªì9Bs䜫gÿyð ØÚ„‘\aHA ÙUtY,Ìß_ä,hº.†…¢?œ%z "õO]Äê³åcâ‚ÞcŒÞ®VŽáå~›…ô»¼îc5ž¼q*™é+Ï"ž–uW ÔåÄ&*Ó6×cÌhS!J…¶é7¶6¯líÓÙß5ó'ÚÏR=[ätëT/þ1Oîxì>|#g6‡•=š&öü³îáÒ˘œš&íç&÷ð¯ß';ªã0 —»eƒ”V²nxécø\çü;™êpã…Cä=n¢Ó¹¬U_¼sßtqÁqôŸšÙQÛ9íuž)®cÅ×ñÛõ‰¸ °”þNä^o§(dã º¥™*ÞÒ¨•Fó\w ‡H·'žØ¾U,¥íàJ\页‚|§Jž¦>&mØQîL Ô“2Èm N¾5nTxÑ«ä¬KºªÂ(N/&#˜x§DŒžçù9B^„£h#D´öùЋ1¼Ó~  W¸ÿº_¼°±‡Øâ+ÁÒìøóÓY«!w.Œ.H â®6âeyW”¢‰Ü¢Õ… Øö3s,R#ª‘|ÌŒ-¯6‹rrЉ8üG¬gèè3áÔωh-"Ô(7@=jdÙxø¬™ó»=ÑÃx¾¨DþàÊQŒ…$UHƒ0(A$…¤¬œCÌŒû|ÃÓ¸7Î)Æã=.!²q~›»¢µ•âR’~?é}ð`F¨‡·Ö8ûàèö©mˆ—¥{ØBZ.¬‰¯ÚS¸ú«`]šZFÇF)Ž/Ý!4i.¦Î"¸‰•[1æ½ ¹/+Ü6, ý˜ªzÊСj— àá¾Zõ¦èÀ‡Ÿ3ÎK‡6ÚgŠyBÜ£m δI§Tt%˜Š†¶ îØ‚™gä;ÚØC'»®åȃ^cy¿Z½Ø4g…Ö˜ŠEÜ„ŒvŒ/ŒU" O¬øY@Q ºÂ¢$½w½”Y'ÕüOÖŸC£4g©Å- µOºú!³ —þêU# GW·BâꢱÚÌ9¦±YÅÔüþC,¼dÇ/ÚµÏ!6dò¶µb0/û_sÆq}cC‹ÞFLLÜj<·GDášfO¡¬ƒˆä Y%¥RZÙçrVZ©ŠØ‚+Ÿ$ºS‹!t%Ûrý˜&Dïm¦Ž—ØX$6v4¦ÖUn^U ¿t;Wwsc¾’ÜVð«à:ŒºnqþACãÈ¡I$`]ª9:޽ñ·W›5.çÚzæVî@ °poñ£1>ÂÔQÌÜ ØÔ–šš’5“!‘·5´?˜#ëx@µÕ§(J̪ãöˆnn,4'óœtÙÏ"Dubª0¹ü0·jæ7Έ ¶¢ü ¢zpKXf/©© ùOÍÕ.¯Ç~è½xDV±¼@”‡#‡µÕŠêÔl™Rµx]?(á¾¶7ÁÊyT²sH·9J0g;t<©¼yš˜ãR<¥ü˜á0»oÀÕ*^n3 -BÇ]I& —ÒRÁÄÄwuÅŸ¶Þ'ÄZ„¤hÉ[æ|ƒ°¨6n>¨¡ôëu@_Ü^é±j´A8Åhí12cöšÍM/VÀ}ÂÞæ¬¤ãEÜhûˆKr¥URCaÙ¥UQ£²VÆî©‹T æÒxM‚à?'÷ü A7ìøªÚù|jy8v1¡ù‰X‡ÅÊ)ç9S¼píìÊŸÍ*vŒP‚¦ÕÔ/m£<:j~äÔ üƸtQšÕ6a¿6üÇüÞZq{T˜æýTá-}ìÚÂÛdßRLv+%=û÷N˜ŒÆØüž]û3õÛäÞÙAz#²b§2Q@óò! ô‹î0@¨rwå®d…Õ7Ød>/+Cö¼34›ðg0ß^IE©‡È÷O‘·‹{›ÙïÞW/?Oº5úÌAûe8$W7Qnfeq8xÜK#D(\^?TB;F‹WV:~ˆ—pBx|TìiªdXFr£ª\"Àº7õl¬(¨Z±Ñ¿ÄÓ+Ž^bDm\®ˆæè(ü”¬gQ2·Ëk$†R2DÉŽý’3ÏéRÔ d«mDri«eäâγ´cÊi#¯ Ú—ŽXÃ.ÑxvŽI7³£‰Œ3¼…UÔ«êØ90¹Û3 Ác¼¥_Cða9IØØ5wÉ›Ë4¸¦M“”x/z»©éÕŸOäø!<]UƒP~!÷J?Ú9P0.­Yx2S9Èç™Ñ,¬i¾ÁÆc7ÛZÙºzV4ž]Ò±Q]¤(•ÏFÅ6Ðß!%"]Zµ uN46^H¹µ¾ÂÔú]a¦" ”X¦•Õ5VM»KA|/ž Ÿ a3#¥«|™ÄEäØœCïÿST¨Æ­Áµ1eM.Ų߆kdßö+ˆ囨_Â^É"q5SvJ–²’ùÊ(”DV@°Õ„ÕH-MÙç"h§­²/UU‹hWTg.£WíÎ=ñò¬qLFb£ÆÄ¢«zßȰîæ:ñ »ö)a+_WN}h« ?D?\óE¤• üßJ+zz‹K®hÛEÛ¼§ðƒ,ܱ9¿ž l‡ŠìWçü\öôϮƺe©ã3hzº"C:z3t顚¶ëYHkÊ-B ô±n7½ÚƒãÖÅ&Ö =Za Á…HòÙÿb”‡B:*“2 L?$­p¸¢yÝ*'y¶ŸR¯ÝÑr;Ü*ÃHIËné÷3"~èb-œm‘™%‘šC¶¨ÈóÃt'›ªK,<ÄG|æ5ÿãçZž»±ë„¨P`†ÌPà c‰*·€å‰Ì\&HAÎ^c¯ø›ÈVï?¾•+ç˜i?ßQ¸¸uÍ?pºö¯Þ•p³}~|Sgu‰9̤|D0Pgø˜î õ ¶c.K'- Ω·úê L´|(e{ýÚ{GÌšd—:äv7݈haæjk rûˆÃ&n¤äZºäÜ¡B’§'Ñîù@˜F>ïHOîJ¨xuˆ;EôÃ&¢ 7úìm•ûg šfjâ°b¿H:7v\àO#üMÜÞÝáÝ'‹ŠkîÆ¥½!‚×^>_ÀM [¬¿†OL£ ™”ž¡VñO$ºÆ`’eRöî0´gx„'íã+ âq¬åßú–ÁÒ¿V‰Ë8»lŠìËÚbm7IÃwÛ:éMÈ„a¼ÃÀm~®ºñÀwî/®ãÊ©ú-yž¦æ-aÁþØÇ{7Ç7æÍ™c@#+¾FÌ-Af-ñêKcÉ9¹ëÈÒÈŒoöÑ´ÒÙK^” …"ÁèÛmϳz¼öš·òÐÃk(\¬(˜É²¬Héa›—ÃIí‘;¨Äa„£?¥‹´¢q7F7µøáhMCÒÿº#@òÝòB|¬òøM]Á}6)õ—:ùÏ%aBrçgL7gûÂ`RG9vVµŒb:üÑDê,õ!SÓ$'‰ßoÔ¬ ßqÃ]nÚô{·Xãø¢“ÎÕ÷7WdLr\+°Ô×TaI NJ?nJ“§Tí‘‚Zß^pÍKˆå#_G$MU Ý`ÞP?è÷&K²FžèúEGŠYW|”'õO§õ}Õ'yÔ§yüÙŸkÐtÔîÝ dÆŸ{.ýü ƒ·é¦œK öø`+Ào¬ÒðËúnÛMnádn8MöJ úÿ—ÉybØŒÎו8–3¨©qù‚*·†CÓÐxs¶ºî¬øùøÔzBTònM2QÏÉþ«èð‘³/Ù“$å®%Rf·`ò}S”³•­xRæ Þ$Þüçšë­ÚdÙ3DŽñ/Y1Ã}m°X0}ms1qÃòÁ¶‚×Ä›¿ãüøÅéó¿ÒÄÕyï…wË@5¸ ó\ðSÌM»¸”^‹°©±T­Sz¨î²`qî+šŸ²(`*ê7Tg…-EXg´6½Ñgâ#H6Ðk$å’›Øvi³oî¸ ÷H*ý0tC»xˆ@Gˆ +v¦#Ur½¿BÕ­›IÉ)}×Om bæIÎ%›Ï¦öâ5ªi· *ÿºõ0éó¹ LL»õPp¶+ìyËsn[›(§du"„,\Q H-=ɼ¦àñõqU3ù05r<ËbdŸcL-Y)eäÅϨ £g=nÈñ[?xmŸ.|­!9ÿ’í¤‘½T‹ÚÝVŽä¼ãB½] wp¬±à …cÝ;í¢ì&GïFúƒ$ !% ¶%O‚f³)/ ‡E;&"JšùR™¤)Œ’áêÜ(ê%sþó2É 7œwËWàožðÂR^/QÕc ¶çy©…e󂌲×sÊñXgMõ¨:«¶I‡±-^Ø”ò‘„ÃÞ¾g‰–öºŒ6tE ¤ÛŽM±Ùjòþ螨î–SHûýOžc—X°”G~eíßXoJ–·~;†'.óy7_â2Øj[zÙц»Ú~x˜—Ñ-rW™' öG”f1äùŠA¶oÌ—6‡{5èвÈX/i\`W¹>Þ—ó))z÷YR`Ncõ²')ô!ÉK¶­G욯•ב!—Ã;]¦BØüÂËgyt«}BØ&†Úùøz…ÿ&@¢üzúiHÒ[M­¶ðÏøEñ)PY<1­l‘×# Ф ôtsöÓ@z´´FÊ›Ú'úm¢à‹ ¯j¬'8?9¦Cx”Ÿm–¢åH«Ç”ÕY¡öµPJaQî1ä¤Úƒ_È‘É<ëzo[NÁXÁhïz¶ôšÉg‡‚ƒuD£}ü¬Ó4.N›QRW˜î‡zã›Dϧ¤‡B…3ýõŽÝEGÃãîÀçî:s"ôCçKL7 š[ð¤¹ÍX!ÛTiºî  åd̬Ah´Âs-o¿V‘ÃH%ð  Ú |÷\žë*lÂQOš7íG¦T®)šÓ û§kU«&>¡GÏDodE·gøx’d‘nˆ8uG-ÉWwd1þJ¬|„EÞÕ`grƒë÷t|•°= V¡ÒŽ©G~Âøû£í—cuú/ÍõÐ9 ­·ŽÌ›¥Ð·Ô»›>q‚yˆ˜âsÅ*WxIÊXâlça‘³á!õ…@¤á±Th£!iÁ¸/=C¦¶M‰ ”*bˤõbU;kVÊ–i‹£fm'ëÍÜײ 95¯4Vthº×W›Âÿ|<~gœóάÈâcB‚â!Ek¥¢!sdãrg¼áþepxݾ<Ä¡ˆmî«ðY‚ 5öŠ#ð_1ìªýˆ/©°D@WáTg“~åª>—J"z²f׳MÇc4å’~| Çt CW] S¸vÔÔZØÙÎY€5«JÎ\é/iËцC¤ïÂÁ[š‰ÛHrTpÐ ®cëS^$M½f²ÊÈì²—QÒÃ,¦ŠÀÐÎY€)Ú7kúϧ¶)9Rȯ‘ÇnÝ{¸‰/Ž?µ¬+™¾äîòíZ“<ñg/>Õ ß_ÔGVõڕߨáÙ.ö%-öe üú§ 5lhâ³ â7ôÎlÍk¥XPñ¡[$;`0¥þ»%ú¤®{ãÏ‘fk5ÚˆϧË~jÈÞÖô7ù€šx ÀL<)¶×ºªÌ6ÈàUr>éFÙ1õI¢³4ãîíD Ӌ7c‘˜º%H+Ñb {yq#ž š1ît7T¼ÎJRÈvb/‘ž0…=¬ ¾ Ÿ×'³TÒûVù¿‚×ïù[Œøÿ4$eûxÀ `CX{S4×ýaA€síÿjq2Xø•úMõâ>l îh3õ£MÁæDSˆJßéq”˨øèŒÚË¥r#1µÎìk(NsÓßÀ[ËdÌYëìµèÆvŠ8ûì@ÆFdéy£hþBV‚Éò;-×»ŸX Rߊԋ uˆ ÕôG™±’^Ñ1ÊOõ/e|Á‹Ú§DdûÄ¿aÅtÈ~O t9„Ô"2_´zÿ^#‚þÝý…Ia|± äüâ|ëdÿŽÚÎË,Ûá°mLgl啯 Y¬cE2ÏfÝzÈñþ”ÙW¯±o5,B£8àê PVo}[þÆëúÁÚý~ež ‹–Qygô)Ÿ¸ø×ô³HˆÃg¼ñàö/ô ïØKJõÆ·bÛ·r›Ô#¨Â•ñQýz s¬÷Ð>6+õ¯:qøuų~óHñ¤ïåqî@Õ ßÚ}õ r›]âõ‡&¼¤qÆ(Ì~¿HÝánÁý”‡[ùÓ¾Ô=°É=ÕE+n™8–ù‚eØ’X1Õz}®þš ¦YXaZ1‡W;*åDY茬v›Š»9â&ÕÙô¾WÎJâ¡”¯?y÷-„ã’ï/ß‘»‹œ@ŸµùV¢–ïçi¥­ÀoQÃeVðÍ|g;ºN{kWÓe}¾yN"4{NêÌŸ>܈批¡þ| ºlü¬IY Ó£N ,zg¨#@•†§ëÚ^M…Gâ!}=!AÁlÄo0öMðî g!©µbor4¨:YãL23‰Òž4†Ã‚#]4;jûä }Y)0…ß˽pó9©ìßš%:¥Ò¾g¹1ÎB¶ƒGCDAy¬¸”öå>JÚ—¹ýŠÓ,ÓƒüÊÇaTù´Øˆ™¨;ô‰è±—“K»¤S{ÿ»5Svç_RK‹Aµ£$ö³ÿë\]ÿ„~KA^°D‡yMݬp•#ÏÎõ3‹%ö¨WÍ­›? „"=Fã>¦.Õ-€šôþ°û*ºrUÁQYÆ¥Oò»"Öë¡äPŒÑ'§8™¦:)^P3åU¨Fò3Y3%C—ºû7…R;Ÿ:{ŒoêCúÜ"úWFÁˆ#. Z&Ywé¡imy—®_ÉÓ³n1 ƒ¼ønÊ \ßéBòLjO½zýÆ,Ûÿ$™å qÑŸC‘Ÿ‹•¾??¦¶Ô4ì11ªåö7‰[7ÁçS“ðħÈ\ŠÊd)ÆŒ*2 ¿È.¦äÝÈÂÛj+Ì<“õ“¬%5ÿ£ó—`itôä"4wf™-;æ¸cË”)=l„u¤;¦Y8 bé·9‹lßÏPEßaKï`莩í¾á=úÐQþå^¤NLvxóš¹ Aèy½U;ÔØ€« ´Çjº×«On,DŒÖïl?Á\¼,^Ñ:ë»”5ð5j„ÌOV%1¸-½<⣦™«…œâÌ'ÎW%ÉÕ¶&PçN#K­fkù²ˆç°LJÂüÇ„Y–åÆË)›3ÞÐé¡+.@Ñ„;ö¾>0&8ÃCXšb=9˜qä³Lò,.tO4¨ï±|Q7ª½C´¹×ù¼þ³œ€ëô*\4ßv•1’@ç59m>Y–šSx>m¿Ó4«o%ãù5&³eŒ‚(µÑet!éÏ~ŒHr;ù4­‘Ê5N…×ÞÛÀÛ™ÀÙcõ(£æïy…ísêïßä¥ÇC»ùV1¸R_RØ­™þÁý!iBPÄ2©©7p”UÊš½¯Ä1ˆëèOI×´5ô”JhvšÅY¹Ÿ¤'FsXRwÚ T1AÚ‹ª¤_ù¹œà6à÷Mnôž0nÇ#»e‹èïÀû¶Ö_-ò6?]+£f$ta&_hçÇ,¹¿ä#ÚµYº9ëd©RS 5,‚M˜ô¯XzU?ôàfÝn”ýš6™„ûõHõV@/˜Øc£B®ŸL´Y¯J¤ÿ¶òV„•#{ãx{Ç{#¿f…ïá)‚s:“Ôâ_HÉ"*‘=yu R^»×d<´FÊ8Ý‚ê§7o5f {c-ÖfÒ{'‹® g~öŠL4è4§^mÀ4’:²œSÓ ÿÌghL$Ûw“çWf–‹\¿iUO5«35:è*˜DÏ#QŒiËh•o¹[”qkéRotSˆZ ˆFSQŽY›]¡¤†§.,`§±™ÇåܺTæw^ T:ŒÏN&æ[19ŽhrÆw‡}ݬ‘ãd&‚ݵ´dúl•gú«2ìÞòÓ÷aÂ÷å§öŸ;펟óÊøÉ&PVèåf“3u.e¿È²׎~¥Ì#6•ñˆ¯Ç.°÷¦­ zÉé¶/}¸„HQK0ÎpÓý{ÙÄ8â†@¼Sg¦Ð[àä”<禫spX’–7«{kψG’ŒnŠF&ã–çäÏ¡ÐJM4<,%—Ñ _~¸{«§íyù–†–È粩"”p-Îb;ËoÊÿÇàÿ½îÌDÐÇ,8TvS»2š òq“dæ'cYFäw qÒOÊ èøk«§©y)?ÑÊ©Iot®6§–Ä5>ŸÈ¦ V*bÊ¥¯ûv€»Œ­w6¸§èÞ¨‡ò±ò)ϾÊi%9Kuð® ׫p£Üñ2³8M ãø@p”f¤Ä«—gålâc‚ñ2«0’[_B¾¬(Sbn(q°ÜˆKGMg$¦dn ïõ6´7üóß(2moÞP2‹záB2ulSjo€AÌ‹îçd6…6Ë–¯,ÉŸ7ïÌŸi\ÓCR6êø[|t›1¾Ã°Ë,âÉš>/ÿJN¾­{õ|FæÝ¯5Ó¡!³åûÚëî·EŠ~ðÜÿá–SƃAôÓ¿ëóž¢}²£HäÛž´(äÊãåÿ÷wg-ëœ;DY^`lí¬4ÖÕˆ7ùº©PoâÊqÿ)FOE}ÊCì š~;¢æ œo¤ Lâ͉·WC·%ªbæÔøGHN0­á¦±°óJöÉ0|Yeÿêå ž¹Ï-+¯‡Jcr§Ñà4®Žåï!‰ZýÌ»))'‰â¤(£‰ûŒ:0xÿETÄ+ËhK{3R=-²kÙ½K¾ÑœÈKZsEÉR”bþcc./h»fí~œ`õ_¯d2-æ+:Ö3†Œ€ðöùßp%MØŽ-ja ÜWÐSÈ‘Cƒ¶îO¼4þµðKrxœ÷@膬|WÑî5'D`ÁW‰•ÿ%žE4ÞæT ·¤mÀTïXZ—ê×áhÜ–ôŽ›}Ûí[æLl5¿§#ÔTñ—©]´ÔTG JQ}p#kC)×DO"òIR9š|ä¹Ä]>܂¡f„‚wvAÔAwz—úEKl£:šìïÿ«\‘4—Ü l  Lè^ ®déa*iêaú_£_´/ °,±¾‘» 톜þIýPÛPTP ýñSJØ‹<5ÅÁ+ ÁÙ ãÕøþÔžkÛ½ö ©B®"ôØzr¦,,,æ5;ÍkDÚëÍ{(Øéì=â þxxpsjW[2)‚Éeÿ»XL‡rPYãJ³áê•ÞAæOÙÁC—À(RH§†AZ/]€N©ÇQ‰6Š·$Æeù—_­2þ ÂS!(Äñ­”15 óFe›;ÌM‰Â¸Ix™ +¥öäîŸA¥¢²ïï†Éøz§ø&²¿ú@©HÞ–E¨n©77SybªKrx§ðZ5V s¨§†ã‘N4:Ã…ø~]rx:.½åªØ˜á p£/qµåšÝ‡hLo°J#é»h¥ú,bY$(¥Ô¥Åµjkj½º#æˆõ›( Qåà¼ñ)ÅŹDhîÇ9Þ¢²¨Œ8†eæ¯'z²L–µ¡TätÕм2ÍsÔþ2HAÔQt¸u¤,`õ&Mþ«¨Áõò ‹Ôf87”–k§ŸˆÇú>§\»Q¡x´„9ԚщµTŠ„¨4äV¸§Ï¸©)¹úýËËÒbŸ˜MʨU³oÙŽÂÝWêȇÐT•F ›f:¹R£-3ÁÍá·%5(Ül “Î2ŠÁWlPSGr¢‰^i‘#>§¢¦X“ŽS`+žËïPÃ]ëaÑD­ôT:#·Xž„Nì´^–¬6Œã5³„ntCŒ6­ÉáoܵÄ&§œ±;Åïâã;éëüe¦¹ÒüÓÀTNö„g¥VŒwþžXPHÝíÜRx•&{¢»ø€q>©³Ê#¨,%ÂÁXºQB¦˜±EÝCw@ÝÃdë%§skõg‡øŠ£«Q ŒÇ¢':ƒžá€ÙªfQÀGgÌŸ{ðCxà‡°ÙÓ8ï ïúÕž-kxÅ]tܧ`þ 7~á½XÆÄ\Ö‘±¤‹öXæ‹ü˜XÐÜ?È/¡ûÞ;¤½ 9…AŸŸ”sÂÖÊÛú%á*ÿ ,qí“j'éVZ ”ÀÈIü¸10’ùªΗ‚¹:Ÿû+Ò¥Ž²ÖÌ F[ªÝ+l³0Z¾£ `ŸÂò(/Ÿ8‚2@yœoUäÅ? §ÃŽY'S¾/p©eoâ”ÊÜ0mÐF¤Ü2T´ Ù+7µS´:ð;ø_ÎýÒ'HŠq/Ùíໂ¹M.)õK ßÉãñíå¾MüB¶%årFäÌ™1vÜ,úNƲ³ŒL\²ü›ÀzŠs³š¶94œß2aë†Vüuv*|"ý‡wC=ÆEe¬Užç¿®@óß١N¬_Ñèl¿í^&ùÂÿ¯VÇ:É®¥Mÿ¨öaA0nô™ÔÏD6^ï¥vë껜2ñ n»qÉ0kþ¨WªÄj[¸QA>¥@‡n÷x¬Ù­WfüŒ3!¬³·i'n0ª)y”´¶ –e(‰—X>¨À¢òªžOr5›ÀhÁ-®¯€Øírõƒ$m`öTп¾p5QFk¬ÐùÏ·oÿTá#|†ª.ú2MYÊÕ‹¯÷XÂ4a区é\9r Y|{tÏñmŠZÃVÎqÂ꣖ƒp“Êÿ¤Ðæ’ÅôáTY‹ÉXžæ;ÁNQ.ŸDƒç'Ñ?ÎðLD‘έTwVÄsuýpUȼ%>¸´iÍ­ÑêãZ G=°gnÆû]ÓÁê*—&Œ5s娮qµù_(;oå·/øÄIwË$ú·×I%þñÁ; MøahšRˆð5p«M(üfIÉ’VÚr[×Y®sR2¿¾M]?¥ö-gÿƒRÑæ>Å"òg£*„÷áñ¡§’o°–€Ž¸ {l«˜÷bß䈹Ö´ÖòÁÍ —™¥öRN_,í$Rפ$ðÈiç(×â“H@6Ã] æ+T÷"V¢% £ºÖ=ûéðEU¬4i¬¶†;]=‡fÆu‘Uöú­8!l&¼sí+O‘}çën†9!"B{>½ñ§*WRü.}€ýa¬í?ÌE±× 7>÷–Ù´hqET¸RØÅÔqÓ4–‹kù’èü„±€§çÙ,B/I š_õ=]1qÃ$ ßsÏÝ0?P]q‰N•@L¼¦{7¯äâxÐW)¹3b|Cü÷VK´¸4vý?éhÒ0õ²tq¶uú¯Ž¦rM{•E¬ #þµ©QUQµÎSî èÈ07O~²®‹vKÿv¬v¯¶ôÛÄ—}XE JŒOºh‘IŸm¯M v´LPÞcÏɽàœÿ‚qÿ'[Œ4‚t’ƒÏ5‚» žP˜´¦Õ±@hfYÉ[Ñ—_C‚Çq´è‚ZÀxüTŽ ,Ivò퉬 öaàe=žålQ9Oœ’+¾¶ÚœO‚-6->cºµ ý[f3säÇ,Ë…%çÉZ½á­Ç³ùÄÑ,7(þÃOy®GÎúc•o£Ég–Ó16'¢Rq TŸa†Ë*Ëð•@Îe}ï.“ìožªã°xAßèCI19¤ #)£3æ §Uïid–¤d ¾O?ºoäH›[æ"/%bô7K‹ýWGŒ¨º#†{Õ%Ÿüí©×jø)ùPkÚ\l”"¯ë[šë½Zu…>WíƒÞÔ¨Ú'<’1¨~¼]00»»^í0¶Mƒ[ÐÌßMž­„Ô6†ÔÛØp‡lKùgX(CFãPQ¡Ê7å[ N­ü’ ÔÜ¿cYwc‰®¶ùX#‘™Ê ]rvå­(ùAèqø*öÍÀZŠ´3!éK‰yæ ±Æ®;Q.K1(ØßfÛDmNz%δT}§Q¶Ñ«ª5ãmÜv¤õèÔnI‰e ÷,ÍÈó4„hË”OÕõ~£Do= 9 ¿Zñߌ#7ñœ9fíc¼H"3ù†´Èb+u'µ¡ËQy£¿AÜ™wü—ǦöþÀ5Þg‡þp2÷ÀfËùkJÍ÷Û$ •£Ìs* Jæ¯GÝõx“2ÿ#ÀºRÇføYÆ _k³Áç$²µRÝ”0Âj9(L’Ø€“+¼°e¹@ËD{ÒS‚±=x·™³#Žhˆœ:zÛèÙ’Îÿæ­+æl¾ÔÀ“Óž÷”-ÞeA|ýw·hu†MôøÚ] üOZ}5Æ+þ‚æ-ç[/K¡³ë §áEã®âqïòl{µ£fQφ)ÞBãJ–P’ò&×’VíÍ•£}¢é''ÚãÅÕ>ôº—ÓÉùÏ–Ö:mËn–ës×ÔæP àSkt L.~KMã<Ù©m* éBþŽÁ¢oÚ9!õíSýj&–c²wF¡6±©ÉXåæ~ÊÖZE_L6„úþ]åÙÉNîy%ó‘ nÀv¢ÅÛߢæ|ãÇŠpÓ4‘ nÛ”®­ç€fßj õ'¯qQ•$ÒÏ…›‰ vнގ¨@§‹› ¥‡ gª–®ctLÁxP¨ä™Ìœ+ž:,WÅ®e ý/rO˜rÏØ¡'!ïß>¢!B˜íB¼½ÞöìžáíÞ©æg—‘5$ø “ª,*ÈñÛ¾PÔÛâýoÍÖ]VÊo €[t<Þ„Dä€0ÈÂ&ÌÂ=I[v˜_·|}@6;“8¡‚æáMÇ&.Ü9šÅVæîQpZä¼}¤€è?¼¥0}c<yÁƒ‘F ž¿ß2Fû†Ÿa‚a‚†æ f8™NÍaA-ÏŽüLnrìjÔ[|(ónCÒ˜¨aÜtZÏþíM ï^¦»ñ`FÌ0öÛöÙ}ŽôcYuù¾÷ŒSèßqJ(­95ZI‡Üh+õ‹`u"¹–³+¬—VcºF4ÿè§ #ex½LÝè½ök_/C¯Æ«¤w·ßˆÅJ–Ù! º£Óô¦HS}I°vHY†Øb 8RpÊo›=ÑÝ[“§¤Dô3×ëôcAÌI'm­O?†?È«A|Ou3²ø@;Z¦·M0ÅݼTí–ÀþVS³nî·u¡¯þd·¨‚ªêGç%¯¥ÀR Q©QC3KE·¥XY.ÓÛëúsà+›çH½¦b&G¡‰ss«t|üƒÔyLyÅG n°h«ðú;}a#¸éagÈRy®ÿêȽ)~ÒÑq[g&ñºœˆ ì9æ…+I ¸Wö¢jå’Y•EÉ÷§p;={sG·ºIl´ÊVGxur:ƒ³¢.ÑŒ;Ðmã3DXc"@IÐ3¡âÓ6–0¢uÞëL#7µ§ý!NGClGèx;·á-Ä·Bè8ög²gé°_$äêuZLcBTrÏ£!(Ÿùï!Ík—IÜ lñ?´'óÿÒ¤|,Í==,UÝœ],Ýòbh¿•—®ËJ#ÏaTjºBŒâX¨a»æƒá힋ј)[œÑo*FP¥»ƒ¨·¥#Ù˹~Ëíjì»rÏÎçÚ½Á6tç†ÒBm!9õâ̸c!Ž‘¦ té6_ïÃ,i¨I=.<¤ÖnuÑOcè‚r—svÔJÆ#Ð=)-\sÜ1$Û™ÃxSÔ ;ïÛ¨ù®]/¹íWC/ò }¢Ai:fŠ×©-z~©n5`€“2\XIüR›ÑÜÂ,V}‡bAþáµq_ÔÄ=†´†×ž<óS ³ ¥1RNÜs f´Ô¥+fn¿j¸ƒ ¾SÄìÉÏ-`í¾œkÁöMhÇñÕtX¨×É­(eðÆ&ø;¦6Áï„ïoþ^’ #X²øß>á£(Œ 0SÙ€ñi1{™Ú<«Á¾0B4¸DùO™ùomJlßæÎdåàˆé3 é:HZmFl›°ø$g”ih\V?5ܽðÿ.*ñÏá°ÿÊ ýÿÆ)ŽÿŸ°Žÿ5°5ý?()†%$¡ 0EQŒÙ‡„.ßÂÁ PPKVW2ÿ$£†úls‚Õ]Ø¢ïÖÿN5–µ‘㺃})óÎG“-Êzèx¾ÎöW9~.$í›.Æ’€XTŒ*EE=È“ži‚b›µ¤&šC5OÞ%sDr¸ON3~O FïÛb±â õyP Œb$ì­eÐ4Ò#·_»;'ú)_åZjŠèÔ 61(M_OBHDåᥤ»ÏqWt[j–[wxpö(A@ü15€Æ6âìÄwg\sU@jMÒ9ãÂäe7ŽsØ==ŽMŒuƒ“êÿÎO[PaìˆÀÀÎ%ÿGùéÿ1ðÿmÔ½ˆ©Ë'ÛT3« Ò²Pˆrfm1›EqpðFÕ%DÉ GpF;ø3BÙÔ”2Á€}óë=w'wœM'ÕÊSQÛ˜’ÿÓ wVÏE¾ç ª¡öÎïã—B÷›™Ì¹b‡¯ï¯¿þ×'žsBÆÇ;‰‚(`ͯŒÿnÞ‰° +÷57ÅFq‰u7m­Qš —þ) {ó­e®eV·Ž>5ýQ½pÊù¬t²6votèϽv`¼¼ÐÜTØzçò )º©œ…$x‡©©j”X N²"¡ÀzV½`ÆÔ©Æ+Û‡ÃF]ÔNT½¨#ñ yÂÃN´¿ÄCMxÉ%xÇqüt$xEÁVQ»këSx|†;Æú=Öwc2×H ¼Emþ—¸–XýŽ/¤²(»‹Hà¯f.²¼6Çõ„þÞ4¤|a<¿Æ ÷¤ÿ™òÖ_ÝO#Ø?¿æ\ý ðÞ ©Ý ¢z’Èõ@Kqð߯)Ö~‚Á®èäiF÷‰i‡ûrúÏë7êÏBñ½*Æp{°(O:O<ŸäI1Á6—ÁU_•c_å‰p—;O¼õû¢Ð‹¼«а鄨z‘Õ@®¥ÖáYw®zBÒÒ»¤!SÑkŽ›rRc†P< . í°?¦hÉ «îä¸4BöS«µªî(âq1±ôýsÆNeû›A‘NGWËÖvüè\á1êñ™¶›ñëcSÄ=as-z\FrYVìã³'%—¯zKÙ'!°/i$ÆEwÍÃ(%/â"ãàŸÉá¬ÇËKúû»'÷6†JÜ^öW›©3>BžêqlÌ•«ƒs'¸6=bñ-ž©Ð¿Á<šà— ‹ïÒ}0ú&gsá E×Å¥j!IjmâÇVí>ÄãÛÑ“q‹/ü ,û ,Ô ^ñV;M¸U÷V}`—#ÇxÔ·²‡»_Pyw¥:çhâW|T¶¼H(„)1‡½¶‡É*©Wˆkwœ^„¶ˆ‘<œé,$ÅŒ¹ì$ñç%§uñáŸñ’uCÆ~ ?*lÕæ®¯ÛçÚ â.µs˜À˜ î©r#Ž®¼„õFBo!ü3™Ia”5t8è$sãmPY8ìüyœ¸(BU­•~ý¡ÅY³#‹ÅSܸXÓ'` #fRuÏÝ-–o|UûÌï+ yÖ ø¡¹)ZØì`G1—žùøQγÕ8ô5öÂ$¼0 𩘔 ºDÅåÒÓ;Ôð.^x„Q<–6¿óþ JbÄd÷>B «AÎñ»J4‡2àÆãO!˜}®ãˆô6Þ64Þ-$¨5¤W‹3%£Ø®V$íKj%Àƒ;Âךe©–äß`RzÂòÈ[ÓGÀ‰Ô¥Q«¡SÒkÙ VD)ñeH†‡`~åì¼´Ø Ç#Ct°¾fêüæïªÛÖÌ(ÔH³Âð?³?JVFºøã©faÊѤଵ£7+\¦7¶0±ìe÷’ý$-R¿JM–’—…´ôsXz›¦ùE„=Ëq]eÄûÈ¢¹1#5žcá [ô;(< ³oKð.œ à4—¥ébx诚(±­Ù5P4 Z*e§Aõ .9Cù<ú®4Z|ÔeèòY¿ú€QÌȔӋ6‡¨átAe3Œ1òø—W4ÌùìâÐï%†ñ}$TÁ)ýS·ÎõäTÒ˜§Ù.,”¢T©ó6áÂý¦]µ­¡º:â¾s áÖiLS:Q„É3öÎh2À”Û.sµTÂ_›Dæ¥Ã2¿ËÅψ14xlä­‰¼Î¯iìϤZâ¼tTiEÄ‘ ¯Ñì’D´Ÿû# Xé2wÕøêòÁÀ[©”$óxÒ¢ý6ŽÔsF*¢Îác‹M¶b(BÊç.þG–ŒPS®š%àÒô½¬w‚ÂÐTjÌD²~—§ËUȈJWE¤94-ÁmX²Ä}œÒ)ãÓAÚ¿™€¯XQlÓåk3ÌrÓ3 b§ÈÜ-ägM^»ÊÇyäü)•p$Ÿ­â‡—©îZYhòŒVø_”½cp.@³.Û~cÛ¶m+¶õÆ+¶m+ÖŠmÛ¶“ã~uëžýgßSÕ553¿ûé~Z3ÄGE¼bŸKµºwOý{QyüŠIÜñøl_1ê¸'?3Óf+“$9:„H¯œA¯6$©òFû‰òSÌ ŠSf|+æã™ >RC7R.êÛc}aoøigøØ›û÷gb‘òóc~m\­»¶¼'>Ülâ[’ ’Îù:g:c´ûòe/ì zÔ¨þ¥p­b}“æÍïµÂW÷Ü v €já½n­‘loùsŽôÜ8Ó§Wö‰î„<ç½R4.ï´^³sGÂ^.ìð}+šª×øs7¯|ÿÎxÖÃ-5O¡rˆ#|²úwÌüÙÓºø¤õç“Üé¤ÍU“_ÛÿžraZhlÎÛ¦qv%Ÿ—#_Ž8ªÌ’÷XØ‘)„­ÒtÌíD Ö—Sá‹(¤´Ö<Ú®»äþýð:ó]`;§ŸëˆHRšûÖñoy…ú–ÉÅœ;§¥ìGPœ­WP°¢î¹_Wp Â\ÈQÈš§Ñ¤ê”©[$ª[”Ê Ï•>*=Ξ]!p.Ï8.½)|Zäî8WÓT%ÅîKúTà ˜FºÑS°¸Uå‹"?»Ê†„Ç…c <ÊhJLõ"Æ6–pÙÌA&»€lYê¦K{±œoÆ»nQ= £‚LÝyõd¸“f‚ ¹sk–ßVߺƒœÈÐ`¥’ú©zðî [ 2CN¡T?ÜüO‹-±ÝáÂÓ×4iÔdÂt#Ž’2“Q>F˜3ªìħzÁßæ¯‹qZ;P6.à¡xqc”-k¢ÏDr=)a Œ“M€âAÐñÉ,„tf\Æe~r?GÌ\W¢Y”Ñ×UÄ×·Y QI¡ÇX{s‰Þ‚?IJøÅBjš`K*²eVDX+&æ)oP«oÆ.y$¢õ!øO ½€óÚJ*Éô(^1 ÄÔÔ×TØKþèðÁÜdÜJÞ$´IT¾íÓø»bÞ€!‹ÓøËOœÌIôO™Ü€äÛ¥QV2:¾ŸÖ™ÞÁü…·E3ß]ŠÙî„¥ÓÙ;ËëÏÞKrÈL«(S ð—WL¥vFÑÔj§<Ÿ":u6Ñ3[Õ¹ª¹ãùû7ÒƒØÁ½è7Y®AÝžtfIWÛþÙ¼³©,!Ôöã ¡ê…i¼ú¼ì‹å'r&ÿ”éìSâ[-÷a> 2.i©&ë _×EUÐÚ–u7.„wµéÒíĘ«@¤}’ѳ°hw“)-?û¸çñSÖYæ "vêuUŸ%s[2зk‡÷3âù›V²Â-Íš¿ï>ºC‡ÑJXÒÒ) )j:ê©v´T•1ïzfi½“Ø•‘2à/Ê7}ÙëU¹ª¹Ý¤’ ff²©q …—4ýE’ï5Ro>ÿ–—ÄÆB1äÁë%ȉ¸ÞŠa:"Î/æŠÎ1¿¦tð4„¹’Ï-=~«>%N0ñ„¼Ζ<Àƒ²xgl²Ç‹ä©òg|‚™é-nÙë†Ù‰~˜îÖI•€+uÒ@<@ Êh×qhƒmWë9P?[º’Í Ï÷¡ÄIT'ípK]G³q×hª TC¥ã3*Ùÿ- 4‰€¡f"i² n®Ë1Ì!àëg9–í‚ ö˜àÛ™ÈPLTYGgت¾"žx ïå¬PEæ+rå)ù“%X_´Ò“‡Ö~)‘OiÏUv;¿³,. 4¦Ð±×}?¡°ö‹äU‚*ú5©¢h'aLèU?¬×®hHiüx£ÂC{Ëûö%¹ƒe°q·ÏÀžÆ0bã94d™§‹›”.û(ŸÞ®ëq@°d«_¥æ`b~ Y)–´>ÞÎw\¿àýzdI¡˜gDíëJOíóʲôézmUõ}}ͳäÉ„’ö[×<¦Êõø;³EmÙ«Ê£Ò;§j”îÕWC)Á·`©¬‚ª²Sx9S¿ðˆª4L< w”ª¡B ûiBÃäº(¦î,¿òNÞ’­Þ‚ŠÎܼ/ÏÇ È*€t(ˆðùûW1úη}âbß„ŽD˜õ¥HGÖ´Y«ü&Úbªg^`Yyb) ó¥–sÔ4Wù#*¦‚å¡ñÈI·ëgDVÆ–êi­Š%þn\Pµ=ÊHªÞdnÓ³¿þÃ!s?*ü–™*>œ~²¹^¼‰¦1j¸É¸×ñæ ,›ì‡H†‰Áî3мÌUoB.YæˆÖÞ·Ž¶OÂdyx_e};€^B=çæÜ ª¥L•eÚžà7Û¶Ô¯wyÒÖ v^²Ù‡Ó"½ñ¦®ÐåþÉlíéÙ&¡øåþxm’±MíTé0؃¢âvƒR©‚øß|³Š,µõ]zôš]ZôšÊÈZ]FvuÔJ5NØÈ¡­@,Ð`} £”¯BY1žjh³³1מû3À²«Y‘šß-⦿ Î]Ó|?¬¢¤ˆD[Hp­äV²™žÂ@œ(嬌¯–DRŸ®µ›-m•jµ*œÑp¬ÚV½`LÞ~[“¼Ž|Øo=7Ó°KT•(gÅ SÍ`~®ÑÕq@¥%™æ¥ïgýÅ-)™©ÜbÁ¡=„Ë”ØJNÍ׋\~·†5CÌà ½?k-óM®½HKþ“;9£– ›U_ ¦¿bh é]êòÐ1ƼÙòe¾¾â¨ynA§·˜¼Pl^KÓ÷ lþgW©Ë/Ç Hæîœ¦+oØè•¯Z»¯Ííg¢ÒX-ޝé2}<3y8׈/J÷àän ©»–EÉe3½ÚîtÒÿ<Ñ T‘w¹?s•&¦ Gñÿñõ,I®•|۴ʤ©¶9¯DÃë B£ne qW8*¯=rR’ 'Æ8a–®âa@J×>¶SÄZöÙ×W]Ô>“ÜîmF¶(nËϪƒ½Öžboé7tEYylu±Å÷ÕX£›±¯'Eõ¢o-ÄÃØÓ—ÂGXáv{žg8¸=›ú€»K·ÃçDì³9øãS‹2íOÝ*ûôX¢‚æ_H4#ò+eÂ5DŠŸÊïIMV¥’œUc«>æy¸Hª˜„Œ©7V,µ0ÏžÕÙ2´;Uœ.º-*pfUS?DÒY²èŒÊeðé³àQ6v¶&9¹ˆ\q#°5¡ÃhEVùFªÙå‡Ûܘ0Ø„6–*64\v×I½¦ÖCè*¢lì‹ëô0'âXÖÐÐ <éäEâól<0Øk`¤™‹ëã€o|üfx"êÈøk­?4}ÄÑñ­¶oþiki£üc´ð™griX1ÝUÓW†òBÐ;Òh¶æWKÅûïi&¹­½•Ž2O…&J?†ëðŒô¾P65mŠ1©®‡¥WI¶UW _‹ƒ¸UßžpxuÉPóóºé ¥’ˆSȬ‰K?3¼V­nW6ÏÅêÁQDQèÅ ·}ÀÊO>‚šñÞÞd?îP!mU)eÂm R׳ÖI(ñEÃÔ‡ýD°å§l?oâíc& êÙa/éë¹ïwοú/“ÌÉTìM$‰1Nz¿ ʶå’Uã4Íj‡!szÔŒ’]|“óZµ§ªóçµÉJ×KÓdÝP:nï#þVŽ 5k°mJ¾½Rs‘zë*K´-’¦&ý™œ)]/lSŒP/¶K«Í´›òAlpY ¾Gƒn¯tŒ4I {2Uj…sÕ¾}›Ø·uþgkÇ‚D‚VœÂÆmH}Fj0H¡A¦ÃI\µ¬,yÁ"©Q5Q•+$e6>#æÔ ¥UEm1²3¢VíC™YÖ3Q %tÎH:¼8D¶•è"§80Í——íY’ìRY‰kI@ãðë_3Ž\ê¥â ’ßyôæú»|´ó|Zyÿ’*xîqÕ¯'ª„Qß“ô%“qÖ‡‰s=û_ß1#—un/Û‰÷©éÍáüõ±dwB ’ãÅÈ-d åÃäŠ+Ã`pÀFR¶tiy}/AÈ÷hš–"ác–6Iúö=¹sxÎlø$ËèÁôÅLvPl] âƒ$AvÿNßø€¹_báÍžLfÿˆøƒ&â÷ÏèÂQ ÜpèžåŽ%¸ãÐoµd®ÄûáY‰hf\æ¡ý)’¢c*tê4çšZx<_éCþîÚä÷€@²)Áó­„‹¯ªéV*ò‰£ƒŽAÊÄ/ †uÛÞ™ÿ¿…&ü14:ùe?Œ÷M§½<¨ þ¶•U@Q¯'‘<%8Ú5÷–&ïø—ò43ggÑPj?3jåFa·ï‚ø q X:í¨@32¸_Õ¡Îx3aBaø¶ORûÛs=CÔ§>>Ƀ®:at†!IQ×€d„à,œ3ïì¯&’oæM(Ë\ò>•ÀX߸@„„WÏy€`^ð¤$™€m<ï˜ùDfe5µƒ¡yîŽe¡àþŒë¢ç óiÇ9Ÿ#j;)p3¢mq—dSau©Žý/ž(ôK1\çß8„Apf«þ~©g¸^Þ^cûÞö(ht‘ |:%ˆiô•ÎM”­NB™€–kæé¿Êëk!?øäÛõG¬Þ‘s®“ql?Òô QmÐ7ÏÅýªâµIÚºÆÞæ£.y$õnYcÔ¢ïìYån˪]ØQKÁÑqf›ËMÕDhÎߌnÌõŠ:>þ²0LÁŸ‘ÇÃ9]ç„$7lïý'Ÿ/QþšæjŽÛ{mÏãZlÑgpv£pv±¤œ Q~ÌçÔü+a󛇯|a½TÐûã¦Ç4S^õ´tëÿ1Baò:`¹õx€&ØŒLXGbµß\ ™é¡[Ûàñ…šúýuü©ÌÙçñÇÕS90ù˜%´x ˆý…QèXÉÆ;T74V(tý¢€síÞÐè˶Aì¾o°ÌP¯4O4ª¬(¿Ó@Q¼ïšWW>ôù†äo_©kƒj7oÐÚ¿Z7x÷=ÁB‚é{ޏ߲°†°| m;QBqB ³í÷ø.ÁüsÉ44 D!»E›´S~R'ö#ªÏ¥’­ù­Þ d¼ªqL´F‹ò¾ì‚‹’ah»©dTæ"T¡ó7/¤=–G($C*ð±”Py¸¬ Ú)÷Y7&uýäÃì<`wMçqÅyå{\…¡ó“'ªAL7­ÌRÜ[·rá›)níGNÕ5¢ñªôl‹­0ÞŠö¼%úí¶ò¿g­CJhÆê€[6”˜ùlî©„ßBc!§èDð„ÈEöïiâj¾Û¹MèpyÄñ–ïå‚ÿöÞšnœUÕ(ž®Â›ÎP¢eà?ˆ¥Ž%0Nˆ23¬3TqBYãÎd5ÿ®[.QâÍ÷¢·e[£ãí”b(~¯Eö Õˆ&_ägðh‹oG Ì2õçjÞ3wõ1ûf)› ÀùlàÜÿ”O<6™C;ýñR†\¾;¨ßvdwø 'ˈªƒ¾*ç¼&‹¤´=ß:¿¾œþ×P³xå¨AÚ_žØ«ñëi,É͵öÐ_F8”uͼË+àNpÌ¥Ûwîß‚Hê/ÂÑØí)î"{Ït#vù Ú­üÓ|øAddèÎmox¨—H·Öc’ R¶Ä'Ãú>8 ¦¨s ÁåîotH.¸œŸÿòMVöw d „ûÿwñR[DÌÑÁÁÜÔÍÚÑáÿ-Ê«- cÈÁÓŒ‰MLVuÙ/š€@¦†ËzYµ+KL´)ƒ…Á"rÒ(Ýc¿bâX[šIdÎR·1¬R<ãÿ¾äøx¼ì|=¾\røicÍGý¢=«‡w¼Eµ.4êû·…îLìË~Ô¾#t4σË<ÀPŒÏK¹ÇÒÆz§.N0òf–ŸC9 )“ÁK¼ƒsuÓ¶·æM2†}Üjþ#f¿¹ð’)o7FÎÐ3‚w£äì×>>ç¹¼™|‡%GqøÐßqÐb6‘©|² Vx"¿8§ ÛOòÛ%mþ2‡¡ ýýéù1S¾‚‚Ä‚öæ ÂÄŸó1z ¹ñS”éôeÒR‡ûÂNe”üÕ¤>—ñtUê¿¢Û IÕ$‰í¿&̉þüÚä§A|ÉÊ#§td£ýƒK›ùOŒ½œ“õ¼Ä/d?LèÈŸ©ðdǯù)ÄcGgQ†àÁv’ Ť~‰ªS[\¨Û½–˜‡ºXhB Î¼ «ÒsQjYæ WÂj†ÁÔ…y)2ùEÅ$ý²Î¯ú'„QG\‚ž$#*xÂ;1 Å nN|øÃKàÆxQùÛzi?¦¢à8£°'ë— Ô*k‰{ûåïMgèoSçp¨ŒÂ¾–ÞýTdl*é/dýÙ¢}–ЇNø£ÄäôEtÆà5?ßE²C |fùîèwB¯ñÜ€BÊÑyr68lþw„Yù;ê'ƒ™"¯ø®m·>AÑ×3i¿SÏÿ:ežü¸!ÀüßÁí a©9º»˜šÿo¸i\ºlª£|+ˆ7’Yž,4—¢¦«®ËÔ–)3ÊÀ´ËÀA¡/d¤…ü%%ú{A­špÄÎ'äb!ËWÌì¶Ï…<\OÇWA d;Ûq½>Ùæã¡õóùqjR78.2„ǃ°_KoqïÅu¯ˆt{ y{Zð‹DêHb‡¡RÛbäèô±¦â5†ˆ†ºº=uK£¦q—­¶º}:<Þë=¤<*JÉëK^"•÷î—X?6'ä’XõW6+J»²ß/m :ýEЬCŽéçí¤¾³ÆCžù¨¾z•vª—ª{òj’›Ç»%<=Tõ&Í-íX2«E¿Sèÿ©ÂÁžÏ!¸L7ó&j‰6\ò‘ ƒøÀL•ˆ7\ÀÐ% µðD¸ ¬–`ŽÒìÆ„½[å½W?ÖºÉ Ý×=Ð¥8ºéÀ¸ìf·\¯ú¿$‡6Äøc}¾Ê»-Ó¹6 iÓÓ\Y¯Ç¹`4¢TŽí´Ófà¢EAÉYõê„+&èQÅV­„¯J­¼Ë]›#ž'·–uHç`wþÜ99>‹†²Y|Ùnªt«+e¢L~1çµ>§üOÀ¤â'˜M5ñ®®Ï[¤šs£Öò Ü©^ÒF‡w Æöu‘ÅC½;›¯ù ¡8¦g»J1Ê(§¥qZÐýøX¨†Ÿz¡ùÙ‰²·H×;"Òò(Ûâ÷ûÃMÊÈ.L+Æ•±ßÛIœæ~´ž·²[k—9×&t:iÁ°c'@Äád¶×XZ­B÷Å„ˆG)J$Xïè=zý6åÒšñGÛܼ+Þ[~Ñ+C¯’ÜÑ"¦nÂû)HZ+ùEp³+V¸—!îù^©Ú‘ÎMûW{C¾ûþ(±4«åd ܘšš’œ1Q/|Ó¤ä’U ã¬ãt|â(¸²× ÏYEޫƤ«‘6u“Zvú’»=;Æ0Y¨‚iù@>°O›™äð¡ú¦3Í%€KèV xøv‰Î Ìó.ª$çó,pL£†ª]ã;ý._ FœÐÒ²ƒ•ïƒå)W…9&ˆÚ?!2Ÿ‹÷þK+£ “ðä1:H>=çÿÐUÍ]ÿ?0oÁ…b;S¾¬ý0f;épïÁœUþÞGC‡„ý'ü$ ñا¯©'Ï>zrÁ¾eÄñ-ЬYéini9€W‰iÑ5%Æf&Ò¨z¶^Öµµõ{Ú/F¶Õ«®ÝÈÜž6OƲïùü¸úùa{œbû™¢Tò{Úq"õ?“„¤’å–ýƒgÇI¤FžsE¥ˆuvèŸ3*êŸ=pX Jx¦„H¹Þz.â`F²TYtXÂæL÷݃EoÍŸB@A`ÁÓ_Á¢¥uîSkfö¡o7‘ºBΠûÞÀ&!Q^yËaN ôǺ°d€Uð؇Öüb1:¤õA¡Õfò˜èºÔN4¦ië{¬ “öþ¬¦Uu(À0ÄϘ? ¹H[«!;«ëÊ·—öÝFÖ“ólöÂ!]#Pð@í¾b0Bô»ößÁ`ywÍ}’i6©}Ëô‹¸¶ŽhÀ4–`eM0æ½¶¼­¢ÄAC(Ì[¥t8Ö­l(GÑ|’xŸ Dg³àŽ•øXñúx ®\­f±.$(y¤ú‚ Á%B‡W¥†[…“¼G*/ágoïNF6vá;¯l¤ÖD®î U|5’Súq²ê‰)X^LCâë¢ j„;ò…yÿŸ†-€&±K•R“x `C9JŒZ×9“Ы,Œ'Oq0¿>ëЋ%£1bŠ{ýYƒPD¹ãK80”庬`££Û’ª1ªª›FK3Ÿ•e·m±‘§Ðw‡'aP¬'_‘d+·i°"Ï\ÐÅE·¡¯¼à§;0hÀ°n׫l›7 ±Y¨S'×Å¢À¯e`yrVÉØG¹SÀfÔƒ¸í¯+Ï,H7ËÚ1Ní $êØ5†­] e•&æˆÓI—d¬ té% ùMsû¦ŠkDc%—cUØé©fԓ͸èíY“ŽŒ‹®àãJ7ZÔK…]<²jI-ÓSÚ›S1-Óf¶Ù™ ­-…$÷ç0ôºU¿p‡¹0Ë·qyÅ2ÔÙ©²)¯1ï±toõ1 ub˜{Ï’7ßs–a7›—6æ2 ˜´LTŠÜTþåܧÖ]8¬ðºoK¿‚ài°ç-­„ÕÀµb²Ð… Šn8ÆVÙ׌ÍTtú³Y\½¦ï_½PØ]æ;)t¨NÊ8=‘”Õ95k,ù¨囫jŽ0%–ß;o—ê×SÝ«ÍmÉà#ßÚ£eÝ)L:Ûй ßüƒ®þUÝ[-xØëÆÔˆ_È[åÚ•d°Ìñ`˜äKJ1§ÌšLùrvª˜‡ã§S+¸·Ž » K ¬S>×Kï^"uGI%·ˆÙVHdxQ?Ð ¹ÃMB¸*Ké ·­ ”YUM†í×ÃÇé­vßXjùÌÝ­Ê÷åaš¢F_rè‘Ȱ8¤Ü¹ê•F ÎDîâ³4°•J¹“X4ïR:Û+Um9()ÐîCÿ²ÞŒø³vÏ›ÐŸÛØ›œ|„s¨RXbÁY?‘žï7 /Ù¬]`Ôe‘f@DÃt¢Gr_å°Ý>Gs ”9þP8µ@â¾Ä+Ç[¦qŠ»+ëÍ`8 ozSKM*页ª%bÕåÅZEâgo¸‘ê–;ÆÐÔ—t0 <£ ¥×'­Ä±¸µµç©wR"b€_[§!׿¢EÙÏâ€S}ÒC_ˆB»®ã#‰â4’î¸E(IÆL¾´AÛ‘ë. 1$ö¨ùö¿,ü•gèW#n*r'D`+¶Û+ç—#•…ˆ±º@üX{sªA¡1нÛ;Æí߃š)÷İD©÷ ‚”ûÈf¾øù ûˆ@ôÂú "þŽ#¼¬³øæáØZŠ3Ë?ÜÔ‡È÷2‚x¶—é+!i¡ã‹w4Û#º¸˜…¼€ü~Ö»höFDÕ3&º‹êË'¯îtéáGï±-ˆû-O´\+€,E‘r"C L¤ìÛýTqâñWÓW.È! wË¥å?$†Bý£Ô¸¯ëL:7-$¶ZòñêþªqùŽé·ƒ½V‰F½a>©‚‘$±W<Ѭ O=6âpNúë7–Qº’LIŒÂÄ+Ÿ¯ÄˆÖ›SžÜèn•d‘líR"Ãr*B#;Áx+q6ñúF®UÔMq£.Cf‰º‡5ÿ|á‚G·±ÀŸÒ!‡«dÊh(ÃCàÀ#é=öta&ÅÙŠµGQ ì›ðG«6›îþþScDè ßÌ7øùÞϘʔâ>$óz±Úl ùéwâ`{ôÊ¿L‰àl¥:Ì~ÅZ÷0Ørìèû’49V:“­¬™í/¦ßt4;%·ˆä ñ‰Ï>$’ݲþ½à>Ð;”¾µùj¹ÕK»’dÎp$çžû¦æìšá4šÑÕiB…ÓžÄÒ|Ï„ï·2Nè+Qjü`À’0Ü›˜€<ïÜò:­ÜµÞÛÚ™oðÊFëÎ FÔ@ˆ§#Â:–ô¦­ 3[Ÿ\Wöhñ’ÉÓS.¥[ÅÇ[Œöm0âyOdçñ“roôšó3ÂØEæs[ÄìS%,dB:%fý†Þ-ÞÛ'Êv˜Oìžâû"û'ÖÏ"ù2"ׄ–÷›ð3Y§Å\U2È+Ÿ%íy™x=\´ [ì½€ D6ïÜÀ§Ua ¯”¢½84ò,þ ¦øGÒ,jPÛ…¯¥IMiZ)ÙPWM@W+£Vq<&JÝ·Â$Û§¤\S¦CoM}–}eƒÒž»B»øû(Ë® 4]ÐÍ=†ÖÏ‚h> ˜™iq—*5âtfNû^fF3×¢€‹š¼‚{Qu™¦¢<®9üX*¦c–_÷"d”Iº]$†¶?`2‹ËâÙ…žÂ¨ŒÎòѵÞÚµA­ÝneÓЪÎYíï‚)#Þäì*kôÚ9ë6†t%W}Yõ .[B¡–›§õǼöQì“Ââ¢P5 1Ð|þU’ÃÆÙûÌ”)«É6HôPΪ¤ãkŠ‘×:¶>­˲“¬—1ƒ–’¼)*½Xž6:ŒŽü1Jj.ªQïÕ?_¯¶×ê_ZŸQôo»b›,‡eɳ”µ度BWHLær%ë¯j–¡ER-· â2Kuiã¢ÄÝœÌø“¢Ä<Êå\×O,œ®(RyÔT"lUXz‚BÂ!otÕ*Ã<­µ ¶}¦4ö›0º{XÕÓæä;ÉŒŠYÍÓÂí£KOâ ´(Rr‚Ɉ;'ëášüÆyAnUdHgÏŽÌ3öXcä=µAhP)WI}%Cñ–…4d‰ž« ´¹,pˆªiÏ‚^š‡ Éh3 °ŠX-—ïwòžÿŒ1î‘Á‘2U‘?-¿¼À€?Á L¼î8„E`€ðÝ!Ö+l²îÚg ¤Ô^9Ã]<Ìwä7l¿PKŸÙë)Ö+ (À80¿ô9‡±7;Ù »ÜW‹¨8ÉðÖhá%uP¢Wð»‰îVd´·èE¸,ê Ù²ºçn@¤~ˆþü‰Š ±{ °bå ƒñÞ±˜Çý^ sDÉQ'¦!E¬ësp*'áBtQpfÂrÌŸ¦ðü þ*v:¿öN"´ç| «À‰Àµ^ÉSÁS)³Á NÆÏ{6à$ó)( Ú T~76)h'¢Ä¼…r´IŸ8òÏX?U«A3·Áõ%Ïb%¤Ý‡±êMìj¾5Ø2åñ*ËMìÓ>øO  ØìÓ¢·Ã Ôñ‘x¢Ä‘HÝ®Þ'ÃYoæ…;I’‘ÁÞ“üK7¬aè ·ºåÔ8(âÌß@³ù·4S†Uع¹TWêßâcÕaÄC‰8ºò,œŽ„o rÍ˼²rÞG^±¸…²xˆ¸gF@ÍúûÐýW¨übàoУsaðÎ' cWôγ€Ã^ú9¯1Ú"Ñe ;„ÒV‰0V¾š´®‘ICêB«þ?8;Qk÷ðÈ1ÈDÌ4yæªú²­.¢ÈSµ…©èôˆT;0lfäŒÁHd7Fé3/·4kîÌÌįEæPáÜhˆR2î§e{m*E6d¾]Ív‚Y/&¶»f„¾ Ý쇎†¶À¿â<¡í5 4"Påi%Æûµ1CkhÇê¦NÎ+ý‹1ý‹MHa1ý:Ðt1ý5Á#{ 5Á“1ýÇ:ÐÕ±ý˜:гs| ¥Î<úÍ™†úÂù1Å@ä%Ä^¡IåéözÙ6àïE…lOU: ôB´–äJ†9è=õÒV­ÊK ŸÔÔî‰ÌnY±?h7pô±är…¨pØZa¹ÒލÆLÿ´Ï ²mñÊXÚÓû•N +Ìõið¹¡>|¸ç>^2”’};„ –3j/0Ê´«ÐY2ˆë¥|±nð`Es?åÆtx½[Np޳‘_Œ›ë"[ØVpÐ1/|ÙâÆ4ˆxD'¿ò˜”¬e‚[ÃÞ5ojÒ´46´9ÕÎXŠEù¢ ýÞzøå;ÈÎrLJ] ŽËI&BxGÈ6 ìn‚jN í°Á„F= 2"¿ ù=¬™rÁóG¹ŒžÁ($m½û°éýæÏÖ™¾•R¾Ç¼*§ð!I?f¿Xƒ7à¶2%|OÉ­ï+/1NþR¤^NGm´–¾‚—¦w%h[˜ÆSF þõèÿÁñFÉ¿ÞѹôAyƒüúðÑ¿ äìdœì2OØa„=Ù|éO£Ü$Öß8š”4wòâæìHØ ,Ù‡—Ÿ¡º,¡T¹ÍnÞm^ÉÁf8ѽ´!RQP-Žf —ç>•TÓ̺èH`¦†´¯çȸœüU ¦ ø½ ÷ Óé‚ã¢]ðÙô=&ºr¯5Þ­”f"'–‡f¾u.ûÓS™ )̇c&¢®}éäxÏ £òã”ú‡È#Òã²Fï…>_;%§ÎßëàøQe×[·Ï£´˜§T¬SÛMRêçi´gk·w© xål÷Ì^O¦>%Ÿ…gÖü¥˜ì$ÌÀ™Z.6©#$‡=v}ZsÄtÓÄq$h„“Ïß¼¼ßô½1¦.»“>°èBûSæÏÓè¨öê‹·»OX7ˆ|'&ÛS7ÎÃÎú;’'ºÝs뚸&iÆâôqÆHDU”ƈ¶À [æ±Äå¢6o `_ŒMÃŽÿ§IÃïWg£ ¼fëÁ9x}n]ù°ûJ¬™žcù(¬˜5™Á¾,˜NS›-Ç£ î H6DæÚŽQa:«WË‘Þßæù˜»üüY·£0”»š®“ˆ­jàq&ò¾—Škˆm¹ïçJ½Z³7•’ÎåùøÉ>C[ÿª~7ßc‰S}ú>äÛ„2i—æÁÖæàœöÛôQÂ8gõmãClÇaê(ÈÚOD¿qêâèõ‡r«Ñ)š ºÃRÔˆŠù@àÃSômõøaø"' RªÓ®Â²oÁŒ7¡ºÙp .|:5ošSå e6@KcòöS9§è~Ç·¥Àÿ¹ãݨtõs)_Uù=gx³F«¢ó<¥™mß½6bgMNݵ FzöçÝù$ò$õ¹o{êWC óf—èh"¹µRòê¹ëÛøAçоãÎâã=m¾â.YC0=‚±4ý Ïëö¥ü`w¼°ÒZÕÞº)æTSåû_¦äY÷Nüîü«'\ ¬™âäÌX×þG°°n™óVqõŸN[=Ž *³Œþ7»PH›ÝÃñ}_-%-4Íf²¸Þ·*XlL\'Y]¢:üBÊkÈZqûàƒ©è,Íñô¦y2Õ¼œ’Ðå™ÅTP¯F2SïU3DÂ7Á‚asRÝ,FwFnò.MӴʰW Wµ¼qóòi¾çìÒv1"®^6cPÌo¨¯E7°©Ë`hã Fä'®ë =ryÜ…MáF×®uH¶ŠˆÂè;>"[¯y ?àÿgâ0Ÿs¤ „é¿MþçÞÎNËÚÁÌÑóe k5Ï}ÐÍQ~웦)ìugˆ±`ÊæRäR4!tãlhš—°ÌËJÖÿÒ@:hò £B¤2} G#òÝÍŸÞçßÍÞeó>ÞœX!¦Çñ>Îð±õò°ÞÚü\žâd9Ï„ƒŸi¢hÌÃwË#yÏGR*½Õcuû^¼ ~¹D —còú>ÑÓŽO3ð-ÐÔ˜Ïļ"Ø”˜çù¥Y‰Lph˜$†ÂÙ%ýÈ-pÔ-c†‹å()Ñ£eÒÆ¹“MñM‚¯Ü‚’ ûáá S pÞüX#BÜÃyß­ÌØ1¹ÜÔ”tQ­6–bœ§#bÈ¡óž­Ú°ä¬ ²Û¤ïÌGÑXääÜ.GÉÕñq ²CÒV¸3y ex©G¬ì‚nä#,Å&µŠ8qØh~§.°YøLÄ –µ@ð $pyó›"ÚjÒ2’ )%ë$¨ÂcýOq±é§Þ._ô«”r¶å•29læMD57°Qñ•è|<è´‹"¦¤n•QQ‹pY‹óÞ¬¨SšÛ“ITï›ÛÛhª/)”lYÄ^çýJ î"áÿùYûU0Øft¢¶T ]ˆ"RЈ3¥Šðb8Eü³EÛn]Ÿ„-Õ#¶³2ôT¦m¬÷Nn²"lM‹tà “ölÍ÷)y?x¤˜­|tÆg»çœ)ÖEåyXªwQZõF¢_øÕŒÛµ–l‘¢hiØ nÆKuödƒsˆ˜ñ… ÃÕ@…aJ;õ†Ìq(J¾z >[¢,Øèha¾‡`2bò[±ä(˜,©¦PWÛÝLJ0ËèÅNáKîñ#DÜYoË‚óg…+•»´¨¶û¸ O®ðLß‚1ß’Ó+•†ìqªWõaKîÒWJ#æ74£JîX6Ú‹Ä™* „»2‡B¨MÜ2»3‡Bé`]ü‡†o´Z몽ůôJÆ•®'ñh½Ï™›Yÿµ*ž^Ì·aÉsX —↉NòŒ­Ühµe’Ð?tͮ҆˜ØXëÌ!ü^VSwÛD£ßy×µ-„rmŽ7 ¦…)g¡È÷Òô-àfµê¼ž!Øç¼p 1Šx« ͬžn×iõ%9|ÙÍGåX¾RÆ¥nâCÌ õ‚î²2,ÏͲ™4ËXš ô©¬Á—æo.[Ú€zã&e\¿è6¯C «jdm4}×nlÓµ­–)¸¶Ÿb¶ŒÉ¦¿Ó"Ô§+Ç »ž‘:Öˆ(u»_ž0õ2 ¬"$÷ ò8ÎÉv¥‰œû‚á qܪörI^½Ã“Ð|“¹à{2Ú0Éù`¼ e$8tçdŠÉ—QÒ#´Â‚|TqÔMõtZLªE&]þ#©ÁÅa÷À)­q€3¡{r;aö8!=–…tç·UΟí2ü¡Z .sF».3v0_¶ qȈ™ý%–ªŽKkSBÇfíÉ¿íúßÛÂA_:uÁC4ýÁÒØ¥UL8@µY„’“ÜÎo…ĵ…ÂôÐRÍãt¤;²<{Ðû•^·À¹VËŽþý…£¨u—­Â^ÓDû53æ§;ˆ8î³ÀêÁO†ô0qYAñÁû„åRîª}dd—¿í6cêÅÄ;™C!d†D×÷QÖà†ˆŸ–;"KÂŒåÙš¥æ¡§’¤æá'NªñtN‰^20Áüô“Ⴌž)^à‡~ã«Ùóˆr rº”Ѓ?ˆÊsÊGž=º·ó$:'¼rUýL^[Áóï Ac‘âÁ.ä:A±£Mn—Í3KX¬ ã¾¨à´R¼ë?Û *°¶<Á^¨S=ó京çäÿø”ë{¤>¨ú4˜Õc¾ Ôäí4xý‡å c0ËÉ}<›¢^ç½sq”s~ÿÚ¬í·±ôøÚ·M`ô4 ¾3Ÿ¨|(Ë¤Šæ‘+aJ4µ—c2ÇrôNu†…}Ói»Â:tŽ“ø†]u‚-Ï€üü—ןôt™lÒþsÜÄaþoÝÄÿÜ‹«kÊØ;Ùý/?1¬ ï«§øÉ§¼VX\ä¼\©MŒmÁ3À݈DwËM®['nšYPà+¦oµ®'m¹¸êiúDD‘ âÕT<$ ´Ö± c½ú÷MAƒõägïzÞ*dµN?g ½l»*μäÞ~q—Çç÷H@ªCgáÑÁá 0õÏCá?€8¤1~pu¢û¹«{-ü]3Ñ«‡ˆÇíŽGû6„;GÃÙΈȫÞ÷X]Ër>«,;›8Þà;u{†ôf¢·Cˆü]rý§’P½áZ\÷w†ØNä·Ýñ=ùáÈ̙ٙOþmÀ;¦ öåhÌv…þp`ÀZ4ª¯v¿ðÑ*`)Üp+P…Ppdp4s)·«3ZË3ýÐ7(`gRhèNôçætŸ9È=5È,Ìøå‘o†„\Ï×h•ÿ°'²òFÒzÈ™¯yŒáà)p·:7lRœ¨ÍU\^£C¹Š8¯LS'µ8tÚë'NYX4_EÞÆµ¸…m²sÔb¶i•ÓÆÄ¡’dŠš’ÏJ­]¡Ñ*¢<ì7×VÖ{(жw:XÈ•×ëÊÙÊ.ˆÛóø½Dùg‘•´¸6÷jqÂŇë&Úú+­âBú½Ö›²_hÓ[~:"+¬¬l-HÁÕ*ÙµX¢¥Q‹­8Kc#Æ´«ÀyY>a11™Æ‹mþ—;$˜+Ë®9樎…cÑnƒgóZð0mc2GbwœX®no_+ÛtˆÐÛUäˆ*‚¾È# É¹!b¶_5Èq Bg· ]_¨£lqÓ爊í-J¥9:b]ˆk\{ðXÓäÜ(Ç{–T.ŒE£¤qÌ눡Ñ=@$/0@Ðd?Wz–+ñ)¯HQð›íÔ^õ‡ÌO}ÅG4_¬'íì!’u]§pz&—oKÕ5Ãé$¹‡s“ã‘‚˜ÉÕxoýö/g¥yí*~ 2- %ï a’s+P3a3¤DíÇ‚4J|¥MB3'ê\¾†‰3½“÷D:ʸGµ5d/¨´Ú¡¶˜©ÝDÞø íJq-kÃ3¶…´=%¿‚úSß“Y<™ú *y½…,[å{û˜ ±tÈåíó×*ÍYmþ´Êp©ÒB'Ù§#—°}aêæTažç’@e#,—Ê}ÂõZ¨}Iöq ¬‘çõ9Cö¦¾ÄÁ7ch¡<ª¿ |÷5çcTl{xés,·’S¨øV0`‘‘´´ Éò‡–Säíï+½6 ÝiEöîߢýô a~ÊìÖÜE¢QUFÀÈ–8Á¶a”ò§ÜÀÄcw= !ªªJ«Ð4h©Ë\õMVâ$ÁMó`f¹Ò²7ÁM«u¦ a2—TXHAY¬úÚ¸ÚfÐÚ5_X£*Fnã¡^ ©‡ñàm,"Ô¿É,-[ži¹ ç%I%ÿMávu¦\JµhNãÌÓViaëUþÄO»›;kD8 Ó\V-ÉÛ?¤0ÊÑE©Îߌ¢.Ë#Øx$×­TÞL®[¤³‰Gö¶Ç—»Šw>çùíã·2šå;eü©,Lô¤ÑŠî6ÔŽj²ŸDϬ%гÿVhÊ£hÆOéÔº\PýZµêټʛýœ²ÉLW&µLIâµLÈfâ`çәͺ:îóÐdwÆ,|m§·W²Dë¶fpàšõzÓS þ· ƒ¶Ã™4£IVÇÉ:hÝYBu­M¨¶èQÉÑ1#ùп1ç€Nm‹¼è±1/æ×“€!àÚ¬`eC"®ÚFŸ<Ë*מF¯1ÃÓ´áηí”CˆÙMÊ“j¢¿h^6vu1¬…D±<˜Þ‚Õkå©Ò«ÈýlåKÔŒ%‰3ß.crÒ›õòæêWƒ;Óê¬ò«<ÂÄzW‹E ¦ÙDÆ®•šoyïP^•©É®Kã–˜Ctp›Ù‹Ê ­8†/âs*ϼâ¦oŒ›<Ïìì½iì°¸–J p3Z¯Ð8wYÕrÙ׊F¦÷DP't Ê3ÝfTa—½9L€«Ã§t¯¾ÒѪ´Ë%ÿb%ð|±œyÿ5s‰ á©ÁÛª©žòZ®'t)l•RDÛØÀö4qp„ÁwÃ䇖Iœ\ï£RÒñjŠ$(6¼ùî>FÌþdÌ ¤µ‰JÝ®}F¡Hçì?MüÑð›ý4Íu ‡?Ô¥4¶ºß‚§±©:†ªv†ÁH¹ÛŒÖ¤øDi²ð üiÕý˜,eObÑGñúÍß^cÅ…;~wi<ÍÿMð¿-YæÏ‚œ. $£þ‹ü¼k¾&a†³õ›Õy‰ƒ tÁ"Ï9… 2ýuû[5`»ë9Rká”’U$Ë(t’`Á5-«\á°‚p—Ë3AŸ¬%æŽRÊþõ‚ð†Txá/¶•8‹œ>\¬ŠoóáùÂ^è;7wˆßž‡”2ÏOQÐ~X¶‡ºñ¶Ê}²¨~ÎÇã`˜ókúKÛ þäo¤Ë53mœ Àx¾a/©âb¥3tׄ°×ÿ[¥F[7Ê|%WÐß–Pð‡pTç%‘oÜRåA»'„ãØJš4§ð¥'Úçu; X`?\ ‡r+­x€ÖXÉ}‹¤±®ÂAkÖ'Ñ…ÆÛüJâ³/8Ç™µïÀlè1˜ùn¹"%B…k×^@¥¾QiÏœ¡Fb9¤5æb»² [¦Ï…2 ¸M¥—?¦v3pÖæŒÑÝuñ!ñc1Lˆg´`>´ uuS˜Ó’*3U<ÕÆû·nˆÆ0«kcáDY?ÚÚX9ЙtR:U*¸§õI¾ yÌØ+š8ìx+YC­é¶Z“Ó×!5×¾¢÷N¬é¾)#þw;dÃ@®É¾wÕˆ%î1dÒbzÔ—Êî K»> ‹t_ØQn8c÷°=6)ÝS'ä¶Q`yØYiô}eŽKv—âI`J‰ïcv®mçV犩´B_ Í@ _ÓØ0_È5/¼G²´åiX’y6©$©aô>ˆþ¹;y­˜çêmu`FÕÈôðã=Ì9®ûÉ4±»j,W'ï53ž×o J¡`+$5»3õí9ç+ëKÝÅXè9î¯Îô„öW¬ýv$–÷²ÑÈ2eö¥ø¢ÝÞ1]9[c=%*ÛHûîâ<÷ïaÓT/%Å®#›Ç%Ò.ç÷úžšªœMh*ðÆ™ÀW aÃá'|žñnúè–~› çïR$³7æÏ¸€€dj?ót.vì4Á€=Æ€âS]ªèk©“Ò¯`µ„G5+¦$HYW¿Vöò>¤ö˜~.ó}Þ÷\Ù®¾:×;vÈY<©ØÅêÖ🣽:7]DÈlœKn8ìT ƉÒQzB‡ ô0ËÊÕ]M½õû©3õU»œ¾²›`˜Ø¢ç{Å7îHEËw¢ÿ“ãŽPS^Í@ƒ€¢€€°ÿ·×ú?ÜÖ\ÆÁÉÝMÍÍÅÜØþ7Jj¾aœ~z® ƒa È@Á¬ûú‚ìäU³;—hÃ;!U1ÏöëùþÊÞ8“h{ôÍĶmÛ¶L’‰mÛÎÛ˜XÛ¶mÑÄÉ›sÞù×}缺uÏ­ZU»º»ººk×Âoíî½VgÌåuX‹LmB©ÌFS¹ÀÒÒšš’m·¦|Ý_uw­ÁÛ¯&¿ÜL3-C‰ÐÙž¾›·ìÝSÏÝÍ/¿ÌÀÑ[&I7’“àƒP0'BT‘ãý6¬N–ë~Fò¶ãõ,!BVþl pø~h$ ew™)N'¿¶t‹{üþ×Ë3›ü‡– On8ÖÖ3þïN(“缡‹ß|,Ë`ô;ËÕ°ÜsS'ƒ)ë6 ‹Á3ÕKÿp¿’ß7ÆÀb öþϾ«ÿ}×õ0n÷ÎoÒf÷dŸo ¨GÉ7=ˆC8s¤„óU÷—™i¿Åtȳ°í¹Ød|Îç'Ë“·v¦¯*F;É„†y–$³æMTëPÊŠ—nvk´Å޲¯ÐÞø­ŽàÅ^>á©Ù‡Æ“É9Šþ=–CUËEMŽã×RY Žö–-§"y¤‹êüÏøQÉ¢iŽTÚWó˜ŒÒ_à´ƒ£Ç2< )‹‘ÂHrа)nåVË[4@m›Œ#ˆ»;P/¯oiXØ—±øªG…Pbh˜e[•¥…7+h’Ž~¹Í×üø¤E!váÙÚ1·$Rc Â…­ØËqšÎ,Í¢T—ãEh€Ç/bÿ`co\ü$á_!#9ËKU•cŠD¢µÁ»0ǘ%FrALqq8…Ý8*Ƚ;k ZŽ¥¬gÀ55aöIû«B‡ØI$¸yH$c¶0ê&8¢Œ‚gi¨<ڜڑLòѬ2½æ(´N?¥W9ôüñS€ˆæºÏ"£ZÑ}‘Pâ\´ Lcùþ¯çL€ýƒt[ jÍAÜ*ÅÉÅ@Ïó‡á¢5WÕS¨ZW8 ×­ k“Â7Ûs’­³.+E7Ù¶á¡èªk¬*Æ`˜Þ!‘ ‘šeÝt7¤?°¶ú-ÆOªç§ºÑ·Ô 8iõ!Õ¯Í §±Ðݺ” ¾×ÈGÛµ™jЈJ†Ø Lh„#Š÷´µYÿ÷¸[ß¼œ¤Ã>¡°AÔ8CiC´t‘d[N«[îã(³%;Z %$‡à ðwƒA«|&n3ÔÁ6¾t‘ðÑ-Ìàs# w¯õ3 &À"TÊQm¤ö3(@:¨¡#Y÷jªs#Ó£9YïJ7¤ ´ŸØO˜î@”µñ‘í€ßn¨Oê2V7ÿ:ÌÑm ¨òÍ» Öû†q;nà±ù´MúÇÒì]MÚÓ®U™EÙÈu†<ˆR’hžõzŠ0¨ØÓÖQXøM«‰W²v¡T‘wfá§Js‹´m¾+ŒM$¸_è‚“B~©&‰ !›ùš;ôVãðRáX0ø=¿itó²)±< š­Ð»n,“µœ¼|ñ æñ f óÐ&H‘iTä7ÏBÁ;£u³ÎÛ!pMï1Ù œ?yhŒíìê \­¶œb-ùl]¾')‘¦p÷[|I¿PFbŇÒUOæ'TUey\M)ŸŽËiMÅVµ$Î’LÂÎÏö*²1aôŠË6!óHÔ·¹$Á T½à6^Šx:W†åÊÊ­ˆöV8ò›¤Õ—ŠTÂ-†bøÂ_Ó{]šlSž¶Q4atõïh,f.ùT—ŒÞ… Šj·n2•´=V;S«hà‚¾¶¶‚î Ž6ã™eû¼!Ó„æ.v½ Ì\–yO÷ÿð9tœîÝ.†qÁåõú#.`D÷î.Pÿ¦n==âWr°¹‡Ùï»óØë½«,3>´b¿¥ ?Q9ž-䆪°¶3þމôz¦V¸{²æŠÙ,¹WÐɲzœùwYyá'›5ß´mÊíù¬!Z¥¡:ÖžŽ0X¤§“Õ¿î 7Ace1Œ?ÚQq·œü²kaý\ß )$çü\Æ0YKblîw‡Â%—q¡x¤ìÌbóåÅ_3F&„A9lÔ6¾^T!k ÃEleûºÂ“ÊÕlÑ ÷ž¶óB⦣'ô:JhÞ-pv,¸ïX{¤px¥L‰g*1d NÚgÈÝΈWEí€FwKÛÅŽµ2zÞóRߺt=7›o|Ié_ìWõïˆpÌ›IZq-£"×¶WÎK(×lÔ­-¹UC_úÔ”7–ŠúvŠúíµÛóþÑtì –÷ð?–=ݼÆ:ÑâUÉa¯ô êñ‹ÁuHk•BÑQaÀe.|›^³þ†Ø¶\MWöl©rΛ4“ÎE‰‘°ZV¤Mw٪ȋ¦®îž0ü€¤"mk‰æ&æ Ž™N@óÜgwÄêíHV¢ @ò·cƒ¾¸É6ÏÒËU„G8Òó=þÆ»šøæÕʳgO’‹Ä u@„ÕæXÙ²z J^• ¼Q,Tø¦l5Tt€Ùç–køÇ•¿ÀÔß ð{Ì8ÜqG¸îƒUƶϘ¼5ðçà„ÊPq4-[Iý9}Î1Á–*’^¯)æx‚¾^uÃÞ“µÌ¡fhæ'ªæIEå1oÇA}cü È¹$á±%ýù?þ±Ö¾ÆEç¡…þoÖÀþ b¶nvöÿSV]ïž:úvk¦)å È>Y ´= eeí·&@¡e1QA5JoØ88d/[ùÝoíw˜·F}ÏæjJ=s+"½É«w?¸"N‰‹•Q¨è<®»-ò\žž.ùÞ?&@FTow0ns#dp‹½Ø(AKͦö>ˆ Ÿ…‡0pDìöW!­m¢%î§ñÀü˜š„v2&º;!CÔI¸eDIL_u|OáŠöõTrÃkë‡Zìj§)"à!t’`ÈÜiå©å#DK´@æ¨T£ù‰8øÛY£q¢¼¡`=Íc;Å¥õè÷mÅj,&µ°Rï 1ÈÕ:y‹Ç¥Ô$}CÃ<6pÒÎÒΰæšThÌ’„yó1K6Ó”ð˜]“™`zën¹Y´å'Ö´ƒÝVõ})F¸×ð!L˜½ÓĦUÁ3Ä||:Ç%íøƒš—¦àå•ÛŠ÷ÐwË7ì~‹dLÁÜP¸ü8ŒCÚiTæaíYq½€Dö’T~EÒ4 ß IøA)åè4>õ)Qš0—ð‰I°é³aȱ~~52^Ëó›‡/gÞ÷¡‘{ïÛyÃÃXwóÙÈSØqþ[§ö¾—û 6ËÓègã ¹ËgMÚë4Œ»cPˆgZ<ƒi-J¼é?܇F3°‹å5j¬pŽ'ÊkY¿ÏO¦®ïÚ¹Â8jOxðŽe)ö³¦Z$|^½2†ü‘lHô¤¥#ñ;(ÉŸädÈ»ŸSñÐa¢Vë¹H8žòÐa¦ U9¸†²[iÅ¿;Ï¿CqÓ±p£C‡éUgÍÒ¿7ñxhõ¼™I“¸Ù  3‹â#ß®áüÑj çnÄ|ÛE’ÃÛ^7]ç'– JðQ(ø·š½æ³‡&dÎqÇ“óã¥=¸b_¨-$D×P_c )å°6@mzG¡ííº1®`xÌH(nsÙ¡V6ܦäoih\¼Ýª²eÆr5Øà½´«òg¥­˜Ñ‰—ý4)ŠMËN‹5ÄXUåj‰GUü­-Ó3?ZE{É¡à%æÜKÌp´¤eŽ~pW«Dœ¨ÏLÄ\/çx¯%M»ìσˆkž£üÁ¡@iPåÈŒ#ÆIJ/g±=äÁ³iJà"·.l'#)¬Þ«Rµ–:Ï ÜUÓÈ´.àŒ—c%"£;‚k…'¬TUÔ¦•¶7)Á^üš¬ %š]·¬ QD;âvöü%+™ {Àª’f®'.ãL–‘¡”FÁvtò^êÈ9â)úèNµb/ð²Vã|¦Í»hW:5¡y%limšBòqI»:!^þ~NŸZ_™€3ÔÌ¢>aÑ¢ë:YÎׄ™ä_4°ž†™¢¸×ÅpÏ•/Ù>¶sÔ˜‚pÞ)€oS¦´²Vk’X€@òcÞ»Mvפ×K‰ig,P-S–;F•œƒ×È0sþBUer~¡‡)p6( <ñ*{¡=c,.}³>cLlÓ,ºA†„±»– À$!ÐÓÆéD©8#!(˜[DLcO³ò‰U6•…— =4- R JD×}LƒyÄîçlÔ‚Ùåº4”V0§º­'­I~Ò>sä’¶lbv0ú—“MÛ+Òÿ°µúŽ–’:j«°ÎÛ|騦VŵŠf¼Ø¦§¸’¤Æå¨aÆ®þódõãÛöâ¥È!’7íží;‚I‘ÆžR÷q‡ £ Ú¡Pù¦yfœZ†•û¸²ª"êU¡³‡@’s#~𯻠‰º•}2µi©ÏƖѰ‘AÑ»õ2;O(lÃ$? |=Î)n¦g~9ª~¥›fPM2uì™s7| ºuÞѧ6/™· ñѺ!º®¥ƒZ7Æë«[ü¢ ‚[2¯Œ|ÏZ ¯¿|*®}«ëÏ`AÊëôyÆwÚc—hÞ“”üSÎfŸoˆñvMnE¶¨D‡Ø*Ïß'*vÁ¾.Öì(ÿ ˜6=8³ej¿§ì(§B,·Ü.Θ¶ðå* qÿD»Òr£_ÖÙþQò=séÄÖÍ\‰¿utqY‡—k¸bpÝ•ãB‘âPz±“¢C`cMÁ£ @ç>|iJÚ™ÔØ•µÁ9s§W®¨¹Ávkë»\Ùy«!X9M‚;õOBF`†.ʹ}`Eé¯ÑÉ~ÂÉÜÒÐZ˜í8jb†UΖD^6qDWª#R[º#j6éÔŽ$7 òLðŒÔ ±/…'Õ~kP-é»;pàTKâËðL¨3Pz†òÁô½ÛÜ|ëM¾õÝPù’=ƒ„ ?‘÷‘B„DŸ‹öâQ>¹ŸÑB0Ÿèû?ûÀ!”¾pÏ‹!°žT E+Ê'þ³û€G Ò3Üž º'¨·Ç„²÷ɺ_Ø+ëIôl?ðÖMNDê‹í ªW¡wÁ%Ÿ/ö{°|³\ýO(Ÿ˜ÏàûoýT0B ‚Ï"@1äßWPšˆ „Dže€­0Pïz»`y@¤>%Üw±!Я  Rß,²?æ;þþi?ò'ͳ ñb«¿—ü(@øDØOï¯EöÇx×èûÊõ¿Só`¾ Þ €}å…ú¾Èß™€6¥ƒÖŒÃ÷Ãl ´#á¾/PzÂo_Ôň¯Æø0›€jçû”Bþ#ʃ=$àœ¶¯Häx$ OË€±e‡ñÕ¡Nš¢ì ±Aì®·_12ç‚}j,Ü®jÉîÖðHÀØ™(Mi\lïœpþã}]óŒÝèo4<ˆŒGÑ+7äqF¢V{7Xeˆ!7nib(ˆIô2vª12z{kaæ™zÉJˆæ™ªöƒD¨€1Ô[í³f{*­7üø”f0ò”¿Ýf~P¦t_ÜJ“~rb¦!Û—p²ÜBK‘…JfÒÙHk¦F`Ò•6RáÇÄË Ú}7]+i£SNŸÛ¶š¾[øzÆ7óp-ÒØ5›‘5fJ¬Êü¹(uâ´Fýwà`÷Ñ—ÁØj€K5ö‹àêÇðï.Gʧèmî©ï£‘ØÖׯ{²Uó2íœÌ]G[Fw†°ŠQG¼¸mÇZ¸ê¯PÛ0¶Ú‚×Oã•[Q²73îæŽ9—É»eêO2¤gœ»ÀÚ2¾‰gÁ–´ð">¢Ñ»±Ãš”YIØîJ–m_KöwìÊYZ¥ú…¨z©u (ÍcB ˜Ôeß@Œq¬è€ÿøñ}jWû òo‚Íøß‘­„³³ƒóÿ¤×:.ÿ¬Qp¨ÙR¨{©ýMþU3ACh’²e¸êÖÃAE‰.úÙ†±\$9ÖØ3ÊCèè3J‹ ß¼ŸiÑpM<ëá¶‹{ï¶K@çD^€ÀA:/­à0†šúƒQÚ°..ÏTãsÌð)=¦ZWœoAaؤ­–š£Ä0rø‘cêôª¦®…ŠEj4^WwùfÏÑ2ë¦}ã3m(þ ÇîÄ.í³¢prÍE[zÉéMBuõ™Ç£¬\+^jǶ»‰¶!q½ûÝ2¨µaù[‡KȾäNjͱCâb2c5Ö#'Ïw¼€\³Ù:댳̞¥þô…NÜÕ´vnÏB¥—=\ñ…NËnJtJ,fÿ]ØâL+à¿Åò¬ÏÏj`Ê{V»ñÑY…ªÃì­8«~¾úR؃IÒ(ì°>;šú(ù ²ÈiÌF”¸—ã,~=aäËíQŒ™Îç ñ¹2TÀŽÛ†\£[иh,¶š1dj†H(Ž´«Þy©ë¯¹v"øvtÉ ÅYÑòЏ+¹Í§ƒ”ñ:fÐÃЀš?Ô¢Ö#–\ju…ý ÛGß– gù6cf±Æ®Ä0s@Øé~ˆ!/®:bY2“pdááþ£í×ýˆVöp:;;»“¶L2hÑÓe³pŠä)»fŒ®I}\ZÌŒO”^ ¨Ô $'G]y ˆ8 AëÈÃøɄӽ¶FA :ì‚$úi4×Û;ç§ÎþPa_%g·»fÓì]wE{ JGVÖȱŒXx·Vï>œ½ºÕ·î˜yâçbêzêIÍê¨ëCàpj;)j¡Ä .cjvÄÌX¨ƒj?© ®<@PïÌìÃû$Q…J(ë9„\Ñ©&/ÓzÑÞQÎ×bó£+û­æÄÙ"‡¯]ÝDk6U Üæg´>‡_LuYwãQ~Ó9º´’aµ­¿/ »ðaRg?·œ-æŒ#¸\íÂy…ˆžú’:žÛiUÔ42Sµõ…vM©Ö²®H±ê¯8˜EÖnãLÙ^sh,Û¶1Æ's‚Îez¶˜bÅ_ŠùéºlmÉXG™H¼léÀ \viVøÒ¸f*íRõé__ýÔ¬«¾Š¨w°”ÂåTÊ÷-\6µZ’sQ­™­~ʉ?p‰Jakö;‚©2Ð翇-i-+;¢l£æÒd 4Ëý6úmÅñ“w¡†1ß C× »q=_ŒówAƒú "?"SræK“£I>ïÛ‹îâ®c<‰ï‰òK¥øóË¡ 6iŒÍÌÕó£Ø2ä_ùÕíèñ„«®FÃõ»p•Ÿ66©[©Yh˜8¼?s°;~3ÅüH³Ñ`°—wðÜj=à ~תcˆ×ÉÅ{nÚÜ«9s$K(¾´Úɺ8¥Ÿ‡PZP‡Ü>c, –•gÖ ó$m6Ä,MÇ»×z¥ŽžÏ˜ºµB"È“Žö‰ð{€ÃU"z? µ´-r ¬#ëL"í‰Qp%.(v ϬXy‘<Ü݇d!&c†çˆ&g}3Ì“ƒ‚V±ÎhØ@ò£4jz{“Ú‚«9üäÍ·'ûƒV/¾*xÍaW¢áž¸@ßån ™¡|úwÍï/ŽBqú:í A@Xþ;Í—w°°²1±ù—ö«é¹,j ¤¯¥Ñ/ñrÊàÂWRºá׉¥$!gÍrŠm(÷ Ÿm ¬©ÒÒ ï¼®Íqé¿ö‰åfÐ0c‡Mõ‘±½—)z‹ÃÔlö³ítnü°¸¹n÷~zª\ «¯ÚïQsTí§AÐãž6´x–ÄñÍñÏVg® ™ngÃ6q‰<¼ÌùŒ ƒ?eÍPf¿H‰²Â`»œa½ÓáÜ-ÏX´üÈÅa¢¦¦k£N@ MŸÄ8ÛMþ,|up>æ;X,ûi?]è9\‘„hšC4d ­%s…¿’@[Q1§_,”Nq¹áÕŒÍÕƒ+jº3Ô&:p§Ý@èsLAõ.…D°Œê·Ü ‘LK®Wò\ÜÒ­7ú…†7#9NÚ¹çÔ±uÑ¥å½ZŠ Aqf^õMŒ:H™Õ¨ÑbQ±YbûÙ!ƒj¤Ó>©{E~¶;Œ/—yCÜ‹ÏѪíYîïŽ]*'òš/e¡¿ç¢Â‰Ù•y1e?®èò•¢r×!d>‘Î5Uµ÷ܼðö‹ŒšéÕŠŒªÓŸsÏB¼¶r)Ù>ú»lÆÃ¿FN“à¯Ôƒg‰¼ñP®V¨Ëìå9åPªŸBò ‚Î9¡µºâ÷‰H±oë§üSþBÆ“Ti¸Ø¨]Fµß—@È$×$«íÔ‚ÀÛ¯5œK÷R;BPÙåûÓiHªéÆŸ¬« wñWø/Q7Öþç›*¨Fqì@#k´ß¥ß×~l÷•·/äú"OH»†6ð¡¥bÌ"qõ»ØsŸ-™ën²lcŸh¿¬Cx—‡)®²›ÕÔȦ3ô(¦Hn*n‰Ù9r<´DøÀx½Ùâp÷4™èiˆ²éÂ&ëÝlù¿~ƒyMêZ Y÷×à¿S‘7»VŠ)½ž 9z4ÄòИß>C¨*ͽb°ˆãH¾‹ð©iPõ)£Mä †¾"wr%è{»B€ðÈ;œòL¬úÄ'B¸ýŽF”§PÇ–ce×ê—¾+™rÉÚÔÝɵ.Ιnc¬äPÁ÷m]cA0®ë€ñý¡ÅÍoöV¦²Ïd^<«§A¾Vuû\DïÞoRÈ’J^SÐqêÞå´ý6„A•lV¥ù/ÌÌ­ôg×3œ×ÕÄBi´7BQ™*²ùGøsóèÏÿèZ‡W4¬‚þ ¤áÛ³ çŸö«ldbcö¯v^~ÊŠƒÌ芢bbiRX˜#ìðæPõÀZõƒÄ¨mùÔ¦H1cu ½419¤``¼¨®nD†õxoüðãÝû Ä1B³ƒß¶}ͽ~p/•4WVÀ›ž ùMÔš6 Ê4ç{*²%Á/‰ %x9[æg}†G‰’»y­!Gdx“Ô{þX:õJ¾é‹7-†Êö*Ï´ÅR<T-‚Ì¥ûpÍ4^u‰+ãÕQXmAþ*–‡tHW 3I‹ß¦ÆŒÏòèhþ<3¦òè¹þ1ð¶|oM8áiC¿Ðx÷ Ӳ؉êEIÂôåÖq³ŸÕn…˜™2ù†`lÔÎÆŽ~ÖãÎîä…wÔ˜„ðÿ„œótø÷ žˆ þEƒ)pÖÿn‚UÍ\ÿÑ5ÍÍåÿÃÊ=dZ)‚ˆ¶²¸Š8ÂZÚ©¿Î{ †yƳì<Ž'Üx ø¦xràŸð“àÿ⃧RŠêgÓÒîõíF‹Ùíí÷ç—G¼@'t³˜ƒ,@1 %yáÀ> œ•ÕÛIO“Ç(N®D 3žpjŽÞjÊëŇz-Û6Šì$0­ã³F/–WÑÎèÁ¿Ø²Uxf=©n¯lI¢Q£³Cû$Ÿc$Z‹*¿|•¥Íæ6ê~…¡ä¶«FãÂwžU_Ui6»¯m—ësLéWØTjgÙ^a®î ‘˜Gµ KG([*-Üfˆ—-®•v&p×Í„cšîç§C†3’DQ‘ G{<Á£Â#•ïUƒ³5þV®´{öÞ@óÙ^cD¾N±”¥A‘÷=ò»XÿqXÚ3ŸI–@0,«±Çg›5X^Œa,û*$Ê·ä›3þ¦Š#Š,å­²‘"\ò3g°„ÅÜ,óœqo– ›‡l ¤c‰XÎä?%JÑ4~Z¸_½ ¶TÅ’ü³34žÉ ô™M!`X lë«~VÎl×ÖFc¶ÞŸUš®…íײ%šqá„ÝvÉ“üÛ¦Á[µæÜnéÊÝ#…Å0dL®­ö+ÜaèqF4Þ¢[<­ì‡Í|õ+Âu"W°VÓÕª_:Ìë³pžqxU7BMð>ýÆ!l•âaˆ©1Ú΃…¸`þíœ7û Ÿ8Í€*¯þnÈC9LÀZ8l‘7üð±^O|—¬>v²‘˜éºà‚YAÿŽ4vjòmcAübîÛÎù¡ô©_0 ¹p‰™Âðux°Xk(Þž u ïé#°#öúæ÷™@s|î0«‰h®ÞIh+2âñÊÒ'Ü¿#ÁÆ‘ïû_€ø¯‘à¯ÆkÙº™ýèüˆ?Óþ*¼Še{D´vÃZp0òq…%DÉ|W¨)M?g?yþ;†¾ïQ(D{ÌÔXÛ'õh£Ö< Ûú4Ï[Nãnî½YÀçëa,J3׃@ &¤chŽ@„àz¬lTGà7Ɖ̓Ùè\”±'õVüÐUØ'3á$;RDŒ9*ó²–†]3w&}gqMEf°õ Ï*ç”/‘X³ÙEX9&å=×ý5)ž4OÍy 7|³Ó²SÛnÚY v¯Á¯È µ‹ý´+V»%ü¶v¡Ó4íHt˜¹N\óÞHÎD”î±»¯LÞêAÙèï[9*ptC”Þ1ÓuÐT¬õüTJ÷0äICÔܶgèç\òƒÀ.6ø†Ám–MZÅø#l^T-ã„[S_Hœ~b±|ššó­ë{Q)!kßu¾ É„./˜˜ÎÁ /Å,1Þõ*,!Ì ¬d‚±%OhVÝ‹ÍðÒG5vV<1Zî>E‚NKðÏ:ìáŒ`I]Ì6˜YŒ˜"õ²%ÿóó/®ã5,ÐT-„¶â|rË7Z Ê+¬l²à:.„L1z×€8Íõ.„ÀöÂÏ\­úë×hÏø ÿ½æq…FºˆvÝeRY!Êày”ØnÎèW·¥ÀZ© 8&7 ÇÓ”§Ä Ïá ûQ}†í•|!fS“pçôÃ~¾Ao×Â’|3)ûܪ²ñ³2‡/lÚ­7§ýnWŠ4¯H®0Î4£°úA¤xZag‹ð-ÌYI³i«•V%³)É/¤ŠzZÞó»ʆøÉpjúu‰&â¯Âµ­‡’K1¾jè!b=% ö'Ô|¬}¥{’†¸ °±FŸ2^ùÄë"ÔË$iNFPX¡L]!çª:V?ÁY(JRÑ¢Ä4­‰.]þ€|“Å*Wãzgs.îäBÞFR-|‹˜¶/2#¹»,t'Puëïã$=û€üwSJFoýkJ³àÿu^ùý»²ÌÿĘö?óÊ#UtÐP„&ˆÔ–½¿iå\>[ßwiPðMðäÀ»ž·‰? $ñ½\G¾ ß9C›XÏëØÆ¯ý}z&sï¯â z¾a÷³¡|`#3SÓ£•H¸“C:‘'`äGDÜ7’Ä8N*ôt ÿh5i#[ðMm§Úë „‚g™Õi¼3³H,0"™#±Éµèè9^ÓŸ¿kn°b®ó kë°z£+u8ƒôÎ4l¸V;Š*éŒ;¥ix*•ÏÅ+¥«Åî¨z­)WWs3*ènª°³”ÕjLOõ˜faÕn92 ÿ^‹]1ÊŒ#>û@¥÷‹UG ‡uµDy]6CtŸ´›™cÐÕ…?˜ûV‘k5x‚¿|™ç5Ùí¬œ~R¦äSUÅV ŠÆ“œ$\0lç{™ÕhžëŠ™üðÜ÷y¾oe–Œê"5m¨5ù:Ô#ÏQ¢B‰@ôCT^§Ä‚Ê~ÿ·zÜ™Ã`h*ã>ë ñ|"ÂÙX˜«)Á:î!ª}¾Ò8e¥àWi~ÉN[ÖçÆNÊ—I^ú’¡Îè÷ ZÅhÎ m±wö¢þÜŠ€6Òr%G篃Ú'‰æ´¬_röÁRvµ öÆoÌ¹ÍÆ4»Å1‡Wó¹À.© ¤%ŒÑ‘öØÏæñÐwµ„ÊEfIŽXe–åÕw7&hv%&Ôîþ㢬U\rÎç'šA½Akä  B©|ÐÓüÊò|ˆë ÏÝ^"¨éâ.©7DcKAq_{¢œŸ£ Û&y$f yÄOŽ5¸e\ÒcŽ9Qù<ˆ<Â.`Ó‘ßÖÂHHÑ©epム-ág”&Ò¥@ùˆoòù´Ñª¡,nJLrf5„ÿa€ž·'ëŒ 08æúw|‚Sø*ƒ¹G¡ü?Y€šø÷aiú›¾:Îè®Õ†yV©ïYl.“%¨eT „ÈåååºéØå”»9§µô¬¥TÁC®¡š«Œ´:꯴;ðzZÑQï8PËv£>Çò„/žrrÖ|’Âýr“§Nßfxn|vîs-òø¿ÖÐÄ›"?-z¸y‹þº9{ðËñÏ_Dr{MTZ9£âýPû•wöà’ã_°˜ÌûÑì¿,Ñý¢Ø{òÕ{VøëLë#Íÿ×âÖKˆbÀÒ™ï‡Ö¯Þß«ŒÞ4Ë2ÅìÚ,Œï– ü'í¸V-’•UÚn=‚êÕñJÓ×µ®SÕù¸n·rýeWžEoÞ‘ìÚã²ë.Ý0­`"bçˆ÷"GÑ̰¢l¦W ’•Zü¿¨EÙÂ('ÃçÏMµ›«Ô¹’§K¯0ùÓâHÙÓø…˜|1㬖ƃhü¹Æ,ØFü*ç½—ómg)ɉJÆ’U|;W’¥#åMµ7 ̹rÝpü ’Éû¹ËÒ4вœ÷.4§\8^\;¦(v5ùjU”J×íKõ… ßmO‹òѵ̄€¾¦¼†?Kçµ—ORÅ“”MýB¬é^ M_e@¢3†9R‡ºÔŠb£O~¬õÈE«ù¬§ŽÔÌó>†CW«pº[7ùm\Q$^D»6ã3IèÍs³V¶0Æ®4Ùª2ÓmÂ/°wr°nø˜¢é.cŠ›ßÊEÖKõ¤ÕÛíTYKxÕ¥)·Šªß À©o"ˆŒÃì*˜`{ %YÂ9×oq‡×¢K¬ÙÀI齂rJ\@ج¶÷¹,€ÛŠœQN¢bØ ^Ô@¶ëÀ1wßRrSö®,Ú–•îÁÂ_9AW²’Àäúm¯à“mQ›œÛ´GèÎNíj"zÞ0Y 4pL€–RóÎÑ…›ÁEÏCÏDùZJ˜ "}CG¹Pe•J¸³üiÚå­¢<±s 8Ì) çÂýšÎNîÞ+:ƈvÏ€íFöur^{)_B amd¤“51jj¦—Á‡})ûŽ¡¾/|µo1éʰ/¼‘ÕÖ—èã?0Ðþ“k`8¡ÃŠ™"·@²\½Õ< ¤‡’Ž2`ÏY©€©Ói¥È0¢Þ"Ïõ ð'ƒf|H '­L;=à¾iÔSK<§p=vY.M_ ë<šU¼U1:yñ Çø%ZƒãÔâÎ}ö³—Qß­æX‰2>Ú}8 ú6B]ÇNÊ»åÚ¼ Þòµ¿Ñ©¯G™¿Ýb–»ëô¨J×è¶l—²àí^©&½8=ÙÌ~ÃË€ ¿Œ”v%‘l+‘y胺µïÀZŒy>#cHXê û"ã»»Nýó‘¡zï­4OJX×Z5@_éQÏv» Ì|—u8€EsG1”ˆ‰™ÌVfÅ9Y€eþÂÐdöësMC'-Ý´o*˜W¶HÉÙÖÈê—ôW·%T{÷šÄ’ã­+<š"Ua×ÜŽ÷6·ϨÊ8 ƒÚ¤/ÝýЉ½\DW_Ìj³ÎIÝ6Êe£^ª·ææ÷òŽï>tžvs„ÎîJ¸¹9׸ˆç.lËz«VMKWë}›…¼–~¥n´P´¸ ½þ¥¼ß{EŠâúI²SýîÔÍ û§WÜ'ÌÂVuY†Âµ.x ½Ô)K±²Ä»¼©»‹Èd‰¨ø,È)fdÚ(Û*3qF›Ùm.S&Þ¯CKc½˜ž=†I8+{sÒªÜe¬biÀV=Œ§g‹c(¯6¸ v÷Á¨6ænöºX˜Õü$üucHuY{]¾b_ޏäUÝöë#çs^æë²4`~]ñÕƒë#ÜAC™ë#ˆ7I¡ÀuAk»ðÍv!é4\Ž·ÅÇm¯uAw9HK_ý`¾ÏÕyÖ¾ákgáçùy²þ2±4±¼&Øü΂V%Kgïðv=áJÁÒì`PÒ!V4 …µ²0pg-.ÑRjV_ù8Q3—êm×ä\wkü³Q~άígcé‰J¾ ƒA·¾ ÿ!Ô€œcUÅœ¤íiºÑbO6SÌ,Ž¢ü6Ò0ÅÚ·|(=ˆ)ý™coU–~‡ücoUÆ—â™6²²Wÿ`zφ¼ó2²Ì€é¯ŸKúˆ©à¨h —®Ǿp¤RÇp»ÇIà¨bŒu)£ 꺅¾×0t¸ÙDEÑón¹ ê_9ä&…ÚKÀOqëlâëÃ0ëáK}¹V=yB¤ØÁ‰ôy’æ‡Û¡sÂÐM¾›þü#3õiŸ–ñ1ýw<¡0p‹\ßõD tH|&~NºïÞÙ>ùPíÒýºQ¿s©lèi¥¹ðÑÔÚ}¢yéÐû;È}z½#IO=º…eÇ#ÉN}^§d¬>1FòyȽ“P°ßQ"½zžho}ÕÆgGSž¯“3NŸœhzó@vk«v©0òTßòŸßšnØd ÿÞ~؈€øžppsÕËDýI¨ñî§‚s#‡JôHýüeRV@¨péþGŠ/þ÷󗶤^4Ô<ð¼¤çʽZšO“ᯢ¨¯ZºÏÞ‚˜/³wšÃ<{¼^° ^¸ãMå\ÿí€àg´û“&1ËÖ"ÉN°+è =K©ùk¾0w¦ §¦·¹¶§KªyBa¾Ð?ÄØWí®U§ó„"|yqNAoØÚ¶ô‘±qkš¸x“Æ&^¶®#a„xtÆEtœ#’¶UQ±¹kšBŠÝÉ–±FÙ¥=ŸMØ«“ë ø3§%½«x#]KM>FÑ6Í–žÍ¹½V#̧@•DwR爌ðãØÃö0ki• ç“EcbC“3éê£(K˜œÙmEª ”í³¶zq¦tyû#üò¥ŠìózÑ{/Gz©ð¶Ý(ÍÚ%ð‰ z*~¢Î²¯f^Žg’©‡óº-1»±tw¶‰Ï–Û‘ºã6U&‹õ[§†òì§ñ!ˈӕÿA¬˜`Þ?-×¢ >[|“o8$ + e‘ý ÎcALÌëIá³ZÀF 9ßi0œe'wC§Å-uÔÔÔÅË£8RÄ>hüÌ×úM–¢€~õm3÷ɵxí·E4eån}0•Í– â ä+3qñõÈñ)¦WšÍóvúΣ¾ØR–Šúx㙤¹‘YÁÊ–ª}Öœs´£LÝ`1?©—®õÃpGl:Åk¡D°…ß0¥g_,÷†ŽgŸ—EV Àâ™IT‰ïŒ_xŽXtèÛo9 s’’Ó¹¤™”, n?ðêC—ˆ9m)úyI9‚[­¦_$¿VC/¸­0©.œìöËWö¼¸À¦äRxy_ùtÌçh f\%¯Ë—ö•,Jã†DªÆ]Wœ´¥Ü!Å,}š$xžˆ2‘·«q¯(@©ß×kk¤Ù8¶¤cKÝ&…|üÚÞmñîDö¿EâV¾AŽk4(¼²}€ ì¹Øì h²Ë“Õå(èÈÁõS½a®8y³‰üéçÕf•ªgsÑ"5ê(y†I•#»Ï åxã Y|@›!ZÄ·|Ç­±ÏXOT2ž|ëåŠ÷hìm2ºp(¨ªµq6÷ò* bÂ#ŸMOËç—ÆïS“Ró u2ôBXøŠ‡„cUýÆÊ®Ù7ð^Õ•ËlvlîmIûæ%â†\Hähä’âzc¯Í“ü#@‚?ëet/€0³âœí2êt`ÄSè’ÅÊèjOpJ9SyøÎ£ëØ%Ë~ˆ7Üæù‡îK'1Àæ+÷ÆùzóÇŠü?¿/ñ€ýc18ðoä“þ¿ˆzÊfÎvV..Vîÿ›x—ª~¡ú5b X–¨(Rc•”âü~:ÐüÀBŒ¹ÂÃãÒ­ìØ¨Sö8žè»¢4l¼¯ ‚)‡ëMº°+îI..Óz“,îßfŸ @ $ðä ¨Œh˜ŠŠ>&:+ö³â05iéˆ#/&v”¹tœàZݶú Q=R d5#Â|p ­=‡ò'ƒÇÒ²‰÷CR])|Æ]Š”VÑñ={ó°ñ—Ã]6³±§6s(a˜Bºš{(bRöóZN— ¾:Ã]†ý3Ã.€š$°ñbQ¢GfâÂÃdr¹¿q -§k!†JNU¹XžwßédÀªWá#m5÷ŠÇœžÄVž<‰O ºú˜m{ja1¶¤ruõeÞ¦¯‚ èyôç]Æ¥þPE½äé||r˜‰Ù{Srää.}aGëÃólD£™‚bž¼g õÅ[i0ϲb.èwÓœB̲¶1y> päèwSo uì'4Óœ¢Õo&ŸÃý}‡Öˆ æRÉ~˜š®%G'$ŽuŨ÷¬šVÕ릫¶ï‡_ÚÁ@9k÷c–Ž•Ú}/ÃCõ>YYRà(À‰Lѧ_7{lÏë®Ð#C5vÁ1!«/0“duvèЫ´ÓL i»S$kve)ÖTt0¢/eî¬\©Ùà€f̹N÷Pï˺ÎB+ØD2ÈÉc«çPÿL1‚vϯ¨¬th£äÄNËBË;˜‰Ï¯ÀoÊÒˆÓ•ÑAˆ^EŒ¨IiÁìü®¦éyL–/yn ãX],1žg¶KtÛNÏiŽÉ9×ÿ®lU{à 1ˆ v%ÂZbˆ,æŸK¿æŸ‚n{G¤Ûr ³ÿ€PŸ¥*óT˜UJuæÙÉ;`ƒÈ;„«H¢¤•hÐtIßÀÓZo -Ù#äó‹|ƒÕå!Õøƒ®åŒ? “„w› ¸v/óbv‘f«`l±]­1Œ)â­ÄÔ˜+P³»k¶&ÂðåƒíÙ‡íöcŒ*ÚJ€HÎÿµ«DÛiz¯¾:ÆÒZscINv_\‹Y°‡Ê(­‚ß¼dÞm'Uº¶“tlLÝLãL.ãG !ÓC´}˜ Ë[}•eT°Ã^‘‚þ’5l­5PqlpáêOsS‘SgY$iùk`^ÓËR®EC=Æ7W“üD6ÙÛ¯)RÁ–5ʲ™9G?en•>׺«ƒ]½@Ë—^èñ‰ZÉ3Ý.ÁÁ‹”‡¦Ý\ñ…£`¡ê¬ Cl^ÒÅDÜ«†Qœo}ƒvsDQß@q1T¢ry‘¾•¬äb|lÇËhöûÛ2ÿífr(ÆVøâêØy´5©Þ¦.WØ;^1QÐ÷ÅcPý’·Õß褵ˆILCPyÂQBÃ=Ïsh®üÎzNtq"XÈÀz“aÆÛƒ¤´+ý ôâÇÿ‡µo ÒÄyÒœiÛ¶m[Ó¶Íiûm»{Ú¶mÛ¶=mÛ~Ûî¾ßÞ]ìÞý/.b÷â"²êCVÔ§ªz2³ž¬,Z>ÁÁ‹¾gPˆ³ÞÎ\‘Áüa¢U±Ô„¤]_.®]Å»ÑS"µgÕÝÀè~J_çHn?šòܯÓG%jë”U‡5LîàÀ]Ñ ¸ÐSGתÊ4’çjœQUÆŠiœdN¹°ÀÚ«$¾¤DfŒ†á7‘&âx.…õŸÐ çyS öŠîμ0¤O""SÇ.In¦Ìü ÂïÞhHn«íb¤3ô %¼ ‰Cú¶Õ'üÍÔYvì!£-+S­±œE°”ÇGÖÉÏ‘Ñ.öÅ}úòGëöGfR'^Ü.ž\ß2u7ÊÍa6P-$‡w*úŽÅ¯‡ó.±­„ß eWár„ R ©‚;6ØŽê¯co¿ÅÄ[š›ž>äR>é%z+ R|C^žéÕ͉¯’dƒ’?ô–ùÿëS0þÆ( ?~4ÿãQþWñNÁÅù_OõGBé+&¸d±LÓžªLMi!âÆmHý/M„v×7ÌÚ~X¢J’Ä-³sÏè‹bÌŽe$I©1/eçÉÆ–ýóåÚáèlíÎϨ]SBIt7W9;¯Ü¥*¡ü,޹ÃLß+\Ö"¼ZOv/!%µù5"¦3c€^B¥­†Þ˜zS2±¢¨_Ɣދ ch½õ˜wd£<¯…´Êÿ:¡åhÃYWŠcUŸ¿þ‚î_”áV¸‡ì¿iB¯Y‡¹©%*¬·6g͘°—w¥ÑÈÊîõfÖÌwóÒ󀵨¡÷´Ô¥j ¦¡·£VBn=w;|˜õ¨E]ÇŸ`õ{ùI{kÐÓZ‰™ÁèLÏóÃVކH Š®}¡OšQêÚ¡ß½<™ðÄJE›¬®90„ô”ÉVHñdô·ÕÙr7'ü=Ø7ô‹ï7«Ž‹{Œ y#ÄJ.-û¹ vFÙïõ!ã8¦dúF’ Y¾¥]V>Næ¨ÂK=W-Û]êÉ}JcƒºÂµtSrRTn40×/k…–¨uu´¶¦þDA¨ÀÖÉÊÎŒQC³àm£5§IqYü{|Z€é¹[!xŒ}†~¬JåxØ/ÎzÜÇ+k[ª•ÆnC»˜Ò&JjÓ1© TãD™ rn¥vAýìcÝ¡akÂDçB3t»"5ó‘ÄŽˆ2îí13ô¿­>+6“Òã•B½R3ûæàËž÷oaOSL ÅèÇ&[¦E`®ÃJ€*îÒ­´—+¬]ΫC‚'©Úâ l`Bßp5cŽ~aëDÝ(IwÁ H¯³«IŒ¾"û>“Í„¡Ei–È RW«õ°ü“¢ÍŸ<–`G錧¯¶)nioœX³‚¤ÉßPs¢¨gSfL™«"LsCËkÌ5Êx' _®8ë_M܇¼Mnag Q5ô#óv'…ÀîpY³Ñ\°à ×S*g–MòåBÄ:š_ùÖ!ŸÖ(@°`â€Î}e4^ê‘U\Ÿ°ÆïËéëÞ4ÈÌÕÆœgŒG¶£” Ÿ½ÿR€“_v(òÇ'Ì?¸ÿ«ÇMÅþ?RÅš5½p—¿«éup=ðGcPO ÂFl©„tú PhÜM®ŒË•ÉÝá]ÖM´‰€–¦¿h°=2MrT-ÔvùB yÏ>NvßÁ¾Ùk¿Ö–¤u´v4Þ7†Òz›ÂJ'î‡xð~Kµ0%¤Ê©°ƒÃ-ZY¸q£YÚ´²Ë£Ñú¾ï1Ùl¥?"_½«¸§/·I õŽƒì¦ËSJœjK¬—~J(³ºLðk@‡Eci%Çl©êɜֹ–f9­D5}IOýÙƒkðUo)ÝI>/‡Ž@ÀÓX—auV^¿hn­»ôÆ#¯`OšÆP]xGa½Ê$Ö 7©U\ Îïj‘ì´–}”½e•ØkË{E ;t@ÀŸLÁC­76ƒ;JS8àèé˪túýÛ]vÖšç,jáoÿeÑvrEAõà°®<½IÓ…¤aãt']³¬L&¿ÛJi6¶Úì[j+Ó,ViÚnZÂå\G-Ž˜òšô ”é^sÅñ*¡‰ðÌÛ04‹khtA:‘Õ±ä6“Úy‹âJ^e¾&ŸÕ‚쨛“­µn¥J–eÉEŠL%‹eîöØ;Ga}ÆU¹•Ä('U —'øe çHôºõç%Ýk`Mä>@Îm)}h¡ød³ƒ"Tª5‡[Ÿ¿c¢Ð1M÷,AÇ>=@_².Wn‰+ÂXÃ4©k”ÒY°ä¬° `Ûqº½Êmm'&ÓXa=‘rYÔ³'H±Ë ÄJÛ%0Ìqù2ìa¾rI¦Öl ψ“ÀD¢øFïÄù'eçd_bÇ)¶OÚÿÈXËÒ§^ŽrØO­´‚42g²‚<­’¤yWLÕìÀ´µ]“MÿèMÂÈBµ•m{õ¦2…8@ûõ¦PÇ”’óš¸ËÜ¿°šæšV˜Æû%à0Êe\¯÷îÖÍéhd|â~1ì5»g­À£˜\O ÅÇoEâÝ›ypŠo+ãåŒó¡f{@”½ÙÐÕ×S€ˆ|“­&6êœ/äWÀ Gõ;\§r¹ ¨÷ÜùnÖ¦s<áŸ:“À¥6ê¶´°ÌÉ—bÅKÙ—@–2 ¬œ/µ~¡-”œ[‘eA5Œ.á{o#¼,`rì²óJV[ñ%Vs2¹K}”Ê]Ý=vš¢Ö=êl·-F\ ßµfMˆÇîßstŒteº˜o*{È5¤3ÓDI߈7y¹¶KÊ©z!+†ZK©‹ŠøD_)ƒV2ôek¬7û:*KÓg» .ñø;ހ˿þSdôµ‡N)Ø5šÁB.º¬í´³‡K¬ì½ ’³lgJXiΦœj´TqèÁÊ"Ï^§¯]­O¤pÝÇ/í¸…æ¡Û®žªQ’óŒíFoëQ Í‹»4Ö­ª W)w][Êsu:43H@i £ê½Ÿ?¾ÜâÔýð©žð/ûo¯÷Td•šŒRu¤Òü¶(|h’I ­€¦ˆåòž/ô*Á¦ŽóìÎxPæûÜóBßQŽù<§ {kðÌ”ºW¶¬^Ò¶‰% œ¿’¶^7 «›­Q Vœ %ô1e4ö–È ɨ3)âKÞë]°7®Å kü“Wû®bü'WûóJmò¨ß~7ñÉí°é7ª5~ÄáÆ©¾m»(MÆÑ“­¾é×E5*´ëäÏŸžÃÃ’+@0Õ–(Äôñ‘è¨SêÓ ¨»zJ¶C]t .O‹SùÆ—¦Mø¨Ma†27Cñºy¸D×±¢ða‰(hòoãbäÆ"ÝÀF^ ·<‡GC=8 îÃ]ãíxjt{ìgu 95Â4ÍÅ«IŽOô—’;ù5ô#®¿xÊmóÔuÅ2öífIó¡xë)Ö.¼¢ãVBîä r|8÷)0OD8•¸Ã÷»*Â÷½•tI‚dO{åMÏ¡çÿ²ÜáÊäÿÒÒaƒ%äíu¦ŒÐ–Ú€1Ôü|‡ïB¬âÿ2ÓáÚÍr«çâaæ7ÄÝÓÉ0$CŠTû£·*ƒêlÓ?u!²2{ý×êu+AQœõ²Oªæ_‹_`ðßàÿ»Ù?Jltø7¶ áDZÿ‚ÙWQ‘•4²3q²0²þ?‹Vkœ¹¡ª¡}Ë%š%0)Cñ‚óZ±Ñ´ý€iBƒjªÞå «½úëL1#«©Û§·É‰&¼¶IC#*Áœsú`ü8¿µGºÉ&ûEE?|ôë¸ÛmGÏïyë]ß÷ýâdò‡¶sÇ*Öˆ·ÍþÚ1SK^¤¹Îkctjìí¥¶BòE ßxciÀ_÷Í™5&G$bçBÊ(ýSáËÝzƨиÔ9 ä“4Yº1wž¨³º€:­)è°l¾ ô¡k¢§ºeó÷–¾¡žJÚñ§) íÚä¤Í#86cÈ\€œp×#ë,-ñp‰HßXÁÑXp;î¶$ª•<(+«[ß‚ÛH*¬¸Ñ̯Á`V»ÄÖ•Wêý¬‹¾*{@úzÌv–‚“n2‰S:Íjã=#¾Ñ«Y ¾ä-B~¤>h™ñ}Úd~ðZZQ9„¸ê©Ëlc å/GÅø“~4ÙÝ\¼j«×ÚÂàOY…›¿®Vã…'‰² Ñ9&ë[¤5LJërƒÈøÐñ,æú¤󿢆ˆ3C,6  ]6ÖÉdÃS 3Cºe[›¯<â‰lÉÿ²xÁ•jpy¦DñvwàÛ&ÿõ®Ì¯tþåF8OU*óŒÅqØ'ìÚs: q­ŠÉ ]hÛ*l/Bý4ˆzÄïl,Ø ø5åš«ŸGÜÒàA_T4•š H¸±“R 7Ò ³=øs= C0DN¸û 10.ƒÍÈvøÚΈú Í;JŒ­¢~=N9Sé2Ýž9eìEµŸ¸*ÑA³ßüEw\ÂAvÀªyAÕ«r¿‚üDŒrñÊ™Â&yêÂC ÚÅ£Çâ9–&½™INmƒ=]€G‰æíßt(§’ •:Ó&ƒ¨ ­Ô<8V=‘ºÎh£s\±`®WQ樤hà¨h°–­ŽI¸%[²ìn…¥³.]¡ÛZU¥Ój#Ao±&°WföŒô]ù“ögg KH/Oó‚°³pöäì^§ºç’‘ hh63EM“Æ–ß±°¾ã»»¦m‚ÖdŒím­¯Mß…0ÉBŸR«m,HómŽ–5Ì Ý½i;ÈÑÿ—¢&Ûü„™ª°hD^ZóÃ>¢èXT*e¦YuQ9õc¥nÔ“–ªŽ`OuÓÃÓú‡¶„öÊz»(?ÆA6#5Ri`ˆæþ‘Ÿ=f ÏŽ‰Òõà)娀¢=ÏX}¶ƒýdÜ­V”šw‹Á•…Íÿ¨|&f z!6ÆC}vŸÉaálÙ6'ez*,º¬(!B¨Õ*ó:SjPlV/©NK¯ÆNéi{`¶ÅŽgK;d,å} k.áŒ=ÑZMáB09žI½µ3§¤~DÚRþ3KÆÉÉà"E€óm§ü&6KÚ¬@F´¸P¶—ŽžV“ε wÿbõ‰qž…sR!”*õq ÜsO”;Ë–8ª–y·‡çE6ÅE²Í+‰U ÝK¤`ƒŠÒf …»VIIW~.DZ¡îõA4yO'Ê ¹gl3¾†Ù­ˆw ÿl¢Ð†SPòt7_éLúAåSHì"™MfR0ZfŸ>0nSóù/ˆQ ì›èüÀ y7˜/ÌðED©ä( %iÌöÚè’gF•N‰Tß:¤¨=ÆÂïeÿDÉ` íà%Û¬¿Ë@äIU_õa®ÉÿQŽê‚ÖˆD „\§¯ëÉ[åtAy`‘æ½I&m{8Ö¢‹%#»Yü|rfšnïéTL$\cêß&°Áói¸Ü|÷}Œ…ƒW&‡xqCöÏ 'ç7—ßrØø—ä8=…ËÇFtÛ¹%(×Q›Gí[h<°Çü9Td~ ¼ •S#WRÉ'ùAßÐL;ùÐj{;úI†|â§ÚêŸiN÷fŒ ýj‘îÌÆá.ê{‡cïT‹kmg<ÿJ¿±&ŠWÜX#]|Ÿ]ØWž“ˆÞ[.4}ºë$/¬Îúžß¿QæVE©¶÷­¶™Íi¦xæ^vÆGæ ¨Ð'Œ ŠiHèY-H¹ÿŒ0Oü49¦fyü>Õ@ü ºÈ¹˜O[ÏÀÿT«é+"dŒÓÁ~…» H( åšnMø}†XŸá'4ì–HY¡Ÿ‰NÝŸ¶žàŽÞá¢Æõ´*¿Á~üˆøG%þÿhÓþÏ ¤du-·u¤/»KÍEh¬P9bi‚W/?®Á„Ö>‰‡Îß.ÂÇZÒñO‹Ð³ÿèݦ“;΂ŠçnýɃDsv¼­0ñÙxýñöÜçdö;µß÷ý(ÿÐ6 Rœ7æ‰JføÚ¢Ú»÷ÀVû»Š¼Ý¸.q-§4 Õ®á;ª^_Þ’v¼AtJ͓ǠœæŠý¦7`øÄ³j×l&¢jSyÁÐ{H¹¡t D}ÙuRñ>\(_e~ˆ%xK€ˆCïe6€Þ ¤\d<}FN‡|å6‹Zð$»Òc>;ÙîZÖ£! —šƒþª*+%Ç\ÝdŽSÏ |ˆÚ_sº\ËBe/ŠÛúø¼Gm²~¦¶]£Ë>ÇÛÂÈø^b:MYp“@¬ãNfíxZÀÎ#]%•AP¼¯s­™Ã­uv»/¶Q+½C£dÓkå1þÓÿ‹<«&£…ÞŠÃb-¥Wcwu¾¸µ;ÅvÕO—ˆç2©VÒ £º apÊ×þ6Mê/ñÑÆ.~¦w(ŒÌg]ïTràõÝÃ,;@§¢ëÎÝB  ¯šÒ¶L4áÔði¤æØ¿Ä £ÙüÝÃÒÿQpÀê]s@~‰´ $ʽRÁwÑ …0Ïf?òP›˜ËSÇ©¦VÇtë^à!2Ô“êä ™OÍk™7jáìÓâÀJ$Ó·õÕj1K‚cì0I^‡ŸhòiSAl«, »è)SQ¬\¼'«×†‡}BoÀß 8pÌ~­Ò šF…Æ r?¢*AÞS¹ÕƇåÃ×;^hùz®ÑŒÈÓ›ë®Ä÷Õo)é ì$Ÿ–E*2;mq«õIÂõ½A䪀øÚœ'ÉÊv¸³æiܬ¿0% ½ÎoWb½ØNr>Tw,Ik ˆ ¹'ÕFFîB%"@p1'mŸšB=üQN­tÓ«ÚÖÅ„ßÒyJé2kb„žE‚ÿNï´t,hyysŠH…|¾> MÓm³ÓçQ–˜R0ðL0MĠ̪'ì“ r3É'ä-!‚C$Ì6„×¹„7Úð:ó¼QÉÌ’0ÀX»Ôzý¼Í)ˆ5Š˜ù¶@VÍ“F-E‘F *…‡)¹¯š€›VGdA²wÌéÕsO~ê´T úúóy6…'ú†À3?'¸Ä-:¿6“ÏŠŸþ+ŠsoñAoˆòZ¨ð*âaHåÁÂð¯ÃbÄ‹IrùN~Œõl'o{ Bý$“IÛ•Y²z¾/ƒbÌú!2á#ÁëW["}Û}Uw ÷hñ°ž3êbǻ̰&ᑜ9(n@Ãñ(ëi+â»Îm‡ÔŠ0KÎŒ(Ë3Îê‹…£wžé픾m {›*OæqqcÏ_'ü#qÁÃÕÞ?ÆŒüœuÜ·|A²ŒÔ¹íþC×§z6é«X¶»k¼î×_Óy¦©§‘æ|)Ï=êùü`háU#½©µÑ¥ð‚4zÃLÙ2N @̉<`Ç{ÿ&¯¾ñ¶ÈmŠßAü.²Ì»áI:…%m­oá'c}X”,9íåÄÿþˆħ>³àüøa+ôŸx°òû?o½ ½U—¿¹=!u~†<ÿlè#£kCû5€õL‹•…)=œ•¨­™¡y]½r©ÃÙv¨y£¬mi]»ÙµþÝÎVïÜζZçÑm¦»±+]6äôäû›èä}ÛçyÛé†û$çAàñT(ÙÕõ'_ä‘,.¾ùéé\ý<ø«æ°IIL£®¡a²#ö `VE— ó›+W Ó«Ç„‡yæ^+¾KbÇ7Ý7ÌÀvëLÁÞf­§*£÷-Îx07Ùn {lØC ¯{‹ÛæÐì½Ù3Ò×̷ͰúGícq¨(}œ‡‚^v™u­Ï„4Q"3íÈ tvñ–.ç̆BÇΡŸÏ7=TÇå¡#/£•²õ¶ã<ýå¥9:¿;ïZà«{r©×tß ¼w `å®N”=î #è3pâKbÔ ¹ }Ï¢jnãÌ q’0lýW¡\»Ža?ºú)¤kã¬QíNÂ*pÛb‘P «q™ð N´Ð_Oë £&:èù-Ô‡÷“ÿ;’I—£ê,ÆÅe4ù·Ueô)ȦqM{Gkks³n×*ÒÕÝímaÔûÓÄ×Z?6œ}êå(Û%ðúNÝu¤_Ú6¨EƒcÌùÎ{i   ­±u72¨pïIÓô!Ëp‘0ZãÚbã¸ÒF 0_«g9Är¥G“¯ ¼¾å4D’h„OÚI¡®¦Fë1iÐ[Oƒ ª¹)NP½<ã´“ç[s5w€šòPqc¯x \Æf¾ä,J¨‰+æm €: ¸ŸCQò»9H¨m~Yö DI¢³ YœÂk}£ÜÚ¨O [×ÔÕãŸÐÐÁ4L¨IøÌ°Ú†rƒÎÅ­&Æ.–ãýW“B•B3Û«ë\lFjMµe…Vk t¾d5ñ)9> dFyGƒ™Ït ºµ:cq>mffêòò"ƒ­öJTe®Ù˪ªŒd¹v ™©æ Ô8S9ö¸¤6÷½å5ô0ÏGýD#Qhß 9bmÌ0ÏVp­ð ^| í”I ^ó‡`5'F E3zP"Š1 ‡ä]uVÜö²…aâÎǪcåâÊÞó•,–¼¾åš'ØÊ<¿€_êf} aBXÁÖY•­”›W§à<ު̆CÒ²“Æ×âáóUƒ_ÔØWV$H¾Ð%[à *^ºyL©kPç‡óo‰ä'LÕîÃ++•s¢Q¡Òedè›’ÑEºÉ®Ÿå•ût¬À?*no†MK ¦KÛDýnŒ˜¿× Ó}sŽHó óÓ2ã&7¯ZFソü«øWDõ0J&‚ç}Dm¦µ—‘n4¬i,@Ïy›õ£Ç×¶‚Š šG–DŒìÕÒa™ßûlœftwàÅrî?õÙöjY1„é/‚Y"?)Œ‰£÷Vneô–FP¨Êz8ƒ *Ù½z.¢Ȩ¡…“C±·¨óÊÇòÉkñ7RÕs4ììÿõößw”¤§…"8r˜–ˆ#R|àù3¹N"4­c„ÔCǃ4vÕxÖät¼¥P«b;MT&W²JJ¬CjÐÓ2dhÙC,~Y~«7 bNk^X­hOËà^TÙ:ê¨'Ũ°ß˜¥•Cã™î#}²ª¢ÁUúz…U5Mß5žVYÔ„Ó«àÊ£ÌETI2R–kf5‡ Ì²­¿|éP·ý5äܱ¿,zw¹Q¿à¿™÷ô(ëó» j3]–:ü–”–Á·•ÕìÎO¨¬•Lg·îTꦗÙуrþ‚kº ¢>–Ö‘qá™ÚÌ0A·ãôùÙùÀk$J©ñôuÉè!^¸ÐŒu‹i[+ã´¨¥‘ôuw[n_}ävØö$‡pÒÞ"ÊãÚpÑ®'ïzó‚- yÌá¸"/Mã…åCg£PCˆˊꡉ+ïyeR[©§ðËO÷’3õD?·?±Ñ䨴4‚bÕ®8¢°Ú1Ï™ëãë&Úíj¸¹ôK?”]CÅÆsÚáãI×’6%¦z)ÕÛ3D E “g )le]ì´ISJEo¶¼§téÚáË%V §…ÍlI%p*´Kcåà vÚ+rÕ"NÊñVº25¦n\Èù¤9OË¡VÜM­ÞÛi;A cúÍgëQCĉ°eRA~G1l±ƒ‹4ke‡¼(RåͼHpÚ ¹Gðš=‹‹¨[¤ôq:é9œŒØÎ#œ†wÓ=], ®þÚÁÅfri£Vñ‘O¢Æ_ò•Ó;×W#ûa ›¬¶êÊîU¦þЏˆkg7áÏPAcz-^>xŸ5VËÍé%2™ÙuÞÔ™G©šÊ)ËOmßc,Èíˆxãöp1äôÚðh! çëx*¼b™ÖV÷M¯d;/IýS¾—'KI¡T'Ä Óê¶É²s„ÐîO÷”ˆohûrû9¸üd&~Ôn‘26žÎ¶ùåô¿ýxdx“ùMsSL”š5ó1D61”¸f´`9xs 46 õmûâ£:Åãcóþ†ÎªY"ªÂªJÏn£Éг›Y«r/_²réhY\Lq€b²‹—u^±‰|jŒÆù˜xVœ2Ù û¨°žÔJ ]µ.ÞŽé§“ä<›¥ ÛÐH!/6Llg1NXËÍ)³_J˜šÏ..¯^T?Ó,¯^ÆyR]÷|ñ§ßRUrG“ ’Í:lú”€å87—´„Ì“ÚVGeb‡öêu¨ªc_ª–Â~w_ÑIâ6ιªiYª-à§#Ofsðt7e%™º›e±˜VJÏl¤“`‡¹¾ú¶R]¯v%¢éˆ3—һu}ʤ:55ÏŸŠìaÿ:ïOœ@ªý…ò7Äÿ´+òxf9®fzŸV|(eÿ fÊ÷¤‹ ¸{øÙe>* À‹9qŸ)¥ï WÍÖlÈ“lÖβƒk6QŠ·¢?^ž[×$8$VV_"o-Ï-f4»m.Ò=ÝÈ«°üe;Ã/TV1)rC…È rHÑnz,iÞ³9²ªÖÆ/~Jʶ›ç˜•RÃÝßòh„&ìÿ;<#òJ€\Kä#ËY樣îæB –rÊ“ÿåwa¿+F°¥Dö*øb°’‰`Ýë ;Ty(H´%:F<·3b­Š'+/Þ\Pø<*Î46À䦒:$Mô.4 {çNHç¼æZÙ¬ûóøÔý‚ì˜*´xÒ*‘Ô=Úe@³9ñÖÇ—f)­J5ƳŒü%\Ýš9ysödå‰o@]‡)M[¦R­ìÕyŠÔj5©¼1©†£ñhi/:æþ{oèhn-qUpc)Rê:ýÃ9`gQØ6¦…½ ‘­9J×@¬ïî„5 éS>¼oàëã­Õf8vÂódgXb¤½ªÇÁ’•·ÞæÙeÓ܈ä~Ö1Y<¤cÞdë¾zçO"ðqeuþ ïÍ­Rä‹êŽ!Á¹ O =B>—ŸV ‘ít8XJ´™KARkÙÛeˆ‰ñüh nÎSuÁcô_[FÊpÉ®­dÖ=AôôzQž,:VóõÓ‹[,|,ÂoV*Õ³ƒ/¬9ƒôjª¶™vð=;&Ÿ²Mi·]¼l+Q©–&™éI¸†Ü…Tñ딤Ûof4ìôŒ´uÁŒ7X˜œýÀ´7¦š£P*¶Iö6ÁÄTý¸“Ì”+ZǤpM›“7úc‚åG™•œÚvâœhú²‘âOpÖ½¿œ©¡ÝÔ$ëƒó¹1˜ÔivÁ¦lŠ}ε6Ù•ò­!0è‹Û&à@ž e“\ùÁë5/b)5—Æy8ùPyÆP´³lùè7>20ÄIb/´ê9ɱ‚h—à·ÃÍ´.ÆýÈ6j¹B]î OXô·~4­˜"ùUrµT>TMÑ–=1¡ ©uÙõ³5݉§‡æ˜hÈΘ(¨ÆÜŒH ›!0ÖÿǬçò;ð˜•Ë,ÅOK·±K&•"þA†#4¾­CƽjÈÜ¢Ô,£`&t¬*0œ…=¾r£²p]”ÿ ;HZù3ü>d^Ö?w’ún‰ý>°7œ% `®ì3ÁJ9}z8Og-uÑXgPŸ½˜ÕFGù.âìÛ+'Fü˜Ù wŒíøÙN¢sŽk•s›º°`gOF[ðé<¡C*|ÈwÝMKcõÞ@¡ÿÒ™4ßļ>ßÛix#üûF'Ç2Äøõ÷I3Ô9ù‘FèvIŽÉ’߬ÀÔ–KÄ1C±£½E@#`í8¢ GJÿ§² ÁEÌ1KE• ˆ:,î<¬à éƒêP¯’ÕGdÐæ®X8£XgêMm_%ŠAà yÏO{ioÚ¯¯o·[ôάgü5—½ýN”Q€)Éí'—/Ò("9Ž.ÓÏQÇ)‹¹žhá%ôïÒ¹Ì7H¯ßÑ“Â+i`P%'°NàyÆ*‘—Á¥ÚGÂÈò—!ÝødÉfºtåcË5íÙ`ÅÒ⪮­†J)öSÇÁDCЈ¨ GUL@îš½VN^4lû#“å•v#F:,´XD'¥ÐîÁ¾1Å…h–ˆ¬‘˜×úq1ÑÞ'\¡Æ,&W :G‘|ÔHÏZ Öÿ°Î·ù€xõo†ÆÜæÃPš<ìæ*duzÍO[Çß[·â_PæÇúû\Sƒuí§S\•Ì·Žݪ¼(ö:/ôßD6ÝÐGÔµgÝØâ< ±&E®;¤ ³î¹-™F ¤¯\óéÞ²®£VæV=sá¯vþÉçã~¤Y9^¸Wã¶qE-­Çøÿ8Ñ­Äu¯.§'gùÝ%™¾I§°ßðë>w¥¢"ßc×Óñ–"mÛ£ÙÒØæ fŒ‘*–½öš¬[Ê,?G‘p}òÒÂwT¢E€ÐBÜCîtQ6“?aä+{Ë[!›E1݆u‘g×zn}úmùDÏ®÷0óêyê®pWÁðK5¼}g®üÊz¬…ü¸m/_» ïY+¦7¥ÏꩇÛ‘šZ»Ç»ñbû=– `_Át¸ýv«É‚l.[u\jÐuãjö–ßw„év@ÿ€?¾ZQvÜ?Ï݆ë<Š™,Ù™oWIìývûRj šÆ-1{­ðþ,ö‚/EÒñ>Ÿ3ʬbÆö6ÌÑ dGë÷¥ÚŒ„ÛQVMjh@èƒ/Ò£¶Eà¹Ûmȉ!/o.±¤DM^Z›¸ ìÑô¤È µW}¬7YÏ?µ¾õ„:¸ÐæP)ˆTdgU•‰²è$×/Ö«ÔCœl¦l~nŽ%Êj¥±·ß~ErEã:æÅ@ÑßãºvÇxùÈøà€½G<$ ©sªh\ò Ø{œ)Íšâ"í% 4>ðXå½å»„ÖF'Jâë –SŒî-/G6Îõ»ºæZ^Ë?!}%ŽøÞmmù1®!º«á)=G…t%¼­j€YÑKI_¤×dŽH×ÒÆâ7 øSvMð`Ð\>‚AƒÀk¸·Rf¼¯’…‰E#dº=o.( (ƒ)MVcZýÀ•9ÞT¬€7î¦4iÛÅn¡6sL××u¹ë¡èó6 ¨¸-$û¶d¹ËËdí0@$ýaÞD>êþq䵯ì™èÕ·3%+ìÞ§›0Œ•`>¶>¹*ˆst²åh‚qk6×1òõOC/\ºk ó´ 7µÖåe1ÇÈ£îzêh¶™Àجڻ¡—§Ëص|¥ÉoSƒ}3Ó(ž*ñ9”ر»i>âZÞÚôXmáY— £,ç/.A#,ªi<”þŽÌIðMEûXs]rSB½Oa žKX]àåIqh@¥”‚j=š.ÍPàkµGAEñ±YKÓq¤}µ¨ŒÚ*ÙE44¢X44Ü”~éu™ ‘Èôï$Áx)¶;h¬Én<_‚¿ËWþ)sn+Kˆ‰{ “Š$ǧ>£’’9OqŽ*2&ǧ–/w“Û±—ƒøÛQÒƒX‰ÂØÿÛÀ|ðõ2¡/Sï:àÂÃŽ4V?¦4k0ã©K¸S¯æ…IÒÖl\©ÙùHŧ©·Ë YÄÏÂîY†Hp|x/ðú ¥™oò ²‡P!6’@æP9÷î¸ãîÆ·ŠÚ5ºþœv½³e¦$Ê„öó*úÞÜÁ(”·w•¬ÆI{±Ò¸Òêt‚¹² P¹¡e3cÙ^÷ý}¼­pÍÈeíºaÈËÄ+é|Þ_ŸLÀÈ\¾p ²ž·)¸*tiÿÓœÎsŒÜîô³è“hlƒr†y©â{pÐÝL 9Ád¤àÎ8ÎÍoÐaŒ’S-Xà ( ðg¬Œ‰ÍŠÀ"¤>t{Wp X¨cÛý²F(q£‘19È2üØÍ ¾ 2U†ŽîJT‡îÞê”eùPOcô‡øÕ·£¡B´žÊ¿=æTTgJ#}InÓÛPXF¼2Ôf•c5`øÀÜà}§QŒ¯ÕD_Ðç¬&Œæ{©Š`øA½] @ΦÚ”¯ÑG¯AÅwBèoÑ+?ŠX‹oÈÿ|b6…ªùùã‡0è"ÿòÉÞÖÖÈ΄ŒYØÙÙÔÎÙÒþߪÿÓoóï¯L•·äјѾ:xY¦¸ˆö©.üÆû؇‚è°¤–aõDÜdMaY雦+j÷YÝ‚ã @ŠA Ì{}ë‡%;+Nò³ÃGkÜЛ@ÀÒ°Gm¼§‚ÀÅrÒœ`÷Lý7M¬FP#+Z¸iýŠˆ6¤ruqŸæzîø•_5—2876OT(éÕÌ`Ÿ„ómèÔÈU°Ô—:!òÆ&!Ç +jØ”m ™Ò =¸_á”Ø+ÖÓ³p{ËÏI„ZùE··4>¢p ¸ËŽg ¸g{^žT'<`ú¬t;[­”Á•ƒzŠƒ™P.tÃ|†¶­*9Ñú‘leÆ]8¢öBÌ\07bxïpðwô?Gõ{áj͘NñÉÉfPÛoÖQ{³<›÷œ-Ú|JÕ„?Wv¡q ~ÁwlK³¼E¼YX„Hñþ=ßhÁ£h£Š[_ˆSO1šð!Zƒ”аøKE&pJÔOŠV?Ö-«¡-í¼¸ 7(oW$V'dÃÚß = 8¯Sb]dõ}Cçn:Üh„§Q܆½2ƒ¼¯ý¹¤üK#ŒÖ"âìõ¸ÿI*òì†ÿ¹ðš°Þ:jØß¹ì±vWÊ.ÖFn:+Å– íðp´óÍøhÎÖ<Ò¡,;ͬ6cö`‡ ‰Ê^~´Þ®*šÿ(mÁ•¡U©½ýURòÞ}.{Þòº·Èø[ÓkpÝ~’uãóµãÖ³Aià{¨ôã$ ÿ…JÀlT‰WàZ:áÃ=;/Еïð¾tîîm¨°÷¼¿ÂÞʹ,pß¡„o/otEž'n€,‘\†9xø€LÁe:jŽ_6râ~G%Xòzë­íäƒò$ó4ª¹j m`r=š~)óáÚK·G‹À¶'•ã½S{{xà º“¤‡ì‰¾‘|a°÷õè±EÄ[#àŽ<½t_ÿIè{ÞÇú‚]û‘µ““ „…î5ÁîMZCÏÖ_îÔ]îH¿díȼ 6,øýÎ÷KbnVõÖ'õʼ@Îæ¦ ¿»Äí¡¿ã$³_“  @AŽ+SèoJ†Ÿ0½H‡š†˜ä®FÈuð£®7ê “O`Ïà™£McÖZ±‚ÎÌ·nØ0Æ„Ýçݾ:"×9ø¦á‚ŒTNÕ ðoh ‡}2 ­È¨²zæêT”Uôˆh¶XQ‘[MŽ2vÊ|ù²[«.w¢ÅÍÌ_²SÅÚ\s˜±Sgü†Š6üVL|‚ «[Ý+`ž:^ž¼ëãÝòþÁ‡:"°âÍ“ƒÆVÐF˜ O91ø¼¼ Ý|èEU1-ÙÝÙ[¾úšDDÎ`-nï ø|ŒÈuMnïn0ÉE–h¼æA¿1bc£­ðß—a„‹/ww”ûãëýôÉ0"Τ½€&Ù×*àOØM„N”ó¿(\«‘Ë7")'sÁþïB×SðZ<ÜÍa†º…™ÖR«Mg©ÃQþNãW~cKÓðÀ¡n:éocµ¼ "’]ôäüÖ¢Iè¸LÒ¹0×ü>”›ùMQqp®,K9µš™3)K–‘%¡QrXŒýüäy@•q/«%ÖZ:åéØÒƒ™á6SãµæÚÝœ;]J¶¥jÙ;³t‡”éAñ”5§˜é«­‘lHˆóhX(ŒæÞî$ØBÛr¡>o [‹¡ÌàG£}þxÖòëôtÖx¿øJ k^ ö*†¦ÊX<ˆP Ghˆ‹îZ°Ç&cÞ¡Ò«ñúòª&[VbÚ‰‰Ôsv™>[Øþ­¦îÈ4lgœ \ÀŸ6²zãÀ@ݨ‰†p×x:éà_¦m[ &ZtCàT 4|ð šA™&pDdømáË>zI“î”Û¦˜è štY, yPœS% åûtØ¿ÂÆÜI³lq¢v¹½1Þ»=¿Ž;æÎsˆº&NGèW$õ»ÛˆÆ;Ðfš+5¥‘DÒà%ÔCz™Â‹Ž¼B…˜DçBöë/4… ,šLGæ ‡– I0lã‡Q\oùÝosŒÖ‡•´›éRêÏÅs“°W*Á{¡ ¸ÉQyvëwj2Dâ;¾']‰—&P9³H+.,RÑ*äw‘üjSÑáZ\Z+´•ÃÔÇÑit Ÿ>ÂpsðTá,Olضé赩Þ릔ÛéYkK[[Ü7±L*éÚhÜÄ ­tCë3 …ׇ׸$ªân9xЬBpˆW׊֊’ÜÅt.–Ò„«~÷€dM‰W±<¿íÏ,çîún«EºÃfúûT½¶¹!frÒþn+s…Ę ûÙd1š;«™xÛ´AåÕë ‘j_Št³¦fñ“¦fl 7z¸ÚN!¥pp ƒÞOG«’î€ ŠÆ`:mn/ÁH™Y¡¸gG¤¹w~­e¤ˆÁ¡ð]鬳ÕãéôøU–€2nyìbÙ­¹›Î›$H[O% xr_qP& K‚™>.…ÛŸ&rÕ›é9Þ ®ží–è…bÞ.Õç Z\wH–Ò«0p\ÓxTª¸e ó>™ðì‹2¹EN©tPÒº½`låËzW†mîÁŽxæu!ñV]bÀÿ‰sz’oÐxépÂ}0ƒ~ oºÙî¸Ùnµ™$¯ïÿ²„ÇÚZNÍÑÚšYÓzï ËŸB0qGÂSÉÕœXv0Ž“³ˆ…ÊO÷xãXö”fIÙ|Aöùù4ÁMØ9N=O"™™<â3£ÝzB¦[T¸GríûmWÆ‚ßxÀÕÊ1Vçž.Ýz’r˧ÜjeÈ36ÊR2Ÿ­hpjÑÉQ»Çî–O8‚i ›ß ã19W¥UlF™ð<»øˆ-›Ó ¬Í9àá"•WO8bE^}ÐñG5Xv”ÅÝ›ÁXf,›.®BÑŸŠoa±:>¼"¯Ò%£MÒ<aйcÖ,K|1šjÆzØ}œ] „  FþM°Æ]éªÍ=Ôg ž† pÒº™¨»&sK^gé1…Á¤pøâ Õºâ‡«u®÷m‰¬ee¡ò2Då!"O:ZÓòG<øS~)®<ì2-YŲÿ{¤°Œ‘U Ô[‰A^—º GRJäše§”Rr¡xÕhäVÚ' ;(ËdÿÙU»‘)fëscÐì!¯PÇŸTW @©§1Ãò¶%Ò;zúœ`W¤Éº1Fÿ06BIu]•#·Æ8¿ÅìJC*Ú³,CFÀ8ÑÕLÅZ |ØR…9Ûß>¸ÛåÌqBΪ7¨ýI¤q×_,ãJIÉ>Ì,n…’*çEKÞ{⌚-=ìµk-«;Xˆ…T!žÝéûOxñõÀ¢ƒ†¯§•KñTFl›³pðUðçi¡ÐRœ%b¶ivoâ×ùÊ`(ËdÀôþªÈóÑ)]âͰOɸü=Nc»Œò)£Çjžn]N‘ ZÐÉ*7JrJ— ÕùÕÓ¦n^âFüPɾÝšÓ‚íÑœñ¢ö–±|БĜªª‘Æýšg¤òõÔ䊋{èCÆlûûíÄ¿-èì¯wÊÆi—éOZ„lÓ]ÖÍ3{øTjÝÿšYÜBufŸ×T×Ò>,ü]ièá®­×®a>i\7;1vŽ^ÐjÍÃǼÐì÷Äø{£îã1{ ¦í‡ÁÅ ÌñÈ;¤²o‰“‹1 ä•BñÛËH«,—©ZàgÞv!7)†k¿ÐlRD¹õíx‡B7/´ä20(%8äªñ9šYQØ«øBmcÆ­.<߇ðøÃwyLC«bqFö)<ÈH+úþ„Ðÿ—ìÄçK5ºÄôÝ"$ø_ºˆVœ”BãçLç°•³­²§Õ“æÍ„b@ÇÀ–/†Õ“K¬—³A•™‹ÞÙŸ‰Æí' {ùé›Ä…úöaÓi†o†óõõó¢.ò †®*Ii¨"„þ‡ƒÎF{•MBù……kEìBž/ÆxµÂi)yŽ ¹ì—a¼÷Tu ¦Â¦Ô.¹Îމ§ ¼)Kr8îèl7_;ævõÔ“Ús LÃ/S[—u±ÑzFè`"þ«lä)õ÷ qxx\ò$[U6º¾¥a£?n0J4•½16g¯@EO­íŽZ¼²cH,<ü¼¤BÖ¼Ôˆq-rj6Õ¥Ez#)êš§·¢qA¡MjŸd3&÷_‰ãÓØX¥Ø0öí;Âø“N¨%ÊBÙ·nX6ÿ±wŒÍh»…»ëîÚ¶mÛ¶mÛ¶íÞåÝv×¶m»»¶»k»ýžïä ïùsÞäJ&“ù5+™•ÌZWÖ•ÈÏ?dÂhtbûø_CÌó*ØI¿ÀA@&`þ»¨»¸þŸ˜'Y'4u4þ<9B˜äÛÄ„r.i'HáT$â "Rb9°?;rYnˆüüo¯c‚ß#†ÊzR%ŸêÔ:¢¿éôÛè8¶Úã5:œ÷÷:øE‹§Ã5·v{ovVO·W¿¾.×ë~Ù wý²ÊÁ¼ú¥f¬ Bv‹zýlÊë>] Ò‰üdb Ð<1Ã?èñ†ôà:Ù#pù\HĆ˜?}0ó…x††€†ÅCâ¢rÊï/è'}ÅCöÒx(@D”–¥A„!OŒLã“õe¾—µ_‘)K¯1vŸ‹bvû­@‹l8*'é³eig3—‰]&*ê^~©HWñq‰È;m§_N­%1Í ³?®IC œ9I篽—r¡BÆ>K¸Q•HÉ’ao„tÃÏ!ß Ó'âÉRâ¦4Íòf”`ƒ3ðî×*šÜ2Ïœ +*Ñ(bµÓEýgÏR…‘$ßêxÇÑ0_,5¯"0/ÍÛÐ-aI=&‚§×ìf¨8²U4Óÿë&V¯<Q¥]5ý×™·õ¬ݘ±‘gÔÈÇø||¿3n|h¡þó'ÆC…:˰¿=FΦÜþ_æàFä‡=má½7$dGÎBožߟCe¾ÒC笻°4”17>òÛæ~Vйß|”·Ýý° ch^Ò{æÁšà#ú<­&¨Ovð3aêLøæUfõL”|«ÙË>ø¸îÝ¿$Ç`‚9ï2"žÒhø(Õ½*ë¥ÐKÕöƒ{· ðóTÉï汫_eê»óК…Ä.w=üÎ/Ï ­¡ÕÐÑq4µ €y ;V~A:j<&(C¨­.…Kc‡É°ì|¶¶¢°ÖΖØç“<«Õ7({‰Ñçÿ•ó¥Œåˆ IûߣQsc³ÿE£-<¾~ªÇës¢ §l¹":ÐH‹"bËlôö5$¨:óí­DôViI¹­ÁlÖ…³… n<§æªÆHó³ÑºâÙÂ#3SÝö<Ž]†[¹]g×m7©7Þ;® )Ô#‚½ß¹/Ï[»§Ï†Ÿ¯ÑC Jñ?ný„{‰(ŸÒ!ˆøFÁ‰¯–0ß ¼~dC†ÞŸ9`×}¼{„·ŠØßê ž}ø·„¯up?Cc?Sc„wÏcNpÁQ©VÑ05™Áko¤w’'Š¿ñ>³¦ áM ÁÊöÔ ßëâHâÅåª2çJ™ ÏáþÑ•cfQïÓA½jŸuÍÓÚE<ßþ)*õ戴tõ>I¿#Ã>ENçÉÄ“nµ‚a_§ ZÞ1j–Ô_)«“¾È ¦ÂçOvªÚø‹oc–`²í´@„w mN>‘ªÃTZcnfý*’À.Í!–b7ÎälkW‰C¬&5zä§b Sòf~Ò$ó ]ò׆izU=m¤È}nF¯ÐV<Ä´­™¡ÈbëÏ'ŠîQ®3Ú mùJÑ>òéibˆ-ÞL ÷Ã-Eõs0·E.µÉ‹~]Š« ­Þ©=:ô»·'nÑÅÒÄ€†a_—‡u›¤ø%ºS9o¡‰ûQÜ…#ûL¶¬Þ‰‹ÙI…ÁŽ©atW£?0Œ6m—Ö›OBy±&…A¡ÊÞàÜx«Eë«âEÔ½mDV E@jô¢þ—¾æŽÞ¦º¥.Ç#î6[‹eYuè²,lX—>ï.Œ"i\C|]h4º&Y4Sá$üÁ;~ºÞ-F¸ž@ø ^HŽõuÉN»ØÔ›&…U~æ„"ú\$TÆ49¾<Åï"´ºµÀÝ™dm»&;’#%ª¨vo7&XË3±Tòú­²´"º$:áHl‡â¾Æ mÖ}½²n«9«»NKi« ‚D_xÒ]ÖUj€Õ2vÜ}v —¹É”ê6‰H~A0…1øû^mÆéR†·&™¡óÔ…"µå"T™bôŽÏW› CînÖÕŠèFÁ!Úí¢wXvJ¦êב ”Ay1+ªœ Nöb†ˆÔmZ}¸ã¥H—‹ ÆtÒb£´é^ FT"‚ØÕ¸¥èÆ6ÕbÎxjnsEp+><áƒè k£z5÷ÔEï†7(2»z¢v¼Ì¸õ€ K;ŸBëC ªGõ~E‡è‹ñ”ñ€uƒ½åú˜°‡ûC%‚ú¾5!¨í?ñÿöÃ'ÐØ3hWÈ£[d€èƒ¼!Uóå=Èn‹¼—çÜŽÆyŽ98ˆî[·µ`pTzw®4ï¹V¾5èV 6nÿº-MDÝ’Ÿ¾ýå…d¬1*$;Ccªu‡Ä'í rñW^¢õ²HÙd½˜¶H=û˜"¡urRâ…©®,þÚÜx°. qgíÁÇ´²ô7íRªá)ÂYáž‚÷¡Þ3õ_|åD±fÙ »‘N¹ÖjJI¸\È׫;á(ïÄôŽ:]˜„õZ—Ÿ9¬n?ZÉbNíÈpÁø&µƒ–X¯Ëç­MWcâÈÓ-;kWHâ^øË¿©1E:1cØ[ª€Tn[Îyq(^µ: gÙÏ“L@aSÍCé/ˆ ]“tm"ƒVl,”Ábÿ̨„ £Ý­òÄÜdò:Òãô&Ä ÷¤aUoAj÷„½2ŸäʉÙeÕÜI›'vžÅº§6iæ…h¥ûH]ö…åˆ_»ÿÜ¢ÃOÏy€Ù(Œ+®²1jr2‚¡z´ÇtèÜØÔꃊÅZ*ôÍÂFE‚NbÁžû’¿»C"Ѽpw”÷ÔÉ üa 4öÜw|Cë†`w‡GV„âJRÁVi{ç’ ’ì«þ˜Ùù†ûøRöËH™Í^A‡U¨³ÖcØ÷Dûd$ñ?釮l~*‹½%²¼¨þƒ“>{TÔV!S±|Á2tJî'<€©}‚ 8¸5‡0ÐD÷ƒïcÜGDóÃßUº|¥ †p”yÍq<äýÝk38Dx¨HöY"8”/û ݧr»ú éÛ'ú¦Wa BûœUÏGÿÄXXò»+gßÖÓl£ s8ûjÍê÷G}“èÒÁˆw4‰Û¥}…ú$å–jºk#šûL½Uü0.háø+M +y¾(F²Æy‚ðSÙßf$4W›n=@³¢Þh”n]¦¾çyx¸üàù9cfÞDï‘Pã»ì——ÉÜh³´Ì|kRÇ´B¸×Gsª¨B|v"ÔNÖ'Öíà?°WKž¾T1?n¥À ”5Zhr3Ôç ˜•í´`šÁE¢ëÿ@üãh ®ú.ža_X= xžæsjìz=£ŸÓפñ=ô b—ÎÒ‰y“ŽHzïÚ‡<]Éôõt©¤Ir=Bn`“Wþµ)×lËL¸šX/•·QD9 ›ürV0ŒcHǼ U»´II®ÒSµ'%’ËS^†±6$0)xª†´k¶BK6 m®jìÌp2™úXÕã'Û½9Ë€I«N‘Ò5Œ=ú#‡nëÄ êJ8rÃàúeß­e_GåT6ç²6•^‘NZ‘Û˼ïTãMäïÒ›~èó-9ˆ´móÜ}V蔟õˆX{³=qIrÝô(lÇa2GŽ^R i³K 5º.˜§;ÞÄò}Ý~qXægC}l¿~U 2ã'-:%5š2Ò›¹ÈÚ[]5!%_fKÃ?%ñ«ÂFãròîB¾—0ºç:¤ëW’ÅÃG¶ÅÈg1iO؈T3å]—vœo|²Áœ‰ß8Ö<ŸÄlï¯DÁgÔšó_rŽ÷ˆ¯D®¶Yy  KïÎ:Qøµ¸AŸ[‰“bŽÑÐ^U÷°"&Øh5¼¼‘~«2…TÏSAOƒ ŽÂB™¬æ©ÿ$Ÿ¯ai BJ $9wT:§BÇ|B¼‚ÈÉ< ;½IIä˜C[ Ò Ï့í²@7½ÞéB†9I„©¾Mßi‰{‹ÿ>)íÿÈ$†îù”F>qø3žŒŽ.D­pET\5÷ø­@¯Âd¨y‰–7Žú8'SN*vÄg -°=/K¡åù[a›Ñ¨jß){ÿ/äÐÑ/.{L_¤<ð|´«Ð Ò=JâÉÄ$4ô®‚l=^c‡Z7X·¥Ò‚JžŸµ>J"n[“Ozv†g¹•Ì+¤JÏP‘gAÌ5ºkÏ•}0ìΕ/î°|Ô€ Úx_ˆpëñ3Dó é) g¶ÐhêñG“Âf6PxC÷)íüõØn ŠéØì(H›&áÚ’WOϹ™ðè$¦6ëÓíŽ>'JbB!iÊ £1p…@ÌFkÏn ZWj‹È-Ævx˜ë}0_¡JÓnmæ RoUMŒuï²XcT6"Íf_äxþKk%[Ù=âÚNhGÓÏÂG»”÷io_hžß…!\4Õ\ºBuL“YoD˜+V£d-WßÔ]û&ž$b¶kF½cV­Šõ–©‰'-ЗɽFï׊››±¸ÍÔñºe¬%"ÁðOÍU·l¾Ý^ü³†`a£}ÔA8;]Ò—&ðÎíª%A›8Q4¡¦çÑ~æX\ïtFòƒs4Tk}˜¦°PðÞd¯>c*Yž÷'\>º×u8Sê&ÉKfC¥ž)iÉÍ9)ÞûÌÛ£á'[ÝuÈ¡F‚ÈÀéšRàýë+6^?ö1Å0ÍÐQì&ÂÐ%»¡%üÞßüXŸAàqú{~Û:Â6 ïÎeR.yí¦¿è4\ûåÙ:»«šOÕÍVó¡{AUÞîPŸHûcÀfâi©è¶:y¡¸Gš;ØÂ£^ ZߘZ,6'Iyší‡îO…ŸèªÒ‘uß¶Ë~Æ¡äÆ¼Ý4FÞàƒ#n;F_ƒ´¸HP¡NˆæWø8y{¸ qÀÈsE§æTÁ E1¨fÄà0 Uº4æµ×ÓÀýx¼äŒê–{ükÄ’£²#žú|*'ÿ*[ËÜ­ÍéгPÇ•ó»^4¢ÆIž{qçå¹oF_ÚmZ5*u%2Œµº´æ›™¥çúè!0u­8·´Öo q·äÞ0†)²¯ê^3D|‰Ï\WsõÞs㌚É }Ú×iÚ ÏxÕ­)˜97 Â×,´Íƒ/F{(ReË:^Ø­U±p‰Ç¸=®SjQëêÆ¶Gl¤_m{QqD!+àUq¯ òÎ÷‰¾ÍÙ‚¿QajF59÷=y‡Ä"Ö#”-¥¦eô¤!¢Âk­FiëyÈwàŠ"¡«˜I´³X¼†—ìRðyÚ®ô¾¯dÆÜu3’Hf½ÓÚ¤%E÷Ï&V„Wí¼`h>®È kXïæCTP'†V:˜×CýÔBÍÝêõg»g—yŠIŠ·lÛÔuÎöbДGÏÒæi#,bVmyI¥2u’ @¤Tä8ªÐlO˶B{Ø*S,$mm°˜œáOÐÑ.…†Ò‚à@æ3”d4mÆp¸”I‰KmQª:+ò7¢0RÙ×U9¢oE¹!úÎC6c@ç·z™-S2>tbÐè>hêÚÍM‡s£ˆ]¥ï6ªÔ¹*X‹æÜËzØžWžJ§õ<3–7–îÆ“¥Ô¸'F{›…½ªÀ«¶:}›åïÓ\;umK-©Ïƒu‘TLé^“úõiRÑ9´£iRUä^ö¯SP×¥s4Ùl-ûœg"7ì=ª‹¤}°+XrC,¤íS ©“NÎF4nÄÞ˜IŠíÑË¢³O rÙÄ‚³Í1U1Án혭FAÆÀY@õð'>nç=r´ü¬è2þ˜ÔÉ×¥ØÏ¸ß¾ìöÛDëëªÃäkÔ —O&+qx¸lÉ ·,õz쟧.½BÌ1ÔŽa,ñ(ŸhœwÖ)ÚnZHNäžl ÇœŒï\ÛÈÖAë"ûWÑÕbúòDàÛÁ¥ýéò•‰cdÞŸor›;Œ[¥zsªñ7êqTÕrf¡<•”÷o*ÆÙÐWûiIÑKÂȈ% ø03²$B2ær®[j‰_üÊâ‡pk*FBý%|{M‡æ‡®×îm»D‘ð´1Ãì/ë\y‘l«¯wmY5à¥ÇˆŸ·Õhâ3®ñ]X}äÛ¸?x¹^ɺ^eÓ†—DoXæzäôÄ‘ºO±­Ê2Ö?(ÌéÕ©å5ÁøUfóÐÉWpÍš½ëalŸM ûÁ™j…<øì¿ yÈJ§¬»ÿÙ‰üaúo yòÆ.¶ÿÓ‰JPBŠø)L¡WÙ‡FùkÖcÛ¾.¦<è¿î -kì¼™ôªE EØÉ"çý+ËìäñÇ/ëíëãû×mPm"ms¶“³j|käü}aoªMìàžxVüZñdö Y •À½ÈfO+I,@f:×òôˆ´°%5¿#ùŽM:Æ&bÚ[¦Íš›dË.ÜÓο_’Rß 2;ìLp8'£¡µn±ƘâEåÈ¥ eɼÝð.6`ã8?gð÷ CõYõðÕa6»ÑêaØÐFBBÁÙuβ`ÿÛ`‡ÂëAÒŠ ¤ ú¿1>ý?`©9Úš;ü×NMTa$~Ñ tó"dañØåP/aqe¹aÐhµóÍ$8â¤é½k—7@qÿ;áJpúŠ{°Oª) <\Œ.™´ ëRÓiîõù9prÎp7K¤¶§ÝúâÇÔ°ý³3&)Åõ~o0ÜE¾2¢|æSËݸ˜®pœÍJ¦ôçØ†Ÿ‰ Ò!$GŠ)Ó\]Žê’<áU.Ú¿Qî¤}VsÆùf—Â7$ÛÜpE:—º±Ÿâ‰ßU„C÷á´%­ÍØ<Äú‚ü%žXƒšZVÇ¢W$а¿bZ­ìpƒkpNð:¬>0QIãû9›¡¼£`›Sg‰â1uE ï…o B³Ï? €‹³ožvØÃ'M<⾌ì€ÞS*§toÎ=á›SSHdsÞ6âYâ5‰ÔôÐæ­†ÔÞ¸$^-½Í”$ƒ à¢~û#" ‘eƒeE²¶%¬wÇ 3[bô|W[82ÏhÏ?µ“©û ÁçQHsƒñ÷¿¾Á€ÁdNLDöÿžó ébíö¿çÒñÀxéŽ,4)Žù¦äã¯7àñ¶6ÀQ$›! á9)þ‚ƒI&þgÒ³ªÍ’‚‡bܼ؅öÞ¦ ³¯„¸!"…˜ŸÇÕÙXÌØê‘¥V²²>Çÿaíúpãûùz¸aæ]¾žå;¾#„‘M7 äMÍ+i¤HÏ»‡Õ›1I÷Î3²Œe[‘뙃ÑlÀ ´5—e[9 R¬÷ Ôœ]Xëhö#Î@ž%ÁÉ»1·ëHÕïg(¶¦d§-×–ž¡±ÑPmŠÈnYvãÖæ¼(D®\[á^¿4ÁyBµëAÍ‘µbRáœwKÊŽgÛ›) ë^ø´‹’ ß/ÛÏj"ÙѲ‰µÆgÓV Àë‰ûȧ"Çë†å7€,Ø—-”O†(h…s«„fã/Ç!?sÅ‹(xÐw%HÛPXá*/CìÒí+Ø\ú4ªÊ™:ëÈs­£mJÏÀ+´Æ^i¬Ç+Ü6ìï7p&_rnZ ¦oW7èæ2M;¨¯ëª=kPêÍìH<ð+xàvé›:RòFýÃgó¡d¿Y\ëÂoy±ºìa $d¿¡ÔÝ–¦x ½&߯ù ªx\ö‹Ò+²Ž¿ú»&iõ­,Ò™í[±.9@Ù•ˆïÔø±Ææ??A`"ý;11Ùr2÷2õÒØFàØ,ß"¿ð™Ò7 Ÿ ŸÀµQô²¾cäP,éÏIÔ1F.ï:ÜÝú½3ï$°àÄu±Þö ¤á»ªÁTì¾&3êáùaGŒ¹§éàTþ¶:çþ“íY\ç?„Q•ÌOÜÜÐÜQrl4+4lÒr£ ¥Ð‰w@$¹áùWokH0+Z™³‘ïšQrô¨ï(Xr²Å<NžU>tü蟻³1ßÏw§­¨+6“«UȶÄVħwr—Æ8 R¸Y~æðŸÅ_‚ùÏbÉvlÈ1IÍtXRàïMhÔ¢äXw^FÓXüÒÙî¬åÂΤ¸ïŸßµ±ïŸ¢ú¢€7IHN‡yöþ´·Ô`©ƒ{!¯Éú¤d,5tâ³Íö` ìÐN’*}QQÿPÑ/\(Ic%CpK×ü>G«bËC"ÉE¬5P˜£I#¢d&’æ’™`¥-è¡8¡Üi×Yêì2ÇÕrfêUôXâùà…‹¸0A7Òõ"CGUÍ9òòÙýÿÉϯ!)&l„8œÃ§ù(};ð4ðIŽæWJí2_ÏÁ(V'9—€PUT+füñ—åü°+ bTñMÝ et~rÔ™à}³„SNˆƒvôEîܘTÂP„Ÿk)“-©0 ìæ„äøù4!Õ y³ Š­Å -*a¸©p„}[Då?Ÿ)bh¡ÃùQ…µp4=3Ú\ 1R+@+$y6F2æZeó'NÃ(Ss*™j §–—´¡Ç¢l²t…Ѹ ¡i$àéy9ëÕVû$ÐDÉìJ+¢ëœŸEVŠ(ÃñebîO=¾ )Š\jÆN×´”Yý%Ù&JXqkh•ô¾PÆ%EÒ¬°háøõ·THÁ7‰ƒDA¯9Â}¢¤iTé]tñÙœœØD…ÆÍ;\8œzŽ'. Ìdw7_›»ÝîÅábÞaVNGXÚ–G‡™g|ÍÙV”j z¯C‹ªáïQ’¢ ´×äË Ò½É-“7”FeÊbØd!3Ú^BÄO?í5.ÎX50Ø2Ä^Ò‹F áTVjs™+“é6õå „dkvƒáÀ3RÉÀ¹›NÊ“ ‡4}»…üåéOjIJ-ûyq>f~f’i ÖìB:Ôˆ´›8^èN­ž¾øm®˜¦Èd‘¨a¸bå¿N'6"uzVß"ÕO•;`¦ZÌFLœì¨OüÂðâRð²‡wö;¨Ë´©3„›ÜþƒÝïžïO¤§È¨ÒúÅ® vC½á_ <7‡¸:º¼&^ ª¢Ü;žT,ÂO'SÛ :³‡¼É½1xSçÈŸ¢vß´Tw·±…»«½K”ÑZ±.9ŒqS¯ó½ÎD¹°.<|΋þ¨8òQê{¥lZÓäøÍ:ñ,¯JGm?qM™tõ,É]·)ü õç·–¯±µi´è<Ÿ¿j†'*Òó€;Zn.)r,«­­úYˆ†³yÀa/:°šð[﨑R T‚!´yý.™Híì~)eô¶Z5äÓRĞю$ÄxqPcE’È«1sCŒXl.[ÃÑH Á°ów2-µËý¶I_ŽSÍÐ…]c±ëq·^MµË4î<ŸUC°A…÷œpª£™hž:] ñ4Ó!õï zoy_{*ÙþMfMjw.Šýrim”Š죫kWÓ@d½¥a¨[ÿM'ÿ]¦¯]Isz6Ù1éÝÙ(Çm¨ÎãfÞá<»U-cù ]R©WN›7ù[_»¢Z%ý/–×$޾¶¬G^›7Ú@61Ûöçk$Â8Üãçmψl;½?L[ ã>GgØæ"gÒ,N¦¤fçmí¶Lbo¸Z†ð‡µEe¹ëÎSŒÇr¼òbXdBí°_ o¬fóI†à3–ê2)Å”X;>“ï»ÆD•îÊW½1 Ë‚m°¢gw9Y\ú%~‘]R¦Zð(¶|ÔY0. bJ‰þöìþêÿMìwëOE”‹~B®u„ б¸Ã}NU¡ïÃŽa@{  ž‹Æå`àÝáN¥¾E"Øà“SQín>ü0 q^Í+²_/õí}l„;ò™Q©ÖdvD'O™~ [V+Á1 ÊwY97¬D‡ ÕNìÿjEÇ–UÀ·#.Ûó}i¢6´°B>õ×z}y{/ž蛆ðˆÿÿÿüì @Ï©ÞÜZ.äx‡¡›/k­Ñ§ó ©sc°†ºyŠ,¤˜EÓ2u£—m`f˹3»º_Ú‘NÌ2(„¼žÉŒÜß$îl1`q9ÏР!‰:¨Ç‰âNÂQÄbVUàçë!b7ÂÉະf囪ßRvöd¼Klø‚÷û.³ŒjJ>¤…_$º2ºß]m0¶Œãâýжrö<ð‘&ZNÞ.*q„9@ù˜gë¡€C>ì6 ⃤¨aOyÇÈ«iqµ¦àõòèQé|QÐü`#WØäðï/}¢ýùâ×Aó•Kö-ˆA\³í’ö˜¤ßÒ,”¢(á-¡ÀÀŽÌ'› !Ñ ÀT»°`„7• ¨Rݸ–…³?”A-I$þ²eÒJa6Ú6^û¯¼Uü?´+ÿô% fbÔššéaî…#DÿÀ¬)¥%ÄOÐnsç'zz°öÿ-@‹ dýñ ¢\Zö9¥òyƒ7ä¦è=¶GŽZqá! ´ûÞÏ˹æ(b¯Ó¡6ÐSþèP ö+ år öÌCår>vŠ& Ù½¼ï\Ü)G^‡«†VßûÈ?‹æ0”*JV¹*öY:ñ‹“BÁ~U†H𡱆œÛŒçC“•ž¥²tNLÿÞ8éÄ|¡ü’ÝGuBÿÏ…=Ÿ«²À'õEKížàBýAæ¦Ác8€¸¸ÞÒ)lÈÂé{½úíK0›=ô4*›p¨’»Ï¡Ò†VwÇÔ~ê-âî[¤ÒàíÕz=0þZ-ãþ·ñ‡â¦ª"CìÝòmŽ Ç|ö\›¶½ü}ôíÅi%šM+OhS¹Þ‘Ô&<4’b›j@9\aIT);„%{vˆ¢VòQl7’PJ}\r`纊î8qò‰p0ñè]¢äËká½7”é‡H­´ß«ÒOƒìVaÔ¦Òÿ’iyÞª°.wuø¼D;¯î˜iùCQ´b¯Ê-« fÙm€M‹p¤WÂRŽtNt> 4ñâŽ-æ.KWéS›Ú Å/ &P£øûYPѵ[Í岉daý£`Q’Üãß‹«²UšøÒü‘«z‰Qܺp =„A¾–­¶-(,„±1%„¿ÖÆñ¶Y[S¶Þó†¿R¶m1ùìjÛïp÷‚%MN0z¨BvY„"‰õ¦ç\m0ìbYw³5Q½¯V´ÜÔ×¶½ú¼rˆÓý]–]Rï÷Îr<…œ ¹<}6¶=­ÄÅ|EçEâ2ˆ)ÿR'á^=5ó©ñvn•#»Éƒöò¤ÃðµæâÖ™W¢ê5؇hÝhîßUH¾O©hìfÕ6¬rõã鎀L^ÓÄñ´«j­.r|–<.šüo4z?òhþaù¨…%󞻌°7®º–e„ä&Û…©ípƒÑEm™^c²õq©Þ(Y†Èõœ›iä]ÚaM—»óc²fŒ…B³þ…bèŒWdÑl£*µá faE‰HõŠ3aå^º;êÞÊg†Ú~8y0]å}ÆÒ¤´Á:*´r/‹¦áo’-}ßß?ÐŒ3ĺ3ãœe—îÞýÖ1×m”ׇhUžûgç^]UZe»5–°¼ r‘“(³š)NNŠ’>¬cý–ÌWÛVpeg{óeGÍÀñ$pWïïºkËÀñОÁñy+\ÖDÊY§ŸXgÁþÆ }ÓcªÀóU‡Ž~LÅIšùh•ìž9l½AÐê¼ÞB|g0Ö—m-"fàQ]馲Ící:<Ãúà«àÎë®ÝåäÌey@˜ÞÝá‚Ý!.;ªª}bOûBúW²ƒS,ˆ›®ó¼±üìŽA{•àáQ­ÄQíç1¼mþ<¤³cBΦŽ'Ȭçf/ˆ½ìV+?ÇÊA+CÓÕ¬3äÁ"™Ub:¹eþ}C’€èË¿)3Æÿ;;@ͺDRÜÎÛý«‡dO‡î‰›×ƒ—á”ÃVÚùi|{åaÆEÕåý½óÝ!cÀXàÔ¨ãP¹üfw¾â&¹t‘ÝZ;|õ­ô¯û”Ñ´†!&ÞM}ç9D-ÿ3—7#]È”î¿g*:€Ç|ŽÞÔÌIkŽÅ4hÉUf®vdm½©‹‡c¡J`d T‰XºÛ¤3Þ”ý–^e‰h“Z[+"ƒ+¯šÛ^DN:â6ÂÖû =Œyž‚a<+„(u;œóK(?LìÖ†dÁt ŒØïј)K#Ù˜×ö[¼‰uÅΚ%/-R5Xx†ŠÆü6ˆŒÍ¨¹Ë+‡1þ&ÇŠ0Z>OÅ¡ \wL‚ðýôͤUäöÆ%ë<½–¿.hµ;ÿ¸AI¿k4p4Ö­¶´Ctþ©D^·_*o]cÏCž Îü„€íÑ2ÂÝ6zYóS½^'Zè°Lu)®) Ð/1M=›XPßâ†3q{tÄ_º\üäèg3ê¥Ybb~ƒI”v–ôf`÷oc{±^'ÿ~_Dá£Ü–‰ùȬ‹©/T[ÓùñÿkŒõ{P¹¬,3æ×·Ë¼ï8Û³ç?\±Ej7ZÖ§"k|ξô‹>Q|·Iìo‰rÏS*QA`¥ÓgHÞ]Yj¨ÚDtˆ•âúxû5,*¨œ9ý…™0U“0ñè”#ž´I‡8×±)%Áà‡Pn>ÈmOµÖ»‚ÈŠËÆêÝïBžÕïÜkî÷GÿY™ºƒ—Ì* <ñ·¬ìX#Ø»Ÿ ‹\ºgèÙH Ç%¶[þ«çÈ’cì´zzŸ.‘ú°ÇXIB^Q"ª&6ÔÕÑ-¬‡¤ž¶©éÉ2à–sÇW˜§¼Âð¢¹ì’äùñ­¾DÕʺ٪ ½ WuRñf•Þl§Û«É4ãq £fÙ l]ÚP‡LÒÅšN{¨‘Dæ#bòJY÷ÈÇ*l3 ½™‘{ú1?? ¢kNé„¡øHW¿Š}li4o3´=P=t¬”µ!ÿʇÚȇü©êõ±‚YkL¢žÉó­ªÜà‚r*[·Å¶„PyÌ4S&ÂÐWsµ1YZ˜»Ì|zÍ6ää0ÑMu€ï']*N®Ä¬éÖ)ë,Ó9S¦'H&°áÝxÓÜ”Œ-Aïmêasr9@7£a6fI‚w×ÑÁsZwK’.5mê–†Œƒlô&¸ ©€ ö@µŽœÜÓ˜oŒ WbÙL\.Ê%…" #!ÇŽÝ— ®ã?‡mŒmÆÝxù‚‘%CçÍ`ógUêmíøœÛÂQ¾x:éÿ=5_¸˜Ã}{•¢]4ˆÓ¹Obbý3?:j=hÊøÛ1’Çß±½|Ëf4M›–×b(–§*ÍÜ‘Ïèªo©Ï,}„¦†é Ú=——ÂëÈqx``ç^ ¼)#­z#þ08•öÓ˜)b—Ætèø!nBf*Éžo6ƒ¿uóSÊBP¸øˆ3ȸì¬&åñ=ÚðU«?fÜÿZè9w¨WsΩFž¬”ÞMZU0FbŽ‹8|Ø;à“^Úí}Û6,·ìËÄ Óg¹:íQ@‡‹iDÃþÌÓ¡¹Ÿ]+‡¨usŽä›/‰Âp Ì’üS9òÁÌçŒÝìE”WùÍÙ¤>…÷®Á[CÙì¡uÅ´¬ã¾¼~“ìfH¬@.¤/Åšõ6½'E(û¨È›Â:…b]ô2çÄÄç,.ä„•Ý#/½5#Mã9°Yg•ScâŠë÷S­Õn‘\Ž?ëí·ˆFKµÏ^læp ˜ _tŽ ôõô”iŸéÈ1â%gÙs3ëŽxi7þy^êËÀIm×M¸4ó'à>íA”åX­æ<-UÉ«´Âø]§(Z.U¡cèè-"Njî½°*Ãw‡H¹ïÞ³XšRpéä>oñÞÜB|ðX{=V¤æ"à­jõ¯TÈiÂ{1fßžÕEìÒu,@¥ç×ç…´0Eà æÐ1ßôäUfI¹Ð¤pú‡Ï:w©&KÔ=Tw–YÌNŒ2ƒhDr^i³¡ꃜr‰ÒöhÅåÕ¦GrÓÃàdá;Ìo—^_ÇlÖàÒÆnâiˆD –L™ÂuÅ‹pAÌê™,+tI‘êŸ99v í|ÄpïxÝø¨²&hÉ Ôv<ŠUä:k²ý!¼žz •øé’ XoÄ«ì/'Àæú±…ïŸÑÂ?!û«Êþȹ9U5¹¦n߉ïj ÌÈ`D”5iëKZz`lÚô«º`$QòAuÃÔ)cÚëó¿ ð£ ß ‘à ñÐ ŒÿOÞÚÞÜÑÝíÿ_þ§¯®«ªª‰öÝ “K†Nz¬²<ŠÃ,&GÕ£ns¼b¦&Ò2ËŸ{6”ëÄÝcx™XÎÚ›±BÎb^*àQÚW¼D¨Üµ,,kѸºsQýtåX7µøõñAò~§ ÍÉTm$6`-wÇD Â8µO°£Î„,Rÿ§cbÈ÷· 1›i ¦*_Îɾ?ÃÓÈÍéGަ5DÓ/?$N‡H'(BšLXBêW®°%,Ø=ÔŒüÆ} ÿ¨N#xA¤”Ef¹Z’z’j=•ÓÖfÉ9uEŽÄ(*hŒFlv2ò™ü›öôE†uŽ6¥5#¦umGšö|jSÑyrÌyª¨vSlÆò8k®Î¢F³™0«ËDL‚h§ÅY#ÑyW&&ö_»×ûRãÄ{û¹:ìÙ?n÷B*ŒIÒiRb¶dØQ”)ójrƒÂÉþ8ì"{”ÚãFÞKìtP8Qs8=í`Ü&fbSÏñfC¿š=¦QèéV‰Î~ ?4tÆ/%¤sº„öD:ÁÀC$ƇtÇëaFáÕg³ä9/±³˜VuÒ9;Ï^fÉeʧ5â覚ÕôF b攕î~CªuÇü žå/ÃýËu“m(–#+ÝL ‡jŠ®N¶P7Tq@# ðÒ‚ìØpz¾Ëb³Öv˜H~ Óµ¸fèZÔ9¬6+Õ— E‡xÁ²Nxï¦+v,YÜi„,7’Á|U)ø2J‹Ü¶Ë@%Ü”×ãÜ¡0ÉT0–h§`E¦I3“°iµÖ‹/ýmXõ ¹[ùšys³z™Î» ³lEnÓŒ"G«lhES»ßCèÜwð”›²¡ tßh¥ðŒ°t—e;ÇvxP”S7•²— Ÿë&]XйÚg¿Œ<¿dy'~½¨ï5 Švº;s4ÿ ëòeÓ¹Ü6x+¦×•jh{ÒËâ(´ôlšôD²{…ê'5Csb ÏHGÒÔ¦PΓõÓûÃI9*úa#…gñ+î÷áfÓÇRyrèÚD6‡¨ª¦ ú–Z·þ…é2)  bí*ÁG˜d6W\îÂl$a¹,Øñ64‰})R‡W€É;)Y:Šeø3Îö7>ÙecTs BxñЮùKÈ'”Þq]ÙGL†(d¼o@¢ÍÕnMŠ~~%]öÅ–â'ôìøäºÄ£ôWS¶Q]%d¯ ŒëH« a§kfE>ùª³sEô›ÕnGØP“€ 3¸€ì_e¼V@Ò­C]«èŸŒ@ìº).å'œJowdäg›„h±:=fT¯*‹V™½iÏ ºì+¥€ˆ@S\Ê›æB{Ü«—‘¥ëHÅmÉ¡#Hõ¡¼Í3šÃw1JïžhU^.yK.Ô€Š8)ClKé´;ìSèŽ_4³B ŽY|’Éø–€")L°d3 ~²DçÏÃM¤¾R=R±Ÿ Wä-*B`ÝèÏÎO€"¢'ò*ýþÃæY–oØŽ´êh8”ÒçÅí±7ÿ÷ÿÕ±Ÿ/ÕXrŠBûÿä4o'si Çÿåè_¨â®¢ÿÐûTkaF]­5䄵{5ær Cæ`)EI"­ Æ6Õ7“TA˜r¶,iø—:v!F àµ,y¤$\Œ¥Y”"æ}bϹ•ÎDÀóŸ^§+ ›BÇÍÞìø¼ì¸œÊü¼ÍBÌ'ü‰àϬ!.Ö*ÖÖ¢+Õž®Ï4O6f;à‹¥‹ÅƒÕ%xÀ1*…Œ„ĈÃÇ·˜H‹¢2„9)‹â2„ßBŒ®ªû1‡MáxìÇÄpªùIøeÿÔ½ýUG7\šű*h»m½™ü÷¯ò†…¸»èàï×îA^`¶MË/gÄS­»Š¨Y©>w!ö!”¼Vh ³QÛ•f ö­Ü¡s¯‚}Ó56ƒ³b&Kf èl‰ÎF—½1•CÎ Ðâ½Ñª#NmCÿM QÚt"B!O GÑ#õ.²%Ûk”e=¥<Ÿ!uìÚ Gq|ûfÍ©áE/ ¥×œ»¦çCƒŽ{Kë™ü ÂÐå~ €BIŸm©àÛ^F/Ûf}SùÓf&Œ7òç/â§DýJ%ýâ÷O v†@¬ÑåçE!¼ÒDÒÖ%Àõsv:»,ÙkˆËsîBÕyÉWÞ»™)ãbÅ(œ‚µ.'pofÓ¨U⟤­,Xò3ªARÎj¶bÐJF•JבÀóU·g†„Ö|ªœÅvs¥»¯‹äº›Û£ùÌ„¤7_ŠD8RšÎ–ɯæNš±^‹L{m4ê;ªÔo©*H —{Ô îÄÅItçq­êü¨LfŸÂ"a{bÒ¤,™–‰[ˆ%Þ»Åìh/ÓÒ0êÛÌê±™j/£Éõ)Mçæ×EÇT´•åð‰j‹À/¼bFšèê¹&ÿ¤ŠcÆ<žŸ²ò‡`ðÇœô$*_knö?h #±–îHÉÜ>±4ÝõDE¾éOÓæî'-Ò¯ ¬Í\ÜXJ¯N¶?ývœkšò÷Ê–»¯$76yÝ>á5ëõÍZ2¶Ö‚Ô©2YW*ºSY©ÅãISaŸ½y L© ;CnuþE”žT£iK®d´ÚÎx(ޱrvÛSây ÄõFêÜ>q8Ñ.±³ä”÷S0vK-¦£(ãg¥`¹ÿøØ5K3Ó§†'>÷&HûH bÞ¡ÅžÞ5‡PL L ogi×ÚØ3|ìwrÚì'S¬¦†t­doÚm †§Ÿ/ŠŒtK™z¹a–Ž‹Êò¢+EëÈSš†/¼,{`eä5ÔТ[4 Šÿ¹¹©ÿYCXÈ[ MدC„4ÁÁ_ähø‚…'/*üJêW´PU•_äOJêîŵ•ËŒêêUäORêîåÅ &Í1Ï¢×£Zè-÷¡MêËîä7Cæ7Û·0îkŠ>ÛÞØ•}ÐÜ¢ŒŽÍGR>F¡Ç^oòjZ­Õ耀,ÅéäÀó¸Ñ‚Sfüà>ü>ÅíïpâÍltðsBvB¬^ÝÛ†rã}Kd#d³ÂFè†y¸cŒZ˸öm W8µÂEÊíÐéDƒÊ|ËþcþÛ| .J37 Ç¿¯z‰ ¯Ðû‡aøaôaÑWaˆ¨äwLÆiI~hñõª&€aÓ0¿ÓC”.räU—|mìÀ„¤Ù êá\½6òrƒ”»ºq/Nè|2:¢ÏÐÜ@¢SBé϶á$ Ñg¦Ó t$U•øç¨î¯`Mø¾~ϯm¾ßw¥?\V<ñjÌ.ZeØ´VxŽ]¡‘ípÉ=”a‡ë)•Ñê3j¹$>|2nú—Q×Û#C´kìÛòK¼^ÅK7?°Ïqõž¹²®PùÒhæe–{êk@i\½Qm‘ ²=z÷ûEÓf4ÿ\]lIR*—Ì—zþÄnepN¯æ8ý7q¶J /~Wä„ÿ ;Û|¡îë¼â–Èéê<§*yD”Æ#Ù+š£f>¹ãòéÙ!eer–!=¿9;=Á—­‡Ôì‚¡|ѳ0ïçTQžPévTñvØÿ(ké.˜ÿQ)/dWµ²Û€æ®ÓøŸt7^úswÅÅ‹ÎâU麋Ôƒ™ÿAÏm´$c°\]f±f$cÃ7ó¥˜.µ³ø±2i§!œ‡Ó ¨‰cDpuf?:šý1¸,-ͶDøih  2ÌC˜î°9Þ½œ;é•F@U&[ƒûý261sàæÍÌ.SˆIo3±˜XDù“ÓCôÿWÚ™ÀC½ýÿìû.K”’}Ë–¬Ùƾ{È`0Y3D”ì%e'K"‘Èš-ûž¥²B‘$"…ÿGÝÿ·L4ô»÷qÍgºóz~ÎyŸ÷û¼Ïò9¬¦Cždùg_z0@ ù˜ùÁዞ_H‰»íàåÏC5ºMÞ¿ºqYùbıK“¤†:ÿU7Õ’°‰Ruë<ˆï¯“ñKò«béq8~6÷_‰¯MHj‡XÅ×Y^#`Ì^mŽÙL¾Šçr×âè[¿=¾˜×«GX Ð"ö>F1†`0Dõ·g˜oè[ úie\ª²:±«n ††¬îqSŽH×Gfø—¡ª«® >>M• ß0NniÆ‘½Â\ᙫO$ mÇüj°vðÉæ×ß(@'GZ¨ç+*®û\wu{M€?ð̵©^'¿ŒYÚ}ñVzÒç¾ü6“ЊéKùÍ©Ä!vÚt¼Ä'‡…£Ž?j Ì<õY ¬q¿ÁÑœ;ê‹Ê›š“¾l™ªK/„cÖO)¾Zhõ>œ%,àÇ2«{é(·^ÊUVfŽ ñ¹Êß8ïÁ/YgW?£yù±VêFKQ¼w³“YÐü3÷üõ¼:åÂNr_ ~Ü£ÒæK=b³Ü©Þ7a8d8Z|"%ù?X•«dÖ”g õo½ý6Äf"dìñ¥2êH—K£î—g‡Ê·ºÉC”å'AÜ#¯±Iv8G¤ävT3: ‘Ä }=í4Öºð½‰k]dºDb‹3 Î/2¿ãnÓ¡ÕÉ>ËkÂnyâ…üpW5q­?ÞGX]ò—l< &rÚRÈJ;öÙä-ÏÀ‹x¤§¯!&ĸcÒäŸjú7÷w9»Œ–ñ²½ìߨ_£ý]à.(˜»»‡+ jíC?ŸñRt»v“ eˆ_y&\qhutÎ+‘† L¼9ò¢?6õ“I=Ýó ÍJÕtÌa¸ÔõŠÇçèx¾¨Þ”yƒ8cjSW}æ θAù4þ£B![è2õ‰2rågçùÝDt†n5ÇÃIDpßß–Ã=Ÿ`Åf\éŽ0§«l´‡Âk<9ÝM¤ÿ­¸ƒ¨Ø_W:ì°‡’˘‘—ž~3Ýñ[H9!Áu‹¢ÁE飌¶ ¬ñÌ|6Áiª¾ÇÉä¤,yd^RÞî©!•‘áê {øÂ\¿—f¾UßIʤ%:8%Pú"aÙò™\¼8ÕÖ^_-¹ÍÑÑÅ«†'yçæru¿}y%ðÂD6fî\±¯9Oy£¶1Šå2|:ê½dlm÷‰€v±]ù6Mmš‡ý/y©Ù!ôí_¾Àmzü]ç>]åŠäéPó­›—ï½\Mÿ ¬~ùÖ“-Éke>þãEêz·BaµAGÉ/Êõä+®Ë$†šhœ¹2Ryy~ì9¶Ø˜ÿW¶ÔÈj/¹œ°1Í{y­eÖ>ð— ZUø*hç±/#ÕŸØ©@ ¡ 'Fs£àÿ½°FœÄ òÎã]ï(¯›Ð =îPñ55Â"˜ ù4ë+aBÛÄ!êVqZ’Ö$¶íªÂCoõ¢£GØMË\ÔÇ‹ØÆ’D!ív)ѽ.“8>Ä |8qveñê”Æ èÙ2x_Å»öβ§u—›F¶¼Ç¶$ÞÉÖY^\ˆ1ÆJ;º€”£ð• g÷R ¨£›¸N^ØH_ñ•‰hsË~–ê |û¦—ú»Lw_ƒ1ÛZqC¢Mù¿ØñÔßcp_GŽŸ"ªånÕXä'ÚT @h,!ªåm¨S_”!²LÍæ¥° ±¸@¾†UÝëçpšŸ¤žiƒÎÁw)¥¥2ÑŠµ…µ-Ÿ¨cv%ÜLV‘µ®Ø*jÚj”"_ú¸ðxëá‚DZ”Gb%!sT2ûˆI•ªKÉç6ŽtÕB.5‡„žãúD0¢„á"‘+¬Ð"QƒÇ¦ò½êD·«©7¾ Î*7êTj6» J»zúªÉñIIü*ÿw§Õ½bŽ ¾yF>r¥ÜÒÎj…=3­WtŠÕU2ºfÒùt¶ $rON2Ìf”¬4Òø(üî ®Éú$*•¡Ôí¢ò_J×r*©Â¼…hu”Þ¼ÑÒOG5Øi z˜"ÀMnÅý‰¶¢y‰\Ö°Óo(zÔé]Ï ùÜB¤/¤â}óîBXÜ™m7O!–H·kkVF­—l§'¯?§Åk*ѸYØ”m¸Š¦–Wçô ÓSœÓÞl%,ÍLHá¨ÂTÎJÛ{MŽ¢«£ /ÊxÑlõ‰«/˜„#òåPÑ;I:ŽUj^ú÷IøM‡%& ç;¤ëÉž”x±¥8}¡` ù’Óæq“¶H<¤oï3+ž¿’³(ÌÒ$¶äa/ò…¡+bÑx\G¢¸CšŠfLoÄyýÞm ^LÌ@€¶4m¹—/žN½•räú›™É$¾»fa‹ñóD__\‹ÿ$úè¬!aiÔC:jþèÆã ÏYùßЪVÚŽŒäï2{vá>”Ur¹çs«´÷]®¤fª˜B¯ÐF‰àñf„½ dA*âõ—¨Ž2ôâk{ÒèjÚ´|7ó”±ežn˜ód8)KÀë»sr_ÙÆ]æÛRuðòŒ:‘­¬œåýRZZbTž!9’óõ©™rË`´pYzB¶Q‡+‡×€ö#3ÆMJÞ4õVéÂ’5.µ0ùsiƒôiQý£Ÿ¾­¤«æ]ˆ(¿.¬tQkë¼záb6}eõQÙ<¦Ä9œtrDB„YѳW³ƵÒ= B][SlJú_3Å$9§ƒËŸ#ð𜯠L½‰#Y~å~n‘¸”¥«ý;…ëu‚,޽åŒè·Œ7&ÅûB éƒÍ:÷œÀµ‰‰dñ•k¾$,MÜ}½âœ²¬gC½6#ÅøGá”@¥¹è"¦@Ö[é«2¨Öôµv¯IÍjëfR_FŠÑ©&…Oêg:°úc¯ßϪ”Ä,JHdž¶™ Tc\¨?á{l!æ×ÿ&]ydK!lXòÜ@¨Ê4ý\¡²\â-NFÓ“¶ÓůnŸ *õ.ÔÛH=Ú3M³d¬$Íñ¤lÛ¿(þ9¨ÇŸ¨Éö>$Â'…ˆ”>Æ25Ê0CØ—95‡A«¨óv}ÌÅÌ.¶hÚ÷_ø“6•7³P<g×&i¥Y[m™•;Näzäf•¡,BãÕƒ J=µ«cåPG,"'Å]g¸b‡A3ÒžÍ)b‰û£øM>Ȭ¬¬°¦F ]ã¦ê63¦¾™V\¬&e ªZsPö¸ù| ®¾NÅ£Úø˜MT#Ñ==kPÜCÖ^ŒÝÈ+iŽ–¸ 1Ò?³úù;iãÅÛ(Q=•)#DJ1}û&v¢âéwQ3S}òÜçr®Š H$ÍKE3ÜPÑdîF*Ð.~ÓþYr‚éWÉ%®\ÓŽõSÑe†­*6E<9DžØVÐÌSÒf\h¬‚Ut¬]þ2î~ÛÒ\c0q¢.ñY²X×¹K¡T‚äEqðyEZ%áÔ&²ú­ö+lz^¶AóÈ ¤•¾7PªŒC†Ù…mÕß›ãÝà;Â¥§Ÿ©¸º±bHÉöjå+XìZÁµ™Àaƒ^™£:ÍOB¹3Î}àõúêp_¹©(©N“×1­ä­¼÷µ¹‹¸×Ü"ÍhPÛÑ™>JŸ&j¡ŸdO¨`ùÈ$]‡ˆ;i2ýSW®y,! /sDëW*y îDí°ÄŒ“Èú܃ç6ÜK±N8ËFŸîÝ(N‹(_9ü„·uKÛÍ6V°lŠ©£ñ‰qLäº@•¬¥]p|P%òdF5™ÀX/‘ßdx¼èM{Å)…[™šùÊÏ<žjšˆ1ór¿Î˜PÔñoÒyë}ñ¹ ÷[×…“'\–Rø¹%ËgÕ‘Ç4OâÞ` T¼•=ô5ý±¶ïå=tlØÓ¤‰žàÆ@ý¨+űê;­VR±îÏ•Þèç?[ÞXrõsÙ2vØÌõ^:—ñ•ÀC2sñî‹-²¤-»1_J—{©açͼ¯(·ôCñVaõ: ­˜qy¯¶‘Z*\l“)OgDŸôs,\½CCïˆMø1›L\ìRX4]|mJ›’æÎ ±ø:˜"y<·KV;Ö0Át]ƒßžq.ÝÊ#±ç\Žê4_nÓ@Nÿs¾¥Â˲œI®Ný ¨*¾9©¥¸á)OÓgׄ¸*,ÄevŸÏ–H#§Þu¸óHGŸ¨zÕï…$oÓ íO\cWS™Ó[»ªöðY¿Ó«Sszv™‰ÑÉÃev©~…„-Ìiòú‰Šúœ¯o²?Ñ {f•){E²J…Š ïþ"C¬a……6¤ó[S*±ÒáÕz;ûÚ³Ðõ†‰ˆä ™KvÔ<½±¾&m‡,—jL,Š_ß*ßâ*¯—fÇÏM¿Yσã8ïoöª4˜Ý~Œ=0Öi•›Š­—ˆÿV¼?s]wú¬_S^/~(FNÙÄêT]X½Ì=¦p-é…ˆˆÈ‚î–é¬ŸæÆ»[D+'![+À7Y?ð†OÖéÊë¾8Å®|[åË ü5IG…׎ËDË—¢Ý_PZ²9—®so·Ò TÐËÙ·zdÓ?²öôLU`-Ë""p¹FÉ–ëÐñç”ušÈh5ÛFoeCáónʆ"³aá•Â’"³9á•’ùíÙ쌥¢•ÂçM•ù»³EfÉKY3ò;³OÛõ' Ï®‡_DÜšÅ6åN²#•Fz×ßÍá;Äj~˜úº®q8Eëú£'B^aËö‹z½É§nVsWÀîŸ-Òãw„µ0¤“R¬$h)Â¶Ø³ÃæÜy•JŒ¼GózÒG…û *GÜÂsF;ô/õseŸÒ†bϽãw€ÓætÞ·²)}ÆMª¶vB™¦)ïÎÙÍ´(ÁåbX]„í;‰óœÜ7ìø¤ÌÒ¾Ì*UøKf6ÈàyDÔë_âµí:¡Ýå Íáäš7ç·`a¢|]‹›, ßDët·Ã!¥ô ]qÆ+×:î¡0Súï6†Ö¢vQž•tÞU†òõÑ#³eW*kÔÒºÕïäÙ½¡ºo¢ò R˜ÑÔËevøÐùÛÖdü%Ò¦oØè¤˜®ßîx>ä=äª2Z:û^Jóõj»ó÷·q}—£×Í’êÆùŒ’8ëåŸçkš‘'º'ô¨]ëšäR 8M„½ðѪDWÓ¢ÏU÷Â\fû¶Q-ì Ï"äK/2QÈÈxáê~¤BòüÅ5&|¨ÌžÉçSYÚ*ŽSíb.²Æ&Yíì:Œ·œ³¯»:Ýî,2sÁµÀïöoa˜õd^1OŽHø:ôy­$r&•{(y*¾€«¶ýðä‡ë…­ D^ïpGÌ­a©FóI²ÄT†¯E硇¿ð:ñíM«`Yòdq¥^xV\4ý¨H{2Ò_¦#`Áåî|ñ´iQó:.jêýã>}kC©¬c‚XdÒsý¡åoá~WJígg?.ÍéZO%º`ÞöX™m^ë"2щáC$ÏËŸ»}B¢:2n$þäcgêÔãØtê·BÛ¨5ª‘Bjïîð>¼kÚü˜Óò¹ý‚ÏrOs›“¹5ï Óûë}«E÷ .®‘ð.·<'=Õˆ Î«311!AÞ6·'`WX݈žå„¾aÖ -EnÀnŽæŠèÔ³/]L¦.¸½à¬ÞýLŠvÊûASñõ|š„â1ñZ›ãÂS uX}•õRñ¼º,´Éß™å0ÅÝ 7𛢷³„„e_24•ÿÈÛ‘ô™¨P««ú–N‹ZÈ{— çÉ!Åe¾<Õ’ÁÊíÜÒÄbL«¨ªá‡Ò…½r¯‹ž×7âDáSS°¾*­ë cžÞ¦Èª÷&6EìþЖîbµÜ`ß|Rp–ÝæSÑ1pøÁcìËS`ês!—' =}ޱC/¾/zþjÔßD+á´4¢´!xy“9ë©”gžiƃ̎"“i}U½[¸ ÑüäM%DU½\ r•¸zÔ˜ÛãïuóãªåkæD^X‡Fûk䂪¨Yî—n 3ÌÖ[çR÷á«êðþÈêä É,D†º7ŸÂR:•æGÜøòå0}àsoÍ®j³ æ 5-ËÇ^x©§?ökëuzžçÙ WðùRJM‚¦§Sj;þE“Š÷ªÞ;Ô„¼èa5ysÇÒ$Ñ—GeÔQÿµvÿÇÌÙñ“þk†k%jß±X»^Ø©Ëê'J¢ï&^é¿×p%ÿ+3=Ò¡x–O—¼”/æHi1¾¨¦ŽÌz©ù;é÷`îi(äé—ÃÄ!8Lü.ƒ­¹}”¯½VàKmÝ-‰ÊÁ‡"o=ùtrâQÖBÖk"7ˆÎûC…ßr<Ú–ŸRóV]=ž³y~tj=ОÀ[§Ã1z"uôî7’U§vï^Þ¯Ëk¼1£íøç`b(—ŽMÆžK,aÂ㘦ֻ?ÔŹ•éûùN·Ìm»·ÎwB–/£d± ß®g\~xûíy™s½×âµ»Ï&áºÕUÊ(ny èEë¹ÍjìéN¾½à%wš¾ž€ fæÃ¯~)ÛXW,øbžºbö`–ùJXG¼nÁ='²±Ì(3½ÇqfjÃÊyÃÚyŠŸt« àéFFf,²JôÎÞóz`‘_š+)Fö¦»‘ã"g΄ivñ,i„`Ó Ü„¸ôwÒk“º´ÀUh”›ÈëÃPî.FP'ØÏ)—#75ˆå(Á¹K/”éÃá” Ý­qi”¸Æ1¶±A¾‚‰o-óqéÖ+^Ë#³(p8œ3vçI=ó |_zÅ€³GKûÓŽ4Ü,Ó×p³¤IQ2˺¨&xÿQ¤•søëLºád¥ÒáACˆE‰ƒ‹wƬö V»&)F™¯*Iac<â1·ióX³ÀxÌÇÉ­ðø†Önà$ÄyIø¿/Jô£—òº2¿uÚíLç«T¬±nX í~f•M´4Ñg•£Úµ±å)C¶ðm­"•FVã¦/*ËT°E§)«Ü´Ë >þhæ)î'¸/>…õdÁbzø¨â]fÒ¢˜üÍœ„õÜÙº1Y“¢25# ±H"Ò¨IrA¹çaÑn˜<ÎË{g¤2ÄN´–,Ñ0¼.ÉoH"ݱvdõùĽ÷Îv…î2|ß3º>œ>Âɪ,üo¸/ô/8¿óè^­’[aá»ãm1ýàHƃ\c•—ìøK秘†Ò]-¾VÜäCÕžP˜v,P‰Hƒ8¾è®Õ!GbÛ{´\¯×ˆêãNE)”ß'Ë÷ >OeëG"…ðôÀm{÷RI‘dôN?á]ö¨¥é­Ù7IGCŸœ>K.BžŠM§œMóŸ «ë:KIbšINÂÖìeñ«ž5Wüܶ)•ÀËÁp ‡yß„úÚS«”o¦Ú>ZV÷?ãSç}¡òn5ÊäI‹˜áµV”¦s—¶}gýv-üS¤÷8ڣŠÊ\¯®–ÓÃx0Zn«æìúß<á%ˆ³NŸ.íåù:\<:Q¬>þ|SÜq¥üwŽ«Ï¾.ÖSÊll¯ç½XzÚ`4Oh™÷¼Û“‘ÓOPŽ™nÛ¨–Ìu„:‰Oc5•PW–,?,^᯾ _N% tõ8ãé¨(¡pÒ•­‚sг)™Öâ³­Ãé¹Ú*H”Z…9®·Œ"™ã8ÏBgÞG—{CÞúxU_ˆ)ZÕ„.ƒÕöz»éømÜh,´zîÅJ¥Å—š,c²åéü¾’ï—:/ðd ûé!(WkìÉjy>šL].Û‡š÷:MÚe@ß›Ž[’N¹Ÿµa{ט¸z„Û2ž(Ì&°Ê²±@3†/¶rGàî@H¹K©dà#UÞÕw¯2JYÒòìK²ô}Í—y }­Ó™Éa)s'*”Þ9÷_ěԮ/yJÅj¶I¨ç‘–Ï«’oÈÍmMrbˆö ;JýD•ù1œúu¶vÁENŠa«—œÄªG?÷œ‰—õ7š™¯;n§ý-$—ôIEY¢ÆŠgÔ™È=~’/wü ,Èü@ºXØ´8Û-ôcºôÛ?DÿûD ú(¿ý§–’<¿š¶òÉ_?ûéÃjŸY-«óÀ´¿IÜóçüýgZòÚjÊJ-åßÁËh`Üàòÿêo¿ ßñ‹á?\ðo¿eØñ[<¬½Ý÷o•ud‡ŠÔ_T~ß+p[JÚòD«9PáŠt øŽ ôÄ$%ïê 60Ú)lêG‡¨ãú3º Sª§È¥Òñ@ W²Ÿ/ûEá"Ù7åOéíõá´@½ çBj‡4-&i¤ ® wBÁÜa¶j.®(ÊuÞ$òR[Õþ|=Þ/&ÝA@†.p„- #Ïg$&à‘ÝÁ›:Œ‰çrØ~#Ÿ tû­|êÚj» å× ¼«\#ùy8Ì/Âc (s ¾“}²åz§œŸ+–¿ôýÙ1è+:@Ý¡6@}ýÔÚðYÞݹ;éá¥a Ѓ@Ü;HØ\˜H'g—Ýe£’cC¦€+g¬ŸÉÑ/YVÁ}Éþ´ùîânŸ‡È)A $ Rqì7 +î®i|£Í7h/f è͒Ǥi`¸±‹­‚·¾®ân~¼­#¦ÊÕ¸¬fF¿çp Ìú»k¶8Ù&g‰‹^ÉjF˜5•¼`6¨]϶8jkÓ?7ú/Aú%.e‚Y|ï¨s‚&j:ÐõÇþ¹ýò—îq3LºPt{CæîÂ9þì—4a<@Xh‡ðæÙ} ÿ­ÑÉÎÄ%ô¥²Àϳh~É߲اü.ب:é URt3–ºcPV†ÂÀÕ¯-ªèâ‰R›€ q€Huz‡8ÂkŸâZPWÜÅÞ †Bìáí75ä`@Õߪ^n¤ñÒ>!ßé"ÜQºNP˜*ÂÉv/K@%#$.4$6zÇì‡ö[àUÁ—C3½5B5:EßÿLá·‹_Ÿ lࡇå@ŒæPiy%r½Ðþ£×Å ¯VPT„:9A¼]PP/w¨ Ò ŠBì²àÉVûôïÔèÞg{Sb¥©‹±C ¾v¶°†9>z—ž‹Y}c$èŸI{‹`…½ w&`"=®3 °Ш¶ ³ƒ»À·3ˆ½¢ë¢õ ÃcÀ&ÆGУ _Ú~i»+´¤Ñ¿,NF€nˆ“9ûUÞÞ³Gƒ…È<þN8ŸzƒµÈÇ$ï³#Jù[ƒ}jŒÀÝ~•2úíW`Їh"l N0 \©¡`{Xù¶-EÏC ŠFµdE˜äõ4sú‘î.^«µn2\qýqïø5˜ÅÕ?`îÈ=ågOäq"›äçlÛ/y‘ZÌò?¬‚Âzwu®Ã4âW€vSƒ)x›¢ŽÑÑæîUL5$òGn‹ÛvŽ ‰Ýf3° mK{ ܱ_ÒvÜÞAAF Ø„¶'0¶ã°Gt6k¶ì“1€ÝòÛùéÿ ú‡—þ•­>ív©–¦@cì`—wýØî0@GiQùûËÒþ-YPá‰ô]0$³ã^>ÿçØm2å„:z*t§šÝ7jO§Puv ,ØŠÞ)|>ˆúa,æqk¤Û`·Q~m~åÀ4Ìî1çji ÂÉîÀ]Y;î#Îß_ü„3ð<œü(ÛY MŠí€É|?ì÷#ÑÅS,ŸŸãò]µ É­}3..0›íÏ&ôëóŽ-ÀèØõl½÷Û™¢.úôF4Ö?`ÁŠå…F>¥¢X:ÀWÊ;xgpÿ…§‰°G¸èº#l`Hä^é]nG° Pµ„@{QÜÁ,#üæä_ )(‹SùVz†Þ^‚‰Üc ñî–÷`8[ÀÀ;5Jgè"NÛ#=ÂÃÝf1꽫™ÂÄ@´:N‹îrªÿFìæå½;ŒÊm&°°YPD¥0[݃à 0À÷¼µ .Pû½<0?¼õ› yÝj>úûEbªÃò['Æç€" â£7EN«ƒ3t¬ÏåSâÂ}z´´ =g´=íæ„ž° l´†"aZ0tûó³fLsgð€ìÎùI(¶kû&¹Ã=÷2ÏPqðC`Œóè,OíÐ÷ŽÝ¯¾’— ÌuoŸú|–j+›2aBïú?§ìñ¿qÈßkkó[ùàLu4èvYy°oàB0[L¢ÊI7#ˆ|Û ëï )Þ7Éæ u‡Ùþ–Pýÿ¯~&s@ï†Ü£ÉómÒêÚMÞ/Xöïüío (g”eã°Ô*:ïŒÚ¤uþ*Ðëhíàã?þ¿óÿŠ&8¤ï•´%„z{j¨úgôî¨[±½S)@`AŸc(Ü/J†üKè $-àB±J OÆÝ›;(áœí~Ó,k:¨â4:Äû ½æ,Ý&=8”„Mr”éÀ»=ÂUßî‹“@I¨ÿ(I‘ð!ð=¬>²YhÚ ”dYrJíÀó{„*üÏFf,$éê2‡â¸ÇTïWW5 r ºFDÑ!=^† =÷˜^ä3n<9 €@’; "†\t8§¨½;'øÎf8P““è­ÌáïÎY[ñŸB›6Zuvpò«ÀñpBA`@HÿÄÿK<Ütú¯Iîͯf Ô@L 'F°×þ üQ„ó¿bñ.˼rÃalô j³ñ°`˜ÐYë#.èëF¦N`ߨÑü@5àÿ@ý (,R# t E ÓVÝŒmýàïU†{yì1©Û*†¤öúï9ãæ,mûgêsþuºg†ËÛcwsÆvüÖÐÕúwsPÝgìÿo2ÞtÐêéÁ? ¨àagsÿýóŸïSù£{¢È LK„>]’ÛýºÝq1çK«øA í…“És^ßq»#4Y’ÃJí¤@Ovª°pŠø{òœËÜ×øè-ziü÷‹‚@=a®ø^ùT)‚ ”æ9º}âIöø•-küP? ·;ÎsœOÁpÀ •88õÁqÿ­ŽÃkW ÖÀ÷ʃŽ¿9ùñÐËx†öàPŒÙp©þyfhŒn5úãvG$7‹û3^Õ…¾î9"²_„‰<¦œ.g{s )!:Eãôþ)˜¦ ôNÊuN£Ã;|èÓ¢Rû§ü=§O b{ X¿úÕ{gL à{''c¸‹-âÂîâgÍNž._1¡ÏnÇbÿ9ð·­­\s]À–•}Àãe…I¨bÞÇd6˜v{ç!úýßrÀDø!ûs…{çÛÞGFâm\®± ïcqÞ—úö*ΰž¾6[Ú'>pã;¤¿^Ø—´’»ûns©Û·Ý,?àWÄ <ôÛ–ôÝ—öî»=¶¥î…Q¹·íŒ¾)ê·/iM„=ÜEÞÆq÷ZaÊhÑ£Blñ»º–ö%¯ µqÜ«ó븺({¨–§¸è“_†Aûׇ¡¶c›Ç­åå7ßzݨ„îWÿ·gÐåcähÀå€|7.ºU£Ãö%èî±ÛDkëAЗhÐ÷ŽÅÞÀ m†ì®É]åt/ h%$èë“–ñ˜5 @|wbSE ¬êé·…™œ”0p÷@¢þ:K,»É²m‰+øèÙ¹Áíý³uaîÎp$î¹Ojçºû“XÀ8MÀWgvPËÒ@ÝžoÇ÷ˆüm€¤TúÇÒZVæY˜×ñd4'›Ó€0þ…’Ø;ôà€0boÿœŠV}ä¶ÝbÈÑ—H‹ö@4·“z¤Ôs÷Ñnaš»˜,ì•®ñòCb®Mר„UáÃ@•C÷cÅš}3w—mæoïmÁA_(¬܇ôÏ!=›< µ½E±§ÿ:@"6í§h#Š˜Ð‹Ò5¼oÞîÒ«s†‡ù€¢$b¡ï_š˜Â,½W7°Go?8ub°y;º²ñ»ý(ï½+Aþ*Ò¡ø¼èÊ©s˜•ÿ¶¸þbÕ_Êö Ü}*ÿzÍ*º:ú›H©ÇbaVÇ<ŽFËâ/}<Ìú[G?>ú—r"3&å?“FG?Çõ—¸óqLâ;NuEF?.î—ð9n Â÷Ç~{´³È~çÅ$þ÷“ÉÐ ý¬_$m~L¤ÿŠ…~ûèO|þ­8ƒAt—ç?ÑÕÑ©ü¥^*‹Iý,ÑÅÑŸøû%Ž”Ç$þûóºxøÛ¿» ü{p)ðöÃOÿPK½\C7šÌ”Dz‡XMETA-INF/manifest.mf¬šI“³Ö’†÷߯¨…ÝAØ€@áó<#@l:b“@¿þªìöwmãÛ!ʽ¢ÏI2ß|OÔ°)²ttÓ~(Úæçø'èݧá˜&?RëÏvqmƶ­>þkøý þ ùïot[×i3? KÚì£hºóÁ2¢óá¢ýÁ‰ ûÓÇE?x¢¢|PKÊ¢óÓ·oZX§?Äm ÖEÜ·C›àp¯†´ŸÓ¼%Q ’]Ç8®XwÕv:ºa5¥z÷S\…Ãð)®ŸÈdumûbÌëƒÊ?l„¿½.~üíï?Èý\–I!<_Ðj#f ˤÌ_~ùöùËï¿:µ]ŒšÁ âz„sÃàÌÖØ­ÅÙ‰º“¯aÆ ±„Ír€ÐL(B`½ácdQí¸“ž‰I•Ö¼¥=çDQáHÅoò qQpE5¦}šˆM7öøzÀõNZ• Ÿ”³>–|^îÕ¹ÏKci¥Õ]=Ïm@° K²¨ªVOGVÔ|•ÀÑ/О›"n“ôëÐ2§zJ¬b<(„mk¦-9T:ùWhÔÖ¥Ú×/9OF|œ û•@^}^Þ„žÆüU Eޝ"’4q'fû˜"®ŠyeŸA›ÛÕ;^ÿŠy ãþº>h@`Áœ.,_¡eãüfl©pø±ÄÏÂ~ăϤ’•ÐàÂ&]ɪ«åûÜâx|A ñ~oÂ'=Þƒ¤ó°ã×ãÿ òUý¯k²¿;qœ{w¢$IË©PòãÒ÷7^ j€8¶yÜ£ dižxù$¾‰ÛVSÝìd3çЪP7°¹SZZ|(+‘ojI£å¢:YXrÁŒè¢>Dº9µ“'ç=l¿ÓNBFÅL±ªó®9¾Ô:²“\ !Z;úYt¢ªIfbGíz™àìJoŽ¡³véN:%@«òÉôâr;="|½‡½gmRñ~` ¶OÐ@uŸTÉžªC žCOJÝG÷¥–qËq('…=ã«ɘ3d›š>=gûjØ"°®y¶øâ©š ÎóÍrùqoyèA2ÑÄ;Óã¹ ø;¶ áSª4 ©4o~\i¬ÍèÐSG¹äÝ2ôN°guŒ0í<¢X2›¹­o»öRž²Ã}<Î^l >ï-¾Ç°Rm.ù&˜ã¾œE“P«eл­½Ä7¥jzfÔy¦Ùæ äUº‚zõ Ž|‚ã`6ßßÑŠäno ö r'ØKX쇉á‘‚1ì:«ÜDÄFõš¬÷9¨©øÀïW‹t™Èk˜ƒ˜Ó!¬²î¶fÃ{öë~UyE“´„õêi÷vaô Y®êT[¿tuÒ"žAÎ1H!ÏêÕqC»5›]è·Þþ5KwëÖs€]b¢…#YæÁ ÖÓ1¨Àë©<àÉ&Y• Ë”8û&bñBûÓ•îæé7’FY ož Y®L 8ó×0<ÅóL™E„×°(€`o6I[iã°J_¶NÓ½Œ.Á´èñ _Ž"ƒõõUòèh›ãòo‹Î^"×!’‚‹sÜÈzwsa›Ê«‘W¿ÎÒvÚ,”p¡) “ ör‡TÛõÑ®¼NSˆ`‚ó²ïž5¦N¼YÖ/Béõù¿Có½ )ÔnšA¦r‰=»‘8Î&ŠÂÄ´¨™Ê8šRªÃ°®H¾Íø[ÙPUíDd[ð ®X çwþÁef¿IÆÛ­^°Ð2|‰ ¾›(ÉÌò³ÝÆ7EüOˆ_/e®Škë ¶6‹ày†Yî¦-²(|™¾)¨œs¦®ZÆ€C5Ø7]ûŸhõiü*.RˆÖEÁ…—_6ŽÍ¶rõMŽ6ª³±—!Ñüœ ¨/#63éÉåNÜO»FUjá«äÓfüþÜ»3m“ a“T»Û’˜N8JÐ4/x†£‰Èí舰å”ê¶xlÄÈT”®SþäÖRñÿ°€WøuR_[‘ŠZć]¾Ü4†© àžÓ¦‹ eуrß^Æñh.ñ©Ë!>½ÛWÿ8yŸ¦¯%ŒŸÿgx] ûÝSi^å¹Îh©†Í•mÚc jøb­!–¢¹I±  ;š-¸ÿø1ìäåzuM-ÕÈ‘'ȸ4vÔËc#*4ì¦*KçÄaÈqà-ÿŒ^9åe1ÞmÄßy÷ëžÓ.Ê[g7‡¤þäV׈£­Mi>`oTa€;iO³f¦¹M¤#Þ<1üâ¯^_¿¬g©›ûô©GÓ3Â?ž‹Ón²ÀUÇÁp˜©ªXv‡Å–CK ·ÔöŠßwä €xpž"ˆªÀõaõ¹çS¹nêÏ?ÙJ¿òžQ°y¡Ï¹ÀµŽœçŠz×ëü‘ùû±’•†ûCµã,T•'ÀBãZŽðnn‡–ãý (°leåRõGåøìýzäv+Æ‹Ø{íµ¦£ L„B€>’%l¥MOFÉ ÇÄœz8Tð0È.ËC<•»AÛ¦IãO§öüïëÏ—^ʼ“=ÂK,“¦%7Ç Ž†µÝ¶kJÆõF'÷æ^óID÷|¤ew*ÿqè¯A‹EÜPuŽwø†rgýs{ÂÌ¢ÝßžS6‹Œ?ZƒÓçkW î–Œ?@+íµmŒ¾ÓaØ=BZ|ÖZò+kz¾åmiá²Ñ:Tc›"d¼ g«kHmÉú¢à•ËíÍ9üßÿÊýµp»ÑYSü@¤˜ºœjk >Ý4niòv=ó>ØGÏS¤çýéwâíÝSÝ¿¡Þ :•+Ù eé·0VÂÚ›}{ü×>Ãnêˆ oçóéx6“øÈ³uØ‘ä›Óï¿5Ú¶ú<´Û©÷ž¬Ž4¡Hp¶Á§ùÈQ¤O‡9ÛÔ 2h0[%~[À2À²ùumóuw“þö+——u'ñ¹ÌN,‡+¥ÜT¼ËðŠ Të'²ŠÊ3v¿"º^Ö5ŸExûz í4ž^h«6áu·RO@jÛ°À"?x^ŒpŽYÖÜd²-›ÕŽ'F«9º0Fñk‰õë^µûL‰(R5ÃÏë½/àøyhæä¸’ ˜äežAºÉg'm²¦ñ„Ö©‰j/¨ÓlêNùæ±ìŸp¿”Á`ä›9>‘£E'NGy‰‡m\yÊtíö^véÈÖž}À9§Çø±w{ýoP=º½ƒ{¹Œ¶ß›Åô¥ ©Ç0Èð>f<ÊŸ›,”` n×ûH¸×—eø¡0¾ÚÛ·™¾˜w§ìsÈUÝOÀ +JÃ*w™I<®›Ðæ~lò£’gÎE‘óî‡ÃÈVaÀ¿9ÂÿÉ.qÚ}A{«û h8È1j-….6æ^6=ùÖŒP±2Z5ûp,ú8AÆËwmw“ø>Ôÿbm‰"VƒìÞœ¶yZñv£àÞLê]>Zm6+ªž½§#OŽfhõÞÚú”Ú4ùrk˜K²úðäÃ@7ªVRÞüšßHçöy˜ª¥É9ÑIƒà2lÞ–ÄÙkyŒ>íÂ>Mþ°}þýÖoûÿ—[öÊ„<€š×$}€3˜…¹>6ãðm³ˆ{z¸ŸL”Ħ“×&…]Ìëê øþ¤ð?-âóŽ=Ö#Žqþ9‘¡ë½nˆ¾žÐ±J °Êö n‘wj“8SÆó$›K6ÑŒ?üF…$² woùÏ‹ø? —ø,žÃÀYqqäãí!vso ý¤EHÄ*¶ Ò\A›Z°³æ¤Çtq.·ïíÍeUÞ•tãˤE¾ªÝzë±t·©³Òá+-ÐQFéì¡LhC;!ÛÜVÿžòâ­îØg’€ô°ƒ©)Á¢Ê¡ê^ýû󒽤,$:©ê5‡É9$Un_3D¼5-}†ìN çîn†ÈéP©)±Û}'Ýý¾œm‘^ã’k2vB<…ì )ÊÖÀãO'†iøp°èéͳ×-i¶·KŸzú_¥\ÙŽ£Xý™~C0‹GvƒÍb06ðÒb³ïË×3«{ªf葌ë)-e*}"âž8qUZc’¸ësx–p-¨Ân« Öæ£ñ|[;rqÎEº°·ž<âS'ý3ÝN\ÑDëWI(,f˜“‡O?S/™Š’ g銰£ÃPlx7™{©Ú>÷žÐ•%qêÌ–-xCÜ0¶W–ÍÛ¿ËYŠÄZH+0¸%¤ùR¦Eô>öÓlï|˜p:V$L&ôÁá®Cò:ovºbå§U-Žj¬!t‡F>¯ûi7îDŠLéAàMÒ>‡£Ï4:‘Ó÷-ëi2(#R¤x}ÚeîMÇÔuO|ŒtMþd”½fe[¿b¸¤[®B.á’Q‡~cVl¨ŒŽ/ÝÉ‹L[€TV\Ê@°—.ü ööØÛ UN‘u Èž¦¶xw.P|Ö["é:G=Ì|Ð8Ÿâ /A{òÞ_Ä웊ýU(mWµJ±ðr‚´ú­óŽºˆÝm|£ˆP3©ö¨Žûzr®ˆ¢æÈx<ë{Å©_Ÿà6¾HÙgعÛIà9i:Îs}(¾ \¼]ëᬾ¢m\RݼþsO$ U¿ƒ óW¢W“®í»¶eIP ÒÎŽæÙ<øíý¸±x%+ê‚›±ÏËY²ÁÖjhRrCÿÿµX¾þ¢ÿµÖ ±m0çÑaÊ ÒGOä†ÅÏQ‘Í3–®´§´ò2Rõd1‘rÈߨur>‡½ópYYß=I|U'\qqì¸UÚHáƒl˜gåÂWœLå÷{‹é ôoÿ¬ºÔ¬|‚MZHPù“‰£Ô̺1»zañÜS×¥Ô4µqƒÈÉÅÕ³ý g1ëÀýÐÅ­+ˆ²—èÁÚQùÔ;Ìï‚ÂÜ Æú˜{¬R¾³¿\N优ºÛ«±üDýmjzˆ¢°ýõó­ÊÂò³7pSåª<²ì-¥Ñ”os²«íydsžÓÍ5:èw‰ú²ÆʾkAúÉÛ>Ë^ mä—U5{õDsN`l_„MŠQ]6²„.¨ªÁè“âPÌÜjÈ>öš½ÞÍÞZÉË@ö@9i+óv5­‚hEfø,#P Í—£¤”„ Ý}ñc?ùP>Ò„˜þÂŒðõº€Ž³·É$ŽœIX`>Óvè+~ôúÏ=•*{{ÃúJwWÏ­Qk4 H͇³G5h„Ôæý#)R,Òn&Ž#êRRó9K{{ ¿èEJ8÷?̼3ÅW!׬~4êYZ >Rmã )_—šna0Ç !¨2ЉջŸ§ÈÞÃü'æ¿ök´¶ª_§cº»`®2Ž‘LOå©f3è¨MÝv–!µlZ£•Z·—{Úe>)ÜëÅ?‘®y'²Æœ¹0€pöºSA¸Á „ᦑšŸatæ ÊëI¥'ö ¡Ÿê@máA÷-á¥ÏX’:œ™ª'Ÿg¬[ÇÀ¾Q‡#;\³ºPäùYþ?ù§E},Öê&B±ag›«]¤óè ØNÝ”Z߆(¤¯=M<Ž|Í\o„a÷šÔ¢>îÜì(‘Iï[R°ï8ˆß¦í@Ó0oz+ùˆëÞ¬G´Õ Ìtx™x/#²¨õ5Ñ£b‡6+KÈìÁ;ÛÅ}·(:d†q\Lç¹f‰ ¬ÊXÓåݤð=[óc§eoôsâ•tY \Œ™†®&à ²‰¤»Ù)ÐU¹p²dë=ïÜVíP" Üwsí7įQÂø •£0eº.ë|X¼›¹3:ÀÑŒ\iì¡\/8X­í½Ë¾ñqm»{<âö0²ÂŸ‘âb±²XgÓÒ¶$Àg‡õŠKÇW옂ëûLV:¶C½âß?Ø|d€õð¬zñ°ãšE<õÛ¥ªª–4&ÁÈbóF€r£½P4:ºË/Uœ–”ŸíÄè«î±Ÿ‡Cv}•ÑdnÝäcÝ8¡ËÏpÅý¥]¹*gÏ®|\n¶õ®jöQsýl7Õ#‘4² X¼È–Å{Zcal(hЬ„ÂG÷1zaç!:ƒä3ɺ»¬¨‡ý×3ìå‹,J°Žùè'÷S…Püùúf8ßXc/•P!ó$* ñ8Žfh¬E¤4[µ¾‡£D 1Zâ!¹²Ö­°w…Å0&q_"ÿãTußSÇêë—m„‘·vèúÏæXnvo‡\¬‰-* @)¸å¢ËžQ;í­&!µœÈ*F…qrHÞ”`~y-l‹´ëÒñw¡ƒK ®ja~Šî|llÕ.ÇzÆ)Ápñ‘PÜPŒÌgÓq廅ޯпœ>ö¥®H¹tÒ-7,Ç 14}ÛØcåÏÈs¡Šóਫ]DQR2m=½eÿ ø7F}½ *°Ê¸Œ¢‹Ä¦ly¨Îÿ°Â¡‹ßNܘ H¦j3l¤:ÙÃûq÷_ˆêƒÃ u–Zø'ÔΉPŽãÏù¶Å§?ù©sÎW2jz´Òœ%ÝÛ>ówW€Áj—/ù§KÜì7VÇàSƒyjȘ 8™.¨¡ˆ?7¸¯çž Ž©¦ÒÅ›bÝØÐóD3œe½YÿÿÜ¿áý½'L¥/½ˆQòA  …¶Jù!”ªvÓìôæø7¼–~ü'|f, /1¦ÞcNí+imF;dQâ.š»2uSÂ.Üú¹Ÿ2o.ý¼à}´'!ÜoŠ~;Ÿ¢nöŶí§RQÁ <æ–R¼u\…bè\…«KSEç¬Kùûéþ<Ùm÷%c1khEÌEËzˆøæ’[›¤£¦?±q\Š«ãeê×xOM|Ÿ¯ü†¼ðÐ î·ZŸ,?‚—@¼“Î&HhH>œŠKRÀX#’äaä‰Ïk Þg&m™TB˜‚–gàõìâÀá`¨›¶w4u§F NCÔ:CÀçâ@çwü´Þ»ðÒ"¬†þëÇ^„v^¥Op'õÔÇDæË–èÆçSX„R_…|ê*gÞ¥ÕK~P¼g‹Ö·ºÈSãéBÁú%Õ8w[vú1Õ÷»{ìÀJ€ýÊÕÇúF Žö¦:c²·×>}È>ÿàaµ¯“°_;xÍd•„)nµó5·CÙÅd#´)ÁšÞõ5Ë´|¹_;Ôý×jáLJÊðˆo÷p®:èé6N¤ðEGbÛñi+xΪÆT£Ÿ ¶î$Œ0¼;GöuiÇî« 6qVº:ÜÜ®p}d›°KàÖ6—7¾ZO—G„+ü{“T~i™ýЖŸÔîŠU#©ÂqU#ʪ'Žçñ–Ö[))èÖÀ?Ê|y¼É\H½R©áè>ÞÕâ¬4øàúÝÄ×h›®Në•mˆ™‡ ƒ9ff½ ’±ì‹ÐjÈ!´Ä@9 ¿Ig,ùòi¨x6/‰Øš…nûâ}qAãt»1`¯#ePL/’¨â»™"óçDjôÓ|/L_`þõtÛ÷O –a› ºøVÇTaãZÂl÷ŒàgñÄs¬5&h¹{à˜?(;;ƒ6=eÿôíÿªòà})·SY[Vê+¼ô¥wå^ng85óàW€FéÁÊóv™….ÖžÂȼXò¿PK½\C7‘1³ÏÝóXMETA-INF/zigbert.sf¤šÇ’«Ø–†çç)rPƒî ª #UÄà½H0éÀƒ„wžþ*ët2ÜîY£Ü‰Šo¯½Ì¿ÖÆÊÓÊÆ.þÙ‰»>¯«_?à_ oTûCýL.¿~X¯¯ u]|üWÿû þåøßߨº,ãjèýÐe†°˜ZûPµËC — /X¬ 3¿|¸šýqdùƒ4Bú.¿|£ó4‰"­»|ÈÊ×o(4úañüíµøùûç¿~$‡›~.úš!D'µido2šþë_ß>¿ùã['“÷ Ñîf+$UqàSð~ Î ñ¯oßT¿Œýë,ó°«û:À¾-ú¸›â¼GAMC_¡lŠŸ¬xpübŒµæ—°ðûþmTGÎ~pÑyÖ8–;=/ew!þŽj{ÈÉD”tA0ùDô/"à¦8°÷¢îäÓz5”h¾{8­¥{}7>ÿÎw¤;^ÐI°´ÛNŠ9;f ]Ôoòõaž³y1Ä] U3Öðò¥r'-â- :=éÇÉšô{|ïƒ6ÖÄF¼Ÿ^;rMÍí2ØÔñ4É ¾{𦵫<¬£øëÐJÜ—CÓ9ò¡kNðáRp+¿CÃé“(¯”ò<œbÍQÑòÁÇé`¼ =Ù+îòÐ^ñ*ªÂNÌ¥ŠJî6Cjä“¥Y*«ò&¨–ŽÓ†ªBr´ Ý(d-A¢Rú&é÷ÿÀ–:Îw;.K&fcô7{9¢ú¡˜ 3‰âÊõ4bÞá¦E"ö&$•ù¾Žÿ;ä+ú_k¢Kû¸Ãå‘KWÞçr·EfPbª7Ñ…«Oq­ ÈšŽ¹z_ÝŽù,$ø|·.ƲÚÉvp¯¤=áÇ´h <ÏïÂ&–´…VN£; ¦Û^¹ÄRÀÿ*ž…=l߃iïacœ°*Eçô™ô¬ü2@*º ë”#‡:=@Ïky©òk([¸á›¹“öÿ²4ñN:’U¤@¯Øw/éú¼{÷R߸"jë–vʨ؊øG¿•Õhl©ÍZ í£û’ÝcEzðê´;’Þõ`½± ^õóRþY'üƒ$e>’æ¶»qox8NïÄâ;à Æ5—VÁÁݸ`.â?¥Ï­MDÎ Âc7ê—•Xd®·æh0éVwº¦A€ú&¨Œ~Î+íñ(}pâ›y$¨•‘÷²7;¡þàáš©ka§ëVbÁÕ›¯tµ‘2hLÄÕ ÔNÏâ¾Á´R=÷ÏÛ|Êß,;"MR”_ÖR þ|éüª/ü¡ÞK{cä£ bèPä”—æQEG|C{æðiœž&K<Žmɇ7†¹ƒHÉñÍ, ¿¤x¿ŒùÓËO?U'y•69»ó~‘åw€μÖÙ\lHœÎúÖù‚=賊w<†gjDxøjÌRÆÁë^äxaÑØYz…¼ q9†äøøŠnâ‰sSÞkœË Wt5¸Ã Õ¢c4Tþf3þÏòbo QÐ=ýzB¹æh f ‹mÛ€„±<Ïcƒ“ý`ŠÁ˜æ“ySöê²þõ.QºÏøÃG;BÑR¥¸ƒƒJÁæ˜É‡¤žS/€†fK²SÎ ôéàªoVÐãM‘¿Ž Ú…mãÎk/CWOþ¶ƒ8BC«mQ<,è0Ü}êG–6Rà]Svq˜Î𾔓¤{‘«÷8ÄYS®gÅ–Kf“8uR÷³ÚŸÝF œó1äÈðNBÅ\ÞsÖëyQ\ó*ªŸ{«PE>kÓGÅ#3±pÄ™Ct“ìJ«v(D/'] ô [ïɽÔßkû×$zƉY k‘æ„»ƒ‚YõƈCŸÉ¡™Zdb£ÌC,â¯pÖ©û›zÓÊ_hÿ`º"Ç—é~ªAZ#q´1™T-i;]ÈT;è ñ1¼¡5#éVŠË›“*K®C¿ˆ_²N⽌¹‹î^ýzzÞ‡k°†f¸9mA (զݡ# -C«X–„¡~s¤bò«¿ÍÒvæRãž ·‘›‡B è93‰l¬EOÈÚ5î%.tæ‰(ý^´2\9½M(¾þþï|~ï`ª\$áŽ1öØ•7¦i€ÎJÚ c.Œ«‘"D°*€\apw¿\¬æ]‡4äïaCu°7¬ù±òK-ŸíH-ÂñrÊj3e«ñr=)ÜñiöbáIì©c\?ÞTlAüzè¬LbäfFF8Áä%17Í8Ÿ>kˆ·ôt}Ó¢µ>™±3;Ùï†ÎŸiµqø*.ãK¡IÑþdªŠ¹ÑÍò}sþ >® AtÉŠ.µQX'u’á7+äÜO¹éEl þ+äãjø þìÝ麊y¿ŠŠÝe‰h„Âp¯… Ê3™g꺱÷íz»†Äõpº7ÒÐ…GŸíW18óÏ7ð2ÿoJêkpAoJ‹± &µ Œlœ/Å´Ù@þjH£)I`à=oõr'%]¥œ7µþÿ·KÖÅñk Ãçïô¯E¿{¹J-8ý\‰Yæn~c¨®aâ› ¥ÔQÆÃ8½ÊŠb•”Œ°ªƒpÛëö›]ìä=¹xdˆÇÛç—[ŸÄ£©Ó /K#ݰ¦åsûÜÎßë§³ÐÙï6ðîÏ{:2€Sñê0 Ãür/Äö†nÉçwʺ ²ú`ò@þÐcojþDüíÂëëÉG•œWˆ6‹ÇB/ií /ß ?ÍמH{¤Žt²¨ÑŒ¸S`ƒ.ýeä±räš­ÍÓ¤Ø =³ÙÈot„åÂ`Þ>J:ÌD‹Ãr‘=åÔÑHww|1ÿ¸V2cÿ`HHšƒú‘Îá¾Ù¯ÔVm§åÓG÷&®ŠpžÍ,ôj''Ïþ€„Ò›³¬¿__Dû“BÈN( ª·~Çp%6 qV®²ê‰Uc뵌Ĭºy—qn»A몊ÃO¥öüÇúó=„WfÞɞء܉i¬2>`Œ1Ž-‡WÑþ;{ãÙàbQQÑ@ÑÏ,¨y¶fö¾¼Ü²ÓêkÐã©aG½ƒŒ.ûðˆ\‡™6Ð æ>8äé§öH ^ßÁIEE Þ¼GùÐrÖ•ÞÕaÜ÷»GHgõ3‰Œ%N9a_/ÛX)¤Ò¤§%V ß(³C59¶;ÿþ÷×ÌÝ\àÕ˜ú"F…\ «¼€ÇóÆÜ˜Ô`ׇ1ã+ÕlØ?à”Ë]é̽9öüÔ;Ay 8ç}*G¦íò:Zß"5ƒ£^%FôY„­-[ã;˜gïw·Æøª×uñy+hÕcî½Y-Gˆ¼ã$øÒóIÒ¾˜&¿‘FÒXÇBä†4[Ý£<°q×S,ÍÝåä/Ø/_ž—½× ]{l)HÓbuWEQéþÜøq º•zkÊEr ¯­° 䯰ñuC[q8¾Ðůütÿ]CÜ;*C›-+v¦œÝL¶÷ËKæg«gñ–»¶ÛÚ@B«Ý½=Ö§K~+ñà®wâú÷jÀ‘0:Šw!3 ûØ–¸­šJÖ«ŒE£(/~«„âƒ×÷;ë?p¿äÁGsìOϼQdŠ7Œj=˜Ž7l@yðå M=õ[·5T$‰y4n>è{+à Zp9ûRu·×‹¹ vÙ™Agt=Þ“‚ëš µwHy,Qû07ƒ£œ“£¾À "ÙñÞ¸£»|Úí²uqj5ëÀx¹bùá™É~mm\Ö.úOÅé BõrHB¼#‚¼·@3s7_Ƚ®™õ~ Ô œ =hU!ÄNÛ+æ´À²2ÄIMR ÑQ÷©lãÍk¼œ?†ú_Œ-d̘ÁrËÔÍU=,“'ñæðÕqMÑJ«pÎ/ùEË-æš5Uïç}¥Ú8úri£¸ F¶=.y" ÏÅDÃÙÔ»F4hû"[#;Ò¾|ú*‚e¯è]Üø]ý©}þýÑ÷þÿ¥–û½iò¹jPŠÙ‘˜®Þf²ÚÃÆGZ`Ua IñÔ ƒš3L=µªö¾‰Ï'ÖP¤?„ÙçD†*÷ª!ÆauJZkÄʆÄ}(rysÊÍÒc0îú¦ .‹`anãeÔ^5ôoâkük]â$]p[NãeîÀLmjwjka&07ÞHùK,%Ø`o Üðïm\Ÿ—ºäœgê£ M><¶¯ý¬L'ú7Ö¯ú§šO¹ÌO?Ì•F÷jf3î¿Rá­¸i xÕèzꪤCÁj“OôHŠçz4Ë®…†Ÿ:ýxZÜ}÷Õ³ æÿD{IW’”¦p Z×À;U¢Ü9nÅþuvŽÇÄnÇ6µÝCEK¹GtÐÞIÀÒÝïËÙ¿K9%Ç‘$ ß÷9æF³ˆÃ €Ð‚—5(B B“O¿™Ù=Ýeƒ>¬S–Y¦Y}ˆp÷pÿÃ=¢AÊòjW£åuƒlùº‹èXwa)pé<w®(špsEOGMõ/ÒûÑSÚ¹AEÇ…z¥ JÑùÁ˜»5 à3~N o¨‰gQr‘îÀ«®­çÂ?š©ýEZu'Ъ_§ ¶n[Ö'LÏG‘1²;w†máa#Hp%$I·(O@<È#-“–GOè+gÛ L/ŽØÈ)FÓ쎔[ŸQÓÀv˜K…‹~ž/½Äxü1iu´?ì•`V©°SögpõËh–}gˆJÁì.µÄnküáRä3Ó¯Û»},{Òq9Z!ƒaf5±²Ð'‚;(±o¶¢úŽ 1uBŸZ“ÙæJæ LúÊÿQ*ÃÂOeé/’ãí ¹Ùf—î–•˜£¬´¾ž-ϓ—<;„‘(•ÿiäÿ†½¹G{YºNÒ=¬×bAÒM!Zmv°5ÁnëÙ˜iX¸Ì9aM 5îôÁÊÎõd¥_‰ÙO*ög¡<c7|&ó<[ŠR‰H¿ÞçkY(íL#ȼo??«Â+ä£M¼+’>€aJU”äôáâø×/øÁæÒ¯¤ì3öÀ”‚‹Ex]¶é™°0â ]'MndãÝk>ÃèÔ„\â_nÿfkÉ?±³iýU†˜ÝjêGÛ®[,ä@OÃêà™·5ȃ²K»'Y£Á‚êTYÒ4ƒ]U›ÐÇ~ƒúÚ~ýÅôu$«ˆãI.õxrÛ;;¡ªuœb"CÈË ±Ëìõðõ,Íâ¡þÕȹb›öÃ)7×m³ ™DóÄ*v >>• ¶°XM7ã*ANî×—U&çëÑë»ú‰vZ+ÞUBŒŽìeºEn±fÒ>À°ÀÚ+ Ô;)åÁ‚'[?ɃÿÃn÷Iø¡‰wò]ß.ò½¯¦j¡>ôf¿ ÅÚ"¡\ÌÐ…½U£nJ4__…ù Ùü“úg©éù~O‡_ÿ}몴ýl ùÑ ÷ÖøGžÚåš@ÕþBJ¨Š ©_,8@ ÄgV¿Ù¶š]ý³ûAŠ¿ÿ–ƒÌöÑ&ÿE‹Ä\=ûÔ³Â×Ú­öNFòüÓW0oX !ÂÐ@¨ßmgÛ1ML„× k‰ñïÖxO)ÜqÒX•À‰÷KO®R™‹µ½ˆ<ÆÊ1q~(íܤœBÔži“Ôn—Þ·ŽE¢Ø4Ɖ9ͨ°„:TˆUÃQ»¶Â%í»âpõ\hd"w³%¡§3ªÉ¿îš‘X28ÇVضäåöü’%*žŽª¿èEjºM,óQÙ»íðôðØ¡FÂmâûªyì§‘z®—žY•@ àùy2u‘{ÛÃÛìßÌÎ×èC׎Åá‚U4eçJë”Æ?áÔtïR]ÄŽÜX׋G ëJ¦w^ˆ²6Â~¨Óa+þ›üs=(sdÈãI3^øˆDÓug!žì¬xe5ÕÙ° ‘H姦kï¨ þ©Då ‚MC3k¨È |j¯[UJÔÂÏHzÖn×=ƒ< VRÖ׎žÝõ±X 0nJ,¸‘+YˆÚLZzwßB<ÐSÙÉNðÍ£TíW’äÐ÷Zq48xÔÇ77泋^ä&º0¤ÎKqDœw¨CVymLc@Ô+ðg•ñ}èÄûãÑøàQêkm> :gW®•mõFÉ ï{±0ÒÌ>ÅÓµgX¾ëý?ˆß­„ùØaЯãN ©º¡ž•»3€Ü¸$ØZ-îÏ@ÎòíZ Ê€åݽþá» Ãáöã’RÓ kÜÜQ7*Z¾\¾ÙÏ-`ï&Ö}D'ýV$§p棾|CÐ8-G«‚<@Lj٠RÜä¨Ó&iŒ9‹Ì B\fïæ ÿüymåèøB<Œ¶FŽÇû×FñG:»­æYðêËZ〣¥%Éï3L"ZúÑ6Ú.ŒÙ')Ý¢À¹„üýXÔ ­9~‘g>uNÔ"á¯v ß5Åkã^å-¡Å™Ø€˜soe¿±Ö^ÁˆÚÎÄ.5x-®XP!`XLòz3Î|1yø•CÔÿºñ§ëXûúåP$©‡äm˜Çé³>–x¤Í¡iO”‡‡Ê†IMû‹T£Só©±Ý"Å4ºt˜3©µ9ÿæàÜ/ §CSŒc±ü.ú†'NGøÂÉn¦·lVýªŸ6΀›€Ç<æsæN¤u»9¤Â¿éý¿¢78}Þì‹+MŽ‹•­*˜¯¢óˆˆÜY±ï\ÜÓ™t]DüŠû"|"C¬7OÍÿþV_KÍ5;=¶Û:¸®Q’ }GwKܪƒ”Þgíúä°LMñDƒ³>›³`|SŠþob«ûà0@ÅÓÚF-ÇÑ>ЈO-Qh?^©«R8šfPáæÚ[„™v¸:o¾)&þÂjYò·ü3æaõ£cÄˉ@®ÈkßXDª»‰îcÛ¶eä²t]æeT ‰æY³r;2rH>î¿rÿ†qÜ^0òb0É…l»=Yga]q?ßxŒ§Îò< šÝ2Ýå¿]Ǻ^‡ýïèÂRwZêÇ}ƒ0ûõȳh¦F‰JZ¨dÊæH,%$”qu`aÿ¸iøDMÓ÷CRÝw¶õ™2¸@LûN¼ânâ)ô~v«:¡åÓõH.ˆ_È( ‰Ôâšu¦vÀã>ºi 3 ss(“c"å¿ÜiÿĆÒ] qu‚³Im\ÔȨ¹bõýöQFâÈÖF9\à- È€în/Ëow=Ü®q²j· eÝy6—úŽžÒw§j~ð>ú™¢Zš‰æõ\x8W'“ îV¯^Ï&˜œÅ“X”ƒn³£+"ÎÝýhNÂ…†gËßqeÍ·Ç A®ØW%ezgF|ãå³{ºD°äC¸¾)àü…§„ÃÑ¢¤TÎ&½ôù²­4™ÞÙÅ„ýÝ… @dàe¥%Í0 Ù„²*dæW­õ6âoÈû6\*U¦MIvŽTSi.;+Äϼ¨*ÍÈà²ýÍ`#}i.rðîËäGS&w©,ç¾0Ƙ:]ó«~Ú ++B_c"6•³§‚ã:Üýø®r+š´›§ïG Yàõ‹ç-¼ÂçRîBw‹Á2…€Ñ³3ÿ46¡©’’\<éÍ äï71>(ÞY8q}@%Û,G®¿ C†g)J?Óõú´{_¢¶ràý̓Åfo_;,|âȪF½rm@uÕ¢³ðäœèIÞÞ •M95šq]Ko¹¾†ÄB âòæúÙmÑ~™ß0÷Ó÷háLJ /8qìjæ&*¶]óaæC³VÖÊ>ûì}ÎÞç~9ÓU’µWÊ"dOô!-‚Óí˜îE!º@›¬éf@$XhjÝW“ 9¦Ý0M]€‘ `¹Wo[[äºïmJ# O暀þâ|H—žQ§#&ÈTBBb–« ªÁ&ŽˆÇÍÈr‡#³Pb¬T]ªé‚Že‹%ð»IŽ@´ ñ~ó<ã9"¾¤ÃÙbÌ–À™‰P¼ÊÃ#''‡±ãÁ TÀ÷ Ù° ê ¼pW©Ž‹ÙCxl±fÂ!‚4¬áfeÀžxÁ!AÀÚLø¦§PqÓ0™À“éíç헤߾Y« Ug3[œ‰g’²#` Ô¢jÅrÒø‚¬4ÄXª«7Y¾‘‹ŠbAº__$ˆØ.á ˜ó5º‡r3¸6Ž ]Ü(]Õ 1Êrà¨Ô­T²°kÄبÃLhÑ"AZ6î‰åð8l¼;qÑv.Ê/¬Lü•´öõ“ƒ45ˆÒøé•¤R&¨ÝÚ¤=?9NÔ?ì ´˜”ZÕŠöÙšéÜêZ9äZs½õ|Àоö?+Ì@W³|’ÓÞPÐ;1s,8IÄ‹&ºzš/¢O9 «£Wø^ %ŠÇ¥TÐúRö >ù“…Ù:a`ÉŠ’©ËWèc—ÂvÏ{€:‡zrmNLîØ|š@„4 z *”¯îº•DêöZBÐ ‰HÐ**Û†ä|·œ)Gd*iàʉ aÒUgKGE¼75²èbà.ªÊ“€Jmº[dlz-¤eF+ ™âFÆE­E€L-Os€ªÊâHÒ: !D"È^ø A$.È 6€d´—û báéÀšÅYó­jØ\öoT£v¡‘ZVö$0-2¡LÅŒÎ=Hó)Èìy?÷ÄЗ]¾¸pµçë Æ7†÷‘dLÉ:ø¢$ó%@+H@†ð€^,¹ÛD .ª³ýFvVïÂóõæ‡w_ÈRÂJ½ïNMºYøfþs(!e®z¸¦ñ䱬kJe#¯ºÕ‘Þ<.v4wémÖwb…5„$© 6„?ßU ?>lz¼óth¾tï³dùÉé¢Ë£ÖS½G©7Ï$ü˱(\™céÞ9Rßw1øGJ mõͬ6™Nçí¥rp°XSXE7ªz‘TYÛtÉëDYÑ'údÚe(Ø!³j—VDz+S£ñkW÷P6Ž]òˤÓÑŽ37*bÖË,>©ú4Ù¶§ÙcÕtÛ;ʱC½ܺN†®Î¹‚lŸx™½b“‰}åw¬Jºpç¤ûÁCáq¿T›y^˜¯®6éküëò‡Aåu‰~¹C=‘œt–Ն쎥8Lù/iˆ xŒ…ÛÊã¢p´ˆËg‹òàŽHÂMç¢êÛ eK2"®$O ./à‹ø,‚ Q™Þ‹àúcòƒì–ò ƒ 5ðq‚J†_)Æ»ì¾7ì5G4b}EéÛ¿³föãBs½ŽmãÁ±ûû-#¨ŽcçÑ31œñþ&ÿ©‰ÃÕnsÒ¯;Ü|2U›eîç£è­ßN±¶svà±ÊïGžZQZ÷Ìs7£6»Œæ¬‹yøóÕ鉸ë‚ö¾ÎAå÷iÐ/èï:?Þcðœ?âzäΞðº¬ptóÁ“LÏr*ü´ÑÞä(¿£xýöLÒÀ‡îI¶³{õžÙÐËÝîB ñ½]°!å¶Z¿S6IŸ¥\Ý݆ÖôÚ=môæ~Q¶ªEqæ/†ÉcîØ>—gq”ÊZ øÚÌ_iwÛÇc„¾·[5#b#¬± £¼üÐâ³ ˆ”ã©ËÔˆTqQ}w_ ÿÙyÂâ!ÀIî ·“Á/™ôW…(›©FªÕ< MÉ" ¯añ †Cä·p¤WÕc’€ð¿1ÄÐæµc¬– 3$Èx±èÝ‹9¿˜É”ô묓ÍÓ0äÔ¡ ìÿûuÄŒ„m?Z)]½ZYÝùÄ+m_/e(þ÷zj•Ùß×å'̦%üØp?2è£#Õ%ŠÏVݹö3–憅÷2žÊ½¬Á[kúKά9U>lHl»Ïpê,€²4t4ÈGhÎXÒò2ì†ÏÜŽ>µbÊà‡a†ôjQ=/6ª<;¡´ÍîQßXPö^4a§u|bÅ{ÝJ/i{Jòã-õà²ùþôÒoþ „ø•—è«G¬< —ÌBÛµ‰ÈëoZü]´èÑD q|ú"0Ó—‰óÒþ•—„à²â#[Ó+¿Mo «ªXCÉð8œ7»Õ| ™HÒ"Œ¤Õß<+5>î~i}‰ÏsOØæ©6ÅG ÇmË’·”ß²¤˜”™–Tž;®œùìØÚw¦Ÿ£©õ{$9«±Ç–çÜžnõeÅ(šô)Öι>Ÿv[w\cl XþÁ@¡dWî‘® 1ïGÝÿô7ÞdÞLiK÷¡âˈÚ;›ÒþN÷9[>þ›jQñPK½\C7<^#Æ\ C8com/microsoft/sqlserver/jdbc/AppDTVImpl$SetValueOp.classPK½\C7¼å;¡p -² com/microsoft/sqlserver/jdbc/AppDTVImpl.classPK½\C7{']tß{ ;žcom/microsoft/sqlserver/jdbc/AsciiFilteredInputStream.classPK½\C73ÚH9¾BÖcom/microsoft/sqlserver/jdbc/AsciiFilteredUnicodeInputStream.classPK½\C7VÜ“‚ 4ocom/microsoft/sqlserver/jdbc/AuthenticationJNI.classPK½\C7UAø¯x‰ 2Ccom/microsoft/sqlserver/jdbc/BaseInputStream.classPK½\C7ü ñd'“< $com/microsoft/sqlserver/jdbc/CharacterStreamSetterArgs.classPK½\C7}Ùj)Œ&com/microsoft/sqlserver/jdbc/Column.classPK½\C7‘›”†åm/¬.com/microsoft/sqlserver/jdbc/ColumnFilter.classPK½\C7#‘æ”+Þ/com/microsoft/sqlserver/jdbc/DataType.classPK½\C7ª%}K1»1com/microsoft/sqlserver/jdbc/DataTypeFilter.classPK½\C7?è•—ÓF.,U3com/microsoft/sqlserver/jdbc/DataTypes.classPK½\C7qòÂØš'&rHcom/microsoft/sqlserver/jdbc/DDC.classPK½\C7WÈ|– Z2ÄXcom/microsoft/sqlserver/jdbc/DTV$SendByRPCOp.classPK½\C7“»py ¼&ªbcom/microsoft/sqlserver/jdbc/DTV.classPK½\C7Åld›¥/gmcom/microsoft/sqlserver/jdbc/DTVExecuteOp.classPK½\C7tÿþžV*Yocom/microsoft/sqlserver/jdbc/DTVImpl.classPK½\C7ÂI‡âmH /?qcom/microsoft/sqlserver/jdbc/FailoverInfo.classPK½\C7™;þ 7ùvcom/microsoft/sqlserver/jdbc/FailoverMapSingleton.classPK½\C7ŽkK@eŽ@L|com/microsoft/sqlserver/jdbc/FailoverServerPortPlaceHolder.classPK½\C7a:9ws8~com/microsoft/sqlserver/jdbc/InputStreamGetterArgs.classPK½\C7ô‡¥yL¼8Ücom/microsoft/sqlserver/jdbc/InputStreamSetterArgs.classPK½\C7Â-Rý2~‚com/microsoft/sqlserver/jdbc/IntColumnFilter.classPK½\C7^€úÀ2 ;Õ…com/microsoft/sqlserver/jdbc/JDBCCallSyntaxTranslator.classPK½\C7R> äõ@î‰com/microsoft/sqlserver/jdbc/Parameter$GetTypeDefinitionOp.classPK½\C7ðbõ¹ W,O’com/microsoft/sqlserver/jdbc/Parameter.classPK½\C7‚Å ß 1Rœcom/microsoft/sqlserver/jdbc/ParameterUtils.classPK½\C7]*¨Iûá1€ com/microsoft/sqlserver/jdbc/PLPInputStream.classPK½\C7. ‰[Ë\4Ê©com/microsoft/sqlserver/jdbc/PLPXMLInputStream.classPK½\C7S=¹ü x2ç¬com/microsoft/sqlserver/jdbc/PrecisionFilter.classPK½\C7—6Ú¼ /D®com/microsoft/sqlserver/jdbc/ScrollWindow.classPK½\C7[Z/j– Û0k´com/microsoft/sqlserver/jdbc/ServerDTVImpl.classPK½\C7Æ(&ìÎ"4O¿com/microsoft/sqlserver/jdbc/SimpleInputStream.classPK½\C7¬ÂA1oÇcom/microsoft/sqlserver/jdbc/SLocaleMapItem.classPK½\C7dЬ 3/ÂÈcom/microsoft/sqlserver/jdbc/SQLCollation.classPK½\C7¾MúXÞ(1»Ôcom/microsoft/sqlserver/jdbc/SQLJdbcVersion.classPK½\C7èƒ/‚ª¨ 0èÕcom/microsoft/sqlserver/jdbc/SQLServerBlob.classPK½\C7(8€½;àÛcom/microsoft/sqlserver/jdbc/SQLServerBlobInputStream.classPK½\C7ì§„¸æ3<¹ßcom/microsoft/sqlserver/jdbc/SQLServerBlobOutputStream.classPK½\C7%cþƒ½€Nùácom/microsoft/sqlserver/jdbc/SQLServerCallableStatement$1ExecDoneHandler.classPK½\C7"¨?ÇÞÅN"äcom/microsoft/sqlserver/jdbc/SQLServerCallableStatement$1OutParamHandler.classPK½\C7Jæq}²YSlæcom/microsoft/sqlserver/jdbc/SQLServerCallableStatement$1ThreePartNamesParser.classPK½\C7Uó]¢D=écom/microsoft/sqlserver/jdbc/SQLServerCallableStatement.classPK½\C7’Xåv‚0ÿcom/microsoft/sqlserver/jdbc/SQLServerClob.classPK½\C7Hmr‘…Æ@Ï com/microsoft/sqlserver/jdbc/SQLServerClobAsciiInputStream.classPK½\C7VqØ3ÕA² com/microsoft/sqlserver/jdbc/SQLServerClobAsciiOutputStream.classPK½\C7Þ•p^`ƒ?Dcom/microsoft/sqlserver/jdbc/SQLServerClobCharacterReader.classPK½\C7Tv›©[6com/microsoft/sqlserver/jdbc/SQLServerClobWriter.classPK½\C7²å]ñ)Iþcom/microsoft/sqlserver/jdbc/SQLServerConnection$1ConnectionCommand.classPK½\C7ú¨QéLuBVcom/microsoft/sqlserver/jdbc/SQLServerConnection$1DTCCommand.classPK½\C7‡ÌO Fcom/microsoft/sqlserver/jdbc/SQLServerConnection$1LogonProcessor.classPK½\C7«š&…nCz com/microsoft/sqlserver/jdbc/SQLServerConnection$LogonCommand.classPK½\C70?ºº:ÍŠ6I"com/microsoft/sqlserver/jdbc/SQLServerConnection.classPK½\C7aç˜yÞdDW]com/microsoft/sqlserver/jdbc/SQLServerConnectionPoolDataSource.classPK½\C7¤ˆ¥2 !?—`com/microsoft/sqlserver/jdbc/SQLServerConnectionPoolProxy.classPK½\C7q胴ÃEþgcom/microsoft/sqlserver/jdbc/SQLServerConnectionSecurityManager.classPK½\C7^^‡_ï$cl<jcom/microsoft/sqlserver/jdbc/SQLServerDatabaseMetaData.classPK½\C7®ŒÆûX #6^com/microsoft/sqlserver/jdbc/SQLServerDataSource.classPK½\C7·˜#àì0C com/microsoft/sqlserver/jdbc/SQLServerDataSourceObjectFactory.classPK½\C7‘ì> m2W com/microsoft/sqlserver/jdbc/SQLServerDriver.classPK½\C7ز…¬&Ú5¬«com/microsoft/sqlserver/jdbc/SQLServerException.classPK½\C7ò[ÿ¨ X=%´com/microsoft/sqlserver/jdbc/SQLServerParameterMetaData.classPK½\C7þû¸ï¿<(Ácom/microsoft/sqlserver/jdbc/SQLServerPooledConnection.classPK½\C7»lP£‚©RqÉcom/microsoft/sqlserver/jdbc/SQLServerPreparedStatement$1PreparedHandleClose.classPK½\C7,þPfVRcÍcom/microsoft/sqlserver/jdbc/SQLServerPreparedStatement$PrepStmtBatchExecCmd.classPK½\C7ƒhÈ‚-Aq)com/microsoft/sqlserver/jdbc/SQLServerStatement$StmtExecCmd.classPK½\C7µKêD5R,com/microsoft/sqlserver/jdbc/SQLServerStatement.classPK½\C7›Ä8Î8$Icom/microsoft/sqlserver/jdbc/SQLServerXAConnection.classPK½\C7i“ 8“Lcom/microsoft/sqlserver/jdbc/SQLServerXADataSource.classPK½\C7Q/@ËüŸ,6|Pcom/microsoft/sqlserver/jdbc/SQLServerXAResource.classPK½\C7Zî9*0Ìdcom/microsoft/sqlserver/jdbc/StreamColumns.classPK½\C7 yc ø-Sicom/microsoft/sqlserver/jdbc/StreamDone.classPK½\C7üÌßZõ.-tcom/microsoft/sqlserver/jdbc/StreamError.classPK½\C7ÄAÖ¯-nxcom/microsoft/sqlserver/jdbc/StreamInfo.classPK½\C7Á¤Šqm1h{com/microsoft/sqlserver/jdbc/StreamLoginAck.classPK½\C7£ÅQ²/(com/microsoft/sqlserver/jdbc/StreamPacket.classPK½\C7ʈð?¢Ì2‰€com/microsoft/sqlserver/jdbc/StreamRetStatus.classPK½\C7Úû|ü1{ƒcom/microsoft/sqlserver/jdbc/StreamRetValue.classPK½\C7“@D·Ï-Ɔcom/microsoft/sqlserver/jdbc/StreamSSPI.classPK½\C7 Mÿ©†ó&ȉcom/microsoft/sqlserver/jdbc/TDS.classPK½\C7)»l¤Š N’’com/microsoft/sqlserver/jdbc/TDSChannel$HostNameOverrideX509TrustManager.classPK½\C79þü€Hˆ™com/microsoft/sqlserver/jdbc/TDSChannel$PermissiveX509TrustManager.classPK½\C7ËúrÇ”à >êœcom/microsoft/sqlserver/jdbc/TDSChannel$ProxyInputStream.classPK½\C7 ‚cµ?Ú¡com/microsoft/sqlserver/jdbc/TDSChannel$ProxyOutputStream.classPK½\C7=LâÄ ö9I¥com/microsoft/sqlserver/jdbc/TDSChannel$ProxySocket.classPK½\C7å’H³q E@­com/microsoft/sqlserver/jdbc/TDSChannel$SSLHandshakeInputStream.classPK½\C7É]Y«ÿŠ F´com/microsoft/sqlserver/jdbc/TDSChannel$SSLHandshakeOutputStream.classPK½\C7p‘—÷Ëm@-w¹com/microsoft/sqlserver/jdbc/TDSChannel.classPK½\C74Åe®ABÓcom/microsoft/sqlserver/jdbc/TDSCommand$1AttentionAckHandler.classPK½\C7 YÔÈ ±-›Õcom/microsoft/sqlserver/jdbc/TDSCommand.classPK½\C7÷ìU,™,®ácom/microsoft/sqlserver/jdbc/TDSPacket.classPK½\C7©5#ýÉ ,$ãcom/microsoft/sqlserver/jdbc/TDSParser.classPK½\C7Qˆs+,kècom/microsoft/sqlserver/jdbc/TDSReader.classPK½\C7Pç3ßB04ücom/microsoft/sqlserver/jdbc/TDSReaderMark.classPK½\C7ó\'h4³2aýcom/microsoft/sqlserver/jdbc/TDSTokenHandler.classPK½\C7~Þ‘^5,åcom/microsoft/sqlserver/jdbc/TDSWriter.classPK½\C7ÆNþч/com/microsoft/sqlserver/jdbc/TimeoutTimer.classPK½\C7áŸH²©ç+acom/microsoft/sqlserver/jdbc/TypeInfo.classPK½\C76xë`³ð/S%com/microsoft/sqlserver/jdbc/UDTTDSHeader.classPK½\C7bä•Ô<S'com/microsoft/sqlserver/jdbc/UninterruptableTDSCommand.classPK½\C7ܼñ%Ø#'B)com/microsoft/sqlserver/jdbc/Util.classPK½\C7âP¯È0¬:com/microsoft/sqlserver/jdbc/XAReturnValue.classPK½\C7BF(Û€Q*©;com/microsoft/sqlserver/jdbc/XidImpl.classPK½\C7ˆ"”qd/q>com/microsoft/sqlserver/jdbc/XMLTDSHeader.classPK½\C7 /@sqljdbc.jarPK½\C7~‚BÄ2ÑyZ@sqljdbc.jar.oldPK½\C7šÌ”Dz‡XKsMETA-INF/manifest.mfPK½\C7‘1³ÏÝóX/ŽMETA-INF/zigbert.sfPK½\C7Apë ®Ý =©META-INF/zigbert.rsaPK‡‡C5±libjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/jar1.jar0000644000175000017500000000403210515743310025105 0ustar twernertwernerPK ®\S5 META-INF/þÊPK ­\S5ÐÃåͳUMETA-INF/MANIFEST.MFmޱ ƒ0„÷@Þ!c MÔA‡lZJ±´Km»–TkD£$ñí›:‰ÊmwwJ–`,}6²SœÌÇ(V³&îE^q#btÔ ,4ÿ|Èü·Ñ’]rŠI6 ­9TålQÖC.K™ ëtô!mœÔBËiþÁå¯Utš“KÒ3é1JÛ¾”ÝÐ/¶çýÊIemÏ=oVœ†uú»"WOèÄnpëCýPK xNS5org/PK xNS5 org/jboss/PK xNS5org/jboss/test/PK xNS5org/jboss/test/vfs/PK xNS5org/jboss/test/vfs/support/PK xNS5 org/jboss/test/vfs/support/jar1/PK xNS5†”øØ)8<org/jboss/test/vfs/support/jar1/ClassInJar1$InnerClass.classQMK1}Ù®»v]íZ¿o"=ÔM "‚⥠TŠ”Þ³5Ö]¶Ù’lû¿<ˆàÁà'‹P¯•™7“™7/É×÷Ç'€.ª¨ ÀÅ–» ^ñ’˜F‡ádë1OãÜ^HSðù³áf6æºà©Ð]ÞË„1}uKø’¯•× æRÇC·—?I†Ú Qòn6‰¥~qF™ú ‰l(tbãߤk%2}¥¤.©ÂE )¼XFBcÑK÷ò™ɛĎŠþ”¦b.B¬À ácÏÇ>ÃùÿƱ%ã™Pc~§rT0Tšö)ÚK0â¾Ï¥ŸdQduYDÛÇ*ù*¡38´€ Õ~k½Ãy¥ÈA@Ö+k°F6,q@¾VžG¥ÝÄF™%iØÆ:ðPK xNS5òï_>1org/jboss/test/vfs/support/jar1/ClassInJar1.class•QMO1œ ¸ˆ‹ ~¢^4üˆ,ÄÄ‹Æ Ñd DÌÞ»X±›µKÚ.ÿË“‰€?Êøv5+‡7yÓNæM_¿>¿t°_AÛvì:h2T|¥„îÆÜwFQ'¸{úƒ>C£ñ)÷b®ÆÞÐj©Æ× Õn¢ŒåÊ1¤²org/jboss/test/vfs/support/jar1/ClassInJar1.classPK Å?libjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/outer.jar0000644000175000017500000001232110763053771025420 0ustar twernertwernerPK û\S5 META-INF/UT zÆ7EZWÌGUx‘PKú\S5(EW™·_META-INF/MANIFEST.MFUT xÆ7ExÆ7EUx‘uŽ= Â0„÷@þCF“Ö¡²µ"¢èâ×*±}Õ›”ä•â¿7v*­rÛÝÃÝí”Ñ7ðÈÏ༶F²¹ˆ)ÉLÏÉU<€/„©H(Y8P%Ïß_>ñ%Nù5NØ$_fìðöµŸ±µ)Ä”’C…¾éBa¨ãGO̾œ¨”æý#A«l ˜Ò:É6¹õ¾Û d]7O¨Áà¿pÚo%{ 62ŠÚ¶Õ5t ëî#rt‡wìnüŠ’PK¸^c8ä}:~ jar1-filesonly.jarUT LWÌGLWÌGUx‘ ðffáb``à`xl*»s«ÞV /”‘AHûº†8êzú¹éû:úyº¹‡èùºÕöÙò7´}ÿ×ÅÇgµå@ƒ³y¡DìŸ(ßFg調­‡ëů¼päNIåüê÷7‹5‹ ¦Å8H/T9Ìøõbóö WHŸð+¼ÞSÈþÈæôƒÒ~_£síÜmçÕ7³¥,+Ùïp\*hb÷”ÛŠêê‰Þ ;X)ìÔ8¨Y&ü,ÝÞ³í–Bà§<³Î¥u"…n3)Èwæh”$=¾¿$[Õˆ¥v齕‡\4÷D¸9%_ôþÎ!÷i¦ÜÉÙGúºþM™»,IÏiÍî‡ÉçÛþùÿ˜ÀFÕÇ3’ëä—…„Ìú¦yËÛàÑ„}ç—ÎO L)t¹}\ë§ÖBc‹- ®Ö1gï=\¹ô„£Ã5íìþ nf:…ûÂæ¹/½{Äm¦jæcV˜Q£àÓ{éx;`p£À´(€„ûÔ@_&C‘9\;:ºêÅ™ÈýéÐ9r¤û÷ÅÞF—3÷vGlœ½Õû–ÞÿÓ“;ÙëìOý(3mÔn7¯¼ì÷Ì7~½Ý~†’ ñŽŒ·ùÊdÞXe…Ô,mywìŽ[¹K úŽj™_Ív΋Å?j~OZwìÞ…¬•Ç®ó\Í[Ôóô›Ÿ«d5OÐOžÓæAžÕ§,,y%ºî>‰4¸RÔY÷KŒëï‘Ã)ûNvg¼nôø»ëo­Ì_®ú“õ¹„“m´{¾.Ó?fü2eRÆkטò=6+ÖË­Xn15qÒ«‰;¦Ït¯}·njjyàQ©Ã?™æ=1ªþªÐsä„QŒnBÍþÛA˯æm-ìPýÅ(`öpOÛÔ9¡+ÂùKŸÙ$t­#ö™ŒÆÜÚ†½Ï/Y%ª±ó¼¶²ø¿KF‚òõœg;ZŸÆx[«†1Õ1x32‰0ãÎø0°¤‘G1€l¶<…0á9…9 Ý&ô¤ƒ°)‹‰Œ„àÍÊÒÎ „Ü@c¿3ƒxPK®\S5ãl2jar1.jarUT èÅ7EèÅ7EUx‘ ðffábu1Á¦ H€“…Á×5ÄQ×ÓÏMÿß)†¨R†µ@¥?=»È ed`Òp¥¾Ž~žn®Á!z¾n¹}¹š $Z¾;ÜSLæö½âØžåµq‹wîîi!õÙ.‹U?¾mÕy*·\^¾\ØkZ‚Nm£Ù¦à9,gŽk„mV{çÇX8WZY,©äŠ‚Žˆ‰äÿš¶Ë_ì—Ÿ[Ôåi&ŽÖrBÈÓœþÀkÎzÞ3¹_—|QÌežsʼnýt濃OeÖ3†–Ìšì}IÒø¥¡×í}bSî^Ðßöüï)ÏÔÜó¶ùlaõsÚJíV ÷q$¯àµ³Ä_¸'*üPÈó‹Òõq«à‚ªÈJÊ/.Æ£ŽE]Ijq ŘŠËÒð™.]CqiAA~>›ðkÌJ,2ÔG¤î¶)?nhãß‚‰Á†ÝÎ9‰ÅÅžy^@¶Šg^^jX@/DÎ ôõf6¨½¹nwYìÛ¨ýùJ¶WÄ|¹•š-Ué’›ro³éµØm7'åüÞoÓñà üƒ~!õî€õS'Ì4Ÿ<Ó\ÿäõïÇÕôøV­X wàè´~YùÝ š{Ü™mût{϶[ ŸòÌ:—Ö‰ºÍü¥ ß™£Q’ôøþ’lU#–Ú¥KôVJrUÐÜáæ”|Ñû;‡Ü§™r'géëú7eî²$=§5¸&Ÿ?nwøçÿcUÏ H®“_^b2ë›æ-oƒGö_:?%0¥4Òåöq­ŸZ -¶4,¸ZÇœ½÷påҎ״³û7¸™é:ì ›ç¾ôî·™ª™7ŽY}`F‚Oï¥ãí€QÀŒCÒ¢îS}ý™ EæpíèèV¨[g"÷§CçÈ‘îcÜSx]ÎÜÛ±qöVï[zÿOOîd¯o°?õ£Ì´Q»Ý¼ò²ß3ßøýõvûJ6Ä;2Þæ+“yc•aR³´åݱ;lån,ê;ªe~5Û9/ÿ¨ù=iݱ{²V»Îs5oQÏÓSl6~®’Õ<>A?yN›yVŸ°°ä•èºû$ÒàJUPgÝ/1®¿GG¤ì;ÙqœñºÑãÿí®¿µ2¹ê_LÖçN¶ÑîùºLÿ˜ñË”I¯]cÊ÷جX/·b¹ÅÔÄI¯&î˜>Ó½öݺ©©åG¥ÿdš÷Ĩú«BÏ‘F1º 6ûo-¿š·µ°Cõ£€Ùÿd•¨ÆÎpDðÚÊâÿ. Ê×sžíh}ãm­ÆTÇàÍÈ$ÂŒ»…†·Ž Èe$¤8…iÅ^ ÂÀ’FmÅ+²åØJ+„匰² ·.FŒ¨en}ü(ú¢±”m¸5 £hnÇÔ )ëp bÀì Ê>Ü) ô¿AвØJCXÒ¨ÏDYÙˆnz¦GØ´‰™Œ" À›• ’¸Ž´gñPKá\S5Eå¡  jar2.jarUT FÆ7EFÆ7EUx‘ ðffáb‡1Á¦ H€“…Á×5ÄQ×ÓÏMÿß)†¨R†@¥=·’×nòBD€4\©¯£Ÿ§›kpˆž¯[nŸ#w“ÌÑ÷͵í²Ü·¶àÛé"Qzò•Tðÿg.Ës˜?ÞÞnÓyj÷ÞïïæVå6˜¶ÏQú¦–ß·3Ç5B&«½q c*œ+ݯsàÅLj™&~6ü”ÿïl¯0û…̤1©ÍÊOÝ[¼¤ÙGÌHøÚËÁ·¤,V¶ØYþ’}º÷–{Y~ë³Ï¬8®‘·KJ* ÌÕþv\¿´úÒ­²ß÷ì{9ÕŠ7ûk¹£Þ¼ cNk7øÅ ?Ôð`âü¢t}Ü*¸ *²’ò‹‹ñ¨ãGQW’Z\‚G±0¦â²4|¦Kc×P\ZP_„Ï&ü³‹Œôi¤{ãRÁ$`üÏbC"t;ç${æyÙzÉ öÔ_&CÚ©­®,Žº:Åóë\¸âLã:Ôfðª$}»w´ë®Žnæî?úþjrÿi<~“µ(œÿ³Qþ¯g¥ivv÷ï1òl¸ïÀz[±ÌéQËdzKL$K‡¬a9ß2ïóÊí^çõ%£œÏ¿u\étªl5O`DV¸—výÙK»Nɦ…•SxÞzdZžïܯt2åavšRwk(ëM¶‘–mŸOܰô~,óýR循¢;OO/Ý8où¡¸‰js¤_ZŸÊœsìÊ“2µüЇ~¾¦–¿¨‘·ms}ŤÓï¯MV™j|>@ö˯½v}ܦ3=dd qÔž®³dEòÜ"+—ª‰“%ô-lkY«5—ꊊ´9¢–ø9ºÁÌ*õwØÊWuÀ”ÈÈ$ÂŒ;oB€Ã[GäìÉ©0­Øó* ,iÔÆ‘s‘-Ç–– 0²n\(:ŒQ³ n}ü(ú¢±dÜš…Q4·cj†d#ÜH£°»ˆl…Û ƒ>â7šÍˆ-£ÁÀ’F}&2²]€7+H;'F ˜Å âPK xNS5org/UT $­7EZWÌGUx‘PK xNS5 org/jboss/UT $­7EZWÌGUx‘PK xNS5org/jboss/test/UT $­7EZWÌGUx‘PK xNS5org/jboss/test/vfs/UT $­7EZWÌGUx‘PK xNS5org/jboss/test/vfs/support/UT $­7EZWÌGUx‘PKxNS5ýs¼÷Ý8,org/jboss/test/vfs/support/CommonClass.classUT $­7E$­7EUx‘O1NÃ@œM‡DÔ44(PpJM”Æ•(ýÙá,ÛÝó/ªH)xBY;”ìJ£Ù‘öûçð`YŒ!&."L áR7Ú¯Ãù횤æM¦™nÔS[çʾʼbå23…¬ÖÒêŽÿŠÿÐŽ0ό݈27Î ¯œ»w'\»ÝëEjêÚ4i%{ Ä/¦µ…zÔ}ögw_ÊL`D¸ù_t&QÉf#žóR×ðw]7§1†ÌDÏÑÝôÉÃcØ‹W8cLN8GÜÛÇýUrPK xNS5 org/jboss/test/vfs/support/jar1/UT $­7EZWÌGUx‘PK xNS5 org/jboss/test/vfs/support/jar2/UT $­7EZWÌGUx‘PK û\S5 íAMETA-INF/UTzÆ7EUxPKú\S5(EW™·_ ¤<META-INF/MANIFEST.MFUTxÆ7EUxPK¸^c8ä}:~  ¶:jar1-filesonly.jarUTLWÌGUxPK®\S5ãl2 ¤‹jar1.jarUTèÅ7EUxPKá\S5Eå¡   ¤V jar2.jarUTFÆ7EUxPK xNS5 íAš org/UT$­7EUxPK xNS5 íAÑ org/jboss/UT$­7EUxPK xNS5 íAorg/jboss/test/UT$­7EUxPK xNS5 íAPorg/jboss/test/vfs/UT$­7EUxPK xNS5 íA–org/jboss/test/vfs/support/UT$­7EUxPKxNS5ýs¼÷Ý8, ¤äorg/jboss/test/vfs/support/CommonClass.classUT$­7EUxPK xNS5 íA org/jboss/test/vfs/support/jar1/UT$­7EUxPK xNS5 íAsorg/jboss/test/vfs/support/jar2/UT$­7EUxPK õÆlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/jar2.jar0000644000175000017500000000301310515743310025104 0ustar twernertwernerPK á\S5 META-INF/þÊPK à\S5ŒÚc­³UMETA-INF/MANIFEST.MFmŽA ‚0Åïƒ}‡ Ú´À»iDuÉêSÿæD§lñÛ·<‰Ê»½÷ãÇ» % 0–¾AÙ*NöÌÇ(T“&ìDVq,Àè¤AXÈi4üù€ùÿHS? ›è’d0³#±ÊØ£¤ƒL2ÖéèSÚ8©„>̧é—K¸TÞjN®Qk̨Ç(nºPvE?Û^'¥µ÷¼¾ïY•: kõwA.žÐ‘]á–‡0úPK xNS5org/PK xNS5 org/jboss/PK xNS5org/jboss/test/PK xNS5org/jboss/test/vfs/PK xNS5org/jboss/test/vfs/support/PK xNS5 org/jboss/test/vfs/support/jar2/PK xNS5±¥bœ1org/jboss/test/vfs/support/jar2/ClassInJar2.class•PMO1}•…EAüЉo~D ^5^ˆ&˜ $böÞÅŠÝ,-i»ü/O&üþ(ãìj¢Wó2oúæuf>>ßÞ °ß@Û!vBì2„ñÍýt43t£T¬Ï„žó©·JÏ/ZC£ÚÇ"Ëe{ LQŒjWJ+ÍP9>‰‚¡y” íHi9Ή´"Édákf"‹…Uÿ)þY9†óÈØ9Oã÷Òy¾zrÜåË¥±ž§Â^ða&œé;ÊiœÆÔäv&oUáÑùóÖ+fo¢ †³x’ËïÖ“$•3ÏPôú½>ްF—áTA+—,¤¨cr:Dñ%a“/9P=}{)¥-ÂZY<Ä&aó[€6:eûV©ê~PK á\S5 íAMETA-INF/þÊPK à\S5ŒÚc­³U¤+META-INF/MANIFEST.MFPK xNS5íAorg/PK xNS5 íA2org/jboss/PK xNS5íAZorg/jboss/test/PK xNS5íA‡org/jboss/test/vfs/PK xNS5íA¸org/jboss/test/vfs/support/PK xNS5 íAñorg/jboss/test/vfs/support/jar2/PK xNS5±¥bœ1¤/org/jboss/test/vfs/support/jar2/ClassInJar2.classPK [šlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/innermf.jar0000644000175000017500000000057110527516530025717 0ustar twernertwernerPK 0¦q5 META-INF/þÊPK /¦q5¾oà‰¢META-INF/MANIFEST.MFMÌ1 Â0†á=ÿQ‡„©`¶êäP*®rÆ+=i¯%‡þ{#.®Ï÷ñ¶ÀÔ£d{Ã$4s0•óZ5ü'Íq@S¬Œ{WkuJŸö¸~ÿµów°¿3›îͦ¥˜fY%ã$æÌÑmµêŒÔS„\’öJyÄ`ˆÓÔ»¤ÒAÄ^ Á¨~ªÕPK 0¦q5 íAMETA-INF/þÊPK /¦q5¾oà‰¢¤+META-INF/MANIFEST.MFPK}ælibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/jar1-filesonly.jar0000644000175000017500000000243010515733512027112 0ustar twernertwernerPK ëQS5¹µ.µUMETA-INF/MANIFEST.MF}Ž=‚0†÷þŠ:´À€C7q0]üZMCK %m…ÃÔÁÐÄÜtyŸ{ïÙs)r0–\@¡$ÃõÑZ·‘¨÷úWI?ijgÁNõCZQm>G=žƒd¦t¿@ÇR‘‹”Û!''aK`¸à: ¹(Á(YvæW`˜ÍÊÉÇj†·‘2Ç2¥(®ê*öß— t>ì¾[[3ÏkÛ–ÉPG•¾MALJ¼Qs´Ð PK xNS5†”øØ)8<org/jboss/test/vfs/support/jar1/ClassInJar1$InnerClass.classQMK1}Ù®»v]íZ¿o"=ÔM "‚⥠TŠ”Þ³5Ö]¶Ù’lû¿<ˆàÁà'‹P¯•™7“™7/É×÷Ç'€.ª¨ ÀÅ–» ^ñ’˜F‡ádë1OãÜ^HSðù³áf6æºà©Ð]ÞË„1}uKø’¯•× æRÇC·—?I†Ú Qòn6‰¥~qF™ú ‰l(tbãߤk%2}¥¤.©ÂE )¼XFBcÑK÷ò™ɛĎŠþ”¦b.B¬À ácÏÇ>ÃùÿƱ%ã™Pc~§rT0Tšö)ÚK0â¾Ï¥ŸdQduYDÛÇ*ù*¡38´€ Õ~k½Ãy¥ÈA@Ö+k°F6,q@¾VžG¥ÝÄF™%iØÆ:ðPK xNS5òï_>1org/jboss/test/vfs/support/jar1/ClassInJar1.class•QMO1œ ¸ˆ‹ ~¢^4üˆ,ÄÄ‹Æ Ñd DÌÞ»X±›µKÚ.ÿË“‰€?Êøv5+‡7yÓNæM_¿>¿t°_AÛvì:h2T|¥„îÆÜwFQ'¸{úƒ>C£ñ)÷b®ÆÞÐj©Æ× Õn¢ŒåÊ1¤jorg/jboss/test/vfs/support/jar1/ClassInJar1.classPK ÷libjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/test/web_pkg_scope.ear0000644000175000017500000001044411060307542027055 0ustar twernertwernerPK üf%9 META-INF/PK ûf%9Ü¢fjh~META-INF/MANIFEST.MFóMÌËLK-.Ñ K-*ÎÌϳR0Ô3àår,JÎÈ,K-Bä¤V”+À$x¹œ‹RKRSt*­ “3R|ËRóx¹œJ3sJÀâÅ%‰EÙŹ¡]¯”lù¦zñ†Æ¼\¼\PK üf%9‘ˆ ôMETA-INF/application.xmleËNÃ0E×ä+\¯‰‡Ð B®+h‚TÄ£é‚Uä:V1$¶e;}ü=.!R »;3÷Ì¡óCÛ t^=ùÂHjaj¥·3¼.Ò>䟃h:Ÿ’"íj°×M‘¼c¸Ø½2Rd¿œI¡Òæòk ‡Pœâ•.Z•¹¤ Q2«¥áÑJ–S[›ùqu•aÓÔT”ÒÍZ…ðuGGÅe%+t¸ôoý»õ"±§Pƒ†÷ËíÞ]ÁjÒ"èýlý˜êÊJ8]Ë.¹qd­¥ ­¼óª¶ì¦r7¿ç̤jž»ÿȪ̊2û ŽcvîÃ’JDúòÄ0íìŠÖÂUí8·¹¸£W·@%èjÍr=é P·KžY[t—lKôÒ~\Ïš’»iáÞ°é"ÊH˜_§Ö²«š0B:|óñ³¦xá?ý¬Õ¦1ò=c1_11!庖6vC»½‘훚~ÜÕ»¡‘]”-WßÈ~têtJs#{üuÐùÄÉ47d + ‚”|Ýd‡½±£Õ,ò*;FK].½.fmš`”¯>±K”Qƒ8³AâL‰òw)Ø©a©jbn­‹*ÕJާÇÒ%›Ñ“ŒaÂÊFŒ}Ï&¦­\ó›Ôa 0S8PE· ¥L3YílvÁÅ z°jRM-{©‡S“7MæDÓSéE+‹ W¬U>êFaÄꛇ@¡”DÎ#(ÒÇ딇oÁþ¹Qõ•ÓísÜ\Ý1ÏL¾7º‘¡\˜X‰Üê½óíí©-m œ$ä[39éœ1jÎqôH|óSBDÍ™`·Ì[]„©ª »â¾“¤”»#'ÄŽÞ;Ù\ò×åćŒ1£ðRiª5÷‡+ñ—ë_.UÎÜ6ý¼óð–‚­h{EWw׎“6V÷êŽ÷¥FÄãÔ¬Ui_C9hŸ‡(2‘wDßß^?‘Z_|÷±SCÁÒÄŒ~jniIûÚîGÝÓdƦA]ì¶S*…7a’Ãoá¸áš!ýLe„×]Ø ©W,Zž{Do˵£5å¡M· Ÿ*š<[ã¬æ„ ß–ƒ/®·d©¼Ëì|i«ÂŒÂ{±•wÄäkžô¼(õwÙ¸£êÅ!s•ñŒXåNü£ÞÀþóBiXNh@Yãåúöä¸û•Š>Q¢‰lo(P¢Mv$šf†ík>wÚùÜ…‘¨¼üõ *ę̜æELóòêSGï”ÆOÿxåÍäµF Oû9ë$œ·z…‚tçNVø:™BÔÙãM¦RuB}©ó@u‚ò])O0âyÍ êFŒý‘EkÀSöPøó•üdràÇÃÈÄ5ý©Œ¬z‚*ê†`»ðÛ’ÃòH)…—Äûˆñµb"µoŸÈÒ3п½ë»O?ša0t«Gâ1“Æ=›ÎÊ.7,e°|#à–é‹É†¨©8\v5c&&¼cgp(Í#¾â^V¤Õm£im}rP§åsVÿÚϹtšj-#b5Ç·ùQ¦ÏJÖ¸ÞT1±ó§$Y,³Ÿ‰.5Žûµw¥V³Z@thÒð›Òû®ÅëÕôE ›­×ü†(Ì2F(„´÷`0#âÛ%õ±i‰›àݤ®qF/Ê ùƒä‘"©²œUCz Û6¶ÜUêzAµù[¯ –{øÈÙÃÆZû=ߤ˜,éÚö;°¤ hí-7‹lOžR|~géT2œ¹z×ÓXy™¥AU§ïÐ^Cùk©ž’IÄ^0 û–ïSŸF!4uI“­Äuåå@oåµG±Ò†RÞç·""å 蕇ƒ†k…9ëO¼z?²^fy¦Wø-4 ¿îücE¤Bê~ññ²ãû—ÛIÓÌå]ÐÍÆqÙÞgÙc„„‘¹ýâ熆̀Ï=~ ö_Z.}5 ØMò,Èçq®x]%È÷qQO”¨ùÐr|èeBóºÂ¹§®ÈGc#€f¶Kœ›Kë—¹þusSjðQ¶,HÉu‘üû=ÛG~i¹t¸ð·»J^VAVŒËªùc6›¶…áò[‹|¯¡áCPåçŽ&ú•˜ïöqÁ·J* &Í Vàïø<»FÍM¥ËG•´• šÅUHPÕâ*ÔóßÉÿ©a³Ïçì·™;ÆÎEÿçKmûH% ~ôÀ-Õù$ÛÿPK üf%9META-INF/maven/PK üf%9META-INF/maven/org.jboss.vfs/PK üf%9/META-INF/maven/org.jboss.vfs/web_pkg_scope_ear/PK æe%9V‡ÏIÂu6META-INF/maven/org.jboss.vfs/web_pkg_scope_ear/pom.xmlTÁNã0½÷+Bï¶Ã©2‘8í®DÑ⹎ ‰mÅNRþ~;Mš”@s²ß¼Ï{ž˜šJ¿ î¢}Y({³|uά)Y#f†ñWu•“LJ5¹Æ1Ž—¹Ú[Ù³Û¶Åí•çýŠãKò²¾Û@bÉTÖ1ÅÅrÁ9+ëwš3'µ:ãÀhŽáÔ\§qã½Í–‰?„–:ų¨,ÔO| JFX )VФÛÔ¼ç©åÚˆH°ŠJ^éÚüÍ8 ¿mµµ¸ÙYJp ±ÊÉã€QµÔW;ŠzÓ5q‰c´¹¿}ÜüyøGI3j 4¾³\ª<ñ5†mg• Å¥°Ãx¶Œž<+v§rú´3dõ\÷aÀùOe~5( S GȧÖ(Zx[Ë⨺“Š÷'JÉÈ SÔà¬tÐ1xbe7Ša.»:3®N £ —‹BÞ¼±>“kµ“y]ù_æ4î90áu!ì×QÏkÖž4Ïi<´ô;ì¿‘6'sX~/p*Ö‰½{ÒÚ%„×Öéuª¤ä˜1/—ü ×? _[æ˜sþÇÉtÐCè0Áݬ)¼´ÉbñPK üf%9Uî›Ívz=META-INF/maven/org.jboss.vfs/web_pkg_scope_ear/pom.properties ÉA  ໿âÁΉìDµÃjàî¢Û›X ò4£ßà»}Í ’)¸‚ýÁh*Ö\ɃÂBBÛ¤ÜÁt™¡âÈ*Rö1ô-õ8Oêþœ™£øIÃÚGrüecμn™*~3KÙã‹V§·Óy‰ 5bPK üf%9 íAMETA-INF/PK ûf%9Ü¢fjh~¤'META-INF/MANIFEST.MFPK üf%9‘ˆ ô¤ÁMETA-INF/application.xmlPK üf%9˜ï#ážv¤ëweb_pkg_scope_web.warPK üf%9íA¼ META-INF/maven/PK üf%9íAé META-INF/maven/org.jboss.vfs/PK üf%9/íA$ META-INF/maven/org.jboss.vfs/web_pkg_scope_ear/PK æe%9V‡ÏIÂu6¤q META-INF/maven/org.jboss.vfs/web_pkg_scope_ear/pom.xmlPK üf%9Uî›Ívz=¤‡ META-INF/maven/org.jboss.vfs/web_pkg_scope_ear/pom.propertiesPK ¶Xlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/links/0000755000175000017500000000000011146622523023717 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/links/test-link.war.vfslink.properties0000644000175000017500000000054511045137324032214 0ustar twernertwernervfs.link.name=test-link.war # Define the name of the of link#0 vfs.link.name.0=WEB-INF/classes # Define the target using a test.classes.url system property vfs.link.target.0=${test.classes.url} # Define the name of the of link#1 vfs.link.name.1=WEB-INF/lib # Define the target using a test.lib.url system property vfs.link.target.1=${test.lib.url} libjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/context/0000755000175000017500000000000011146622523024263 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/context/file/0000755000175000017500000000000011146622523025202 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/context/file/nested/0000755000175000017500000000000011146622523026464 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/context/file/nested/complex.jar/0000755000175000017500000000000011146622523030706 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/context/file/nested/complex.jar/subfolder/0000755000175000017500000000000011146622523032673 5ustar twernertwerner././@LongLink0000000000000000000000000000015700000000000011570 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/context/file/nested/complex.jar/subfolder/subsubfolder/libjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/context/file/nested/complex.jar/subfolder/sub0000755000175000017500000000000011146622523033405 5ustar twernertwerner././@LongLink0000000000000000000000000000017200000000000011565 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/context/file/nested/complex.jar/subfolder/subsubfolder/subsubchildlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/context/file/nested/complex.jar/subfolder/sub0000644000175000017500000000004011112474030033370 0ustar twernertwernercomplex/subsubfolder/subsubchild././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/context/file/nested/complex.jar/subfolder/subchildlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/context/file/nested/complex.jar/subfolder/sub0000644000175000017500000000000511112474030033371 0ustar twernertwerneremptylibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/context/file/complex/0000755000175000017500000000000011146622523026651 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/context/file/complex/subfolder/0000755000175000017500000000000011146622523030636 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/context/file/complex/subfolder/subsubfolder/0000755000175000017500000000000011146622523033335 5ustar twernertwerner././@LongLink0000000000000000000000000000015700000000000011570 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/context/file/complex/subfolder/subsubfolder/subsubchildlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/context/file/complex/subfolder/subsubfolder/s0000644000175000017500000000004010513621361033510 0ustar twernertwernercomplex/subsubfolder/subsubchildlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/context/file/complex/subfolder/subchild0000644000175000017500000000000510507207604032350 0ustar twernertwerneremptylibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/context/file/complex/child0000644000175000017500000000000510507207604027651 0ustar twernertwerneremptylibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/context/file/children/0000755000175000017500000000000011146622523026772 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/context/file/children/child10000644000175000017500000000000510507207604030053 0ustar twernertwerneremptylibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/context/file/children/child20000644000175000017500000000000510507207604030054 0ustar twernertwerneremptylibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/context/file/children/child30000644000175000017500000000000510507207604030055 0ustar twernertwerneremptylibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/context/file/simple/0000755000175000017500000000000011146622523026473 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/context/file/simple/child0000644000175000017500000000000510507207604027473 0ustar twernertwerneremptylibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/context/file/simple/tomodify0000644000175000017500000000001311030667143030241 0ustar twernertwernerTO-MODIFY libjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/context/file/archive.jar/0000755000175000017500000000000011146622523027376 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/context/file/archive.jar/child0000644000175000017500000000000510507207604030376 0ustar twernertwerneremptylibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/context/jar/0000755000175000017500000000000011146622523025037 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/context/jar/notanarchive.jar0000644000175000017500000000000511021311305030172 0ustar twernertwerneremptylibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/context/jar/complex.jar0000644000175000017500000000173610513621361027207 0ustar twernertwernerPKø±L5 META-INF/þÊPKPKø±L5META-INF/MANIFEST.MFóMÌËLK-.Ñ K-*ÎÌϳR0Ô3àår.JM,IMÑuª ˜êĘ)h8¹:*W—¤æë(xæ%ëiòrñrPKš¼‰ŒCCPKC‹>5childKÍ-(©PKÄ=ÇhPK í±L5 subfolder/PK ‡°L5subfolder/subsubfolder/PK°L5"subfolder/subsubfolder/subsubchildKÎÏ-ÈI­Ð/.M¢´üœ”Ô"('9#3'PK³NOi PKC‹>5subfolder/subchildKÍ-(©PKÄ=ÇhPKø±L5 META-INF/þÊPKø±L5š¼‰ŒCC=META-INF/MANIFEST.MFPKC‹>5Ä=ÇhÂchildPK í±L5 üsubfolder/PK ‡°L5$subfolder/subsubfolder/PK°L5³NOi "Ysubfolder/subsubfolder/subsubchildPKC‹>5Ä=ÇhÄsubfolder/subchildPK½ libjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/context/jar/children.jar0000644000175000017500000000106510507207604027326 0ustar twernertwernerPK ³=5 META-INF/PK ³=5ž'õY00META-INF/MANIFEST.MFManifest-Version: 1.0 Created-By: 0.92-gcc-4.0 PK (=5Ä=Çhchild1KÍ-(©PK (=5Ä=Çhchild2KÍ-(©PK (=5Ä=Çhchild3KÍ-(©PK ³=5 META-INF/PK ³=5ž'õY00'META-INF/MANIFEST.MFPK (=5Ä=Çh‰child1PK (=5Ä=Çh´child2PK (=5Ä=Çhßchild3PK libjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/context/jar/simple.jar0000644000175000017500000000056510507207604027033 0ustar twernertwernerPK y=5 META-INF/PK y=5ž'õY00META-INF/MANIFEST.MFManifest-Version: 1.0 Created-By: 0.92-gcc-4.0 PK (=5Ä=ÇhchildKÍ-(©PK y=5 META-INF/PK y=5ž'õY00'META-INF/MANIFEST.MFPK (=5Ä=Çh‰childPK¬³libjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/context/jar/archive.jar0000644000175000017500000000056510507207604027163 0ustar twernertwernerPK # =5 META-INF/PK # =5ž'õY00META-INF/MANIFEST.MFManifest-Version: 1.0 Created-By: 0.92-gcc-4.0 PK  =5Ä=ÇhchildKÍ-(©PK # =5 META-INF/PK # =5ž'õY00'META-INF/MANIFEST.MFPK  =5Ä=Çh‰childPK¬³libjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/context/jar/nested.jar0000644000175000017500000000231311022747140027012 0ustar twernertwernerPK ùqÈ8Ä=ÇhMETA-INF/empty.txtemptyPK à’j8<›@ÞÞ complex.jarPKø±L5 META-INF/þÊPKPKø±L5META-INF/MANIFEST.MFóMÌËLK-.Ñ K-*ÎÌϳR0Ô3àår.JM,IMÑuª ˜êĘ)h8¹:*W—¤æë(xæ%ëiòrñrPKš¼‰ŒCCPKC‹>5childKÍ-(©PKÄ=ÇhPK í±L5 subfolder/PK ‡°L5subfolder/subsubfolder/PK°L5"subfolder/subsubfolder/subsubchildKÎÏ-ÈI­Ð/.M¢´üœ”Ô"('9#3'PK³NOi PKC‹>5subfolder/subchildKÍ-(©PKÄ=ÇhPKø±L5 META-INF/þÊPKø±L5š¼‰ŒCC=META-INF/MANIFEST.MFPKC‹>5Ä=ÇhÂchildPK í±L5 üsubfolder/PK ‡°L5$subfolder/subsubfolder/PK°L5³NOi "Ysubfolder/subsubfolder/subsubchildPKC‹>5Ä=ÇhÄsubfolder/subchildPK½ PK ùqÈ8Ä=Çh META-INF/empty.txtPK à’j8<›@ÞÞ 5complex.jarPKy<libjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/sundry/0000755000175000017500000000000011146622523024123 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/sundry/jar/0000755000175000017500000000000011146622523024677 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/test/resources/vfs/sundry/jar/archive.jar0000644000175000017500000000065710475576424027042 0ustar twernertwernerPKQ«5 META-INF/þÊPKPKQ«5META-INF/MANIFEST.MFóMÌËLK-.Ñ K-*ÎÌϳR0Ô3àår.JM,IMÑuª ˜êĘ)h—æ)øf&åW—¤æ+xæ%ëiòrñrPKm¾ÚÖGGPK I«5emptyPKQ«5 META-INF/þÊPKQ«5m¾ÚÖGG=META-INF/MANIFEST.MFPK I«5ÆemptyPK°élibjboss-vfs-java-2.0.1.GA.orig/src/main/0000755000175000017500000000000011146622523017734 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/0000755000175000017500000000000011146622523020655 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/0000755000175000017500000000000011146622523021444 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/0000755000175000017500000000000011146622523022564 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/0000755000175000017500000000000011146622530024250 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/0000755000175000017500000000000011146622526025736 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/cache/0000755000175000017500000000000011146622524026777 5ustar twernertwerner././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/cache/PreInitializeVFSContexts.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/cache/PreInitializeVFSContex0000644000175000017500000000757711113267610033245 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.cache; import java.net.URL; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.HashMap; import org.jboss.logging.Logger; import org.jboss.virtual.VFS; import org.jboss.virtual.spi.ExceptionHandler; /** * Initialize vfs contexts - performance improvements. * * @author Ales Justin */ public class PreInitializeVFSContexts { private Logger log = Logger.getLogger(PreInitializeVFSContexts.class); private Map initializedVFSContexts; private boolean holdReference; private List references; /** * Start initializer. * * @throws Exception for any exception */ public void start() throws Exception { if (initializedVFSContexts != null && initializedVFSContexts.isEmpty() == false) { if (holdReference) references = new ArrayList(); for (Map.Entry entry : initializedVFSContexts.entrySet()) { VFS vfs = VFS.getVFS(entry.getKey()); ExceptionHandler eh = entry.getValue(); if (eh != null) vfs.setExceptionHandler(eh); log.debug("Initialized Virtual File: " + vfs.getRoot()); if (holdReference) { references.add(vfs); } } } } /** * Clear possible references. */ public void stop() { if (references != null) references.clear(); } /** * Get VFS references. * * @return the VFS references */ public List getReferences() { return references; } /** * Set URLs that need to be initialized before anything else. * * @param initializedVFSContexts the URLs to be initialized */ @Deprecated public void setInitializedVFSContexts(List initializedVFSContexts) { if (initializedVFSContexts != null) { this.initializedVFSContexts = new HashMap(); for (URL url : initializedVFSContexts) { this.initializedVFSContexts.put(url, null); } } else { this.initializedVFSContexts = null; } } /** * Set URLs that need to be initialized before anything else. * * @param initializedVFSContexts the URLs to be initialized */ public void setInitializedVFSContexts(Map initializedVFSContexts) { this.initializedVFSContexts = initializedVFSContexts; } /** * Should we hold the reference to initialized VFSs. * * @param holdReference the hold reference flag */ public void setHoldReference(boolean holdReference) { this.holdReference = holdReference; } } libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/cache/MapVFSCache.java0000644000175000017500000000503111104021156031645 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.cache; import java.util.Collections; import java.util.Map; import org.jboss.virtual.spi.VFSContext; /** * Map vfs cache. * * @author Ales Justin */ public abstract class MapVFSCache extends IterableVFSCache { private Map cache; public Iterable getCachedContexts() { if (cache == null) return Collections.emptySet(); else return cache.values(); } public int size() { return cache != null ? cache.size() : -1; } protected void check() { if (cache == null) throw new IllegalArgumentException("Cache needs to be started first."); } protected Iterable getKeys() { return cache.keySet(); } protected VFSContext getContext(String path) { return cache.get(path); } protected void putContext(String path, VFSContext context) { cache.put(path, context); } protected void removeContext(String path, VFSContext context) { cache.remove(path); } /** * Create cache map. * * @return cache map */ protected abstract Map createMap(); public void start() throws Exception { if (cache == null) cache = createMap(); } public void stop() { flush(); cache = null; } public void flush() { if (cache != null) cache.clear(); } }libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/cache/CombinedVFSCache.java0000644000175000017500000001416511137562372032700 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.cache; import java.io.IOException; import java.net.URI; import java.net.URL; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.TreeMap; import org.jboss.virtual.VFS; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.ExceptionHandler; import org.jboss.virtual.spi.cache.CacheStatistics; import org.jboss.virtual.spi.cache.VFSCache; import org.jboss.virtual.spi.cache.helpers.NoopVFSCache; /** * Combined vfs cache - permanent entries + real cache. * * @author Ales Justin */ public class CombinedVFSCache implements VFSCache, CacheStatistics { private PermanentVFSCache permanentCache = new PermanentVFSCache(); private VFSCache realCache; private boolean initializing; /** * Set permanent roots and its exception handlers. * * @param initializationEntries the initialization entries * @throws IOException for any error */ public void setPermanentRoots(Map initializationEntries) throws Exception { if (initializationEntries != null && initializationEntries.isEmpty() == false) { if (permanentCache.isStarted() == false) permanentCache.start(); initializing = true; try { for (Map.Entry entry : initializationEntries.entrySet()) { VFS vfs = VFS.getVFS(entry.getKey()); ExceptionHandler eh = entry.getValue(); if (eh != null) vfs.setExceptionHandler(eh); } } finally { initializing = false; } } } /** * Set the real cache. * * @param realCache the real cache */ public void setRealCache(VFSCache realCache) { this.realCache = realCache; } /** * Check at create. */ public void create() { check(); } /** * Check if real cache has been set. */ private void check() { if (realCache == null) realCache = new NoopVFSCache(); } public VirtualFile getFile(URI uri) throws IOException { VirtualFile file = permanentCache.getFile(uri); if (file != null) return file; check(); return realCache.getFile(uri); } public VirtualFile getFile(URL url) throws IOException { try { return getFile(url.toURI()); } catch (URISyntaxException e) { IOException ioe = new IOException(); ioe.initCause(e); throw ioe; } } public void putContext(VFSContext context) { if (initializing) { permanentCache.putContext(context); } else { check(); realCache.putContext(context); } } public void removeContext(VFSContext context) { check(); realCache.removeContext(context); } public void start() throws Exception { if (permanentCache.isStarted() == false) permanentCache.start(); } public void stop() { if (permanentCache.isStarted()) permanentCache.stop(); } public void flush() { check(); realCache.flush(); } public Iterable getCachedContexts() { List contexts = new ArrayList(); for (VFSContext context : permanentCache.getCachedContexts()) contexts.add(context); if (realCache instanceof CacheStatistics) { CacheStatistics cs = CacheStatistics.class.cast(realCache); for (VFSContext context : cs.getCachedContexts()) contexts.add(context); } return contexts; } public int size() { int size = permanentCache.size(); if (realCache instanceof CacheStatistics) { size += CacheStatistics.class.cast(realCache).size(); } return size; } public long lastInsert() { long permanentHit = permanentCache.lastInsert(); long realHit = -1; if (realCache instanceof CacheStatistics) { realHit = CacheStatistics.class.cast(realCache).lastInsert(); } return permanentHit > realHit ? permanentHit : realHit; } @Override public String toString() { return "CombinedVFSCache[real-cache: " + realCache + "]"; } private class PermanentVFSCache extends MapVFSCache { private boolean started; protected Map createMap() { return new TreeMap(); } @Override public void start() throws Exception { super.start(); started = true; } /** * Is the cache started. * * @return the started flag */ public boolean isStarted() { return started; } } }libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/cache/LRUVFSCache.java0000644000175000017500000000510211112474030031573 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.cache; import java.util.Map; import org.jboss.util.LRUCachePolicy; import org.jboss.virtual.VFSUtils; /** * LRU cache policy vfs cache. * * @author Ales Justin */ public class LRUVFSCache extends CachePolicyVFSCache { private Integer min; private Integer max; public LRUVFSCache() { } public LRUVFSCache(Integer min, Integer max) { this.min = min; this.max = max; } public LRUVFSCache(Map properties) { super(properties); } protected LRUCachePolicy createCachePolicy() { if (min == null) min = getInteger(readInstanceProperties(VFSUtils.VFS_CACHE_KEY + ".LRUPolicyCaching.min", null, true)); if (max == null) max = getInteger(readInstanceProperties(VFSUtils.VFS_CACHE_KEY + ".LRUPolicyCaching.max", null, true)); if (min == null || max == null) throw new IllegalArgumentException("Missing min (" + min + ") or max (" + max + ")."); log.debug("Creating LRU cache policy, min: " + min + ", max: " + max); return new LRUCachePolicy(min, max); } /** * Set min. * * @param min the min */ public void setMin(Integer min) { this.min = min; } /** * set max. * * @param max the max */ public void setMax(Integer max) { this.max = max; } public String toString() { return "LRUVFSCache{min=" + min + ", max=" + max + "}"; } }libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/cache/TimedVFSCache.java0000644000175000017500000001074511112474030032204 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.cache; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.TreeMap; import org.jboss.util.TimedCachePolicy; import org.jboss.virtual.VFSUtils; import org.jboss.virtual.spi.VFSContext; /** * Timed cache policy vfs cache. * * @author Ales Justin */ public class TimedVFSCache extends CachePolicyVFSCache { private Integer defaultLifetime; private Boolean threadSafe; private Integer resolution; private String info; public TimedVFSCache() { } public TimedVFSCache(Integer defaultLifetime) { this(defaultLifetime, null, null); } public TimedVFSCache(Integer defaultLifetime, Boolean threadSafe, Integer resolution) { this.defaultLifetime = defaultLifetime; this.threadSafe = threadSafe; this.resolution = resolution; } public TimedVFSCache(Map properties) { super(properties); } @Override @SuppressWarnings("unchecked") public Iterable getCachedContexts() { TimedCachePolicy tcp = getPolicy(); List keys = tcp.getValidKeys(); if (keys != null && keys.isEmpty() == false) { Map contexts = new TreeMap(); for (Object key : keys) contexts.put(key, (VFSContext)tcp.peek(key)); return contexts.values(); } return Collections.emptySet(); } protected TimedCachePolicy createCachePolicy() { if (defaultLifetime == null) defaultLifetime = getInteger(readInstanceProperties(VFSUtils.VFS_CACHE_KEY + ".TimedPolicyCaching.lifetime", null, true)); if (threadSafe == null) threadSafe = Boolean.valueOf(readInstanceProperties(VFSUtils.VFS_CACHE_KEY + ".TimedPolicyCaching.threadSafe", Boolean.TRUE, true).toString()); if (resolution == null) resolution = getInteger(readInstanceProperties(VFSUtils.VFS_CACHE_KEY + ".TimedPolicyCaching.resolution", null, true)); log.debug("Creating timed cache policy, lifetime: " + defaultLifetime + ", threadSafe: " + threadSafe + ", resolution: " + resolution); TimedCachePolicy tcp; if (defaultLifetime == null) tcp = new TimedCachePolicy(); else if (resolution != null) tcp = new TimedCachePolicy(defaultLifetime, threadSafe, resolution); else tcp = new TimedCachePolicy(defaultLifetime); info = getCacheName() + "{lifetime=" + tcp.getDefaultLifetime() + ", resolution=" + tcp.getResolution() + "}"; return tcp; } /** * Get the cache name. * * @return the cache name */ protected String getCacheName() { return "TimedVFSCache"; } /** * Set default lifetime. * * @param defaultLifetime the default lifetime */ public void setDefaultLifetime(Integer defaultLifetime) { this.defaultLifetime = defaultLifetime; } /** * Set threadsafe flag. * * @param threadSafe the threadsafe flag */ public void setThreadSafe(Boolean threadSafe) { this.threadSafe = threadSafe; } /** * The resollution. * * @param resolution the resolution */ public void setResolution(Integer resolution) { this.resolution = resolution; } public String toString() { return info; } }libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/cache/AbstractVFSCache.java0000644000175000017500000001507511112474030032706 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.cache; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.Arrays; import java.util.concurrent.locks.ReentrantReadWriteLock; import org.jboss.logging.Logger; import org.jboss.virtual.VFSUtils; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VirtualFileHandler; import org.jboss.virtual.spi.cache.CacheStatistics; import org.jboss.virtual.spi.cache.VFSCache; /** * Abstract vfs cache. * * @author Ales Justin */ public abstract class AbstractVFSCache implements VFSCache, CacheStatistics { protected Logger log = Logger.getLogger(getClass()); private ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); private long timestamp; public long lastInsert() { return timestamp; } /** * Is cache valid. */ protected abstract void check(); public VirtualFile getFile(URI uri) throws IOException { if (uri == null) throw new IllegalArgumentException("Null uri."); check(); VFSContext context = findContext(uri); if (context != null) { VirtualFileHandler root = context.getRoot(); String relativePath = getRelativePath(context, uri); VirtualFileHandler child = root.getChild(relativePath); if (child == null) throw new IOException("Cannot find child, root=" + root + ", relativePath=" + relativePath); return child.getVirtualFile(); } return null; } /** * Get relative path. * * @param context the vfs context * @param uri the uri * @return uri's relative path to context's root */ protected String getRelativePath(VFSContext context, URI uri) { String uriPath = stripProtocol(uri); String contextKey = getKey(context); return uriPath.substring(contextKey.length()); } public VirtualFile getFile(URL url) throws IOException { if (url == null) throw new IllegalArgumentException("Null url."); check(); try { return getFile(VFSUtils.toURI(url)); } catch (URISyntaxException e) { IOException ioe = new IOException(); ioe.initCause(e); throw ioe; } } /** * Strip protocol from url string. * * @param uri the uri * @return uri's path string */ protected static String stripProtocol(URI uri) { String path = uri.getPath(); if (path != null && path.length() > 0) { StringBuilder sb = new StringBuilder(path); if (sb.charAt(0) != '/') sb.insert(0, '/'); if (sb.charAt(sb.length() - 1) != '/') sb.append('/'); path = sb.toString(); } else { path = "/"; } return path; } /** * Get the cached context. * * @param path the path to match * @return cached context or null if not found */ protected abstract VFSContext getContext(String path); /** * Find cached context. * This method must take read lock. * * @param uri the uri to match * @return found context or null */ protected abstract VFSContext findContext(URI uri); /** * Get path key. * * @param context the vfs context * @return contex's root path w/o protocol */ protected static String getKey(VFSContext context) { URI uri = context.getRootURI(); return stripProtocol(uri); } public void putContext(VFSContext context) { if (context == null) throw new IllegalArgumentException("Null context"); check(); if (log.isTraceEnabled()) { StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); log.trace("VFSContext: " + context + ", Stack-trace:\n" + Arrays.toString(stackTraceElements)); } String path = getKey(context); writeLock(); try { putContext(path, context); timestamp = System.currentTimeMillis(); } finally { writeUnlock(); } } /** * Put vfs context and its path key into cache. * * @param path the context's path * @param context the vfs context */ protected abstract void putContext(String path, VFSContext context); public void removeContext(VFSContext context) { if (context == null) throw new IllegalArgumentException("Null context"); check(); String path = getKey(context); writeLock(); try { removeContext(path, context); } finally { writeUnlock(); } } /** * Remove vfs context and its path key from cache. * * @param path the context's path * @param context the vfs context */ protected abstract void removeContext(String path, VFSContext context); /** * Read lock. */ protected void readLock() { lock.readLock().lock(); } /** * Read unlock. */ protected void readUnlock() { lock.readLock().unlock(); } /** * Write lock. */ protected void writeLock() { lock.writeLock().lock(); } /** * Write unlock. */ protected void writeUnlock() { lock.writeLock().unlock(); } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/cache/CachePolicyVFSCache.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/cache/CachePolicyVFSCache.ja0000644000175000017500000001363211112474030032774 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.cache; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.Collections; import java.util.Map; import org.jboss.util.CachePolicy; import org.jboss.virtual.spi.VFSContext; /** * Cache policy vfs cache. * * @param exact policy type * @author Ales Justin */ public abstract class CachePolicyVFSCache extends PathMatchingVFSCache { private T policy; private Map properties; protected CachePolicyVFSCache() { } protected CachePolicyVFSCache(Map properties) { this.properties = properties; } public Iterable getCachedContexts() { // cannot pull all cache entries from policy return Collections.emptySet(); } public int size() { return policy != null ? policy.size() : -1; } /** * Get the policy. * Run check before. * * @return the policy */ protected T getPolicy() { check(); return policy; } protected void check() { if (policy == null) throw new IllegalArgumentException("Cache needs to be started first."); } public void start() throws Exception { policy = createCachePolicy(); if (policy == null) throw new IllegalArgumentException("Policy is null."); policy.create(); try { policy.start(); } catch (Exception e) { try { policy.destroy(); } catch (Exception ignored) { } throw e; } } public void stop() { if (policy != null) { try { policy.stop(); } catch (Exception ignored) { } try { policy.destroy(); } catch (Exception ignored) { } finally { policy = null; } } } public void flush() { if (policy != null) policy.flush(); } protected VFSContext getContext(String path) { return VFSContext.class.cast(policy.get(path)); } protected void putContext(String path, VFSContext context) { Object result = policy.peek(path); if (result == null) policy.insert(path, context); } public void removeContext(String key, VFSContext context) { policy.remove(key); } /** * Create cache policy. * * @return the cache policy */ protected abstract T createCachePolicy(); /** * Read instance properties. * * @param key the property key * @param defaultValue the default value * @param useSystemProperties do we fallback to system properties * @return property or default value */ protected Object readInstanceProperties(final String key, final Object defaultValue, final boolean useSystemProperties) { Object result = null; if (properties != null && properties.isEmpty() == false) { result = properties.get(key); } if (result == null) { if (useSystemProperties) { String stringDefaultValue = defaultValue != null ? defaultValue.toString() : null; result = readSystemProperty(key, stringDefaultValue); } else result = defaultValue; } return result; } /** * Read system property. * * @param key the property key * @param defaultValue the default value * @return system property or default value */ protected static String readSystemProperty(final String key, final String defaultValue) { SecurityManager sm = System.getSecurityManager(); if (sm == null) return System.getProperty(key, defaultValue); else return AccessController.doPrivileged(new PrivilegedAction() { public String run() { return System.getProperty(key, defaultValue); } }); } /** * Parse integer. * * @param value the string int value * @return integer value or null */ protected static Integer parseInteger(String value) { if (value == null) return null; return Integer.parseInt(value); } /** * Get integer from value. * * @param value the value * @return integer value or null */ protected static Integer getInteger(Object value) { if (value == null) return null; else if (value instanceof Number) return Number.class.cast(value).intValue(); else return Integer.parseInt(value.toString()); } }libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/cache/WeakRefVFSCache.java0000644000175000017500000000270111104021156032455 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.cache; import java.util.Map; import org.jboss.util.collection.WeakValueTreeMap; import org.jboss.virtual.spi.VFSContext; /** * WeakRef vfs cache. * * @author Ales Justin */ public class WeakRefVFSCache extends MapVFSCache { @SuppressWarnings("unchecked") protected Map createMap() { return new WeakValueTreeMap(); } }libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/cache/IterableVFSCache.java0000644000175000017500000000360211104021156032661 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.cache; import java.net.URI; import org.jboss.virtual.spi.VFSContext; /** * Iterable vfs cache. * * Knows how to iterate over cache keys, * matching them to uri's path. * * @author Ales Justin */ public abstract class IterableVFSCache extends AbstractVFSCache { /** * Get cache keys. * * @return the cache keys */ protected abstract Iterable getKeys(); protected VFSContext findContext(URI uri) { String uriString = stripProtocol(uri); Iterable keys = getKeys(); readLock(); try { for (String key : keys) { if (uriString.startsWith(key)) return getContext(key); } } finally { readUnlock(); } return null; } }././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/cache/PathMatchingVFSCache.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/cache/PathMatchingVFSCache.j0000644000175000017500000000410411104021156033007 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.cache; import java.net.URI; import java.util.List; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.plugins.vfs.helpers.PathTokenizer; /** * Iterable vfs cache. * * @author Ales Justin */ public abstract class PathMatchingVFSCache extends AbstractVFSCache { /** * Match the uri's path with cached contexts path. * * @param uri the uri to match * @return found context or null */ protected VFSContext findContext(URI uri) { String uriString = stripProtocol(uri); List tokens = PathTokenizer.getTokens(uriString); StringBuilder sb = new StringBuilder("/"); readLock(); try { for (String token : tokens) { sb.append(token).append("/"); VFSContext context = getContext(sb.toString()); if (context != null) return context; } } finally { readUnlock(); } return null; } }libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/cache/SoftRefVFSCache.java0000644000175000017500000000270111104021156032501 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.cache; import java.util.Map; import org.jboss.util.collection.SoftValueTreeMap; import org.jboss.virtual.spi.VFSContext; /** * SoftRef vfs cache. * * @author Ales Justin */ public class SoftRefVFSCache extends MapVFSCache { @SuppressWarnings("unchecked") protected Map createMap() { return new SoftValueTreeMap(); } }././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/cache/IterableTimedVFSCache.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/cache/IterableTimedVFSCache.0000644000175000017500000000473511112474030033014 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.cache; import java.util.Map; import java.util.List; import java.util.Set; import java.util.TreeSet; import java.net.URI; import org.jboss.virtual.spi.VFSContext; import org.jboss.util.TimedCachePolicy; /** * Iterable timed cache policy vfs cache. * * @author Ales Justin */ public class IterableTimedVFSCache extends TimedVFSCache { public IterableTimedVFSCache() { } public IterableTimedVFSCache(Integer defaultLifetime) { super(defaultLifetime); } public IterableTimedVFSCache(Integer defaultLifetime, Boolean threadSafe, Integer resolution) { super(defaultLifetime, threadSafe, resolution); } public IterableTimedVFSCache(Map properties) { super(properties); } @SuppressWarnings("unchecked") protected VFSContext findContext(URI uri) { String uriString = stripProtocol(uri); TimedCachePolicy tcp = getPolicy(); List validKeys = tcp.getValidKeys(); Set keys = new TreeSet(validKeys); readLock(); try { for (String key : keys) { if (uriString.startsWith(key)) return getContext(key); } } finally { readUnlock(); } return null; } protected String getCacheName() { return "Iterable" + super.getCacheName(); } }libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/0000755000175000017500000000000011146622526027422 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/file/0000755000175000017500000000000011146622524030337 5ustar twernertwerner././@LongLink0000000000000000000000000000016300000000000011565 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/file/FileSystemContextFactory.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/file/FileSystemConte0000644000175000017500000000433310713124640033335 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2005, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.file; import java.io.IOException; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import org.jboss.virtual.plugins.context.AbstractContextFactory; import org.jboss.virtual.spi.VFSContext; /** * A file system context factory * * @author Scott.Stark@jboss.org * @author adrian@jboss.org * @version $Revision: 44217 $ */ public class FileSystemContextFactory extends AbstractContextFactory { public FileSystemContextFactory() { super("file", "vfsfile"); } public VFSContext getVFS(URL root) throws IOException { try { return new FileSystemContext(fromVFS(root)); } catch(URISyntaxException e) { MalformedURLException ex = new MalformedURLException("non-URI compliant URL"); ex.initCause(e); throw ex; } } public VFSContext getVFS(URI root) throws IOException { try { return new FileSystemContext(fromVFS(root)); } catch(URISyntaxException e) { MalformedURLException ex = new MalformedURLException("non-URI compliant URI"); ex.initCause(e); throw ex; } } } ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/file/FileSystemContext.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/file/FileSystemConte0000644000175000017500000003263311137562372033352 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.file; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.List; import java.util.Properties; import org.jboss.logging.Logger; import org.jboss.virtual.VFSUtils; import org.jboss.virtual.plugins.context.AbstractVFSContext; import org.jboss.virtual.plugins.context.DelegatingHandler; import org.jboss.virtual.plugins.context.jar.JarHandler; import org.jboss.virtual.plugins.context.jar.JarUtils; import org.jboss.virtual.plugins.context.zip.ZipEntryContext; import org.jboss.virtual.spi.LinkInfo; import org.jboss.virtual.spi.VirtualFileHandler; /** * FileSystemContext. * * Jar archives are processed through {@link org.jboss.virtual.plugins.context.zip.ZipEntryContext}. * * To switch back to {@link org.jboss.virtual.plugins.context.jar.JarHandler} * set a system property jboss.vfs.forceVfsJar=true * * Explicit case sensitive path checking can be turned on by adding an option parameter * ?caseSensitive=true to context URL. This may be desired when native filesystem is not * case sensitive (i.e. if running on Windows). * * Case sesitivity can be turned on for all context URLs by setting system property * jboss.vfs.forceCaseSensitive=true. * * @author Adrian Brock * @author Ales Justin * @author Marko Strukelj * @version $Revision: 1.1 $ */ public class FileSystemContext extends AbstractVFSContext { private static final Logger log = Logger.getLogger(FileSystemContext.class); /** true if forcing fallback to vfsjar from default vfszip */ private static boolean forceVfsJar; /** true if case sensitivity should be enforced */ private static boolean forceCaseSensitive; static { forceVfsJar = AccessController.doPrivileged(new CheckForceVfsJar()); if (forceVfsJar) log.info("VFS forced fallback to vfsjar is enabled."); forceCaseSensitive = AccessController.doPrivileged(new CheckForceCaseSensitive()); if (forceCaseSensitive) log.debug("VFS forced case sensitivity is enabled."); } /** The temp file */ private transient File file; /** The root file */ private VirtualFileHandler root; /** * Get the file for a url * * @param uri the url * @return the file * @throws IOException for any error accessing the file system * @throws URISyntaxException if cannot create URI * @throws IllegalArgumentException for a null url */ private static File getFile(URI uri) throws IOException, URISyntaxException { if (uri == null) throw new IllegalArgumentException("Null uri"); // This ctor will not accept uris with authority, fragment or query if(uri.getAuthority() != null || uri.getFragment() != null || uri.getQuery() != null) uri = new URI("file", null, uri.getPath(), null); return new File(uri); } /** * Get the url for a file * * @param file the file * @return the url * @throws IOException for any error accessing the file system * @throws IllegalArgumentException for a null file */ private static URI getFileURI(File file) throws IOException { if (file == null) throw new IllegalArgumentException("Null file"); URI url = file.toURI(); String path = url.getPath(); if (file.isDirectory() == false) { path = VFSUtils.fixName(path); } else if (path.endsWith("/") == false) { path = path + '/'; } try { return new URI("file", null, path, null); } catch(URISyntaxException e) { // Should not be possible throw new IllegalStateException("Failed to convert file.toURI", e); } } /** * Create a new FileSystemContext. * * @param rootURL the root url * @throws IOException for an error accessing the file system * @throws URISyntaxException for an error parsing the uri */ public FileSystemContext(URL rootURL) throws IOException, URISyntaxException { this(VFSUtils.toURI(rootURL)); } /** * Create a new FileSystemContext. * * @param rootURI the root uri * @throws IOException for an error accessing the file system * @throws URISyntaxException if cannot create URI */ public FileSystemContext(URI rootURI) throws IOException, URISyntaxException { this(rootURI, getFile(rootURI)); } /** * Create a new FileSystemContext. * * @param file the root file * @throws IOException for an error accessing the file system * @throws IllegalArgumentException for a null file * @throws URISyntaxException for an error parsing the uri */ public FileSystemContext(File file) throws IOException, URISyntaxException { this(getFileURI(file), file); } /** * Create a new FileSystemContext. * * @param rootURI the root uri * @param file the file * @throws IOException for an error accessing the file system */ private FileSystemContext(URI rootURI, File file) throws IOException { super(rootURI); this.file = file; } public String getName() { return (root != null) ? root.getName() : file.getName(); } public VirtualFileHandler getRoot() throws IOException { if (root == null) { root = createVirtualFileHandler(null, file); if (root == null) throw new java.io.FileNotFoundException((file == null ? "" : file.getName()) + " doesn't exist. (rootURI: " + getRootURI() + ", file: " + file + ")"); file = null; // nullify temp file } return root; } /** * Create a new virtual file handler * * @param parent the parent * @param file the file * @return the handler * @throws IOException for any error accessing the file system * @throws IllegalArgumentException for a null file */ public VirtualFileHandler createVirtualFileHandler(VirtualFileHandler parent, File file) throws IOException { if (file == null) throw new IllegalArgumentException("Null file"); String name = file.getName(); if (file.isFile() && JarUtils.isArchive(name)) { if (exists(file) == false) return null; if (forceVfsJar) { try { return new JarHandler(this, parent, file, file.toURL(), name); } catch(IOException e) { log.debug("Exception while trying to handle file (" + name + ") as a jar: " + e.getMessage()); } } else { try { return mountZipFS(parent, name, file); } catch (Exception e) { log.debug("IGNORING: Exception while trying to handle file (" + name + ") as a jar through ZipEntryContext: ", e); } } } return createVirtualFileHandler(parent, file, getFileURI(file)); } /** * Create zip file system. * * @param parent the parent * @param name the name * @param file the file * @return new zip fs delegating handler * @throws IOException for any error * @throws URISyntaxException for any URI syntax error */ protected DelegatingHandler mountZipFS(VirtualFileHandler parent, String name, File file) throws IOException, URISyntaxException { DelegatingHandler delegator = new DelegatingHandler(this, parent, name); URL fileUrl = file.toURL(); URL delegatorUrl = fileUrl; if (parent != null) delegatorUrl = getChildURL(parent, name); delegatorUrl = setOptionsToURL(delegatorUrl); ZipEntryContext ctx = new ZipEntryContext(delegatorUrl, delegator, fileUrl); VirtualFileHandler handler = ctx.getRoot(); delegator.setDelegate(handler); return delegator; } /** * Create a new virtual file handler * * @param parent the parent * @param file the file * @param uri the uri * @return the handler * @throws IOException for any error accessing the file system * @throws IllegalArgumentException for a null file */ public VirtualFileHandler createVirtualFileHandler(VirtualFileHandler parent, File file, URI uri) throws IOException { if (file == null) throw new IllegalArgumentException("Null file"); if (uri == null) throw new IllegalArgumentException("Null uri"); VirtualFileHandler handler = null; if(VFSUtils.isLink(file.getName())) { handler = createLinkHandler(parent, file, null); } else if (exists(file) == false && parent != null) { // See if we can resolve this to a link in the parent if (parent instanceof FileHandler) handler = ((FileHandler) parent).getChildLink(file.getName()); } else if (exists(file)) { handler = new FileHandler(this, parent, file, uri); } return handler; } /** * Create a new LinkHandler from .vfslink.properties file. * A link name is derived from file name by cutting off .vfslink.properties suffix * * @param parent the parent handler * @param file .vfslink.properties file * @param linkNameCondition condition - if not null new LinkHandler will only be created if link name * extracted from the file name matches linkNameCondition * @return newly created LinkHandler * @throws IOException for any error */ LinkHandler createLinkHandler(VirtualFileHandler parent, File file, String linkNameCondition) throws IOException { URI uri = file.toURI(); LinkHandler handler = null; Properties props = new Properties(); FileInputStream fis = new FileInputStream(file); try { List links = VFSUtils.readLinkInfo(fis, file.getName(), props); String name = file.getName(); name = name.substring(0, name.indexOf(VFSUtils.VFS_LINK_INFIX)); if (name.length() == 0 || ".".equals(name) || "..".equals(name)) throw new IOException("Invalid link name: " + name + " (generated from file: " + file + ")"); if (linkNameCondition == null || linkNameCondition.equals(name)) handler = new LinkHandler(this, parent, uri, name, links); } catch(URISyntaxException e) { IOException ex = new IOException("Failed to parse link URIs"); ex.initCause(e); throw ex; } finally { try { fis.close(); } catch(IOException e) { log.debug("Exception closing file input stream: " + fis, e); } } return handler; } /** * Tests if file exists taking case sensitivity into account - if it's enabled * * @param file file to check * @return true if file exists * @throws IOException for any error */ protected boolean exists(File file) throws IOException { // if force case sensitive is enabled - extra check is required boolean isCaseSensitive = forceCaseSensitive; if (isCaseSensitive == false) { String flag = getOptions().get(VFSUtils.CASE_SENSITIVE_QUERY); isCaseSensitive = Boolean.valueOf(flag); } if (isCaseSensitive && file.getCanonicalFile().getName().equals(file.getName()) == false) return false; return file.exists(); } /** * Is forceCaseSensitive enabled * * Only relevant for native filesystems * that are not case sensitive * * @return true if case sensitivity is enabled */ public boolean isForcedCaseSensitive() { return forceCaseSensitive; } private static class CheckForceVfsJar implements PrivilegedAction { public Boolean run() { String forceString = System.getProperty(VFSUtils.FORCE_VFS_JAR_KEY, "false"); return Boolean.valueOf(forceString); } } private static class CheckForceCaseSensitive implements PrivilegedAction { public Boolean run() { String forceString = System.getProperty(VFSUtils.FORCE_CASE_SENSITIVE_KEY, "false"); return Boolean.valueOf(forceString); } } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/file/SecurityActions.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/file/SecurityActions0000644000175000017500000000446210573100027033410 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2007, Red Hat Middleware LLC, and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.file; import java.io.File; /** * Package priviledged actions. * * @author Scott.Stark@jboss.org * @version $Revision: 61100 $ */ class SecurityActions { /** * Actions for File access interface FileActions { FileActions PRIVILEGED = new FileActions() { private final PrivilegedExceptionAction exAction = new PrivilegedExceptionAction() { public Object run() throws Exception { return (Subject) PolicyContext.getContext(SUBJECT_CONTEXT_KEY); } }; public Subject getContextSubject() throws PolicyContextException { try { return (Subject) AccessController.doPrivileged(exAction); } catch(PrivilegedActionException e) { Exception ex = e.getException(); if( ex instanceof PolicyContextException ) throw (PolicyContextException) ex; else throw new UndeclaredThrowableException(ex); } } }; FileActions NON_PRIVILEGED = new FileActions() { }; public boolean isFile(File f); public boolean isHidden(File f); } */ } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/file/LinkHandler.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/file/LinkHandler.jav0000644000175000017500000002221711045137324033235 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.file; import java.io.IOException; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import org.jboss.virtual.VFSUtils; import org.jboss.virtual.plugins.context.AbstractURLHandler; import org.jboss.virtual.plugins.context.DelegatingHandler; import org.jboss.virtual.plugins.context.StructuredVirtualFileHandler; import org.jboss.virtual.plugins.vfs.helpers.PathTokenizer; import org.jboss.virtual.spi.LinkInfo; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VFSContextFactory; import org.jboss.virtual.spi.VFSContextFactoryLocator; import org.jboss.virtual.spi.VirtualFileHandler; /** * A handler for link directories. * * @author Scott.Stark@jboss.org * @version $Revision: 1.1 $ */ public class LinkHandler extends AbstractURLHandler implements StructuredVirtualFileHandler { private static final long serialVersionUID = 1; /** The link information */ private List links; /** The link targets */ private HashMap linkTargets = new HashMap(3); class ParentOfLink extends AbstractURLHandler implements StructuredVirtualFileHandler { private static final long serialVersionUID = 1; private HashMap children = new HashMap(1); public ParentOfLink(VFSContext context, VirtualFileHandler parent, URL url, String name) { super(context, parent, url, name); try { setVfsUrl(new URL("vfs" + url.toString())); } catch (MalformedURLException e) { throw new RuntimeException(e); } } void addChild(VirtualFileHandler child, String name) { children.put(name, child); } public VirtualFileHandler createChildHandler(String name) throws IOException { return children.get(name); } public VirtualFileHandler getChild(String path) throws IOException { return structuredFindChild(path); } public boolean removeChild(String name) throws IOException { return children.remove(name) != null; } public List getChildren(boolean ignoreErrors) throws IOException { return Collections.unmodifiableList(new ArrayList(children.values())); } public boolean isLeaf() throws IOException { return false; } public boolean isNested() throws IOException { return false; } } /** * Create a new LinkHandler. * * @param context the context * @param parent the parent * @param uri the uri * @param name the name * @param links the links * @throws IOException for an error accessing the file system * @throws IllegalArgumentException for a null context, url * @throws URISyntaxException if the uri cannot be parsed */ public LinkHandler(FileSystemContext context, VirtualFileHandler parent, URI uri, String name, List links) throws IOException, URISyntaxException { // TODO: This URL is not consistent with the getName, but does point to the raw link file super(context, parent, uri.toURL(), name); this.links = links; setVfsUrl(new URL("vfs" + uri.toURL().toString())); // Create handlers for the links and add for(LinkInfo link : links) { String linkName = link.getName(); if( linkName == null ) linkName = VFSUtils.getName(link.getLinkTarget()); if( linkName != null ) { List paths = PathTokenizer.getTokens(linkName); int n = 0; VirtualFileHandler linkParent = this; String atom; // Look for an existing parent VirtualFileHandler previous; for(; n < paths.size()-1; n ++) { previous = linkParent; atom = paths.get(n); linkParent = getChildPrivate(previous, atom); if (linkParent == null) { linkParent = previous; break; } } // Create any missing parents for(; n < paths.size()-1; n ++) { atom = paths.get(n); URL polURL = new URL(linkParent.toURI().toURL(), atom); ParentOfLink pol = new ParentOfLink(this.getVFSContext(), linkParent, polURL, atom); if( linkParent == this ) { linkTargets.put(atom, pol); } else if (linkParent instanceof ParentOfLink) { ParentOfLink prevPOL = (ParentOfLink) linkParent; prevPOL.addChild(pol, atom); } else { throw new IOException("Link parent not ParentOfLink."); } linkParent = pol; } // Create the link handler atom = paths.get(n); VirtualFileHandler linkHandler = createLinkHandler(linkParent, atom, link.getLinkTarget()); if( linkParent == this ) { linkTargets.put(atom, linkHandler); } else if (linkParent instanceof ParentOfLink) { ParentOfLink prevPOL = (ParentOfLink) linkParent; prevPOL.addChild(linkHandler, atom); } } } } private VirtualFileHandler getChildPrivate(VirtualFileHandler parent, String name) throws IOException { // avoid infinite recursion due to LinkHandler delegation during init phase if (parent instanceof LinkHandler) return ((LinkHandler) parent).structuredFindChild(name); else return parent.getChild(name); } public boolean isLeaf() { return false; } public boolean isNested() throws IOException { return false; } public List getChildren(boolean ignoreErrors) throws IOException { // LinkHandler delegation: if configuration has changed, delegate to properly configured LinkHandler VirtualFileHandler upToDateHandler = getParent().getChild(getName()); if (upToDateHandler != this) return upToDateHandler.getChildren(ignoreErrors); else return new ArrayList(linkTargets.values()); } public VirtualFileHandler createChildHandler(String name) throws IOException { return linkTargets.get(name); } public VirtualFileHandler getChild(String path) throws IOException { // LinkHandler delegation: if configuration has changed, delegate to properly configured LinkHandler VirtualFileHandler upToDateHandler = getParent().getChild(getName()); if (upToDateHandler != this) return upToDateHandler.getChild(path); else return structuredFindChild(path); } public boolean removeChild(String name) throws IOException { // LinkHandler delegation: if configuration has changed, delegate to properly configured LinkHandler VirtualFileHandler upToDateHandler = getParent().getChild(getName()); if (upToDateHandler != this) return upToDateHandler.removeChild(name); else return linkTargets.remove(name) != null; } @Override protected void doClose() { super.doClose(); links.clear(); } protected VirtualFileHandler createLinkHandler(VirtualFileHandler parent, String name, URI linkURI) throws IOException { VFSContextFactory factory = VFSContextFactoryLocator.getFactory(linkURI); VFSContext context = factory.getVFS(linkURI); VirtualFileHandler rootHandler = context.getRoot(); // Wrap the handler in a delegate so we can change the parent and name // TODO: if the factory caches contexts the root handler may not point to the link return new DelegatingHandler(this.getVFSContext(), parent, name, rootHandler); } } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/file/FileHandler.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/file/FileHandler.jav0000644000175000017500000002511011137562372033221 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.file; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.ObjectInputStream; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.jboss.util.file.Files; import org.jboss.virtual.VFSUtils; import org.jboss.virtual.plugins.context.AbstractURLHandler; import org.jboss.virtual.plugins.context.StructuredVirtualFileHandler; import org.jboss.virtual.spi.VirtualFileHandler; /** * FileHandler. * * @author Adrian Brock * @author Scott.Stark@jboss.org * @author Marko Strukelj * @version $Revision: 1.1 $ */ public class FileHandler extends AbstractURLHandler implements StructuredVirtualFileHandler { private static final long serialVersionUID = 1; /** The file */ private transient File file; /** The child cache */ private transient Map childCache = Collections.synchronizedMap(new HashMap()); /** * Create a new FileHandler. * * @param context the context * @param parent the parent * @param file the file * @param url the url * @throws IOException for an error accessing the file system * @throws IllegalArgumentException for a null context, url */ public FileHandler(FileSystemContext context, VirtualFileHandler parent, File file, URL url) throws IOException { super(context, parent, url, file.getName()); this.file = file; if (file.exists() == false) throw new FileNotFoundException("File does not exist: " + file.getCanonicalPath()); setVfsUrl(new URL("vfs" + url)); // do cache here - on the file cachedLastModified = getLastModified(); } /** * Create a new FileHandler * * @param context the context * @param parent the parent * @param file the file * @param uri the uri * @throws IOException for an error accessing the file system * @throws IllegalArgumentException for a null context, uri */ public FileHandler(FileSystemContext context, VirtualFileHandler parent, File file, URI uri) throws IOException { this(context, parent, file, uri.toURL()); } protected void initCacheLastModified() { // ignore that url.openConnection.lastModified } public URL toVfsUrl() throws MalformedURLException, URISyntaxException { if (getVfsUrl() == null) { setVfsUrl(new URL("vfs" + getURL())); } return getVfsUrl(); } public URL getRealURL() throws IOException, URISyntaxException { return getURL(); } @Override public FileSystemContext getVFSContext() { return (FileSystemContext) super.getVFSContext(); } /** * Get the file for this file handler * * @return the file */ protected File getFile() { checkClosed(); return file; } @Override public long getLastModified() { return getFile().lastModified(); } public boolean exists() throws IOException { return getFile().exists(); } @Override public long getSize() { return getFile().length(); } public boolean isLeaf() { return getFile().isFile(); } public boolean isHidden() { return getFile().isHidden(); } public boolean isNested() throws IOException { return false; } @Override public void cleanup() { if (isTemporary()) { try { delete(2000); } catch (Exception ignored) { } } } public boolean delete(int gracePeriod) throws IOException { // we can bypass the checkClosed File f = file; boolean exists = f.exists(); if (exists == false) return false; if (Files.delete(f) == false) { long endOfGrace = System.currentTimeMillis() + gracePeriod; while(System.currentTimeMillis() < endOfGrace) { boolean done = Files.delete(f); if (done) { childCache.remove(f.getName()); return true; } try { Thread.sleep(100); } catch (InterruptedException e) { IOException ioe = new IOException("Interrupted: " + e); ioe.initCause(e); throw ioe; } } return false; } else { childCache.remove(f.getName()); return true; } } public List getChildren(boolean ignoreErrors) throws IOException { File parent = getFile(); File[] files = parent.listFiles(); if (files == null) throw new IOException("Error listing files: " + parent.getCanonicalPath()); // We need to validate the files list due to jdk bug 6192331 List tmpFiles = new ArrayList(); for (File file : files) { if( file.canRead() == true ) tmpFiles.add(file); } if (tmpFiles.isEmpty()) return Collections.emptyList(); files = tmpFiles.toArray(new File[tmpFiles.size()]); FileSystemContext context = getVFSContext(); List result = new ArrayList(); Map newCache = Collections.synchronizedMap(new HashMap()); Map oldCache = childCache; // fill up a new cache with old entries // old entries no longer existing in directory are purged by not being added to new cache // we cache handlers so that things like JARs are recreated (optimization) for (File file : files) { try { VirtualFileHandler handler; handler = oldCache.get(file.getName()); // if underlying file has been modified then create a new handler instead of using the cached one if (handler != null && handler.hasBeenModified()) { handler = null; } if (handler == null) { handler = context.createVirtualFileHandler(this, file); } if (handler != null) { result.add(handler); newCache.put(file.getName(), handler); } } catch (IOException e) { if (ignoreErrors) log.trace("Ignored: " + e); else throw e; } } // cleanup old entries childCache = newCache; return result; } public VirtualFileHandler createChildHandler(String name) throws IOException { File parentFile = getFile(); File child = new File(parentFile, name); VirtualFileHandler handler = childCache.get(name); // if a child has already been created use that // if the child has been modified on disk then create a new handler if (handler != null && handler.hasBeenModified()) { handler = null; } if (handler == null) { FileSystemContext context = getVFSContext(); handler = context.createVirtualFileHandler(this, child); if (handler != null) childCache.put(name, handler); } return handler; } public VirtualFileHandler getChild(String path) throws IOException { return structuredFindChild(path); } /** * Find an existing LinkHandler or create a new one. * * @param name a handler name * @return cached or newly created LinkHandler * @throws IOException for any error */ LinkHandler getChildLink(String name) throws IOException { VirtualFileHandler handler = childCache.get(name); if (handler == null) { // check if .vfslink.properties file exists for this name File file = new File(getFile(), name + VFSUtils.VFS_LINK_PROPERTIES_SUFFIX); if (file.isFile()) { FileSystemContext ctx = getVFSContext(); return ctx.createLinkHandler(this, file, name); } } else if (handler instanceof LinkHandler) { LinkHandler link = (LinkHandler) handler; if (link.exists()) { // detect any changes in configuration FileSystemContext ctx = getVFSContext(); try { return ctx.createLinkHandler(this, new File(link.toURI()), name); } catch (URISyntaxException e) { IOException ex = new IOException("Failed to convert link to URI: " + link); ex.initCause(e); throw ex; } } else { // remove from cache childCache.remove(name); } } return null; } public boolean removeChild(String name) throws IOException { return (childCache.remove(name) != null); } protected void internalReplaceChild(VirtualFileHandler original, VirtualFileHandler replacement) { childCache.put(original.getName(), replacement); } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); // Initialize the transient values this.file = new File(getURL().getPath()); this.childCache = Collections.synchronizedMap(new HashMap()); } } ././@LongLink0000000000000000000000000000016000000000000011562 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/AbstractVirtualFileHandler.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/AbstractVirtualFileH0000644000175000017500000004723411137562372033403 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectInputStream.GetField; import java.io.ObjectOutputStream; import java.io.ObjectOutputStream.PutField; import java.io.ObjectStreamField; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; import org.jboss.logging.Logger; import org.jboss.virtual.VFSUtils; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.plugins.vfs.helpers.PathTokenizer; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VFSContextFactory; import org.jboss.virtual.spi.VFSContextFactoryLocator; import org.jboss.virtual.spi.VirtualFileHandler; /** * AbstractVirtualFileHandler. * * @author Ales Justin * @author Adrian Brock * @author Scott.Stark@jboss.org * @author Marko Strukelj * @version $Revision: 1.1 $ */ public abstract class AbstractVirtualFileHandler implements VirtualFileHandler { /** The log */ protected static final Logger log = Logger.getLogger(AbstractVirtualFileHandler.class); /** serialVersionUID */ private static final long serialVersionUID = 1L; /** The class serial fields */ private static final ObjectStreamField[] serialPersistentFields = { new ObjectStreamField("rootURI", URI.class), new ObjectStreamField("parent", VirtualFileHandler.class), new ObjectStreamField("name", String.class), new ObjectStreamField("vfsUrl", URL.class) }; /** * The VFS context * * @serialField rootURI URI the VFS context rootURI */ private VFSContext context; /** * The parent * * @serialField parent VirtualFileHandler the virtual file parent */ private VirtualFileHandler parent; /** * The name * * @serialField name String the virtual file name */ private String name; /** * The vfs URL * * @serialField vfsUrl the vfs based url */ private URL vfsUrl; /** The vfsPath */ private transient String vfsPath; /** The reference count */ private transient AtomicInteger references = new AtomicInteger(0); /** The cached last modified */ protected transient long cachedLastModified; /** * Create a new handler * * @param context the context * @param parent the parent * @param name the name * @throws IllegalArgumentException if the context or name is null; */ protected AbstractVirtualFileHandler(VFSContext context, VirtualFileHandler parent, String name) { if (context == null) throw new IllegalArgumentException("Null context"); if (name == null) throw new IllegalArgumentException("Null name"); this.context = context; this.parent = parent; this.name = VFSUtils.fixName(name); this.vfsPath = null; // nullify possible invalid vfsPath initializations when running with debugger } /** * Check if parent exists. */ protected void checkParentExists() { if (parent == null) throw new IllegalArgumentException("Parent must exist!"); } /** * Get child url. * * @param childPath the child path * @param isDirectory is directory * @return full child URL * @throws IOException for any io error * @throws URISyntaxException for any uri error */ protected URL getChildVfsUrl(String childPath, boolean isDirectory) throws IOException, URISyntaxException { checkParentExists(); URL parentVfsUrl = getParent().toVfsUrl(); String vfsUrlString = parentVfsUrl.toString(); if (vfsUrlString.length() > 0 && vfsUrlString.endsWith("/") == false) vfsUrlString += "/"; vfsUrlString += childPath; if (isDirectory && vfsUrlString.endsWith("/") == false) vfsUrlString += "/"; return new URL(vfsUrlString); } /** * Get child path name. * * @param childPath the child path * @param isDirectory is directory * @return full child URL * @throws IOException for any io error */ protected String getChildPathName(String childPath, boolean isDirectory) throws IOException { checkParentExists(); String childPathName = getParent().getPathName(); if (childPathName.length() > 0 && childPathName.endsWith("/") == false) childPathName += "/"; childPathName += childPath; if (isDirectory && childPathName.endsWith("/") == false) childPathName += "/"; return childPathName; } public boolean hasBeenModified() throws IOException { boolean hasBeenModified = false; long last = getLastModified(); if (cachedLastModified != last) { hasBeenModified = cachedLastModified != 0; cachedLastModified = last; } return hasBeenModified; } public String getName() { return name; } /** * Get a pathName relative to most outer context (contexts can be mounted one within other) * * @return pathName */ public String getPathName() { if (vfsPath == null) { StringBuilder pathName = new StringBuilder(); initPath(pathName); vfsPath = pathName.toString(); } return vfsPath; } /** * todo This is a hack until we can fix http://jira.jboss.com/jira/browse/JBMICROCONT-164 * * @param path the path name */ public void setPathName(String path) { this.vfsPath = path; } /** * Get a pathName relative to local context * * @return pathName */ public String getLocalPathName() { try { VirtualFileHandler handler = getLocalVFSContext().getRoot(); String rootPathName = handler.getPathName(); String pathName = getPathName(); int len = rootPathName.length(); if (len == 0) return pathName; else if (rootPathName.length() < pathName.length()) return pathName.substring(len + 1); else return ""; } catch (IOException ex) { log.warn("Failed to compose local path name: context: " + getLocalVFSContext() + ", name: " + getName(), ex); } return getPathName(); } public URL toURL() throws MalformedURLException, URISyntaxException { return toURI().toURL(); } public URL toVfsUrl() throws MalformedURLException, URISyntaxException { return vfsUrl; } public URL getRealURL() throws IOException, URISyntaxException { return toURL(); } /** * Get VFS url. * * @return vfs url */ protected URL getVfsUrl() { return vfsUrl; } /** * Set the vfs URL. * * @param vfsUrl vfs url */ protected void setVfsUrl(URL vfsUrl) { this.vfsUrl = vfsUrl; } /** * Initialise the path into the path name * * @param pathName the path name * @return whether it added anything */ private boolean initPath(StringBuilder pathName) { if (context.getRootPeer() != null) if (initPeerPath(pathName)) return true; if (parent != null) { if (parent instanceof AbstractVirtualFileHandler) { AbstractVirtualFileHandler handler = (AbstractVirtualFileHandler) parent; if (handler.initPath(pathName)) pathName.append('/'); } else { pathName.append(parent.getPathName()); } pathName.append(getName()); return true; } return false; } /** * Initialise the peer path. * * @param pathName the path name * @return whether it added anything */ private boolean initPeerPath(StringBuilder pathName) { VirtualFileHandler grandParent = null; if (parent != null) { try { grandParent = parent.getParent(); } catch(IOException ex) { // if we throw exception here we'll most likely cause an infinite recursion log.warn("AbstractVirtualFileHandler.initPath failed: ctx: " + context + ", parent: " + parent + " name: " + name, ex); } } if (grandParent == null) { VirtualFileHandler peer = context.getRootPeer(); // bypass parent and delegate straight to peer if (peer instanceof AbstractVirtualFileHandler) { AbstractVirtualFileHandler handler = (AbstractVirtualFileHandler) peer; if (handler.initPath(pathName) && parent != null) pathName.append('/'); } else { pathName.append(peer.getPathName()); } if (parent != null) { // if it's a root node we skip adding '/' and a name pathName.append(getName()); } return true; } return false; } public VirtualFile getVirtualFile() { checkClosed(); increment(); return new VirtualFile(this); } /** * Get this handler's parent. * If this handler represents a root of the context mounted within another context * a parent from the outer context will be returned. * * @return parent handler * @throws IOException for any error */ public VirtualFileHandler getParent() throws IOException { checkClosed(); if (parent == null) { if (context instanceof AbstractVFSContext) { AbstractVFSContext avfc = (AbstractVFSContext) context; VirtualFileHandler peer = avfc.getRootPeer(); if (peer != null) return peer.getParent(); } } return parent; } /** * Get this handler's most outer context (contexts can be mounted one within other). * * @return context */ public VFSContext getVFSContext() { checkClosed(); if (context instanceof AbstractVFSContext) { AbstractVFSContext avfs = (AbstractVFSContext) context; VirtualFileHandler peer = avfs.getRootPeer(); if (peer != null) return peer.getVFSContext(); } return context; } /** * Get this handler's local context * * @return context */ public VFSContext getLocalVFSContext() { return context; } /** * Increment the reference count * * @return the resulting count */ protected int increment() { return references.incrementAndGet(); } /** * Decrement the reference count * * @return the resulting count */ protected int decrement() { return references.decrementAndGet(); } /** * Check whether we are closed * * @throws IllegalStateException when closed */ protected void checkClosed() throws IllegalStateException { if (references.get() < 0) throw new IllegalStateException("Closed " + toStringLocal()); } /** * Get the references count. * * @return the ref count */ protected int getReferences() { return references.get(); } public void cleanup() { } /** * Is the handler temporary. * * @return true if temporary, false otherwise */ protected boolean isTemporary() { Map options = getVFSContext().getOptions(); return (options != null && Boolean.valueOf(options.get(VFSUtils.IS_TEMP_FILE))); } public void close() { try { if (getReferences() == 1) doClose(); } finally { references.decrementAndGet(); } } /** * The real close */ protected void doClose() { // nothing } /** * Delete the file represented by this handler. * * File deletion is comprised of two parts: * *

    *
  1. physical file deletion - performed by this method or its override
  2. *
  3. removal of any child references from the parent - performed by {@link #removeChild(String)} of the parent
  4. *
* * This method doesn't do any physical file removal because it has no concept of underlying physical file. * An implementation that does physical file removal should override this method and call super.delete() at the end. * * @param gracePeriod max time to wait for any locks * @return true if file was deleted, false otherwise * @throws IOException if an error occurs */ public boolean delete(int gracePeriod) throws IOException { VirtualFileHandler parent = getParent(); if (parent != null) return parent.removeChild(getName()); return false; } /** * Structured implementation of get child * * @param path the path * @return the handler or null if it doesn't exist * @throws IOException for any error accessing the virtual file system * @throws IllegalArgumentException for a null name */ public VirtualFileHandler structuredFindChild(String path) throws IOException { checkClosed(); // Parse the path List tokens = PathTokenizer.getTokens(path); if (tokens == null || tokens.size() == 0) return this; // Go through each context starting from ours // check the parents are not leaves. VirtualFileHandler current = this; for (int i = 0; i < tokens.size(); ++i) { if (current == null) return null; String token = tokens.get(i); if (PathTokenizer.isCurrentToken(token)) continue; if (PathTokenizer.isReverseToken(token)) { VirtualFileHandler parent = current.getParent(); if (parent == null) // TODO - still IOE or null? throw new IOException("Using reverse path on top file handler: " + current + ", " + path); else current = parent; continue; } if (current.isLeaf()) { return null; } else if (current instanceof StructuredVirtualFileHandler) { StructuredVirtualFileHandler structured = (StructuredVirtualFileHandler)current; current = structured.createChildHandler(token); } else { String remainingPath = PathTokenizer.getRemainingPath(tokens, i); return current.getChild(remainingPath); } } // The last one is the result return current; } /** * Simple implementation of findChild * * @param path the path * @return the handler * @throws IOException for any error accessing the virtual file system * @throws IllegalArgumentException for a null name */ public VirtualFileHandler simpleFindChild(String path) throws IOException { if (path == null) throw new IllegalArgumentException("Null path"); if (path.length() == 0) return this; // check for reverse .. path String appliedPath = PathTokenizer.applySpecialPaths(path); List children = getChildren(false); for (VirtualFileHandler child : children) { if (child.getName().equals(appliedPath)) return child; } return null; } public void replaceChild(VirtualFileHandler original, VirtualFileHandler replacement) { internalReplaceChild(original, replacement); if (replacement instanceof AbstractVirtualFileHandler) { AbstractVirtualFileHandler avfh = (AbstractVirtualFileHandler)replacement; avfh.parent = this; } } /** * Replace original child with unpacked replacement. * * @param original the original * @param replacement the replacement */ protected void internalReplaceChild(VirtualFileHandler original, VirtualFileHandler replacement) { throw new UnsupportedOperationException("Replacement is unsupported: " + toString()); } @Override public String toString() { StringBuilder buffer = new StringBuilder(); buffer.append(getClass().getSimpleName()); buffer.append('@'); buffer.append(System.identityHashCode(this)); buffer.append("[path=").append(getPathName()); buffer.append(" context=").append(getVFSContext().getRootURI()); buffer.append(" real=").append(safeToURLString()); buffer.append(']'); return buffer.toString(); } public String toStringLocal() { StringBuilder buffer = new StringBuilder(); buffer.append(getClass().getSimpleName()); buffer.append('@'); buffer.append(System.identityHashCode(this)); buffer.append("[path=").append(getLocalPathName()); buffer.append(" context=").append(context.getRootURI()); //buffer.append(" real=").append(safeToURLString()); buffer.append(']'); return buffer.toString(); } @Override public int hashCode() { return getPathName().hashCode(); } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || obj instanceof VirtualFileHandler == false) return false; VirtualFileHandler other = (VirtualFileHandler) obj; if (getVFSContext().equals(other.getVFSContext()) == false) return false; if (getPathName().equals(other.getPathName()) == false) return false; return true; } /* @Override protected void finalize() throws Throwable { close(); } */ /** * Safely get a url version of the string * * @return the string or unknown if there is an error */ private String safeToURLString() { try { return toURI().toString(); } catch (URISyntaxException ignored) { return ""; } } private void writeObject(ObjectOutputStream out) throws IOException { PutField fields = out.putFields(); fields.put("rootURI", getLocalVFSContext().getRootURI()); fields.put("parent", parent); fields.put("name", name); fields.put("vfsUrl", vfsUrl); out.writeFields(); } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { // Read in the serialPersistentFields GetField fields = in.readFields(); URI rootURI = (URI) fields.get("rootURI", null); this.parent = (VirtualFileHandler) fields.get("parent", null); this.name = (String) fields.get("name", null); VFSContextFactory factory = VFSContextFactoryLocator.getFactory(rootURI); this.context = factory.getVFS(rootURI); this.references = new AtomicInteger(0); this.vfsUrl = (URL)fields.get("vfsUrl", null); } } ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/AbstractContextFactory.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/AbstractContextFacto0000644000175000017500000000520010713131145033416 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context; import java.net.URL; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import org.jboss.virtual.spi.VFSContextFactory; /** * Abstract context factory. * * @author Ales Justin */ public abstract class AbstractContextFactory implements VFSContextFactory { private String[] protocols; protected AbstractContextFactory(String... protocols) { this.protocols = protocols; } public String[] getProtocols() { return protocols; } /** * Check if URL param is already VFS URL. * * @param url the url * @return stripped url * @throws MalformedURLException for any error */ protected static URL fromVFS(URL url) throws MalformedURLException { String externalForm = url.toExternalForm(); if (externalForm.startsWith("vfs")) return new URL(externalForm.substring(3)); return url; } /** * Check if URI param is already VFS URI. * * @param uri the uri * @return stripped uri * @throws URISyntaxException for any error */ protected static URI fromVFS(URI uri) throws URISyntaxException { String scheme = uri.getScheme(); if (scheme.startsWith("vfs")) return new URI( scheme.substring(3), uri.getUserInfo(), uri.getHost(), uri.getPort(), uri.getPath(), uri.getQuery(), uri.getFragment() ); return uri; } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/DelegatingHandler.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/DelegatingHandler.ja0000644000175000017500000001430411137562372033303 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.List; import org.jboss.util.JBossObject; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VirtualFileHandler; /** * A delegating VirtualFileHandler that allows for overriding the delegate * parent and name. One usecase is a link which roots another VFSContext * under a different parent and name. * * @author Scott.Stark@jboss.org * @version $Revision:$ */ public class DelegatingHandler extends AbstractVirtualFileHandler { /** Serialization */ private static final long serialVersionUID = 1; /** The delegate */ private VirtualFileHandler delegate; /** * Create a DelegatingHandler without a delegate - which will have to be set afterwards * * @param context - the context for the parent * @param parent - the parent of the delegate in this VFS * @param name - the name of the delegate in this VFS */ public DelegatingHandler(VFSContext context, VirtualFileHandler parent, String name) { this(context, parent, name, null); } /** * Create a DelegatingHandler * * @param context - the context for the parent * @param parent - the parent of the delegate in this VFS * @param name - the name of the delegate in this VFS * @param delegate - the handler delegate */ public DelegatingHandler(VFSContext context, VirtualFileHandler parent, String name, VirtualFileHandler delegate) { super(context, parent, name); this.delegate = delegate; } public void setDelegate(VirtualFileHandler handler) { this.delegate = handler; } public VirtualFileHandler getDelegate() { if (delegate == null) throw new IllegalArgumentException("Null delegate"); return delegate; } /** * Set the vfs url. * * @param vfsUrl the vfs url */ protected void setVfsUrl(URL vfsUrl) { if (delegate instanceof AbstractVirtualFileHandler) { ((AbstractVirtualFileHandler)delegate).setVfsUrl(vfsUrl); } } public VirtualFileHandler getChild(String path) throws IOException { VirtualFileHandler child = getDelegate().getChild(path); if (getDelegate().equals(child)) return this; else return child; } public boolean removeChild(String path) throws IOException { throw new IOException("This method should never get called!"); } public List getChildren(boolean ignoreErrors) throws IOException { return getDelegate().getChildren(ignoreErrors); } public long getLastModified() throws IOException { return getDelegate().getLastModified(); } public long getSize() throws IOException { return getDelegate().getSize(); } public boolean isLeaf() throws IOException { return getDelegate().isLeaf(); } public boolean exists() throws IOException { return getDelegate().exists(); } public boolean isHidden() throws IOException { return getDelegate().isHidden(); } public boolean isNested() throws IOException { return getDelegate().isNested(); } @Override public void cleanup() { getDelegate().cleanup(); } @Override public void close() { if (delegate == null) return; try { if ((delegate instanceof AbstractVirtualFileHandler) && getReferences() == 1) { AbstractVirtualFileHandler avfh = AbstractVirtualFileHandler.class.cast(delegate); avfh.doClose(); } else { delegate.close(); } } finally { decrement(); } } public boolean delete(int gracePeriod) throws IOException { return getDelegate().delete(gracePeriod); } public InputStream openStream() throws IOException { return getDelegate().openStream(); } public URI toURI() throws URISyntaxException { return getDelegate().toURI(); } public URL toURL() throws URISyntaxException, MalformedURLException { return getDelegate().toURL(); } protected void internalReplaceChild(VirtualFileHandler original, VirtualFileHandler replacement) { getDelegate().replaceChild(original, replacement); } public URL toVfsUrl() throws MalformedURLException, URISyntaxException { return getDelegate().toVfsUrl(); } public URL getRealURL() throws IOException, URISyntaxException { return getDelegate().getRealURL(); } public int hashCode() { if (delegate != null) return delegate.hashCode(); return super.hashCode(); } public boolean equals(Object o) { if (o == this) return true; if (o instanceof VirtualFileHandler == false) return false; VirtualFileHandler vfh = (VirtualFileHandler)o; if (vfh instanceof DelegatingHandler) { DelegatingHandler handler = (DelegatingHandler) o; vfh = handler.getDelegate(); } return JBossObject.equals(delegate, vfh); } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/VfsArchiveBrowser.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/VfsArchiveBrowser.ja0000644000175000017500000000673610734323332033351 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context; import java.io.IOException; import java.util.Iterator; import java.util.List; import org.jboss.util.file.ArchiveBrowser; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.VirtualFileFilter; import org.jboss.virtual.VisitorAttributes; import org.jboss.virtual.plugins.context.jar.JarUtils; import org.jboss.virtual.plugins.vfs.helpers.FilterVirtualFileVisitor; import org.jboss.virtual.plugins.vfs.helpers.SuffixesExcludeFilter; /** * This is a bridge to an older, crappier API written by myself. * * @deprecated * * @author Bill Burke * @version $Revision: 1.1 $ */ public class VfsArchiveBrowser implements Iterator { private VirtualFile vf; private Iterator it; public VfsArchiveBrowser(ArchiveBrowser.Filter filter, VirtualFile vf) { this.vf = vf; List classes = getResources(new ArchiveBrowserFilter(filter)); it = classes.iterator(); } /** * Get resources. * * @param filter the filter * @return resources list */ public List getResources(VirtualFileFilter filter) { VisitorAttributes va = new VisitorAttributes(); va.setLeavesOnly(true); SuffixesExcludeFilter noJars = new SuffixesExcludeFilter(JarUtils.getSuffixes()); va.setRecurseFilter(noJars); FilterVirtualFileVisitor visitor = new FilterVirtualFileVisitor(filter, va); try { vf.visit(visitor); } catch (IOException e) { throw new RuntimeException(e); } return visitor.getMatched(); } public boolean hasNext() { return it.hasNext(); } public Object next() { try { return it.next().openStream(); } catch (IOException e) { throw new RuntimeException(e); } } public void remove() { it.remove(); } /** * Archive browser delegate filter. */ private class ArchiveBrowserFilter implements VirtualFileFilter { private ArchiveBrowser.Filter filter; public ArchiveBrowserFilter(ArchiveBrowser.Filter filter) { if (filter == null) throw new IllegalArgumentException("Null filter"); this.filter = filter; } public boolean accepts(VirtualFile file) { return filter.accept(file.getName()); } } } libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/vfs/0000755000175000017500000000000011146622524030216 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/vfs/Assembled.java0000644000175000017500000000265111001375747032766 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.vfs; import java.lang.annotation.Target; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; /** * Marker annotation * * @author Bill Burke * @version $Revision: 1.1 $ */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface Assembled { } ././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/vfs/AssembledContextFactory.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/vfs/AssembledContext0000644000175000017500000000750211001375747033413 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.vfs; import java.util.concurrent.ConcurrentHashMap; import java.net.URISyntaxException; import java.io.IOException; import org.jboss.virtual.AssembledDirectory; /** * Factory for creating AssembledDirectory. * * @author Bill Burke * @version $Revision: 1.1 $ */ public class AssembledContextFactory { private static AssembledContextFactory instance = new AssembledContextFactory(); private ConcurrentHashMap registry = new ConcurrentHashMap(); private volatile int count; /** * Creates an assembly returning the root AssembledDirectory . * Creates an assembly base and registers it with a local hashmap under name. * * @param name the name of this assembly * @param rootName the name of the root directory you want * @return */ public AssembledDirectory create(String name, String rootName) { if (registry.containsKey(name)) throw new RuntimeException("Assembled context already exists for name: " + name); try { AssembledContext context = new AssembledContext(name, rootName); AssembledDirectory directory = (AssembledDirectory)context.getRoot().getVirtualFile(); registry.put(name, directory); return directory; } catch (IOException e) { throw new RuntimeException(e); } catch (URISyntaxException e) { throw new RuntimeException(e); } } /** * Find an assembly. Usually used only by the URL protocol handlers. * * @param name * @return */ public AssembledDirectory find(String name) { return registry.get(name); } /** * Creates an assembly returning the root AssembledDirectory . * * The assembly name will be randomly generated and registered with the internal hashmap registry. * * @param rootName the name of the root AssembledDirectory * @return */ public AssembledDirectory create(String rootName) { String name = "" + System.currentTimeMillis() + "" + count++; return create(name, rootName); } /** * Remove an assembly * * @param directory the directory */ public void remove(AssembledDirectory directory) { try { if (directory.getParent() != null) throw new RuntimeException("This is not the root of assembly"); } catch (IOException e) { throw new RuntimeException(e); } registry.remove(directory.getName()); } /** * Get the instance. * * @return the instance */ public static AssembledContextFactory getInstance() { return instance; } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/vfs/ByteArrayHandler.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/vfs/ByteArrayHandler0000644000175000017500000000674511041635351033351 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.vfs; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.List; import org.jboss.virtual.plugins.context.AbstractVirtualFileHandler; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VirtualFileHandler; /** * ByteArrayHandler. * * @author Bill Burke * @author Ales Justin * @version $Revision: 1.1 $ */ @Assembled public class ByteArrayHandler extends AbstractVirtualFileHandler { private byte[] bytes; private final long lastModified; public ByteArrayHandler(VFSContext context, VirtualFileHandler parent, String name, byte[] bytes) throws IOException { super(context, parent, name); this.bytes = bytes; lastModified = System.currentTimeMillis(); String path = getPathName(); if (path.startsWith("/") == false) path = "/" + path; if (path.endsWith("/") == false) path += "/"; setVfsUrl(new URL("vfs", context.getName(), -1, path, new AssembledUrlStreamHandler(context))); } @Override public URL toURL() throws MalformedURLException, URISyntaxException { return getVfsUrl(); } public URI toURI() throws URISyntaxException { return getVfsUrl().toURI(); } public long getLastModified() throws IOException { return lastModified; } public long getSize() throws IOException { return bytes.length; } public boolean exists() throws IOException { return true; } public boolean isLeaf() throws IOException { return true; } public boolean isHidden() throws IOException { return false; } public boolean isNested() throws IOException { return false; } public InputStream openStream() throws IOException { return new ByteArrayInputStream(bytes); } public List getChildren(boolean ignoreErrors) throws IOException { throw new IOException("File cannot have children"); } public VirtualFileHandler getChild(String path) throws IOException { throw new IOException("File cannot have children"); } public boolean removeChild(String name) { return false; } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/vfs/AssembledContext.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/vfs/AssembledContext0000644000175000017500000000373411041627175033415 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.vfs; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import org.jboss.virtual.plugins.context.AbstractVFSContext; /** * AssembledContext. * * @author Scott.Stark@jboss.org * @author Adrian Brock * @author Ales Justin * @version $Revision: 1.1 $ */ public class AssembledContext extends AbstractVFSContext { private String name; /** The root file */ private final AssembledDirectoryHandler root; public AssembledContext(String name, String rootName) throws IOException, URISyntaxException { super(new URI("vfs", name, null, null)); this.name = name; root = new AssembledDirectoryHandler(this, null, rootName); } public AssembledDirectoryHandler getRoot() throws IOException { return root; } public String getName() { return name; } } ././@LongLink0000000000000000000000000000016300000000000011565 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/vfs/AssembledDirectoryHandler.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/vfs/AssembledDirecto0000644000175000017500000001267611041635351033362 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.vfs; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.jboss.virtual.AssembledDirectory; import org.jboss.virtual.plugins.context.AbstractVirtualFileHandler; import org.jboss.virtual.plugins.context.StructuredVirtualFileHandler; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VirtualFileHandler; /** * The assembled directory handler. * * @author Bill Burke * @version $Revision: 1.1 $ */ @Assembled public class AssembledDirectoryHandler extends AbstractVirtualFileHandler implements StructuredVirtualFileHandler { private long lastModified = System.currentTimeMillis(); private List children = new ArrayList(); private Map childrenMap = new HashMap(); public AssembledDirectoryHandler(VFSContext context, AssembledDirectoryHandler parent, String name) throws IOException { super(context, parent, name); String path = getPathName(); if (path.startsWith("/") == false) path = "/" + path; if (path.endsWith("/") == false) path += "/"; setVfsUrl(new URL("vfs", context.getName(), -1, path, new AssembledUrlStreamHandler(context))); } public VirtualFileHandler addChild(VirtualFileHandler handler) { if (handler.getClass().isAnnotationPresent(Assembled.class) == false) { try { handler = new AssembledFileHandler(getVFSContext(), this, handler.getName(), handler); } catch (IOException e) { throw new RuntimeException(e); } } children.add(handler); childrenMap.put(handler.getName(), handler); lastModified = System.currentTimeMillis(); return handler; } /** * This method removes a specified child from its list of children map * * @param name child name * @return true if child was removed, false otherwise */ public boolean removeChild(String name) { Iterator it = children.iterator(); while (it.hasNext()) { VirtualFileHandler child = it.next(); if (child.getName().equals(name)) { it.remove(); childrenMap.remove(name); lastModified = System.currentTimeMillis(); return true; } } return false; } public VirtualFileHandler findChild(String name) { return childrenMap.get(name); } public VirtualFileHandler getChild(String path) throws IOException { return structuredFindChild(path); } public URI toURI() throws URISyntaxException { return getVfsUrl().toURI(); } public long getLastModified() throws IOException { return lastModified; } public long getSize() throws IOException { return 0; } public boolean exists() throws IOException { return true; } public boolean isLeaf() throws IOException { return false; } public boolean isHidden() throws IOException { return false; } public boolean isNested() throws IOException { return false; } public InputStream openStream() throws IOException { throw new RuntimeException("Cannot open stream"); } public List getChildren(boolean ignoreErrors) throws IOException { return children; } public VirtualFileHandler createChildHandler(String name) throws IOException { return childrenMap.get(name); } @Override public AssembledDirectory getVirtualFile() { checkClosed(); increment(); return new AssembledDirectory(this); } @Override public URL toURL() throws MalformedURLException, URISyntaxException { return getVfsUrl(); } protected void internalReplaceChild(VirtualFileHandler original, VirtualFileHandler replacement) { children.remove(original); children.add(replacement); childrenMap.put(original.getName(), replacement); } } ././@LongLink0000000000000000000000000000016300000000000011565 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/vfs/AssembledUrlStreamHandler.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/vfs/AssembledUrlStre0000644000175000017500000000417611001375747033373 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.vfs; import java.io.IOException; import java.net.URL; import java.net.URLConnection; import java.net.URLStreamHandler; import org.jboss.virtual.plugins.vfs.VirtualFileURLConnection; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VirtualFileHandler; /** * Used when creating VFS urls so we don't have to go through the handlers all the time * * @author Bill Burke * @author Ales Justin * @version $Revision: 1.1 $ */ public class AssembledUrlStreamHandler extends URLStreamHandler { private final VFSContext context; public AssembledUrlStreamHandler(VFSContext context) { this.context = context; } protected URLConnection openConnection(URL url) throws IOException { String path = url.getPath(); VirtualFileHandler vf = context.getRoot().getChild(path); if (vf == null) throw new IOException(path + " was not found in Assembled VFS context " + context); return new VirtualFileURLConnection(url, vf.getVirtualFile()); } } ././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/vfs/AssembledFileHandler.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/vfs/AssembledFileHan0000644000175000017500000000447711041635351033277 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.vfs; import java.io.IOException; import java.net.URL; import java.util.List; import org.jboss.virtual.plugins.context.DelegatingHandler; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VirtualFileHandler; /** * The assembled file handler. * * @author Bill Burke * @author Ales Justin * @version $Revision: 1.1 $ */ @Assembled public class AssembledFileHandler extends DelegatingHandler { public AssembledFileHandler(VFSContext context, AssembledDirectoryHandler parent, String name, VirtualFileHandler delegate) throws IOException { super(context, parent, name, delegate); String path = getPathName(); if (path.startsWith("/") == false) path = "/" + path; if (path.endsWith("/") == false) path += "/"; setVfsUrl(new URL("vfs", context.getName(), -1, path, new AssembledUrlStreamHandler(context))); } public List getChildren(boolean ignoreErrors) throws IOException { throw new IOException("File cannot have children: " + this); } public VirtualFileHandler getChild(String path) throws IOException { throw new IOException("File cannot have children: " + this); } } libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/helpers/0000755000175000017500000000000011146622525031063 5ustar twernertwerner././@LongLink0000000000000000000000000000016300000000000011565 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/helpers/NamesExceptionHandler.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/helpers/NamesExcepti0000644000175000017500000000402311112474030033357 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.helpers; import java.util.Collections; import java.util.Set; import org.jboss.virtual.plugins.context.AbstractExceptionHandler; /** * Match names to ignore the exception. * * @author Ales Justin */ public class NamesExceptionHandler extends AbstractExceptionHandler { private Set names; public NamesExceptionHandler(String name) { this(Collections.singleton(name)); } public NamesExceptionHandler(Set names) { if (names == null) throw new IllegalArgumentException("Null names"); this.names = names; } @Override public void handleZipEntriesInitException(Exception e, String zipName) { for (String name : names) { if (zipName.contains(name)) { log.debug("Exception while reading " + zipName, e); return; } } super.handleZipEntriesInitException(e, zipName); } } libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/zip/0000755000175000017500000000000011146622525030223 5ustar twernertwerner././@LongLink0000000000000000000000000000016000000000000011562 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/zip/ZipEntryContextFactory.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/zip/ZipEntryContextF0000644000175000017500000000532011025244116033375 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.zip; import java.io.IOException; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import org.jboss.virtual.plugins.context.AbstractContextFactory; import org.jboss.virtual.spi.VFSContext; /** * ContextFactory that keeps track of ZipEntryContexts * * @author Marko Strukelj * @version $Revision: 1.0 $ */ public class ZipEntryContextFactory extends AbstractContextFactory { /** singleton */ private static ZipEntryContextFactory instance = new ZipEntryContextFactory(); /** * ZipEntryContextFactory registers two url protocols: zip and vfszip */ public ZipEntryContextFactory() { super("zip", "vfszip"); // "jar", "vfsjar", } /** * Get a VFSContext for a given URL */ public VFSContext getVFS(URI rootURI) throws IOException { return getVFS(rootURI.toURL()); } /** * Create a new ZipEntryContext. * * @param rootURL the root url * @return new zip context * @throws IOException for any error */ public VFSContext getVFS(URL rootURL) throws IOException { try { return new ZipEntryContext(rootURL); } catch(URISyntaxException ex) { MalformedURLException e = new MalformedURLException("Failed to convert URL to URI: " + rootURL); e.initCause(ex); throw e; } } /** * Get a reference to ZipEntryContextFactory. */ public static ZipEntryContextFactory getInstance() { return instance; } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/zip/ZipStreamWrapper.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/zip/ZipStreamWrapper0000644000175000017500000001615311061050535033423 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.zip; import org.jboss.logging.Logger; import org.jboss.virtual.VFSUtils; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.Enumeration; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; /** * ZipStreamWrapper - for abstracted access to in-memory zip file * * @author Marko Strukelj * @version $Revision: 1.0 $ */ class ZipStreamWrapper extends ZipBytesWrapper { /** Logger */ private static final Logger log = Logger.getLogger(ZipStreamWrapper.class); /** Is optimizeForMemory turned on */ private static boolean optimizeForMemory; static { optimizeForMemory = AccessController.doPrivileged(new CheckOptimizeForMemory()); if (optimizeForMemory) log.info("VFS optimizeForMemory is enabled."); } /** zip archive - as individual inflated in-memory files */ private Map inMemoryFiles = new LinkedHashMap(); /** size of the zip file composed back from inMemoryFiles */ private int size; /** * ZipStreamWrapper is not aware of actual zip source so it can not detect * if it's been modified, like ZipFileWrapper does. * * @param zipStream the current zip stream * @param name the name * @param lastModified passed by zip stream provider - constant value * @throws IOException for any error */ ZipStreamWrapper(InputStream zipStream, String name, long lastModified) throws IOException { super(zipStream, name, lastModified); ZipInputStream zis = new ZipInputStream(super.getRootAsStream()); ZipEntry ent = zis.getNextEntry(); while (ent != null) { byte [] fileBytes; if (ent.isDirectory() == false) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); VFSUtils.copyStream(zis, baos); fileBytes = baos.toByteArray(); ent.setSize(fileBytes.length); } else { fileBytes = new byte[0]; } inMemoryFiles.put(ent.getName(), new InMemoryFile(ent, fileBytes)); ent = zis.getNextEntry(); } if (optimizeForMemory) { initZipSize(); // we don't need memory buffer any more super.close(); } } InputStream openStream(ZipEntry ent) throws IOException { // JBVFS-57 JarInputStream composition if (ent.isDirectory()) return recomposeZipAsInputStream(ent.getName()); InMemoryFile memFile = inMemoryFiles.get(ent.getName()); if (memFile == null) throw new FileNotFoundException("Failed to find nested jar entry: " + ent.getName() + " in zip stream: " + toString()); return new ByteArrayInputStream(memFile.fileBytes); } Enumeration entries() throws IOException { return new ZipStreamEnumeration(); } InputStream getRootAsStream() throws FileNotFoundException { if (optimizeForMemory) return recomposeZipAsInputStream(); else return super.getRootAsStream(); } long getSize() { if (optimizeForMemory) return size; else return super.getSize(); } void close() { inMemoryFiles = null; super.close(); } private void initZipSize() throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); recomposeZip(baos); this.size = baos.size(); } private void recomposeZip(ByteArrayOutputStream baos) throws IOException { recomposeZip(baos, ""); } protected void recomposeZip(OutputStream baos, String path) throws IOException { ZipOutputStream zout = new ZipOutputStream(baos); zout.setMethod(ZipOutputStream.STORED); Iterator it = inMemoryFiles.values().iterator(); while(it.hasNext()) { InMemoryFile memFile = it.next(); ZipEntry oldEntry = memFile.entry; if (oldEntry.getName().startsWith(path)) { String newName = oldEntry.getName().substring(path.length()); if(newName.length() == 0) continue; ZipEntry newEntry = new ZipEntry(newName); newEntry.setComment(oldEntry.getComment()); newEntry.setTime(oldEntry.getTime()); newEntry.setSize(oldEntry.getSize()); newEntry.setCrc(oldEntry.getCrc()); zout.putNextEntry(newEntry); if (oldEntry.isDirectory() == false) zout.write(memFile.fileBytes); } } zout.close(); } private InputStream recomposeZipAsInputStream() throws FileNotFoundException { return recomposeZipAsInputStream(""); } static class InMemoryFile { ZipEntry entry; byte [] fileBytes; public InMemoryFile(ZipEntry entry, byte[] fileBytes) { this.entry = entry; this.fileBytes = fileBytes; } } class ZipStreamEnumeration implements Enumeration { private Iterator it; ZipStreamEnumeration() { it = inMemoryFiles.values().iterator(); } public boolean hasMoreElements() { return it.hasNext(); } public ZipEntry nextElement() { return it.next().entry; } } private static class CheckOptimizeForMemory implements PrivilegedAction { public Boolean run() { String forceString = System.getProperty(VFSUtils.OPTIMIZE_FOR_MEMORY_KEY, "false"); return Boolean.valueOf(forceString); } } } ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/zip/ZipEntryInputStream.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/zip/ZipEntryInputStr0000644000175000017500000001323011137562372033445 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.zip; import java.io.IOException; import java.io.InputStream; /** * ZipEntryInputStream is part of ZipFileWrapper implementation. * * It wraps the stream retrieved from ZipFile.getInputStream(entry) * and releases the underlying ZipFileWrapper when detecting end of use. * * @author Marko Strukelj * @version $Revision: 1.0 $ */ public class ZipEntryInputStream extends InputStream { /** Underlying input stream */ private InputStream delegate; /** Underlying zip source */ private ZipFileWrapper zipWrapper; /** Is stream closed */ private boolean closed; /** * ZipEntryInputStream constructor. * * @param zipWrapper underlying zip source * @param is underlying input stream * @throws IOException for any error * @throws IllegalArgumentException if insput stream is null */ ZipEntryInputStream(ZipFileWrapper zipWrapper, InputStream is) throws IOException { if (is == null) throw new IllegalArgumentException("Input stream is null"); this.zipWrapper = zipWrapper; delegate = is; } /** * Close this stream and release zipWrapper */ private void streamClosed(boolean doClose) { if (closed == false && doClose) { closed = true; zipWrapper.release(); } } /** * Read one byte. * * @return whatever the underlying input stream returns * @throws IOException for any error * @see java.io.InputStream#read */ public int read() throws IOException { int rc = -1; try { rc = delegate.read(); return rc; } finally { streamClosed(rc < 0); } } /** * Read a buffer of bytes. * * @param buf read buffer * @return whatever the underlying input stream returns * * @throws IOException for any error * @see java.io.InputStream#read(byte[]) */ public int read(byte buf[]) throws IOException { int rc = -1; try { rc = delegate.read(buf); return rc; } finally { streamClosed(rc < 0); } } /** * Read a buffer of bytes. * * @param buf read buffer * @param off position within buffer to start reading at * @param len maximum bytes to read * @return whatever the underlying input stream returns * @throws IOException for any error * @see java.io.InputStream#read(byte[],int,int) */ public int read(byte buf[], int off, int len) throws IOException { int rc = -1; try { rc = delegate.read(buf, off, len); return rc; } finally { streamClosed(rc < 0); } } /** * @see java.io.InputStream#reset */ public synchronized void reset() throws IOException { boolean ok = false; try { delegate.reset(); ok = true; } finally { streamClosed(ok == false); } } /** * @see java.io.InputStream#mark */ public synchronized void mark(int readlimit) { boolean ok = false; try { delegate.mark(readlimit); ok = true; } finally { streamClosed(ok == false); } } /** * @see java.io.InputStream#available */ public int available() throws IOException { boolean ok = false; try { int ret = delegate.available(); ok = true; return ret; } finally { streamClosed(ok == false); } } /** * @see java.io.InputStream#skip */ public long skip(long n) throws IOException { boolean ok = false; try { long ret = delegate.skip(n); ok = true; return ret; } finally { streamClosed(ok == false); } } /** * Close this stream and release zipWrapper * * @see java.io.InputStream#close */ public void close() throws IOException { streamClosed(true); super.close(); } /** * Properly release held resources */ protected void finalize() throws Throwable { try { close(); } catch(IOException ignored) { } super.finalize(); } /** * isClosed. * * @return returns true if closed */ boolean isClosed() { return closed; } } ././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/zip/ZipFileLockReaper.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/zip/ZipFileLockReape0000644000175000017500000001360611031776370033305 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.zip; import java.util.Iterator; import java.util.Queue; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.ConcurrentLinkedQueue; import java.io.IOException; import org.jboss.logging.Logger; /** * A monitoring object that closes ZipFiles when they haven't been used for a while * * @author Marko Strukelj * @version $Revision: 1.0 $ */ public class ZipFileLockReaper { /** Logger */ private static final Logger log = Logger.getLogger(ZipFileLockReaper.class); /** * Time after which unused ZipFiles can be closed. This shouldn't be a large number * to ensure smooth releasing of file locks */ private static final int PERIOD = 5000; /** Timer thread period */ private static final int TIMER_PERIOD = 1000; /** If timer finds out there haven't been any ZipFiles open for a while it shuts down until some are (re)opened */ private static final int TIMER_UNUSED_PERIOD = 30000; /** There is only one instance that serves all ZipFileWrappers */ private static ZipFileLockReaper singleton; /** A list of monitored ZipFileWrappers */ private Queue monitored = new ConcurrentLinkedQueue(); /** The number of monitored ZipFileWrappers */ private int monitoredCount = 0; /** Timer used for actual reaping - async closure of ZipFiles */ private Timer timer; /** Timestamp of last unregister() call */ private long lastUsed; /** * Private constructor - to force retrieval through {@link #getInstance()} */ private ZipFileLockReaper() { } /** Factory method to be used to retrieve reference to ZipFileLockReaper */ public synchronized static ZipFileLockReaper getInstance() { if (singleton == null) singleton = new ZipFileLockReaper(); return singleton; } /** * Register a ZipFileWrapper instance with this reaper * * @param w wrapper to register */ public synchronized void register(ZipFileWrapper w) { monitored.add(w); monitoredCount++; if (timer == null) { timer = new Timer("ZipFile Lock Reaper", true); timer.schedule(new ReaperTimerTask(), TIMER_PERIOD, TIMER_PERIOD); } if (log.isTraceEnabled()) log.trace("Registered: " + w); } /** * Unregister a ZipFileWrapper instance from this reaper * * @param w wrapper to unregister */ public synchronized void unregister(ZipFileWrapper w) { monitored.remove(w); monitoredCount--; lastUsed = System.currentTimeMillis(); if (log.isTraceEnabled()) log.trace("Unregistered: " + w); } public void deleteFile(ZipFileWrapper zipFileWrapper) throws IOException { synchronized (ZipFileLockReaper.this) { Iterator it = monitored.iterator(); while (it.hasNext()) { ZipFileWrapper w = (ZipFileWrapper) it.next(); w.deleteFile(zipFileWrapper); } } } /** Timer task that does the actual reaping */ class ReaperTimerTask extends TimerTask { public void run() { boolean trace = log.isTraceEnabled(); if (trace) log.trace("Timer called"); long now = System.currentTimeMillis(); synchronized (ZipFileLockReaper.this) { if (monitoredCount == 0) { if (now - lastUsed > TIMER_UNUSED_PERIOD) { timer.cancel(); timer = null; if (trace) log.trace("Cancelled the timer"); } return; } } Iterator it = monitored.iterator(); while (it.hasNext()) { ZipFileWrapper w = (ZipFileWrapper) it.next(); // stream leak debug /* Iterator sit = w.streams.iterator(); while (sit.hasNext()) { ZipEntryInputStream eis = sit.next(); if (!eis.isClosed()) { System.out.println("Stream not closed: " + eis.debugCount + " - " + eis); } } */ if (w.getReferenceCount() <= 0 && now - w.getLastUsed() > PERIOD) { try { w.closeZipFile(); if (log.isTraceEnabled()) log.trace("Asynchronously closed an unused ZipFile: " + w); } catch(Exception ignored) { log.debug("IGNORING: Failed to close ZipFile: " + w, ignored); } } } } } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/zip/ZipDirWrapper.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/zip/ZipDirWrapper.ja0000644000175000017500000000660211031526445033302 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.zip; import java.io.IOException; import java.io.InputStream; import java.io.ByteArrayInputStream; import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; /** * ZipDirWrapper - for abstracted access to in-memory directory * * @author Ales Justin */ class ZipDirWrapper extends ZipBytesWrapper { private ByteArrayInputStream zisCopy; /** * ZipStreamWrapper is not aware of actual zip source so it can not detect * if it's been modified, like ZipFileWrapper does. * * @param zipStream the current zip input stream * @param name the name * @param lastModified passed by zip stream provider - constant value * @param zisCopy zis copy * @throws java.io.IOException for any error */ ZipDirWrapper(InputStream zipStream, String name, long lastModified, ByteArrayInputStream zisCopy) throws IOException { super(zipStream, name, lastModified); this.zisCopy = zisCopy; } InputStream openStream(ZipEntry ent) throws IOException { zisCopy.reset(); // TODO - optimize this ZipInputStream zis = new ZipInputStream(zisCopy); ZipEntry entry = zis.getNextEntry(); while (entry != null && entry.getName().equals(ent.getName()) == false) entry = zis.getNextEntry(); return zis; } Enumeration entries() throws IOException { zisCopy.reset(); return new DirEnumeration(); } /** * Zip stream enumeration. */ private class DirEnumeration implements Enumeration { private ZipInputStream zis; private ZipEntry entry; private DirEnumeration() { this.zis = new ZipInputStream(zisCopy); } public boolean hasMoreElements() { try { entry = zis.getNextEntry(); while (entry != null && entry.getName().startsWith(getName()) == false) entry = zis.getNextEntry(); return entry != null; } catch (IOException e) { log.warn("Error retrieving entries for entry " + getName() + ", cause: " + e); return false; } } public ZipEntry nextElement() { return entry; } } }././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/zip/ZipEntryHandler.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/zip/ZipEntryHandler.0000644000175000017500000001745211137562372033322 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.zip; import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.List; import org.jboss.virtual.VFSUtils; import org.jboss.virtual.plugins.context.AbstractVirtualFileHandler; import org.jboss.virtual.plugins.context.file.FileSystemContext; import org.jboss.virtual.plugins.context.StructuredVirtualFileHandler; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VirtualFileHandler; /** * Handler representing an individual file (ZipEntry) within ZipEntryContext * * @author Marko Strukelj * @version $Revision: 1.0 $ */ public class ZipEntryHandler extends AbstractVirtualFileHandler implements StructuredVirtualFileHandler { /** The url */ private URL url; /** isLeaf */ private boolean isLeaf; /** has it been initialized yet */ transient private boolean initialized; /** * Create a new ZipEntryHandler. * * @param context ZipEntryContext * @param parent parent within the same context * @param name name of this file within context * @param isLeaf true if this file should have a URL not ending with '/', false otherwise * @throws IOException for any error */ public ZipEntryHandler(ZipEntryContext context, AbstractVirtualFileHandler parent, String name, boolean isLeaf) throws IOException { super(context, parent, name); this.isLeaf = isLeaf; if(parent != null) { context.addChild(parent, this); } } private synchronized void init() { if (initialized) return; StringBuilder vfsUrl = new StringBuilder(); try { url = getZipEntryContext().getChildURL(getParent(), getName()); String currentUrl = url.toString(); int pos = currentUrl.indexOf(":/"); vfsUrl.append("vfszip:").append(currentUrl.substring(pos+1)); if (isLeaf == false && vfsUrl.charAt(vfsUrl.length()-1) != '/') vfsUrl.append("/"); setVfsUrl(new URL(vfsUrl.toString())); } catch(Exception ex) { throw new RuntimeException("ASSERTION ERROR - failed to set vfsUrl: " + vfsUrl, ex ); } initialized = true; } public URI toURI() throws URISyntaxException { init(); return VFSUtils.toURI(url); } public long getLastModified() throws IOException { checkClosed(); return getZipEntryContext().getLastModified(this); } public long getSize() throws IOException { checkClosed(); return getZipEntryContext().getSize(this); } public boolean exists() throws IOException { checkClosed(); return getZipEntryContext().exists(this); } public boolean isLeaf() throws IOException { checkClosed(); return getZipEntryContext().isLeaf(this); } public boolean isHidden() throws IOException { checkClosed(); return false; } public boolean isNested() throws IOException { return ZipEntryContext.isNested(this); } public InputStream openStream() throws IOException { checkClosed(); return getZipEntryContext().openStream(this); } public List getChildren(boolean ignoreErrors) throws IOException { checkClosed(); return getZipEntryContext().getChildren(this, ignoreErrors); } public VirtualFileHandler getChild(String path) throws IOException { checkClosed(); return structuredFindChild(path); } public boolean removeChild(String name) throws IOException { return false; } @Override public void cleanup() { getZipEntryContext().cleanup(this); } public boolean delete(int gracePeriod) throws IOException { checkClosed(); boolean deleted = getZipEntryContext().delete(this, gracePeriod); if (deleted) super.delete(gracePeriod); return deleted; } public VirtualFileHandler createChildHandler(String name) throws IOException { return getZipEntryContext().getChild(this, name); } protected void internalReplaceChild(VirtualFileHandler original, VirtualFileHandler replacement) { if (original instanceof AbstractVirtualFileHandler == false) throw new IllegalArgumentException("Original file handler not found in this context: " + original); getZipEntryContext().replaceChild(this, (AbstractVirtualFileHandler) original, replacement); } /** * Get owner zip entry context. * * @return the owner zip entry context */ private ZipEntryContext getZipEntryContext() { return ((ZipEntryContext) getLocalVFSContext()); } public URL toVfsUrl() { init(); return super.getVfsUrl(); } public URL getRealURL() throws IOException, URISyntaxException { // see how far the parent contexts go // if there is no parent context or it is of type FileSystemContext // ZipEntryContext -> jar!/ // ZipEntryContext / ZipEntryContext -> jar!/jar // ZipEntryConteyt / ZipEntryContext / ZipEntryContext ... -> jar!/jar VFSContext ctx = getLocalVFSContext(); VirtualFileHandler peer = getLocalVFSContext().getRootPeer(); if (peer == null) { URL ctxURL = getZipEntryContext().getRealURL(); String ctxURLStr = ctxURL.toExternalForm(); if (ctxURLStr.endsWith("!/")) { String lpath = getLocalPathName(); if (lpath.startsWith("/")) lpath = lpath.substring(1); if (lpath.length() == 0) return ctxURL; else return new URL(ctxURLStr + lpath); } return ctxURL; } if (peer instanceof AbstractVirtualFileHandler && ((AbstractVirtualFileHandler)peer).getLocalVFSContext() instanceof FileSystemContext) { String lpath = getLocalPathName(); if (lpath.startsWith("/") == false) lpath = "/" + lpath; return new URL("jar:file:" + ctx.getRootURI().getPath() + "!" + lpath); } if (peer instanceof AbstractVirtualFileHandler) { AbstractVirtualFileHandler aPeer =(AbstractVirtualFileHandler) peer; URL realUrl = aPeer.getLocalVFSContext().getRoot().getRealURL(); String urlStr = realUrl.toExternalForm(); if (urlStr.endsWith("!/")) return new URL(urlStr + aPeer.getLocalPathName()); else return realUrl; } throw new RuntimeException("Operation not supported for handler: " + this); } } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/zip/ZipFileWrapper.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/zip/ZipFileWrapper.j0000644000175000017500000002523611061050535033301 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.zip; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URI; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import java.util.zip.ZipOutputStream; import org.jboss.logging.Logger; import org.jboss.virtual.VFSUtils; /** * ZipFileWrapper - for abstracted access to zip files on disk * * It releases and reacquires the underlying ZipFile as necessary * * @author Marko Strukelj * @version $Revision: 1.0 $ */ class ZipFileWrapper extends ZipWrapper { /** Logger */ private static final Logger log = Logger.getLogger(ZipFileWrapper.class); /** Is forceNoReaper enabled */ private static boolean forceNoReaper; static { forceNoReaper = AccessController.doPrivileged(new CheckNoReaper()); if (forceNoReaper) log.info("VFS forced no-reaper-mode is enabled."); } /** Underlying zip archive file */ private File file; /** Zip inflater wrapped around file */ private ZipFile zipFile; /** autoClean flag - true for extracted nested jars that we want removed when this wrapper is closed */ private boolean autoClean; /** true if noReaper mode is forced on a per-instance basis */ private boolean noReaperOverride; // used for debugging stream leaks //ConcurrentLinkedQueue streams = new ConcurrentLinkedQueue(); /** * ZipFileWrapper * * @param archive file to the archive * @param autoClean should archive be deleted after use * @param noReaperOverride flag to specify if reaper be used or not */ ZipFileWrapper(File archive, boolean autoClean, boolean noReaperOverride) { this.noReaperOverride = noReaperOverride; init(archive, autoClean); } /** * ZipFileWrapper * * @param rootPathURI URI to the archive - will be passed to File constructor as-is * @param autoClean should archive be deleted after use * @param noReaperOverride flag to specify if reaper be used or not */ ZipFileWrapper(URI rootPathURI, boolean autoClean, boolean noReaperOverride) { this.noReaperOverride = noReaperOverride; File rootFile = new File(rootPathURI); if(rootFile.isFile() == false) throw new RuntimeException("File not found: " + rootFile); init(rootFile, autoClean); } /** * Extra initialization in addition to what's in constructors * * @param archive the archive file * @param autoClean auto clean flag */ private void init(File archive, boolean autoClean) { file = archive; lastModified = file.lastModified(); this.autoClean = autoClean; if (autoClean) file.deleteOnExit(); } /** * Check if archive exists * * @return true if file exists on disk */ boolean exists() { return file.isFile(); } /** * Get lastModified for the archive * * @return lastModified timestamp of the file on disk */ long getLastModified() { return file.lastModified(); } /** * Get the name of the archive * * @return name of the file on disk */ String getName() { return file.getName(); } /** * Get the size of the archive * * @return size of the file on disk */ long getSize() { return file.length(); } /** * Open a ZipFile if none currently exists. If reaper mode is active, apply for monitoring. * * @return a ZipFile * @throws IOException for any error */ private ZipFile ensureZipFile() throws IOException { if (zipFile == null) { zipFile = new ZipFile(file); if (forceNoReaper == false && noReaperOverride == false) ZipFileLockReaper.getInstance().register(this); } return zipFile; } /** * Close a ZipFile if currently open. If reaper mode is active, unregister from monitoring * * @throws IOException for any error */ synchronized void closeZipFile() throws IOException { if (zipFile != null && getReferenceCount() <= 0) { ZipFile zf = zipFile; zipFile = null; zf.close(); if (forceNoReaper == false && noReaperOverride == false) ZipFileLockReaper.getInstance().unregister(this); } } /** * Get the contents of the given ZipEntry as stream * * @param ent a zip entry * @return an InputStream that locks the file for as long as it's open * @throws IOException for any error */ synchronized InputStream openStream(ZipEntry ent) throws IOException { // JBVFS-57 JarInputStream composition if (ent.isDirectory()) return recomposeZipAsInputStream(ent.getName()); ensureZipFile(); InputStream is = zipFile.getInputStream(ent); if (is == null) throw new IOException("Entry no longer available: " + ent.getName() + " in file " + file); ZipEntryInputStream zis = new ZipEntryInputStream(this, is); // debugging code //streams.add(zis); incrementRef(); return zis; } /** * Get raw bytes of this archive in its compressed form * * @return an InputStream * @throws FileNotFoundException if archive doesn't exist */ InputStream getRootAsStream() throws FileNotFoundException { return new FileInputStream(file); } /** * Increment usage count by one and ensure ZipFile is open. * * @throws IOException */ synchronized void acquire() throws IOException { ensureZipFile(); incrementRef(); } /** * Decrement usage count by one */ synchronized void release() { super.release(); if (forceNoReaper || noReaperOverride) try { closeZipFile(); } catch(Exception ex) { log.warn("Failed to release file: " + file); } } /** * Enumerate contents of zip archive */ synchronized Enumeration entries() throws IOException { return ensureZipFile().entries(); } /** * Close the archive, perform autoclean if requested */ void close() { try { closeZipFile(); } catch(Exception ignored) { log.warn("IGNORING: Failed to release file: " + file, ignored); } if (autoClean) file.delete(); } void deleteFile(ZipFileWrapper wrapper) throws IOException { if (file.equals(wrapper.file)) { closeZipFile(); file.delete(); } } /** * Delete the archive * * @param gracePeriod max time to wait for any locks * @return true if file was deleted, false otherwise * @throws IOException if an error occurs */ boolean delete(int gracePeriod) throws IOException { boolean exists = file.isFile(); if (exists == false) return false; long endOfGrace = System.currentTimeMillis() + gracePeriod; do { closeZipFile(); ZipFileLockReaper.getInstance().deleteFile(this); try { if (file.exists() && file.delete() == false) Thread.sleep(100); else return true; } catch (InterruptedException e) { IOException ioe = new IOException("Interrupted: " + e); ioe.initCause(e); throw ioe; } } while(System.currentTimeMillis() < endOfGrace); file.delete(); return file.exists() == false; } protected synchronized void recomposeZip(OutputStream baos, String path) throws IOException { ZipOutputStream zout = new ZipOutputStream(baos); zout.setMethod(ZipOutputStream.STORED); ensureZipFile(); Enumeration entries = zipFile.entries(); while(entries.hasMoreElements()) { ZipEntry oldEntry = entries.nextElement(); if (oldEntry.getName().startsWith(path)) { String newName = oldEntry.getName().substring(path.length()); if(newName.length() == 0) continue; ZipEntry newEntry = new ZipEntry(newName); newEntry.setComment(oldEntry.getComment()); newEntry.setTime(oldEntry.getTime()); newEntry.setSize(oldEntry.getSize()); newEntry.setCrc(oldEntry.getCrc()); zout.putNextEntry(newEntry); if (oldEntry.isDirectory() == false) VFSUtils.copyStream(zipFile.getInputStream(oldEntry), zout); } } zout.close(); } /** * toString * * @return String description of this archive */ public String toString() { return super.toString() + " - " + file.getAbsolutePath(); } /** * PriviligedAction used to read a system property */ private static class CheckNoReaper implements PrivilegedAction { public Boolean run() { String forceString = System.getProperty(VFSUtils.FORCE_NO_REAPER_KEY, "false"); return Boolean.valueOf(forceString); } } } libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/zip/ZipWrapper.java0000644000175000017500000001414311061076351033170 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.zip; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Enumeration; import java.util.zip.ZipEntry; import org.jboss.logging.Logger; /** * ZipWrapper represents abstracted access to zip archive * * @author Marko Strukelj * @version $Revision: 1.0 $ */ abstract class ZipWrapper { /** the log */ protected static final Logger log = Logger.getLogger(ZipWrapper.class); /** last known modifyTime of the zip source */ protected long lastModified; /** timestamp of last call to getLastModified() * it's an expensive call - we don't do it more then once every second */ private long lastChecked; /** last known activity */ private long lastUsed; /** number of streams currently open on this wrapper */ private int refCount = 0; /** * Returns true if underlying source's lastModified time has changed since previous call. * * @return true if modified, false othwewise */ boolean hasBeenModified() { long now = System.currentTimeMillis(); if (now - lastChecked < 1000) return false; lastChecked = now; long lm = getLastModified(); if (lm != lastModified) { lastModified = lm; return true; } return false; } /** * get lastUsed timestamp * * @return */ long getLastUsed() { return lastUsed; } /** * Returns the number of streams currently open * * @return */ int getReferenceCount() { return refCount; } /** * Increment usage count by one */ void incrementRef() { refCount++; lastUsed = System.currentTimeMillis(); } /** * Decrement usage count by one */ synchronized void release() { refCount--; if (refCount <= 0) { lastUsed = System.currentTimeMillis(); } } /** * Acquire lock. * * @throws IOException for any error */ abstract void acquire() throws IOException; /** * Get lastModified of this archive * * @return lastModified timestamp */ abstract long getLastModified(); /** * Get the name of this archive * * @return name */ abstract String getName(); /** * Check if archive exists * * @return true if archive exists */ abstract boolean exists(); /** * Get the size of the archive * * @return size in bytes */ abstract long getSize(); /** * Enumerate contents of this archive * * @return enumeration of ZipEntries * @throws IOException for any error */ abstract Enumeration entries() throws IOException; /** * Get the contents of a given entry as stream * * @param ent zip entry * @return InputStream with entry's contents * @throws IOException for any error */ abstract InputStream openStream(ZipEntry ent) throws IOException; /** * Get raw bytes of this archive in its compressed form * * @return InputStream containing raw archive * @throws FileNotFoundException if archive doesn't exist */ abstract InputStream getRootAsStream() throws FileNotFoundException; /** * Close this archive */ abstract void close(); /** * Delete this archive * * @param gracePeriod maximum time to wait for any locks * @return true if file was deleted, false otherwise * @throws IOException for any error */ abstract boolean delete(int gracePeriod) throws IOException; /** * Recompose an input stream as having path entry for its root. * All entries' names have to be shifted accordingly. * * @param path root path * @return InputStream containing a new ZIP archive * @throws FileNotFoundException for any error that prevented recomposition */ protected InputStream recomposeZipAsInputStream(String path) throws FileNotFoundException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); try { recomposeZip(baos, path); return new ByteArrayInputStream(baos.toByteArray()); } catch (IOException ex) { FileNotFoundException e = new FileNotFoundException("Failed to recompose inflated nested archive " + getName()); e.initCause(ex); throw e; } } /** * Recompose an input streamas having path entry for its root, and write it to a given OutputStream. * All entries' names have to be shifted accordingly. * * @param os OutputStream that will contain newly create archive * @param path root path * @throws IOException for any error */ protected void recomposeZip(OutputStream os, String path) throws IOException { // do nothing } } ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/zip/ZipEntryWrapper.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/zip/ZipEntryWrapper.0000644000175000017500000000467411024523053033353 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.zip; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; import java.util.zip.ZipEntry; /** * ZipEntryWrapper - for abstracted access to in-memory entry * * @author Ales Justin */ class ZipEntryWrapper extends ZipBytesWrapper { private static final EmptyEnumeration emptyEnumeration = new EmptyEnumeration(); /** * ZipStreamWrapper is not aware of actual zip source so it can not detect * if it's been modified, like ZipFileWrapper does. * * @param zipStream the current zip input stream * @param name the name * @param lastModified passed by zip stream provider - constant value * @throws java.io.IOException for any error */ ZipEntryWrapper(InputStream zipStream, String name, long lastModified) throws IOException { super(zipStream, name, lastModified); } InputStream openStream(ZipEntry ent) throws IOException { return getRootAsStream(); } Enumeration entries() throws IOException { return emptyEnumeration; } /** * Zip stream enumeration. */ private static class EmptyEnumeration implements Enumeration { public boolean hasMoreElements() { return false; } public ZipEntry nextElement() { return null; } } }././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/zip/ZipEntryContext.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/zip/ZipEntryContext.0000644000175000017500000012307711137562372033372 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.zip; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URL; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.TreeMap; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import org.jboss.logging.Logger; import org.jboss.virtual.VFSUtils; import org.jboss.virtual.plugins.context.AbstractVFSContext; import org.jboss.virtual.plugins.context.AbstractVirtualFileHandler; import org.jboss.virtual.plugins.context.DelegatingHandler; import org.jboss.virtual.plugins.context.jar.JarUtils; import org.jboss.virtual.plugins.copy.AbstractCopyMechanism; import org.jboss.virtual.spi.ExceptionHandler; import org.jboss.virtual.spi.VirtualFileHandler; import org.jboss.virtual.spi.VFSContext; /** * ZipEntryContext implements a {@link org.jboss.virtual.spi.VFSContext} * that exposes a zip archive as a virtual file system. * * Zip archive can be in a form of a file or a stream. * * Nested archives are processed through this same class. * By default nested archives are cached in memory and mounted as new * instances of ZipEntryContext with ZipStreamWrapper as a source. * If system property jboss.vfs.forceCopy=true is specified, * or URL query parameter forceCopy=true is present, * nested archives are extracted into a temp directory before being * mounted as new instances of ZipEntryContext. * * In-memory nested archives may consume a lot of memory. To reduce memory footprint * at the expense of performance, system property jboss.vfs.optimizeForMemory=true * can be set. * * This context implementation has two modes of releasing file locks. * Asynchronous mode is the default one since it is better performant. * To switch this to synchronous mode a system property * jboss.vfs.forceNoReaper=true can be specified or URL query parameter * noReaper=true can be included in context URL. * * This context implementation is a replacement for * {@link org.jboss.virtual.plugins.context.jar.JarContext}. * * @author Marko Strukelj * @author Ales Justin * @version $Revision: 1.0 $ */ public class ZipEntryContext extends AbstractVFSContext { /** Logger */ private static final Logger log = Logger.getLogger(ZipEntryContext.class); /** Global setting for nested archive processing mode: copy or no-copy (default) */ private static boolean forceCopy; static { deleteTmpDirContents(); forceCopy = AccessController.doPrivileged(new CheckForceCopy()); if (forceCopy) log.info("VFS force nested jars copy-mode is enabled."); } /** Abstracted access to zip archive - either ZipFileWrapper or ZipStreamWrapper */ private ZipWrapper zipSource; /** Entry path representing a context root - archive root is not necessarily a context root */ private String rootEntryPath = ""; /** path to zip file - used for lazy ZipWrapper initialization */ private String filePath = null; /** AutoClean signals if zip archive should be deleted after closing the context - true for nested archives */ private boolean autoClean = false; /** Registry of everything that zipSource contains */ private Map entries = new ConcurrentHashMap(); /** Have zip entries been navigated yet */ private InitializationStatus initStatus = InitializationStatus.NOT_INITIALIZED; /** RealURL of this context */ private URL realURL; /** Nested handlers */ private List nestedHandlers = new CopyOnWriteArrayList(); /** * Create a new ZipEntryContext * * @param rootURL - file or jar:file url * @throws URISyntaxException for any URI error * @throws java.io.IOException for any error */ public ZipEntryContext(URL rootURL) throws URISyntaxException, IOException { this(rootURL, false); } /** * Create a new ZipEntryContext * * @param rootURL - file or jar:file url * @param autoClean - true if file represented by rootURL should be deleted after this context is closed * @throws URISyntaxException for any URI error * @throws java.io.IOException for any error */ public ZipEntryContext(URL rootURL, boolean autoClean) throws URISyntaxException, IOException { super(VFSUtils.toURI(fixUrl(rootURL))); this.autoClean = autoClean; init(rootURL, null, null); } /** * Create a new ZipEntryContext to be mounted into another context * * @param rootURL - url representing this context within another context * @param peer - file handler in another context through which this context is being mounted * @param localRootUrl - file or jar:file url * @throws URISyntaxException for any URI error * @throws java.io.IOException for any error */ public ZipEntryContext(URL rootURL, VirtualFileHandler peer, URL localRootUrl) throws URISyntaxException, IOException { this(rootURL, peer, localRootUrl, false); } /** * Create a new ZipEntryContext to be mounted into another context * * @param rootURL - url representing this context within another context * @param peer - file handler in another context through which this context is being mounted * @param localRootUrl - file or jar:file url * @param autoClean - true if file represented by localRootURL should be deleted after this context is closed * @throws URISyntaxException for any URI error * @throws java.io.IOException for any error */ public ZipEntryContext(URL rootURL, VirtualFileHandler peer, URL localRootUrl, boolean autoClean) throws URISyntaxException, IOException { super(VFSUtils.toURI(fixUrl(rootURL))); this.autoClean = autoClean; init(localRootUrl, peer, null); } /** * Create a new ZipEntryContext to be mounted into another context * * @param rootURL - url representing this context within another context * @param peer - file handler in another context through which this context is being mounted * @param zipWrapper - abstracted zip archive source * @param autoClean - true if file represented by localRootURL should be deleted after this context is closed * @throws URISyntaxException for any URI error * @throws java.io.IOException for any error */ public ZipEntryContext(URL rootURL, VirtualFileHandler peer, ZipWrapper zipWrapper, boolean autoClean) throws URISyntaxException, IOException { super(VFSUtils.toURI(fixUrl(rootURL))); this.autoClean = autoClean; init(null, peer, zipWrapper); } /** * Extra initialization in addition to what's inside constructors * * @param localRootURL the local url * @param peer the peer * @param zipWrapper zip wrapper * @throws URISyntaxException for any URI error * @throws java.io.IOException for any error */ private void init(URL localRootURL, VirtualFileHandler peer, ZipWrapper zipWrapper) throws IOException, URISyntaxException { if (zipWrapper == null) { if (localRootURL == null) throw new IllegalArgumentException("No ZipWrapper specified and localRootURL is null"); // initialize rootEntryPath and get archive file path filePath = initRootAndPath(localRootURL); } else { zipSource = zipWrapper; } setRootPeer(peer); String name = getRootURI().getPath(); int toPos = name.length(); // cut off any ending slash if(name.length() != 0 && name.charAt(name.length()-1) == '/') toPos --; // name is last path component int namePos = name.lastIndexOf("/", toPos-1); name = name.substring(namePos+1, toPos); // cut off any ending exclamation if(name.length() != 0 && name.charAt(name.length()-1) == '!') name = name.substring(0, name.length()-1); // init initial root EntryInfo that will be overwritten // if zip entry exists for rootEntryPath entries.put("", new EntryInfo(new ZipEntryHandler(this, null, name, true), null)); // It's lazy init now //initEntries(); } /** * Get zip source. * Lazy init. * * @return the zip source */ protected synchronized ZipWrapper getZipSource() { if (zipSource == null) { try { zipSource = createZipSource(filePath); } catch (IOException e) { throw new RuntimeException("Failed to initialize ZipWrapper: " + filePath, e); } } return zipSource; } /** * Returns aggregated options. * * If peer exists, it uses peer context's options as a basis, * and overrides them with this context's options. * * @return map containing aggregated options */ public Map getAggregatedOptions() { Map options = new HashMap(); VFSContext peerContext = getPeerContext(); if (peerContext != null) options.putAll(peerContext.getOptions()); options.putAll(super.getOptions()); // put them after peer, possible override return options; } public ExceptionHandler getExceptionHandler() { ExceptionHandler eh = super.getExceptionHandler(); if (eh != null) return eh; VFSContext peerContext = getPeerContext(); return peerContext != null ? peerContext.getExceptionHandler() : null; } /** * Create zip source. * * @param rootPath the root path * @return zip entry wrapper * @throws IOException for any error */ protected ZipWrapper createZipSource(String rootPath) throws IOException { File file = null; String relative = null; File fp = new File(rootPath); if (fp.exists()) { file = fp; } else { File curr = fp; relative = fp.getName(); while ((curr = curr.getParentFile()) != null) { if (curr.exists()) { file = curr; break; } else { relative = curr.getName() + "/" + relative; } } } if (file == null) throw new IOException("VFS file does not exist: " + rootPath); RealURLInfo urlInfo = new RealURLInfo(file); if (relative != null) { ZipWrapper wrapper = findEntry(new FileInputStream(file), relative, urlInfo); realURL = urlInfo.toURL(); return wrapper; } else { boolean noReaper = Boolean.valueOf(getAggregatedOptions().get(VFSUtils.NO_REAPER_QUERY)); realURL = urlInfo.toURL(); boolean isAutoClean = autoClean || Boolean.valueOf(getAggregatedOptions().get(VFSUtils.IS_TEMP_FILE)); return new ZipFileWrapper(file, isAutoClean, noReaper); } } /** * Find exact entry. * Use recursion on relative path. * * @param is the input stream * @param relative relative path * @param urlInfo url info * @return zip wrapper instance * @throws IOException for any error */ protected ZipWrapper findEntry(InputStream is, String relative, RealURLInfo urlInfo) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); VFSUtils.copyStreamAndClose(is, baos); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); // first we need to find best/longest name ZipInputStream zis = new ZipInputStream(bais); ZipEntry entry; String longestNameMatch = null; while((entry = zis.getNextEntry()) != null) { String entryName = entry.getName(); String match = entryName; if (entry.isDirectory()) match = match.substring(0, match.length() - 1); if (relative.startsWith(match)) { if (match.equals(relative)) { if (entry.isDirectory()) { this.rootEntryPath = relative; return new ZipDirWrapper(zis, entryName, System.currentTimeMillis(), bais); } else if (JarUtils.isArchive(match) == false) { return new ZipEntryWrapper(zis, entryName, System.currentTimeMillis()); } else { return new ZipStreamWrapper(zis, entryName, System.currentTimeMillis()); } } if (longestNameMatch == null || longestNameMatch.length() < entryName.length()) { longestNameMatch = entryName; // keep entry name } } } if (longestNameMatch == null) throw new IllegalArgumentException("Cannot find entry: " + is + ", " + relative); // do recursion on relative bais.reset(); zis = new ZipInputStream(bais); while((entry = zis.getNextEntry()) != null) { String entryName = entry.getName(); if (entryName.equals(longestNameMatch)) { if (urlInfo != null) urlInfo.relativePath = longestNameMatch; relative = relative.substring(longestNameMatch.length() + 1); return findEntry(zis, relative, null); } } throw new IllegalArgumentException("No such entry: " + is + ", " + relative); } /** * Returns archive file name - if this is a top-level ZipEntryContext. * Otherwise it returns the last component of URL. * * @return name */ public String getName() { VirtualFileHandler peer = getRootPeer(); if (peer != null) return peer.getName(); else return getZipSource().getName(); } /** * Iterate through zip archive entries, compose a tree structure of archive's content * * @throws URISyntaxException for any URI error * @throws java.io.IOException for any error */ private synchronized void initEntries() throws IOException, URISyntaxException { // we're using a two phase approach - we first select the relevant ones // then we order these by name and only then we process them // this way we ensure that parent entries are processed before child entries Map relevant = new HashMap(); ZipWrapper zipSource = getZipSource(); zipSource.acquire(); try { Enumeration zipEntries = zipSource.entries(); // zoom-in on entries under rootEntryPath - ignoring the rest while(zipEntries.hasMoreElements()) { ZipEntry ent = zipEntries.nextElement(); if(ent.getName().startsWith(rootEntryPath)) { relevant.put(ent.getName(), ent); } } Map orderedRelevant = new TreeMap(relevant); for(Map.Entry entry : orderedRelevant.entrySet()) { ZipEntry ent = entry.getValue(); String fullName = ent.getName().substring(rootEntryPath.length()); String [] split = splitParentChild(fullName); String parentPath = split[0]; String name = split[1]; EntryInfo ei = null; if ("".equals(name) == false) { ei = entries.get(parentPath); if(ei == null) ei = makeDummyParent(parentPath); } AbstractVirtualFileHandler parent = ei != null ? ei.handler : null; // it's a nested jar if(ent.isDirectory() == false && JarUtils.isArchive(ent.getName())) { boolean useCopyMode = forceCopy; if (useCopyMode == false) { String flag = getAggregatedOptions().get(VFSUtils.USE_COPY_QUERY); useCopyMode = Boolean.valueOf(flag); } DelegatingHandler delegator; if (useCopyMode) { // extract it to temp dir File dest = new File(getTempDir() + "/" + getTempFileName(ent.getName())); dest.deleteOnExit(); // ensure parent exists dest.getParentFile().mkdirs(); InputStream is = zipSource.openStream(ent); OutputStream os = new BufferedOutputStream(new FileOutputStream(dest)); VFSUtils.copyStreamAndClose(is, os); // mount another instance of ZipEntryContext delegator = mountZipFile(parent, name, dest); } else { // mount another instance of ZipEntryContext delegator = mountZipStream(parent, name, zipSource.openStream(ent)); } entries.put(delegator.getLocalPathName(), new EntryInfo(delegator, ent)); addChild(parent, delegator); nestedHandlers.add(delegator); // add nested delegator } else { ZipEntryHandler wrapper = new ZipEntryHandler(this, parent, name, ent.isDirectory() == false); entries.put(wrapper.getLocalPathName(), new EntryInfo(wrapper, ent)); } } } finally { zipSource.release(); } } /** * Perform initialization only if it hasn't been done yet */ private synchronized void ensureEntries() { if (initStatus != InitializationStatus.NOT_INITIALIZED) return; try { initStatus = InitializationStatus.INITIALIZING; initEntries(); initStatus = InitializationStatus.INITIALIZED; } catch (Exception ex) { ExceptionHandler eh = getExceptionHandler(); if (eh != null) eh.handleZipEntriesInitException(ex, getZipSource().getName()); else throw new RuntimeException("Failed to read zip file: " + getZipSource(), ex); } finally { if (initStatus == InitializationStatus.INITIALIZING) initStatus = InitializationStatus.NOT_INITIALIZED; } } /** * Mount ZipEntryContext created around extracted nested archive * * @param parent the parent * @param name the name * @param file the file * @return mounted delegate * @throws IOException for any error * @throws URISyntaxException for any URI syntax error */ protected DelegatingHandler mountZipFile(VirtualFileHandler parent, String name, File file) throws IOException, URISyntaxException { DelegatingHandler delegator = new DelegatingHandler(this, parent, name); URL fileUrl = file.toURL(); URL delegatorUrl = fileUrl; if (parent != null) delegatorUrl = getChildURL(parent, name); delegatorUrl = setOptionsToURL(delegatorUrl); ZipEntryContext ctx = new ZipEntryContext(delegatorUrl, delegator, fileUrl, true); VirtualFileHandler handler = ctx.getRoot(); delegator.setDelegate(handler); return delegator; } /** * Mount ZipEntryContext created around ZipStreamWrapper * * @param parent the parent * @param name the name * @param zipStream the zip stream * @return mounted delegate * @throws IOException for any error * @throws URISyntaxException for any URI syntax error */ protected DelegatingHandler mountZipStream(VirtualFileHandler parent, String name, InputStream zipStream) throws IOException, URISyntaxException { DelegatingHandler delegator = new DelegatingHandler(this, parent, name); ZipStreamWrapper wrapper = new ZipStreamWrapper(zipStream, name, parent.getLastModified()); URL delegatorUrl = null; if (parent != null) delegatorUrl = getChildURL(parent, name); delegatorUrl = setOptionsToURL(delegatorUrl); ZipEntryContext ctx = new ZipEntryContext(delegatorUrl, delegator, wrapper, false); VirtualFileHandler handler = ctx.getRoot(); delegator.setDelegate(handler); return delegator; } /** * Zip archives sometimes don't contain directory entries - only leaf entries * * @param parentPath the parent path * @return entry info * @throws IOException for any error */ private EntryInfo makeDummyParent(String parentPath) throws IOException { // get grand parent first String [] split = splitParentChild(parentPath); String grandPa = split[0]; EntryInfo eiParent = entries.get(grandPa); if(eiParent == null) eiParent = makeDummyParent(grandPa); ZipEntryHandler handler = new ZipEntryHandler(this, eiParent.handler, split[1], false); EntryInfo ei = new EntryInfo(handler, null); entries.put(parentPath, ei); return ei; } /** * Initialize rootEntryPath and return archive file path * * @param localRootUrl local root url * @return file path */ private String initRootAndPath(URL localRootUrl) { String filePath = localRootUrl.toString(); String zipPath = filePath; int pos = filePath.indexOf("!"); if(pos > 0) { zipPath = filePath.substring(0, pos); rootEntryPath = filePath.substring(pos+2); if(rootEntryPath.length() != 0) rootEntryPath += "/"; } // find where url protocol ends - i.e. jar:file:/ ... pos= zipPath.indexOf(":/"); filePath = zipPath.substring(pos + 1); // cut out url query part if present int queryStart = filePath.indexOf("?"); if (queryStart != -1) filePath = filePath.substring(0, queryStart); return filePath; } /** * If archive has been modified, clear entries and re-initialize. * If not initialized yet, initialize it. */ private synchronized void checkIfModified() { // TODO: if zipSource represents a nested archive we should maybe delegate lastModified to its parent if (initStatus == InitializationStatus.NOT_INITIALIZED) { ensureEntries(); } else if (initStatus == InitializationStatus.INITIALIZED && getZipSource().hasBeenModified()) { EntryInfo rootInfo = entries.get(""); entries = new ConcurrentHashMap(); entries.put("", rootInfo); if (getZipSource().exists()) { try { initEntries(); } catch(Exception ignored) { log.warn("IGNORING: Failed to reinitialize context: " + getRootURI(), ignored); } } } } /** * Returns this context's root * * @return root handler */ public VirtualFileHandler getRoot() { return entries.get("").handler; } /** * Find a child with a given name and a given parent * * @param parent parent handler * @param name name of the child * @return child handler or null if not found */ public VirtualFileHandler getChild(ZipEntryHandler parent, String name) { if (parent == null) throw new IllegalArgumentException("Null parent"); checkIfModified(); String pathName = parent.getLocalPathName(); if("".equals(pathName)) pathName = name; else pathName = pathName + "/" + name; EntryInfo ei = entries.get(pathName); if(ei != null) return ei.handler; return null; } /** * Returns a list of children for a given parent * * @param parent parent handler * @param ignoreErrors true if errors should be silently ignored * @return list of handlers representing children of the given parent * @throws IOException for any error */ public List getChildren(VirtualFileHandler parent, boolean ignoreErrors) throws IOException { if (parent == null) throw new IllegalArgumentException("Null parent"); checkIfModified(); if(parent instanceof AbstractVirtualFileHandler) { AbstractVirtualFileHandler parentHandler = (AbstractVirtualFileHandler) parent; EntryInfo parentEntry = entries.get(parentHandler.getLocalPathName()); if (parentEntry != null) { if (parentEntry.handler instanceof DelegatingHandler) return parentEntry.handler.getChildren(ignoreErrors); return parentEntry.getChildren(); } } return Collections.emptyList(); } /** * Do delete. * * @param handler the zip entry handler * @param gracePeriod the grace period * @return true if delete succeeded * @throws IOException for any error */ public boolean delete(ZipEntryHandler handler, int gracePeriod) throws IOException { return getRoot().equals(handler) && getZipSource().delete(gracePeriod); } /** * Close the handler, if it's root. * * @param handler the handler to close */ public void cleanup(ZipEntryHandler handler) { VirtualFileHandler rootHandler = getRoot(); if (rootHandler.equals(handler)) { // only cleanup nested - as they might be temp files we want to delete for (VirtualFileHandler vfh : nestedHandlers) { vfh.cleanup(); } getZipSource().close(); // close == cleanup in zip source impl } } /** * Returns lastModified timestamp for a given handler * * @param handler a handler * @return lastModified timestamp */ public long getLastModified(ZipEntryHandler handler) { if (handler == null) throw new IllegalArgumentException("Null handler"); if (getRoot().equals(handler) == false) checkIfModified(); EntryInfo ei = entries.get(handler.getLocalPathName()); if(ei == null) return 0; if(ei.entry == null) { return getZipSource().getLastModified(); } return ei.entry.getTime(); } /** * Returns the size for a given handler * * @param handler a handler * @return size in bytes */ public long getSize(ZipEntryHandler handler) { if (handler == null) throw new IllegalArgumentException("Null handler"); if(getRoot().equals(handler)) return getZipSource().getSize(); checkIfModified(); EntryInfo ei = entries.get(handler.getLocalPathName()); if(ei == null || ei.entry == null) return 0; return ei.entry.getSize(); } /** * Returns true if entry exists for a given handler * * @param handler a handler * @return true if entry exists */ public boolean exists(ZipEntryHandler handler) { if (handler == null) throw new IllegalArgumentException("Null handler"); if (getRoot().equals(handler)) return getZipSource().exists(); checkIfModified(); EntryInfo ei = entries.get(handler.getLocalPathName()); return ei != null; } /** * Returns true if handler represents a non-directory entry * * @param handler a handler * @return true if not a directory */ public boolean isLeaf(ZipEntryHandler handler) { if (handler == null) throw new IllegalArgumentException("Null handler"); if (getRoot().equals(handler) == false) checkIfModified(); EntryInfo ei = entries.get(handler.getLocalPathName()); if (ei == null || ei.entry == null) return false; return ei.entry.isDirectory() == false; } /** * Is archive. * * @param handler the handler * @return true if archive */ static boolean isArchive(VirtualFileHandler handler) { if (handler instanceof ZipEntryHandler && "".equals(handler.getLocalPathName())) { return true; } if (handler instanceof DelegatingHandler && ((DelegatingHandler) handler).getDelegate() instanceof ZipEntryHandler) { return true; } return false; } /** * Get parent. * * @param handler the handler to check * @return parent handler * @throws IOException for any error */ static VirtualFileHandler getParent(VirtualFileHandler handler) throws IOException { VirtualFileHandler parent = handler.getParent(); if (parent == null) { VirtualFileHandler peer = handler.getVFSContext().getRootPeer(); if (peer != null) parent = peer.getParent(); } return parent; } /** * Is nested. * * @param handler the handler * @return true if nested * @throws IOException for any error */ static boolean isNested(VirtualFileHandler handler) throws IOException { VirtualFileHandler parent = getParent(handler); while (parent != null) { if(isArchive(parent)) return true; parent = getParent(parent); } return false; } /** * Contents of the file represented by a given handler * * @param handler a handler * @return InputStream with entry's content * @throws IOException for any error */ public InputStream openStream(ZipEntryHandler handler) throws IOException { if (handler == null) throw new IllegalArgumentException("Null handler"); if (getRoot().equals(handler)) return getZipSource().getRootAsStream(); checkIfModified(); EntryInfo ei = entries.get(handler.getLocalPathName()); if (ei == null) { String uriStr; try { uriStr = handler.toURI().toString(); } catch(Exception ex) { throw new RuntimeException("ASSERTION ERROR - uri generation failed for ZipEntryHandler: " + handler, ex); } throw new FileNotFoundException(uriStr); } if(ei.entry == null) return new ByteArrayInputStream(new byte[0]); return getZipSource().openStream(ei.entry); } /** * Add a child to a given parent * * @param parent a parent * @param child a child */ public void addChild(AbstractVirtualFileHandler parent, AbstractVirtualFileHandler child) { if (parent == null) throw new IllegalArgumentException("Null parent"); if (child == null) throw new IllegalArgumentException("Null child"); EntryInfo parentEntry = entries.get(parent.getLocalPathName()); if (parentEntry != null) parentEntry.add(child); else throw new RuntimeException("Parent does not exist: " + parent); } /** * Properly release held resources */ protected void finalize() throws Throwable { try { if (zipSource != null) zipSource.close(); } catch (Throwable ignored) { log.debug("IGNORING: Failed to close zip source: " + zipSource, ignored); } super.finalize(); } /** * Replace a current child of the given parent with another one * * @param parent a parent * @param original current child * @param replacement new child */ public void replaceChild(ZipEntryHandler parent, AbstractVirtualFileHandler original, VirtualFileHandler replacement) { ensureEntries(); EntryInfo parentEntry = entries.get(parent.getLocalPathName()); if (parentEntry != null) { DelegatingHandler newOne; if (replacement instanceof DelegatingHandler) { newOne = (DelegatingHandler) replacement; } else { newOne = new DelegatingHandler(this, parent, original.getName(), replacement); } synchronized(this) { parentEntry.replaceChild(original, newOne); EntryInfo ei = entries.get(original.getLocalPathName()); ei.handler = newOne; ei.entry = null; ei.clearChildren(); } } else { throw new RuntimeException("Parent does not exist: " + parent); } } /** * Get RealURL corresponding to root handler * * @return the real url */ public URL getRealURL() { // make sure realURL has been initialized // realURL is initialized when ZipSource is initialized getZipSource(); return realURL; } /** * Internal data structure holding meta information of a virtual file in this context */ static class EntryInfo { /** a handler */ private AbstractVirtualFileHandler handler; /** a ZipEntry */ private ZipEntry entry; /** a list of children */ private List children; /** * EntryInfo constructor * * @param handler a handler * @param entry an entry */ EntryInfo(AbstractVirtualFileHandler handler, ZipEntry entry) { this.handler = handler; this.entry = entry; } /** * Get children. * * @return returns a list of children for this handler (by copy) */ public synchronized List getChildren() { if (children == null) return Collections.emptyList(); return new LinkedList(children); } /** * Replace a child. * * @param original existing child * @param replacement new child */ public synchronized void replaceChild(AbstractVirtualFileHandler original, AbstractVirtualFileHandler replacement) { if (children != null) { int i = 0; for (AbstractVirtualFileHandler child : children) { if (child.getName().equals(original.getName())) { children.set(i, replacement); break; } i++; } } } /** * Clear the list of children */ public synchronized void clearChildren() { if (children != null) children.clear(); } /** * Add a child. If a child with the same name exists already, first remove it. * * @param child a child */ public synchronized void add(AbstractVirtualFileHandler child) { if (children == null) { children = new LinkedList(); } else { // if a child exists with this name already, remove it Iterator it = children.iterator(); while (it.hasNext()) { AbstractVirtualFileHandler handler = it.next(); if (handler.getName().equals(child.getName())) { it.remove(); break; } } } children.add(child); } } /** * Make sure url protocol is vfszip. * Also remove any '!' from URL * * @param rootURL the root url * @return fixed url * @throws MalformedURLException for any error */ private static URL fixUrl(URL rootURL) throws MalformedURLException { String urlStr = rootURL.toExternalForm(); int pos = urlStr.indexOf("!"); if (pos != -1) { String tmp = urlStr.substring(0, pos); if (pos < urlStr.length()-1) tmp += urlStr.substring(pos+1); urlStr = tmp; } if ("vfszip".equals(rootURL.getProtocol()) == false) { pos = urlStr.indexOf(":/"); if (pos != -1) urlStr = urlStr.substring(pos); return new URL("vfszip" + urlStr); } return rootURL; } /** * Break to path + name * * @param pathName the path name * @return path tokens */ public static String [] splitParentChild(String pathName) { if (pathName.startsWith("/")) pathName = pathName.substring(1); if(pathName.length() == 0) return new String [] {null, pathName}; int toPos = pathName.length(); if(pathName.charAt(pathName.length()-1) == '/') toPos --; int delimPos = pathName.lastIndexOf('/', toPos-1); String [] ret; if(delimPos == -1) { ret = new String [] { "", pathName.substring(delimPos+1, toPos) }; } else { ret = new String [] { pathName.substring(0, delimPos), pathName.substring(delimPos+1, toPos) }; } return ret; } /** * Temporary files naming scheme * * @param name the name * @return random name */ private static String getTempFileName(String name) { int delim = name.lastIndexOf("/"); if (delim != -1) name = name.substring(delim+1); return UUID.randomUUID().toString().substring(0, 8) + "_" + name; } /** * Use VFS's temp directory and make 'vfs-nested.tmp' sub-directory inside it for our purposes * * @return temp dir */ private static String getTempDir() { File dir = new File(AbstractCopyMechanism.getTempDirectory(), "vfs-nested.tmp"); return dir.toString(); } /** * Delete the contents of a temporary directory. Delete first-level files only, don't drill down. */ private static void deleteTmpDirContents() { try { File tmpDir = new File(getTempDir()); File [] files = tmpDir.listFiles(); if (files != null && files.length > 0) { for (File file : files) { if (file.isDirectory() == false && file.isHidden() == false) file.delete(); } } } catch(Exception ignored) { } } /** * PriviligedAction class for checking a system property */ private static class CheckForceCopy implements PrivilegedAction { public Boolean run() { String forceString = System.getProperty(VFSUtils.FORCE_COPY_KEY, "false"); return Boolean.valueOf(forceString); } } static enum InitializationStatus { NOT_INITIALIZED, INITIALIZING, INITIALIZED } private static class RealURLInfo { String rootURL; String relativePath; RealURLInfo(File file) throws MalformedURLException { String url = file.toURL().toExternalForm(); if (url.endsWith("/")) url = url.substring(0, url.length()-1); rootURL = "jar:" + url + "!/"; } URL toURL() throws MalformedURLException { if (relativePath == null || relativePath.length() == 0) return new URL(rootURL); if (relativePath.startsWith("/")) relativePath = relativePath.substring(1); return new URL(rootURL + relativePath); } } } ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/zip/ZipBytesWrapper.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/zip/ZipBytesWrapper.0000644000175000017500000000757211045134476033352 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.zip; import org.jboss.virtual.VFSUtils; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; /** * ZipBytesWrapper - for abstracted access to in-memory bytes entry * * @author Ales Justin */ abstract class ZipBytesWrapper extends ZipWrapper { /** Zip archive loaded in memory */ private byte [] zipBytes; /** Name */ private String name; /** * ZipBytesWrapper is not aware of actual zip source so it can not detect * if it's been modified, like ZipFileWrapper does. * * @param zipStream the current zip input stream * @param name the name * @param lastModified passed by zip stream provider - constant value * @throws IOException for any error */ ZipBytesWrapper(InputStream zipStream, String name, long lastModified) throws IOException { // read the contents into memory buffer ByteArrayOutputStream bout = new ByteArrayOutputStream(); VFSUtils.copyStreamAndClose(zipStream, bout); zipBytes = bout.toByteArray(); // TODO - delegate file meta info operations to parent? this.name = name; this.lastModified = lastModified; } /** * Returns true if archive exists * * @return always true */ boolean exists() { return true; } /** * Returns lastModified of this archive * * @return constant lastModified */ long getLastModified() { return lastModified; } /** * Returns the name of this archive * * @return name */ String getName() { return name; } /** * Returns the size of this archive * * @return uncompressed size of this archive */ long getSize() { return zipBytes.length; } /** * Returns raw bytes that represent this archive in its compressed form * * @return compressed bytes of this archive - as InputStream * @throws FileNotFoundException for any error */ InputStream getRootAsStream() throws FileNotFoundException { return new ByteArrayInputStream(zipBytes); } /** * Acquire lock. No-op in this implementation */ void acquire() { } /** * Close this wrapper - release memory buffer that stores * raw bytes of the archive in its compressed form */ void close() { zipBytes = null; } boolean delete(int gracePeriod) throws IOException { close(); return true; } /** * String description of this archive * * @return string description of this archive */ public String toString() { return super.toString() + " - " + name; } }././@LongLink0000000000000000000000000000016200000000000011564 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/StructuredVirtualFileHandler.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/StructuredVirtualFil0000644000175000017500000000321010743732504033507 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context; import java.io.IOException; import org.jboss.virtual.spi.VirtualFileHandler; /** * A handler that has structure, i.e. you want * to go through the path in individual elements * * @author Adrian Brock * @version $Revision: 1.1 $ */ public interface StructuredVirtualFileHandler { /** * Create a virtual file context * * @param name the name * @return the handler * @throws IOException for any error accessing the virtual file system * @throws IllegalArgumentException for a null name */ VirtualFileHandler createChildHandler(String name) throws IOException; } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/AbstractURIHandler.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/AbstractURIHandler.j0000644000175000017500000000477310734323332033224 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context; import java.io.IOException; import java.io.InputStream; import java.net.URI; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VirtualFileHandler; /** * URIHandler stub. * * @author Adrian Brock * @version $Revision: 1.1 $ */ public abstract class AbstractURIHandler extends AbstractVirtualFileHandler { private static final long serialVersionUID = 1L; /** The uri */ private final URI uri; /** * Create a newURLHandler. * * @param context the context * @param parent the parent * @param uri the uri * @param name the name * @throws IllegalArgumentException for a null context, vfsPath or url */ public AbstractURIHandler(VFSContext context, VirtualFileHandler parent, URI uri, String name) { super(context, parent, name); if (uri == null) throw new IllegalArgumentException("Null uri"); this.uri = uri; } /** * Get the uri * * @return the uri */ public URI getURI() { return uri; } public long getLastModified() throws IOException { checkClosed(); return 0; } public long getSize() throws IOException { checkClosed(); return 0; } public boolean isHidden() throws IOException { checkClosed(); return false; } public InputStream openStream() throws IOException { checkClosed(); return null; } public URI toURI() { return uri; } } libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/jar/0000755000175000017500000000000011146622526030176 5ustar twernertwerner././@LongLink0000000000000000000000000000016000000000000011562 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/jar/NoCopyNestedJarHandler.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/jar/NoCopyNestedJarH0000644000175000017500000001063011031776370033240 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.jar; import java.io.IOException; import java.io.InputStream; import java.net.URISyntaxException; import java.net.URL; import java.util.List; import java.util.jar.JarFile; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VirtualFileHandler; /** * Nested Jar Handler. * * @author Ales Justin * @author Adrian Brock * @version $Revision: 1.1 $ */ public class NoCopyNestedJarHandler extends AbstractJarHandler { /** serialVersionUID */ private static final long serialVersionUID = 1L; /** The nested jar */ private NestedJarFromStream njar; /** * Create a new NestedJarHandler. * * @param context the context * @param parent the parent * @param parentJar the parent jar file * @param entry the jar entry * @param url the url * @param entryName the entry name * @throws IOException for an error accessing the file system * @throws IllegalArgumentException for a null context, url or vfsPath */ public NoCopyNestedJarHandler(VFSContext context, VirtualFileHandler parent, JarFile parentJar, ZipEntry entry, URL url, String entryName) throws IOException { super(context, parent, url, parentJar, entry, entryName); try { setPathName(getChildPathName(entryName, false)); setVfsUrl(getChildVfsUrl(entryName, false)); } catch (URISyntaxException e) { throw new RuntimeException(e); } try { InputStream is = parentJar.getInputStream(entry); ZipInputStream zis; if(is instanceof ZipInputStream) { zis = (ZipInputStream) is; } else { zis = new ZipInputStream(is); } njar = new NestedJarFromStream(context, parent, zis, url, parentJar, entry, entryName); } catch (IOException original) { // Fix the context of the error message IOException e = new IOException("Error opening jar file: " + url + " reason=" + original.getMessage()); e.setStackTrace(original.getStackTrace()); throw e; } } protected void initCacheLastModified() { } @Override public long getLastModified() throws IOException { return getEntry().getTime(); } @Override public long getSize() throws IOException { return getEntry().getSize(); } public boolean isNested() throws IOException { return true; } @Override public InputStream openStream() throws IOException { return getJar().getInputStream(getEntry()); } public VirtualFileHandler getChild(String path) throws IOException { if (path == null) throw new IllegalArgumentException("Null path"); if ("".equals(path)) return this; return njar.getChild(path); } public boolean removeChild(String name) throws IOException { return false; } public List getChildren(boolean ignoreErrors) throws IOException { return njar.getChildren(ignoreErrors); } public boolean delete(int gracePeriod) { return false; } protected void internalReplaceChild(VirtualFileHandler original, VirtualFileHandler replacement) { njar.internalReplaceChild(original, replacement); } } ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/jar/NestedJarFromStream.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/jar/NestedJarFromStr0000644000175000017500000002603211031776370033320 0ustar twernertwerner/* * Copyright (c) 2005 Your Corporation. All Rights Reserved. */ package org.jboss.virtual.plugins.context.jar; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.ObjectStreamField; import java.io.ObjectInputStream.GetField; import java.io.ObjectOutputStream.PutField; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.Enumeration; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import java.util.jar.JarFile; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VirtualFileHandler; /** * A nested jar implementation used to represent a jar within a jar. * * @author Ales.Justin@jboss.org * @author Scott.Stark@jboss.org * @version $Revision: 44334 $ */ public class NestedJarFromStream extends AbstractStructuredJarHandler { /** * serialVersionUID */ private static final long serialVersionUID = 2L; /** The class serial fields */ private static final ObjectStreamField[] serialPersistentFields = { new ObjectStreamField("zisBytes", byte[].class), new ObjectStreamField("jarURL", URL.class), new ObjectStreamField("entryURL", String.class), new ObjectStreamField("lastModified", long.class), new ObjectStreamField("size", long.class) }; private transient ZipInputStream zis; private transient AtomicBoolean inited = new AtomicBoolean(false); private URL jarURL; private URL entryURL; private long lastModified; private long size; /** * Create a nested jar from the parent zip inputstream/zip entry. * * @param context - the context containing the jar * @param parent - the jar handler for this nested jar * @param zis - the jar zip input stream * @param jarURL - the URL to use as the jar URL * @param jar - the parent jar file for the nested jar * @param entry - the zip entry * @param entryName - the entry name * @throws IOException for any error */ public NestedJarFromStream(VFSContext context, VirtualFileHandler parent, ZipInputStream zis, URL jarURL, JarFile jar, ZipEntry entry, String entryName) throws IOException { super(context, parent, jarURL, jar, entry, entryName); this.jarURL = jarURL; this.lastModified = entry.getTime(); this.size = entry.getSize(); this.zis = zis; try { setPathName(getChildPathName(entryName, false)); setVfsUrl(getChildVfsUrl(entryName, false)); } catch (Exception e) { throw new RuntimeException(e); } } protected void initCacheLastModified() { cachedLastModified = lastModified; } /** * Initialize entries. * * @throws IOException for any error */ protected void init() throws IOException { if (inited.get() == false) { inited.set(true); try { initJarFile(new ZisEnumeration()); } finally { close(); } } } public List getChildren(boolean ignoreErrors) throws IOException { init(); return super.getChildren(ignoreErrors); } public VirtualFileHandler getChild(String path) throws IOException { init(); return super.getChild(path); } public boolean removeChild(String name) throws IOException { return false; } public VirtualFileHandler createChildHandler(String name) throws IOException { init(); return super.createChildHandler(name); } protected void extraWrapperInfo(ZipEntryWrapper wrapper) throws IOException { byte[] contents; int size = (int)wrapper.getSize(); if (size != 0) { ByteArrayOutputStream baos = size > 0 ? new ByteArrayOutputStream(size) : new ByteArrayOutputStream(); byte[] tmp = new byte[1024]; while (zis.available() > 0) { int length = zis.read(tmp); if (length > 0) baos.write(tmp, 0, length); } contents = baos.toByteArray(); } else contents = new byte[0]; wrapper.setExtra(contents); } protected VirtualFileHandler createVirtualFileHandler(VirtualFileHandler parent, ZipEntryWrapper wrapper, String entryName) throws IOException { try { String url = toURI().toASCIIString() + "!/" + wrapper.getName(); URL jecURL = new URL(url); VFSContext context = parent.getVFSContext(); if (wrapper.isDirectory()) { return new SynthenticDirEntryHandler(context, parent, entryName, System.currentTimeMillis(), jecURL); } else { byte[] contents = wrapper.getExtra(); return new JarEntryContents(context, parent, wrapper.getEntry(), entryName, toURL(), jecURL, contents); } } catch (Throwable t) { IOException ioe = new IOException("Exception while reading nested jar entry: " + this); ioe.initCause(t); ioe.setStackTrace(t.getStackTrace()); throw ioe; } } /** * TODO: removing the entry/jar that resulted in this needs * to be detected. */ public boolean exists() throws IOException { return true; } public boolean isHidden() { return false; } public long getSize() { return size; } public long getLastModified() throws IOException { return lastModified; } public boolean isNested() throws IOException { return true; } public boolean delete(int gracePeriod) { return false; } // Stream accessor public InputStream openStream() throws IOException { if(zis == null) { // Need to obtain this nested jar input stream from parent InputStream parentIS = super.getParent().openStream(); if(parentIS == null) throw new IOException("Failed to open parent stream, "+this); if(parentIS instanceof ZipInputStream) { zis = (ZipInputStream) parentIS; } else { zis = new ZipInputStream(parentIS); } // First find our entry ZipEntry entry = zis.getNextEntry(); while(entry != null) { if(entry.getName().equals(getName())) break; entry = zis.getNextEntry(); } if(entry == null) throw new IOException("Failed to find nested jar entry: "+this.getName()+" in parent: "+getParent()); } return zis; } public void close() { if (zis != null) { try { zis.close(); } catch (IOException e) { log.error("close error", e); } zis = null; } } public URI toURI() throws URISyntaxException { try { if (entryURL == null) entryURL = new URL(jarURL, getName()); } catch (MalformedURLException e) { throw new URISyntaxException("Failed to create relative jarURL", e.getMessage()); } return entryURL.toURI(); } public String toString() { StringBuffer tmp = new StringBuffer(super.toString()); tmp.append('['); tmp.append("name="); tmp.append(getName()); tmp.append(",size="); tmp.append(getSize()); tmp.append(",lastModified="); tmp.append(lastModified); tmp.append(",URI="); try { tmp.append(toURI()); } catch (URISyntaxException e) { } tmp.append(']'); return tmp.toString(); } protected void initJarFile() throws IOException { // todo - deserialize } private class ZisEnumeration implements Enumeration> { private boolean moved = true; private ZipEntry next = null; public boolean hasMoreElements() { if (zis == null) return false; try { if (moved) { next = zis.getNextEntry(); moved = false; } return next != null; } catch (IOException e) { throw new RuntimeException(e); } } public ZipEntryWrapper nextElement() { moved = true; return new ZipEntryWrapper(next); } } /** * Write the jar contents and information * @param out * @throws IOException */ private void writeObject(ObjectOutputStream out) throws IOException { PutField fields = out.putFields(); byte[] zisBytes; ZipInputStream jarStream = zis; if(jarStream == null) { // Need to obtain this nested jar input stream from parent InputStream parentIS = super.getParent().openStream(); if(parentIS == null) throw new IOException("Failed to open parent stream, "+this); jarStream = new ZipInputStream(parentIS); // First find our entry ZipEntry entry = jarStream.getNextEntry(); while(entry != null) { if(entry.getName().equals(getName())) break; entry = jarStream.getNextEntry(); } if(entry == null) throw new IOException("Failed to find nested jar entry: "+this.getName()+" in parent: "+getParent()); } // Now read zis for this entry ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] tmp = new byte[1024]; int length = jarStream.read(tmp); while(length > 0) { baos.write(tmp, 0, length); length = jarStream.read(tmp); } jarStream.close(); jarStream = null; zisBytes = baos.toByteArray(); fields.put("zisBytes", zisBytes); fields.put("jarURL", jarURL); fields.put("entryURL", entryURL); fields.put("lastModified", lastModified); fields.put("size", size); out.writeFields(); } /** * Read the jar contents and reinitialize the entry map * @param in * @throws IOException * @throws ClassNotFoundException */ private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { // Read in the serialPersistentFields GetField fields = in.readFields(); byte[] zisBytes = (byte[]) fields.get("zisBytes", null); this.jarURL = (URL) fields.get("jarURL", null); this.entryURL = (URL) fields.get("entryURL", null); this.lastModified = fields.get("lastModified", (long)-1); this.size = fields.get("size", (long)-1); // Initialize the jar entry map inited = new AtomicBoolean(false); ByteArrayInputStream bais = new ByteArrayInputStream(zisBytes); zis = new ZipInputStream(bais); this.init(); } } libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/jar/JarContext.java0000644000175000017500000001033111001375747033120 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.jar; import java.io.IOException; import java.net.URISyntaxException; import java.net.URL; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.plugins.context.AbstractVFSContext; import org.jboss.virtual.plugins.context.AbstractVirtualFileHandler; import org.jboss.virtual.spi.VirtualFileHandler; /** * JarContext. * * @author Scott.Stark@jboss.org * @author Adrian Brock * @version $Revision: 1.1 $ */ public class JarContext extends AbstractVFSContext { /** The root file */ private final VirtualFileHandler root; /** A reference to the virtual file of the root to stop it getting closed */ private final VirtualFile rootFile; /** * Create a new JarContext. * * @param rootURL the root url * @throws IOException for an error accessing the file system * @throws URISyntaxException for an error parsing the URI */ public JarContext(URL rootURL) throws IOException, URISyntaxException { super(rootURL); root = createVirtualFileHandler(null, rootURL); rootFile = root.getVirtualFile(); } public String getName() { return root.getName(); } public VirtualFileHandler getRoot() throws IOException { return root; } /** * Create a new virtual file handler * * @param parent the parent * @param url the url * @return the handler * @throws IOException for any error accessing the file system * @throws IllegalArgumentException for a null entry or url */ protected VirtualFileHandler createVirtualFileHandler(VirtualFileHandler parent, URL url) throws IOException { if (url == null) throw new IllegalArgumentException("Null url"); String urlStr = url.toString(); String jarName = extractJarName(urlStr); String entryPath = urlStr; entryPath = entryPath(entryPath); JarHandler jar = new JarHandler(this, parent, url, jarName); if (entryPath == null) return jar; // todo This is a hack until we can fix http://jira.jboss.com/jira/browse/JBMICROCONT-164 AbstractVirtualFileHandler result = (AbstractVirtualFileHandler)jar.getChild(entryPath); if (result == null) throw new IllegalArgumentException("Null child, entryPath: " + entryPath); result.setPathName(""); return result; } public static String entryPath(String entryName) { int index; index = entryName.indexOf("!/"); if (index != -1) { entryName = entryName.substring(index + 2); } else { entryName = null; } if (entryName == null || "".equals(entryName.trim())) return null; return entryName; } public static String extractJarName(String urlStr) { String jarName = urlStr; int index = jarName.indexOf('!'); if (index != -1) jarName = jarName.substring(0, index); index = jarName.lastIndexOf('/'); if (index != -1 && index < jarName.length()-1) jarName = jarName.substring(index+1); return jarName; } @Override protected void finalize() throws Throwable { if (rootFile != null) rootFile.close(); super.finalize(); } } ././@LongLink0000000000000000000000000000016600000000000011570 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/jar/AbstractStructuredJarHandler.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/jar/AbstractStructur0000644000175000017500000003161411024470511033433 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.jar; import java.io.IOException; import java.io.ObjectInputStream; import java.net.URL; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.zip.ZipEntry; import org.jboss.virtual.VFSUtils; import org.jboss.virtual.plugins.context.HierarchyVirtualFileHandler; import org.jboss.virtual.plugins.context.StructuredVirtualFileHandler; import org.jboss.virtual.plugins.vfs.helpers.PathTokenizer; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VirtualFileHandler; /** * AbstractStructuredJarHandler. * * @param exact extra wrapper type * @author Ales Justin */ public abstract class AbstractStructuredJarHandler extends AbstractJarHandler implements StructuredVirtualFileHandler { /** * serialVersionUID */ private static final long serialVersionUID = 1; /** * The jar entries */ private transient List entries; private transient Map entryMap; /** * Force no copy nested jar handler. */ private static boolean forceCopy; static { forceCopy = AccessController.doPrivileged(new CheckForceCopy()); if (forceCopy) log.info("VFS force copy (NestedJarHandler) is enabled."); } /** * Create a new JarHandler. * * @param context the context * @param parent the parent * @param url the url * @param jar the jar * @param entry the entry * @param name the name * @throws java.io.IOException for an error accessing the file system * @throws IllegalArgumentException for a null context, url or vfsPath */ protected AbstractStructuredJarHandler(VFSContext context, VirtualFileHandler parent, URL url, JarFile jar, ZipEntry entry, String name) throws IOException { super(context, parent, url, jar, entry, name); } /** * Initialize the jar file * * @throws java.io.IOException for any error reading the jar file * @throws IllegalArgumentException for a null jarFile */ protected void initJarFile() throws IOException { /* This cannot be checked because of serialization if (this.jar != null) throw new IllegalStateException("jarFile has already been set"); */ Enumeration> enumeration = new JarEntryEnumeration(getJar().entries()); initJarFile(enumeration); } /** * Initialise the jar file. * * @param enumeration jar entry enumeration * @throws IOException for any error */ protected void initJarFile(Enumeration> enumeration) throws IOException { if (enumeration.hasMoreElements() == false) { entries = Collections.emptyList(); entryMap = Collections.emptyMap(); return; } // Go through and create a structured representation of the jar Map parentMap = new HashMap(); List>> levelMapList = new ArrayList>>(); entries = new ArrayList(); entryMap = new HashMap(); boolean trace = log.isTraceEnabled(); while (enumeration.hasMoreElements()) { ZipEntryWrapper wrapper = enumeration.nextElement(); extraWrapperInfo(wrapper); String[] paths = wrapper.getName().split("/"); int depth = paths.length; if (depth >= levelMapList.size()) { for (int n = levelMapList.size(); n <= depth; n++) levelMapList.add(new ArrayList>()); } ArrayList> levelMap = levelMapList.get(depth); levelMap.add(wrapper); if (trace) log.trace("added " + wrapper.getName() + " at depth " + depth); } // Process each level to build the handlers in parent first order int level = 0; for (ArrayList> levels : levelMapList) { if (trace) log.trace("Level(" + level++ + "): " + levels); for (ZipEntryWrapper wrapper : levels) { String name = wrapper.getName(); int slash = wrapper.isDirectory() ? name.lastIndexOf('/', name.length() - 2) : name.lastIndexOf('/', name.length() - 1); VirtualFileHandler parent = this; if (slash >= 0) { // Need to include the slash in the name to match the ZipEntry.name String parentName = name.substring(0, slash + 1); parent = parentMap.get(parentName); if (parent == null) { // Build up the parent(s) parent = buildParents(parentName, parentMap, wrapper); } } // Get the entry name without any directory '/' ending int start = slash + 1; int end = wrapper.isDirectory() ? name.length() - 1 : name.length(); String entryName = name.substring(start, end); VirtualFileHandler handler = createVirtualFileHandler(parent, wrapper, entryName); if (wrapper.isDirectory()) { parentMap.put(name, handler); if (trace) log.trace("Added parent: " + name); } if (parent == this) { // This is an immeadiate child of the jar handler entries.add(handler); entryMap.put(entryName, handler); } else if (parent instanceof HierarchyVirtualFileHandler) { HierarchyVirtualFileHandler ehandler = (HierarchyVirtualFileHandler) parent; ehandler.addChild(handler); } } } } /** * Handle additional information about wrapper. * * @param wrapper the zip entry wrapper * @throws IOException for any error */ protected void extraWrapperInfo(ZipEntryWrapper wrapper) throws IOException { } /** * Create any missing parents. * * @param parentName full vfs path name of parent * @param parentMap initJarFile parentMap * @param wrapper ZipEntryWrapper missing a parent * @return the VirtualFileHandler for the parent * @throws java.io.IOException for any IO error */ protected VirtualFileHandler buildParents(String parentName, Map parentMap, ZipEntryWrapper wrapper) throws IOException { VirtualFileHandler parent = this; List paths = PathTokenizer.getTokens(parentName); StringBuilder pathName = new StringBuilder(); for (String path : paths) { pathName.append(path); pathName.append('/'); VirtualFileHandler next = parent.getChild(path); if (next == null) next = createSynthenticParent(parent, path, wrapper); parentMap.put(pathName.toString(), next); parent = next; } return parent; } protected VirtualFileHandler createSynthenticParent(VirtualFileHandler parent, String path, ZipEntryWrapper wrapper) throws IOException { URL url = getURL(parent, path, true); // Create a synthetic parent VirtualFileHandler next = new SynthenticDirEntryHandler(getVFSContext(), parent, path, wrapper.getTime(), url); if (parent == this) { // This is an immeadiate child of the jar handler entries.add(next); entryMap.put(path, next); } else if (parent instanceof HierarchyVirtualFileHandler) { HierarchyVirtualFileHandler ehandler = (HierarchyVirtualFileHandler) parent; ehandler.addChild(next); } return next; } public List getChildren(boolean ignoreErrors) throws IOException { checkClosed(); if (entries == null) return Collections.emptyList(); else return Collections.unmodifiableList(entries); } public VirtualFileHandler createChildHandler(String name) throws IOException { return entryMap.get(name); } public VirtualFileHandler getChild(String path) throws IOException { return structuredFindChild(path); } /** * Create a new virtual file handler * * @param parent the parent * @param wrapper the entry wrapper * @param entryName - the entry name without any trailing '/' * @return the handler * @throws java.io.IOException for any error accessing the file system * @throws IllegalArgumentException for a null parent or entry */ protected VirtualFileHandler createVirtualFileHandler(VirtualFileHandler parent, ZipEntryWrapper wrapper, String entryName) throws IOException { if (parent == null) throw new IllegalArgumentException("Null parent"); if (wrapper == null) throw new IllegalArgumentException("Null entry wrapper"); ZipEntry entry = wrapper.getEntry(); URL url = getURL(parent, entryName, entry.isDirectory()); VFSContext context = parent.getVFSContext(); VirtualFileHandler vfh; if (JarUtils.isArchive(entry.getName())) { boolean useCopyJarHandler = forceCopy; if (useCopyJarHandler == false) { String flag = context.getOptions().get(VFSUtils.USE_COPY_QUERY); useCopyJarHandler = Boolean.valueOf(flag); } if (useCopyJarHandler) vfh = NestedJarHandler.create(context, parent, getJar(), entry, url, entryName); else vfh = new NoCopyNestedJarHandler(context, parent, getJar(), entry, url, entryName); } else { vfh = new JarEntryHandler(context, parent, getJar(), entry, entryName, url); } return vfh; } protected void internalReplaceChild(VirtualFileHandler original, VirtualFileHandler replacement) { entries.remove(original); entries.add(replacement); entryMap.put(original.getName(), replacement); } /** * Restore the jar file * * @param in the input stream * @throws IOException for any error reading the jar file * @throws ClassNotFoundException for any jar class finding errors */ private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { // Initial the parent jar entries initJarFile(); } private class JarEntryEnumeration implements Enumeration> { private Enumeration enumeration; public JarEntryEnumeration(Enumeration enumeration) { if (enumeration == null) throw new IllegalArgumentException("Null enumeration"); this.enumeration = enumeration; } public boolean hasMoreElements() { return enumeration.hasMoreElements(); } public ZipEntryWrapper nextElement() { JarEntry entry = enumeration.nextElement(); return new ZipEntryWrapper(entry); } } /** * Check if force no copy system property exists. */ private static class CheckForceCopy implements PrivilegedAction { public Boolean run() { String forceString = System.getProperty(VFSUtils.FORCE_COPY_KEY, "false"); return Boolean.valueOf(forceString); } } } ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/jar/ZipEntryWrapper.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/jar/ZipEntryWrapper.0000644000175000017500000000367610734716267033350 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.jar; import java.util.zip.ZipEntry; /** * Zip entry wrapper. * * @param exact extra type * @author Ales Justin */ class ZipEntryWrapper { private ZipEntry entry; private T extra; ZipEntryWrapper(ZipEntry entry) { if (entry == null) throw new IllegalArgumentException("Null zip entry"); this.entry = entry; } public ZipEntry getEntry() { return entry; } public String getName() { return entry.getName(); } public boolean isDirectory() { return entry.isDirectory(); } public long getTime() { return entry.getTime(); } public long getSize() { return entry.getSize(); } public T getExtra() { return extra; } public void setExtra(T extra) { this.extra = extra; } } ././@LongLink0000000000000000000000000000016300000000000011565 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/jar/SynthenticDirEntryHandler.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/jar/SynthenticDirEnt0000644000175000017500000001344711031776370033370 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.jar; import java.io.IOException; import java.io.InputStream; import java.net.URISyntaxException; import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import org.jboss.virtual.plugins.context.AbstractURLHandler; import org.jboss.virtual.plugins.context.HierarchyVirtualFileHandler; import org.jboss.virtual.plugins.context.StructuredVirtualFileHandler; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VirtualFileHandler; /** * SynthenticDirEntryHandler represents non-existent directory jar entry. * * @author Scott.Stark@jboss.org * @version $Revision: 1.1 $ */ public class SynthenticDirEntryHandler extends AbstractURLHandler implements StructuredVirtualFileHandler, HierarchyVirtualFileHandler { /** * serialVersionUID */ private static final long serialVersionUID = 1L; /** * The jar file */ private List entryChildren; private transient Map entryMap; /** * Create a new SynthenticDirEntryHandler. * * @param context the context * @param parent the parent * @param entryName - the simple name for the dir * @param lastModified the timestamp for the dir * @param url the full url * @throws IOException for an error accessing the file system * @throws IllegalArgumentException for a null context, url, jar or entry */ public SynthenticDirEntryHandler(VFSContext context, VirtualFileHandler parent, String entryName, long lastModified, URL url) throws IOException { super(context, parent, url, entryName); try { URL parentVfsUrl = parent.toVfsUrl(); String vfsParentUrl = parentVfsUrl.toString(); setVfsUrl(getChildVfsUrl(entryName, vfsParentUrl.endsWith("/") == false)); } catch (URISyntaxException e) { throw new RuntimeException(e); } this.cachedLastModified = lastModified; } protected void initCacheLastModified() { } /** * Add a child to an entry * * @param child the child file handler */ public synchronized void addChild(VirtualFileHandler child) { if (entryChildren == null) entryChildren = new ArrayList(); entryChildren.add(child); if (entryMap != null) entryMap.put(child.getName(), child); } @Override public long getLastModified() throws IOException { checkParentExists(); return getParent().getLastModified(); } @Override public long getSize() { return 0; } /** * TODO: removing the entry/jar that resulted in this needs * to be detected. */ public boolean exists() throws IOException { return true; } public boolean isLeaf() { return false; } public boolean isHidden() { checkClosed(); return false; } public boolean isNested() throws IOException { return true; } public boolean delete(int gracePeriod) { return false; } @Override public InputStream openStream() throws IOException { throw new IOException("Directories cannot be opened"); } public List getChildren(boolean ignoreErrors) throws IOException { checkClosed(); if (entryChildren == null) return Collections.emptyList(); return Collections.unmodifiableList(entryChildren); } /** * Create a child handler for the given name. This looks to the entryMap * for an existing child. * * @param name - the simple name of an immeadiate child. * @return the VirtualFileHandler previously added via addChild. * @throws IOException - thrown if there are no children or the * name does not match a child */ // TODO: synchronization on lazy entryMap creation public synchronized VirtualFileHandler createChildHandler(String name) throws IOException { if (entryChildren == null) return null; if (entryMap == null) { entryMap = new HashMap(); for (VirtualFileHandler child : entryChildren) entryMap.put(child.getName(), child); } return entryMap.get(name); } public VirtualFileHandler getChild(String path) throws IOException { return structuredFindChild(path); } public boolean removeChild(String name) throws IOException { return false; } protected void internalReplaceChild(VirtualFileHandler original, VirtualFileHandler replacement) { entryChildren.remove(original); entryChildren.add(replacement); entryMap.put(original.getName(), replacement); } } ././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/jar/JarContextFactory.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/jar/JarContextFactor0000644000175000017500000000372710713124640033343 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2005, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.jar; import java.io.IOException; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import org.jboss.virtual.plugins.context.AbstractContextFactory; import org.jboss.virtual.spi.VFSContext; /** * A jar context factory * * @author Scott.Stark@jboss.org * @author adrian@jboss.org * @version $Revision: 44217 $ */ public class JarContextFactory extends AbstractContextFactory { public JarContextFactory() { super("jar", "vfsjar"); } public VFSContext getVFS(URL root) throws IOException { try { return new JarContext(fromVFS(root)); } catch(URISyntaxException e) { MalformedURLException ex = new MalformedURLException("non-URI compliant URL"); ex.initCause(e); throw ex; } } public VFSContext getVFS(URI root) throws IOException { return getVFS(root.toURL()); } } libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/jar/JarHandler.java0000644000175000017500000000643611031776370033064 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.jar; import java.io.File; import java.io.IOException; import java.net.JarURLConnection; import java.net.URL; import java.util.jar.JarFile; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VirtualFileHandler; /** * JarHandler. * * @author Adrian Brock * @version $Revision: 1.1 $ */ public class JarHandler extends AbstractStructuredJarHandler { /** serialVersionUID */ private static final long serialVersionUID = 1L; /** * Create a new JarHandler. * * @param context the context * @param parent the parent * @param url the url * @param name the name * @throws IOException for an error accessing the file system * @throws IllegalArgumentException for a null context, url or vfsPath */ public JarHandler(VFSContext context, VirtualFileHandler parent, URL url, String name) throws IOException { super(context, parent, url, ((JarURLConnection)openConnection(url)).getJarFile(), null, name); setVfsUrl(new URL("vfs" + url)); try { initJarFile(); } catch (IOException original) { // Fix the context of the error message IOException e = new IOException("Error opening jar file: " + url + " reason=" + original.getMessage()); e.setStackTrace(original.getStackTrace()); throw e; } } public JarHandler(VFSContext context, VirtualFileHandler parent, File file, URL url, String name) throws IOException { super(context, parent, url, new JarFile(file), null, name); setVfsUrl(new URL("vfs" + url)); try { initJarFile(); } catch (IOException original) { // Fix the context of the error message IOException e = new IOException("Error opening jar file: " + url + " reason=" + original.getMessage()); e.setStackTrace(original.getStackTrace()); throw e; } } public boolean removeChild(String path) throws IOException { return false; } public boolean delete(int gracePeriod) throws IOException { getJar().close(); File jarFile = new File(getJar().getName()); return jarFile.delete(); } public boolean isNested() throws IOException { return false; } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/jar/JarEntryContents.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/jar/JarEntryContents0000644000175000017500000001756611031776370033414 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.jar; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import org.jboss.virtual.plugins.context.HierarchyVirtualFileHandler; import org.jboss.virtual.plugins.context.StructuredVirtualFileHandler; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VirtualFileHandler; /** * A nested jar contents implementation used to represent a jar within a jar. * * @author Ales.Justin@jboss.org * @author Scott.Stark@jboss.org */ public class JarEntryContents extends AbstractJarHandler implements StructuredVirtualFileHandler, HierarchyVirtualFileHandler { /** * serialVersionUID */ private static final long serialVersionUID = 1L; private URL entryURL; private byte[] contents; private boolean isJar; private NestedJarFromStream njar; private InputStream openStream; private List entryChildren; private transient Map entryMap; JarEntryContents(VFSContext context, VirtualFileHandler parent, ZipEntry entry, String entryName, URL jarURL, URL entryURL, byte[] contents) throws IOException { super(context, parent, jarURL, null, entry, entryName); try { setPathName(getChildPathName(entryName, false)); setVfsUrl(getChildVfsUrl(entryName, false)); } catch (Exception e) { throw new RuntimeException(e); } this.entryURL = entryURL; this.isJar = JarUtils.isArchive(getName()); this.contents = contents; } protected void initCacheLastModified() { } /** * Add a child to an entry * * @param child the child */ public synchronized void addChild(VirtualFileHandler child) { if (entryChildren == null) entryChildren = new ArrayList(); entryChildren.add(child); if (entryMap != null) entryMap.put(child.getName(), child); } /** * TODO: removing the entry/jar that resulted in this needs * to be detected. */ public boolean exists() throws IOException { return true; } public boolean isHidden() throws IOException { return false; } public boolean isNested() throws IOException { return true; } byte[] getContents() { return contents; } public List getChildren(boolean ignoreErrors) throws IOException { List children; if (isJar) { initNestedJar(); children = njar.getChildren(ignoreErrors); } else { children = entryChildren; } if (children == null) return Collections.emptyList(); else return Collections.unmodifiableList(children); } public VirtualFileHandler createChildHandler(String name) throws IOException { if (isJar) { initNestedJar(); return njar.createChildHandler(name); } else return findChildHandler(name); } public VirtualFileHandler getChild(String path) throws IOException { if (path == null) throw new IllegalArgumentException("Null path"); if ("".equals(path)) return this; if (isJar) { initNestedJar(); return njar.getChild(path); } else if (getEntry().isDirectory()) { return structuredFindChild(path); } return null; } public boolean removeChild(String path) { return false; } /** * Find the handler. * TODO: synchronization on lazy entryMap creation * * @param name the path name * @return handler or null is it doesn't exist * @throws IOException for any error */ protected synchronized VirtualFileHandler findChildHandler(String name) throws IOException { if (entryChildren == null) return null; if (entryMap == null) { entryMap = new HashMap(); for (VirtualFileHandler child : entryChildren) entryMap.put(child.getName(), child); } return entryMap.get(name); } // Convience attribute accessors public long getLastModified() { return getEntry().getTime(); } public long getSize() { return getEntry().getSize(); } public boolean isLeaf() { return isJar == false && getEntry().isDirectory() == false; } public boolean delete(int gracePeriod) { return false; } // Stream accessor public synchronized InputStream openStream() throws IOException { initNestedJar(); if (njar != null) openStream = njar.openStream(); else openStream = new ByteArrayInputStream(contents); return openStream; } public synchronized void close() { if (openStream != null) { try { openStream.close(); } catch (IOException e) { log.error("close error", e); } openStream = null; } } public URI toURI() throws URISyntaxException { return entryURL.toURI(); } protected void internalReplaceChild(VirtualFileHandler original, VirtualFileHandler replacement) { if (isJar) { njar.internalReplaceChild(original, replacement); } else { entryChildren.remove(original); entryChildren.add(replacement); entryMap.put(original.getName(), replacement); } } public String toString() { StringBuffer tmp = new StringBuffer(super.toString()); tmp.append('['); tmp.append("name="); tmp.append(getName()); tmp.append(",size="); tmp.append(getSize()); tmp.append(",time="); tmp.append(getLastModified()); tmp.append(",URI="); try { tmp.append(toURI()); } catch (URISyntaxException ignored) { } tmp.append(']'); return tmp.toString(); } protected synchronized void initNestedJar() throws IOException { if (isJar && njar == null) { ByteArrayInputStream bais = new ByteArrayInputStream(contents); ZipInputStream zis = new ZipInputStream(bais); njar = new NestedJarFromStream(getVFSContext(), getParent(), zis, entryURL, null, getEntry(), getName()); } } } ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/jar/JarEntryHandler.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/jar/JarEntryHandler.0000644000175000017500000001227511031776370033242 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.jar; import java.io.IOException; import java.io.InputStream; import java.net.URISyntaxException; import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.jar.JarFile; import java.util.zip.ZipEntry; import org.jboss.virtual.plugins.context.HierarchyVirtualFileHandler; import org.jboss.virtual.plugins.context.StructuredVirtualFileHandler; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VirtualFileHandler; /** * JarEntryHandler. * TODO: JBVFS-7 * * @author Ales Justin * @author Adrian Brock * @author Scott.Stark@jboss.org * @version $Revision: 1.1 $ */ public class JarEntryHandler extends AbstractJarHandler implements StructuredVirtualFileHandler, HierarchyVirtualFileHandler { /** * serialVersionUID */ private static final long serialVersionUID = 1L; private List entryChildren; private transient Map entryMap; /** * Create a new JarHandler. * * @param context the context * @param parent the parent * @param jar the jar file * @param entry the entry * @param entryName the entry name * @param url the url * @throws IOException for an error accessing the file system * @throws IllegalArgumentException for a null context, url, jar or entry */ public JarEntryHandler(VFSContext context, VirtualFileHandler parent, JarFile jar, ZipEntry entry, String entryName, URL url) throws IOException { super(context, parent, url, jar, entry, entryName); try { setVfsUrl(getChildVfsUrl(entryName, entry.isDirectory())); } catch (URISyntaxException e) { throw new RuntimeException(e); } } @Override protected void initCacheLastModified() { // complete } @Override public boolean hasBeenModified() throws IOException { return false; // right now, jar entries should always } /** * Add a child to an entry * * @param child the child */ public void addChild(VirtualFileHandler child) { if (entryChildren == null) entryChildren = new ArrayList(); entryChildren.add(child); if (entryMap != null) entryMap.put(child.getName(), child); } @Override public long getLastModified() { return getEntry().getTime(); } @Override public long getSize() { return getEntry().getSize(); } public boolean isLeaf() { return getEntry().isDirectory() == false; } public boolean isHidden() { checkClosed(); return false; } public boolean isNested() throws IOException { return true; } public List getChildren(boolean ignoreErrors) throws IOException { checkClosed(); if (entryChildren == null) return Collections.emptyList(); return Collections.unmodifiableList(entryChildren); } @Override public InputStream openStream() throws IOException { return getJar().getInputStream(getEntry()); } // TODO: synchronization on lazy entryMap creation public synchronized VirtualFileHandler createChildHandler(String name) throws IOException { if (entryChildren == null) return null; if (entryMap == null) { entryMap = new HashMap(); for (VirtualFileHandler child : entryChildren) entryMap.put(child.getName(), child); } return entryMap.get(name); } public VirtualFileHandler getChild(String path) throws IOException { return structuredFindChild(path); } public boolean removeChild(String path) throws IOException { return false; } public boolean delete(String path) { return false; } protected void internalReplaceChild(VirtualFileHandler original, VirtualFileHandler replacement) { entryChildren.remove(original); entryChildren.add(replacement); entryMap.put(original.getName(), replacement); } } libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/jar/JarUtils.java0000644000175000017500000000766010734323332032602 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.jar; import java.net.MalformedURLException; import java.net.URL; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; /** * JarUtils. * * @author Adrian Brock * @version $Revision: 1.1 $ */ public class JarUtils { /** The jar suffixes */ private static Set jarSuffixes = new CopyOnWriteArraySet(); // Initialise known suffixes static { jarSuffixes.add(".zip"); jarSuffixes.add(".ear"); jarSuffixes.add(".jar"); jarSuffixes.add(".rar"); jarSuffixes.add(".war"); jarSuffixes.add(".sar"); jarSuffixes.add(".har"); jarSuffixes.add(".aop"); } /** * Sets the jar suffixes * * @param suffixes the suffixes * @throws IllegalArgumentException for a null suffix */ public static void setJarSuffixes(Set suffixes) { if (suffixes == null) throw new IllegalArgumentException("Null suffix"); jarSuffixes = suffixes; } /** * Add a jar suffix * * @param suffix the suffix * @return true when added * @throws IllegalArgumentException for a null suffix */ public static boolean addJarSuffix(String suffix) { if (suffix == null) throw new IllegalArgumentException("Null suffix"); return jarSuffixes.add(suffix); } /** * Remove a jar suffix * * @param suffix the suffix * @return true when removed * @throws IllegalArgumentException for a null suffix */ public static boolean removeJarSuffix(String suffix) { if (suffix == null) throw new IllegalArgumentException("Null suffix"); return jarSuffixes.remove(suffix); } /** * Get the lis of jar suffixes * * @return the list of suffixes */ public static Set getSuffixes() { return jarSuffixes; } /** * Clear the list of suffixes * */ public static void clearSuffixes() { jarSuffixes.clear(); } /** * Utilities */ private JarUtils() { } /** * Whether this is an archive * * @param name the name * @return true when an archive * @throws IllegalArgumentException for a null name */ public static boolean isArchive(String name) { if (name == null) throw new IllegalArgumentException("Null name"); for(String suffix : jarSuffixes) { if (name.endsWith(suffix)) return true; } return false; } /** * Create a jar url from a normal url * * @param url the normal url * @return the jar url * @throws MalformedURLException if the url is malformed * @throws IllegalArgumentException for a null url */ public static URL createJarURL(URL url) throws MalformedURLException { if (url == null) throw new IllegalArgumentException("Null url"); return new URL("jar:" + url + "!/"); } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/jar/NestedJarHandler.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/jar/NestedJarHandler0000644000175000017500000001420511137562372033302 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.jar; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.net.URISyntaxException; import java.net.URL; import java.util.jar.JarFile; import java.util.zip.ZipEntry; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VirtualFileHandler; /** * Nested Jar Handler. * * @author Ales Justin * @author Adrian Brock * @author Scott.Stark@jboss.org * @version $Revision: 1.1 $ */ public class NestedJarHandler extends AbstractStructuredJarHandler { /** serialVersionUID */ private static final long serialVersionUID = 1L; /** The temporary file */ private transient File temp; /** * Create a temporary jar * * @param temp the temporary file * @param parentJar the jar * @param entry the jar entry * @return the jar file * @throws IOException for any error */ private static JarFile createTempJar(File temp, JarFile parentJar, ZipEntry entry) throws IOException { InputStream inputStream = parentJar.getInputStream(entry); try { FileOutputStream outputStream = new FileOutputStream(temp); try { byte[] buffer = new byte[8096]; int read = inputStream.read(buffer); while (read != -1) { outputStream.write(buffer, 0, read); read = inputStream.read(buffer); } } finally { outputStream.close(); } } finally { try { inputStream.close(); } catch (IOException ignored) { } } return new JarFile(temp); } public static NestedJarHandler create(VFSContext context, VirtualFileHandler parent, JarFile parentJar, ZipEntry entry, URL url, String entryName) throws IOException { File temp; try { temp = File.createTempFile("nestedjar", null); temp.deleteOnExit(); } catch (IOException original) { // Fix the context of the error message IOException e = new IOException("Error opening jar file: " + url + " reason=" + original.getMessage()); e.setStackTrace(original.getStackTrace()); throw e; } return new NestedJarHandler(context, parent, parentJar, entry, url, temp, entryName); } /** * Create a new NestedJarHandler. * * @param context the context * @param parent the parent * @param parentJar the parent jar file * @param entry the jar entry * @param original the original url * @param temp the temporary file * @param entryName the entry name * @throws IOException for an error accessing the file system * @throws IllegalArgumentException for a null context, url or vfsPath */ protected NestedJarHandler(VFSContext context, VirtualFileHandler parent, JarFile parentJar, ZipEntry entry, URL original, File temp, String entryName) throws IOException { super(context, parent, temp.toURL(), createTempJar(temp, parentJar, entry), entry, entryName); try { setPathName(getChildPathName(entryName, false)); setVfsUrl(getChildVfsUrl(entryName, false)); } catch (URISyntaxException e) { throw new RuntimeException(e); } this.temp = temp; try { initJarFile(); } catch (IOException old) { // Fix the context of the error message IOException e = new IOException("Error opening jar file: " + original + " reason=" + old.getMessage()); e.setStackTrace(old.getStackTrace()); throw e; } } @Override public long getLastModified() throws IOException { return getEntry().getTime(); } @Override public long getSize() throws IOException { return getEntry().getSize(); } public boolean isNested() throws IOException { return false; } /** * Overriden to return the raw tmp jar file stream */ @Override public InputStream openStream() throws IOException { return new FileInputStream(temp); } public boolean removeChild(String name) throws IOException { return false; } @Override public void cleanup() { try { delete(2000); } catch (Exception ignored) { } } public boolean delete(int gracePeriod) throws IOException { if (temp != null) { boolean deleted = temp.delete(); if (deleted) return super.delete(gracePeriod); return deleted; } else { return false; } } /** * Restore the temp file * * @param in the input stream * @throws IOException for any error reading the jar file * @throws ClassNotFoundException for any jar class finding errors */ private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { // TODO - temp? } } ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/jar/AbstractJarHandler.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/jar/AbstractJarHandl0000644000175000017500000001604511031515521033263 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.jar; import java.io.File; import java.io.IOException; import java.io.ObjectInputStream; import java.net.JarURLConnection; import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URL; import java.net.URLConnection; import java.util.Stack; import java.util.jar.JarFile; import java.util.zip.ZipEntry; import org.jboss.virtual.plugins.context.AbstractURLHandler; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VirtualFileHandler; /** * AbstractJarHandler. * * @author Ales Justin * @author Adrian Brock * @author Scott.Stark@jboss.org * @version $Revision: 1.1 $ */ public abstract class AbstractJarHandler extends AbstractURLHandler { /** * serialVersionUID */ private static final long serialVersionUID = 1; /** * The jar file */ private transient JarFile jar; /** * The jar entry */ private transient ZipEntry entry; /** * Create a new JarHandler. * * @param context the context * @param parent the parent * @param url the url * @param jar the jar * @param entry the entry * @param name the name * @throws IOException for an error accessing the file system * @throws IllegalArgumentException for a null context, url or vfsPath */ protected AbstractJarHandler(VFSContext context, VirtualFileHandler parent, URL url, JarFile jar, ZipEntry entry, String name) throws IOException { super(context, parent, url, name); this.jar = jar; this.entry = entry; } /** * Get the jar. * * @return the jar. */ public JarFile getJar() { if (jar == null) throw new IllegalArgumentException("Null jar"); return jar; } /** * Get the entry. * * @return jar entry */ public ZipEntry getEntry() { checkClosed(); if (entry == null) throw new IllegalArgumentException("Null entry"); return entry; } /** * Create the URL for the entry represented by path. * * @param parent - the parent handler * @param path - the simple path to the entry without any trailing '/' * @param isDirEntry - whether this is a directory entry * @return the jar entry URL * @throws MalformedURLException if illegal URL form */ protected URL getURL(VirtualFileHandler parent, String path, boolean isDirEntry) throws MalformedURLException { StringBuilder buffer = new StringBuilder(); try { String parentUrl = parent.toURL().toString(); if (parent instanceof JarEntryHandler || parent instanceof SynthenticDirEntryHandler) { buffer.append(parentUrl); } else { buffer.append("jar:").append(parentUrl).append("!/"); } if (buffer.charAt(buffer.length() - 1) != '/') buffer.append('/'); buffer.append(path); } catch (URISyntaxException e) { // Should not happen throw new MalformedURLException(e.getMessage()); } // Jar directory URLs must end in / if( isDirEntry && buffer.charAt(buffer.length() - 1) != '/') buffer.append('/'); return new URL(buffer.toString()); } public boolean isLeaf() { checkClosed(); return false; } /** * Convert a URL into a JarFIle * * @param url the url to convert * @return the jar file * @throws IOException for any IO error */ public static JarFile fromURL(URL url) throws IOException { try { URLConnection connection = openConnection(url); JarURLConnection jarConnection; if (connection instanceof JarURLConnection) { jarConnection = (JarURLConnection)connection; } else { // try wrapping it in jar: URL jarUrl = new URL("jar:" + url + "!/"); jarConnection = (JarURLConnection)openConnection(jarUrl); } return jarConnection.getJarFile(); } catch (IOException original) { // Fix the context of the error message IOException e = new IOException("Error opening jar file: " + url + " reason=" + original.getMessage()); e.setStackTrace(original.getStackTrace()); throw e; } } /** * Restore the jar file from the jar URL * * @param in object input string * @throws IOException for any IO error * @throws ClassNotFoundException if any error reading object */ private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); // Initialize the transient values URL jarURL = getURL(); String jarAsString = jarURL.toString(); if (jarAsString.startsWith("file:")) { File fp = new File(jarAsString.substring(5)); jar = new JarFile(fp); } else { URLConnection conn = openConnection(jarURL); if (conn instanceof JarURLConnection) { JarURLConnection jconn = (JarURLConnection) conn; jar = jconn.getJarFile(); } else { throw new IOException("Cannot restore from non-JarURLConnection, url: " + jarURL); } } handleJarFile(); } /** * Handle jar file after read. * Find the real jar file, if nested. * * @throws IOException for any error */ protected void handleJarFile() throws IOException { Stack handlers = new Stack(); AbstractJarHandler current = this; while(current.getParent() instanceof AbstractJarHandler) { handlers.push(current); current = (AbstractJarHandler)current.getParent(); } while(handlers.isEmpty() == false) { if (entry != null) { // TODO - change jar } current = handlers.pop(); entry = jar.getEntry(current.getName()); } } } ././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/AbstractExceptionHandler.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/AbstractExceptionHan0000644000175000017500000000273511112474030033411 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context; import org.jboss.logging.Logger; import org.jboss.virtual.spi.ExceptionHandler; /** * AbstractExceptionHandler * * @author Ales Justin */ public abstract class AbstractExceptionHandler implements ExceptionHandler { /** The log */ protected final Logger log = Logger.getLogger(getClass()); public void handleZipEntriesInitException(Exception e, String name) { throw new RuntimeException(e); } }libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/memory/0000755000175000017500000000000011146622525030731 5ustar twernertwerner././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/memory/MemoryContextFactory.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/memory/MemoryContext0000644000175000017500000001546011053271005033465 0ustar twernertwerner/* * JBoss, Home of Professional Open Source. * Copyright 2006, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.memory; import java.io.IOException; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.jboss.virtual.VFS; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VFSContextFactory; /** * Singelton implementation of a MemoryContextFactory. * The roots are indexed as the 'host' part of the URLs they are stored under * * @author Kabir Khan * @version $Revision: 1.1 $ */ public class MemoryContextFactory implements VFSContextFactory { private static final String[] PROTOCOLS = {"vfsmemory"}; private static MemoryContextFactory instance = new MemoryContextFactory(); private Map registry = new ConcurrentHashMap(); private MemoryContextFactory() { } /** * Gets the singleton instance * @return The singleton instance */ public static MemoryContextFactory getInstance() { return instance; } public String[] getProtocols() { return PROTOCOLS; } public VFSContext getVFS(URL rootURL) throws IOException { return createRoot(rootURL); } public VFSContext getVFS(URI rootURI) throws IOException { return createRoot(rootURI.toURL()); } /** * Gets hold of a root MemoryContext * * @param host The name of the root * @return the found root VFS, or null if none exists for the name */ public VFS find(String host) { MemoryContext context = registry.get(host); return context != null ? context.getVFS() : null; } /** * Is url valid root url. * * @param url the url to check * @return true if url is root url */ protected static boolean isValidRootURL(URL url) { String path = url.getPath(); return path == null || path.length() == 0 || "/".equals(path); } /** * Creates a new root MemoryContext, or returns an already exixting one of one already * exists for the name * @param url The url of the root, we use the 'host' part of the name for indexing the context * @return The found or created context * @throws IllegalArgumentException If the url parameter contains a path */ public VFSContext createRoot(URL url) { try { if (isValidRootURL(url) == false) throw new IllegalArgumentException("Root url cannot contain path - " + url); String rootName = url.getHost(); MemoryContext ctx = registry.get(rootName); if (ctx == null) { URL ctxURL = new URL("vfsmemory://" + rootName); ctx = new MemoryContext(ctxURL); registry.put(rootName, ctx); } return ctx; } catch(MalformedURLException e) { throw new RuntimeException(e); } catch (URISyntaxException e) { throw new RuntimeException(e); } } /** * Creates a 'directory' within the context determined by the url host part * @param url The url of the directory we want to create * @return The created directory * @throws IllegalArgumentException if there is no root matching the host part of the url */ public VirtualFile createDirectory(URL url) { String rootName = url.getHost(); MemoryContext ctx = registry.get(rootName); if (ctx == null) throw new IllegalArgumentException("No MemoryContext exists for " + rootName); return ctx.createDirectory(url); } /** * Creates a 'file' within the context determined by the url host part * @param url The url of the directory we want to create * @param contents The contents of the file * @return The created file * @throws IllegalArgumentException if there is no root matching the host part of the url */ public VirtualFile putFile(URL url, byte[] contents) { String rootName = url.getHost(); MemoryContext ctx = registry.get(rootName); if (ctx == null) throw new IllegalArgumentException("No MemoryContext exists for " + rootName); return ctx.putFile(url, contents); } /** * Deletes a root MemoryContext * @param url of the root context we want to delete * @return true if we deleted a root MemoryContext, false otherwise * @throws IllegalArgumentException If the url parameter contains a path */ public boolean deleteRoot(URL url) { if (isValidRootURL(url) == false) throw new IllegalArgumentException("Root cannot contain path - " + url); String rootName = url.getHost(); return (registry.remove(rootName) != null); } /** * Deletes a 'file' or a 'directory' * @param url of the 'file' or 'directory' we want to delete * @return true if we deleted a 'file' or 'directory', false otherwise */ public boolean delete(URL url) { try { String path = url.getPath(); if (path == null || path.length() == 0) return deleteRoot(url); String rootName = url.getHost(); MemoryContext ctx = registry.get(rootName); if (ctx != null) { MemoryContextHandler child = (MemoryContextHandler)ctx.getChild(ctx.getRoot(), path); MemoryContextHandler parent = (MemoryContextHandler)child.getParent(); return parent.deleteChild(child); } return false; } catch (IOException e) { throw new RuntimeException(e); } } } ././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/memory/MemoryContextHandler.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/memory/MemoryContext0000644000175000017500000001216311031776370033475 0ustar twernertwerner/* * JBoss, Home of Professional Open Source. * Copyright 2006, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.memory; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.jboss.virtual.plugins.context.AbstractURLHandler; import org.jboss.virtual.plugins.context.StructuredVirtualFileHandler; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VirtualFileHandler; /** * Virtual memory context handler. * * @author Kabir Khan * @version $Revision: 1.1 $ */ public class MemoryContextHandler extends AbstractURLHandler implements StructuredVirtualFileHandler { /** serialVersionUID */ private static final long serialVersionUID = 1L; /** The entries */ private Map entryMap = Collections.emptyMap(); /** The content */ private byte[] contents; public MemoryContextHandler(VFSContext context, VirtualFileHandler parent, URL url, String name) { super(context, parent, url, name); if (parent != null && parent instanceof MemoryContextHandler) { ((MemoryContextHandler)parent).addChild(name, this); } } protected synchronized void addChild(String name, MemoryContextHandler child) { if (entryMap == Collections.EMPTY_MAP) { entryMap = new LinkedHashMap(); } entryMap.put(name, child); } boolean deleteChild(MemoryContextHandler child) { return entryMap.remove(child.getName()) != null; } MemoryContextHandler getDirectChild(String name) { return entryMap.get(name); } public List getChildren(boolean ignoreErrors) throws IOException { return new ArrayList(entryMap.values()); } public boolean isLeaf() { return contents != null; } /** * Called by structuredFindChild */ public VirtualFileHandler createChildHandler(String name) throws IOException { return entryMap.get(name); } public VirtualFileHandler getChild(String path) throws IOException { return structuredFindChild(path); } public boolean removeChild(String name) throws IOException { return entryMap.remove(name) != null; } @Override public boolean exists() throws IOException { return true; } byte[] getContents() { return contents; } public void setContents(byte[] contents) { if (entryMap.size() > 0) { throw new RuntimeException("Cannot set contents for non-leaf node"); } initCacheLastModified(); this.contents = contents; } @Override protected void initCacheLastModified() { this.cachedLastModified = System.currentTimeMillis(); } @Override public long getSize() throws IOException { if (contents != null) { return contents.length; } return 0; } @Override public long getLastModified() throws IOException { return cachedLastModified; } public boolean isNested() throws IOException { return false; } @Override public InputStream openStream() throws IOException { if (contents != null) { return new ByteArrayInputStream(contents); } return new ByteArrayInputStream(new byte[0]); } @Override public URL toVfsUrl() throws MalformedURLException, URISyntaxException { if (getVfsUrl() == null) { if (isLeaf()) { setVfsUrl(getURL()); } else { String vfsString = getURL().toString(); if (vfsString.endsWith("/") == false) setVfsUrl(new URL(vfsString + "/")); } } return getVfsUrl(); } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/memory/MemoryContext.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/memory/MemoryContext0000644000175000017500000001001311052760167033465 0ustar twernertwerner/* * JBoss, Home of Professional Open Source. * Copyright 2006, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context.memory; import java.io.IOException; import java.io.Serializable; import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URL; import java.util.List; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.plugins.context.AbstractVFSContext; import org.jboss.virtual.plugins.vfs.helpers.PathTokenizer; import org.jboss.virtual.spi.VirtualFileHandler; /** * Virtual memory context. * * @author Kabir Khan * @author Ales Justin * @version $Revision: 1.1 $ */ public class MemoryContext extends AbstractVFSContext implements Serializable { private static final long serialVersionUID = 1L; /** The root file */ private final MemoryContextHandler root; /** A reference to the virtual file of the root to stop it getting closed */ private final VirtualFile rootFile; protected MemoryContext(URL url) throws URISyntaxException { super(url); root = new MemoryContextHandler(this, null, url, url.getFile()); rootFile = root.getVirtualFile(); } public String getName() { return root.getName(); } public VirtualFileHandler getRoot() throws IOException { return root; } VirtualFile createDirectory(URL url) { return putFile(url, null); } VirtualFile putFile(URL url, byte[] contents) { try { List tokens = PathTokenizer.getTokens(url.getPath()); if (tokens == null || tokens.size() == 0) { return null; } boolean definitelyNew = false; String protocolAndHost = url.getProtocol() + "://" + url.getHost(); StringBuffer path = new StringBuffer(protocolAndHost); MemoryContextHandler current = root; for (String token : tokens) { path.append("/"); path.append(token); if (definitelyNew == false) { try { MemoryContextHandler child = current.getDirectChild(token); if (child != null) { current = child; continue; } } catch (Exception ignore) { } definitelyNew = true; } URL localUrl = new URL(path.toString()); if (current.getContents() != null) { throw new IllegalStateException("Cannot add a child to " + current + ", it already has contents"); } current = new MemoryContextHandler(this, current, localUrl, token); } current.setContents(contents); return current.getVirtualFile(); } catch(MalformedURLException e) { throw new RuntimeException(e); } } } ././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/HierarchyVirtualFileHandler.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/HierarchyVirtualFile0000644000175000017500000000264710734720224033437 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context; import org.jboss.virtual.spi.VirtualFileHandler; /** * A handler that has children. * * @author Ales Justin */ public interface HierarchyVirtualFileHandler { /** * Add a child. * * @param child the child * @throws IllegalArgumentException for a null child */ void addChild(VirtualFileHandler child); } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/AbstractURLHandler.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/AbstractURLHandler.j0000644000175000017500000001175611031776370033233 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context; import java.io.IOException; import java.io.InputStream; import java.net.JarURLConnection; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.net.URLConnection; import org.jboss.virtual.VFSUtils; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VirtualFileHandler; /** * URLHandler. * * @author Adrian Brock * @version $Revision: 1.1 $ */ public abstract class AbstractURLHandler extends AbstractVirtualFileHandler { /** serialVersionUID */ private static final long serialVersionUID = 1L; /** The url */ private final URL url; /** * Create a newURLHandler. * * @param context the context * @param parent the parent * @param url the url * @param name the name * @throws IllegalArgumentException for a null context, vfsPath or url */ public AbstractURLHandler(VFSContext context, VirtualFileHandler parent, URL url, String name) { super(context, parent, name); if (url == null) throw new IllegalArgumentException("Null url"); this.url = url; initCacheLastModified(); } /** * Open connection. * * @return url's connection * @throws IOException for any error */ protected URLConnection openConnection() throws IOException { return openConnection(url); } /** * Open connection. * Set use cacheable to false, * due to locking on Windows. * * @param url the url to open * @return url's connection * @throws IOException for any error */ protected static URLConnection openConnection(URL url) throws IOException { URLConnection conn = url.openConnection(); conn.setUseCaches(false); return conn; } protected void initCacheLastModified() { try { URLConnection c = openConnection(); try { this.cachedLastModified = c.getLastModified(); } finally { closeConnection(c); } } catch (IOException e) { throw new RuntimeException(e); } } private void closeConnection(URLConnection c) { try { if (c instanceof JarURLConnection == false) c.getInputStream().close(); } catch (Exception ex) { if (log.isDebugEnabled()) log.debug("IGNORING: Exception while closing connection", ex); } } /** * Get the url * * @return the url */ public URL getURL() { return url; } public URL toURL() throws MalformedURLException, URISyntaxException { return getURL(); } public long getLastModified() throws IOException { checkClosed(); URLConnection c = openConnection(); try { return c.getLastModified(); } finally { closeConnection(c); } } public long getSize() throws IOException { checkClosed(); URLConnection c = openConnection(); try { return c.getContentLength(); } finally { closeConnection(c); } } /** * Basis existence on URLConnection.getLastModified() != 0. This may * not be true for all url connections. * * @see URLConnection#getLastModified() * @see org.jboss.test.virtual.test.URLExistsUnitTestCase */ public boolean exists() throws IOException { URLConnection c = openConnection(); try { return c.getLastModified() != 0; } finally { closeConnection(c); } } public boolean isHidden() throws IOException { checkClosed(); return false; } public InputStream openStream() throws IOException { checkClosed(); URLConnection conn = openConnection(); return conn.getInputStream(); } public URI toURI() throws URISyntaxException { return VFSUtils.toURI(url); } } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/AbstractVFSContext.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/AbstractVFSContext.j0000644000175000017500000002577211112474030033265 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context; import java.io.IOException; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.List; import java.util.Map; import org.jboss.logging.Logger; import org.jboss.virtual.VFS; import org.jboss.virtual.VFSUtils; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.VirtualFileFilter; import org.jboss.virtual.VisitorAttributes; import org.jboss.virtual.spi.ExceptionHandler; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VirtualFileHandler; import org.jboss.virtual.spi.VirtualFileHandlerVisitor; /** * AbstractVFSContext. * * @author Adrian Brock * @author Scott.Stark@jboss.org * @author Ales Justin * @version $Revision: 1.1 $ */ public abstract class AbstractVFSContext implements VFSContext { /** The log */ protected final Logger log = Logger.getLogger(getClass()); /** The VFS wrapper */ private VFS vfs; /** The root url */ private final URI rootURI; /** Options associated with the root URL */ private Map rootOptions; /** Root's peer within another context */ private VirtualFileHandler rootPeer; /** The exception handler */ private ExceptionHandler exceptionHandler; /** * Create a new AbstractVFSContext. * * @param rootURI the root url * @throws IllegalArgumentException if rootURI is null */ protected AbstractVFSContext(URI rootURI) { if (rootURI == null) throw new IllegalArgumentException("Null rootURI"); this.rootURI = rootURI; String query = rootURI.getQuery(); rootOptions = VFSUtils.parseURLQuery(query); } /** * Create a new AbstractVFSContext. * * @param rootURL the root url * @throws URISyntaxException for illegal URL * @throws IllegalArgumentException if rootURI is null */ protected AbstractVFSContext(URL rootURL) throws URISyntaxException { this(rootURL.toURI()); } public VFS getVFS() { if (vfs == null) vfs = new VFS(this); return vfs; } public URI getRootURI() { return rootURI; } public void setRootPeer(VirtualFileHandler handler) { this.rootPeer = handler; } public VirtualFileHandler getRootPeer() { return rootPeer; } protected void addOption(String key, String value) { rootOptions.put(key, value); } public Map getOptions() { return rootOptions; } /** * Get peer vfs context. * * @return the peer context */ protected VFSContext getPeerContext() { VirtualFileHandler peer = getRootPeer(); return peer != null ? peer.getVFSContext() : null; } /** * Helper method to set options on an URL * * @param url url to set options on * @return url with query parameters * @throws java.net.MalformedURLException if url manipulation fails */ protected URL setOptionsToURL(URL url) throws MalformedURLException { if (rootOptions.size() == 0) return url; StringBuilder sb = new StringBuilder(url.toString()); sb.append("?"); int i = 0; for (Map.Entry ent : rootOptions.entrySet()) { if (i > 0) sb.append("&"); sb.append(ent.getKey()).append("=").append(ent.getValue()); i++; } return new URL(sb.toString()); } public List getChildren(VirtualFileHandler parent, boolean ignoreErrors) throws IOException { if (parent == null) throw new IllegalArgumentException("Null parent"); return parent.getChildren(ignoreErrors); } public VirtualFileHandler getChild(VirtualFileHandler parent, String path) throws IOException { if (parent == null) throw new IllegalArgumentException("Null parent"); if (path == null) throw new IllegalArgumentException("Null path"); return parent.getChild(path); } /** * Construct a URL from a given parent and a name * * @param parent a parent * @param name a name of the child * @return URL corresponding to a child * @throws IOException for any error */ public URL getChildURL(VirtualFileHandler parent, String name) throws IOException { if(parent != null) { VFSContext parentCtx = parent.getVFSContext(); if (parentCtx != this) { if (parentCtx instanceof AbstractVFSContext) { return ((AbstractVFSContext) parentCtx).getChildURL(parent, name); } else { StringBuilder urlStr = new StringBuilder(512); try { urlStr.append(parent.toURI()); if (urlStr.charAt( urlStr.length()-1) != '/') urlStr.append("/"); urlStr.append(name); return new URL(urlStr.toString()); } catch (URISyntaxException e) { throw new RuntimeException("Failed to create child URL: " + parent + " + " + name, e); } } } } StringBuilder urlStr = new StringBuilder(512); URI rootUri = getRootURI(); urlStr.append(rootUri.getScheme()) .append(":").append(rootUri.getPath()); if(parent != null) { if (urlStr.charAt( urlStr.length()-1) != '/') urlStr.append("/"); String pPathName = parent.getPathName(); if(pPathName.length() != 0) urlStr.append(pPathName); if (urlStr.charAt( urlStr.length()-1) != '/') urlStr.append("/"); urlStr.append(name); } return new URL(urlStr.toString()); } public void visit(VirtualFileHandler handler, VirtualFileHandlerVisitor visitor) throws IOException { if (handler == null) throw new IllegalArgumentException("Null handler"); if (visitor == null) throw new IllegalArgumentException("Null visitor"); VisitorAttributes attributes = visitor.getAttributes(); boolean includeRoot = attributes.isIncludeRoot(); boolean leavesOnly = attributes.isLeavesOnly(); boolean ignoreErrors = attributes.isIgnoreErrors(); boolean includeHidden = attributes.isIncludeHidden(); VirtualFileFilter recurseFilter = attributes.getRecurseFilter(); visit(handler, visitor, includeRoot, leavesOnly, ignoreErrors, includeHidden, recurseFilter); } /** * Visit. the file system, recursive death checking is left to the visitor * or otherwise a stack overflow. * * @param handler the reference handler * @param visitor the visitor * @param includeRoot whether to visit the root * @param leavesOnly whether to visit leaves only * @param ignoreErrors whether to ignore errors * @param includeHidden whether to include hidden files * @param recurseFilter the recurse filter * @throws IOException for any problem accessing the virtual file system */ protected void visit(VirtualFileHandler handler, VirtualFileHandlerVisitor visitor, boolean includeRoot, boolean leavesOnly, boolean ignoreErrors, boolean includeHidden, VirtualFileFilter recurseFilter) throws IOException { // Visit the root when asked if (includeRoot) visitor.visit(handler); // Visit the children boolean trace = log.isTraceEnabled(); List children; try { children = getChildren(handler, ignoreErrors); } catch (IOException e) { if (ignoreErrors == false) throw e; if( trace ) log.trace("Ignored: " + e); return; } // Look through each child for (VirtualFileHandler child : children) { // Ignore hidden if asked if (includeHidden == false && child.isHidden()) { if( trace ) log.trace("Ignoring hidden file: "+child); continue; } // Visit the leaf or non-leaves when asked boolean isLeaf = child.isLeaf(); if (leavesOnly == false || isLeaf) visitor.visit(child); else if( trace ) { log.trace("Skipping non-leaf file: "+child); } // Recurse when asked VirtualFile file = child.getVirtualFile(); if ( isLeaf == false && recurseFilter != null && recurseFilter.accepts(file)) { try { if (handler instanceof DelegatingHandler) child.getVFSContext().visit(child, visitor); else visit(child, visitor, false, leavesOnly, ignoreErrors, includeHidden, recurseFilter); } catch (StackOverflowError e) { log.debug("Original: " + child, e); throw new IOException("Stack overflow, the file system is too complicated? " + child); } } } } public ExceptionHandler getExceptionHandler() { return exceptionHandler; } public void setExceptionHandler(ExceptionHandler exceptionHandler) { this.exceptionHandler = exceptionHandler; } @Override public String toString() { StringBuilder buffer = new StringBuilder(); buffer.append(getClass().getSimpleName()); buffer.append('@'); buffer.append(System.identityHashCode(this)); buffer.append('['); buffer.append(rootURI); buffer.append(']'); return buffer.toString(); } @Override public int hashCode() { return rootURI.hashCode(); } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || obj instanceof VFSContext == false) return false; VFSContext other = (VFSContext) obj; return rootURI.equals(other.getRootURI()); } } ././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/VfsArchiveBrowserFactory.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/context/VfsArchiveBrowserFac0000644000175000017500000000423111112474030033347 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.context; import java.io.IOException; import java.net.URL; import java.util.Iterator; import org.jboss.util.file.ArchiveBrowserFactory; import org.jboss.virtual.plugins.vfs.VirtualFileURLConnection; /** * This is a bridge to an older, crappier API written by Bill. * * @deprecated * * @author Bill Burke * @author Ales Justin * @version $Revision: 1.1 $ */ @SuppressWarnings("deprecation") public class VfsArchiveBrowserFactory implements ArchiveBrowserFactory { /** VFS archive browser instance */ public static final VfsArchiveBrowserFactory INSTANCE = new VfsArchiveBrowserFactory(); @SuppressWarnings("deprecation") public Iterator create(URL url, org.jboss.util.file.ArchiveBrowser.Filter filter) { try { VirtualFileURLConnection conn = (VirtualFileURLConnection)url.openConnection(); return new VfsArchiveBrowser(filter, conn.getContent()); } catch (IOException e) { throw new RuntimeException("Unable to browse URL: " + url, e); } } } libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/copy/0000755000175000017500000000000011146622526026710 5ustar twernertwerner././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/copy/UnpackCopyMechanism.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/copy/UnpackCopyMechanism.jav0000644000175000017500000000313411137562372033316 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.copy; import java.io.IOException; import org.jboss.virtual.spi.VirtualFileHandler; /** * Unpack nested file into temp dir. * * @author Ales Justin */ public class UnpackCopyMechanism extends AbstractCopyMechanism { public static final UnpackCopyMechanism INSTANCE = new UnpackCopyMechanism(); protected String getType() { return "unpacked"; } protected boolean isAlreadyModified(VirtualFileHandler handler) throws IOException { return handler.isNested() == false; } }libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/copy/CopyMechanism.java0000644000175000017500000000337711022202466032312 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.copy; import java.io.IOException; import java.net.URISyntaxException; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.spi.VirtualFileHandler; /** * Copy mechanism to be used in VFSUtils. * * @author Ales Justin */ public interface CopyMechanism { /** * Copy handler. * If already modified, return handler's file. * * @param file the original file * @param handler the handler to copy * @return handler's copy * @throws IOException for any error * @throws URISyntaxException for any URI syntax error */ VirtualFile copy(VirtualFile file, VirtualFileHandler handler) throws IOException, URISyntaxException; } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/copy/AbstractCopyMechanism.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/copy/AbstractCopyMechanism.j0000644000175000017500000002045511137562372033316 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.copy; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URISyntaxException; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.List; import java.util.Map; import org.jboss.logging.Logger; import org.jboss.util.id.GUID; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.VFSUtils; import org.jboss.virtual.plugins.context.DelegatingHandler; import org.jboss.virtual.plugins.context.file.FileSystemContext; import org.jboss.virtual.spi.ExceptionHandler; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VirtualFileHandler; /** * Copy mechanism to be used in VFSUtils. * * @author Ales Justin */ public abstract class AbstractCopyMechanism implements CopyMechanism { private static Logger log = Logger.getLogger(CopyMechanism.class); private static File tempDir; private static class GetTempDir implements PrivilegedAction { public File run() { String tempDirKey = System.getProperty("vfs.temp.dir", "jboss.server.temp.dir"); return new File(System.getProperty(tempDirKey, System.getProperty("java.io.tmpdir"))); } } /** * Get temp directory. * * @return the temp directory */ public synchronized static File getTempDirectory() { if (tempDir == null) { tempDir = AccessController.doPrivileged(new GetTempDir()); log.info("VFS temp dir: " + tempDir); } return tempDir; } /** * Get mechanism type. * * @return the type */ protected abstract String getType(); /** * Is handler already modified. * * @param handler the handler * @return true if already modified * @throws IOException for any error */ protected abstract boolean isAlreadyModified(VirtualFileHandler handler) throws IOException; /** * Should we replace old handler with new. * * @param parent the parent handler * @param oldHandler the old handler * @param newHandler the new handler * @return true if needs replacement * @throws IOException for any error */ protected boolean replaceOldHandler(VirtualFileHandler parent, VirtualFileHandler oldHandler, VirtualFileHandler newHandler) throws IOException { return true; } /** * Unwrap the handler from possible delegate handler. * * @param handler the handler to unwrap * @return unwrapped handler */ protected VirtualFileHandler unwrap(VirtualFileHandler handler) { if (handler instanceof DelegatingHandler) handler = ((DelegatingHandler)handler).getDelegate(); return handler; } public VirtualFile copy(VirtualFile file, VirtualFileHandler handler) throws IOException, URISyntaxException { VirtualFileHandler unwrapped = unwrap(handler); // check modification on unwrapped if (isAlreadyModified(unwrapped)) { if (log.isTraceEnabled()) log.trace("Should already be " + getType() + ": " + unwrapped); return file; } //create guid dir File guidDir = createTempDirectory(getTempDirectory(), GUID.asString()); // unpack handler File copy = copy(guidDir, handler); // create new handler FileSystemContext fileSystemContext = new FileSystemContext(copy); // merge old options VFSContext oldVFSContext = handler.getVFSContext(); Map newOptions = fileSystemContext.getOptions(); if (newOptions != null) // shouldn't be null, but we check anyway newOptions.put(VFSUtils.IS_TEMP_FILE, Boolean.TRUE.toString()); Map oldOptions = oldVFSContext.getOptions(); if (newOptions != null && oldOptions != null && oldOptions.isEmpty() == false) newOptions.putAll(oldOptions); // copy exception handler ExceptionHandler eh = oldVFSContext.getExceptionHandler(); if (eh != null) fileSystemContext.setExceptionHandler(eh); VirtualFileHandler newHandler = fileSystemContext.getRoot(); VirtualFileHandler parent = handler.getParent(); if (parent != null && replaceOldHandler(parent, handler, newHandler)) parent.replaceChild(handler, newHandler); return newHandler.getVirtualFile(); } /** * Copy handler. * * @param guidDir the guid directory * @param handler the handler to copy * @return handler's copy as file * @throws IOException for any error */ protected File copy(File guidDir, VirtualFileHandler handler) throws IOException { File copy = createTempDirectory(guidDir, handler.getName()); unpack(handler, copy, false); return copy; } /** * Create the temp directory. * * @param parent the parent * @param name the dir name * @return new directory */ protected static File createTempDirectory(File parent, String name) { File file = new File(parent, name); if (file.mkdir() == false) throw new IllegalArgumentException("Cannot create directory: " + file); file.deleteOnExit(); return file; } /** * Unpack the root into file. * Repeat this on the root's children. * * @param root the root * @param file the file * @param writeRoot do we write root * @throws IOException for any error */ protected static void unpack(VirtualFileHandler root, File file, boolean writeRoot) throws IOException { // should we write the root if (writeRoot) rewrite(root, file); if (root.isLeaf() == false) { List children = root.getChildren(true); if (children != null && children.isEmpty() == false) { for (VirtualFileHandler handler : children) { File next = new File(file, handler.getName()); if (handler.isLeaf() == false && next.mkdir() == false) throw new IllegalArgumentException("Problems creating new directory: " + next); next.deleteOnExit(); unpack(handler, next, handler.isLeaf()); } } } } /** * Rewrite contents of handler into file. * * @param handler the handler * @param file the file * @throws IOException for any error */ protected static void rewrite(VirtualFileHandler handler, File file) throws IOException { OutputStream out = new FileOutputStream(file); InputStream in = handler.openStream(); try { byte[] bytes = new byte[1024]; while (in.available() > 0) { int length = in.read(bytes); if (length > 0) out.write(bytes, 0, length); } } finally { try { in.close(); } catch (IOException ignored) { } try { out.close(); } catch (IOException ignored) { } } } }././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/copy/ExplodedCopyMechanism.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/copy/ExplodedCopyMechanism.j0000644000175000017500000000326311137562372033315 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.copy; import java.io.IOException; import org.jboss.virtual.spi.VirtualFileHandler; import org.jboss.virtual.plugins.context.file.FileHandler; /** * Explode any archive into temp dir. * * @author Ales Justin */ public class ExplodedCopyMechanism extends AbstractCopyMechanism { public static final ExplodedCopyMechanism INSTANCE = new ExplodedCopyMechanism(); protected String getType() { return "exploded"; } protected boolean isAlreadyModified(VirtualFileHandler handler) throws IOException { return handler instanceof FileHandler || handler.isLeaf(); } }libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/copy/TempCopyMechanism.java0000644000175000017500000000474011137562372033147 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.copy; import java.io.IOException; import java.io.File; import org.jboss.virtual.plugins.context.jar.NestedJarHandler; import org.jboss.virtual.plugins.context.jar.JarHandler; import org.jboss.virtual.plugins.context.zip.ZipEntryHandler; import org.jboss.virtual.spi.VirtualFileHandler; /** * Copy any non-temp file into temp dir. * * @author Ales Justin */ public class TempCopyMechanism extends AbstractCopyMechanism { public static final TempCopyMechanism INSTANCE = new TempCopyMechanism(); protected String getType() { return "temp"; } protected boolean isAlreadyModified(VirtualFileHandler handler) throws IOException { return handler instanceof NestedJarHandler; } protected File copy(File guidDir, VirtualFileHandler handler) throws IOException { // leave top level archives or leaves in one piece boolean directRewrite = handler.isLeaf(); if (directRewrite == false) { VirtualFileHandler unwrapped = unwrap(handler); directRewrite = unwrapped instanceof JarHandler || (unwrapped instanceof ZipEntryHandler && unwrapped.isNested() == false); } if (directRewrite) { File temp = new File(guidDir, handler.getName()); temp.deleteOnExit(); rewrite(handler, temp); return temp; } return super.copy(guidDir, handler); } }libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/vfs/0000755000175000017500000000000011146622526026534 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/vfs/helpers/0000755000175000017500000000000011146622526030176 5ustar twernertwerner././@LongLink0000000000000000000000000000016300000000000011565 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/vfs/helpers/MatchAllVirtualFileFilter.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/vfs/helpers/MatchAllVirtualF0000644000175000017500000000307510477530213033265 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.vfs.helpers; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.VirtualFileFilter; /** * MatchAllVirtualFileFilter. * * @author Adrian Brock * @version $Revision: 1.1 $ */ public class MatchAllVirtualFileFilter implements VirtualFileFilter { /** The instance */ public static final MatchAllVirtualFileFilter INSTANCE = new MatchAllVirtualFileFilter(); /** * Singleton */ private MatchAllVirtualFileFilter() { } public boolean accepts(VirtualFile file) { return true; } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/vfs/helpers/PathTokenizer.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/vfs/helpers/PathTokenizer.ja0000644000175000017500000001660611112474030033276 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.vfs.helpers; import java.io.IOException; import java.security.Permission; import java.util.ArrayList; import java.util.List; /** * PathTokenizer. * * @author Adrian Brock * @author Ales Justin * @version $Revision: 1.1 $ */ @SuppressWarnings({"StringEquality"}) public class PathTokenizer { /** The reverse path const */ private static final String CURRENT_PATH = "."; /** The reverse path const */ private static final String REVERSE_PATH = ".."; /** Catch some suspicious tokens */ private static boolean errorOnSuspiciousTokens; /** Flag permission */ private static Permission flagPermission = new RuntimePermission(PathTokenizer.class.getName() + ".setErrorOnSuspiciousTokens"); /** * Utility class */ private PathTokenizer() { } /** * Get the remaining path from some tokens * * @param tokens the tokens * @param i the current location * @param end the end index * @return the remaining path * @throws IllegalArgumentException for null tokens or i is out of range */ protected static String getRemainingPath(List tokens, int i, int end) { if (tokens == null) throw new IllegalArgumentException("Null tokens"); if (i < 0 || i >= end) throw new IllegalArgumentException("i is not in the range of tokens: 0-" + (end-1)); if (i == end-1) return tokens.get(end-1); StringBuilder buffer = new StringBuilder(); for (; i < end-1; ++i) { buffer.append(tokens.get(i)); buffer.append("/"); } buffer.append(tokens.get(end-1)); return buffer.toString(); } /** * Get the tokens * * @param path the path * @return the tokens or null if the path is empty * @throws IllegalArgumentException if the path is null, it is empty or it is a relative path */ public static List getTokens(String path) { if (path == null) throw new IllegalArgumentException("Null path"); char[] chars = path.toCharArray(); StringBuilder buffer = new StringBuilder(); List list = new ArrayList(); String specialToken = null; for (int index=0; index < chars.length; index++) { char ch = chars[index]; if (ch == '/') { if (index > 0) { if (buffer.length() == 0 && specialToken == null) continue; if (specialToken != null) list.add(specialToken); else list.add(buffer.toString()); // reset buffer.setLength(0); specialToken = null; } } else if (ch == '.') { int bufferLength = buffer.length(); if (specialToken == null && bufferLength == 0) specialToken = CURRENT_PATH; else if (specialToken == CURRENT_PATH && bufferLength == 0) specialToken = REVERSE_PATH; else if (specialToken == REVERSE_PATH && bufferLength == 0) { if (errorOnSuspiciousTokens) throw new IllegalArgumentException("Illegal token (" + specialToken + ch + ") in path: " + path); buffer.append(specialToken).append(ch); specialToken = null; } else buffer.append(ch); } else { // token starts with '.' or '..', but also has some path after that if (specialToken != null) { // we don't allow tokens after '..' if (errorOnSuspiciousTokens && specialToken == REVERSE_PATH) throw new IllegalArgumentException("Illegal token (" + specialToken + ch + ") in path: " + path); // after '.' more path is legal == unix hidden directories buffer.append(specialToken); specialToken = null; } buffer.append(ch); } } // add last token if (specialToken != null) list.add(specialToken); else if (buffer.length() > 0) list.add(buffer.toString()); return list; } /** * Get the remaining path from some tokens * * @param tokens the tokens * @param i the current location * @return the remaining path * @throws IllegalArgumentException for null tokens or i is out of range */ public static String getRemainingPath(List tokens, int i) { if (tokens == null) throw new IllegalArgumentException("Null tokens"); return getRemainingPath(tokens, i, tokens.size()); } /** * Apply any . or .. paths in the path param. * * @param path the path * @return simple path, containing no . or .. paths * @throws IOException if reverse path goes over the top path */ public static String applySpecialPaths(String path) throws IOException { List tokens = getTokens(path); if (tokens == null) return null; int i = 0; for(int j = 0; j < tokens.size(); j++) { String token = tokens.get(j); if (isCurrentToken(token)) continue; else if (isReverseToken(token)) i--; else tokens.set(i++, token); if (i < 0) throw new IOException("Using reverse path on top path: " + path); } return getRemainingPath(tokens, 0, i); } /** * Is current token. * * @param token the token to check * @return true if token matches current path token */ public static boolean isCurrentToken(String token) { return CURRENT_PATH == token; } /** * Is reverse token. * * @param token the token to check * @return true if token matches reverse path token */ public static boolean isReverseToken(String token) { return REVERSE_PATH == token; } /** * Set errorOnSuspiciousTokens flag. * * @param errorOnSuspiciousTokens the errorOnSuspiciousTokens flag */ public static void setErrorOnSuspiciousTokens(boolean errorOnSuspiciousTokens) { SecurityManager sm = System.getSecurityManager(); if (sm != null) sm.checkPermission(flagPermission); PathTokenizer.errorOnSuspiciousTokens = errorOnSuspiciousTokens; } } ././@LongLink0000000000000000000000000000020100000000000011556 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/vfs/helpers/AbstractVirtualFileFilterWithAttributes.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/vfs/helpers/AbstractVirtualF0000644000175000017500000000413610506452640033342 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2005, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.vfs.helpers; import org.jboss.virtual.VirtualFileFilterWithAttributes; import org.jboss.virtual.VisitorAttributes; /** * AbstractVirtualFileFilterWithAttributes * * @author adrian@jboss.org * @version $Revision: 44223 $ */ public abstract class AbstractVirtualFileFilterWithAttributes implements VirtualFileFilterWithAttributes { /** The attributes */ private VisitorAttributes attributes; /** * Create a new AbstractVirtualFileFilterWithAttributes, * using {@link VisitorAttributes#DEFAULT} */ public AbstractVirtualFileFilterWithAttributes() { this(null); } /** * Create a new AbstractVirtualFileFilterWithAttributes. * * @param attributes the attributes, pass null to use {@link VisitorAttributes#DEFAULT} */ public AbstractVirtualFileFilterWithAttributes(VisitorAttributes attributes) { if (attributes == null) attributes = VisitorAttributes.DEFAULT; this.attributes = attributes; } public VisitorAttributes getAttributes() { return attributes; } } ././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/vfs/helpers/SuffixMatchFilter.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/vfs/helpers/SuffixMatchFilte0000644000175000017500000000741510734323332033330 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, Red Hat Middleware LLC, and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.vfs.helpers; import java.util.Collection; import java.util.Collections; import java.util.LinkedHashSet; import org.jboss.logging.Logger; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.VisitorAttributes; /** * Matches a file name against a list of suffixes. * * @author Scott.Stark@jboss.org * @author adrian@jboss.org * @version $Revision: 44223 $ */ public class SuffixMatchFilter extends AbstractVirtualFileFilterWithAttributes { private static Logger log = Logger.getLogger(SuffixMatchFilter.class); /** The suffixes */ private Collection suffixes; private boolean trace; /** * Create a new SuffixMatchFilter, * using {@link VisitorAttributes#DEFAULT} * * @param suffix the suffix * @throws IllegalArgumentException for a null suffix */ public SuffixMatchFilter(String suffix) { this(suffix, null); } /** * Create a new SuffixMatchFilter. * * @param suffix the suffix * @param attributes the attributes, pass null to use {@link VisitorAttributes#DEFAULT} * @throws IllegalArgumentException for a null suffix */ @SuppressWarnings("unchecked") public SuffixMatchFilter(String suffix, VisitorAttributes attributes) { this(Collections.singleton(suffix), attributes); } /** * Create a new SuffixMatchFilter. * @param suffixes - the list of file suffixes to accept. * @throws IllegalArgumentException for a null suffixes */ public SuffixMatchFilter(Collection suffixes) { this(suffixes, null); } /** * Create a new SuffixMatchFilter. * @param suffixes - the list of file suffixes to accept. * @param attributes the attributes, pass null to use {@link VisitorAttributes#DEFAULT} * @throws IllegalArgumentException for a null suffixes */ public SuffixMatchFilter(Collection suffixes, VisitorAttributes attributes) { super(attributes == null ? VisitorAttributes.DEFAULT : attributes); if (suffixes == null) throw new IllegalArgumentException("Null suffixes"); this.suffixes = new LinkedHashSet(); this.suffixes.addAll(suffixes); trace = log.isTraceEnabled(); } /** * Accept any file that ends with one of the filter suffixes. This checks * that the file.getName() endsWith a suffix. * @return true if the file matches a suffix, false otherwise. */ public boolean accepts(VirtualFile file) { String name = file.getName(); boolean accepts = false; for(String suffix : suffixes) { if (name.endsWith(suffix)) { accepts = true; break; } } if( trace ) log.trace(file+" accepted: "+accepts); return accepts; } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/vfs/helpers/ExtensibleFilter.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/vfs/helpers/ExtensibleFilter0000644000175000017500000001757010734323332033376 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, Red Hat Middleware LLC, and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.vfs.helpers; import java.util.Arrays; import java.util.Comparator; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.VirtualFileFilter; /** * An extensible filter for VFS files. Three arrays are * maintained for checking: a prefix, suffix, and match array. If the * filename starts with any of the prefixes, ends with any of the * suffixes, or exactly matches any of the matches, then the accepts * method will return false. * * NOTE: the arrays *must* be sorted for the string matching to work, * and suffixes use the 'reverseComparator' * * @author somebody@jboss.org * @author Scott.Stark@jboss.org * @version $Revision: 57108 $ */ public class ExtensibleFilter implements VirtualFileFilter { /** * Compare the strings backwards. This assists in suffix comparisons. */ private static final Comparator reverseComparator = new Comparator() { public int compare(String o1, String o2) { int idx1 = o1.length(); int idx2 = o2.length(); int comp = 0; while (comp == 0 && idx1 > 0 && idx2 > 0) comp = o1.charAt(--idx1) - o2.charAt(--idx2); return (comp == 0) ? (idx1 - idx2) : comp; } }; /** the default prefix list */ private static final String[] DEFAULT_PREFIXES = {"#", "%", ",", ".", "_$"}; /** the default suffix list */ private static final String[] DEFAULT_SUFFIXES = {"#", "$", "%", "~", ",v", ".BAK", ".bak", ".old", ".orig", ".tmp", ".rej", ".sh" }; /** the default matches list */ private static final String[] DEFAULT_MATCHES = {".make.state", ".nse_depinfo", "CVS", "CVS.admin", "RCS", "RCSLOG", "SCCS", "TAGS", "core", "tags"}; /** The list of disallowed suffixes, sorted using reverse values */ private List suffixes; /** The sorted list of disallowed prefixes */ private List prefixes; /** The sorted list of disallowed values */ private List matches; /** Use the default values for suffixes, prefixes, and matches */ public ExtensibleFilter() { this(DEFAULT_MATCHES, DEFAULT_PREFIXES, DEFAULT_SUFFIXES); } /** * Create using a custom set of matches, prefixes, and suffixes. If any of * these arrays are null, then the corresponding default will be * substituted. * * @param matches the matches * @param prefixes the prefixes * @param suffixes the suffixes */ public ExtensibleFilter(String[] matches, String[] prefixes, String[] suffixes) { if( matches == null ) matches = DEFAULT_MATCHES; Arrays.sort(matches); this.matches = new ArrayList(Arrays.asList(matches)); if( prefixes == null ) prefixes = DEFAULT_PREFIXES; Arrays.sort(prefixes); this.prefixes = new ArrayList(Arrays.asList(prefixes)); if( suffixes == null ) suffixes = DEFAULT_SUFFIXES; Arrays.sort(suffixes, reverseComparator); this.suffixes = new ArrayList(Arrays.asList(suffixes)); } public void addPrefix(String prefix) { this.prefixes.add(prefix); Collections.sort(this.prefixes); } public void addPrefixes(String[] prefixes) { this.prefixes.addAll(Arrays.asList(prefixes)); Collections.sort(this.prefixes); } public void delPrefix(String prefix) { this.prefixes.remove(prefix); } public void delPrefixes(String[] prefixes) { this.prefixes.removeAll(Arrays.asList(prefixes)); Collections.sort(this.prefixes); } public void addSuffix(String suffix) { this.suffixes.add(suffix); Collections.sort(this.suffixes, reverseComparator); } public void addSuffixes(String[] suffixes) { this.suffixes.addAll(Arrays.asList(suffixes)); Collections.sort(this.suffixes, reverseComparator); } public void delSuffix(String suffix) { this.suffixes.remove(suffix); } public void delSuffixes(String[] suffixes) { this.suffixes.removeAll(Arrays.asList(suffixes)); Collections.sort(this.suffixes, reverseComparator); } public String[] getSuffixes() { String[] tmp = new String[suffixes.size()]; suffixes.toArray(tmp); return tmp; } public void setSuffixes(String[] suffixes) { Arrays.sort(suffixes, reverseComparator); this.suffixes.clear(); this.suffixes.addAll(Arrays.asList(suffixes)); } public String[] getPrefixes() { String[] tmp = new String[prefixes.size()]; prefixes.toArray(tmp); return tmp; } public void setPrefixes(String[] prefixes) { Arrays.sort(prefixes); this.prefixes.clear(); this.prefixes.addAll(Arrays.asList(prefixes)); } public String[] getMatches() { String[] tmp = new String[matches.size()]; matches.toArray(tmp); return tmp; } public void setMatches(String[] matches) { Arrays.sort(matches); this.matches.clear(); this.matches.addAll(Arrays.asList(matches)); } /** * If the filename matches any string in the prefix, suffix, or matches * array, return false. Perhaps a bit of overkill, but this method * operates in log(n) time, where n is the size of the arrays. * * @param file The file to be tested * @return false if the filename matches any of the prefixes, * suffixes, or matches. */ public boolean accepts(VirtualFile file) { String name = file.getName(); // check exact match int index = Collections.binarySearch(matches, name); if (index >= 0) return false; // check prefix index = Collections.binarySearch(prefixes, name); if (index >= 0) return false; if (index < -1) { // The < 0 index gives the first index greater than name int firstLessIndex = -2 - index; String prefix = prefixes.get(firstLessIndex); // If name starts with an ingored prefix ignore name if( name.startsWith(prefix) ) return false; } // check suffix index = Collections.binarySearch(suffixes, name, reverseComparator); if (index >= 0) return false; if (index < -1) { // The < 0 index gives the first index greater than name int firstLessIndex = -2 - index; String suffix = suffixes.get(firstLessIndex); // If name ends with an ingored suffix ignore name if( name.endsWith(suffix) ) return false; } // everything checks out. return true; } } ././@LongLink0000000000000000000000000000017300000000000011566 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/vfs/helpers/AbstractVirtualFileHandlerVisitor.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/vfs/helpers/AbstractVirtualF0000644000175000017500000000403010507221160033323 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.vfs.helpers; import org.jboss.virtual.VisitorAttributes; import org.jboss.virtual.spi.VirtualFileHandlerVisitor; /** * AbstractVirtualFileVisitor. * * @author Adrian Brock * @version $Revision: 1.1 $ */ public abstract class AbstractVirtualFileHandlerVisitor implements VirtualFileHandlerVisitor { private final VisitorAttributes attributes; /** * Create a new AbstractVirtualFileVisitor using the default visitor attributes */ protected AbstractVirtualFileHandlerVisitor() { this(null); } /** * Create a new AbstractVirtualFileVisitor using the default visitor attributes * * @param attributes the attributes or @{Link {@link VisitorAttributes#DEFAULT} when null */ protected AbstractVirtualFileHandlerVisitor(VisitorAttributes attributes) { if (attributes == null) attributes = VisitorAttributes.DEFAULT; this.attributes = attributes; } public VisitorAttributes getAttributes() { return attributes; } } ././@LongLink0000000000000000000000000000016400000000000011566 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/vfs/helpers/AbstractVirtualFileVisitor.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/vfs/helpers/AbstractVirtualF0000644000175000017500000000375610506452640033351 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.vfs.helpers; import org.jboss.virtual.VirtualFileVisitor; import org.jboss.virtual.VisitorAttributes; /** * AbstractVirtualFileVisitor. * * @author Adrian Brock * @version $Revision: 1.1 $ */ public abstract class AbstractVirtualFileVisitor implements VirtualFileVisitor { /** The attributes */ private final VisitorAttributes attributes; /** * Create a new AbstractVirtualFileVisitor using the default visitor attributes */ protected AbstractVirtualFileVisitor() { this(null); } /** * Create a new AbstractVirtualFileVisitor using the default visitor attributes * * @param attributes the attributes, uses the default if null */ protected AbstractVirtualFileVisitor(VisitorAttributes attributes) { if (attributes == null) attributes = VisitorAttributes.DEFAULT; this.attributes = attributes; } public VisitorAttributes getAttributes() { return attributes; } } ././@LongLink0000000000000000000000000000016200000000000011564 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/vfs/helpers/FilterVirtualFileVisitor.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/vfs/helpers/FilterVirtualFil0000644000175000017500000000671210477530213033353 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.vfs.helpers; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.VirtualFileFilter; import org.jboss.virtual.VirtualFileFilterWithAttributes; import org.jboss.virtual.VisitorAttributes; /** * A visitor based on a virtual file filter * * @author Adrian Brock * @version $Revision: 1.1 $ */ public class FilterVirtualFileVisitor extends AbstractVirtualFileVisitor { /** The filter */ private final VirtualFileFilter filter; /** What is matched */ private List matched; /** * Check the attributes * * @param filter the filter * @param attributes the attributes * @return the attributes * @throws IllegalArgumentException for a null filter */ private static VisitorAttributes checkAttributes(VirtualFileFilter filter, VisitorAttributes attributes) { if (filter == null) throw new IllegalArgumentException("Null filter"); // Specified if (attributes != null) return attributes; // From the filter if (filter instanceof VirtualFileFilterWithAttributes) return ((VirtualFileFilterWithAttributes) filter).getAttributes(); // It will use the default return null; } /** * Create a new FilterVirtualFileVisitor with default attributes * * @param filter the filter * @throws IllegalArgumentException if the filter is null */ public FilterVirtualFileVisitor(VirtualFileFilter filter) { this(filter, null); } /** * Create a new FilterVirtualFileVisitor. * * @param filter the filter * @param attributes the attributes, uses the default if null * @throws IllegalArgumentException if the filter is null */ public FilterVirtualFileVisitor(VirtualFileFilter filter, VisitorAttributes attributes) { super(checkAttributes(filter, attributes)); this.filter = filter; } /** * Get the matched files * * @return the matched files */ public List getMatched() { if (matched == null) return Collections.emptyList(); else return matched; } public void visit(VirtualFile virtualFile) { if (filter.accepts(virtualFile)) { if (matched == null) matched = new ArrayList(); matched.add(virtualFile); } } } ././@LongLink0000000000000000000000000000015700000000000011570 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/vfs/helpers/SuffixesExcludeFilter.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/vfs/helpers/SuffixesExcludeF0000644000175000017500000000416210533536206033336 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2005, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.vfs.helpers; import java.util.Collection; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.VirtualFileFilter; /** * Filters out a set of suffixes * * @author adrian@jboss.org * @version $Revision: 44223 $ */ public class SuffixesExcludeFilter implements VirtualFileFilter { /** The suffixes */ private Collection suffixes; /** * Create a new SuffixMatchFilter, * * @param suffixes the suffixes * @throws IllegalArgumentException for null suffixes */ public SuffixesExcludeFilter(Collection suffixes) { if (suffixes == null) throw new IllegalArgumentException("Null suffixes"); for (String suffix : suffixes) { if (suffix == null) throw new IllegalArgumentException("Null suffix in " + suffixes); } this.suffixes = suffixes; } public boolean accepts(VirtualFile file) { String name = file.getName(); for(String suffix : suffixes) { if (name.endsWith(suffix)) return false; } return true; } } ././@LongLink0000000000000000000000000000017300000000000011566 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/vfs/helpers/WrappingVirtualFileHandlerVisitor.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/vfs/helpers/WrappingVirtualF0000644000175000017500000000422510477530213033365 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.vfs.helpers; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.VirtualFileVisitor; import org.jboss.virtual.VisitorAttributes; import org.jboss.virtual.spi.VirtualFileHandler; import org.jboss.virtual.spi.VirtualFileHandlerVisitor; /** * A handler visitor that wraps a normal file visitor * * @author Adrian Brock * @version $Revision: 1.1 $ */ public class WrappingVirtualFileHandlerVisitor implements VirtualFileHandlerVisitor { /** The wrapped visitor */ private final VirtualFileVisitor visitor; /** * Create a new WrappingVirtualFileHandlerVisitor. * * @param visitor the visitor * @throws IllegalArgumentException if the visitor is null */ public WrappingVirtualFileHandlerVisitor(VirtualFileVisitor visitor) { if (visitor == null) throw new IllegalArgumentException("Null visitor"); this.visitor = visitor; } public VisitorAttributes getAttributes() { return visitor.getAttributes(); } public void visit(VirtualFileHandler handler) { VirtualFile file = handler.getVirtualFile(); visitor.visit(file); } } ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/vfs/VirtualFileUrlStreamHandler.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/vfs/VirtualFileUrlStreamHand0000644000175000017500000000500410743732504033336 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.vfs; import java.io.IOException; import java.net.URISyntaxException; import java.net.URL; import java.net.URLConnection; import java.net.URLStreamHandler; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VirtualFileHandler; /** * Used when creating VFS urls so we don't have to go through the handlers all the time * * @author Bill Burke * @version $Revision: 1.1 $ */ public class VirtualFileUrlStreamHandler extends URLStreamHandler { private final VFSContext context; public VirtualFileUrlStreamHandler(VirtualFileHandler handler) { this.context = handler.getVFSContext(); } protected URLConnection openConnection(URL u) throws IOException { String baseRootUrl; try { baseRootUrl = context.getRoot().toVfsUrl().toString(); } catch (URISyntaxException e) { throw new RuntimeException(e); } String urlString = u.toString(); int idx = urlString.indexOf(baseRootUrl); if (idx == -1) throw new IOException(u.toString() + " does not belong to the same VFS context as " + baseRootUrl); String path = urlString.substring(baseRootUrl.length()); VirtualFileHandler vf = context.getRoot().getChild(path); if (vf == null) throw new IOException(path + " was not found in VFS context " + baseRootUrl); return new VirtualFileURLConnection(u, vf.getVirtualFile()); } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/vfs/VirtualFileURLConnection.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/plugins/vfs/VirtualFileURLConnection0000644000175000017500000000654111137562372033320 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.plugins.vfs; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import org.jboss.virtual.VFS; import org.jboss.virtual.VirtualFile; /** * Implements basic URLConnection for a VirtualFile * * @author Bill Burke * @author Ales Justin * @version $Revision: 1.1 $ */ public class VirtualFileURLConnection extends URLConnection { protected VirtualFile file; protected URL vfsurl; protected String relativePath; public VirtualFileURLConnection(URL url, URL vfsurl, String relativePath) { super(url); this.vfsurl = vfsurl; this.relativePath = relativePath; } public VirtualFileURLConnection(URL url, VirtualFile file) { super(url); this.file = file; } public void connect() throws IOException { } public VirtualFile getContent() throws IOException { return getVirtualFile(); } public int getContentLength() { try { return (int)getVirtualFile().getSize(); } catch (IOException e) { throw new RuntimeException(e); } } public long getLastModified() { try { return getVirtualFile().getLastModified(); } catch (IOException e) { throw new RuntimeException(e); } } public InputStream getInputStream() throws IOException { return getVirtualFile().openStream(); } @SuppressWarnings("deprecation") protected static VirtualFile resolveCachedVirtualFile(URL vfsurl, String relativePath) throws IOException { return resolveVirtualFile(vfsurl, relativePath); } @SuppressWarnings("deprecation") protected static VirtualFile resolveVirtualFile(URL vfsurl, String relativePath) throws IOException { VirtualFile file = VFS.getRoot(vfsurl); return file.findChild(relativePath); } /** * Get the virtual file. * * @return the underlying virtual file * @throws IOException for any error */ protected synchronized VirtualFile getVirtualFile() throws IOException { if (file == null) file = resolveVirtualFile(vfsurl, relativePath); return file; } } libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/spi/0000755000175000017500000000000011146622527025051 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/spi/cache/0000755000175000017500000000000011146622527026114 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/spi/cache/helpers/0000755000175000017500000000000011146622527027556 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/spi/cache/helpers/NoopVFSCache.java0000644000175000017500000000353411112474030032627 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.spi.cache.helpers; import java.io.IOException; import java.net.URI; import java.net.URL; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.cache.VFSCache; /** * Noop cache. * Doesn't do any caching. * * @author Ales Justin */ public class NoopVFSCache implements VFSCache { public VirtualFile getFile(URI uri) throws IOException { return null; } public VirtualFile getFile(URL url) throws IOException { return null; } public void putContext(VFSContext context) { } public void removeContext(VFSContext context) { } public void start() throws Exception { } public void stop() { } public void flush() { } } libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/spi/cache/VFSCache.java0000644000175000017500000000477011112474030030334 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.spi.cache; import java.io.IOException; import java.net.URI; import java.net.URL; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.spi.VFSContext; /** * Simple vfs cache interface. * * @author Ales Justin */ public interface VFSCache { /** * Get the file. * Check the cache for cached entry, * return null if no matching entry exists. * * @param uri the file's uri * @return virtual file instance or null if it doesn't exist in cache * @throws IOException for any error */ VirtualFile getFile(URI uri) throws IOException; /** * Get the file. * Check the cache for cached entry, * return null if no matching entry exists. * * @param url the file's url * @return virtual file instance or null if it doesn't exist in cache * @throws IOException for any error */ VirtualFile getFile(URL url) throws IOException; /** * Put vfs context to cache. * * @param context the vfs context */ void putContext(VFSContext context); /** * Remove vfs context from cache. * * @param context the vfs context */ void removeContext(VFSContext context); /** * Start the cache. * * @throws Exception for any error */ void start() throws Exception; /** * Stop the cache. */ void stop(); /** * Flush the cache. */ void flush(); } libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/spi/cache/VFSCacheFactory.java0000644000175000017500000001247611105023574031673 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.spi.cache; import java.lang.reflect.Constructor; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.Map; import org.jboss.logging.Logger; import org.jboss.virtual.VFSUtils; import org.jboss.virtual.spi.cache.helpers.NoopVFSCache; /** * Simple vfs cache factory. * * @author Ales Justin * @author Scott.Stark@jboss.org * @version $Revision: 80615 $ */ public class VFSCacheFactory { private static final Object lock = new Object(); private static Logger log = Logger.getLogger(VFSCacheFactory.class); private static VFSCache instance; private VFSCacheFactory() { } /** * Get VFS cache instance. * * @return the vfs cache instance */ public static VFSCache getInstance() { return getInstance(null, null); } /** * * Get VFS cache instance. * * @param defaultCacheImpl - the possibly null name of the VFSCache * implementation to use. If null, the {@linkplain VFSUtils.VFS_CACHE_KEY} * system property will be used. * * @return the vfs cache instance */ public static VFSCache getInstance(String defaultCacheImpl) { return getInstance(defaultCacheImpl, null); } /** * * Get VFS cache instance. * * @param defaultCacheImpl - the possibly null name of the VFSCache * implementation to use. If null, the {@linkplain VFSUtils.VFS_CACHE_KEY} * system property will be used. * @param properties the possible vfs cache impl properties * * @return the vfs cache instance */ public static VFSCache getInstance(String defaultCacheImpl, Map properties) { if (instance == null) { synchronized (lock) { if (instance == null) instance = AccessController.doPrivileged(new VFSCacheCreatorAction(defaultCacheImpl, properties)); } } return instance; } /** * Set instance. * * This should be used with care. * Better to leave it to getInstance method creation. * * @param cache cache instance to set */ public static void setInstance(VFSCache cache) { if (cache != null && instance != null && instance instanceof NoopVFSCache == false) throw new IllegalArgumentException("Instance already set!"); instance = cache; } private static class VFSCacheCreatorAction implements PrivilegedAction { private String defaultCacheImpl; private Map properties; VFSCacheCreatorAction(String defaultCacheImpl, Map properties) { this.defaultCacheImpl = defaultCacheImpl; this.properties = properties; } public VFSCache run() { try { // First look to the input cache imple String className = defaultCacheImpl; if(className == null || className.length() == 0) { // Else look at the VFS_CACHE_KEY system property className = System.getProperty(VFSUtils.VFS_CACHE_KEY); } if (className != null) { log.info("Initializing VFSCache [" + className + "]"); ClassLoader cl = VFSCacheFactory.class.getClassLoader(); Class clazz = cl.loadClass(className); Object result; if (properties != null) { Constructor constructor = clazz.getConstructor(Map.class); result = constructor.newInstance(properties); } else { result = clazz.newInstance(); } VFSCache cache = VFSCache.class.cast(result); cache.start(); // start here, so we fall back to default no-op in case start fails log.info("Using VFSCache [" + cache + "]"); return cache; } } catch (Throwable t) { log.warn("Exception instantiating VFS cache: ", t); } log.info("Using VFSCache [NoopVFSCache]"); return new NoopVFSCache(); } } } libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/spi/cache/CacheStatistics.java0000644000175000017500000000307711104021156032025 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.spi.cache; import org.jboss.virtual.spi.VFSContext; /** * Simple vfs cache statistics * * @author Ales Justin */ public interface CacheStatistics { /** * Get cached contexts. * * @return the cached contexts */ Iterable getCachedContexts(); /** * Get cache size. * * @return the cache size */ int size(); /** * Get last insert timestamp. * * @return the last insert timestamp */ long lastInsert(); }libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/spi/VFSContextFactoryLocator.java0000644000175000017500000003073411020564576032602 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2005, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.spi; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URI; import java.net.URL; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.ArrayList; import java.util.Arrays; import java.util.Enumeration; import java.util.Map; import java.util.StringTokenizer; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import org.jboss.logging.Logger; import org.jboss.virtual.plugins.context.file.FileSystemContextFactory; import org.jboss.virtual.plugins.context.jar.JarContextFactory; import org.jboss.virtual.plugins.context.memory.MemoryContextFactory; import org.jboss.virtual.plugins.context.zip.ZipEntryContextFactory; import org.jboss.virtual.plugins.context.VfsArchiveBrowserFactory; import org.jboss.util.file.ArchiveBrowser; /** * A singleton factory for locating VFSContextFactory instances given VFS root URIs. * * @author Scott.Stark@jboss.org * @author adrian@jboss.org * @version $Revision: 45764 $ */ public class VFSContextFactoryLocator { /** The log */ private static final Logger log = Logger.getLogger(VFSContextFactoryLocator.class); /** The VSFactory mapped keyed by the VFS protocol string */ private static final Map factoryByProtocol = new ConcurrentHashMap(); /** The system property that defines the default file factory */ public static final String DEFAULT_FACTORY_PROPERTY = VFSContextFactory.class.getName(); /** The path used to load services from the classpath */ public static final String SERVICES_PATH = "META-INF/services/" + VFSContextFactory.class.getName(); /** Has the default initialzation been performed */ private static boolean initialized; static { String pkgs = System.getProperty("java.protocol.handler.pkgs"); if (pkgs == null || pkgs.trim().length() == 0) { pkgs = "org.jboss.virtual.protocol"; System.setProperty("java.protocol.handler.pkgs", pkgs); } else if (!pkgs.contains("org.jboss.virtual.protocol")) { pkgs += "|org.jboss.virtual.protocol"; System.setProperty("java.protocol.handler.pkgs", pkgs); } // keep this until AOP and HEM uses VFS internally instead of the stupid ArchiveBrowser crap. ArchiveBrowser.factoryFinder.put("vfsfile", new VfsArchiveBrowserFactory()); } /** * Register a new VFSContextFactory * * @param factory the factory * @throws IllegalArgumentException if the factory is null or the factory * returns a null or no protocols * @throws IllegalStateException if one of the protocols is already registered */ public synchronized static void registerFactory(VFSContextFactory factory) { if (factory == null) throw new IllegalArgumentException("Null VFSContextFactory"); String[] protocols = factory.getProtocols(); if (protocols == null || protocols.length == 0) throw new IllegalArgumentException("VFSContextFactory trying to register null or no protocols: " + factory); for (String protocol : protocols) { if (protocol == null) throw new IllegalArgumentException("VFSContextFactory try to register a null protocol: " + factory + " protocols=" + Arrays.asList(protocols)); VFSContextFactory other = factoryByProtocol.get(protocol); if (other != null) throw new IllegalStateException("VFSContextFactory: " + other + " already registered for protocol: " + protocol); } boolean trace = log.isTraceEnabled(); for (String protocol : protocols) { factoryByProtocol.put(protocol, factory); if (trace) log.trace("Registered " + factory + " for protocol: " + protocol); } } /** * Unregister a VFSContextFactory * * @param factory the factory * @return false when not registered * @throws IllegalArgumentException if the factory is null */ public synchronized static boolean unregisterFactory(VFSContextFactory factory) { if (factory == null) throw new IllegalArgumentException("Null VFSContextFactory"); List protocols = new ArrayList(); for (Map.Entry entry : factoryByProtocol.entrySet()) { if (factory == entry.getValue()) protocols.add(entry.getKey()); } boolean trace = log.isTraceEnabled(); for (String protocol : protocols) { factoryByProtocol.remove(protocol); if (trace) log.trace("Unregistered " + factory + " for protocol: " + protocol); } return protocols.isEmpty() == false; } /** * Return the VFSContextFactory for the VFS mount point specified by the rootURL. * * @param rootURL - the URL to a VFS root * @return the VFSContextFactory capable of handling the rootURL. This will be null * if there is no factory registered for the rootURL protocol. * @throws IllegalArgumentException if the rootURL is null */ public static VFSContextFactory getFactory(URL rootURL) { if (rootURL == null) throw new IllegalArgumentException("Null rootURL"); init(); String protocol = rootURL.getProtocol(); return factoryByProtocol.get(protocol); } /** * Return the VFSContextFactory for the VFS mount point specified by the rootURI. * * @param rootURI - the URI to a VFS root * @return the VFSContextFactory capable of handling the rootURI. This will be null * if there is no factory registered for the rootURI scheme. * @throws IllegalArgumentException if the rootURI is null */ public static VFSContextFactory getFactory(URI rootURI) { if (rootURI == null) throw new IllegalArgumentException("Null rootURI"); init(); String scheme = rootURI.getScheme(); return factoryByProtocol.get(scheme); } /** * Initialises the default VFSContextFactorys

* *

    *
  1. Look for META-INF/services/org.jboss.virtual.spi.VFSContextFactory *
  2. Look at the system property org.jboss.virtual.spi.VFSContextFactory for a comma * seperated list of factories *
  3. Register default loaders when not done by the above mechanisms. *
*/ private static synchronized void init() { // Somebody beat us to it? if (initialized) return; // Try to locate from services files ClassLoader loader = AccessController.doPrivileged(new GetContextClassLoader()); Enumeration urls = AccessController.doPrivileged(new EnumerateServices()); if (urls != null) { while (urls.hasMoreElements()) { URL url = urls.nextElement(); VFSContextFactory[] factories = loadFactories(url, loader); for (VFSContextFactory factory : factories) { try { registerFactory(factory); } catch (Exception e) { log.warn("Error registering factory from " + url, e); } } } } String defaultFactoryNames = AccessController.doPrivileged(new GetDefaultFactories()); if (defaultFactoryNames != null) { StringTokenizer tokenizer = new StringTokenizer(defaultFactoryNames, ","); while (tokenizer.hasMoreTokens()) { String factoryName = tokenizer.nextToken(); VFSContextFactory factory = createVFSContextFactory(loader, factoryName, " from system property."); if (factory != null) registerFactory(factory); } } // No file protocol, use the default if (factoryByProtocol.containsKey("file") == false) registerFactory(new FileSystemContextFactory()); // No jar protocol, use the default if (factoryByProtocol.containsKey("jar") == false) registerFactory(new JarContextFactory()); if (factoryByProtocol.containsKey("vfsmemory") == false) registerFactory(MemoryContextFactory.getInstance()); if (factoryByProtocol.containsKey("vfszip") == false) registerFactory(ZipEntryContextFactory.getInstance()); initialized = true; } /** * Load the VFSFactory classes found in the service file * * @param serviceURL the service url * @param loader the class loader * @return A possibly zero length array of the VFSFactory instances * loaded from the serviceURL */ private static VFSContextFactory[] loadFactories(URL serviceURL, ClassLoader loader) { List temp = new ArrayList(); try { InputStream is = serviceURL.openStream(); try { BufferedReader br = new BufferedReader(new InputStreamReader(is)); String line; while ( (line = br.readLine()) != null ) { if (line.startsWith("#") == true) continue; String[] classes = line.split("\\s+|#.*"); for (int n = 0; n < classes.length; n ++) { String name = classes[n]; if (name.length() == 0) continue; VFSContextFactory factory = createVFSContextFactory(loader, name, " defined in " + serviceURL); if (factory != null) temp.add(factory); } } } finally { is.close(); } } catch(Exception e) { log.warn("Error parsing " + serviceURL, e); } VFSContextFactory[] factories = new VFSContextFactory[temp.size()]; return temp.toArray(factories); } /** * Create a vfs context factory * * @param cl the classloader * @param className the class name * @param context the context * @return the vfs context factory */ private static VFSContextFactory createVFSContextFactory(ClassLoader cl, String className, String context) { try { Class factoryClass = cl.loadClass(className); return (VFSContextFactory) factoryClass.newInstance(); } catch (Exception e) { log.warn("Error creating VFSContextFactory " + className + " " + context, e); return null; } } /** * Get the context classloader */ private static class GetContextClassLoader implements PrivilegedAction { public ClassLoader run() { return Thread.currentThread().getContextClassLoader(); } } /** * Get the default file factory class name */ private static class GetDefaultFactories implements PrivilegedAction { public String run() { return System.getProperty(DEFAULT_FACTORY_PROPERTY); } } /** * Enumerates the services */ private static class EnumerateServices implements PrivilegedAction> { public Enumeration run() { ClassLoader cl = Thread.currentThread().getContextClassLoader(); try { return cl.getResources(SERVICES_PATH); } catch (IOException e) { log.warn("Error retrieving " + SERVICES_PATH, e); return null; } } } } libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/spi/VFSContext.java0000644000175000017500000000704411112474030027707 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2005, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.spi; import java.io.IOException; import java.net.URI; import java.util.List; import java.util.Map; import org.jboss.virtual.VFS; /** * A virtual file context * * @author Scott.Stark@jboss.org * @author adrian@jboss.org * @author ales.justin@jboss.org * @version $Revision: 55466 $ */ public interface VFSContext { /** * Get the name. * * @return the name */ String getName(); /** * Get the root uri * * @return the root uri */ URI getRootURI(); /** * Get the VFS for this context * * @return the vfs */ VFS getVFS(); /** * Return the root virtual file * * @return the root * @throws IOException for any problem accessing the VFS */ VirtualFileHandler getRoot() throws IOException; /** * Return the peer representing the root of this context within another context. * Used when mounting contexts within other contexts * * @return the root peer */ VirtualFileHandler getRootPeer(); /** * Get the context option settings * * @return a map of the context options */ Map getOptions(); /** * Get the children * * @param parent the parent * @param ignoreErrors whether to ignore errors * @return the children * @throws IOException for any problem accessing the VFS * @throws IllegalArgumentException for a null parent */ List getChildren(VirtualFileHandler parent, boolean ignoreErrors) throws IOException; /** * Get a child * * @param parent the parent * @param path the path * @return the child or null if not found * @throws IOException for any problem accessing the VFS * @throws IllegalArgumentException for a null parent or name */ VirtualFileHandler getChild(VirtualFileHandler parent, String path) throws IOException; /** * Visit the virtual file system * * @param handler the reference handler * @param visitor the visitor * @throws IOException for any error * @throws IllegalArgumentException if the handler or visitor is null */ void visit(VirtualFileHandler handler, VirtualFileHandlerVisitor visitor) throws IOException; /** * Get the exception handler. * * @return the exception handler */ ExceptionHandler getExceptionHandler(); /** * Set exception handler. * * @param exceptionHandler the exception handler. */ void setExceptionHandler(ExceptionHandler exceptionHandler); } libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/spi/LinkInfo.java0000644000175000017500000000364010734323332027422 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2005, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.spi; import java.io.Serializable; import java.net.URI; /** * A class representing the information for a VFS link. * * @author Scott.Stark@jboss.org * @version $Revision:$ */ public class LinkInfo implements Serializable { private static final long serialVersionUID = 1L; /** Optional name of the link which defines its name to the parent */ private String name; /** Required URI for the link target */ private final URI linkTarget; /** * Create a LinkInfo * * @param name - the simple name of the target link. If null the linkTarget * name will be used. * @param linkTarget - the URI of the target of the link. */ public LinkInfo(String name, URI linkTarget) { this.name = name; this.linkTarget = linkTarget; } public URI getLinkTarget() { return linkTarget; } public String getName() { return name; } } libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/spi/VirtualFileHandler.java0000644000175000017500000001703411137562372031446 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2005, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.spi; import java.io.IOException; import java.io.InputStream; import java.io.Serializable; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.List; import org.jboss.virtual.VirtualFile; /** * A virtual file handler * * @author Scott.Stark@jboss.org * @author Adrian.Brock * @version $Revision: 44334 $ */ public interface VirtualFileHandler extends Serializable { /** * Get the simple VF name (X.java) * * @return the simple file name */ String getName(); /** * Get the VFS relative path name (org/jboss/X.java) * * @return the VFS relative path name */ String getPathName(); /** * Get the VFS local path name. * Relative to root. * * @return the VFS local path name */ String getLocalPathName(); /** * Get a VFS-based URL * * @return the url * @throws URISyntaxException for an error parsing the URI * @throws MalformedURLException for any error */ URL toVfsUrl() throws MalformedURLException, URISyntaxException; /** * Get a file: or jar:file: URL representing a resource as precisely as possible. * file: urls can represent files in the file system (i.e.: file:/classes/MyClass.class) * jar:file: urls can represent entries within zip archives in the filesystem * (i.e.: jar:file:/lib/classes.jar!/MyClass.class) * There is no standard URL handler to represent entries within archives that are themselves * entries within archives. * (i.e.: this doesn't work: jar:file:/lib/app.ear!/classes.jar!/MyClass.class * In this case the most precise supported resource locator is: jar:file:/lib/app.ear!/classes.jar * ) * * @return the url * @throws URISyntaxException for an error parsing the URI * @throws MalformedURLException for any error constructing the URL */ URL getRealURL() throws IOException, URISyntaxException; /** * Get the VF URI (file://root/org/jboss/X.java) * * @return the full URI to the VF in the VFS. * @throws URISyntaxException for an error parsing the URI */ URI toURI() throws URISyntaxException; /** * Get the VF URL (file://root/org/jboss/X.java) * * @return the full URL to the VF in the VFS. * @throws URISyntaxException for an error parsing the URI * @throws MalformedURLException for any error */ URL toURL() throws MalformedURLException, URISyntaxException; /** * When the file was last modified * * @return the last modified time * @throws IOException for any problem accessing the virtual file system * @throws IllegalStateException if closed */ long getLastModified() throws IOException; /** * Returns true if the file has been modified since this method was last called * Last modified time is initialized at handler instantiation. * * @return true if modified, false otherwise * @throws IOException for any error */ boolean hasBeenModified() throws IOException; /** * Get the size * * @return the size * @throws IOException for any problem accessing the virtual file system * @throws IllegalStateException if closed */ long getSize() throws IOException; /** * Tests whether the underlying implementation file still exists. * @return true if the file exists, false otherwise. * @throws IOException - thrown on failure to detect existence. */ boolean exists() throws IOException; /** * Whether it is a simple leaf of the VFS, * i.e. whether it can contain other files * * @return true if a simple file. * @throws IOException for any problem accessing the virtual file system * @throws IllegalStateException if the file is closed */ boolean isLeaf() throws IOException; /** * Whether it is hidden * * @return true if hidden. * @throws IOException for any problem accessing the virtual file system * @throws IllegalStateException if closed */ boolean isHidden() throws IOException; /** * Access the file contents. * * @return An InputStream for the file contents. * @throws IOException for any problem accessing the virtual file system * @throws IllegalStateException if closed */ InputStream openStream() throws IOException; /** * Get the parent * * @return the parent * @throws IOException for an error accessing the file system * @throws IllegalStateException if closed */ VirtualFileHandler getParent() throws IOException; /** * Get the children * * @param ignoreErrors whether to ignore errors * @return the children * @throws IOException for an error accessing the file system * @throws IllegalStateException if closed */ List getChildren(boolean ignoreErrors) throws IOException; /** * Get a child * * @param path the path * @return the child or null if not found * @throws IOException for an error accessing the file system * @throws IllegalStateException if closed */ VirtualFileHandler getChild(String path) throws IOException; /** * Remove a child * * @param name child name * @return true if child was removed, false otherwise * @throws IllegalStateException if closed * @throws IOException if an error occurs */ boolean removeChild(String name) throws IOException; /** * Get the VFSContext this file belongs to * * @return the context * @throws IllegalStateException if closed */ VFSContext getVFSContext(); /** * Get the virtual file wrapper * * @return the wrapper * @throws IllegalStateException if closed */ VirtualFile getVirtualFile(); /** * Cleanup resources. */ void cleanup(); /** * Close the resources */ void close(); /** * Replace child. * * @param original the original * @param replacement the replacement */ void replaceChild(VirtualFileHandler original, VirtualFileHandler replacement); /** * Are we nested in some archive. * * @return true if this is archive entry * @throws IOException for any error */ boolean isNested() throws IOException; /** * Delete a file represented by this handler * * @param gracePeriod max time to wait for locks (in milliseconds) * @return boolean true if file was deleted, false otherwise * @throws IOException for any error */ boolean delete(int gracePeriod) throws IOException; } libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/spi/VirtualFileHandlerVisitor.java0000644000175000017500000000301310477530213033011 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.spi; import org.jboss.virtual.VisitorAttributes; /** * Visits a virtual file and its children * * @author Adrian Brock * @version $Revision: 1.1 $ */ public interface VirtualFileHandlerVisitor { /** * Get the search attribues for this visitor * * @return the attributes */ VisitorAttributes getAttributes(); /** * Visit a virtual file * * @param handler the virtual file handler being visited */ void visit(VirtualFileHandler handler); } libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/spi/VFSContextFactory.java0000644000175000017500000000405010501251572031236 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2005, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.spi; import java.net.URI; import java.net.URL; import java.io.IOException; /** * The entry point to obtaining a VFSContext for a given URL/URI root mount point * * @author Scott.Stark@jboss.org * @author adrian@jboss.org * @version $Revision: 44217 $ */ public interface VFSContextFactory { /** * Get the URL protocols/URI schemes this factory supports * * @return list of supported protocols. */ String[] getProtocols(); /** * Obtain a vfs context for the given root url. * * @param rootURL - the URL for the root of the virtual context * @return the vfs context * @throws IOException - thrown if the root cannot be opened/accessed */ VFSContext getVFS(URL rootURL) throws IOException; /** * Obtain a vfs context for the given root uri. * * @param rootURI - the URI for the root of the virtual context * @return the vfs context * @throws IOException - thrown if the root cannot be opened/accessed */ VFSContext getVFS(URI rootURI) throws IOException; } libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/spi/ExceptionHandler.java0000644000175000017500000000335311112474030031137 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.spi; /** * VFS exception handler. * * Custom exception handling methods shoud be added here * and used at the pointcut where exception is thrown. * * Its abstract super class should implement them all * hence back compatibility is assured by noop. * * Real handlers should just override some methods that * they know how to handle. * * @author Ales Justin */ public interface ExceptionHandler { /** * Handle zip entries initializaion exception. * * @param e the cause exception * @param name the file name * @throws RuntimeException if not handled */ void handleZipEntriesInitException(Exception e, String name); } libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/VFSUtils.java0000644000175000017500000007142511137562372026612 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.net.URLDecoder; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.StringTokenizer; import java.util.jar.Attributes; import java.util.jar.JarFile; import java.util.jar.Manifest; import org.jboss.logging.Logger; import org.jboss.util.StringPropertyReplacer; import org.jboss.util.collection.CollectionsFactory; import org.jboss.virtual.plugins.copy.CopyMechanism; import org.jboss.virtual.plugins.copy.ExplodedCopyMechanism; import org.jboss.virtual.plugins.copy.TempCopyMechanism; import org.jboss.virtual.plugins.copy.UnpackCopyMechanism; import org.jboss.virtual.spi.LinkInfo; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VirtualFileHandler; import org.jboss.virtual.spi.cache.VFSCacheFactory; /** * VFS Utilities * * @author Adrian Brock * @author Ales Justin * @version $Revision: 1.1 $ */ public class VFSUtils { /** The log */ private static final Logger log = Logger.getLogger(VFSUtils.class); /** The default encoding */ private static final String DEFAULT_ENCODING = "UTF-8"; /** The link */ public static final String VFS_LINK_INFIX = ".vfslink"; /** The link properties */ public static final String VFS_LINK_PROPERTIES_SUFFIX = ".vfslink.properties"; /** The link name */ public static final String VFS_LINK_NAME = "vfs.link.name"; /** The link target */ public static final String VFS_LINK_TARGET = "vfs.link.target"; /** * The system no force copy key / query */ public static final String FORCE_COPY_KEY = "jboss.vfs.forceCopy"; public static final String USE_COPY_QUERY = "useCopyJarHandler"; /** * Key used to force fallback from vfszip (default) to vfsjar */ public static final String FORCE_VFS_JAR_KEY = "jboss.vfs.forceVfsJar"; /** * Key used to turn off reaper mode in vfszip - forcing synchronous (slower) handling of files */ public static final String FORCE_NO_REAPER_KEY = "jboss.vfs.forceNoReaper"; public static final String NO_REAPER_QUERY = "noReaper"; /** * Key used to force case sensitive path checking in vfsfile */ public static final String FORCE_CASE_SENSITIVE_KEY = "jboss.vfs.forceCaseSensitive"; public static final String CASE_SENSITIVE_QUERY = "caseSensitive"; /** * Key used to turn on memory optimizations - less cache use at the expense of performance */ public static final String OPTIMIZE_FOR_MEMORY_KEY = "jboss.vfs.optimizeForMemory"; /** * Key used to determine VFS Cache impl */ public static final String VFS_CACHE_KEY = "jboss.vfs.cache"; /** * Constant representing the URL file protocol */ public static final String FILE_PROTOCOL = "file"; /** Standard separator for JAR URL */ public static final String JAR_URL_SEPARATOR = "!/"; /** The temp marker flag */ public static final String IS_TEMP_FILE = "IS_TEMP_FILE"; /** * Stop cache. */ public static void stopCache() { VFSCacheFactory.getInstance().stop(); } /** * Get the paths string for a collection of virtual files * * @param paths the paths * @return the string * @throws IllegalArgumentException for null paths */ public static String getPathsString(Collection paths) { if (paths == null) throw new IllegalArgumentException("Null paths"); StringBuilder buffer = new StringBuilder(); boolean first = true; for (VirtualFile path : paths) { if (path == null) throw new IllegalArgumentException("Null path in " + paths); if (first == false) buffer.append(':'); else first = false; buffer.append(path.getPathName()); } if (first == true) buffer.append(""); return buffer.toString(); } /** * Add manifest paths * * @param file the file * @param paths the paths to add to * @throws IOException if there is an error reading the manifest or the * virtual file is closed * @throws IllegalStateException if the file has no parent * @throws IllegalArgumentException for a null file or paths */ public static void addManifestLocations(VirtualFile file, List paths) throws IOException { if (file == null) throw new IllegalArgumentException("Null file"); if (paths == null) throw new IllegalArgumentException("Null paths"); Manifest manifest = getManifest(file); if (manifest == null) return; Attributes mainAttributes = manifest.getMainAttributes(); String classPath = mainAttributes.getValue(Attributes.Name.CLASS_PATH); if (classPath == null) { if (log.isTraceEnabled()) log.trace("Manifest has no Class-Path for " + file.getPathName()); return; } VirtualFile parent = file.getParent(); if (parent == null) { log.debug(file + " has no parent."); return; } URL parentURL; URL vfsRootURL; int rootPathLength; try { parentURL = parent.toURL(); vfsRootURL = file.getVFS().getRoot().toURL(); rootPathLength = vfsRootURL.getPath().length(); } catch(URISyntaxException e) { log.debug("Failed to get parent URL for " + file + ", reason=" + e); return; } String parentPath = parentURL.toString(); if(parentPath.endsWith("/") == false) parentPath += "/"; StringTokenizer tokenizer = new StringTokenizer(classPath); while (tokenizer.hasMoreTokens()) { String path = tokenizer.nextToken(); try { URL libURL = new URL(parentPath + path); String libPath = libURL.getPath(); if(rootPathLength > libPath.length()) { log.debug("Invalid rootPath: " + vfsRootURL + ", libPath: " + libPath); continue; } String vfsLibPath = libPath.substring(rootPathLength); VirtualFile vf = file.getVFS().getChild(vfsLibPath); if(vf != null) { if(paths.contains(vf) == false) { paths.add(vf); // Recursively process the jar addManifestLocations(vf, paths); } } } catch (IOException e) { log.debug("Manifest Class-Path entry " + path + " ignored for " + file.getPathName() + " reason=" + e); } } } /** * Get a manifest from a virtual file, * assuming the virtual file is the root of an archive * * @param archive the root the archive * @return the manifest or null if not found * @throws IOException if there is an error reading the manifest or the * virtual file is closed * @throws IllegalArgumentException for a null archive */ public static Manifest getManifest(VirtualFile archive) throws IOException { if (archive == null) throw new IllegalArgumentException("Null archive"); VirtualFile manifest = archive.getChild(JarFile.MANIFEST_NAME); if (manifest == null) { if (log.isTraceEnabled()) log.trace("Can't find manifest for " + archive.getPathName()); return null; } return readManifest(manifest); } /** * Read the manifest from given manifest VirtualFile. * * @param manifest the VF to read from * @return JAR's manifest * @throws IOException if problems while opening VF stream occur */ public static Manifest readManifest(VirtualFile manifest) throws IOException { if (manifest == null) throw new IllegalArgumentException("Null manifest file"); InputStream stream = manifest.openStream(); try { return new Manifest(stream); } finally { try { stream.close(); } catch (IOException ignored) { } } } /** * Get a manifest from a virtual file system, * assuming the root of the VFS is the root of an archive * * @param archive the vfs * @return the manifest or null if not found * @throws IOException if there is an error reading the manifest * @throws IllegalArgumentException for a null archive */ public static Manifest getManifest(VFS archive) throws IOException { if (archive == null) throw new IllegalArgumentException("Null vfs archive"); VirtualFile root = archive.getRoot(); return getManifest(root); } /** * Fix a name (removes any trailing slash) * * @param name the name to fix * @return the fixed name * @throws IllegalArgumentException for a null name */ public static String fixName(String name) { if (name == null) throw new IllegalArgumentException("Null name"); int length = name.length(); if (length <= 1) return name; if (name.charAt(length-1) == '/') return name.substring(0, length-1); return name; } /** * Decode the path with UTF-8 encoding.. * * @param path the path to decode * @return decoded path */ public static String decode(String path) { return decode(path, DEFAULT_ENCODING); } /** * Decode the path. * * @param path the path to decode * @param encoding the encodeing * @return decoded path */ public static String decode(String path, String encoding) { try { return URLDecoder.decode(path, encoding); } catch (UnsupportedEncodingException e) { throw new IllegalArgumentException("Cannot decode: " + path + " [" + encoding + "]", e); } } /** * Get the name. * * @param uri the uri * @return name from uri's path */ public static String getName(URI uri) { if (uri == null) throw new IllegalArgumentException("Null uri"); String name = uri.getPath(); if( name != null ) { // TODO: Not correct for certain uris like jar:...!/ int lastSlash = name.lastIndexOf('/'); if( lastSlash > 0 ) name = name.substring(lastSlash+1); } return name; } /** * Take a URL.getQuery string and parse it into name=value pairs * * @param query Possibly empty/null url query string * @return String[] for the name/value pairs in the query. May be empty but never null. */ public static Map parseURLQuery(String query) { Map pairsMap = CollectionsFactory.createLazyMap(); if(query != null) { StringTokenizer tokenizer = new StringTokenizer(query, "=&"); while(tokenizer.hasMoreTokens()) { String name = tokenizer.nextToken(); String value = tokenizer.nextToken(); pairsMap.put(name, value); } } return pairsMap; } /** * Does a vf name contain the VFS link prefix * @param name - the name portion of a virtual file * @return true if the name starts with VFS_LINK_PREFIX, false otherwise */ public static boolean isLink(String name) { if (name == null) throw new IllegalArgumentException("Null name"); return name.indexOf(VFS_LINK_INFIX) >= 0; } /** * Read the link information from the stream based on the type as determined * from the name suffix. * * @param is - input stream to the link file contents * @param name - the name of the virtual file representing the link * @param props the propertes * @return a list of the links read from the stream * @throws IOException on failure to read/parse the stream * @throws URISyntaxException for an error parsing a URI */ public static List readLinkInfo(InputStream is, String name, Properties props) throws IOException, URISyntaxException { if (name == null) throw new IllegalArgumentException("Null name"); if(name.endsWith(VFS_LINK_PROPERTIES_SUFFIX)) { List info = new ArrayList(); parseLinkProperties(is, info, props); return info; } else throw new UnsupportedEncodingException("Unknown link format: " + name); } /** * Parse a properties link file * * @param is - input stream to the link file contents * @param info the link infos * @param props the propertes * @throws IOException on failure to read/parse the stream * @throws URISyntaxException for an error parsing a URI */ public static void parseLinkProperties(InputStream is, List info, Properties props) throws IOException, URISyntaxException { if (is == null) throw new IllegalArgumentException("Null input stream"); if (info == null) throw new IllegalArgumentException("Null info"); if (props == null) throw new IllegalArgumentException("Null properties"); props.load(is); // Iterate over the property tuples for(int n = 0; ; n ++) { String nameKey = VFS_LINK_NAME + "." + n; String name = props.getProperty(nameKey); String uriKey = VFS_LINK_TARGET + "." + n; String uri = props.getProperty(uriKey); // End when the value is null since a link may not have a name if (uri == null) { break; } // Replace any system property references uri = StringPropertyReplacer.replaceProperties(uri); LinkInfo link = new LinkInfo(name, new URI(uri)); info.add(link); } } /** * Deal with urls that may include spaces. * * @param url the url * @return uri the uri * @throws URISyntaxException for any error */ public static URI toURI(URL url) throws URISyntaxException { if (url == null) throw new IllegalArgumentException("Null url"); try { return url.toURI(); } catch (URISyntaxException e) { String urispec = url.toExternalForm(); // Escape percent sign and spaces urispec = urispec.replaceAll("%", "%25"); urispec = urispec.replaceAll(" ", "%20"); return new URI(urispec); } } /** * Ensure the url is convertible to URI by encoding spaces and percent characters if necessary * * @param url to be sanitized * @return sanitized URL * @throws URISyntaxException if URI conversion can't be fixed * @throws MalformedURLException if an error occurs */ public static URL sanitizeURL(URL url) throws URISyntaxException, MalformedURLException { return toURI(url).toURL(); } /** * Get the options for this file. * * @param file the file * @return options map */ private static Map getOptions(VirtualFile file) { if (file == null) throw new IllegalArgumentException("Null file"); VirtualFileHandler handler = file.getHandler(); VFSContext context = handler.getVFSContext(); return context.getOptions(); } /** * Get the options for this vfs. * * @param vfs the vfs * @return options map */ private static Map getOptions(VFS vfs) { if (vfs == null) throw new IllegalArgumentException("Null vfs"); VFSContext context = vfs.getContext(); return context.getOptions(); } /** * Get the option. * * @param file the file * @param key the option key * @return key's option */ public static String getOption(VirtualFile file, String key) { Map options = getOptions(file); return options != null ? options.get(key) : null; } /** * Get the option. * * @param vfs the vfs * @param key the option key * @return key's option */ public static String getOption(VFS vfs, String key) { Map options = getOptions(vfs); return options != null ? options.get(key) : null; } /** * Enable option. * * @param file the file * @param optionName option name */ protected static void enableOption(VirtualFile file, String optionName) { Map options = getOptions(file); if (options == null) throw new IllegalArgumentException("Cannot enable " + optionName + " on null options: " + file); options.put(optionName, Boolean.TRUE.toString()); } /** * Disable option. * * @param file the file * @param optionName option name */ protected static void disableOption(VirtualFile file, String optionName) { Map options = getOptions(file); if (options == null) throw new IllegalArgumentException("Cannot disable " + optionName + " on null options: " + file); options.remove(optionName); } /** * Enable option. * * @param vfs the vfs * @param optionName option name */ protected static void enableOption(VFS vfs, String optionName) { Map options = getOptions(vfs); if (options == null) throw new IllegalArgumentException("Cannot enable " + optionName + " on null options: " + vfs); options.put(optionName, Boolean.TRUE.toString()); } /** * Disable option. * * @param vfs the vfs * @param optionName option name */ protected static void disableOption(VFS vfs, String optionName) { Map options = getOptions(vfs); if (options == null) throw new IllegalArgumentException("Cannot disable " + optionName + " on null options: " + vfs); options.remove(optionName); } /** * Enable copy for file param. * * @param file the file */ public static void enableCopy(VirtualFile file) { enableOption(file, USE_COPY_QUERY); } /** * Disable copy for file param. * * @param file the file */ public static void disableCopy(VirtualFile file) { disableOption(file, USE_COPY_QUERY); } /** * Enable copy for vfs param. * * @param vfs the vfs */ public static void enableCopy(VFS vfs) { enableOption(vfs, USE_COPY_QUERY); } /** * Disable copy for vfs param. * * @param vfs the vfs */ public static void disableCopy(VFS vfs) { disableOption(vfs, USE_COPY_QUERY); } /** * Enable reaper for file param. * * @param file the file */ public static void enableNoReaper(VirtualFile file) { enableOption(file, NO_REAPER_QUERY); } /** * Disable reaper for file param. * * @param file the file */ public static void disableNoReaper(VirtualFile file) { disableOption(file, NO_REAPER_QUERY); } /** * Enable reaper for vfs param. * * @param vfs the vfs */ public static void enableNoReaper(VFS vfs) { enableOption(vfs, NO_REAPER_QUERY); } /** * Disable reaper for vfs param. * * @param vfs the vfs */ public static void disableNoReaper(VFS vfs) { disableOption(vfs, NO_REAPER_QUERY); } /** * Enable case sensitive for file param. * * @param file the file */ public static void enableCaseSensitive(VirtualFile file) { enableOption(file, CASE_SENSITIVE_QUERY); } /** * Disable case sensitive for file param. * * @param file the file */ public static void disableCaseSensitive(VirtualFile file) { disableOption(file, CASE_SENSITIVE_QUERY); } /** * Enable case sensitive for vfs param. * * @param vfs the vfs */ public static void enableCaseSensitive(VFS vfs) { enableOption(vfs, CASE_SENSITIVE_QUERY); } /** * Disable case sensitive for vfs param. * * @param vfs the vfs */ public static void disableCaseSensitive(VFS vfs) { disableOption(vfs, CASE_SENSITIVE_QUERY); } /** * Is the virtual file temporary. * * @param file the file * @return true if temporary, false otherwise */ public static boolean isTemporaryFile(VirtualFile file) { return Boolean.valueOf(getOption(file, IS_TEMP_FILE)); } /** * Unpack the nested artifact under file param. * * @param file the file to unpack * @return unpacked file * @throws IOException for any io error * @throws URISyntaxException for any uri error */ public static VirtualFile unpack(VirtualFile file) throws IOException, URISyntaxException { return copy(file, UnpackCopyMechanism.INSTANCE); } /** * Force explode. * Explode archives or nested entries. * * @param file the file to explode * @return exploded file * @throws IOException for any io error * @throws URISyntaxException for any uri error */ public static VirtualFile explode(VirtualFile file) throws IOException, URISyntaxException { return copy(file, ExplodedCopyMechanism.INSTANCE); } /** * Create temp. * * @param file the file to temp * @return temp file * @throws IOException for any io error * @throws URISyntaxException for any uri error */ public static VirtualFile temp(VirtualFile file) throws IOException, URISyntaxException { return copy(file, TempCopyMechanism.INSTANCE); } /** * Create temp. * * @param file the file to unpack/explode * @param mechanism the copy mechanism * @return temp file * @throws IOException for any io error * @throws URISyntaxException for any uri error */ protected static VirtualFile copy(VirtualFile file, CopyMechanism mechanism) throws IOException, URISyntaxException { if (file == null) throw new IllegalArgumentException("Null file"); if (mechanism == null) throw new IllegalArgumentException("Null copy mechanism"); return mechanism.copy(file, file.getHandler()); } /** * Is file handle nested. * * @param file the file handle to check * @return true if file/dir is nested otherwise false * @throws IOException for any error */ public static boolean isNestedFile(VirtualFile file) throws IOException { if (file == null) throw new IllegalArgumentException("Null file"); VirtualFileHandler handler = file.getHandler(); return handler.isNested(); } /** * Copy input stream to output stream and close them both * * @param is input stream * @param os output stream * @throws IOException for any error */ public static void copyStreamAndClose(InputStream is, OutputStream os) throws IOException { try { copyStream(is, os); } finally { if (is != null) { try { is.close(); } catch(IOException ignored) { } } if (os != null) os.close(); } } /** * Copy input stream to output stream without closing streams. * Flushes output stream when done. * * @param is input stream * @param os output stream * @throws IOException for any error */ public static void copyStream(InputStream is, OutputStream os) throws IOException { if (is == null) throw new IllegalArgumentException("input stream is null"); if (os == null) throw new IllegalArgumentException("output stream is null"); try { byte [] buff = new byte[65536]; int rc = is.read(buff); while (rc != -1) { os.write(buff, 0, rc); rc = is.read(buff); } } finally { os.flush(); } } /** * Get spec compatilbe url from virtual file. * * @param file the virtual file * @return spec compatible url * @throws Exception for any error */ public static URL getCompatibleURL(VirtualFile file) throws Exception { return getCompatibleResource(file, URL_CREATOR); } /** * Get spec compatilbe uri from virtual file. * * @param file the virtual file * @return spec compatible uri * @throws Exception for any error */ public static URI getCompatibleURI(VirtualFile file) throws Exception { return getCompatibleResource(file, URI_CREATOR); } /** * Create new compatible resource. * * @param file the virtual file * @param creator resoruce creator * @return new resource * @throws Exception for any error * @param exact resource type */ private static T getCompatibleResource(VirtualFile file, ResourceCreator creator) throws Exception { if (file == null) throw new IllegalArgumentException("Null file"); if (creator == null) throw new IllegalArgumentException("Null creator"); T resource = creator.getResource(file); if (resource == null) throw new IllegalArgumentException("Null resource: " + file); // is not nested, so direct VFS resource is not an option if (isNestedFile(file) == false) { String uriString = creator.getString(resource); if (uriString.startsWith("vfs")) { // treat vfszip as file if (uriString.startsWith("vfszip")) resource = creator.createResource("file" + uriString.substring(6)); else resource = creator.createResource(uriString.substring(3)); // (vfs)file and (vfs)jar are ok } } return resource; } /** * @param exact resource type */ private static interface ResourceCreator { /** * Get resource from virtual file. * * @param file the virtual file * @return resource instance from file * @throws Exception for any error */ T getResource(VirtualFile file) throws Exception; /** * Get string from resource. * * @param resource the resource * @return resoruce's string representation */ String getString(T resource); /** * Create new resource. * * @param string the string to create resource from * @return new resoruce instance * @throws Exception for any error */ T createResource(String string) throws Exception; } private static final ResourceCreator URL_CREATOR = new ResourceCreator() { public URL getResource(VirtualFile file) throws Exception { return file.toURL(); } public String getString(URL resource) { return resource.toExternalForm(); } public URL createResource(String string) throws Exception { return new URL(string); } }; private static final ResourceCreator URI_CREATOR = new ResourceCreator() { public URI getResource(VirtualFile file) throws Exception { return file.toURI(); } public String getString(URI resource) { return resource.toString(); } public URI createResource(String string) throws Exception { return new URI(string); } }; /** * Get real url. * The closest thing that doesn't need the vfs url handlers. * * @param file the virtual file * @return real url * @throws IOException for any error * @throws URISyntaxException for any uri syntac error */ public static URL getRealURL(VirtualFile file) throws IOException, URISyntaxException { VirtualFileHandler handler = file.getHandler(); return handler.getRealURL(); } } libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/protocol/0000755000175000017500000000000011146622527026117 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/protocol/vfszip/0000755000175000017500000000000011146622526027437 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/protocol/vfszip/Handler.java0000644000175000017500000000044411024502613031646 0ustar twernertwernerpackage org.jboss.virtual.protocol.vfszip; import org.jboss.virtual.protocol.AbstractVFSHandler; /** * URLStreamHandler for VFS * * @author Marko Strukelj * @version $Revision: 1.0 $ */ public class Handler extends AbstractVFSHandler { } libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/protocol/zip/0000755000175000017500000000000011146622526026720 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/protocol/zip/Handler.java0000644000175000017500000000254711024502613031135 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.protocol.zip; import org.jboss.virtual.protocol.AbstractVFSHandler; /** * Zip url handler. * * In case someone is stripping vfs off * and just ends with zip protocol. * (like I did in EJB3) ;-) * * @author Ales Justin */ public class Handler extends AbstractVFSHandler { } libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/protocol/AbstractVFSHandler.java0000644000175000017500000000725511112474030032376 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.protocol; import java.io.File; import java.io.IOException; import java.net.URL; import java.net.URLConnection; import java.net.URLDecoder; import java.net.URLStreamHandler; import java.util.Map; import java.util.WeakHashMap; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.plugins.vfs.VirtualFileURLConnection; import org.jboss.virtual.spi.cache.VFSCache; import org.jboss.virtual.spi.cache.VFSCacheFactory; /** * VFS's file URL handler. * * @author Bill Burke * @author Ales Justin */ public abstract class AbstractVFSHandler extends URLStreamHandler { private static Map lengths = new WeakHashMap(); /** * Get protocol name length. * e.g. vfsfile - 7, vfszip - 6, ... * * @return protocol name lenght */ protected int getProtocolNameLength() { Class clazz = getClass(); Integer length = lengths.get(clazz); if (length == null) { Package pck = clazz.getPackage(); String pckName = pck.getName(); int p = pckName.lastIndexOf('.'); length = pckName.substring(p + 1).length(); lengths.put(clazz, length); } return length; } protected URLConnection openConnection(URL url) throws IOException { VFSCache cache = VFSCacheFactory.getInstance(); VirtualFile vf = cache.getFile(url); if (vf != null) return new VirtualFileURLConnection(url, vf); String file = URLDecoder.decode(url.toExternalForm(), "UTF-8").substring(getProtocolNameLength() + 1); // strip out vfs protocol + : URL vfsurl = null; String relative; String queryStr = url.getQuery(); if (queryStr != null) file = file.substring(0, file.lastIndexOf('?')); File fp = new File(file); if (fp.exists()) { vfsurl = fp.getParentFile().toURL(); relative = fp.getName(); } else { File curr = fp; relative = fp.getName(); while ((curr = curr.getParentFile()) != null) { if (curr.exists()) { vfsurl = curr.toURL(); break; } else { relative = curr.getName() + "/" + relative; } } } if (vfsurl == null) throw new IOException("VFS file does not exist: " + url); if (queryStr != null) vfsurl = new URL(vfsurl + "?" + queryStr); return new VirtualFileURLConnection(url, vfsurl, relative); } }libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/protocol/vfsmemory/0000755000175000017500000000000011146622527030146 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/protocol/vfsmemory/Handler.java0000644000175000017500000000400411023167112032350 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.protocol.vfsmemory; import java.io.IOException; import java.net.URL; import java.net.URLConnection; import java.net.URLStreamHandler; import org.jboss.virtual.MemoryFileFactory; import org.jboss.virtual.VFS; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.plugins.vfs.VirtualFileURLConnection; /** * URLStreamHandler for VFS * * @author Bill Burke * @author Ales Justin * @version $Revision: 1.1 $ */ public class Handler extends URLStreamHandler { protected URLConnection openConnection(URL url) throws IOException { String host = url.getHost(); VFS vfs = MemoryFileFactory.find(host); if (vfs == null) throw new IOException("VFS does not exist: " + url); VirtualFile vf = vfs.getChild(url.getPath()); if (vf == null) throw new IOException("VFS does not exist: " + url); return new VirtualFileURLConnection(url, vf); } } libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/protocol/vfsjar/0000755000175000017500000000000011146622527027412 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/protocol/vfsjar/Handler.java0000644000175000017500000000341610745411530031630 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.protocol.vfsjar; import java.io.IOException; import java.net.URL; import java.net.URLConnection; import java.net.URLStreamHandler; import org.jboss.virtual.plugins.vfs.VirtualFileURLConnection; /** * URLStreamHandler for VFS * * @author Bill Burke * @version $Revision: 1.1 $ */ public class Handler extends URLStreamHandler { protected URLConnection openConnection(URL u) throws IOException { String urlString = u.toString(); int index = urlString.indexOf("!/"); String file = urlString.substring(3, index + 2); // strip out vfs String path = urlString.substring(index + 2); URL url = new URL(file); return new VirtualFileURLConnection(u, url, path); } } libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/protocol/vfs/0000755000175000017500000000000011146622527026715 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/protocol/vfs/Handler.java0000644000175000017500000000404011023167112031117 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.protocol.vfs; import java.io.IOException; import java.net.URL; import java.net.URLConnection; import java.net.URLStreamHandler; import org.jboss.virtual.VirtualFile; import org.jboss.virtual.plugins.context.vfs.AssembledContextFactory; import org.jboss.virtual.AssembledDirectory; import org.jboss.virtual.plugins.vfs.VirtualFileURLConnection; /** * URLStreamHandler for VFS * * @author Bill Burke * @version $Revision: 1.1 $ */ public class Handler extends URLStreamHandler { protected URLConnection openConnection(URL url) throws IOException { String host = url.getHost(); AssembledDirectory directory = AssembledContextFactory.getInstance().find(host); if (directory == null) throw new IOException("vfs does not exist: " + url); VirtualFile vf = directory.getChild(url.getPath()); if (vf == null) throw new IOException("vfs does not exist: " + url); return new VirtualFileURLConnection(url, vf); } } libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/protocol/vfsfile/0000755000175000017500000000000011146622527027555 5ustar twernertwernerlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/protocol/vfsfile/Handler.java0000644000175000017500000000251711024502613031766 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual.protocol.vfsfile; import org.jboss.virtual.protocol.AbstractVFSHandler; /** * URLStreamHandler for VFS * * @author Bill Burke * @author Ales Justin * @version $Revision: 1.1 $ */ public class Handler extends AbstractVFSHandler { } libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/AssembledDirectory.java0000644000175000017500000004742011043355426030711 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual; import java.io.IOException; import java.net.URL; import java.net.URISyntaxException; import java.util.List; import java.util.regex.Pattern; import org.jboss.virtual.plugins.context.jar.JarUtils; import org.jboss.virtual.plugins.context.vfs.AssembledContext; import org.jboss.virtual.plugins.context.vfs.AssembledDirectoryHandler; import org.jboss.virtual.plugins.context.vfs.AssembledFileHandler; import org.jboss.virtual.plugins.context.vfs.ByteArrayHandler; import org.jboss.virtual.plugins.vfs.helpers.FilterVirtualFileVisitor; import org.jboss.virtual.plugins.vfs.helpers.SuffixesExcludeFilter; /** * Extension of VirtualFile that represents a virtual directory that can be composed of arbitrary files and resources * spread throughout the file system or embedded in jar files. * * @author Bill Burke * @author Ales Justin * @version $Revision: 1.1 $ */ public class AssembledDirectory extends VirtualFile { /** No jars file filter */ private static final VirtualFileFilter noJars = new SuffixesExcludeFilter(JarUtils.getSuffixes()); /** The directory */ private AssembledDirectoryHandler directory; public AssembledDirectory(AssembledDirectoryHandler handler) { super(handler); directory = handler; } /** * Create assembled directory. * * @param name context's name * @param rootName root name * @return new assembled directory instance * @throws IOException for any IO error * @throws URISyntaxException for any URI error */ public static AssembledDirectory createAssembledDirectory(String name, String rootName) throws IOException, URISyntaxException { AssembledContext context = new AssembledContext(name, rootName); return context.getRoot().getVirtualFile(); } /** * Add files recursively from root, using the no jars filter. * * @param root the root * @throws IOException for any error */ public void addPath(VirtualFile root) throws IOException { addPath(root, noJars); } /** * Add files recursively from root, using the filter. * * @param root the root * @param recurseFilter the recurse filter * @throws IOException for any error */ public void addPath(VirtualFile root, VirtualFileFilter recurseFilter) throws IOException { final VisitorAttributes va = new VisitorAttributes(); va.setLeavesOnly(true); va.setRecurseFilter(recurseFilter); VirtualFileVisitor visitor = new VirtualFileVisitor() { public VisitorAttributes getAttributes() { return va; } public void visit(VirtualFile virtualFile) { mkdirs(virtualFile.getPathName()).addChild(virtualFile); } }; root.visit(visitor); } /** * Find the underlying .class file representing this class and create it within this directory, along with * its packages. * * So, if you added com.acme.Customer class, then a directory structure com/acme would be created * and an entry in the acme directory would be the .class file. * * @param clazz the class */ public void addClass(Class clazz) { if (clazz == null) throw new IllegalArgumentException("Null clazz"); addClass(clazz.getName(), clazz.getClassLoader()); } /** * Find the underlying .class file representing this class and create it within this directory, along with * its packages. * * So, if you added com.acme.Customer class, then a directory structure com/acme would be created * and an entry in the acme directory would be the .class file. * * @param className the class name */ public void addClass(String className) { addClass(className, Thread.currentThread().getContextClassLoader()); } /** * Find the underlying .class file representing this class and create it within this directory, along with * its packages. * * So, if you added com.acme.Customer class, then a directory structure com/acme would be created * and an entry in the acme directory would be the .class file. * * @param className the class name * @param loader ClassLoader to look for class resource */ public void addClass(String className, ClassLoader loader) { if (className == null) throw new IllegalArgumentException("Null className"); if (loader == null) throw new IllegalArgumentException("Null loader"); String resource = className.replace('.', '/') + ".class"; URL url = loader.getResource(resource); if (url == null) throw new RuntimeException("Could not find resource: " + resource); AssembledDirectory p = mkdirs(resource); p.addResource(resource, loader); } /** * Make any directories for the give path to a file. * * @param path must be a path to a file as last element in path does not have a directory created * @return directory file will live in */ public AssembledDirectory mkdirs(String path) { if (path == null) throw new IllegalArgumentException("Null path"); String[] pkgs = path.split("/"); AssembledDirectoryHandler dir = directory; for (int i = 0; i < pkgs.length - 1; i++) { AssembledDirectoryHandler next = (AssembledDirectoryHandler) dir.findChild(pkgs[i]); if (next == null) { try { next = new AssembledDirectoryHandler(dir.getVFSContext(), dir, pkgs[i]); } catch (IOException e) { throw new RuntimeException(e); } dir.addChild(next); } dir = next; } return dir.getVirtualFile(); } /** * Locate the .class resource of baseResource. From this resource, determine the base of the resource * i.e. what jar or classpath directory it lives in. * * Once the base of the resource is found, scan all files recursively within the base using the include and exclude * patterns. A mirror file structure will be created within this AssembledDirectory. Ths is very useful when you * want to create a virtual jar that contains a subset of .class files in your classpath. * * The include/exclude patterns follow the Ant file pattern matching syntax. See ant.apache.org for more details. * * @param baseResource the base resource * @param includes the includes * @param excludes the excludes */ public void addResources(Class baseResource, String[] includes, String[] excludes) { if (baseResource == null) throw new IllegalArgumentException("Null base resource"); String resource = baseResource.getName().replace('.', '/') + ".class"; addResources(resource, includes, excludes, baseResource.getClassLoader()); } /** * From the baseResource, determine the base of that resource * i.e. what jar or classpath directory it lives in. The Thread.currentThread().getContextClassloader() will be used * * Once the base of the resource is found, scan all files recursively within the base using the include and exclude * patterns. A mirror file structure will be created within this AssembledDirectory. Ths is very useful when you * want to create a virtual jar that contains a subset of .class files in your classpath. * * The include/exclude patterns follow the Ant file pattern matching syntax. See ant.apache.org for more details. * * @param baseResource the base resource * @param includes the includes * @param excludes the excludes */ public void addResources(String baseResource, final String[] includes, final String[] excludes) { if (baseResource == null) throw new IllegalArgumentException("Null base resource"); addResources(baseResource, includes, excludes, Thread.currentThread().getContextClassLoader()); } /** * From the baseResource, determine the base of that resource * i.e. what jar or classpath directory it lives in. The loader parameter will be used to find the resource. * * Once the base of the resource is found, scan all files recursively within the base using the include and exclude * patterns. A mirror file structure will be created within this AssembledDirectory. Ths is very useful when you * want to create a virtual jar that contains a subset of .class files in your classpath. * * The include/exclude patterns follow the Ant file pattern matching syntax. See ant.apache.org for more details. * * @param baseResource the base resource * @param includes the includes * @param excludes the excludes * @param loader the loader */ public void addResources(String baseResource, final String[] includes, final String[] excludes, ClassLoader loader) { if (baseResource == null) throw new IllegalArgumentException("Null baseResource"); if (loader == null) throw new IllegalArgumentException("Null loader"); URL url = loader.getResource(baseResource); if (url == null) throw new RuntimeException("Could not find baseResource: " + baseResource); String urlString = url.toString(); int idx = urlString.lastIndexOf(baseResource); urlString = urlString.substring(0, idx); try { url = new URL(urlString); VirtualFile parent = VFS.getRoot(url); VisitorAttributes va = new VisitorAttributes(); va.setLeavesOnly(true); va.setRecurseFilter(noJars); VirtualFileFilter filter = new VirtualFileFilter() { public boolean accepts(VirtualFile file) { boolean matched = false; String path = file.getPathName(); for (String include : includes) { if (antMatch(path, include)) { matched = true; break; } } if (matched == false) return false; if (excludes != null) { for (String exclude : excludes) { if (antMatch(path, exclude)) return false; } } return true; } }; FilterVirtualFileVisitor visitor = new FilterVirtualFileVisitor(filter, va); parent.visit(visitor); List files = visitor.getMatched(); for (VirtualFile vf : files) { mkdirs(vf.getPathName()).addChild(vf); } } catch (IOException e) { throw new RuntimeException(e); } } /** * Create a regular expression pattern from an Ant file matching pattern * * @param matcher the matcher pattern * @return the pattern instance */ public static Pattern getPattern(String matcher) { if (matcher == null) throw new IllegalArgumentException("Null matcher"); matcher = matcher.replace(".", "\\."); matcher = matcher.replace("*", ".*"); matcher = matcher.replace("?", ".{1}"); return Pattern.compile(matcher); } /** * Determine whether a given file path matches an Ant pattern. * * @param path the path * @param expression the expression * @return true if we match */ public static boolean antMatch(String path, String expression) { if (path == null) throw new IllegalArgumentException("Null path"); if (expression == null) throw new IllegalArgumentException("Null expression"); if (path.startsWith("/")) path = path.substring(1); if (expression.endsWith("/")) expression += "**"; String[] paths = path.split("/"); String[] expressions = expression.split("/"); int x = 0, p; Pattern pattern = getPattern(expressions[0]); for (p = 0; p < paths.length && x < expressions.length; p++) { if (expressions[x].equals("**")) { do { x++; } while (x < expressions.length && expressions[x].equals("**")); if (x == expressions.length) return true; // "**" with nothing after it pattern = getPattern(expressions[x]); } String element = paths[p]; if (pattern.matcher(element).matches()) { x++; if (x < expressions.length) { pattern = getPattern(expressions[x]); } } else if (!(x > 0 && expressions[x - 1].equals("**"))) // our previous isn't "**" { return false; } } if (p < paths.length) return false; if (x < expressions.length) return false; return true; } /** * Add a VirtualFile as a child to this AssembledDirectory. * * @param vf the virtual file * @return the file */ public VirtualFile addChild(VirtualFile vf) { if (vf == null) throw new IllegalArgumentException("Null virtual file"); return directory.addChild(vf.getHandler()).getVirtualFile(); } /** * Add a VirtualFile as a child to this AssembledDirectory. This file will be added * under a new aliased name. * * @param vf the virtual file * @param newName the new name * @return new file */ public VirtualFile addChild(VirtualFile vf, String newName) { try { AssembledFileHandler handler = new AssembledFileHandler(directory.getVFSContext(), directory, newName, vf.getHandler()); directory.addChild(handler); return handler.getVirtualFile(); } catch (IOException e) { throw new RuntimeException(e); } } /** * Add a classloader found resource to as a child to this AssembledDirectory. The base file name of the * resource will be used as the child's name. * * Thread.currentThread.getCOntextClassLoader() will be used to load the resource. * * @param resource the resource * @return the file */ public VirtualFile addResource(String resource) { return addResource(resource, Thread.currentThread().getContextClassLoader()); } /** * Add a classloader found resource to as a child to this AssembledDirectory. The newName parameter will be used * as the name of the child. * * Thread.currentThread.getCOntextClassLoader() will be used to load the resource. * * @param resource the resource * @param newName the new name * @return the file */ public VirtualFile addResource(String resource, String newName) { return addResource(resource, Thread.currentThread().getContextClassLoader(), newName); } /** * Add a classloader found resource to as a child to this AssembledDirectory. The base file name of the * resource will be used as the child's name. * * The loader parameter will be used to load the resource. * * @param resource the resource * @param loader the loader * @return the file */ public VirtualFile addResource(String resource, ClassLoader loader) { if (resource == null) throw new IllegalArgumentException("Null resource"); if (loader == null) throw new IllegalArgumentException("Null loader"); URL url = loader.getResource(resource); if (url == null) throw new RuntimeException("Could not find resource: " + resource); return addResource(url); } /** * Add a resource identified by the URL as a child to this AssembledDirectory. * * @param url the url * @return the file */ public VirtualFile addResource(URL url) { if (url == null) throw new IllegalArgumentException("Null url"); try { VirtualFile vf = VFS.getRoot(url); return addChild(vf); } catch (IOException e) { throw new RuntimeException(e); } } /** * Add a classloader found resource to as a child to this AssembledDirectory. The newName parameter will be used * as the name of the child. * * The loader parameter will be used to load the resource. * * @param resource the resource * @param loader the loader * @param newName the new name * @return the file */ public VirtualFile addResource(String resource, ClassLoader loader, String newName) { if (resource == null) throw new IllegalArgumentException("Null resource"); if (loader == null) throw new IllegalArgumentException("Null loader"); if (newName == null) throw new IllegalArgumentException("Null newName"); URL url = loader.getResource(resource); if (url == null) throw new RuntimeException("Could not find resource: " + resource); try { VirtualFile vf = VFS.getRoot(url); return addChild(vf, newName); } catch (IOException e) { throw new RuntimeException(e); } } /** * Add raw bytes as a file to this assembled directory * * @param bytes the bytes * @param name the name * @return the file */ public VirtualFile addBytes(byte[] bytes, String name) { if (bytes == null) throw new IllegalArgumentException("Null bytes"); if (name == null) throw new IllegalArgumentException("Null name"); ByteArrayHandler handler; try { handler = new ByteArrayHandler(directory.getVFSContext(), directory, name, bytes); } catch (IOException e) { throw new RuntimeException(e); } directory.addChild(handler); return handler.getVirtualFile(); } /** * Create a directory within this directory. * * @param name the name * @return the directory */ public AssembledDirectory mkdir(String name) { if (name == null) throw new IllegalArgumentException("Null name"); try { AssembledDirectoryHandler handler = new AssembledDirectoryHandler(directory.getVFSContext(), directory, name); directory.addChild(handler); return new AssembledDirectory(handler); } catch (IOException e) { throw new RuntimeException(e); } } } ././@LongLink0000000000000000000000000000014500000000000011565 Lustar rootrootlibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/VirtualFileFilterWithAttributes.javalibjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/VirtualFileFilterWithAttributes.java0000644000175000017500000000250210477530213033413 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2005, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual; /** * A filter for virtual files with attributes * * @author adrian@jboss.org * @version $Revision: 44334 $ */ public interface VirtualFileFilterWithAttributes extends VirtualFileFilter { /** * Get the attributes for this filter * * @return the attributes */ VisitorAttributes getAttributes(); } libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/MemoryFileFactory.java0000644000175000017500000000556711001646121030520 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual; import java.io.IOException; import java.net.URI; import java.net.URL; import org.jboss.virtual.plugins.context.memory.MemoryContextFactory; /** * Memory VFS API. * * @author Ales Justin */ public class MemoryFileFactory { private static final MemoryContextFactory factory = MemoryContextFactory.getInstance(); /** * Find host's VFS. * * @param host the host * @return host's vfs */ public static VFS find(String host) { return factory.find(host); } /** * Create the memory root. * * @param uri the uri * @return root's vfs * @throws IOException for any error */ public static VFS createRoot(URI uri) throws IOException { return createRoot(uri.toURL()); } /** * Create root vfs. * * @param url the url * @return root's vfs */ public static VFS createRoot(URL url) { return factory.createRoot(url).getVFS(); } /** * Create memory directory. * * @param url the url * @return vfs directory */ public static VirtualFile createDirectory(URL url) { return factory.createDirectory(url); } /** * Put file. * * @param url the url * @param contents the contents * @return vfs file */ public static VirtualFile putFile(URL url, byte[] contents) { return factory.putFile(url, contents); } /** * Delete root. * * @param url the url * @return true if deleted */ public static boolean deleteRoot(URL url) { return factory.deleteRoot(url); } /** * Delete. * * @param url the url * @return true if deleted */ public static boolean delete(URL url) { return factory.delete(url); } } libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/VirtualFile.java0000644000175000017500000003262611137562372027361 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2005, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual ; import java.io.IOException; import java.io.InputStream; import java.io.Serializable; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.Collections; import java.util.List; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; import org.jboss.virtual.plugins.vfs.helpers.FilterVirtualFileVisitor; import org.jboss.virtual.plugins.vfs.helpers.MatchAllVirtualFileFilter; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VirtualFileHandler; import org.jboss.util.collection.WeakSet; /** * A virtual file as seen by the user * * @author Scott.Stark@jboss.org * @author adrian@jboss.org * @version $Revision: 44334 $ */ public class VirtualFile implements Serializable { private static final long serialVersionUID = 1L; /** The virtual file handler */ private final VirtualFileHandler handler; /** Whether we are closed */ private final AtomicBoolean closed = new AtomicBoolean(false); /** The open streams */ private transient Set streams; /** * Create a new VirtualFile. * * @param handler the handler * @throws IllegalArgumentException if the handler is null */ public VirtualFile(VirtualFileHandler handler) { if (handler == null) throw new IllegalArgumentException("Null handler"); this.handler = handler; } /** * Get the virtual file handler * * @return the handler * @throws IllegalStateException if the file is closed */ VirtualFileHandler getHandler() { if (closed.get()) throw new IllegalStateException("The virtual file is closed"); return handler; } /** * Get the simple VF name (X.java) * * @return the simple file name * @throws IllegalStateException if the file is closed */ public String getName() { return getHandler().getName(); } /** * Get the VFS relative path name (org/jboss/X.java) * * @return the VFS relative path name * @throws IllegalStateException if the file is closed */ public String getPathName() { return getHandler().getPathName(); } /** * Get the VF URL (file://root/org/jboss/X.java) * * @return the full URL to the VF in the VFS. * @throws MalformedURLException if a url cannot be parsed * @throws URISyntaxException if a uri cannot be parsed * @throws IllegalStateException if the file is closed */ public URL toURL() throws MalformedURLException, URISyntaxException { return getHandler().toVfsUrl(); } /** * Get the VF URI (file://root/org/jboss/X.java) * * @return the full URI to the VF in the VFS. * @throws URISyntaxException if a uri cannot be parsed * @throws IllegalStateException if the file is closed * @throws MalformedURLException for a bad url */ public URI toURI() throws MalformedURLException, URISyntaxException { return VFSUtils.toURI(toURL()); } /** * When the file was last modified * * @return the last modified time * @throws IOException for any problem accessing the virtual file system * @throws IllegalStateException if the file is closed */ public long getLastModified() throws IOException { return getHandler().getLastModified(); } /** * Returns true if the file has been modified since this method was last called * Last modified time is initialized at handler instantiation. * * @return true if modifed, false otherwise * @throws IOException for any error */ public boolean hasBeenModified() throws IOException { return getHandler().hasBeenModified(); } /** * Get the size * * @return the size * @throws IOException for any problem accessing the virtual file system * @throws IllegalStateException if the file is closed */ public long getSize() throws IOException { return getHandler().getSize(); } /** * Tests whether the underlying implementation file still exists. * @return true if the file exists, false otherwise. * @throws IOException - thrown on failure to detect existence. */ public boolean exists() throws IOException { return getHandler().exists(); } /** * Whether it is a simple leaf of the VFS, * i.e. whether it can contain other files * * @return true if a simple file. * @throws IOException for any problem accessing the virtual file system * @throws IllegalStateException if the file is closed */ public boolean isLeaf() throws IOException { return getHandler().isLeaf(); } /** * Whether it is hidden * * @return true when hidden * @throws IOException for any problem accessing the virtual file system * @throws IllegalStateException if the file is closed */ public boolean isHidden() throws IOException { return getHandler().isHidden(); } /** * Access the file contents. * * @return an InputStream for the file contents. * @throws IOException for any error accessing the file system * @throws IllegalStateException if the file is closed */ public InputStream openStream() throws IOException { InputStream result = getHandler().openStream(); checkStreams(); streams.add(result); return result; } /** * Check if streams set exist. */ @SuppressWarnings("unchecked") protected void checkStreams() { if (streams == null) { synchronized (closed) { // double null check, so that possible // waiting threads don't override streams if (streams == null) streams = Collections.synchronizedSet(new WeakSet()); } } } /** * Close the streams */ public void closeStreams() { if (streams == null) return; // Close the streams for (InputStream stream : streams) { if (stream != null) { try { stream.close(); } catch (IOException ignored) { } } } streams.clear(); } /** * Do file cleanup. * e.g. delete temp files */ public void cleanup() { try { getHandler().cleanup(); } finally { VFS.cleanup(this); } } /** * Close the file resources (stream, etc.) */ public void close() { if (closed.getAndSet(true) == false) { closeStreams(); handler.close(); } } /** * Delete this virtual file * * @return true if file was deleted * @throws IOException if an error occurs */ public boolean delete() throws IOException { // gracePeriod of 2 seconds return getHandler().delete(2000); } /** * Delete this virtual file * * @param gracePeriod max time to wait for any locks (in milliseconds) * @return true if file was deleted * @throws IOException if an error occurs */ public boolean delete(int gracePeriod) throws IOException { return getHandler().delete(gracePeriod); } /** * Get the VFS instance for this virtual file * * @return the VFS * @throws IllegalStateException if the file is closed */ public VFS getVFS() { VFSContext context = getHandler().getVFSContext(); return context.getVFS(); } /** * Get the parent * * @return the parent or null if there is no parent * @throws IOException for any problem accessing the virtual file system * @throws IllegalStateException if the file is closed */ public VirtualFile getParent() throws IOException { VirtualFileHandler parent = getHandler().getParent(); if (parent != null) return parent.getVirtualFile(); return null; } /** * Get the children * * @return the children * @throws IOException for any problem accessing the virtual file system * @throws IllegalStateException if the file is closed */ public List getChildren() throws IOException { return getChildren(null); } /** * Get the children * * @param filter to filter the children * @return the children * @throws IOException for any problem accessing the virtual file system * @throws IllegalStateException if the file is closed or it is a leaf node */ public List getChildren(VirtualFileFilter filter) throws IOException { if (isLeaf()) return Collections.emptyList(); if (filter == null) filter = MatchAllVirtualFileFilter.INSTANCE; FilterVirtualFileVisitor visitor = new FilterVirtualFileVisitor(filter, null); visit(visitor); return visitor.getMatched(); } /** * Get all the children recursively

* * This always uses {@link VisitorAttributes#RECURSE} * * @return the children * @throws IOException for any problem accessing the virtual file system * @throws IllegalStateException if the file is closed */ public List getChildrenRecursively() throws IOException { return getChildrenRecursively(null); } /** * Get all the children recursively

* * This always uses {@link VisitorAttributes#RECURSE} * * @param filter to filter the children * @return the children * @throws IOException for any problem accessing the virtual file system * @throws IllegalStateException if the file is closed or it is a leaf node */ public List getChildrenRecursively(VirtualFileFilter filter) throws IOException { if (isLeaf()) return Collections.emptyList(); if (filter == null) filter = MatchAllVirtualFileFilter.INSTANCE; FilterVirtualFileVisitor visitor = new FilterVirtualFileVisitor(filter, VisitorAttributes.RECURSE); visit(visitor); return visitor.getMatched(); } /** * Visit the virtual file system * * @param visitor the visitor * @throws IOException for any problem accessing the virtual file system * @throws IllegalArgumentException if the visitor is null * @throws IllegalStateException if the file is closed */ public void visit(VirtualFileVisitor visitor) throws IOException { if (isLeaf() == false) getVFS().visit(this, visitor); } /** * Find a child * * @param path the path * @return the child * @throws IOException for any problem accessing the VFS (including the child does not exist) * @throws IllegalArgumentException if the path is null * @throws IllegalStateException if the file is closed or it is a leaf node * @deprecated use getChild, and handle null if not found */ @Deprecated public VirtualFile findChild(String path) throws IOException { if (path == null) throw new IllegalArgumentException("Null path"); VirtualFileHandler handler = getHandler(); VirtualFileHandler child = handler.getChild(VFSUtils.fixName(path)); if (child == null) { List children = handler.getChildren(true); throw new IOException("Child not found " + path + " for " + handler + ", available children: " + children); } return child.getVirtualFile(); } /** * Get a child * * @param path the path * @return the child or null if not found * @throws IOException for any problem accessing the VFS * @throws IllegalArgumentException if the path is null * @throws IllegalStateException if the file is closed or it is a leaf node */ public VirtualFile getChild(String path) throws IOException { if (path == null) throw new IllegalArgumentException("Null path"); VirtualFileHandler handler = getHandler(); VirtualFileHandler child = handler.getChild(VFSUtils.fixName(path)); return child != null ? child.getVirtualFile() : null; } @Override public String toString() { return handler.toString(); } @Override public int hashCode() { return handler.hashCode(); } @Override public boolean equals(Object obj) { if (obj == this) return true; if (obj == null || obj instanceof VirtualFile == false) return false; VirtualFile other = (VirtualFile) obj; return handler.equals(other.handler); } } libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/VFS.java0000644000175000017500000003500611137562372025564 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual; import java.io.IOException; import java.net.URI; import java.net.URL; import java.util.List; import org.jboss.virtual.plugins.vfs.helpers.WrappingVirtualFileHandlerVisitor; import org.jboss.virtual.spi.ExceptionHandler; import org.jboss.virtual.spi.VFSContext; import org.jboss.virtual.spi.VFSContextFactory; import org.jboss.virtual.spi.VFSContextFactoryLocator; import org.jboss.virtual.spi.VirtualFileHandler; import org.jboss.virtual.spi.cache.VFSCache; import org.jboss.virtual.spi.cache.VFSCacheFactory; /** * Virtual File System * * @author Adrian Brock * @author Scott.Stark@jboss.org * @author Ales Justin * @version $Revision: 1.1 $ */ public class VFS { /** The VFS Context */ private final VFSContext context; static { init(); } /** * Create a new VFS. * * @param context the context * @throws IllegalArgumentException for a null context */ public VFS(VFSContext context) { if (context == null) throw new IllegalArgumentException("Null name"); this.context = context; } /** * Initialize VFS protocol handlers package property. */ @SuppressWarnings({"deprecation", "unchecked"}) public static void init() { String pkgs = System.getProperty("java.protocol.handler.pkgs"); if (pkgs == null || pkgs.trim().length() == 0) { pkgs = "org.jboss.virtual.protocol"; System.setProperty("java.protocol.handler.pkgs", pkgs); } else if (!pkgs.contains("org.jboss.virtual.protocol")) { pkgs += "|org.jboss.virtual.protocol"; System.setProperty("java.protocol.handler.pkgs", pkgs); } org.jboss.virtual.plugins.context.VfsArchiveBrowserFactory factory = org.jboss.virtual.plugins.context.VfsArchiveBrowserFactory.INSTANCE; // keep this until AOP and HEM uses VFS internally instead of the stupid ArchiveBrowser crap. org.jboss.util.file.ArchiveBrowser.factoryFinder.put("vfsfile", factory); org.jboss.util.file.ArchiveBrowser.factoryFinder.put("vfszip", factory); org.jboss.util.file.ArchiveBrowser.factoryFinder.put("vfsjar", factory); org.jboss.util.file.ArchiveBrowser.factoryFinder.put("vfs", factory); } /** * Get the vfs context. * * This is package protected method. * Same as VirtualFile::getHandler. * * @return the vfs context */ VFSContext getContext() { return context; } /** * Set exception handler. * * @param exceptionHandler the exception handler. */ public void setExceptionHandler(ExceptionHandler exceptionHandler) { context.setExceptionHandler(exceptionHandler); } /** * Cleanup any resources tied to this file. * e.g. vfs cache * * @param file the file */ static void cleanup(VirtualFile file) { try { VirtualFileHandler fileHandler = file.getHandler(); VFSContext context = fileHandler.getVFSContext(); VirtualFileHandler contextHandler = context.getRoot(); // the file is the context root, hence possible cache candidate if (fileHandler.equals(contextHandler)) { VFSCache cache = VFSCacheFactory.getInstance(); cache.removeContext(context); } } catch (Exception ignored) { } } /** * Get the virtual file system for a root uri * * @param rootURI the root URI * @return the virtual file system * @throws IOException if there is a problem accessing the VFS * @throws IllegalArgumentException if the rootURL is null */ public static VFS getVFS(URI rootURI) throws IOException { VFSContextFactory factory = VFSContextFactoryLocator.getFactory(rootURI); if (factory == null) throw new IOException("No context factory for " + rootURI); VFSContext context = factory.getVFS(rootURI); VFSCacheFactory.getInstance().putContext(context); return context.getVFS(); } /** * Create new root * * @param rootURI the root url * @return the virtual file * @throws IOException if there is a problem accessing the VFS * @throws IllegalArgumentException if the rootURL */ public static VirtualFile createNewRoot(URI rootURI) throws IOException { VFS vfs = getVFS(rootURI); return vfs.getRoot(); } /** * Get the root virtual file * * @param rootURI the root uri * @return the virtual file * @throws IOException if there is a problem accessing the VFS * @throws IllegalArgumentException if the rootURL is null */ public static VirtualFile getRoot(URI rootURI) throws IOException { VFSCache cache = VFSCacheFactory.getInstance(); VirtualFile file = cache.getFile(rootURI); return (file != null) ? file : createNewRoot(rootURI); } /** * Get cached file. * * If VFSContext matching the rootURI parameter is cached * this method will return cached virtual file * else it will use VFS::getRoot(rootURI). * * @param rootURI the root uri * @return the cached virtual file * @throws IOException for any error * @throws IllegalArgumentException if the rootURL is null * @deprecated use getRoot */ @Deprecated public static VirtualFile getCachedFile(URI rootURI) throws IOException { return getRoot(rootURI); } /** * Get a virtual file * * @param rootURI the root uri * @param name the path name * @return the virtual file * @throws IOException if there is a problem accessing the VFS * @throws IllegalArgumentException if the rootURL or name is null */ @SuppressWarnings("deprecation") public static VirtualFile getVirtualFile(URI rootURI, String name) throws IOException { VirtualFile root = getRoot(rootURI); return root.findChild(name); } /** * Get the virtual file system for a root url * * @param rootURL the root url * @return the virtual file system * @throws IOException if there is a problem accessing the VFS * @throws IllegalArgumentException if the rootURL is null */ public static VFS getVFS(URL rootURL) throws IOException { VFSContextFactory factory = VFSContextFactoryLocator.getFactory(rootURL); if (factory == null) throw new IOException("No context factory for " + rootURL); VFSContext context = factory.getVFS(rootURL); VFSCacheFactory.getInstance().putContext(context); return context.getVFS(); } /** * Create new root * * @param rootURL the root url * @return the virtual file * @throws IOException if there is a problem accessing the VFS * @throws IllegalArgumentException if the rootURL */ public static VirtualFile createNewRoot(URL rootURL) throws IOException { VFS vfs = getVFS(rootURL); return vfs.getRoot(); } /** * Get the root virtual file * * @param rootURL the root url * @return the virtual file * @throws IOException if there is a problem accessing the VFS * @throws IllegalArgumentException if the rootURL */ public static VirtualFile getRoot(URL rootURL) throws IOException { VFSCache cache = VFSCacheFactory.getInstance(); VirtualFile file = cache.getFile(rootURL); return (file != null) ? file : createNewRoot(rootURL); } /** * Get cached file. * * If VFSContext matching the rootURL parameter is cached * this method will return cached virtual file * else it will use VFS::getRoot(rootURL). * * @param rootURL the root url * @return the cached virtual file * @throws IOException for any error * @throws IllegalArgumentException if the rootURL is null * @deprecated use getRoot */ @Deprecated public static VirtualFile getCachedFile(URL rootURL) throws IOException { return getRoot(rootURL); } /** * Get a virtual file * * @param rootURL the root url * @param name the path name * @return the virtual file * @throws IOException if there is a problem accessing the VFS * @throws IllegalArgumentException if the rootURL or name is null */ @SuppressWarnings("deprecation") public static VirtualFile getVirtualFile(URL rootURL, String name) throws IOException { VirtualFile root = getRoot(rootURL); return root.findChild(name); } /** * Get the root file of this VFS * * @return the root * @throws IOException for any problem accessing the VFS */ public VirtualFile getRoot() throws IOException { VirtualFileHandler handler = context.getRoot(); return handler.getVirtualFile(); } /** * Find a child from the root * * @param path the child path * @return the child * @throws IOException for any problem accessing the VFS (including the child does not exist) * @throws IllegalArgumentException if the path is null * @deprecated use getChild, and handle null if not found */ @Deprecated public VirtualFile findChild(String path) throws IOException { if (path == null) throw new IllegalArgumentException("Null path"); VirtualFileHandler handler = context.getRoot(); VirtualFileHandler result = context.getChild(handler, VFSUtils.fixName(path)); if (result == null) { List children = handler.getChildren(true); throw new IOException("Child not found " + path + " for " + handler + ", available children: " + children); } return result.getVirtualFile(); } /** * Get a child * * @param path the child path * @return the child or null if not found * @throws IOException if a real problem occurs */ public VirtualFile getChild(String path) throws IOException { if (path == null) throw new IllegalArgumentException("Null path"); VirtualFileHandler handler = context.getRoot(); VirtualFileHandler result = context.getChild(handler, VFSUtils.fixName(path)); return result != null ? result.getVirtualFile() : null; } /** * Find a child from the root * * @deprecated use {@link #findChild(String)} * @param path the child path * @return the child * @throws IOException for any problem accessing the VFS (including the child does not exist) * @throws IllegalArgumentException if the path is null */ @Deprecated @SuppressWarnings("deprecation") public VirtualFile findChildFromRoot(String path) throws IOException { return findChild(path); } /** * Get the children * * @return the children * @throws IOException for any problem accessing the virtual file system */ public List getChildren() throws IOException { return getRoot().getChildren(null); } /** * Get the children * * @param filter to filter the children * @return the children * @throws IOException for any problem accessing the virtual file system */ public List getChildren(VirtualFileFilter filter) throws IOException { return getRoot().getChildren(filter); } /** * Get all the children recursively

* * This always uses {@link VisitorAttributes#RECURSE} * * @return the children * @throws IOException for any problem accessing the virtual file system */ public List getChildrenRecursively() throws IOException { return getRoot().getChildrenRecursively(null); } /** * Get all the children recursively

* * This always uses {@link VisitorAttributes#RECURSE} * * @param filter to filter the children * @return the children * @throws IOException for any problem accessing the virtual file system */ public List getChildrenRecursively(VirtualFileFilter filter) throws IOException { return getRoot().getChildrenRecursively(filter); } /** * Visit the virtual file system from the root * * @param visitor the visitor * @throws IOException for any problem accessing the VFS * @throws IllegalArgumentException if the visitor is null */ public void visit(VirtualFileVisitor visitor) throws IOException { VirtualFileHandler handler = context.getRoot(); if (handler.isLeaf() == false) { WrappingVirtualFileHandlerVisitor wrapper = new WrappingVirtualFileHandlerVisitor(visitor); context.visit(handler, wrapper); } } /** * Visit the virtual file system * * @param file the file * @param visitor the visitor * @throws IOException for any problem accessing the VFS * @throws IllegalArgumentException if the file or visitor is null */ protected void visit(VirtualFile file, VirtualFileVisitor visitor) throws IOException { if (file == null) throw new IllegalArgumentException("Null file"); VirtualFileHandler handler = file.getHandler(); WrappingVirtualFileHandlerVisitor wrapper = new WrappingVirtualFileHandlerVisitor(visitor); VFSContext handlerContext = handler.getVFSContext(); handlerContext.visit(handler, wrapper); } @Override public String toString() { return context.toString(); } @Override public int hashCode() { return context.hashCode(); } @Override public boolean equals(Object obj) { if (obj == this) return true; if (obj == null || obj instanceof VFS == false) return false; VFS other = (VFS) obj; return context.equals(other.context); } } libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/VirtualFileVisitor.java0000644000175000017500000000271410477530213030727 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual; /** * Visits a virtual file and its children * * @author Adrian Brock * @version $Revision: 1.1 $ */ public interface VirtualFileVisitor { /** * Get the search attribues for this visitor * * @return the attributes */ VisitorAttributes getAttributes(); /** * Visit a virtual file * * @param virtualFile the virtual file being visited */ void visit(VirtualFile virtualFile); } libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/VisitorAttributes.java0000644000175000017500000001602310533536206030626 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2006, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual; /** * Attributes used when visiting a virtual file system * * @author Adrian Brock * @author Scott.Stark@jboss.org * @version $Revision: 1.1 $ */ public class VisitorAttributes { /** A VirtualFileFilter than accepts any file */ public static final AcceptAnyFilter RECURSE_ALL = new AcceptAnyFilter(); /** The default attributes - visit nothing both leaves, non-leaves, no recursion */ public static final VisitorAttributes DEFAULT = new ImmutableVisitorAttributes(); /** Visit leaves only and do not recurse non-leaf files */ public static final VisitorAttributes LEAVES_ONLY = new ImmutableVisitorAttributes(true, null); /** Recurse and visit all non-leaf files */ public static final VisitorAttributes RECURSE = new ImmutableVisitorAttributes(false, RECURSE_ALL); /** Recurse all non-leaf files but only visit leaves */ public static final VisitorAttributes RECURSE_LEAVES_ONLY = new ImmutableVisitorAttributes(true, RECURSE_ALL); /** Whether to include the root */ private boolean includeRoot; /** Whether to only visit leaves */ private boolean leavesOnly; /** Whether to ignore individual file errors */ private boolean ignoreErrors; /** Whether to include hidden files */ private boolean includeHidden; /** A filter used to control whether a non-leaf is recursive visited */ private VirtualFileFilter recurseFilter; /** * Whether to visit leaves only

* * Default: false * * @return the visit leaves only. */ public boolean isLeavesOnly() { return leavesOnly; } /** * Set the leaves only. * * @param leavesOnly the leaves only * @throws IllegalStateException if you attempt to modify one of the preconfigured static values of this class */ public void setLeavesOnly(boolean leavesOnly) { this.leavesOnly = leavesOnly; } /** * Whether to recurse into the non-leaf file

. If there is a recurse * filter then the result will by its accepts(file) value. * * Default: false * * @param file the file * @return the recurse flag. */ public boolean isRecurse(VirtualFile file) { boolean recurse = false; if( recurseFilter != null ) recurse = recurseFilter.accepts(file); return recurse; } /** * Get the recurse filter. * @return the current recurse filter. */ public VirtualFileFilter getRecurseFilter() { return recurseFilter; } /** * Set the recurse filter. * * @param filter - the recurse filter. * @throws IllegalStateException if you attempt to modify one of the preconfigured static values of this class */ public void setRecurseFilter(VirtualFileFilter filter) { this.recurseFilter = filter; } /** * Whether to include the root of the visit

* * Default: false * * @return the includeRoot. */ public boolean isIncludeRoot() { return includeRoot; } /** * Set the includeRoot. * * @param includeRoot the includeRoot. * @throws IllegalStateException if you attempt to modify one of the preconfigured static values of this class */ public void setIncludeRoot(boolean includeRoot) { this.includeRoot = includeRoot; } /** * Whether to ignore individual errors

* * Default: false * * @return the ignoreErrors. */ public boolean isIgnoreErrors() { return ignoreErrors; } /** * Set the ignoreErrors. * * @param ignoreErrors the ignoreErrors. * @throws IllegalStateException if you attempt to modify one of the preconfigured static values of this class */ public void setIgnoreErrors(boolean ignoreErrors) { this.ignoreErrors = ignoreErrors; } /** * Whether to include hidden files

* * Default: false * * @return the includeHidden. */ public boolean isIncludeHidden() { return includeHidden; } /** * Set the includeHidden. * * @param includeHidden the includeHidden. * @throws IllegalStateException if you attempt to modify one of the preconfigured static values of this class */ public void setIncludeHidden(boolean includeHidden) { this.includeHidden = includeHidden; } private static class AcceptAnyFilter implements VirtualFileFilter { public boolean accepts(VirtualFile file) { return true; } } /** * Immutable version of the attribues */ private static class ImmutableVisitorAttributes extends VisitorAttributes { /** * Create a new ImmutableVirtualFileVisitorAttributes with default values */ public ImmutableVisitorAttributes() { } /** * Create a new ImmutableVirtualFileVisitorAttributes. * * @param leavesOnly whether to visit leaves only * @param recurseFilter - filter which controls whether to recurse */ public ImmutableVisitorAttributes(boolean leavesOnly, VirtualFileFilter recurseFilter) { super.setLeavesOnly(leavesOnly); super.setRecurseFilter(recurseFilter); } @Override public void setLeavesOnly(boolean leavesOnly) { throw new IllegalStateException("The preconfigured attributes are immutable"); } @Override public void setIncludeRoot(boolean includeRoot) { throw new IllegalStateException("The preconfigured attributes are immutable"); } @Override public void setRecurseFilter(VirtualFileFilter filter) { throw new IllegalStateException("The preconfigured attributes are immutable"); } @Override public void setIgnoreErrors(boolean ignoreErrors) { throw new IllegalStateException("The preconfigured attributes are immutable"); } @Override public void setIncludeHidden(boolean includeHidden) { throw new IllegalStateException("The preconfigured attributes are immutable"); } } } libjboss-vfs-java-2.0.1.GA.orig/src/main/java/org/jboss/virtual/VirtualFileFilter.java0000644000175000017500000000254110477530213030513 0ustar twernertwerner/* * JBoss, Home of Professional Open Source * Copyright 2005, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.virtual; /** * A filter for virtual files * * @author Bill Burke * @author adrian@jboss.org * @version $Revision: 44334 $ */ public interface VirtualFileFilter { /** * Match the virtual file * * @param file the virtual file * @return true when it matches */ boolean accepts(VirtualFile file); } libjboss-vfs-java-2.0.1.GA.orig/build.xml0000644000175000017500000000317210546361267020055 0ustar twernertwerner ]]> libjboss-vfs-java-2.0.1.GA.orig/pom.xml0000644000175000017500000001023311137601524017533 0ustar twernertwerner org.jboss jboss-parent 4 4.0.0 org.jboss jboss-vfs jar 2.0.1.GA JBoss VFS http://www.jboss.org A VFS library scm:svn:http://anonsvn.jboss.org/repos/jbossas/projects/vfs/tags/2.0.1.GA scm:svn:https://svn.jboss.org/repos/jbossas/projects/vfs/tags/2.0.1.GA https://svn.jboss.org/repos/jbossas/projects/vfs/tags/2.0.1.GA lgpl http://repository.jboss.org/licenses/lgpl.txt JBoss, A division of Red Hat, Inc http://www.jboss.org 2.2.9.GA 2.0.5.GA 1.1.0.GA 4.4 src/main/java src/test/java ${artifactId} src/test/resources org.apache.maven.plugins maven-compiler-plugin 2.0 true 1.5 1.5 maven-source-plugin true jar org.apache.maven.plugins maven-surefire-plugin 2.3.1 always true true true org.apache.maven.plugins maven-release-plugin 2.0-beta-7 https://svn.jboss.org/repos/jbossas/projects/vfs/tags org.jboss jboss-common-core ${version.jboss.common.core} org.jboss.logging jboss-logging-spi ${version.jboss.logging} org.jboss.test jboss-test ${version.jboss.test} test junit junit ${version.junit} test