From de744cc55163ab04cec176e02772c872ee672df8 Mon Sep 17 00:00:00 2001 From: Costin Manolache Date: Fri, 4 Oct 2002 22:16:48 +0000 Subject: [PATCH] Remove the old embed proposal. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@273409 13f79535-47bb-0310-9956-ffa450edef68 --- proposal/sandbox/embed/Import.java | 182 --- .../sandbox/embed/ProjectHelperImpl2.java | 1013 ----------------- proposal/sandbox/embed/PropertyHelper.java | 219 ---- .../sandbox/embed/PropertyInterceptor.java | 95 -- proposal/sandbox/embed/README | 28 - .../sandbox/embed/RuntimeConfigurable2.java | 270 ----- proposal/sandbox/embed/SystemPath.java | 191 ---- proposal/sandbox/embed/ant-sax2.jar | Bin 49006 -> 0 bytes proposal/sandbox/embed/build.xml | 61 - .../embed/org.apache.tools.ant.ProjectHelper | 1 - 10 files changed, 2060 deletions(-) delete mode 100644 proposal/sandbox/embed/Import.java delete mode 100644 proposal/sandbox/embed/ProjectHelperImpl2.java delete mode 100644 proposal/sandbox/embed/PropertyHelper.java delete mode 100644 proposal/sandbox/embed/PropertyInterceptor.java delete mode 100644 proposal/sandbox/embed/README delete mode 100644 proposal/sandbox/embed/RuntimeConfigurable2.java delete mode 100644 proposal/sandbox/embed/SystemPath.java delete mode 100644 proposal/sandbox/embed/ant-sax2.jar delete mode 100644 proposal/sandbox/embed/build.xml delete mode 100644 proposal/sandbox/embed/org.apache.tools.ant.ProjectHelper diff --git a/proposal/sandbox/embed/Import.java b/proposal/sandbox/embed/Import.java deleted file mode 100644 index 833283693..000000000 --- a/proposal/sandbox/embed/Import.java +++ /dev/null @@ -1,182 +0,0 @@ -/* - * The Apache Software License, Version 1.1 - * - * Copyright (c) 2000-2002 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, if - * any, must include the following acknowlegement: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowlegement may appear in the software itself, - * if and wherever such third-party acknowlegements normally appear. - * - * 4. The names "The Jakarta Project", "Ant", and "Apache Software - * Foundation" must not be used to endorse or promote products derived - * from this software without prior written permission. For written - * permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache" - * nor may "Apache" appear in their names without prior written - * permission of the Apache Group. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - */ - -package org.apache.tools.ant.tasks; - -import org.apache.tools.ant.*; -import org.apache.tools.ant.helper.*; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.util.Hashtable; -import java.util.Vector; -import java.util.Enumeration; -import java.util.Locale; -import java.util.Stack; -import org.xml.sax.Locator; -import org.xml.sax.InputSource; -import org.xml.sax.SAXParseException; -import org.xml.sax.XMLReader; -import org.xml.sax.SAXException; -import org.xml.sax.DocumentHandler; -import org.xml.sax.Attributes; -import org.xml.sax.AttributeList; -import org.xml.sax.helpers.XMLReaderAdapter; -import org.xml.sax.helpers.DefaultHandler; -import org.xml.sax.helpers.AttributeListImpl; - -import org.apache.tools.ant.util.JAXPUtils; - -/** - * Import task. - * - * It must be 'top level'. On execution it'll read another file - * into the same Project. - * - * @author Nicola Ken Barozzi nicolaken@apache.org - * @author Dominique Devienne DDevienne@lgc.com - * @author Costin Manolache - */ -public class Import extends Task { - String file; - - public void setFile( String file ) { - // I don't think we can use File - different rules - // for relative paths. - this.file=file; - } - - /** - * Initialisation routine called after handler creation - * with the element name and attributes. The attributes which - * this handler can deal with are: "default", - * "name", "id" and "basedir". - * - * @param tag Name of the element which caused this handler - * to be created. Should not be null. - * Ignored in this implementation. - * @param attrs Attributes of the element which caused this - * handler to be created. Must not be null. - * - * @exception SAXParseException if an unexpected attribute is - * encountered or if the "default" attribute - * is missing. - */ - public void execute() throws BuildException - { - if (file == null) { - throw new BuildException("import element appears without a file attribute"); - } - - ProjectHelperImpl2.AntXmlContext context; - context=(ProjectHelperImpl2.AntXmlContext)project.getReference("ant.parsing.context"); - - context.importlevel++; - - project.log("importlevel: "+(context.importlevel-1)+" -> "+(context.importlevel), - Project.MSG_DEBUG); - project.log("Importing file "+file+" from "+ - context.buildFile.getAbsolutePath(), - Project.MSG_VERBOSE); - - // Paths are relative to the build file they're imported from, - // *not* the current directory (same as entity includes). - File importedFile = new File(file); - if (!importedFile.isAbsolute()) { - importedFile = new File(context.buildFileParent, file); - } - if (!importedFile.exists()) { - throw new BuildException("Cannot find "+file+" imported from "+ - context.buildFile.getAbsolutePath()); - } - - // Add parent build file to the map to avoid cycles... - String parentFilename = getPath(context.buildFile); - if (!context.importedFiles.containsKey(parentFilename)) { - context.importedFiles.put(parentFilename, context.buildFile); - } - - // Make sure we import the file only once - String importedFilename = getPath(importedFile); - if (context.importedFiles.containsKey(importedFilename)) { - project.log("\nSkipped already imported file:\n "+importedFilename+"\n", - Project.MSG_WARN); - context.importlevel--; - project.log("importlevel: "+context.importlevel+" <- "+ - (context.importlevel+1) ,Project.MSG_DEBUG); - return; - } else { - context.importedFiles.put(importedFilename, importedFile); - } - - context.ignoreProjectTag=true; - context.helper.parse(project, importedFile, new ProjectHelperImpl2.RootHandler(context)); - - context.importlevel--; - project.log("importlevel: "+context.importlevel+" <- "+ - (context.importlevel+1) ,Project.MSG_DEBUG); - } - - private static String getPath(File file) { - try { - return file.getCanonicalPath(); - } - catch (IOException e) { - return file.getAbsolutePath(); - } - } -} diff --git a/proposal/sandbox/embed/ProjectHelperImpl2.java b/proposal/sandbox/embed/ProjectHelperImpl2.java deleted file mode 100644 index bbc7ea58a..000000000 --- a/proposal/sandbox/embed/ProjectHelperImpl2.java +++ /dev/null @@ -1,1013 +0,0 @@ -/* - * The Apache Software License, Version 1.1 - * - * Copyright (c) 2000-2002 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, if - * any, must include the following acknowlegement: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowlegement may appear in the software itself, - * if and wherever such third-party acknowlegements normally appear. - * - * 4. The names "The Jakarta Project", "Ant", and "Apache Software - * Foundation" must not be used to endorse or promote products derived - * from this software without prior written permission. For written - * permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache" - * nor may "Apache" appear in their names without prior written - * permission of the Apache Group. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - */ - -package org.apache.tools.ant.helper; - -import org.apache.tools.ant.*; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.util.Hashtable; -import java.util.Vector; -import java.util.Enumeration; -import java.util.Locale; -import java.util.Stack; -import org.xml.sax.Locator; -import org.xml.sax.InputSource; -import org.xml.sax.SAXParseException; -import org.xml.sax.XMLReader; -import org.xml.sax.SAXException; -import org.xml.sax.DocumentHandler; -import org.xml.sax.Attributes; -import org.xml.sax.AttributeList; -import org.xml.sax.helpers.XMLReaderAdapter; -import org.xml.sax.helpers.DefaultHandler; -import org.xml.sax.helpers.AttributeListImpl; - -import org.apache.tools.ant.util.JAXPUtils; - -/** - * Sax2 based project reader - * - * @author duncan@x180.com - * @author Costin Manolache - */ -public class ProjectHelperImpl2 extends ProjectHelper { - /* Stateless */ - - // singletons - since all state is in the context - static AntHandler elementHandler=new ElementHandler(); - static AntHandler targetHandler=new TargetHandler(); - static AntHandler nestedElementHandler=new NestedElementHandler(); - static AntHandler mainHandler=new MainHandler(); - static AntHandler projectHandler=new ProjectHandler(); - - /** Method to add several 'special' tasks that are specific - * to this helper. In future we could use the properties file - */ - private void hookSpecialTasks(Project project) { - try { - Class c=Class.forName("org.apache.tools.ant.types.SystemPath"); - project.addDataTypeDefinition( "systemPath" , c ); - c=Class.forName("org.apache.tools.ant.tasks.Import"); - project.addTaskDefinition( "import" , c ); - } catch (Exception ex ) { - } - } - - - public void parse(Project project, Object source) throws BuildException { - hookSpecialTasks(project); - AntXmlContext context=new AntXmlContext(project, this); - - project.addReference( "ant.parsing.context", context ); - - parse(project, source,new RootHandler(context)); - - // XXX How to deal with description ?? - context.implicitTarget.execute(); - } - - /** - * Parses the project file, configuring the project as it goes. - * - * @exception BuildException if the configuration is invalid or cannot - * be read - */ - public void parse(Project project, Object source, RootHandler handler) throws BuildException { - - AntXmlContext context=handler.context; - - if(source instanceof File) { - context.buildFile=(File)source; -// } else if( source instanceof InputStream ) { -// } else if( source instanceof URL ) { -// } else if( source instanceof InputSource ) { - } else { - throw new BuildException( "Source " + source.getClass().getName() + - " not supported by this plugin" ); - } - - FileInputStream inputStream = null; - InputSource inputSource = null; - - context.buildFile = new File(context.buildFile.getAbsolutePath()); - context.buildFileParent = new File(context.buildFile.getParent()); - - try { - /** - * SAX 2 style parser used to parse the given file. - */ - context.parser =JAXPUtils.getXMLReader(); - - String uri = "file:" + context.buildFile.getAbsolutePath().replace('\\', '/'); - for (int index = uri.indexOf('#'); index != -1; index = uri.indexOf('#')) { - uri = uri.substring(0, index) + "%23" + uri.substring(index+1); - } - - inputStream = new FileInputStream(context.buildFile); - inputSource = new InputSource(inputStream); - inputSource.setSystemId(uri); - project.log("parsing buildfile " + context.buildFile + " with URI = " + uri, Project.MSG_VERBOSE); - - DefaultHandler hb = handler; - - context.parser.setContentHandler(hb); - context.parser.setEntityResolver(hb); - context.parser.setErrorHandler(hb); - context.parser.setDTDHandler(hb); - context.parser.parse(inputSource); - } catch(SAXParseException exc) { - Location location = - new Location(exc.getSystemId(), exc.getLineNumber(), exc.getColumnNumber()); - - Throwable t = exc.getException(); - if (t instanceof BuildException) { - BuildException be = (BuildException) t; - if (be.getLocation() == Location.UNKNOWN_LOCATION) { - be.setLocation(location); - } - throw be; - } - - throw new BuildException(exc.getMessage(), t, location); - } - catch(SAXException exc) { - Throwable t = exc.getException(); - if (t instanceof BuildException) { - throw (BuildException) t; - } - throw new BuildException(exc.getMessage(), t); - } - catch(FileNotFoundException exc) { - throw new BuildException(exc); - } - catch(UnsupportedEncodingException exc) { - throw new BuildException("Encoding of project file is invalid.",exc); - } - catch(IOException exc) { - throw new BuildException("Error reading project file: " +exc.getMessage(), exc); - } - finally { - if (inputStream != null) { - try { - inputStream.close(); - } - catch (IOException ioe) { - // ignore this - } - } - } - } - - /** - * The common superclass for all SAX event handlers used to parse - * the configuration file. - * - * The context will hold all state information. At each time - * there is one active handler for the current element. It can - * use onStartChild() to set an alternate handler for the child. - */ - public static class AntHandler { - /** - * Handles the start of an element. This base implementation does nothing. - * - * @param tag The name of the element being started. - * Will not be null. - * @param attrs Attributes of the element being started. - * Will not be null. - * - * @exception SAXParseException if this method is not overridden, or in - * case of error in an overridden version - */ - public void onStartElement(String uri, String tag, String qname, - Attributes attrs, - AntXmlContext context) - throws SAXParseException - { - } - - /** - * Handles the start of an element. This base implementation just - * throws an exception - you must override this method if you expect - * child elements. - * - * @param tag The name of the element being started. - * Will not be null. - * @param attrs Attributes of the element being started. - * Will not be null. - * - * @exception SAXParseException if this method is not overridden, or in - * case of error in an overridden version - */ - public AntHandler onStartChild(String uri, String tag, String qname, - Attributes attrs, - AntXmlContext context) - throws SAXParseException - { - throw new SAXParseException("Unexpected element \"" + qname + " \"", context.locator); - } - - public void onEndChild(String uri, String tag, String qname, - AntXmlContext context) - throws SAXParseException - { - } - - /** - * Called when this element and all elements nested into it have been - * handled (i.e. at the ). - */ - public void onEndElement(String uri, String tag, AntXmlContext context) { - } - - /** - * Handles text within an element. This base implementation just - * throws an exception, you must override it if you expect content. - * - * @param buf A character array of the text within the element. - * Will not be null. - * @param start The start element in the array. - * @param count The number of characters to read from the array. - * - * @exception SAXParseException if this method is not overridden, or in - * case of error in an overridden version - */ - public void characters(char[] buf, int start, int count, AntXmlContext context) - throws SAXParseException - { - String s = new String(buf, start, count).trim(); - - if (s.length() > 0) { - throw new SAXParseException("Unexpected text \"" + s + "\"", context.locator); - } - } - } - - /** Context information for the ant processing. - */ - public static class AntXmlContext { - /** The project to configure. */ - private Project project; - - /** The configuration file to parse. */ - public File buildFile; - - /** - * Parent directory of the build file. Used for resolving entities - * and setting the project's base directory. - */ - public File buildFileParent; - - /** Name of the current project */ - public String currentProjectName; - - /** - * Locator for the configuration file parser. - * Used for giving locations of errors etc. - */ - Locator locator; - - // Do we need those ? - public ProjectHelperImpl2 helper; - org.xml.sax.XMLReader parser; - - /** - * Target that all other targets will depend upon implicitly. - * - *

This holds all tasks and data type definitions that have - * been placed outside of targets.

- */ - Target implicitTarget = new Target(); - - /** Current target ( no need for a stack as the processing model - allows only one level of target ) */ - public Target currentTarget=null; - - /** The stack of RuntimeConfigurable2 wrapping the - objects. - */ - Vector wStack=new Vector(); - - // Import stuff - public boolean ignoreProjectTag=false; - public static Hashtable importedFiles = new Hashtable(); - public static int importlevel = 0; - - public AntXmlContext(Project project, ProjectHelperImpl2 helper) { - this.project=project; - implicitTarget.setName(""); - this.helper=helper; - } - - public Project getProject() { - return project; - } - - public RuntimeConfigurable2 currentWrapper() { - if( wStack.size() < 1 ) return null; - return (RuntimeConfigurable2)wStack.elementAt( wStack.size() - 1 ); - } - - public RuntimeConfigurable2 parentWrapper() { - if( wStack.size() < 2 ) return null; - return (RuntimeConfigurable2)wStack.elementAt( wStack.size() - 2 ); - } - - public void pushWrapper( RuntimeConfigurable2 wrapper ) { - wStack.addElement(wrapper); - } - - public void popWrapper() { - if( wStack.size() > 0 ) - wStack.removeElementAt( wStack.size() - 1 ); - } - - public Vector getWrapperStack() { - return wStack; - } - - /** - * Scans an attribute list for the id attribute and - * stores a reference to the target object in the project if an - * id is found. - *

- * This method was moved out of the configure method to allow - * it to be executed at parse time. - * - * @see #configure(Object,AttributeList,Project) - */ - void configureId(Object element, Attributes attr) { - String id = attr.getValue("id"); - if (id != null) { - project.addReference(id, element); - } - } - - } - - /** - * Handler for ant processing. Uses a stack of AntHandlers to - * implement each element ( the original parser used a recursive behavior, - * with the implicit execution stack ) - */ - public static class RootHandler extends DefaultHandler { - Stack antHandlers=new Stack(); - AntHandler currentHandler=null; - AntXmlContext context; - - public RootHandler(AntXmlContext context) { - currentHandler=ProjectHelperImpl2.mainHandler; - antHandlers.push( currentHandler ); - this.context=context; - } - - /** - * Resolves file: URIs relative to the build file. - * - * @param publicId The public identifer, or null - * if none is available. Ignored in this - * implementation. - * @param systemId The system identifier provided in the XML - * document. Will not be null. - */ - public InputSource resolveEntity(String publicId, - String systemId) { - - context.getProject().log("resolving systemId: " + systemId, Project.MSG_VERBOSE); - - if (systemId.startsWith("file:")) { - String path = systemId.substring(5); - int index = path.indexOf("file:"); - - // we only have to handle these for backward compatibility - // since they are in the FAQ. - while (index != -1) { - path = path.substring(0, index) + path.substring(index + 5); - index = path.indexOf("file:"); - } - - String entitySystemId = path; - index = path.indexOf("%23"); - // convert these to # - while (index != -1) { - path = path.substring(0, index) + "#" + path.substring(index + 3); - index = path.indexOf("%23"); - } - - File file = new File(path); - if (!file.isAbsolute()) { - file = new File(context.buildFileParent, path); - } - - try { - InputSource inputSource = new InputSource(new FileInputStream(file)); - inputSource.setSystemId("file:" + entitySystemId); - return inputSource; - } catch (FileNotFoundException fne) { - context.getProject().log(file.getAbsolutePath()+" could not be found", - Project.MSG_WARN); - } - } - // use default if not file or file not found - return null; - } - - /** - * Handles the start of a project element. A project handler is created - * and initialised with the element name and attributes. - * - * @param tag The name of the element being started. - * Will not be null. - * @param attrs Attributes of the element being started. - * Will not be null. - * - * @exception SAXParseException if the tag given is not - * "project" - */ - public void startElement(String uri, String tag, String qname, Attributes attrs) - throws SAXParseException - { - AntHandler next=currentHandler.onStartChild(uri, tag, qname, attrs, context); - antHandlers.push( currentHandler ); - currentHandler=next; - currentHandler.onStartElement( uri, tag, qname, attrs, context ); - } - - /** - * Sets the locator in the project helper for future reference. - * - * @param locator The locator used by the parser. - * Will not be null. - */ - public void setDocumentLocator(Locator locator) { - context.locator = locator; - } - - /** - * Handles the end of an element. Any required clean-up is performed - * by the onEndElement() method and then the original handler is restored to - * the parser. - * - * @param name The name of the element which is ending. - * Will not be null. - * - * @exception SAXException in case of error (not thrown in - * this implementation) - * - */ - public void endElement(String uri, String name, String qName) throws SAXException { - currentHandler.onEndElement(uri, name, context); - AntHandler prev=(AntHandler)antHandlers.pop(); - currentHandler=prev; - if( currentHandler!=null ) - currentHandler.onEndChild( uri, name, qName, context ); - } - - public void characters(char[] buf, int start, int count) - throws SAXParseException - { - currentHandler.characters( buf, start, count, context ); - } - } - - public static class MainHandler extends AntHandler { - - public AntHandler onStartChild(String uri, String name, String qname, - Attributes attrs, - AntXmlContext context) - throws SAXParseException - { - if (qname.equals("project")) { - return ProjectHelperImpl2.projectHandler; - } else { - throw new SAXParseException("Unexpected element \"" + qname + "\" " + name, context.locator); - } - } - } - - /** - * Handler for the top level "project" element. - */ - public static class ProjectHandler extends AntHandler { - - /** - * Initialisation routine called after handler creation - * with the element name and attributes. The attributes which - * this handler can deal with are: "default", - * "name", "id" and "basedir". - * - * @param tag Name of the element which caused this handler - * to be created. Should not be null. - * Ignored in this implementation. - * @param attrs Attributes of the element which caused this - * handler to be created. Must not be null. - * - * @exception SAXParseException if an unexpected attribute is - * encountered or if the "default" attribute - * is missing. - */ - public void onStartElement(String uri, String tag, String qname, - Attributes attrs, - AntXmlContext context) - throws SAXParseException - { - String id = null; - String baseDir = null; - - Project project=context.getProject(); - - for (int i = 0; i < attrs.getLength(); i++) { - String key = attrs.getQName(i); - String value = attrs.getValue(i); - - if (key.equals("default")) { - if ( value != null && !value.equals("")) { - if( !context.ignoreProjectTag ) - project.setDefaultTarget(value); - } - } else if (key.equals("name")) { - if (value != null) { - context.currentProjectName=value; - - if( !context.ignoreProjectTag ) { - project.setName(value); - project.addReference(value, project); - } - } - } else if (key.equals("id")) { - if (value != null) { - // What's the difference between id and name ? - if( !context.ignoreProjectTag ) { - project.addReference(value, project); - } - } - } else if (key.equals("basedir")) { - if( !context.ignoreProjectTag ) - baseDir = value; - } else { - // XXX ignore attributes in a different NS ( maybe store them ? ) - throw new SAXParseException("Unexpected attribute \"" + attrs.getQName(i) + "\"", context.locator); - } - } - - if( context.ignoreProjectTag ) { - // no further processing - return; - } - // set explicitely before starting ? - if (project.getProperty("basedir") != null) { - project.setBasedir(project.getProperty("basedir")); - } else { - // Default for baseDir is the location of the build file. - if (baseDir == null) { - project.setBasedir(context.buildFileParent.getAbsolutePath()); - } else { - // check whether the user has specified an absolute path - if ((new File(baseDir)).isAbsolute()) { - project.setBasedir(baseDir); - } else { - project.setBaseDir(project.resolveFile(baseDir, - context.buildFileParent)); - } - } - } - - project.addTarget("", context.implicitTarget); - context.currentTarget=context.implicitTarget; - } - - /** - * Handles the start of a top-level element within the project. An - * appropriate handler is created and initialised with the details - * of the element. - * - * @param tag The name of the element being started. - * Will not be null. - * @param attrs Attributes of the element being started. - * Will not be null. - * - * @exception SAXParseException if the tag given is not - * "taskdef", "typedef", - * "property", "target" - * or a data type definition - */ - public AntHandler onStartChild(String uri, String name, String qname, - Attributes attrs, - AntXmlContext context) - throws SAXParseException - { - if (qname.equals("target")) { - return ProjectHelperImpl2.targetHandler; - } else { - return ProjectHelperImpl2.elementHandler; - } - } - - } - - /** - * Handler for "target" elements. - */ - public static class TargetHandler extends AntHandler { - - /** - * Initialisation routine called after handler creation - * with the element name and attributes. The attributes which - * this handler can deal with are: "name", - * "depends", "if", - * "unless", "id" and - * "description". - * - * @param tag Name of the element which caused this handler - * to be created. Should not be null. - * Ignored in this implementation. - * @param attrs Attributes of the element which caused this - * handler to be created. Must not be null. - * - * @exception SAXParseException if an unexpected attribute is encountered - * or if the "name" attribute is missing. - */ - public void onStartElement(String uri, String tag, String qname, - Attributes attrs, - AntXmlContext context) - throws SAXParseException - { - String name = null; - String depends = ""; - - Project project=context.getProject(); - Target target = new Target(); - context.currentTarget=target; - - for (int i = 0; i < attrs.getLength(); i++) { - String key = attrs.getQName(i); - String value = attrs.getValue(i); - - if (key.equals("name")) { - name = value; - if( "".equals( name ) ) - throw new BuildException("name attribute must not be empty"); - } else if (key.equals("depends")) { - depends = value; - } else if (key.equals("if")) { - target.setIf(value); - } else if (key.equals("unless")) { - target.setUnless(value); - } else if (key.equals("id")) { - if (value != null && !value.equals("")) { - context.getProject().addReference(value, target); - } - } else if (key.equals("description")) { - target.setDescription(value); - } else { - throw new SAXParseException("Unexpected attribute \"" + key + "\"", context.locator); - } - } - - if (name == null) { - throw new SAXParseException("target element appears without a name attribute", - context.locator); - } - - Hashtable currentTargets = project.getTargets(); - - // If the name has already beend defined ( import for example ) - if(currentTargets.containsKey(name)) { - // Alter the name. - if( context.currentProjectName != null ) { - String newName=context.currentProjectName + "." + name; - project.log("Already defined in main or a previous import, define " - + name + " as " + newName, - Project.MSG_VERBOSE); - name=newName; - } else { - project.log("Already defined in main or a previous import, ignore " - + name, - Project.MSG_VERBOSE); - name=null; - } - } - - if( name != null ) { - target.setName(name); - project.addOrReplaceTarget(name, target); - } - - - project.log("Targets are now: "+ currentTargets , - Project.MSG_VERBOSE); - - // take care of dependencies - if (depends.length() > 0) { - target.setDepends(depends); - } - } - - /** - * Handles the start of an element within a target. - * - * @param tag The name of the element being started. - * Will not be null. - * @param attrs Attributes of the element being started. - * Will not be null. - * - * @exception SAXParseException if an error occurs when initialising - * the appropriate child handler - */ - public AntHandler onStartChild(String uri, String name, String qname, - Attributes attrs, - AntXmlContext context) - throws SAXParseException - { - return ProjectHelperImpl2.elementHandler; - } - public void onEndElement(String uri, String tag, AntXmlContext context) { - context.currentTarget=context.implicitTarget; - } - } - - /** - * Handler for all project elements ( tasks, data types ) - */ - public static class ElementHandler extends AntHandler { - - /** - * Constructor. - */ - public ElementHandler() { - } - - /** - * Initialisation routine called after handler creation - * with the element name and attributes. This configures - * the element with its attributes and sets it up with - * its parent container (if any). Nested elements are then - * added later as the parser encounters them. - * - * @param tag Name of the element which caused this handler - * to be created. Must not be null. - * - * @param attrs Attributes of the element which caused this - * handler to be created. Must not be null. - * - * @exception SAXParseException in case of error (not thrown in - * this implementation) - */ - public void onStartElement(String uri, String tag, String qname, - Attributes attrs, - AntXmlContext context) - throws SAXParseException - { - RuntimeConfigurable2 parentWrapper=context.currentWrapper(); - RuntimeConfigurable2 wrapper=null; - - if (context.getProject().getDataTypeDefinitions().get(qname) != null) { - try { - Object element = context.getProject().createDataType(qname); - if (element == null) { - // can it happen ? We just checked that the type exists - throw new BuildException("Unknown data type "+qname); - } - - wrapper = new RuntimeConfigurable2(element, qname); - wrapper.setAttributes2(attrs); - context.currentTarget.addDataType(wrapper); - } catch (BuildException exc) { - throw new SAXParseException(exc.getMessage(), context.locator, exc); - } - } else { - Task task=null; - try { - task = context.getProject().createTask(qname); - } catch (BuildException e) { - // swallow here, will be thrown again in - // UnknownElement.maybeConfigure if the problem persists. - } - - if (task == null) { - task = new UnknownElement(qname); - task.setProject(context.getProject()); - //XXX task.setTaskType(qname); - task.setTaskName(qname); - } - - task.setLocation(new Location(context.locator.getSystemId(), - context.locator.getLineNumber(), - context.locator.getColumnNumber())); - context.configureId(task, attrs); - - task.setOwningTarget(context.currentTarget); - - Object parent=null; - if( parentWrapper!=null ) { - parent=parentWrapper.getProxy(); - } - - if( parent instanceof TaskContainer ) { - // Task included in a TaskContainer - ((TaskContainer)parent).addTask( task ); - } else { - // Task included in a target ( including the default one ). - context.currentTarget.addTask( task ); - } - // container.addTask(task); - task.init(); - - wrapper=new RuntimeConfigurable2(task, task.getTaskName()); - wrapper.setAttributes2(attrs); - - if (parentWrapper != null) { - parentWrapper.addChild(wrapper); - } - } - - context.pushWrapper( wrapper ); - } - - - /** - * Adds text to the task, using the wrapper - * - * @param buf A character array of the text within the element. - * Will not be null. - * @param start The start element in the array. - * @param count The number of characters to read from the array. - * - * @exception SAXParseException if the element doesn't support text - * - * @see ProjectHelper#addText(Project,Object,char[],int,int) - */ - public void characters(char[] buf, int start, int count, - AntXmlContext context) - throws SAXParseException - { - RuntimeConfigurable2 wrapper=context.currentWrapper(); - wrapper.addText(buf, start, count); - } - - /** - * Handles the start of an element within a target. Task containers - * will always use another task handler, and all other tasks - * will always use a nested element handler. - * - * @param tag The name of the element being started. - * Will not be null. - * @param attrs Attributes of the element being started. - * Will not be null. - * - * @exception SAXParseException if an error occurs when initialising - * the appropriate child handler - */ - public AntHandler onStartChild(String uri, String tag, String qname, - Attributes attrs, - AntXmlContext context) - throws SAXParseException - { - // this element - RuntimeConfigurable2 wrapper=context.currentWrapper(); - - Object element=wrapper.getProxy(); - if (element instanceof TaskContainer) { - // task can contain other tasks - no other nested elements possible - return ProjectHelperImpl2.elementHandler; - } - else { - return ProjectHelperImpl2.nestedElementHandler; - } - } - - public void onEndElement(String uri, String tag, AntXmlContext context) { - context.popWrapper(); - } - - public void onEndChild(String uri, String tag, String qname, - AntXmlContext context) - throws SAXParseException - { - } - } - - /** - * Handler for all nested properties. Same as ElementHandler, except that - * it doesn't deal with DataTypes and doesn't support TaskContainer. - * - * This is the original behavior - I just made few changes to avoid duplicated - * code. - */ - public static class NestedElementHandler extends ElementHandler { - /** - * Constructor. - */ - public NestedElementHandler() { - } - - /** - * Initialisation routine called after handler creation - * with the element name and attributes. This configures - * the element with its attributes and sets it up with - * its parent container (if any). Nested elements are then - * added later as the parser encounters them. - * - * @param tag Name of the element which caused this handler - * to be created. Must not be null. - * - * @param attrs Attributes of the element which caused this - * handler to be created. Must not be null. - * - * @exception SAXParseException in case of error, such as a - * BuildException being thrown during configuration. - */ - public void onStartElement(String uri, String propType, String qname, - Attributes attrs, - AntXmlContext context) - throws SAXParseException - { - RuntimeConfigurable2 parentWrapper=context.currentWrapper(); - RuntimeConfigurable2 wrapper=null; - try { - Object element; - Object parent=parentWrapper.getProxy(); - if (parent instanceof TaskAdapter) { - parent = ((TaskAdapter) parent).getProxy(); - } - - String elementName = qname.toLowerCase(Locale.US); - if (parent instanceof UnknownElement) { - UnknownElement uc = new UnknownElement(elementName); - uc.setProject(context.getProject()); - ((UnknownElement) parent).addChild(uc); - element = uc; - } else { - Class parentClass = parent.getClass(); - IntrospectionHelper ih = - IntrospectionHelper.getHelper(parentClass); - element = ih.createElement(context.getProject(), parent, elementName); - } - - context.configureId(element, attrs); - - wrapper = new RuntimeConfigurable2(element, qname); - wrapper.setAttributes2(attrs); - parentWrapper.addChild(wrapper); - } catch (BuildException exc) { - throw new SAXParseException(exc.getMessage(), context.locator, exc); - } - context.pushWrapper( wrapper ); - } - } -} diff --git a/proposal/sandbox/embed/PropertyHelper.java b/proposal/sandbox/embed/PropertyHelper.java deleted file mode 100644 index 47d0e7f46..000000000 --- a/proposal/sandbox/embed/PropertyHelper.java +++ /dev/null @@ -1,219 +0,0 @@ -/* - * The Apache Software License, Version 1.1 - * - * Copyright (c) 2000-2002 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, if - * any, must include the following acknowlegement: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowlegement may appear in the software itself, - * if and wherever such third-party acknowlegements normally appear. - * - * 4. The names "The Jakarta Project", "Ant", and "Apache Software - * Foundation" must not be used to endorse or promote products derived - * from this software without prior written permission. For written - * permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache" - * nor may "Apache" appear in their names without prior written - * permission of the Apache Group. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - */ - -package org.apache.tools.ant; - -import org.apache.tools.ant.helper.*; -import java.util.Enumeration; -import java.util.Locale; -import java.util.Vector; -import java.util.Hashtable; -import org.xml.sax.AttributeList; -import org.xml.sax.Attributes; -import org.xml.sax.helpers.AttributeListImpl; -import org.xml.sax.helpers.AttributesImpl; - -/** - * Deals with properties - substitution, dynamic properties, etc. - * - * Eventually the static methods from ProjectHelper should be - * moved here ( with a wrapper for backward compat ). - * - * Also the property store ( Hashtable ) and all property manipulation - * logic could be moved here. - * - * @author Stefan Bodewig - * @author Costin Manolache - */ -public class PropertyHelper { - Project project; - Vector propertyInterceptors=new Vector(); - - protected PropertyHelper() { - } - - public void setProject(Project p ) { - this.project=p; - } - - /** Factory method to create a property processor. - * Right now returns the singleton instance of PropertyHelper, - * in future it may use discovery of config to return a - * customized version, for integration in other apps. - */ - public static PropertyHelper getPropertyHelper(Project project) { - PropertyHelper ph=(PropertyHelper)project.getReference( "ant.PropertyHelper" ); - if( ph!=null ) return ph; - ph=new PropertyHelper(); - ph.setProject( project ); - - project.addReference( "ant.PropertyHelper",ph ); - return ph; - } - - public void addPropertyInterceptor( PropertyInterceptor pi ) { - propertyInterceptors.addElement( pi ); - } - -// public Vector getPropertyInterceptors() { -// return propertyInterceptors; -// } - - /** Process an value, doing the replacements. - */ - public String replaceProperties( String value ) { - if (value == null) { - return null; - } - - Vector fragments = new Vector(); - Vector propertyRefs = new Vector(); - - // XXX Move the static method here - if this is accepted in the main - // branch. - ProjectHelper.parsePropertyString(value, fragments, propertyRefs); - - StringBuffer sb = new StringBuffer(); - Enumeration i = fragments.elements(); - Enumeration j = propertyRefs.elements(); - while (i.hasMoreElements()) { - - String fragment = (String) i.nextElement(); - if (fragment == null) { - String propertyName = (String) j.nextElement(); - - Object repl=processDynamic( project, propertyName); - - if( repl==null) { - // default to the static property. - repl=project.getProperty( propertyName ); - } - - if (repl==null ) { - project.log("Property ${" + propertyName - + "} has not been set", Project.MSG_VERBOSE); - fragment="${" + propertyName + "}"; - } else { - fragment = (String) repl; - } - } - sb.append(fragment); - } - - return sb.toString(); - } - - /** Use the reference table to generate values for ${} substitution. - * To preserve backward compat ( as much as possible ) we'll only process - * ids with a 'namespace-like' syntax. - * - * Currently we support: - * dom:idName:/xpath/like/syntax - the referenced node must be a DOM, we'll use - * XPath to extract a node. ( a simplified syntax is handled - * directly, XXX used for 'real' xpaths ). - * toString:idName - we use toString on the referenced object - * bean:idName.propertyName - we get the idName and call the getter for the property. - */ - Object processDynamic( Project project, String name ) { - for(int i=0; i. - */ - -package org.apache.tools.ant; - -import org.apache.tools.ant.helper.*; -import java.util.Enumeration; -import java.util.Locale; -import java.util.Vector; -import java.util.Hashtable; -import org.xml.sax.AttributeList; -import org.xml.sax.Attributes; -import org.xml.sax.helpers.AttributeListImpl; -import org.xml.sax.helpers.AttributesImpl; - -/** - * The new XML processor will use this interface to support - * dynamic properties. - * - * Any task/type that implements this interface will be registered - * and will receive notification of each property get operations - * executed by the processor. - * - * XXX In ant1.6+, tasks implementing the interface will also - * receive notification when a property is set. - * - * @author Costin Manolache - */ -public interface PropertyInterceptor { - - /** - * Called for each ${} property. If the result is null the - * next PropertyInterceptor will be called. If all interceptors - * return null, the properties stored in Project are used. - */ - public Object getProperty( Project p, String ns, String name ); - - /** - * Called when a property/reference is recorded. - * XXX Not implemented yet. - */ - // public boolean setProperty( String ns, String name, Object value ); - -} diff --git a/proposal/sandbox/embed/README b/proposal/sandbox/embed/README deleted file mode 100644 index 1b9f95f99..000000000 --- a/proposal/sandbox/embed/README +++ /dev/null @@ -1,28 +0,0 @@ -Features - -- SAX2 support -- namespaces ( not used - pending decision on semantics of ns ) -- import ( with package.target, not super.target ) -- classloader hack for optional -- dynamic properties ( only interface + hooks, no real binding ) - - -Todo - -- start the JMX support, MBeans for Project, Target and Tasks ( using the dynamic -mbean tool in tomcat ). - -- add JmxTaskAdapter that will wrap mbeans ( similar with the Beans wrapped by task adapter ) - -- add support for Jmx attributes as dynamic properties. - - -Build - -The build.xml file will copy the files in the main tree and compile -a package - ant-sax2.jar. - -Install - -Copy ant-sax2.jar to jakarta-ant-1.5/lib. - diff --git a/proposal/sandbox/embed/RuntimeConfigurable2.java b/proposal/sandbox/embed/RuntimeConfigurable2.java deleted file mode 100644 index 648883f1e..000000000 --- a/proposal/sandbox/embed/RuntimeConfigurable2.java +++ /dev/null @@ -1,270 +0,0 @@ -/* - * The Apache Software License, Version 1.1 - * - * Copyright (c) 2000-2002 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, if - * any, must include the following acknowlegement: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowlegement may appear in the software itself, - * if and wherever such third-party acknowlegements normally appear. - * - * 4. The names "The Jakarta Project", "Ant", and "Apache Software - * Foundation" must not be used to endorse or promote products derived - * from this software without prior written permission. For written - * permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache" - * nor may "Apache" appear in their names without prior written - * permission of the Apache Group. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - */ - -package org.apache.tools.ant; - -import org.apache.tools.ant.helper.*; -import java.util.Enumeration; -import java.util.Locale; -import java.util.Vector; -import java.util.Hashtable; -import org.xml.sax.AttributeList; -import org.xml.sax.Attributes; -import org.xml.sax.helpers.AttributeListImpl; -import org.xml.sax.helpers.AttributesImpl; - -/** - * Wrapper class that holds the attributes of an element, its children, and - * any text within it. It then takes care of configuring that element at - * runtime. - * - * This uses SAX2 and a more flexible substitution mechansim, based on - * o.a.tomcat.util.IntrospectionUtil. - * - * @author Stefan Bodewig - * @author Costin Manolache - */ -public class RuntimeConfigurable2 extends RuntimeConfigurable { - - /** Name of the element to configure. */ - private String elementTag = null; - /** List of child element wrappers. */ - private Vector children = new Vector(); - /** The element to configure. */ - private Object wrappedObject = null; - /** XML attributes for the element. */ - private Attributes attributes; - /** Text appearing within the element. */ - private StringBuffer characters = new StringBuffer(); - - /** - * Sole constructor creating a wrapper for the specified object. - * - * @param proxy The element to configure. Must not be null. - * @param elementTag The tag name generating this element. - * Should not be null. - */ - public RuntimeConfigurable2(Object proxy, String elementTag) { - super( proxy, elementTag ); - wrappedObject = proxy; - this.elementTag = elementTag; - if( proxy instanceof Task ) - ((Task)proxy).setRuntimeConfigurableWrapper( this ); - } - - /** - * Sets the element to configure. This is used when the real type of - * an element isn't known at the time of wrapper creation. - * - * @param proxy The element to configure. Must not be null. - */ - public void setProxy(Object proxy) { - wrappedObject = proxy; - } - - public Object getProxy() { - return wrappedObject; - } - - /** - * Sets the attributes for the wrapped element. - * - * @param attributes List of attributes defined in the XML for this - * element. May be null. - * @deprecated It shouldn't be called by anyone except ProjectHelper - */ - public void setAttributes(AttributeList attributes) { - // this.attributes = new AttributeListImpl(attributes); - } - - public void setAttributes2(Attributes attributes) { - this.attributes=new AttributesImpl( attributes ); - } - - /** - * Returns the list of attributes for the wrapped element. - * - * @return An AttributeList representing the attributes defined in the - * XML for this element. May be null. - * @deprecated only for bkwd compatibility - */ - public AttributeList getAttributes() { - return sax1Attributes( attributes ); - } - - public Attributes getAttributes2() { - return attributes; - } - - public static AttributeList sax1Attributes( Attributes sax2Att ) { - AttributeListImpl sax1Att=new AttributeListImpl(); - int length = sax2Att.getLength(); - if (length > 0) { - for (int i = 0; i < length; i++) { - // System.out.println("Attributes: " + sax2Att.getQName(i) + " " + - // sax2Att.getValue(i)); - sax1Att.addAttribute( sax2Att.getQName(i), - sax2Att.getType(i), - sax2Att.getValue(i)); - } - } - return sax1Att; - } - - /** - * Adds a child element to the wrapped element. - * - * @param child The child element wrapper to add to this one. - * Must not be null. - */ - public void addChild(RuntimeConfigurable child) { - children.addElement(child); - } - - /** - * Returns the child wrapper at the specified position within the list. - * - * @param index The index of the child to return. - * - * @return The child wrapper at position index within the - * list. - */ - public RuntimeConfigurable getChild(int index) { - return (RuntimeConfigurable) children.elementAt(index); - } - - /** - * Adds characters from #PCDATA areas to the wrapped element. - * - * @param data Text to add to the wrapped element. - * Should not be null. - */ - public void addText(String data) { - characters.append(data); - } - - /** - * Adds characters from #PCDATA areas to the wrapped element. - * - * @param buf A character array of the text within the element. - * Must not be null. - * @param start The start element in the array. - * @param count The number of characters to read from the array. - * - */ - public void addText(char[] buf, int start, int count) { - addText(new String(buf, start, count)); - } - - /** - * Returns the tag name of the wrapped element. - * - * @return The tag name of the wrapped element. This is unlikely - * to be null, but may be. - */ - public String getElementTag() { - return elementTag; - } - - /** - * Configures the wrapped element and all its children. - * The attributes and text for the wrapped element are configured, - * and then each child is configured and added. Each time the - * wrapper is configured, the attributes and text for it are - * reset. - * - * If the element has an id attribute, a reference - * is added to the project as well. - * - * @param p The project containing the wrapped element. - * Must not be null. - * - * @exception BuildException if the configuration fails, for instance due - * to invalid attributes or children, or text being added to - * an element which doesn't accept it. - */ - public void maybeConfigure(Project p) throws BuildException { - String id = null; - - if (attributes != null) { - PropertyHelper ph=PropertyHelper.getPropertyHelper(p); - ph.configure(wrappedObject, attributes, p); - id = attributes.getValue("id"); - attributes = null; - } - - if (characters.length() != 0) { - ProjectHelper.addText(p, wrappedObject, characters.toString()); - characters.setLength(0); - } - Enumeration enum = children.elements(); - while (enum.hasMoreElements()) { - RuntimeConfigurable2 child - = (RuntimeConfigurable2) enum.nextElement(); - if (child.wrappedObject instanceof Task) { - Task childTask = (Task) child.wrappedObject; - childTask.setRuntimeConfigurableWrapper(child); - childTask.maybeConfigure(); - } else { - child.maybeConfigure(p); - } - ProjectHelper.storeChild(p, wrappedObject, child.wrappedObject, - child.getElementTag().toLowerCase(Locale.US)); - } - - if (id != null) { - p.addReference(id, wrappedObject); - } - } -} diff --git a/proposal/sandbox/embed/SystemPath.java b/proposal/sandbox/embed/SystemPath.java deleted file mode 100644 index 0426f48a6..000000000 --- a/proposal/sandbox/embed/SystemPath.java +++ /dev/null @@ -1,191 +0,0 @@ -/* - * The Apache Software License, Version 1.1 - * - * Copyright (c) 2000-2002 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, if - * any, must include the following acknowlegement: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowlegement may appear in the software itself, - * if and wherever such third-party acknowlegements normally appear. - * - * 4. The names "The Jakarta Project", "Ant", and "Apache Software - * Foundation" must not be used to endorse or promote products derived - * from this software without prior written permission. For written - * permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache" - * nor may "Apache" appear in their names without prior written - * permission of the Apache Group. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - */ - -package org.apache.tools.ant.types; - -import org.apache.tools.ant.*; - -import java.io.*; -import java.util.*; -import org.xml.sax.Locator; -import org.xml.sax.InputSource; -//import org.xml.sax.HandlerBase; -import org.xml.sax.SAXParseException; -import org.xml.sax.XMLReader; -import org.xml.sax.SAXException; -import org.xml.sax.DocumentHandler; -import org.xml.sax.Attributes; -import org.xml.sax.AttributeList; -import org.xml.sax.helpers.XMLReaderAdapter; -import org.xml.sax.helpers.DefaultHandler; -import org.xml.sax.helpers.AttributeListImpl; - -import javax.xml.parsers.SAXParserFactory; -import javax.xml.parsers.SAXParser; -import javax.xml.parsers.ParserConfigurationException; - -/** - * Specify a system path, to be used to load optional.jar and all - * related libraries. - * - * Using the specified path it'll try to load or reload all optional - * tasks. The typical use is: - *

- *  <path id="ant.deps" >
- *     <fileset ... />
- *  </path>
- *
- *  <systemPath pathRef="ant.deps" />
- *
- *  <junit ... />
- * 
- * - * This requires that ant-sax2.jar is included in ant/lib. - * - * It has a single property, a reference to a <path> containing all - * the jars that you need. It'll automatically reload optional.jar - * tasks in a different (non-delegating) loader. - * - * @author Costin Manolache - */ -public class SystemPath extends DataType { - public static final String SYSTEM_LOADER_REF="ant.system.loader"; - - public SystemPath() { - } - - /** Specify which path will be used. - */ - public void setPathRef( Reference pathRef ) throws BuildException { - Path path=(Path)pathRef.getReferencedObject(project); - - initSystemLoader(path); - - } - - /** Will prepare the class loader to allow dynamic modifications - * of the classpath. Optional tasks are loaded in a different loader. - */ - private void initSystemLoader(Path path) { - try { - if( project.getReference( SYSTEM_LOADER_REF ) != null ) - return; // already done that. - - // reverse loader - AntClassLoader acl=new AntClassLoader( this.getClass().getClassLoader(), true ); - acl.addLoaderPackageRoot( "org.apache.tools.ant.taskdefs.optional"); - project.addReference( SYSTEM_LOADER_REF, acl ); - - - String list[]=path.list(); - for( int i=0; ic+qP}HUfH(U5j z$V!NcC@Is)h(5?nO-f7A(gEP4XsKqVW*Ze57MXXC9O)!wXe49+E)`9R_B7(sGvX@t zQ`Eo{>GzIzj=(_jQV@_r%}JGPe|ly8bNn^#->0W;a{e#VL;mM+olG2EEsRW@{x;9Q z;{&xe{{;{B2XE(S_8$;1|3Dbn8yK0J{1Y(j-?~EjSD>? z>vyl!dSVGV?ZtBR80Ok?eTx+eZA2QA*@~-mny$5#R4A8h;sTpZ0*a%oXeX64mMt{s z5R7%$Se%M*=~DVY#Re)~1V+~$oXgk8xf*}q@8_(dm8Ol*tcRW(kL%gr9y#o_y*^(c z5pzHNsMU$A60D&n6L(_RFO##colI(%JC?&<@9V}MD{!;oIR7KSp#ZQi; zbuDIjrLEPU`fZKv&DHPvZX3G(6Srlq;xHr4hxT=&lA{TOGPZ3JQoz6q%gA9kn#yu8 z?pjer7I#9q=(F-Uql>f_f~|Zc@>(dm!;lH57Q9%1Ow0GNRW^Kpl4{gGYErH7SB^9d zes&?MeKV$lWi{kzf~Oc6V_B(JbAKD14+D{Amz>n-;WnRgJ^TfDlJYv{5^+l3@xZbR z=T4@i03#LKzNf#-U& zqw0OK7x0=$Qlk{m0DC&_rAo3N_e{U=-`dmjr5&j2jw*0Tnnevu`eK&EPXMbVMmeEF z(<>p6Xw79P@)#l6Q>>Hm8Vn;(WeRiO>nxfdDIjaW8jp*XkXNJ^!V4pw^A!4Ij4qW1 z@=fzK-{UlQBHgIn2~g@6iO_CFZ9tAZfL|Y9QX(Dr6x1PGsq{~&QV`2lgAt&UHt8Ct zhv8VM!#KV(6CLnoQ?i4dO;~ zR!sb)H3fSfF*dmotc1WjRRjd;ii#1GqLNjVmHhhoF;`tc;KrCCE%1p`{W#eY#dq2?uw;_qS7AmX= z78;5hC9jQ)Hr|+%=^}B#PgPs>Hyb%qb8#Xk3{e|;tU-ezWs<%c^@3tWPbMmPKN(M4 z4H-qj&1kQ+)4;n`eFlVxzA{mf64=}gCR}uh$w8sESl)!1CuE80x45CA%Uuwh2ZL$# zdUyL=(-`#zhz&ZEO^&H!ESgOy$28dce3ShYEOAbQ$TM8nT;qY`Vb^J&JAFmZ-#{^k zUdP~wC^`P2qPyo4x8Tb(;M|)ZHQ6gV> zSVZkU7Uu~qtxftTqlOST4(P=-B~SJKg}ZE?@;8bVo>o2Zq*qt$zDBAZe~iOnVr-qL zx&hKA>97UOoKoNPmaMPl$uU&#NMif1rop<|a@*Q?3DJ#t3*xJhR`8Y<%yjp~To%W? zIY<}{i>M}kB8?B$1}4bJn+eA|#PF*Qi-thYTcVkcJD-x$Wq#u#Jlt}QP=W^EgAoR+ zuAgG>*>@kH17uj?@b&R8gOwW+W;2PF;gNVDM{$R>vbG;#*r{!aPX6vOB*it=QpC;D zu+2IXLaSt%?*;p%$X95TZvx6rF^?t9kO%fi{7CABu_$bNAl}x6B1T+Z#&?7sh01qQ zYjf11ER9>@7o6&u$bG%vqiGOJoQ2xtmGa71>kqSXNL3{0U5Ik3ErT-@Z$pEZ*4lU1 zHBgx!MI5;?)@nuegFN;!XZ9<>%U96SoVpm}T?s}Z?hXGo#6X$!U3{>LdeFhAds&eqQPGrPf^{x*d$9{&#`~FkdF>;syV)LI*~b)YjP7H* zPq7AWYHX;_HBArVz4RVq?g^T=#x8OWbaH$FO{5axQmJHbk1I5(lKA5LB8_Zlmtt=1 z)XDVz6zW@hYKdwOOW@5|1!NO5uk~XJ6J!*R&~BSIGl&D7WJ;8>Bz-j>4v04 z9?5YwlMmdDd+`07MKTESVpz1xyw~jj?H$jAGZzVqF=l6wIwrzs6SU&f703ad`!#F# zhCzT)f?_KchqJ785AydCUzjLvvtR2TVUt5f%K_$F8^P`kKKwXiR-Xe;#3(1S+&)y+ zNFvAJ5>}RBq7U{7XDr=5R!g|q9XEU?yTly=Pb@Vq-tS?U7Xr$iktD=<$6v3CT_oNd z)ESJlA@;IS4m`LcllvSv`^0VfpugnG3V1W`9J~XH0b>%*aV>3Qz3@seWV~DAK(o6h zHLfVj{A9VQ_42pOA6fXi`CF+PiY86Fkh%ww#b|cBYA>vtO>a!TfjbSG+eO`WbCw7P zrTejq7bRKm?q6o2wE~Y1k{=l8v%Ce^e#NL5Bj)cr)|Ik~zjp4><>U_dAKSp73w5ov z>O@oIddAukf=4sUyJ)yXLbNV<<+a%Z{btl^M{8y=(W2M=oxRL!y^MJOo8pElKo zq?q+Xq7en?l72RHQphKc7&mNqA56XwW>l+83tv063TBsPrv%wOo#Bi@&Qxf}t~*}O zTPHr-W`5efzu!~!fT!}!4KXLX!-%Uh&`?(5ID;?LqxVHob2GyXIYU^N%#7N~-{_U) zXM_=KMe1!0f%Ga&g;-mS+KiCrOi|qm+eYWqj{I*Av7e!9ATdiEedU{;scP`Hxr}7e~Iq$BgSYi*sVz}>136T zcW1`(XdpLSBF-f@sHLc3wIGv=dg4_uKVwBj=^?^`wl|P3TP1fvUf*{~<@9IW*gx|j zOq_S`u_#-hb|)a1^ku8ft82`n2#g#VP*CU}6?vDgBT7I~C-KBp)|Aa*Gi=Hp;@=Xq zUpdyA+fC$MqNVCiE>I0ckeKz5iIhd&RDhePoYhOPka)!BzvquqE4#6mhAXd(_2x6C zReHsgO*GsnWSu3oRfv{J0ET4AGM8TOn{`6QWJ3^LTwrOWS`Jo}!=nO>I-8CSBv2{1 z@{iL7s98kX9{EM)sJAGN_PCxDC{AU1(K+@-HE6HILsin1exQ%o0|qFz>u=da3tlD$ z&|3;$)(7Bw3^47MjGauZ0wMCvEBgP;{6y2nP0c1F-z#UeQc+eR4e<$?oQ&2x@@co#Q?N7%z0;ieth~i=vDHSn-!MOdhHi_7#e@vAXZz)fmI;&Ph0nwNily*n1GH zxl7wY7(w|e!4=NI zYDuI%RE=qQvqKC%K|~CT>EEs7@emohV4hZFmN7@lePXw9BQ6SjSv-JJqLKw?FLA%{!e7nA%@>61+0)X5Jl(_oMiL)C}{UO%~_Hm!6_J{?~ zN_^iCc{f7CYze-zt#%?j@bCtfmaT;*e?Y~XopS&9Z8!bMi+xX@eP75W%zVW1N&fi4 zVmcOKPA#FD+M<|N+;lR|Mj=T!-EWKNDXk7o>l5aGwYd5MEPHb>Wn#3rI=X9Ar0LNk z@|e_%0$|I>^l8D`lB`0Qw9X55=@{pV_MkCewxHP$FwHJ0gBkMtIl@QwRb2(=V!*OY zD-xSAo`Z`PHta%G$+s##d`n5kI)UbC1ax=E7jpgxciyp%-l<19I@7NY1zV2=mr*5W zeILuN5_{k%^u&?UbWX3KM|fj~{Y1r=w@sp#<$EGcbpN+iEPfa|BnFv z_q9mizgUYD?d<+-9a7U!M^Qulq9;jbh|)p@vtp%EZAq&$r>z+)Pyj=%{JG8rg@TD^ zDrhR0-|4#3L^xH*{Sf>~Spbw0b|ikEuh$3a?bH`3K#zYYijRC-7sl$I zgb)kmz8T59Ii`Um;vS$R2kkD|w*ZS@DaINp2#Y2oTEI;)dSo7p+ypDc9N1tB?uANQ zLlRI8b&!PI{A<0^-cGv`*2ZMa0%x%re^{~5*gUhMav474e4kT`igRGMg1G}VL`0^d zhK1aVSaQD(7Z7$}#Z=JXDlA*(oo(2`VI8t56k>3d{6r@s!60s+qlWB~VVwbOW1CAI zQy{TC)(H+Z%+lmrEYPZK6=z`Put3?a2XEQ1jc476T(RBlLRLD&=aQ!elX3rpp=vZy zH8WmX7_H$nnw&TT8_vz4*3^8yhtphBl77c+*rYPFzxrHf0tgg_nMT?AyNyM9+JsU4 z9Ahzdzo=$nx;Cp1mCzo|&juqdiK-mKytO*)=%Vc<21J$p6w6Z*^7NFfI&7BWR0amz z554%YzVxV~Wg=4&3(Au0-`Jcc@pWJA6uWBf)bs2)%59op z3cm*~isqn(>sEdz$VrwDaRi=~aL1=-IFyrHyEdj7sa<9|p+g+y*DYlAg`(dlg*vg< z?VCi_?XOH?(oJLq(M`PN+K#&=+fKM;3*m6_zwhj6h^X+uOI|$8I8djPbceW+bVs;( zI3f)>YNgO#Pp`VXREH9|K8i?vz4Z@5aERZV(V*5E5aXDwTO?pj&`i~1r|}cM8*PI{ z6Wa{W35vag8jNW#G0I~9;-bx(*rf<1^^TZ@JTeyBu-wo(3M!Y*GhUT9J7sL%m^Hdk zlffxNdY}e%Xef1l-9TV@t?uUtzH{>Khx4P{qxPPzdt%f55z?G!z$s~3ryD*lK})O5 zc*0anMRDAWpH)bv(ux~RRidGc2E7(Lm-Q}f8l6O;LlBD_OU?6ogr(b-fJJlSdK>yj z`N3}`?Wa4E)H}8$QW9kdbi888!ac~-=FF6+ugW!eC?DAn(W7k2TF#j=8J3{lM+{=c zL%Bv;gl`QznrzYQMzyZx;qwi0{S=* zMYr>6f(KYaR5zHTONqs+X#V1DsGX;RL1Xdk>-0rT7CzxtEE_Q0h)8P~w`XtRXjvsN z-jI5zn7@hhfvaI`;}+e!gCf37S#Sg6%s~n}>e)mR7i!ax%>thW?$K^rV~uJ^68z3R z%Nih3gf!;lA(s$W$U~TMGSTrkTkDVQ*4N5WjFXXnp|y{BE6rHPVY8dc_`(HJsIGZH zNuoVTr;l~QvHM_7+&jV?a)f6@aZ2$RRbY=wZ5bqJut__xPwUK`B4#g^Z(l5$cFxJ} zMIPEP5l>`H)F}w)h{=3xWkNfVji6g~tuo}U_rDVSxnzi9)rY59v)NgBfsYR zSPxpK&K#l+Lx;jU1;0mSHHdJ@P}AtTsgL)P=(117J)_FBHnZh$cv}^95>w_SZ*<~{ z)`FZYl6=SAf|MLB^8&X~PNgk>N9&3_8(ql}ty5O)*(Q+YRtOLBHK4gz=uZ(MdP#`W zl`#{alX)!P*XjxOMTi<@5RIomRom<@2;J9VfPY*7zvD@+>K1J{ID3}y5D(6P!Z}so z{zyFb&6=PBuM_17V?cKlqF|r}A#2_2y|4V!oJa~H%r#ya$tM$#Q1QBj!YT(jQIr2- z{^lKjQ^)N5wWhV`Lk+)vVmq{#wDQFApu}5jQmCJP6T1_iR(H_f{p)jY5ec{12}rAP z3!j?;r4M?ZD&J43GTbT5^h-nNfq3i<<1hY>1aUna`R&h!DZ+n>e8T@le|>S2RokQqjzTqIkEH`x&Aua5%3Eo<32;$Vof|HFJ`etlawC232= zK96U;1XWTBx~b_bFeRlxJ`Yj+5bVL6kRv$Vbv>Qwv)J#4-pz$&+pomZLqnhT(COu2m*HfCS1lLk-|3y^ga$UZ_HbRRD_J6KxBAu z`IsPt!~(guIAkBLpM!ItkbQ_!G6YP5jwC-j8Avk<3);0CF$%P+G zp!A^f&?3y!UM+!a0xVFbprG`~-KU|Z%d7~Sew9Anl_jVeqF63U7bA-*OJo3`SmRZn zPV;iO%0{MiBQG+g$=O<+5kG{)5|4u{Eg4mv6H^waWCwcQOspEvrDezpLYR_s&4j%c z8A%fvypoN1^3U<$yr8bH%G)H%&Q}u7f0#NdFNG!pz@!2`%hM88D^D|a9|T+Nqvg-O zuSY;S>M@m{Z=ggNl=1jJI8Ik**2W#k$E!NCa)!#gQNq{z6B!1H`}`I-3PYBm7{5D> zE4LcIdqp~9(%{HoR2hsAOfQduNyVTga!1XX;H%cP5lb8&A53& zZBVGms@&nIM+he!L-{jQX?y06ImvO26Q@(M!Qa{}(MP;cm5{7fv-6cjW6QZ&6^JXP z4qG+UsSn7klO2fHNxhXuT5pr0><%bnR5xY+Y`KiNWA99l($np?)~r_M*Z2fR*p>yK zB3WXLDI3y3s962$aIahSG;w3vK@2pXSDvazt<0o3Z;j7+u|RrJ}jkx|@WH>}l7 zV;nzqvFr};piWG>A~mqwBJR!$Fw0!ygI7?vQaVLM+EH7KJdnt<+P)tUgIHhOH$xx5 zcv7R^ZlqMsQceVfREQ+Z{Jyf+^jFX+3@N7;!LC4;u#~#dm1Pe#dj8pLXLbILEs3XK zIHCKl-)_CfumYi0p1?44UohM$8k~#=_x@^Mh9MTDCQ-UXlB**_I+HtG_lpf>*K|Ul zqK4i=*ExM}|3Nr>Sb4B)V{<_I=AOPc#KSDVZEPy3uKBK42WCbY36Wo{Sx+V=6Gb)b z?Rcs~HLcmJ*pyZ?K6m0*b@wU<`HKAXNAwBqFzcV4s}U)lB|2=4@X_b8ENWIPqhA@3 zJ9M%dbrFu=(mFxdbQM+V5P(ImU1jaa4Q+@Fb*RJD?<~gGD_1GDxy!-qVgy8r$nvma z`u=RGIk(p|?23Q!S!&E1iCqz)jzU~~(^KiyXB#a^nYN!nn+bDwUUhp#n?WB-((+nydSocBbfos50{$JNS?^jERkFqZE=9L zb?-uHQ((yH3Hi|I3FC)*8z{x|t?lOL%LC&uJ(w+b`bHqr7sTO+jLbsbh>Y1T*Kili zMq4$i(IZFKBj&^z)aFz}9WQ~-Y5n84$5p_(e|A^G5a}@Qg&SUAC_mK?ggKz*&hjmx ztL=u1Vj6sliujrQsbJS!k@ocaP;UV__-&Ni&<{|Jq4ZQ5KE(Uh&PGf_|Jv`j#(-%M zKY`up0+(<8@mNW*(n9d6hw^8A3|LkBWTBJTa)U1Dl_f~t7iq$*iVK|DvhHs?XJg>X zkx%{S1(a+WDC7BThdIM_9Ff>D4bRB9;ONxW4uoHJfu}{(}p%Vv?<5-Cg|@% z+c0g8+ou`0%bG^n%62b+AcDvuz`bCIh*=m{n154gC3Z62Xr=PNOb7TTg`e&pklozmnSzRu2Fa7ftg z;&w+rIOE>{I$wU8-r;y6^cFwAZaphi6yz%Ker6Fp!kp*p%_I8!D14;u$n~{ZnorZg zk)>r^3XP4>G(0ytHH*}7rnfcFz}oO+|CZ+1IP7MCp@iSEG4x$YS9#vx^4Kz^?%T6| zmSekO!J{1I$Li&Ytb3DsVDw?}gw33d@7g44i( z3S~=!u9G<2BVN~|z8E(gBRGQ7Zpb#xB_yN4f}To-peic4a;ROw_K*Vd3Ge&Ht9D9I zm+}=B{YWl5o9jUQ3BL8H_PDTP|MM%x;SB=6*iX~Irg4kP8gQ^`7Me_nB$z4^t!{vp z1lin4Ax?Kk)Dk$p1=0oz-e!;zp4^Ysv~It!N>f*(6V{AYshusN-VdTW zw?-^YJJQjJs+t+-lHJ$gOQ_0kwABE%+$U1UXM6Sv*5b4?M(PH7(`uW-;`E#2xq6d- z+z01b@4y%4dFST^|6epClBwMI2?7YH`A;(Ue-_w6{{_uZHgGgE`B#bEt+wT+yoB~U zJ8^t7ots@)Gyn@cdn8Ok99KBP6$JWtP*?~I8PPg&dn(JAZgUgsx*If{01fS~a6KX- zOq1G@`_uhgGa<>e`d7ZyndVjR+%w;=W;vVZ9yc;5V<027%&N=AS-$s!%bm6Ntjykz z3j{wfdj#LgLI{Zc(~*A69PwR5cxDf#5MR8VQ3ONGu)R=5+;9Vm5Cb?l3wO;?>@-H{ z+q6i+*}{3oa7sKGiaJp0kV5R3GxOl_ZJXngbPnkVX-R8G?NFH5@LAx=F8hE|a+fK6 z)j?)1wmnX=S*w@$7}+dC!9)z!E)v8i88^vS5FD|HYvmD|^!9*>m*Ijd6Y0^}D2U1K zD)qXqU$h|4%W5*FRN7t7)f?VV*vQc`VRZs7#Xac*B_{ zgp8WuhYE&)awwMIcGXWv%)yw#O}>ps9+63eYS-2)wHIR449SwptYV<69TL2C`~%Xt z1xCk39s^VBh4hK2*P0_~o$yiH+#nPaJrCe-a6O#EP_+!m<}4D)ik96eyx=ZV76GD@ zl?jgbML5l5?-8=PKj^tz?z`-XXo1K zZ&CxnmBMueFn`k>#)7NGa>ui?A4m)mfdpoqzQ>EY;%i!Q=50CORBXpR z9c}XLQ(z`t51%NVUjMaV^X*SW4k4%ONw2e5pb}=VNs){o zDwWgp%~vn+$XL+5r?lU2$=Jw?q%qp{$zs0+PK1%>GrmXSTfSum&D}lu#y2bin!A_f zKkIP?^C37$52t)fZ5gxlOSJba^PrKmc@=hAO@d=b562x50qU`)=b_6eG6!YS^zw-v zg!^};>KFRib&#-HjX(it)l5>4ww&)^8X*J=j z5zr+qL%6%o$=WeZ*JlUU_Z}NpYMP3Qq~nl_>V@MeZ{M!BYrAfAqLnw)T^cyYIz7N0 zHMyAnrq3r#m#T%fkt>=UZ(q?{OBH!<^RLpA*qzSX{I+6MIg_0RW}y-SAwFt0@-=GXLGy{$Ck*Na$HTtTDk;=t!0 zb=HOS`V)N5fC=fw<;cs5`uO370A7-hoh%!258tq(Yo@mz5Op%?1-|I&wq>2+YR5|v zlf~lV!e5d|_1A(%AL?<1#o_KNFlJbfi3+zU7#9*%hFez| zcy$Fxx=DR75g}{v?qY{a6+Id|!>@x6DTM=|WdS_sQ%}l7IOTcb0WSr4^#Q~ra~R+N z=wET)>nY}_Rs}$e6c8)*A3!qT>Gh}gJXpx>G6vUC|0Fb}k<$mKb@T+k@Gp)5_oWLC z0OXsVs3#DN-@MxotjqN#_bDb+Ixyy>{N++@$wjTdruNwIm7<+i5gC%EM}FqB*doB) zoEr4w&Qo4dTT5Gve_P)QZ60$gYO;UjE+4~P=gWUEaN57o=E`=PldVFaoOBi>M@%I* z7{g+j)F3%(G*6z*m*I=GeFbTmR9Yp}8_M&B@;aP!7t9$!dWD9*hmE*bnVML!mz*z6 z@&+|K%50PVr8n7nr{;m~mw2;xbC3H)xHHOs=>W$%tHkd;_OyCgf03!Dtq=N!WBuz-z zLLBO|QCb_O<`CPTOdg^b&WurzF_+4R)~b*;NFgeNV135vjl(5eWn51<%RLONDj-{k z8*g4m&tMRQ4bRj7Yig~n|=L0iOJz?5; z$CZy>)PWNio)7YP2eIeW-70uTg~n>VfbosvkN17KP7dx=#?f z=$uOswotdU8x50Vjj&OW=X0eP1bKJv!<9O7p$)HkI}cD>Hbmy5$+GIHfT!fn89gcV@IIY&znkV$5T(%#QwO|u5~nmCb=48UcB4y4qa)R%f~>2$ z(~P?~#wr`>pJV>p<6VI}r#?IUB`#Hp8^tb|cMq^{zO7Ufqv!q$48kig&L2BdoieY) z^8Op_fU%Q(m)OJE)aqS&QpT@&jZpXMdx$e_R@v*0M9V0ium%EE%lVl#O1XLwW>2=Y zmC`Mo=~x`dY?%aZIy{kxxl>}U6H@;Kr^H8*!_#wGx}bZW5P+y5YK)Nvng4@Ix}*I{R2WR{J=} zvwNAyopl?1*^_-u*ejqj;N)I_yF2}d+02)eq1L;AA-7weEfar7?b|A~{mz%1@EfTQ zApWEmBwuSo)qQezh5b^V%TXz0{=r#NUw=Kx59m}9-{@4*n1iArlPL*Q20KH6eQ4cy z^&vay57m8@F0wnWhc5q}SKXvrd`TYXiJA5a-0Y!DYaf2!*~?Nm=j}H`2K!w<4lnCV zAP9$8ebv&`>o?BF1x1Z{dk`99wmd)2sHxSFj%9tlG?@4GswQjz-<8o#<&!m5{)#^~-%3|8iXbZp|7v!+iUmS)Yrh5S@T-GLaXb+!Yb zDGcu+hlX^a?(@OlZQ9_bMf{1sE<|>}>{;Rh$?3Tc@9K8MZ7U2NC6o-;jf{o^ENdsE zStqJ&NKocpk~W5~08}dYn+(fJklfUSn5#I|*gChOe(Oh#SUNQd6(9lT<>SAo$eK-K zJka_Rvx-XPTe&A=VnhN7;#-T_S0}6(9c>vpHodK$ZGHA-SPK=0uFW*2pP_El;j9t_kI@!j*`9YEDQPZ6GJ-iiztV2 z)9@-$7n@nOJa);=TD4;Y`nv`Cu?hn^7)E@eXBfr~X6&b}idjm9MS8Q~lk0T3@uGJ|&4El^gQ!mDyQ1$2XqI<} zOxKGnMmx_6%`?%zMuAry)9=@wcp$+M4`;K2Zz>cm>k1Hmj?(}xV5f|HfNyruQr3EY z!m)_e81|{*Qs#x1F!<>TIE4jU!K`9Z&(Okdn?NF4)8<8wWmN8VW9!o9`Jh*mh8KLP z?reZ}JtTyb`74^f>LU~&AtJFrqC^WC7OF?n7T|jgVdJ7kkA=CUA>rHxnGYluV9iEE zy9+e!iU1-e3*aIP@cdBmUK&q_^h8o+Wvd{~I5}4w=w;0(R{){!V@zv9UUPEeSl_9n zy|P*0_lxw{rlvn&m9A8xO%AcE47D? zLXN?RUEn&swVk20Hqhr7BU3*2M4V$-LSfn#N=w~cnWxNXInI!X^2$!${C!kLaxxX zR~)|$L(=@I8XDq!j0{Z;VvvV70J?c%=Kk3z9L(~>R}fUfu^}Y{x%as~!U>JKDz2@S zZy%&;$l@1%jGxgPG3N*Tmm-eEIm>YRqlm#!{!@gP{4W%-tjV9!UtCd|0s}cX8542%NljaYG2O zTe8&BdkblNBj;ilYr|4y2xtl@#s~S4-xCh7giO-~`d||>js;C`%sfZdytLk4# zJHCL%z6G=6KdY`DQex^MJjjI3xV5p(Nx6#>w9GjQA)A$eG-H)w$Axm)5^FxtBr3!j z3=jPldrny@BuK%UFas-5Mk$Zi)MTyNN;1?TW5tng(!3a!V=v8YM9wlOaXE=4>#2Oh z5>0%zmsJdB>Wo~_At>2pAl4Y-GQYY@U$nDztv?Xow6#iR(8#|RmP6t07pXaq8y56ogAnXiC&l)oOY_>tnwLL1W3m?l(2(5eZxk8e~GXVA$& zj;o0y&B=K~q=?EYeeEkz!^d{sGb^bH8<6PrlpG|kuE?+|A~e#no+Dt}G@1&wCox$U3^!8S$bO*7Z0Kqx#=r1^Ey~8)kT``R`Hi9FZXeSN= z!zA~~ml>H5%6yakH&XcPl^QL&>uQX_7JsVnWK=l{_i4MPWpabKsR|@qxv-b8xCZbd zY2l{ysDPv=C}aM0Z1Lvf>1Q*)Ygdn-$-(q*?go))%$->eV;&wd$| zRdk7Ad)H~1tkI)p@DQ;a#w{^SznA0A1rcE<8mEf6iJVDX>Ppj8V_-cgVupG~-w$Z* ztyPYlWIKLSDZ@!3h*`7A$*UA^40jQ7=F@7_GtoO!D#hFwA_^1@7MCh^-mu+VUp`Lh z9Tx2d(Zr|3u-JfeBaFJBrl3gZe9ec0b3xbD0ze;+`Eto36SK>F75lswaSI@J{jW!$fxsz1K@%deGWmSS$bm9S<~L;TLwZa0uerDEkxqFt}^ z^=YQgJ~9-v*$Y~K5RlVHg08_n#2w#qXk0OlZ;G=15TmT#3*R~UVuc^)4Tl{ z*27}!>*D9WgRd^87w+)34oBQ4M~w~svUc$6al-L^T2~H%?)>5f@C|CC&rbjwpdxcM zYVL|3KmxpBbeBRYUjIS@!f1h9@Wd2QTF-L52YS~wGMi`ELjb6F zf-ru)(*Rz*mVnz3d~jI8Hm$G-ym;-rc1gEYJq+ZD!qx^CTrn>ue<-O(*%hH~PgKT& z_*9{q<-ei3dv1vVn6z?xBVtkj`&ZtiLi+InZP zsO|Y&3SfYjqWcYz-%3EwP-Tg*1A-~6tpGwP!FLdw5utUd%lNG$|7qm(ndT-h)xX!DBZ=7BEK6k#$b=6oZh!3`o}B8E|KalJIaRf3!wXn zcE7-=Mn2c8d?Yj7+PVMu*m8NS3Aj%vlz24iy)Z|Hu%DYAAb|&n$L)cu1vqJA^_B9d z&BXDgEDw(8i5^&3X9+C)%w*_thKjbP`>ZIb%TNAXuLT2d%t6v*b89k%_ zf)e?F$sFnh(0(Z$3(AcL8h)v z3qU2NVn<^IGwkc!g%g0G-3J#guf9s?`oUnme=S_)sYx?PZ2ALO3;s zsf|jinsQ7)-d?t%_Q|Ub{`P`=2oBZuihMYN`snUbSqSDnHp$3~we~O=44FG~xdDvr zePfYViJ_zro+3|?%BG?LC4~d5l{Odj`J2+R`=U5bJrtIUVtElBt28;+A>Xxf-b7JW z0-1#BlN@$ywD~;4Xd#9uxyh7|_bAi6g+!QvU*06vf`s(=brNR^=B)aNxuR>sYk1Js zVoBbXo|PaO6pJT7vOZhaZG}Bq_S%m4sG+~Jgqbi~IO=B%`BadTVt?~oN4$3MS-J5d zTL~{G_d4-tl=S==>y*2qX7=> zbdeYAC}u}y3Vs4e_bf~CQZ|dVR>F@J&sVnYpW^WpayaNmWOfA>v~-kXT{-I2ni96( zIn|(v@&hEXovVU4zj%C8g+dFl#MWyxE!HKA*X~ZN<`$IYt>bt^noLO%!GSqth8s3= z_tK?_u=u(05-rH%nItqP?I2YmWiV5aoJca|g;qM>-_n%zS(r=mPCePzTF;o`^&|M632b4g~VXs zALc5EgG}+f>eNPMFBSJr$97vHxVcIk)WlF+saKmr+9)A=#D7bhT1#tMp9o2Ap*@tO zcNnpalt38m(Ym9M`f>5!GC;vhy(Y}s6(;{dCH-3J>XF^v&juLk7Vjq{hDD-MKQ) zJ?Adt8v8d0(>hCRm^p#s3#NKcL^-C;d6I{X z@uU>78m25`5QnCJgHxG*1U_XCA}1T%`Z(DQ+dC@5U&I{Lx;_YuSMKQ3!VGkS#i1$Ah zb+P{!+LH0_W{Tt}Uig3?s6i)t2odNhDX7alchF>_R5CpMlDa<{t`l?~?a}f3gs_0M za7xoCO^?003FLsFObJH_OM*^~?dVdsL|_a&oLdsQ)*@?$O;$ARmL-a>sf2~atEttO zsOW=nteVYCu<71uf4kQxfJM%10pn7w-VSxOG65TWe^+wa5dq+%U zD{LW*>evVUOIfdSm#C)yxwp$d$N!vb{>yXxmrM8`9^k)Qd;jw4{%=dl|7|S!hml0x zLjO;8`D?~F;raL|IOvC1{5NzB5liJi=|el<)6gpx~f%m%Tmt!wsDFvnaSx#+ew$#vez~5Ne;Id zAKwehPmjf_JT$pgcT7YfY1lx+Rr(N6Xtw>lAVMg)33o|BfTyWAW^bvMwL;EdjKBhTO;{y`XM%6}ClQKy9vMC^$%`O>WF z#owWT^AFFGd}#Mue-t404pkbu%fR*`4_+9)GzYO8cTsA;M+falzGT}+R=3}JF@6XL zfPPWb@k8abT7SHn`FGPEZzHYhk$k8K6zZD~aU*|`k?kbk=0x?vK3i2ZXPLpKK~LAQ2aq*y)b}5Mn)p2kcoc2oXEpuFfby& z3)1am923k24k7`MgQK&C6cf~hno^L54tgks97muIu^rtQ$yUqb zWJIM#oZnZ3RKfxwxb@8~t$2o~*(0&W<&4lYKA?m>$l_Zp`XZN?vlA%tcNyaDxc#5)^+pza-BZj-2Im%+ftl4@XBT8_CQPR>ndWC}vdeTU6$&#)e*LQFr9xK??NQce(mLx%#TjvekR6U>Pk0vX_Jr=G$Lv)-$JoR-tn zrb%JAuNU^t@`62fnn0E!pjXsgK8w^7j?i$L=B^vR~jIezyyNwVSRYk+t z6-3KERonwj^<`zP2}&1J$bfvR_SNeZ66cuG8bONr7U+-Yh7%LxE0(H}fhVBXv~gi3 zR8*!cULh&Mvn#qu0su>nC>JgWr%IkD5qv$()K_u7P<2Q=v@>D0O(s)H7e1nr$%jt9 z6kKy)Q7M+J*iT^d>KF8vJwPX#lp*UXGj&Y4kcz{jk|7VaBUQLs1q}sILq5P8_pbI9r$KTyApGcS>BG-u0a9No%Io|k|c9F<}bBPCxdQE+8ziha3MHSSzoooQ3ch~p1upd73oaXZS8r$BVPm30fx zj&zHJulJzJhTZms!=tK36|+m0lxfl|W^GELKPaSnrOGB+Zi^`?-%OE4fp%Ay!-1^9 zWzS_W>e94ma2!m#NZ(Pa%dPv3pR-EXB zJIWI@k!8fKr7#w`CT9x&@?veXC=ANTxosA08DL{7X4)lh`fd{Id@9bBQ5$KVQGo+Hv*!qp}@(j#Kn#r~kTxwk&J-+zGtXf&S zp@s1fHp1o+f;-VS_OmRI4JPs8#OWj?#ez0+8kOh-2|{dS5t{lA8R%>$$-om4<cMo1A6z2SoDZsWHbIWUin<=ndXvZoTTv#zm*5 zeop9Nw3#Y{>6=IJAp*i+?E{`Kd*KHhQX;3pDbfI)&4Sm04)F6v4Phdig#G{oa7mM8SLHVowT;T+qhOEVqJ5hw zKGg>3`Pqo*PYAhT_8`_s%LAm5sxFAORqkAF*N(8rQ@mynNXZ5O*ERqCvLWzskHl@-B(Gphs!#E?hRUJ&# zR1y4Wa))z%-N0QC#zg8h@mUgrkOg2w{p@_FjmaC(SF&LaGv51z08&~L3X?8MG^ND| zq_RkDHK9GO!7Xm3>QG~22SrfbF@1?>SS#vee6%ipuhSm5K!t6%I@l1noOH*&=sk$lU7?x^#?L2g5gDxGY?0hnyn>f(z8!7cb0+XUcZBb&tQ zVy~FAOxp8*Ue79RUe6AgtXfINO}PNW^Y@iz;rQq4<6-~){HoG1$%N7`I58)ulM>gA zH%Co^k+NG>9f*?bgZ8C8@E`u5KF{w;)BceM?7!@E3ZPL)Em?A zl^wpJkkCS0OB6ulfDxd&!xHhbrD|@itO~i2UbwnsukSlO_mEA9V{-z6r%lM2#Ce5a z`GsO-^oBy;ojG<8D*M&7Vk_$K4EGvH&}7l(oi0k5NxuqWgKQog`2Ca^*~OvfpoK>yZPnT{J=L69KF z58uuR2!lSqC$F%rA=L+_Z1d^RQz*iGl-taBDoGaY?;--SpQ-2K0AC{PI>(&7=A}jj zR!-e)B}pnv3pHnBBY9(&_8Ij867+b-L12T@^i0i@s)ND*Mb>+N&%mXYtW@5Id-oLQLBuvW$EI8=|<;N=~pT>`^>xW#g}Z9 z?7NoW9INPr(2a)d4{H+wHbLv!YeUuBeF5X97YY|)1b+}EL=+Sa7TMUFP)R=I((~pl#r|6 z3Pw1uN}F~pbCZlHh_-!k2eC>1X7WkSqB|mN%kY@*=VwQJW=R=d@OH}4mRFTwT@EW8 zl`DGjqkuudb&9(sB_7Kq|B8dfU&j!HV8cZ3zP}5gzjIc;k_qHkK3*-G{rJ%*GSfH*DI;rO5kOp40pX8B@Jsm)_gU z&3KNz)kmSUoyB#5NiWofcs$` zmG6uq6rH0IFClO{zZ(2K*fo zgW6sP+}iJyf=R%|bfePL`?9euqa-ji>*yQ(Up;?*wh<#@wNkt#!qSbA?S47@ z`?w{a2Sjj4e5CH;rt2I>9Y1otr>f!YbR9TN&-p`d)d=hjPvSdL`J-H?m+d}J$)%`Q ziKcn@@;u6fFS7cJYl~f3?b;#`VU6BtctGDrN;8O|6Ka*5`v}pDQ(0!00(3u&siq~v zCDFM5cqLT!QYr;PN)DjaFK*rSNKR^$me2D~FTNhKSa4pvhCy;#R_5L*x&yI9Rhi^@l zPAF1GhDjj8+GUsd$Idp2^K~;<`xUO`xmw>qXh4I6q>>;~f@FPr?@TF(%_=vcpgnfw5vgS%JB(R(%c{)g`ha6hfaQ}9zup@9nqC`C6tTyrvVf(1clRwm zlCb0Uqn?Y@E3o$ES$h0AiB-Vw*+m98;8#um9})hXjXrr1zhe z&Hwc>5c$8l47BWQMIG#2&48}|A=IeZX<|rX`cXr0!H?^H5i2jks){qxtME<6jU-Lr zA`iixZ6=}4VAbYdom|ZVo=jUa0(GWuO}{=!K0Zv@#$cff!cM`ndmL@OZXCCHJmvWR z^@^s9cv%$*%)<<34E1PR$BsdO#N*x2RL~u%hRe!g0aEKVnN`Y^Fw_|8+%Nh`R>O9q z!;baCfgjlaWb!AxG9C+ycCgCY&>d#fW1O zwpxUs#b`1->~c|t^Hj0EQ;F$Bm;hrom>WpRbywcUBj?c2{t}-QfL?W=l4b!riEAOo zEmR3UiRy&bMEdTUh^rORqTW$N}+gCv=s4d+)NM+}2jv(oo80%Q}4=qPHp z#UYDU1-4sr7fk`I1>aQ16wnTUZDg7Kg>det znQHzL^+BBI2sCQ|i|r!ruIMg9-$m>(7sd^9p66`ghPq-4qsoI{+4L4lLoHlFy_HMO zn?r=oULL8tLw8m=AsXyu^S&X!090j#N@hQz?F4dRrByp8`4=))joFo!i#A$Vqw(~6 zQ8+lMG@l~%7PJ`)A0|aX69zMg`e^=$&Oym~i>FqU^xe$;ZleWKV%UC##=Jxnzw3$4 zF_}>P(7%C-V~MdY=i0yYUa&pnY$2g7od;_NNXy}6gyHc=vYS&)PV&+zoYM~G3<|80 zB)G+Eyj#4-giz?cO!8#2_rkAL8%J%Doudm~!oG=^MbD&nBy_#eXrQk!{Xy!ufz8|- zL$g2m44+6^v8jb*^@NI18N=Hgd+%xx2CfTcMgkLZ-rA^&B5&^$m(hf(C($ZuaHlQl z9vOhQi*YYmRe>RQ`>CxiVbLOYs2P8uhLg7kco^`$@gtvrS<=V6eVJlM*zVd9i6QM-)fk6 zveLplTI?z)EfblNRhpCxLX-!CrcM);idye5kiPT=O6d(nO}TYPbLTw!(YgSPMe;Sb zeDT4xXWx6<`@Q}6`LE|ONBL~@wsk4GRNEGCZiHYp^Cv)W`6&^ELFrPQ#ocwlG%aXk z9z=A;C>YaR`39A@er-7yBhta%W+d4;ijAqQO$(pi~aOHNpalRt&FJ z+DO_~mBi4I9Qa2D=Y=u2;h-aZK{-^5=yUZ#9U%j*wovewTJzlz8M4QPJa{C04Fub6 zOc;&<==7r@4^v~?iHH1F86)u#6dH^_NhE0)r?YAz!`78(rJJ_A8nxoNP7rfzp{ABY z^h6}XiZ>Ssms3sxOV- zvJ6LFig@tX=MZ7)Aqdt5K57{A8Z`&Y z-wFl@KzpBi%TCmjqWPqcQCkeM?2_+$D_$mrM=ILE_lGuG+knIHO5IvXj2Hq+Hggj> z>%>2-q1nsGnaj<#s-B`tPGBF9_EY)AXR-8AHgyXD92%^{>>Y{`?Te=j=0*t3OqK`C zNgTH3XPe_X zkCPF4mSJN;zBMthH>7CoQ*i?;sit;_Z&z#-osFth@94udsZpm!{3|(2;cwa`)eh< zV1nHjh>F^GwBJZ@H|{t?2~7h#N``W|?Q@O>NgXZfJ8WGVpz-oMc|TW|{8lLvvC3w0 z^TF8O3oy<}wAE8mdRoKLeiw)wzp!hUdRhzR?39smaaR~D{>2niQ8j0{JNah0#Uu*T zU9ivj_G99B^KC;`RJ_dBaH+(CIOP|Di;Ja_py_JnF5c?5P3xxScV7X;(R)QFkzB(r z1LPzJRHNcvjBaax65oocVH(|z?-llzWAM)AMrKrM22Eb;Oq*6sofMe0oI{MiV?fVL zZ|u9~U}u>OL68SkwHC0}PSXNB_KW_U^7#v>aX-x<$L^(jbm-M4zzydpUD9?CzJDF@ z6lx(>9`-J_N=MMMNy9-cVCt{zC#Mt@J*-J0nvYg6zQv5d+)bTT3~JpR$%iHALF$=9D5pFcV|favPGl;0B(#+!vplOWJN|>e zHDFWX^vZE1XXPY6*cih)Xd}`f{(XNfJV^tMJzgpUmUhOGC5gOJ!6{H6tM985wrOd< z%AE(SMnVmpAL2#`wi9>F^79Sb+o$VRl)L^XRQqEd2I9Un9!N=n2+=)OLX6mbvzXY( zlACs(hLO9Blvf0hRvp}j#;ZH9@6ETzS>m`&__L- zibmQiM6i)P`DAD@x>%|VPboPaOv>w}5s*}HtXAsm3fNXs${9v9-px;CQz=&a6v zgE1$5+vLIwkkpF3#T&+w7*)L_-gN}Hr`)hVNdmaZ8B@?G$9Ac2_ElQp-^4-~R+J2L zQnTJ0sq7XQ)G9PWYqv599t>;M-qd-o;ReT<&Tp|1#Y<g)6_-*L zbwne;<$6r)z}v^1s`9X%S7;=wYW$iNZA&28BDif(0exAEGtl8LzIFLyZh5Z1#z(X? zZ7a^|J${5e!_$xob~cWmg!+;ng!R*w5q7cM3qKa&P2{vE){vh5yS;zNcJ90XKXL=* z)r{ckkG$Z|2bK8$X>K5IY-RtShJ+^74HYqjQUBUmwW-jHK!3(M%n?E3fo>8(3qcSG zlnF#-<%G%a3buEmMVw!NAP5+O@j6`s>}@ z+~W7I;a8N>KGY+m&$vTG9`gs<*<0wv&V>9H&Sevf#ugzqOzl(6QWd-ooH?Uw6kRB7 zRL8A)Eg?3fBP<$+zv#*$hVk$T+X`DN%x&Y*R9HJN3|EerTdiE$teEJQ6Ea47<}A@e zqU?@^O=hd-fSf-y8-KvJ;IL4q7|7&D zyZqK4$RM4%#AB|(=AyUs*yToPwm)A2WqBNO6Z39QppjhJH_8$w^TsSN#hIBfLg8g~ ztP|?DNDO0g5d~p>_>Omrk{O9L7oyLG3H#3nt#BzF&Afxf#tF z^)D?L$U>VO=#xF^LNe+-nP^I<1&na3WB5dUwH0$0<|%&sS&YLJVT5F{#41$BMN7z@ zFD>fZn#26o)$+aZPay4R;vZ^-ygnCEBBW@q90?3*2*rqawS8%e8M&#Zg+L9+!twkn z$cH9LXeq$pnupUZ*4guHQ+p_b!xNgprsTHum+sKKJbk^`=otmZPsVHugfD8{RS1h4W3u~J#Vs9fqlPD!+?XtR~!F>{(Z0Hh1!-J zY-a>mWKdF`_r4Rr=C#2uN2q_{|MBT%V^nV-eWc~i|7}|S@2{^@{#THkNzHX{fTkmfg6?MoZyTB?du&?!d;TP~!3CL%;@m`QbiXtd2 zy-_8bHTmpb`X}A5e#A!x#H)?M#p{*sv^(zv3cy-jStaf7VpDH~e1I-?HOGR-Rn)Fm zK38a7-S#Lvh%=~|Q6ZU{y`PAS4cp2jNMWf~0n|}s#RL7h}Xqt{2FMr3J*S|vK?0B*@tIUr}U1O&E)4z zyJ5x&iHQ!I-@}GJy_QODD;34~AQo7j=a;>ck&vU&SfHoiJ^c>y~ z!eFp;T^si`*6M$@5NWDu5OCcAY~?_$`X3{4CQA4HJ?BZRbd)|&qeYP%6yb`rE0eX| zLZ+@4WqkOol?ib$Ico9brOqZBwA$SfzDZ^o*vhk$y_1;{inESGH)2zT>`t(}hMhO@ zb1$uq>V&y<9hW*>QD^Pp?(oXf`IVZ1DWn&YI+Dy+l&H}r$}7Ae!N+1I-){%L8pUB&LK;*b8bVXc%TlP~Oz)&TV-dZS2LraL8CPkOQd3kKy!_zP+}eA; z09(EUDD<^yWf*xc7}v@nZBW%CiY?VX1ktsM6E~ErkHOyJ9{gX+v@~OI5f(?3iC7;l z_$Z@o?pEBYIACLtrnedrDa2`4Lr_7n@{Zq_^vL;WDe@Z&qJNdcUW1(=Yq1iNE|I^_+A8|jpQ8;ld{3j>FX%VDe4*9O* zr`{kw;y&&$$E1;R^<`%)3tmZMOhX#nlMT%n4^;aCLzXgu?Y6lkXVddSLhdBJe7_*( zajkiA{!$(Jdh)pE=y6Vt2ugw_HPBY<(qIf3myoVq; z`j^qM4o#`R2!8GKlA!x!Y=AH_`@3m(WI?^=L_;9X&~&%g9o3ukFTRwu$Y(+XU(UHy1f(721b3`nYAwG0 zIRx2?FGQD7RrC~3023D_NmIMq;#9}+FX%Ng#={)=HCz|V<~LfMb@Ck`NR_WiOMCI2jYAZ5yG8^$nV4pokqq}*lJzP>sRxRB z4B)Ve`2MrC+aevB-y)iL}9}R(6^%CmeCF?a_>1U_Ze6EmW@#ysN|Mm z6}h*67<8jSyiIp=@Cl8`gi3Elqo`O8cd4f@A9t-*`5&e$brs zFUtGgeTJdEGSC~cke)mJ3bx7|!jq=t3UEkZ3WU+<6-vMqOCzm-AlFGUyJ1YoPb*3P zmf8|A*m9e8KrOwUr;IJNO%)D1w@=CWc@6`ZK+8~cz56Pr1tQrAjVz1uhy4sIlT}9o zZEKwkRxM}%9?A4Zu=&ku54qf1{si9_2(y{rzMie*^w&MQ0LchVlkqfb7Diq)$tmRd z3BAJ&yic^H26R+f#%f=>k|yr8#*rw2AoR3B;cT##5b>uq0vH|WAB6~?C@&EqNXsBU zNn?GIDu?{05885G-+W+T%y6I1e3reY$C6!8*$Y3}s<{+eqc7?va zuhpwk>IVQ;zoO!+V%6sH)=$)tAJK}wt?aKKJeoi6PeRB2{tBJ3pUihP5qQA;YQ;3> zh0$U)VQpnehXa81=tl$wMz%Wjp9>Q4j;Y=iDcy~n7CIgAr)XEsV1Y3w@BB51D z&vXQ@gn#8ImAU2;mV&9%>vEKdUCv@=z5eVq7ndtbsq8BT`DHrYy0Vf2S#;yVQloov zywgA}Kvdd=o(`8@S6;VrmM3p z`WZ0On7T}&pXZ4KWo&d1Zwkm&2MG+c5ja370y4=+8D z?O5m7i1NC#$g|40%4c{R9p0G9Goe2dX$=vUj%ch+RDf&1ZCxc2iBhnzljRxckiSbH zn=qqQM4*Xh71YG^3AuAC+8SKFvX6(~bzjppjr_wg$do{lnN@B=e8w>#OpAnXWtC=Z z&Wa*g=W`gX0){LL5UHqg=q}zM!cVVFlQ}Ma69k=~MSlA>wpC*`iE9k?p@^)E zI=)-SC)v+SY&oD%jRIZEL6SGLba&OI?Ix;@9J0lyyQtYlX)BqN-zfpA8uh-xdzNq= zmU9yFH1y*hsTYe#WCEi1;87Jo1E)afG5jY9Hvbsosm1m)Yt3Sk-G)N56~0Z*Y(M{| zeu4*P8BsL0Mz#i>LPiR*H+@f_A>3&)Gn_7>&WSr*dUDzBHPp%%F*vJV;Fs((gF{T=>_nO?6!k>}SO z{HWB+D)H5i^n9LzfsQU}J7)azX#dsm(1*|UckAFki| zg>AQIRe=F+pIR_Xr&tPnKDmi1@rSb1u(SE28ZLr)zf`8D zgR^)!&WnZ}pGkETFK4u(i&F_D3BUo<84o+WVh43n!?j_Q-Du0^0At@{((ZTUc5_0} z)F=_47;UIQEbX{)qGZys5$sW@8)GP7(2&fmwXX?$^or_6evhB1Pt_^A>`@h^M@xLe zfr~NL8mjsjLN~v1ikQ|GD+&{gj16m&0C_fE$qR3gXu^2f$jpb6Jpz0%`ht-<`q481 z1kZVEvKiIChmp@@kZZ0&j}AjmmSfPHdHNq-H964RFd+W0VE%zq`$OCR#;SHZ%o_9c z)R%8N#L9=;n4PLa&E~ z{~#dWL$ykI`N?mS{Hk~fCh50$WBD^`Xc5&js`dw)U^uo``i(YYDz?rm+mzKWlW~Ve zi@-nD?MC$rSg`^2Me>65D;W8#)N7U%cN;clQ^negW?xhTr}7dyM}c^&Dcn zTzeAzg~}QJJAiYi_@eTM?gRb2J*%rZy#B(cp@dw#%UMZT4!M8Bx>g5+&mYVeTW*f$ z#eJDKRrwvZ4#8WxTE?BsIvhb|DcuQC8R76sfsmSB3{NjC2TfhVQ}4%mm)-3tH^Y0WBXRF^k19D`yrS3C;h&QDau7REl%K5F5?}4R1B)g(bIY=lU zk)1h+aA9t*l3k!W?p@4^L&FF`=4eUN`Oa`O{8WT6w|((sJ}0vi7MZ+kQ85V9OWVq$ ze*<*>Ff)5c`uIYB4Ig`zR;#+EQTF_w$38``+4-6Wd#3mC#3FVWrzdn;b!IIBst4)B zbmk=PQKzZbcidw^?J^U7rrh10f2bFuPTq@wA08bs|F4C^|AQqosd4Utp^o`?(|)~Z zvf0S9@sO&CR9XgJjsD5FX~3kQNlgc#iPS!k3SOSexFJv6Cn!SEC-28z#%%@^I|tE4 zlxWY%3CSUFYLc4qL&A952|dX6eiraQcDl~-f4^hE$=zYk9syL*>g>qVUYp@9z1jve)eOpIA?2una!=Y_)W3XL; zB>0VBjhB$a|Cv4zetxNd8qtnvCBJIx;C8`O-&2`2Jz z>wluzXEl_`d2m~I_^n(8{g1V6&vWwCtBFDgvdqnH+b`Gr9yYUD|>yP6Xdi?@V2%&0V<3U^j#ycuz4Kx|zqPP7|8!AD+OSKAX) zK!l|g$w|Ki@46+chtFk1A&%V$*yI9z@AifM@%%*vDtRUNkskl^67x|#2tiHb+YSVl z?q__&yDMo)(>za91Q8oqvxpT0z`gxCv|o5c2xL9THK z1Q4IO&9Q4vKt`-%7zy`)4E}UycE4iOxo%82-?Y%+U6(*xBlZ%)vFLQ%CV~7e#{1(D z6VD3a=6I1|&n!4DhDqUJvsO(U<0kJXF9{OM=(zB-rga1=@&Jc=xv(6B{cs_oR~H#9 zqw{1IBlh%r3G8MK$V3adCU^|^i#Gx>D%B54wClPAk@UF|cYu!E{jdmDgg;XlI-+n3 z#6^0;Y&dgXO5$R@F3X}?;9I@$iJAf05=N%lCe#?{SE{Hq5WOWKP$Vb>6Uj})5%~nW zU3MdqiYy8PUr!s$3Mr9?sy3?jUb1x2OyQdAi{$2KLz8$~&$+gR+ppIN#rCRm8cD}b zfg`7hRiV&h3TeTFReT|0PiGN>(u=4QQw9Om-W`cRdr4PWlr@-)3#ZuMPyyauM;w`8 zeuYsP8uc=+$m4a)E3MyY-$qMwOyqAvFT;vJJFc=zx6QP`jcf>KwO0? zmeu1}?XySiCYKw}X!EQuaezWC9rRcSu2FvA`?)%PAHCyxiYOYkjT0 z&Ddrvk6V(SBYbP<4n7uCrV^+=ltIC4n}bWRN!A;e%EuqK>Irl&YV1H^fM8XaqtBY~ zIv=;s?dA=7Etz@27+V|f;+}co$M0fyjO9=)_&N1U>dve-(aOX>Z5i)^c=vuP1DI(5 z(6)BS&RLyXFlo5(&u)&D3#;Nu5 zREaq%gzt5-#Z<@uzA`w;(NWveNmo(}c72{fnEOTAEK_Ph_m>$W!3(cOs-ppzT#7E; zC6Pp4wtNdCJh_0EnM?=7aCm2jcGXRp+4uHJK_nG(J0RpE^^l3YhV~p z_vj0GzUg-D3qiTb`*`1r(IuFGZOC zj%2BTi9X)Vm_Ny#Sc*f(hXUQ$rd-oHUyz;DFM*i=-e&Xy8 zRSrU9tya!TGI>roc|Kg{P`PY7V=+FqT!AYq4zoo!ybxC{`N3{|ZlQ@^e^Y8K1;+1rn0bE7kHsOz6b( z56Kvz#TM+mte{TqS8Q|DeIijl3!^pB(|6PRL53E`WGTO#*bqMU%;0T*AaCwBI>_u! zVIp7pP)@U7d1|(KpEKuU|N8ueqAl&E!-57p7B3RdCVEu{N!rfK6_U3bOY#B9N2^98 z#y18{pLE(H+^I2=U6${YCfD)NI}-_>bT%zz9c4p8jaSVO%E#;2F{#`l2Uw#VHj1tn zDd0CPV{I+5zHkCU>SBQT(Yy4=OW3lC)X!<~qpTxa^vX z?Xt_Ami?u7n%${K1T#EVIrFe#{6#gRXf9i=3e}=0QbE?%Kp9!+W94-a$ATz;wjWJVu|Q%T}nOcvz~GFi9fcy_8VP((Aj527#&mH=%jPBRvo z%(5tDvSUT!jp};qzt|~K=g0o|HH2G|u9vQE*ZoS6CvIp^ z!l7ZAuv>j&wn;_|>jVK-3#chf#W-ABuf_8!q~$GWmLf7qmR7<5{nV=fBvDzw5n(ot z5u4C}C5#jAITmsQ#Ix6^iznkagQTsuzyL#Xi&tAULbO=kfN8$jE!9HnmSL)Vhh;4L zo<`i6luR&_-*+C?sxAf$eQ<5$vM}3_Fmj?{JAYIV>XiJBq%oU*jaDV2%6Dj;1LBH< z`lpmQd>%c zf|p+4CII1jEN1|$pO3A6!7*g3PRyNOIF}LT!4fQKs9h$xLga+Lj00 z6Z{VR5mh+1_$6AcNQ=hvnqpdao}cd1dKnv5@c?OGZ@x(>>wNx_H>W%G}E@pYm90q9R4#mz_h&IY>#m8+T!>TdEw~yg}^{X)-+F<36?6)A5K|B z%)F!#JS6?fd9QdNqF)HV{0qZ(am|vdTIRQNao>I9H$j_ymq0nKo6H>QS7M~*TwDXS zTQ+cIr{zM^skAQX3%vqg5RvfaqOX(mL{kk0FeFyUWJl?3VGY0>2 zL*>`Z;yDA5cq)!*eScMo5(?Ee1imcdfTfIDfaRY%*+~h%_f=*yP^UB_v8knCiUzSx zvXMaV(|mZ2`xbo8-~pgm9S1sM3tVa4w5LBYZDib}Nth{F2#W<3W{U`Xtt(u^xq(KQ zHnI9Zv%C)%M}l3Te@R@k?8(*JO;qE@x{|U7eedUbU#zM;AEcZ+B$*_K z(`O>cv1eLUzh3e~$uH`D{nm#Tl^+FI^;<;n9l;Yr&;E})*cb-?UCj4muJ{8=_zE_B zKZ06NEkj=G=kC53ioGA)50w_vbml&~hL7Est8rb4+G z-2vwSoXE_*$>%0?Bps(F$_Z7}fn1Sl>d0mPIBFLTMLx^5WT$TQuM9S# zzlj@5&~d;i#jmLUF4UN8i(ecQ^Ud!Gd}Z0hzGLWr2L|{tC+7@@6MxuWpm#jwYj(MP09e2Ve z9WJRuN_Q)Om2a3@zulX`Hnc!;i@har;_#24S$Pzx-2D+W%m2e}@xS(l{`c)#DE~`X z%%p~{$45E$M}hsc(HKrglnhem>Z6*|z$7bD5y=~bOiq#!XDS)BVl!sLFjvS01{~hO zz8nPg^lEA&>ZIz+66^nt^l@&RmQGKhuBz&MVaf7kd%e57zL5PO#w>56_J7JwKQY36 zdNWDa^z5dbo4d~>oz(xy1Ybh`_E318EN&2UIu9&50}!|OQssE*VVQ0)^7L~Xvt(}N z$D(O+P2llSJx7YLU1V6Eo5}c3v845*VeKZEPmBHhdSDgWG5FA=eW>T_cW`g5?s?&G zed0Bl>@NOY&|`{e$w%lsOt?PM%RYv5WY+9@n?~c~e{Q=+{*-^u&!5uFbnQK!r%3S2 ztdd6izE-drmzjYTY9zzT%sy%b8aeSXP%FA@3kW9~SU8hvi_b{hKoL_7?Hloe?yEKJ zcOP8TG1GWarPmeDOg*0Bc(!v}`l=IV{4phsXWyI*f0~ydTBRZI( z#OFLir<$}Ck1M7t2(7~ltZbBoyYiD`1P3d{3g z1l>2a@$P!;!Z`uKUDsZ*8{LorSBb&x(;|@4#kMndqXvT_wS zM8NPLs_n&H_A$|(5DZ{!o~+lS1E5Z*vPJu)hUg)ccWmN8Q@#h8E@Q{&8pwC=QciCB`= zWRHAs)2LVrS5;0zs*^nM2TsV|c|wRHi!jlyQjJvX(dd+BuHu6KQnaIXyjwI&3jy9` zltvjRgTj9F9=)j4#4#Rn%k;w{TT!3cNCFW{=K7hBHhb@=YU$B>jl!Y?vYI&uPWdAP z+*e0W@h)C{V(6`|t!Q+QUtX#6?w(zzk}ZkMPC3U#N@S84E%p2RHT+798&EWHYDTK~ z2W4&%Hl9aK?ty`M)r_$n)TPlVw%-khML4FHj&S+xm7PMNnw)W0ct$;Iil1T@wZvA@ z^*O*Ke``1&NG4JdC&WU?I>cWq$m8;7w8oGW%hv@!>z5MqN1A^?f6Yr}-M;a2Q1V7E zDT!QeUu~FbrUW;Z@xLyWB^P%=o=TpORHlbyCg2h);~jUV=iuPjHGw>uj=c5E#5h^5 z+WV*Z1mHej{&v8Pafs$#`)%_(LjwO0VrD+i{EIY^HRBm~w4GO|v?;+CK8KP-;S$;{ z(o^Q&CUYH`5urH+9!3z}hPlj-guXqd)96prUv_uorgy~)Pv&o-0Ze=Esby4|naX@n zkuN9EQ*l6Q`!7am!7gXDKM=o?`4zjs&;A4+Lk=b1Gu%#z%XRxm)CEYB+kegTOgx|n zMjImXx-#i-LSYTsPgCxVBV)0i*aayE+9l13wwnfXg&O!oobyeyWfgy7-0W?9(jT&* zbhA9AmL_AI+;JJxm2SBSIojvCYP`8M4eI&6LCU8V^X~op9;ltHpjCpQaf(ZybtA*a z54YjWCrBT48=PH|G}a=8yKQv>K4>k05Udp8$fF@+DS4+<7LyiL?5CzHq=MEG{_^28 zv11M8XbT_HjWO8M9xATpzXYAj;zoZxgd$H^xE)1ogN_3Zf^n*&{^tYZBv^hV%`mfs z0EXwId!528um(0$pJ@{DI3zr6nQyP3lLkh5=QmL{X;HDANVS980|Egc(%_iJzV#GfpEM>gFKTV2l^4LL5; zg50q}&oea20p@sfJLrv+^H5|IW@50DamjK+>|_+iAuyA`F}YCp!bI4K(xycNagfSw zGX6%OxS5qq9CUV4{8UQ`F+w=e$TBm^F&h{-mL|AdCw1z9{di737HltbAQB+f=9w;mp8{{L z@GTPZkWJFkUh=1)3L{SCPXi66t+?7J_;JF#=1I%EE1RT*^Wv#qy4BTgTd~9# z#9EcylF2A5UV~9M`m?M{EQ8J;Pjo$HY8Fa5`JT{B{fN?%9+w=ilZ`*a*sM~rcq2j% zG==o5^3+kYi*ekk6PGk7W^uUZ$6#%s35spJ%4qED`n3wcK{)UU^Fm|u$p+s873&NP1~w zL0EeC-!c`hhcT7=i8U|(jXvHvHxSywoex7Wkx)VMlHNn-ldE1t4E>N}Dol#{rbHN( zXojhi>af8BT)CGzmii~JwgTL~r#)gMO}MG-%yxp%*Pp8fooVG)^@p(PQ)7p$P~*9-f(h_2LA;S<|c+P=KJ4q+k@NveiX$5{nU-ZO%}&tmvcF z#^jVN=kFITOd52Oo1K^q`Z*A(6Es-ZGgV5qFA$%Ik;~IyRBv|!v_vE&PWPJ^DC7=Bb!{rzIZ4rO4~Yp7dm_UcPBByP7p-z(&!p zH@=RsS776_?J^;`<=(l_FFenq>#{jChJiXPy>6YtC{@7Nv+|}=bS~W2oxkVq^XJ|a zqO4y~r6aSB;?{=6;{C)}JOUfTY9@CLe6)sr&uD*nUh~*V6)N_9JsKSLoN!r|pHVR#%e&m=J0exPBzwW&oX_t zA~Nj7@pQ-Z<;#-8!OZv?-fqb*`RYkzIHdV`vC!_?npr7ZRfe}Nx!^USouX%IsRFZx z_J(($X0`=t-7zINqHZv9u1&#(GPUD?J|nm~pJ*ZSIm z9_&8|rNrcMaqvsXuWTRwZK=#i+-^5B!CGh*gTA?E_SReAurz%++t;@GNZ!h*qI{@l z{+8zL=VNil{oK^0H($-!%2sn8Lw#4`uLpqx^@XQczCWNI{$VGPhkUyBJjgP(#mFAE z(yp^fCE|_;c<}3QLwaH%{I$*J$~Itdu3tE3 zqK`cUHC3hMtp1zZShl6WPvfCYx_i6_tpuy{SosYFTUNf}R#aWYv^E0{7BjqqN1?Qu za+^Onu#n@SW-S*T&ida(nHt^s8x}_ZItrGG)9m{AA=7ft!uO6tR+-dr+*F{@3D;_% zR0D_QT!M!eorS)}2sDR4pSi#4|LE*1z^ZJXx0UV&>69+%20^+z4@3J7{tEziS&If`j#uj~&tU10a2k+oN*h%; z@IBN;gT{(n9rZL5MR4R1uy)>{hga<~>b*a;o?7!Nliz*4*!;^Gi08G0^a{-g<77KLfk#Y=u-mSx;X%`0c z-c42tyJ4sS#3{WFjC@5oF`8NX79}x{?Ro;h^Lm^gVOp&UXx)>_V^P zv|b8G_q6j5_9}-S0Y4dfm#^3eiQyH9GcR^1F)YQn;lZ3g4_k&HY*ePo#2JG@BZ&wvdwJ$F&;cfmIFt%fzS9 z9<`fhhr<&$N`L~}Ufah@#R*?VRs^KO&W z*XJPJ1Lz`1_A?TnZA>~GgzK4C#0QbfjhF+IC92UOi+N=T=TfP?nBkf$e3{1d?Fr)> z8*C==+8gz;kfzd4U0SzO}jP^Xw<$)7Al1mGFKSXCL9*n_+|7P!FBC$=Goq3rNJyFt8>!YLzO1| z<>V3y!2$h98x=O8+?25VLj_e8r$_S3BmTO69L*qC*pGfq-IUll+=1PkgUnhCl!FS> zt6jGJS}6iP_`|~+yXFjQyMS{5S;ON#tvKF3Cl=e7{pu=3oI{uLx84I6Rhn_Adm9K) zW{nW<6IDpLV<@X)1B}z&^*8oHkR3N53x$>hOgF3ciukq#wUn@Z!5!BkPO2=`c z9KbxF3UuQn#nmgLNZFJ~=k5y4Zoj*XyU~D(Y|qn6&(oT)>JDA}`9H*KN?F<3*#Ah7kb6gvU`BMy-$*^v zG9)7MB4dh6A(TBNARAi79e$i$IfgSJb`(p|e`q0QzQgovdM^8Yy*hMpErOU8v@|0l zcCMN$?V}eK#flPNz_bYEY!i0kW|w|K=hWv%*L$DV0|0m*O-;|zu3LrD_d&;NUv67Z zVGK1x^(_j}w+^nBW8>;sdEyZGM`&{xxFpwOV>G;qM$ViHWJig-zP?^doqIGkckE{k z8sZ(8B8A>d$_T{!$I*suF3Hu>eQ?;QJzgR6ChxZmmI!-qy+UWl(l&H)keS0K3Lzm6|97LFVt zT8M~0b#m3B938c6ve30NR=gl66%L}2YtiemhhbRU*pGT)$b=6yXyp`Kl@${sN z1r^B7J|rkGw!&qHoCICt@tE3H#gTi!X?Es|2l5mGLj&QGd+4)g15@WfXRhmiv_W=shHR4LjHx9ps|b z-onjm51q%!dUT1>&qAHFhq*vZ)eMfqndrz`gqlFG^iotps{y_qh{vz0BiF;v+fvfV zm9$IS^Og9*PH9nu+7(vKoVv~X%yE>Edru%vcj;n3gN#>EEwRmyK z!%a3(JikmT!OK`GfHV!WO{>#O<)fTSDPbrzCKs6OL^9!7}A7kUj_KV zW3^9}tf5shsW{W28G80=wbR4U)mpt~FUUo+V}jpc63x*9`^gpwGB1fm1AR#tX5~-y zl6$-7`{KXkp7V*0u(EVb%s+MCC1h|x5t}xH=7Hp)LFSZ;F65QX%L6_UQ5j@XWfuX| zJpty2@Hbf{*vfRi2FH~Vn}yc70zoI-Mb6GBtsx7$1@hsu0U7N%St!zpGbW8?k4DoL z7`|Kp*O>53e2Pk&FPN9YRE28jKZUnvfjra$)RvB^TK$eQI%@)P6;0L6z3d1y|+qW@9r|ZMImtbLeqp zWckiH&a(N*eof(a!5E>w){KBkd&bt7IIGkv!gduXle9>j?fif-ZKE;B76M5nF{0W< zFfWwu_DlEauO4b?LIjNX28M`;9&=r1w!tN0L4oZ@T4^Df$!6^Q^igT+<~8q+>CC`v zwLpkeMv@azPFpAmIl@lF@e48$h)?dCrGzils!ng5F?wtXM=V{Wp3m&=D)PyesueAG zOxs;82X2b4s(Oiry35xoBe3?(s4iQY65Q5U5)2J$e#o~&M{JO{a2E5jaNT`#Xt}t< zDkhK=a&#a_o{%O1(E*%#Hxm+;{_b7aA}j+j5oN2A14Aw`-$-`Nn?Mv~nvvSi*6NA5 zM)*DSW3NmVM=oin_%f+BKo08e+#0YA!;4S0e6OjH7re^1%v57P2e5VO^q9hh5KpOj zy*0u{;BVQG1!1SYH^#l9HdhPd9e+yi{rSl&+%egw0A4@w#%l(A%-V88;de|*ToD1u z$rwfrAv`k}I2;Rr4#pE<5Qbn;Toi^mqf?LM*yJJ&{^tzT4^iO>zb*FrpVG5eYL9hd zl83y5;<B^## zUs43w&56Fs#^e;@>)bFVl@*MX7&~M;N3hu}4q{;j#AByfS8@wl>1kEXnN1Oj6%-YJRtS1Odn?si{Y&_LdP8oY1QbAT?L=FB zV~((f2gY0^B9?VsiEr~ft|TJDv@hOik}-!)97S)%+k`y4u&h+O5no%IGc3OAt zM(JA&Gg~9+Qo4|^lfRLA4H60qJ7NYHJH)d;=h*9XJ0Xj(o)3pLH+ha-XYk5}*MVjD z)>%=h4C~tmVF2>}lK%Na)-D}kvpM)lY)IVqs9G9?8FNRG2Uz<$fDWnV!3p_djbQqY ziAZxb%rY;LV$Ft2T6rbRgKhRLvq>+s0k7o4A8p0_CIqu~1XAG&Ob^eqNHl;rDgOw`BOE~_%P z1SteqM0a>uC3Sj_9xIIZJ3k9T4DMaH=JmoEn8Hj+9OXbxtUAO#0X5Iov0Qnudie)LlPd=L=vCl3*+_Gu&0hV&e)1uGd7BH4+E%-bfGvDYE^B2}+9ZV?g>kNO z$V*8D?M%qP6jA6A zfmH92?cs&Cps-^@AHtO~6EaH-8I3}(RL0wzBI)1yT!X$K;1(={D2!lf-b<4VaH6O8O ze5|aDTx04S^bMc08k$~%xr*7gAEIFhtNhhl$^=*qIDlF+5f_HJc$H*{Gk@x61x_gh z$5f)!*z9sAKAXO`3EZG32IL4^jYnhQL#}Eb_0qJhLqOj zMaIwS#{4Y7QI6ZS{%OD~Z67-Cxv0oo?2iXjFVPQ_b*3eIN*ZQ&N;{L^^SXt#haT~A zyzF$ckJ>yv-B}G>du}rqP)p(Ssc6}ab~p22$#^!(5}Yr^4&}L|!rJ%>GXA?m&WCc5 z;zVi?b61a6m`rk)R^%TV98JkU?jo_YFH?$zofJz=8@vhPD(|T%zBp#}LCvhW~|@orDCYqSsH@$0QdyFc+J)0FgmghpZ+dvBgS8sA%~CN;IaE z&TbWxWZ8mY&Jab-u&j7Eym;^@Bz#PDDIxo+%uM39l4pzAWDrSe6v?L1F{k!NalGlM zMz~*JwYZ77!k?BGSbt{k^R8&B*Ki7$+vw1K%pmjrWEo8pYrmt(WTCQ6BYdL=3IN;m zS!41eTl{OUP$fEtfV8Y)!^SqGWe(MBabDL14*oKQ2;NG{m?`xPFjf6nwWk0kI)znY zq4A_2Y6Vf8KqXsm7jHDaU@#vPQ+OeP51@|9nN}Y01R!hD{e>L2=Za~5?|l$mVznZm zbKx8g9xL(eDxQ@~HP^|h5?9Jd5D?~`NX16?t?wFwAij%qB4Tf~ksZ2TUoC;nu}gK!j_0hcTklm$ zj;dUUQ!?tRPEogK=GgiD1V0t9H_7hfsqYuOM(sVU34{mGo9V}?Mu*F$rMol5Lhr|# zQJGMB>-q(xq_ku#W920rUqd45+ib%dJGilg+qgWb&N#$5Wp55FQB#+r7s&%@A(vFK-373Uy426})<|_;m@}C%!v{6dRdUWa$VYWz{of17v$B`Q!^^ zj1;}Krm1K&`{P0)Iu@rl!F@2dK$6>l^MF9?XlaOY7Cgv80F~jq@qn`}u(5uZ10&1~ zkK@&sc}g8#GbUHh;y27D97o*+;-4%D*UKM*T=tZQoopAnE2+>@M8*)M%iefR>#WW)1}l6>IQ9Vx#n!W>?-E^}#G);K=P7>WmBa54kqJmYcjacktDPwZvCt+*Q{-lzfNi|-*9FTdtiR(C_AiNC!cwq=xTAV_?&t6MR492w^76R zyXu;iTyp+&zs+ZW&oM4};m%R?tbEAEbD3|R%j~fC981Re-b8U67h$St2>>&YC9B2# zlT3CCI7y2QnT#!&J2NSAZ`#xYpNV`zi*+N}wDxMz?+EU63KZlH(rgDGa`CF^_ToyaFKi<%jbMv0t%H{!9}A&K6;7V(;LpV&iCU zWb(Vs60TTj0U?a$nSIEVhQNt)ic|Rn(VS5k7s5AV>rqK>L)uFx6C38Ga;@`+7c_Pw zP~h}-DuYO!$!8lwBNr|rL=+B&<8b?vv}9+j3snb`+W^Vc?y4t(-&R66l4Y^w%Q)JQ zafbJ}zh>^vTyzfLFsP4-Yz{ z5IHKoNHnK9DUR@9tcUwj$g)eNy}`4|qV2!jDG1*posaI*u{w~k)aXOwz|l2z_1d%m zURu`IX}tNjJa}8IB3mE9Dl&U`Ux`0o(q;N5CH|=>DR3%Gu%>JsZ0vv67T;H!DM1)h z7+n~7Cm1SmnDDDChwCoiuC>>y*U?v3DTdcw%^26OvaWo`v!bO(nxn_F*2aCKugINX zaKvGJO1i2=CGIlm|W}`%tG^TtWrO`(P#b~&I zW&x+6v=YzY0Et_e*XC5PoF~D1a3!H%u{@(O7n3~4genZ;IVaT6{BFw3F zO^0lgxO7aF>r*O`-F({+_#xPWY6Y}`B5W|p`?~~_MiH-~YX%3$d|%LV*tdy2muD@m z9J6(x&!Z+9tAZ}dDw~YORA4_-{8&RnP~&I@lt1pcq%YR{M6qPf_07>|;KlqXSFZS_ zgJtsM+tFM%wmeEVc6z481u<;Ba|pDA_rPJr6nO?(^UMd3mz2>E)iAn?2%J#7Wg9Cs zC*PEw1vOS09tDOr!oe4?H>;71GA;zORONpCAak+hRMNmA$)}<+j?u*r$j(sDIF)89 z(tNc8<-C9j8e1HKoI|oqc9oBQ10;rZW+`7lkX}7Yv#Qmhg_{m(DgjG`Q+!!lO>ZK{RQPwWS>m!J2B5@1RdUk4Sd~4PEqOEo- z2<$+??X_c;{8lhQbH&3QYzJ0dv9GiZM#_u*=XqI($(n7uG%O2sQ;~SHlKfN^H*_Z4 zL%!(2Mbo~?xWdAvG7vVWMg$r_8OJb^D916jfR{WA0vIh#s=K1h^fEG3j@kMdcG@R> z?Th3by9cY*rvWXF&ysY_66AH$%Lp8Iqv%>+xhFj89b_?O?QzYjHGCV2`=XiOK)EC@ z7%?>wT{04Vw<)sV2LTm)HIhlg=ES-wHg+xc^>kIP#bMvuKQ9ks_x+n>4kXC~0KhV}-(BWlxk zUfzjq6&xs)7fO5nl4n3v)dN#u0JSVzE22eU4=IimXoE&@h>Wcu)7|QCjl}!R{<98U ztKYtIZt8Y*HG2w#Mp_WTp=^|2FVkgZ&?h`5eF&B@++fr^2Ej$89J40L@QBArR#r8Q zLz!i*vDtHs8YBq5MA;aQ8&m2BfI?w2UAnZb5g9t}$BG)Nw#laZ);m+t5m)55nw;F; zc>=GixCpzB>AXS@2Mygts{8w9Vg|rV>YE4687rGEA(<-dTp~4-`c&G67Nn^RWAd!h zm&rs#zAn(rbS|}6*kLJ3cDNGLfQumqvfv&o39cM^kaPtwTJtpK1`*q)?*vrfZv0i1 zG<*u1(C95~8aH;aZOqH6UbU0~q6KpIAbvOHZXK88ZV!#KwVBb>)sy%KpWZWLH}ie| zmO7(ihu>!C>@-;5nr>Zd>GVEUwICacYf@&#E?&vNKvj zUY(k&*K}TC;IoX&7FtGwx43%q7+0^3Jl*==IIqoGTecma@E@!}?PMUpe4;>kJ+Eq(960vpkGyehiQQd{%YQ6(n!3pD> ztxg7wx2S5(Ie9Y)F%u>qvSPJo71dIEYBAA19N@Wh1}O;d@&~?q(Lffy(}*W;WPWb@ zX%fN>X8u_+zUe_yh~V%x%V5y3fon$ljWR>F=dz$lmSLfx>!gR z;itj%QlC6mUHI1oeCD93Dp<1oW2+?tJuaZVA&E+mF2)+zFyNqv4aN67EjK*FJ>Di2 zzl$_znm-3jY`V%kJI>8);)85VO>`f_-H;c>lX!yFr+MO!Wo`9VFUlB}X_gFCj7j*D z4Ag@l^gOs#8UvEm0lo1RVTR>1=GQ@Xki=y8-)!kyJETsOynrO&4IqBZF_ieht$#d$=c(NEPDy|8>fRdcL<3yaHODyD`rk^gEn(iZ7yc*7-9$$(tG?c zU1(O|T|2T4p-x@V4g;IbmJnT0_vs%U=PKeylDu=ttlZu)=dUF}oDZ_eKYXc?K-=P^ z5|iu!W@`%Sro5WWiavX^00NCDV(U?b>%S)#uZXn-xt5aCmAVksg9)#fX_UA_tvMrz zxR(uUd}v&>3Zh+!EfSukAeX(OmIwjzC=7RamBlsTfx18KDC;*Uzy^!prME?r9GnFK zjt{;_FnL?jQX>lDdBMV-Ws~#!_?cfl9tie!B4n1}my5&|T%^X7Pns!vX zkZ!;C^>0~Oc8S;?W`M0`jX$hr1h9bvCPkGv{=sS{_$RZ+!2oCp1XC?QLj8S2JoUd9 z{M{A!$04BljtaI3?rn?P8X-y;DUB;=Ql{rRL7NsWAV(yNlr%K1G36Md*xgB?$sLMe zXx!S^xmL8;E~&84oT@yC%CyL4Xzi`(7wjY+`ikXkC0_%DIz7@8PclXBJ& znO+M~5R_IyH5A%|qk}%0Z!LE=p0+%lezV89@1k@ucpOUnZs8^6Rzrat*Ls;lmBQ?T zc6y{)H%GQawc{suap>cyx2O*T_8R@(QB=J9k_K&yZ?D-i#*{hCxS8>xw9_up-Vx-` zp(#n@L#p%f-J3pFaYZV$F#$<6d{$aHjR|Gi!kGx(oF+f@q*FSsXA=Oribx1L&DX(C z_57^2t&Om98x-ENGUUf9*Eve|==xy4r*t^q{0i9r2uF-YLkYAB?NHjcSdITYV4(3{ zx+E(QNwQw$R7NMsuE^d>u{u9t_8b2e&E!+$RbiiXXBo2BK~VS*0x-F6qEB;-!s@fj z2zI8}6ZcwkKJX`+K+{1ZT;vB5pl$lQr2tjv4W!sIf#j~tx=@lUaawKVbT@to5c2x zqeL$LMP6uyB`NY`gEu-_PYWhPiLJeipoY3U)ANnbW-#BY7s-98F9oOlBw~cP@EjD= zmpb<3UI;yGO-pW&dygVt7W`s#d{Yxfsr(rbHhVfGzjIm)D$y-yXuNY_>oM)t@EWoL z(YK3=XYYwobYcUD+n}phs*o_<2hB$~yC|(FrqRlQ_m| z07WyhibJrpDcfxpi3tp?sCLl^YTXlXB}q7J6}J#czFtUc2^1{|FEkmB7RJh~yR_NO zM%Ob}IHLUB;MhS3n(9f`ynJhYHHmQ(NL)1V0!T4Xcn|VP10EH`6tYXXt2}u6z&MIE zrh=R_c;Z7@C+`RTOp8Fq+OED>VkI?4CAF{Ip8jg19vTSw6u1W1?Bk>1j}D`sRti4X zt{WVv*U3%`xt@>AM$qelcQbEohn|E+E#%u?+}S>SA`d@4WN+`F9Y2?q2>)zWwpIf= zX}}Ec`t?0}S0f9l{@4WjVJc{nqZhPP=+Vy^Rr1S^)?QwazCMm&C6%kI+iZ;& zeVm9n|3%{KmHH#m&*@Q!>|XCmYKY!?u|nUFmaNO1=u%)mJc05){fw98h>PyFF;<2S z+=A^ZE_oNyQCyScMA)R6nl5f)>#%H5H&~8amr`BtIu&F+?h`3dv4TEf%h^G znUT$fKSfw&*b1?cg_S3kUo5hS;KfizxcXY6L>lJw3aZi~H^(598=VU^)P^KTwE*iCTrtmpa&?6zW19(XJ zF499e3iKLp>`9zYA2Vm@hUKGuRKfA^>wT##yUyK{7q;>sfO|=pR!i$*27ddYyWZt* zr!xLJ1F#>#5&1+&_qWxWCfh%(FLx37a$>5&j8gLA%s>-+CvzhcAT!vD#PmB&DAR8= zp-f~%&>mb1-#z}XdA}F?eYv|U z_N+Fxm=pYgJ7QC;yHEa4?iRoQ6_XQ|ml79KQDu@7zYqMgCcw+^A94qre!qtQ>E(WT zKb`p>Gzs-*@dtP1N5H?``QrYq1mX`R4*w|e2R-Zkg26vQfwP+YA$L&t;1i?2xc%-I z|JkO%{6<45xiIt*(!;9Yym-{V5`zbsM96R-g+_lgUJlOuCqq|Q2 z$$fjTi9uj(zv)KH!~?%kM(}XFJGlHVDgRZ|Us-e?3mXC*>uM^@AH(8@Pj)C=VXoB@X^BA;iCq_&2!+e+G;s_?!d;cM%HnXN@*e{$Bur zmOtbS{~4~6kjNqm3}*<2lm6a0@KZ8);``MX_|G{Ve#X7eef{HD%?8hmzl!^}*J6K$ zyiYiNN2>i@&iH;E@(+sbpF!?Z$lXox-{mX+FN55lFuu=3_lc?Qxahu1FgOjzuc_`Y z%yjqrb9at^pXufU!6-67r&t-dpTzl)2{uOj|+ zO1TTsz8|Xf<3Q<(_*I0*e-p6%^MAs9=j)wq{aq&G{{iox!@=%Xe&@fv@09#;X>kA> z$bUOO{$1t&=FPnidH06ydjs#ho!_M~;~yaZ(f9dt-S>~&XunqseyYy=kGk)B7k{tz z_wCEiw)KyOaZ%AfRQu=Y-H(Rx{Vm(w7UsLG{(D9DPxJ0~`fiVNf8+JzkVmMzw@dop h9tZqZ|6}i`C<6^P;~qSq1b?-G?|UbL>v{0t{{bQWwD$l2 diff --git a/proposal/sandbox/embed/build.xml b/proposal/sandbox/embed/build.xml deleted file mode 100644 index 01babfd1c..000000000 --- a/proposal/sandbox/embed/build.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/proposal/sandbox/embed/org.apache.tools.ant.ProjectHelper b/proposal/sandbox/embed/org.apache.tools.ant.ProjectHelper deleted file mode 100644 index 3a148062a..000000000 --- a/proposal/sandbox/embed/org.apache.tools.ant.ProjectHelper +++ /dev/null @@ -1 +0,0 @@ -org.apache.tools.ant.helper.ProjectHelperImpl2